// File: page.tsx // Path: apps/web/app/methodology/page.tsx // Project: AI Risk Index — airiskindex.io // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // Copyright © 2026 Simon-Pierre Boucher. All rights reserved. // // Description: Human-readable methodology documentation (weights pulled live from the engine). import Link from "next/link"; import { DIMENSIONS, EXPOSURE_DIMENSIONS, HIGH_EXPOSURE_THRESHOLD, INDEX_VERSION, INVERTED_DIMENSIONS, WEIGHTS, type DimensionKey, } from "@airiskindex/scoring"; export const metadata = { title: "Methodology — AI Risk Index", description: "Full methodology of the AI Risk Index: task-based scoring, multi-model LLM rater panel, confidence intervals, weights, formulas, versioning and limitations.", }; const DIMENSION_DETAILS: Array<{ key: DimensionKey; name: string; question: string; anchors: string; }> = [ { key: "automatability", name: "Task automatability", question: "Could current AI (including tool-using agents) perform this task end-to-end with at least 50% time saving at equal quality?", anchors: "1 = no meaningful part automatable today · 3 = roughly half automatable with significant setup · 5 = the full task meets the ≥50%-time-saving-at-equal-quality bar with off-the-shelf systems. The 50% threshold follows Eloundou et al. (2024), the citable standard.", }, { key: "feasibility", name: "Current technical feasibility", question: "Do deployed products demonstrably perform this task reliably today — not merely in demos or benchmarks?", anchors: "1 = research-stage only · 3 = products exist with material error rates or narrow scope · 5 = mature products perform this reliably in production at scale. Separating conceivable from deployable is the failure that undid whole-occupation forecasts.", }, { key: "cost_ratio", name: "Cost of substitution vs. wage", question: "How does the all-in AI cost per task-equivalent (inference, integration, oversight) compare to the loaded human wage for the same output?", anchors: "1 = AI is more expensive all-in · 3 = roughly comparable · 5 = AI is at least an order of magnitude cheaper.", }, { key: "barriers", name: "Adoption barriers", question: "How strong are the real-world barriers to substitution: licensing and authorization requirements, liability and error-cost asymmetry, regulation of the automation itself, human-contact requirements, organizational friction?", anchors: "1 = nothing prevents substitution · 3 = some friction (oversight requirements, customer preference for humans) · 5 = hard barriers — a licensed human must legally perform or sign off on the task. This dimension is inverted in the composite: strong barriers lower the substitution score.", }, { key: "adoption_velocity", name: "Sector adoption velocity", question: "How fast and deep are the sectors where this task occurs actually adopting AI — agents in production and measured displacement, not vendor announcements?", anchors: "1 = laggard sectors (small firms, physical work, low digitization) · 3 = pilots common, production rare · 5 = fast, deep adoption (information, finance, professional-services patterns).", }, ]; function Section({ id, title, children, }: { id: string; title: string; children: React.ReactNode; }): JSX.Element { return (

{title}

{children}
); } export default function MethodologyPage(): JSX.Element { return (

Methodology · version {INDEX_VERSION}

How the AI Risk Index is computed

Every number on this site is reproducible: the weights, formulas, rater prompts and every individual model rating are public. This page is the human-readable specification; the machine-readable version is at{" "} /api/v1/methodology .

Task-based, not occupation-based.{" "} Occupations are bundles of tasks with very different AI exposure. Scoring whole occupations with a single judgment — the approach of the famous 2013 "47% of jobs" estimate — has a poor empirical track record. We score each of the ~18,800 O*NET task statements individually and derive occupation scores from them, weighted by how important each task is to the occupation.

Uncertainty is part of the score. Large language models disagree with each other substantially when rating AI exposure — replications show the share of "highly exposed" occupations can vary by an order of magnitude depending on which frontier model does the rating. A single-model index is therefore an artifact. Every score we publish carries a confidence interval derived from disagreement across an independent multi-model panel.

Fully reproducible. Weights live in one versioned source file, prompts are versioned, every rating stores the model, prompt version, raw response and parsed score, and every published number traces to a stored, immutable computation run.

Adaptation, not doom. The evidence to date shows concentrated, cohort-specific effects — especially on entry-level hiring in automation-exposed occupations — rather than economy-wide job loss, while measured AI usage remains majority-augmentative. The index is designed to guide adaptation decisions, not to produce headlines.

Every occupation gets three sub-scores on a 0–100 scale, never collapsed into one:

{[ [ "Occupations & task statements", "O*NET 30.3 (U.S. Dept. of Labor, CC BY 4.0), O*NET-SOC 2019 taxonomy", "Unit of analysis: 1,016 occupations, ~18,800 tasks", ], [ "Task importance weights", "O*NET Task Ratings, importance scale (IM, 1–5)", "Aggregation weights from tasks to occupations", ], [ "Wages & employment", "BLS Occupational Employment and Wage Statistics, May 2025 national", "Median wages (shown per occupation; cost-ratio context)", ], [ "EU/France crosswalk (planned)", "ESCO v1.2 + official ESCO↔O*NET crosswalk; ROME 4.0", "European occupation coverage in a future release", ], [ "Adoption evidence", "Census BTOS, Anthropic Economic Index, sector deployment studies", "Grounding for the adoption-velocity rubric anchors", ], ].map(([a, b, c]) => ( ))}
Input Source Role
{a} {b} {c}

Raw source dumps are immutable and never edited in place; all transformations run through a pipeline that records manifests (hashes and row counts) for every derived artifact.

Each task statement is rated on six dimensions (the five composite dimensions plus augmentation) on an integer 1–5 scale by{" "} at least two independent frontier language models using an identical, versioned rubric prompt. Ratings are requested with schema-constrained JSON output; each rating must include a written rationale grounded in the task statement.

For every task × dimension, the panel produces a rating band:{" "} low = the panel minimum, mid = the panel mean,{" "} high = the panel maximum. Bands — not single numbers — flow into all downstream computation, which is how rater disagreement becomes a visible confidence interval instead of hidden noise.

Audit trail. Every rating stores the model identifier, prompt version, raw API response, parsed score and rationale. On any occupation page, expanding a task shows every model's rating and rationale — nothing is asserted that cannot be inspected.

Human validation. A sample of ratings is reviewed by humans; disagreements above one point on the 5-point scale route the task to an expert review queue whose overrides replace the model band and are flagged in the data. Prompt changes bump the prompt version and invalidate cached ratings.

{DIMENSIONS.map((key) => ( ))}
Dimension Weight Orientation
{DIMENSION_DETAILS.find((d) => d.key === key)?.name ?? key} {(WEIGHTS[key] * 100).toFixed(0)}% {INVERTED_DIMENSIONS.has(key) ? "inverted — higher rating lowers substitution" : "direct"}
{DIMENSION_DETAILS.map((dim) => (

{dim.name}{" "} · weight {(WEIGHTS[dim.key] * 100).toFixed(0)}%

{dim.question}

{dim.anchors}

))}

Weights are defined once, in a versioned source file, and served live at{" "} /api/v1/methodology {" "} — any change is a new index version with a changelog entry and regenerated sensitivity analyses.

A rating r ∈ [1, 5] normalizes to substitution pressure p ∈ [0, 1]:

          {`p = (r − 1) / 4            direct dimensions
p = 1 − (r − 1) / 4        inverted dimensions (barriers)

substitution_task = 100 · Σ_d  w_d · p_d          over all five dimensions
exposure_task     = 100 · (w_auto·p_auto + w_feas·p_feas) / (w_auto + w_feas)
augmentation_task = 100 · p_augmentation`}
        

The exposure sub-score uses only {EXPOSURE_DIMENSIONS.join(" and ")}, renormalized. The scoring engine is a pure, deterministic library with no network, clock or randomness — identical inputs always produce identical scores, which is what makes runs auditable. Its behavior is pinned by property-based tests and by a published worked example that the test suite reproduces to three decimals.

Occupation scores are the importance-weighted mean of task scores, using O*NET task importance ratings normalized within each occupation. Tasks without an importance rating receive the occupation's mean importance. The same aggregation applies to the low, mid and high bounds.

We additionally report the highly exposed task share: the fraction of an occupation's tasks with a substitution score of{" "} {HIGH_EXPOSURE_THRESHOLD} or more. "X% of tasks in this occupation are highly exposed" is the preferred headline reading — more honest than a single composite.

The low and high bounds are worst/best-case envelopes over the rater panel: the lower bound takes each dimension's pressure-minimizing rating bound (for the inverted barriers dimension, that is the high rating), the upper bound symmetrically. By construction low ≤ score ≤ high always holds. A wide interval means the models disagreed — treat that score as an open question, not a verdict. Occupations with the widest intervals are exactly where human expert review is prioritized.

The index version ({INDEX_VERSION}) follows semantic versioning: formula or weight changes are major; data-source refreshes are minor; recomputations with refreshed adoption inputs are patches. Every computation writes a run record with the index version, prompt version and rater models. Runs are immutable — recomputations create new runs and old runs remain queryable, so any historically published score can be reproduced and checked forever. Every API response carries the index version it was computed under.

Published alongside each major or minor release:

Cite as: AI Risk Index, version {INDEX_VERSION}, airiskindex.io, Simon-Pierre Boucher (2026). Scores and derived data are published under{" "} CC BY 4.0 — reuse freely with attribution and the index version. Occupation and task data incorporate the O*NET database (U.S. Department of Labor, CC BY 4.0); wage data from BLS OEWS.

Methodology questions, corrections, expert-panel participation, data licensing or anything else:{" "} contact@spboucher.ai {" "} — Simon-Pierre Boucher.

); }