SPB Git

spb/airiskindex Public

The most methodologically rigorous, fully transparent AI job-exposure index.

TypeScript 88% Python 6.1% SQL 2.7% CSS 1.2% JavaScript 0.9% Shell 0.8%
10.8 KB
AI Risk Index

# AI Risk Index

The most methodologically rigorous, fully transparent AI job-exposure index.

Live Methodology Occupations Scored Tasks rated Ratings Rater panel Scores license

Next.js TypeScript PostgreSQL Python Monorepo Tests

Ranking · Insights · Methodology · API


# Headline metrics (run 1.0.0-draft.1 · 2026-08-05)

Metric Value Pastille
Share of the U.S. wage bill under substitution pressure 32% (≈ $4.7T of $14.5T) 32%
Employment-weighted substitution score 34 / 100 34
Employment-weighted augmentation score 55 / 100 55
Workers in high-substitution occupations (≥ 70) 5.3M (2.7%) 5.3M
Workers in high-augmentation occupations (≥ 70) 47.8M (24.6%) 47.8M
Coverage 887 occupations · 194.2M workers (BLS OEWS) coverage

"Under pressure" means paid work overlapping with what AI can plausibly take over — not a payroll forecast. Realized effects to date are concentrated and cohort-specific; measured usage remains majority-augmentative. The index is built as adaptation guidance, not doom.

# What this is

AI Risk Index scores every U.S. occupation on its exposure to AI-driven automation using a task-based methodology: each of the ~18,800 O*NET task statements is rated individually by a multi-model LLM panel, and occupation scores are derived from importance-weighted task scores. Every number is transparent, versioned, and reproducible.

# The three scores (never collapsed into one)

Score Question it answers
Exposure Is AI technically capable of performing the occupation's tasks?
Substitution Does AI actually replace the human — after cost, barriers, and adoption? (headline)
Augmentation Does AI assist the human, raising productivity without replacing them?

Every score ships with a confidence interval derived from rater disagreement — multi-model replication shows single-model exposure ratings can vary by an order of magnitude, so a single-model index is an artifact. Ours makes the disagreement visible.

# Methodology in one screen

Dimensions & weights (v1 — defined once in packages/scoring/src/weights.ts, served live at /api/v1/methodology):

Dimension Weight Orientation
Task automatability 0.35 direct
Current technical feasibility 0.20 direct
Cost of substitution vs. wage 0.15 direct
Adoption barriers 0.20 inverted — strong barriers protect
Sector adoption velocity 0.10 direct

Formulas — a rating r ∈ [1,5] normalizes to pressure p = (r−1)/4 (inverted: 1−(r−1)/4):

text
substitution_task = 100 · Σ_d  w_d · p_d
exposure_task     = 100 · (w_auto·p_auto + w_feas·p_feas) / (w_auto + w_feas)
augmentation_task = 100 · p_augmentation          (rated separately, outside the composite)
occupation        = importance-weighted mean of its tasks (O*NET IM weights)
CI bounds         = worst/best-case envelope over the rater panel (min/mean/max)

The scoring engine (packages/scoring) is pure and deterministic — no I/O, no clock, no randomness — pinned by property-based tests (fast-check) and a published worked example reproduced to 3 decimals. Full spec: METHODOLOGY.md · changelog.

Rating pipeline (apps/worker): Anthropic Message Batches (50% discount, prompt-cached rubric, schema-constrained JSON output), one request per task × model, deterministic custom_ids → idempotent and resumable. Every rating stores model, prompt version, raw response, parsed score, and rationale — the full audit trail is visible on every occupation page (expand any task).

Integrity rules: weights/formulas/prompt changes bump INDEX_VERSION with a changelog entry; every published score traces to an immutable score_runs row; historical runs stay queryable forever.

# Data sources

Source Version Role License
O*NET database 30.3 (May 2026) 1,016 occupations, 18,796 task statements, importance weights CC BY 4.0
BLS OEWS May 2025 national Median wages + employment (830 SOCs) Public domain
ESCO v1.2 + ROME 4.0 planned EU/France crosswalk EUPL / Licence Ouverte
Adoption evidence (BTOS, Anthropic Economic Index, …) 2025–2026 Grounds the adoption-velocity & barriers rubrics various

Raw dumps are immutable (data/raw/, fetched by script, never committed); derived artifacts commit manifests only (hashes + row counts). The research corpus grounding v1 — 20+ indices reviewed, verified source URLs, API cost analysis — lives in docs/research/.

# Public API

Versioned, JSON, index_version in every payload. Rate limit 60 req/min (600 with key).

bash
# Health
curl https://www.airiskindex.io/api/v1/health

# Machine-readable methodology (weights, orientation, thresholds)
curl https://www.airiskindex.io/api/v1/methodology

# Search occupations
curl "https://www.airiskindex.io/api/v1/occupations?q=paralegal"

# Full score breakdown: sub-scores, CI bounds, tasks, wages
curl https://www.airiskindex.io/api/v1/occupations/23-2011.00

# Monorepo

text
airiskindex/
├── apps/
│   ├── web/          # Next.js 14 — site + public API (ranking, insights, detail pages, drawer nav)
│   ├── worker/       # BullMQ + Anthropic Message Batches rater pipeline, recompute, purge scripts
│   └── etl/          # Python 3.12 — O*NET/OEWS download → transform (manifests) → Postgres load
├── packages/
│   ├── scoring/      # Pure TS scoring engine — the auditable core (weights, formulas, CI)
│   ├── db/           # Prisma schema: occupations, tasks, rating audit trail, immutable runs
│   ├── ui/           # Shared React components
│   └── config/       # Shared tsconfig presets
├── data/             # raw/ (immutable, gitignored) · derived/ (manifests committed)
├── docs/
│   ├── methodology/  # METHODOLOGY.md (source of truth), changelog, worked examples
│   └── research/     # Research corpus: indices, data sources, rater API, market evidence
└── infra/            # docker-compose, PM2 wrappers, ngrok config, deploy script

# Quick start

bash
pnpm install
docker compose -f infra/docker-compose.dev.yml up -d   # postgres 16 + redis (or brew services)
cp infra/.env.example .env                             # fill DATABASE_URL, ANTHROPIC_API_KEY, RATER_MODELS…
pnpm db:migrate && pnpm db:seed
pnpm dev                                               # web on :3000

Full pipeline to a real index:

bash
cd apps/etl && make pipeline        # O*NET 30.3 + OEWS → Postgres (1,016 occupations, 18,796 tasks)
pnpm --filter @airiskindex/worker rate    # multi-model batch rating (parallel, resumable)
pnpm score:recompute                # new immutable score run

Checks (must pass before any commit): pnpm typecheck && pnpm lint && pnpm test

# Design system

Charts follow a validated, colorblind-safe reference palette (sequential blue for magnitude, CI whiskers in muted ink, emphasis form for "you are here" distributions, visible data-table fallbacks). Fully responsive — right-side drawer navigation on mobile, dark mode with selected (not flipped) palette steps.

# Roadmap

  • 5% human review sample + expert Delphi override queue (schema ready)
  • Sensitivity analyses published per release (docs/methodology/sensitivity/)
  • Convergent-validity report vs Felten AIOE, GPTs-are-GPTs, ILO gradients
  • ESCO/ROME crosswalk — EU & France coverage
  • API keys + rate limiting middleware
  • INDEX_VERSION 1.0.0 — first published run

# License, citation & contact

  • Scores & derived data: CC BY 4.0 — reuse freely with attribution "AI Risk Index (airiskindex.io), version X".
  • Code, site design & text: © 2026 Simon-Pierre Boucher. All rights reserved.
  • Incorporates the ONET® database (USDOL/ETA, CC BY 4.0) and BLS OEWS data. ONET® is a trademark of USDOL/ETA, which has not reviewed or endorsed this project.

Cite as: AI Risk Index, version 1.0.0-draft.1, airiskindex.io, Simon-Pierre Boucher (2026).

Contact — methodology questions, corrections, expert-panel participation, commercial licensing & contracts: Simon-Pierre Boucher · contact@spboucher.ai

Terms of Service · Privacy Policy