Every formula behind every number on this dashboard — explained so a first-time visitor and a labor economist can both get something out of it.
This page is organized by which page of the site a number feeds, not by data type — so it doesn't matter where you start. Formulas and worked examples are here for anyone who wants to reproduce a score by hand. "In plain terms" callouts are here for anyone who just wants to understand what a number means without doing the arithmetic.
Feeds the National Pulse homepage: the headline AI-Impact number and the three-scenario tracker beneath it.
The homepage hero number. It starts from the same metro-level labor-stress data used throughout the dashboard, then tilts it toward metros where AI exposure is highest:
where stress_score is 0–100 and ai_exposure_weight is 0–1.
In plain terms: the (0.5 + 0.5 × ai_exposure_weight) part means every metro's raw stress score still counts for at least half its value, no matter how AI-exposed that metro is — and counts for its full value if it's maximally exposed. So a struggling metro with low AI exposure still shows up as somewhat concerning, just less so than an equally struggling metro that's highly exposed to AI. AI exposure amplifies the number here; it doesn't replace it.
The map color scale uses a 0–60 visual domain for readability (most values cluster in the 0–40 range); this is a visual choice, not a scale claim. Below 20 = low, 20–40 = moderate, 40+ = high. View on National Pulse →
Below the headline number, the homepage tracks which of three long-run scenarios the data currently looks most consistent with:
Eight indicators from published research are tracked to help judge which scenario the evidence currently favors, each with a threshold that would signal movement toward one of the three. Each indicator carries a reliability weight reflecting how trustworthy it is. The table below is generated automatically from the scenario threshold configuration. View on National Pulse →
Loading scenario triggers…
Each scenario's weight is a softmax over a log-prior plus live evidence:
In plain terms: a softmax is a standard statistical technique for turning a set of raw scores into percentages that add up to 100%, while preserving their relative ranking. Practically, this means the tracker starts from a baseline guess before any evidence comes in — 40% Accelerated, 35% Gradual, 25% Augmentation — then nudges those percentages as real-world indicators cross their thresholds. The "smoothing" term controls how much any single indicator can move the needle on its own; a higher value would let evidence swing the odds further and faster.
The base_weights prior above is what prevents extreme swings from sparse data. smoothing = 1.0 (configurable via config/scenario_thresholds.json). When few indicators are triggered, the weights stay close to the prior; as more trigger, the weights shift toward the scenarios those indicators support. The current evidence totals and base weights are available in /api/scenario.
The Sankey diagram below shows how each of the eight monitored indicators flows into the three scenarios, weighted by each indicator's reliability and signal strength. The height of each scenario node on the right edge is proportional to that scenario's current odds. Hover a flow to see that indicator's value, threshold, and trend; click to pin the detail.
Loading indicator flow diagram…
This diagram is the detailed version of the scenario model that powers the odds shown on the National Pulse homepage map controls.
Feeds the Your Community page: local AI exposure, capacity to adapt, and how a ZIP code's metro compares to the rest of the country.
CM1 — Structural AI Exposure: Computed from ACS PUMA-level occupation data (C24050). Each occupation group is weighted by its AI exposure (derived from the Felten AIOE index — see the Your Career section below for what that means). The score is the weighted share of the local workforce in AI-exposed occupations, normalized to 0–1. View on Your Community →
CM2 — Adaptive Capacity: A composite of four components, each normalized to 0–1 and averaged — essentially, a rough answer to "if AI does disrupt this local economy, how well-positioned is it to absorb the shock?":
In plain terms: HHI is a standard economics measure, originally built to flag when a market is dominated by too few companies. Here it's repurposed to measure how concentrated a local economy is in a handful of industries versus spread across many. A metro where most jobs sit in one or two industries (a single-employer factory town, say) has a high HHI and scores lower on diversity; a metro with jobs spread evenly across many sectors has a low HHI and scores higher. Diversified economies tend to absorb shocks — AI-driven or otherwise — better than single-industry ones, so this component rewards diversification.
Higher CM2 = greater capacity to adapt to AI-driven economic change.
OC1 / OC2 (occupational shift indicators): Not yet shown in the metro sidebar. National value pending.
Three leading indicators — L1 (AI-cited layoff share), L4 (Canaries slope), and L6 (Anthropic Economic Index) — are published at the national level by named sources (Challenger, Gray & Christmas; Stanford Digital Economy Lab / ADP Canaries; Anthropic). Those sources don't publish metro-level breakdowns, so this dashboard can't show the "real" L1, L4, or L6 for one specific metro. Instead, proxy values are estimated from the CM metrics that are available at the metro level:
The community page's "How Your Metro Compares" table keeps these proxy values in a separate "Metro Proxies" section so they aren't confused with the named-source national values. See /api/methodology for the metro_l1_l4_l6_proxies field with the full proxy descriptions.
Feeds the Your Career lookup: how exposed a specific occupation is to AI, and how that translates into an estimated displacement risk.
Each occupation gets an AI exposure score blended from multiple published academic methodologies rather than a single one. View on Your Career →
Who are Felten, Eloundou, and Eisfeldt, and why does this dashboard care what they think? They're the lead authors of three separately published, peer-reviewed studies that each built their own way of estimating how exposed an occupation is to AI. None of them are affiliated with this dashboard:
These three studies don't always agree with each other — sometimes by a lot, as the worked examples below show. Rather than pick one as "correct," this dashboard blends all three into a single composite score. The 40% / 35% / 25% split below is what's meant by a weight vector: it's just the recipe for how much each study's number counts toward the final blended score, nothing more exotic than a set of percentages that add up to 100%.
Every occupation currently uses the same recipe, described as the cognitive weight vector because all three studies measure exposure to cognitive, knowledge-work tasks — reading, writing, analysis, coding, the kind of work large language models are most relevant to. A second recipe for physical-task exposure (manual dexterity, mobility — the kind of work a chatbot has no bearing on) exists in the code but isn't switched on yet, pending O*NET work-context data. See the work_context_coverage field in /api/methodology for the current status.
Composite formula. The composite is a weighted average of the available methodology scores, using the weights above:
When a methodology is unavailable for an occupation, its weight is redistributed proportionally across the remaining methodologies (e.g., if only Felten 40% and Eloundou 35% are available, the effective weights become 40/75 = 53.3% and 35/75 = 46.7%). This is a simple weighted average — not a geometric or harmonic mean. A researcher can reproduce the composite for any occupation using this formula, the weights above, and the per-methodology scores from the career detail API.
Loading career scoring config…
What's a "heuristic-v1" score? The three published studies don't cover every occupation — Felten's dataset, for instance, only reaches 774 of the roughly 1,000 detailed SOC occupation codes. For anything missing, this dashboard falls back to an in-house rule-of-thumb estimate, labeled heuristic-v1, built from occupation characteristics like education requirements and task routineness. It's clearly flagged wherever it shows up (see Example 2 below) so it's never mistaken for a peer-reviewed number.
As of 2026-07-21. Verify against the live API: /api/career/detail/19-3011.00 (Economists) and /api/career/detail/15-1252.00 (Software Developers).
Example 1: Economists (SOC 19-3011.00) — all 3 published methodologies. A case where the three studies disagree sharply — worth noticing, since the gap itself is informative:
Example 2: Software Developers (SOC 15-1252.00) — 1 published + 1 heuristic (redistributed weights).
In Example 2, Eisfeldt's 0.25 weight is redistributed proportionally: the effective weights are 0.40/0.75 = 53.3% (Felten) and 0.35/0.75 = 46.7% (Eloundou). The Felten slot uses the in-house heuristic-v1 estimate because this occupation isn't in the published Felten AIOE v2 dataset (774 SOC codes / 805 O*NET occupations); the 215 missing occupations use the heuristic fallback. See Displacement vs. Exposure below for the distinction between exposure (what these scores measure) and displacement.
These are two different questions. Exposure asks: could AI plausibly touch parts of this job, based on the tasks it involves? Displacement asks: has AI actually caused people in this occupation to lose work? The three published methodologies above only answer the first question — none of them measure displacement, they measure exposure. Nobody has good, publicly available data yet that directly measures AI-caused displacement at the occupation level, so the "Displacement" number shown for every occupation comes from the in-house heuristic-v1 model instead of any published study.
The heuristic-v1 model produces a displacement estimate for every occupation. When that estimate is near-zero (≤ 0.01) or converges with the exposure score to within 0.001, it's treated as unreliable and the card shows '—' with an 'estimated' badge rather than the raw number. For the median occupation (BLS projection in the deadband, no friction adjustment — see below), the "Peak Displacement Risk" equals the exposure composite exactly — see the Displacement risk formula below for the derivation, and the career detail page's "Equals exposure" badge for where that shows up.
A note on consistency (updated 2026-07-22): The browse table and the detail card now show the same number — the composite displacement risk computed by assess_displacement_risk. The heuristic-v1 score still appears as a secondary italic figure in both places, so nothing is lost, but it's no longer the headline number in the browse table. An “= exposure” badge appears there whenever the composite equals the exposure score (the deadband case described below). Earlier versions of this page showed the heuristic-v1 sentinel (often under 1%) in the browse table while the detail card showed the much higher composite for the same occupation — the inconsistency this update was built to fix, since a number worth citing should mean the same thing wherever it appears.
The "Peak Displacement Risk" number on the career detail page is computed by assess_displacement_risk in api/career_scoring.py (lines 474–508). It takes the AI exposure composite as a base and adjusts it up or down based on how the Bureau of Labor Statistics (BLS) projects that occupation's employment to change over the next decade:
The multiplier rules (applied in order, only the first matching rule fires):
In plain terms: most occupations — anything BLS expects to grow or shrink only modestly over ten years — sit in the "deadband" and get no adjustment at all; their displacement risk is just their exposure score. The adjustment only kicks in at the edges: fast-growing fields get a discount (even heavily-automated tasks matter less when the field is also creating lots of new roles), and shrinking fields get a markup (automation and secular decline compounding each other).
The result is capped at 1.0. For the median occupation (BLS projection in the deadband), the multiplier is 1.0 and displacement_risk == exposure_score to 4 decimal places. The career detail page flags this with an "Equals exposure" badge (see Your Career).
The friction multiplier (0.8 for high-friction occupations, defined as total friction years > 5) was documented here for completeness, then removed; it'll return once O*NET work-context data is ingested. See the friction_note in /api/methodology.
Worked examples. For Economists (SOC 19-3011.00, exposure 0.7055, BLS +2.3%): \(\text{displacement\_risk} = 0.7055 \times 1.0 = 0.7055\) — identical to the exposure composite. For Software Developers (SOC 15-1252.00, exposure 0.7679, BLS +6.2%): \(\text{displacement\_risk} = 0.7679 \times 1.0 = 0.7679\) — also identical (both sit in the deadband).
For the median occupation — one whose BLS 10-year projection sits in the (−5%, +10%) deadband — the displacement-risk multiplier is 1.0, so the displayed “Peak Displacement Risk” is identical to the AI exposure composite to 4 decimal places. The “Equals exposure” badge on the career detail card (and the “= exposure” mini-badge in the browse table) flag this case at the point of display. The displacement framing is kept on the detail card rather than relabeling the number “exposure score,” because for occupations outside the deadband — high-growth fields where the multiplier is 0.7, or declining fields where it is 1.2 — the displacement number diverges from the exposure number and the framing becomes meaningful. See the worked examples above for the arithmetic.
displacement_risk vs displacement_score. The career detail API returns two distinct fields: displacement_risk (from assess_displacement_risk, shown as "Peak Displacement Risk") and displacement_score (from the canonical view's heuristic-v1 row, shown in the "Displacement" score row). The latter is null for most occupations (the API suppresses it when it converges with exposure within 0.001 or is ≤ 0.01). When non-null, the score row shows it with a "heuristic" badge. The "Peak Displacement Risk" number is always from assess_displacement_risk, not from the heuristic-v1 row.
The composite exposure score is a weighted average of up to 3 published methodologies (Felten, Eloundou, Eisfeldt). When 2 or more are available, the career detail API also reports a weighted standard error (SE) and 95% confidence interval:
where \(w_i\) is the methodology weight (Felten 0.40, Eloundou 0.35, Eisfeldt 0.25), \(\text{score}_i\) is the per-methodology exposure score, \(\text{composite}\) is the weighted average, and \(n\) is the number of published methodologies (excluding heuristic-v1, which is not a published methodology). The 95% CI is \(\text{composite} \pm 1.96 \times SE\), clipped to [0, 1].
In plain terms: think of the confidence interval as a way of saying "here's the range this number could plausibly fall in, given how much the underlying studies disagree." A narrow interval means Felten, Eloundou, and Eisfeldt largely agree on this occupation — the composite is on solid ground. A wide interval (like the Economists example below, spanning 0.40 to 1.00) means they don't agree at all, and the single composite number should be treated with real skepticism rather than as a precise measurement.
Why weighted (not unweighted) variance: the methodologies have different coverage and reliability. Weighting by the same weights used in the composite ensures that a methodology with a small weight (e.g., Eisfeldt at 0.25) contributes proportionally to the SE, not equally with Felten at 0.40.
n < 2 fallback: when only 1 published methodology is available (or 0), the SE isn't computable. The API returns composite_std_error: null with a precision_disclosure string explaining why. The career detail card shows that disclosure text in place of the SE.
Heuristic-v1 exclusion: the in-house heuristic-v1 estimate is excluded from the SE computation because it isn't a published methodology and would artificially narrow the CI for occupations where it substitutes for a missing published source.
Worked example. For Economists (SOC 19-3011.00): Felten 0.9705, Eloundou 0.5000, Eisfeldt 0.5692. Composite = 0.7055. \(SE \approx 0.15\), 95% CI \(\approx [0.40, 1.00]\). The wide CI reflects the 47pp disagreement between Felten and Eloundou on this occupation seen in Example 1 above.
Feeds the For Policymakers page's Quick Report — a single national number meant for a briefing document, not a deep dive.
In plain terms, this tracks whether the sectors of the economy most plausibly affected by AI — information, professional/business services, and admin support — are adding or shedding jobs, averaged across every tracked metro into a single 0–100 score:
(unweighted, 0–100 scale). Below 20 = low, 20–40 = moderate, 40+ = high. This is the number shown in the Quick Report National Context block on the For Policymakers page. View on For Policymakers →
Why is a metric called "National Risk Index" living on the Policymakers page instead of National Pulse? The name is a holdover from an earlier, smaller pilot version of this metric (see the historical note below) — the label never got updated to match where it ended up being displayed. The MS1 metric ID and its values are unaffected either way.
MS1 was originally labeled "DC/SF/Phoenix/Tampa metro sentinel employment" — a 4-metro pilot. The data is now available for all 595 CBSAs via the BLS API and represents total nonfarm payrolls in the information + professional/business services + admin-support composite (thousands). The label was updated on 2026-07-22 to reflect the current scope. The MS1 metric ID and the underlying values are unchanged.
A few things are worth stating plainly, no matter which section above brought you here: