# AI Risk Index — Methodology v1.0.0 (DRAFT)
> Status: **draft, unreleased**. This document is the source of truth for the scoring
> methodology (see CLAUDE.md §9). Code in `packages/scoring` links to the section
> anchors below; if code and this document disagree, stop and flag it.
>
> Related work and evidence base: `docs/research/01-existing-indices.md` (indices),
> `02-data-sources.md` (data), `04-landscape-and-evidence.md` (adoption & barriers evidence).
---
## 1. Principles
1. **Task-based, not occupation-based.** Occupations are bundles of tasks with very
different AI exposure; whole-occupation scoring (Frey & Osborne 2013) has a poor
empirical record. Occupation scores are always *derived* from task scores
(Arntz, Gregory & Zierahn 2016; Eloundou et al. 2024).
2. **Three concepts, never collapsed** (see §5):
- **Exposure** — AI is technically capable of performing the task.
- **Substitution** — AI actually replaces the human performing it. This is the
headline composite.
- **Augmentation** — AI assists the human, increasing productivity.
Realized labor-market effects concentrate in *automation-classified* usage, not
augmentation (Brynjolfsson, Chandar & Chen 2025), so conflating the three is not
just imprecise — it is empirically wrong.
3. **Uncertainty is part of the score.** Every published score carries
`score_low / score / score_high`. Interval width is driven primarily by
disagreement between independent LLM raters (single-model ratings show up to a
19× spread in headline statistics across frontier models — Yin, Vu & Persico 2026)
plus human-calibration error on the expert anchor set.
4. **Fully reproducible.** Weights, formulas, prompt versions, rater model IDs and
per-model ratings are all published. Every score traces to a stored
`score_runs` row; historical runs are immutable.
5. **Versioned.** Any change to weights, formulas, or rater prompts bumps
`INDEX_VERSION` (semver) with a changelog entry and regenerated sensitivity outputs.
## 2. Data
| Input | Source | Role |
|---|---|---|
| Occupations & task statements | O*NET 30.x (O*NET-SOC 2019 taxonomy), CC BY 4.0 | Unit of analysis (~18k tasks, ~900 data-level occupations) |
| Task importance weights | O*NET Task Ratings (IM scale 1–5) | Aggregation weights (§6) |
| EU/France occupations | ESCO v1.2.x + official ESCO↔O*NET crosswalk; ROME 4.0 | Crosswalked scores (crosswalk loss documented per occupation) |
| Wages | BLS OEWS (latest May release); Eurostat SES; INSEE | `cost_ratio` denominator |
| Adoption data | Census BTOS AI supplement, Ramp AI Index, Anthropic Economic Index (Hugging Face), Challenger reports | `adoption_velocity` inputs (§4.5) |
| Human anchor ratings | Expert Delphi panel (`data/derived/expert_overrides/`) | LLM-rater calibration (§3) |
Raw dumps are immutable (`data/raw/`, gitignored); all transformations go through
`apps/etl`; derived artifacts commit only manifests (hashes + row counts).
## 3. Task rating (LLM-as-evaluator)
Each O*NET task statement is rated on a **5-point scale** per dimension (§4) by a
**panel of ≥2 (target 3) frontier LLMs** (`RATER_MODELS`), using versioned rubric
prompts (`apps/worker/src/raters/prompts/`). Per task × dimension:
- `rating_mid` = mean of panel ratings;
- `rating_low` / `rating_high` = min / max of panel ratings (rater-disagreement band).
Rubric anchors follow the citable standards: automatability uses the Eloundou et al.
"≥50% time saving at equal quality" threshold, decomposed into named criteria
(SML-style multi-criterion rubric); ratings require structured justifications and are
stored with model ID, prompt version and raw response (full audit trail).
**Calibration:** 5% of ratings are sampled for human review; panel-vs-human
disagreement > 1 point routes the task to the expert queue. Expert overrides replace
the LLM band for that task and are flagged in the API output.
## 4. Dimensions
Composite weights live in `packages/scoring/src/weights.ts` and are published at
`/api/v1/methodology`. Weights sum to 1.0.
| Dimension | Key | Weight | Orientation | Rubric anchor (rating of 5 means…) |
|---|---|---|---|---|
| Task automatability | `automatability` | 0.35 | direct | Current AI (incl. tooling/agents) can do the task with ≥50% time saving at equal quality |
| Current technical feasibility | `feasibility` | 0.20 | direct | Deployed products demonstrably perform this task reliably today (not merely conceivable) |
| Cost of substitution vs. wage | `cost_ratio` | 0.15 | direct | AI cost per task-equivalent ≪ loaded human wage for the same output |
| Adoption barriers | `barriers` | 0.20 | **inverted** | Strong barriers: licensing/liability/regulation/human-contact requirements block substitution |
| Sector adoption velocity | `adoption_velocity` | 0.10 | direct | Occupation's dominant sectors adopt AI fast and deep (agents in production, measured displacement) |
Orientation: a *direct* dimension's higher rating increases substitution pressure; an
*inverted* dimension's higher rating decreases it. `barriers` is the only inverted
dimension in v1. Orientation is encoded once, in `packages/scoring/src/weights.ts`,
next to the weights.
Additionally, **`augmentation`** is rated per task on the same 5-point scale (does AI
assist the human on this task, raising productivity without replacing them?). It is
**not** part of the substitution composite; it feeds the augmentation sub-score (§5).
### 4.4 `barriers` components
Rated against five named criteria (see research doc 04): licensing/authorization
requirement (0.30), liability & error-cost asymmetry (0.25), regulatory-process
coverage (0.20, jurisdiction-specific), human-contact requirement (0.15),
organizational friction (0.10). Pre-2022 null results (OECD 2021; Acemoglu et al.
2022) show barriers dominate short-run outcomes — hence the 0.20 weight.
### 4.5 `adoption_velocity` components
Grounded in *measured* adoption, not forecasts: sector AI-use rate employment-weighted
(0.35), sector adoption momentum (0.20), agentic deployment depth (0.20), realized
displacement intensity (0.15), occupation-level usage intensity from the Anthropic
Economic Index (0.10). Refreshed each index release; sources are public and dated.
## 5. Scoring formulas
All formulas are implemented, pure and deterministic, in `packages/scoring`.
Ratings `r ∈ [1,5]` normalize to pressure `p ∈ [0,1]`:
```
p = (r − 1) / 4 (direct dimensions)
p = 1 − (r − 1) / 4 (inverted dimensions)
```
Per task:
```
substitution_task = 100 · Σ_d w_d · p_d (all five dimensions)
exposure_task = 100 · (w_auto·p_auto + w_feas·p_feas) / (w_auto + w_feas)
augmentation_task = 100 · p_augmentation
```
Confidence bounds: `score_low` is computed with each dimension's
pressure-minimizing rating bound (for direct dimensions the low rating; for inverted
dimensions the **high** rating), `score_high` symmetrically. Bounds are therefore
worst/best-case envelopes over rater disagreement, and `low ≤ score ≤ high` always
holds.
## 6. Aggregation to occupations
Occupation scores are the **importance-weighted mean** of task scores, weights from
O*NET Task Ratings importance (IM, 1–5), normalized to sum to 1 within the
occupation. Applied identically to `low`, `score` and `high`. Tasks lacking
importance ratings receive the occupation-mean importance.
The API additionally reports the share of tasks with `substitution_task ≥ 70`
("highly exposed task share") — this, not the composite alone, is the preferred
headline in UI copy ("X% of tasks in this occupation are highly exposed").
## 7. Versioning & runs
- `INDEX_VERSION` (semver) in `packages/scoring/src/version.ts`.
- MAJOR: formula/weight changes. MINOR: data-source version bumps (new O*NET release,
new adoption data). PATCH: recomputation with refreshed adoption inputs, prompt
clarifications that don't change the rubric semantics.
- Every computation writes a `score_runs` row (index version, prompt version, rater
models). Old runs stay queryable forever; the API serves the latest by default and
any run on request.
## 8. Validation & sensitivity
Published with every MAJOR/MINOR release under `docs/methodology/sensitivity/`:
1. **Convergent validity:** Spearman correlation of our occupation scores against
Felten AIOE, Eloundou β, and ILO WP140 gradients (ρ ≈ 0.84 between independent
modern methodologies is the reference bar).
2. **Rater stability:** cross-model agreement distribution; occupations with the
widest bands flagged in-product.
3. **Outcome tracking:** correlation against the Stanford "Canaries" dashboard
(entry-level employment in exposed occupations) and AEI usage shares — exposure
indices individually explain <11% of realized unemployment risk (Frank, Ahn &
Moro 2025), so we report outcome tracking honestly rather than claiming prediction.
4. **Weight sensitivity:** composite rank stability under ±25% perturbation of each
weight.
## 9. Known limitations
- LLM raters co-evolve with the technology they measure (the "ruler" problem);
multi-model panels bound but do not eliminate this.
- Sector-level adoption inputs are priors, corrected by occupation-level usage data.
- ESCO/ROME crosswalked scores inherit crosswalk loss; flagged per occupation.
- Scores describe *tasks as currently constituted*; occupations reorganize.
- This index measures exposure and substitution *pressure*, not certainty of job
loss. Product copy follows the adaptation-not-doom tone guide accordingly.