American Dream Reality Index — Methodology

Version: 1.0.0 Status: First stable release. Indicator set, weights, anchors, publication threshold, and output schema are now considered the public API of the ADRI. Last updated: 2026-08-03


1. Purpose and scope

The American Dream Reality Index (ADRI) is a small, transparent composite of U.S. structural conditions that affect how plausible the American Dream — durable prosperity plus intergenerational mobility — is in practice for the median resident.

The ADRI tracks *enabling conditions*, not outcomes for any individual and not a country's "greatness." Concretely:

The ADRI is deliberately slow-moving and backward-looking. Most inputs update annually; a few update biennially or quarterly. Fast-moving events belong in other products (e.g., the BugOut Index's Current Signals layer), not here.

1.1 What we mean by "the American Dream"

The American Dream has never had a single agreed definition. This index adopts a specific one: the structural conditions under which a median American resident can reasonably expect material security, basic educational access, health and longevity, political voice, and freedom from a punitive institutional floor. These are the conditions that historically preceded the property-ownership, family-formation, and generational-mobility outcomes most often associated with the phrase "American Dream" in 20th-century framings.

What autonomy and state coercion look like in the ADRI. Two of the ten indicators speak directly to the individual's relationship with the state: the incarceration rate per 100,000, which is the most direct measurable signal of state physical coercion at a population scale, and VEP turnout, which measures political voice. These are partial signals of a concept that deserves broader measurement than the ADRI can support with sound public data alone. A reader who prioritizes autonomy and freedom-from-coercion as central to the American Dream should treat these two indicators as necessary but not sufficient, and read the ADRI alongside more coercion-focused indices such as the BugOut Index.

What the ADRI does not measure. Cultural belonging, subjective flourishing, physical safety at the personal level, environmental quality, community cohesion, or the specific 20th-century markers (single-earner household sufficiency, single-family homeownership at working-class wages, guaranteed upward class mobility across generations). A reader who defines the American Dream around any of these should treat the ADRI as adjacent but incomplete.

What the ADRI cannot resolve. Whether these structural conditions are the *right* things to measure. Younger observers, in particular, increasingly define the American Dream in terms of security and autonomy rather than accumulation and ownership — a reframing the ADRI's indicator set partially reflects (through incarceration and VEP turnout) but does not fully capture. The ADRI's indicator set was designed to be generationally neutral on framing but specific on measurement — it measures the material substrate that most competing definitions still depend on, without endorsing any single cultural definition of what a "good life" looks like on top of that substrate.

1.2 The 0–100 scale, in practice

The ADRI is bounded 0–100 by construction, but the endpoints of that range are theoretical, not observed. A score of 100 would require every indicator to simultaneously reach its most-favorable-observed anchor value; a score of 0 would require every indicator to simultaneously reach its worst-observed anchor value. Neither has happened in the observation window, and neither is expected to happen in a mixed economy where indicators trade off against each other.

Across the 2010–2024 observation window, published design-weighted ADRI values have ranged from 34.9 (2012) to 43.9 (2024). Real-world scores are expected to continue falling within a narrower band than the full 0–100 range. Readers are encouraged to reason from the observed range rather than from the theoretical endpoints.

2. Design principles

  1. Robustness over cleverness. Prefer indicators with long, stable, publicly-documented series over novel but fragile ones.
  2. Methodology before code. All computation rules must be specified in this document before any script is written.
  3. Epistemic humility. Every score is versioned, every methodology change is annotated, and the site publishes limitations alongside the number.
  4. Reproducibility. Any snapshot of the index can be recomputed from raw source files and this document alone.
  5. Static architecture. All artifacts (raw data, processed data, index time series, site) are plain files hosted on GitHub Pages; no backend service is required to view or verify the index.
  6. Small n. A modest indicator count (target: 10, hard ceiling: 12) beats a large one for transparency and maintainability.

3. Indicator set

The ADRI uses 10 core indicators spanning six domains. Each is drawn from a widely-used, publicly-documented series maintained by a government agency or a well-established civil-society organization.

3.1 Final indicator table

#IndicatorDomainTypeSource (Agency)AccessFrequencyDirectionNotes
1NAEP grade-8 math & reading compositeEducationEnablingNCES / NAGBNAEP Data Service API (JSON)BiennialHigher = betterAverage of gr.8 math + reading scale scores; stable scale since 1990/1992
2Bachelor's degree attainment, age 25+EducationEnablingCensus Bureau (ACS 1-Year, Table S1501)Census API (JSON)AnnualHigher = betterAdult educational stock; percent with bachelor's degree or higher
3Life expectancy at birthHealthEnablingCDC / NCHS (NVSS)Socrata CSV/JSONAnnualHigher = betterFinal NVSS series; provisional data ignored for the index
4Drug overdose mortality, age-adjustedHealthEnablingCDC / NCHS (NVSS via WONDER)CDC WONDER API (XML)AnnualLower = betterICD-10 drug-induced deaths; consistent coding since 1999
5Real median household incomeProsperityProsperityCensus (CPS ASEC), hosted on FREDFRED API MEHOINUSA672NAnnualHigher = betterReal dollars; deflator-seam noted (§7.4)
6Supplemental Poverty Measure rateProsperityProsperityCensus Bureau (Report P60 series)Census SPM datasets (XLSX/CSV)AnnualLower = betterPreferred over the Official Poverty Measure; reflects taxes, transfers, and geographic cost
7Prime-age (25–54) employment-to-population ratioProsperityProsperityBLS (CPS), hosted on FREDFRED API LNS12300060Monthly (annualized)Higher = betterAnnualized to a single yearly value (see §5.3)
8Gini index of household incomeOpportunityMobilityCensus Bureau (ACS 1-Year, Table B19083)Census API B19083_001EAnnualLower = betterInequality serves as an indirect mobility proxy; see §3.3
9Voter turnout of voting-eligible population (VEP)CivicEnablingU.S. Elections Project (McDonald / UF Election Lab)CSV/Excel downloadBiennialHigher = betterGeneral-election years only; midterms and presidentials tracked separately (see §5.4)
10Total incarceration rate per 100,000 residentsSafetyEnablingBJS (DOJ)Prisoners + Jails statistical tables (PDF; microdata via NACJD)AnnualLower = betterPrisons + jails combined; excludes probation/parole

Types:

3.2 Indicators considered and rejected

IndicatorReason rejected
High school Adjusted Cohort Graduation Rate (ACGR)Series only ESSA-mandated since SY2010–11; ~14 years is at the edge of the continuity threshold, and NAEP + bachelor's attainment already cover the education domain adequately
Official Poverty MeasureSuperseded by the Supplemental Poverty Measure, which incorporates taxes, transfers, and geographic cost of living
Infant mortality rateHighly correlated with life expectancy at birth; keeping one health-outcome indicator plus one behavioral-mortality indicator (overdose deaths) is enough
Opportunity Insights absolute mobility (Chetty et al. 2016)Not a maintained annual series — flagship data have not been refreshed with new birth cohorts since original 2016 release. Structurally different from the other 16 candidates. Documented in NOTES.md for potential future use as a static benchmark, not a live indicator
EIG Distressed Communities IndexComposite of variables already in the ADRI (poverty, employment, income); paid license for the full dataset; would double-count
RSF Press Freedom IndexPDF/HTML only, no bulk machine-readable file; 2013 methodology break; harder to make reproducible
Transparency International CPISame reproducibility caveat plus a 2012 methodology break that severs pre/post-2012 comparability
FBI UCR / NIBRS violent crime rate2021 NIBRS transition caused a severe coverage discontinuity; keeping incarceration alone as the safety-domain indicator is more stable. NIBRS-only violent crime is an obvious re-add candidate once coverage stabilizes (see §7.4)

3.3 Why Gini stands in for mobility

The intent is to measure mobility as one of the two pillars of the American Dream. The best available *direct* mobility measurements (Chetty et al., Raj Chetty and Nathaniel Hendren's Opportunity Atlas, *Fading American Dream*) are not maintained on an annual cadence, so they cannot serve as a live indicator without breaking the "regularly updated" rule.

Gini is used as an indirect mobility proxy on the basis of the "Great Gatsby Curve" literature (Krueger 2012; Corak 2013), which finds a robust cross-country negative correlation between income inequality and intergenerational income mobility. This is a proxy, not a mobility measure. Its limitations are stated openly in §7 and on the site.

If Opportunity Insights ever publishes a maintained annual series, or the Census releases a comparable federal mobility series, this indicator is the leading candidate for replacement.

4. Feasibility assessment

For each core indicator, the retrieval plan and maintenance burden are:

#IndicatorRetrieval planMaintenance burdenRisk
1NAEP gr.8 math + readingJSON API pull, keyed by subject × grade × year × jurisdiction=NationalBiennial script run after each main-assessment releaseLow. Watch for the ongoing digital-administration transition (2025+ field test) for scale comparability
2ACS bachelor's attainmentREST API call, one variable per yearAnnual; run after ACS 1-Year release (~September)Low
3Life expectancySocrata CSV pull; filter to national, all-race, both-sexAnnual; run after final NVSS mortality data (12–18 month lag)Low
4Overdose mortalityCDC WONDER XML POST (national aggregate)Annual (final); optional VSRR quarterly refresh via SocrataMedium — WONDER API is documented but XML-based and cranky. Fallback: NCHS Data Briefs (annual PDF, manual extract)
5Real median household incomeFRED API, one series, one callAnnual after Income & Poverty report (~September)Low. Deflator-seam noted (§7.4)
6SPM rateDirect XLSX download from Census SPM datasets page; parse fixed sheetAnnual; run after P60 Income & Poverty reportMedium — file structure is stable but not schema-guaranteed. Manual regression test on each update
7Prime-age employment-population ratioFRED API, one seriesMonthly; index uses the calendar-year average of monthly valuesLow
8GiniCensus API B19083_001EAnnual; run after ACS 1-Year releaseLow
9VEP turnoutExcel/CSV from UF Election Lab site; parse fixed sheetBiennial (Nov even years); update after certification (~Dec/Jan)Medium — spreadsheet layout can shift year to year. Manual regression test on each update
10Incarceration rateTwo PDF-primary series: BJS Prisoners (yearend) + BJS Jails (midyear preliminary or full). Text extract or ICPSR/NACJD microdata download.Annual, but manual — PDFs are the primary release. Preferred fallback: NACJD dataset when availableHigh — PDF extraction is fragile and BJS publication schedule is irregular. Also has substantial release lag

Handling the two high-risk paths (indicators 6 and 10):

5. Normalization, weighting, and composite

5.1 Normalization

Every raw indicator is transformed to a 0–100 score where higher always means "better for the Dream." The transformation is a fixed-anchor min–max rescaling, not a rolling percentile.

For an indicator with value \( x \), direction \( d \in \{+1, -1\} \), lower anchor \( L \), and upper anchor \( U \):

Then \( s \) is clipped to [0, 100]. Values outside the anchors are capped, not extrapolated.

Anchors are fixed once at index launch using a defensible external reference for each indicator (documented per-indicator in NOTES.md and in each data/processed/<indicator>.json header). Fixed anchors are chosen so that:

Fixed anchors preserve inter-year comparability: a 5-point ADRI change means the same thing in 2028 as in 2015. This is the main reason we do not use rolling percentile or z-score normalization.

Anchor revisions are versioned. A change to any anchor is a major-version bump (§6.2), and prior series are re-computed against the new anchors and republished side-by-side.

5.2 Outliers and missing values

5.3 Aligning frequencies to an annual reference year

The composite is computed once per calendar year, with the *reference year* being the most recent year for which every indicator has at least a provisional-or-better vintage.

Because most inputs lag by 6–18 months, the ADRI for calendar year *t* is expected to be publishable in **Q4 of year *t*+1** at the earliest, and possibly year *t*+2 if BJS or NVSS is late.

The strict form of this rule — every indicator present with at least a provisional-or-better vintage — is the ideal. In practice, the historical series and any reference year may have gaps. §5.3.1 defines the minimum coverage a reference year must meet to be published.

5.3.1 Publication threshold

A reference year is published in the ADRI time series only if it meets both of the following coverage tests:

  1. Indicator coverage. At least 6 of the 10 indicators must have a value for the reference year, either from a direct vintage or from a carry-forward permitted by §5.2.
  2. Domain coverage. Every one of the six domains must have at least one indicator with a value after carry-forward. If any domain has zero available indicators, the reference year is suppressed even if the indicator-count test passes.

When a reference year fails either test, the pipeline still computes its component scores internally, but the row is omitted from the published time series and logged with the reason. The row may be re-included in a later release once additional vintages become available (see §6.3 on source revisions).

The indicator-coverage threshold is exposed in code as the constant MIN_INDICATOR_COVERAGE = 0.6 in scripts/compute_index.py so it can be tuned in a MAJOR version bump (§6.2) without further methodology changes. The domain-coverage test is not tunable.

Rationale. The 6/10 floor is a compromise between two failure modes. Requiring all 10 indicators (the strictest reading of §5.3) would suppress most pre-2010 reference years given the current indicator set and would give away legitimate signal in years where only a slow source (BJS, NAEP) is late. Publishing years with 1–2 indicators would produce a composite that is really a report on whichever indicators happened to arrive, with a confidence score too low to be useful. 6/10 with all six domains present is the point at which the composite still exercises every domain weight and every carry-forward is bounded.

Each published record also carries a confidence field (0–1) equal to the fraction of the 10 indicators that were directly measured for that reference year (i.e., not carried forward). Readers should treat records with confidence below ~0.7 with proportional skepticism.

5.4 Composite formula

Indicators are grouped into six domains. Each domain first produces a 0–100 domain sub-score as the equally-weighted mean of its component indicator scores. Domain sub-scores are then combined into the ADRI using fixed domain weights.

Domains, components, and weights (initial v0.1 assignment):

DomainIndicatorsDomain weight
Education1 (NAEP), 2 (Bachelor's attainment)0.20
Health3 (Life expectancy), 4 (Overdose mortality)0.20
Prosperity5 (Real median income), 6 (SPM), 7 (Prime-age EPOP)0.20
Opportunity8 (Gini, as mobility proxy)0.15
Civic9 (VEP turnout)0.10
Safety10 (Incarceration rate)0.15
Total1.00

Weights are assigned by design intent, not by statistical optimization. The rationale:

Let \( s_{d,i} \) be the 0–100 score of indicator \( i \) in domain \( d \), and \( n_d \) be the number of indicators in domain \( d \) with non-missing values. The domain score is:

\[ D_d = \frac{1}{n_d} \sum_{i=1}^{n_d} s_{d,i} \]

If \( n_d = 0 \) (every indicator in the domain is missing beyond the one-year carry-forward), the domain's weight is redistributed proportionally across the other domains, and the ADRI record annotates the redistribution.

The composite is:

\[ \text{ADRI} = \sum_{d} w_d \cdot D_d \]

with \( \sum_d w_d = 1 \) after any redistribution.

Pseudocode for one reference year:


def compute_adri(reference_year, indicator_series, anchors, domain_map, weights):
    domain_scores = {}
    for domain, indicators in domain_map.items():
        component_scores = []
        for ind in indicators:
            x = indicator_series[ind].value_for(reference_year, carry_forward_years=1)
            if x is None:
                continue
            L, U = anchors[ind].lower, anchors[ind].upper
            d = anchors[ind].direction  # +1 or -1
            raw = ((x - L) / (U - L)) if d == +1 else ((U - x) / (U - L))
            component_scores.append(clip(100 * raw, 0, 100))
        if component_scores:
            domain_scores[domain] = mean(component_scores)
    # Redistribute weights across the domains that have at least one component
    active = {d: weights[d] for d in domain_scores}
    z = sum(active.values())
    active = {d: w / z for d, w in active.items()}
    return sum(active[d] * domain_scores[d] for d in domain_scores)

6. Update cadence, versioning, and revisions

6.1 Cadence

6.2 Versioning

Every ADRI record and methodology change follows semantic versioning:

Every published index file (data/index/adri_timeseries.json) carries a methodology_version field pinning it to the git tag of METHODOLOGY.md in effect when it was computed. Old versions of both the methodology and the time series are retained; they are not overwritten.

6.3 Handling source revisions

When a primary source revises a prior-year value (e.g., Census re-releases an ACS estimate, BJS restates prisoner counts):

  1. Store the raw revised file under data/raw/<indicator>/<vintage>_r<revision-number>.<ext>.
  2. Rerun the composite for every affected reference year.
  3. Publish the recomputed rows under a new PATCH version, alongside — not on top of — the prior rows.
  4. Annotate each affected row with the source revision date and a short note.

7. Limitations and caveats

7.1 What the ADRI cannot tell you

7.2 What the ADRI is likely to mis-weight

7.3 Data lag

The ADRI trails reality by 12–24 months. It is a structural measure. If you want a real-time picture, this is the wrong instrument.

7.3.1 Known indicator-level freshness limitations (as of v1.0.0)

Two indicators currently have known freshness limitations that the maintainer is aware of and evaluating for a future release:

7.4 Documented discontinuities per indicator

IndicatorDiscontinuityHandling
NAEP (1)Ongoing digital-administration transition (field test 2025) may affect scale comparabilityMonitor; annotate if NCES declares a break
Real median household income (5)Deflator switch from R-CPI-U-RS to C-CPI-U within the FRED seriesMinor; documented; no adjustment
SPM (6)Methodology updates in 2019+ data; CPS income question redesign from 2013+Annotate on the site; recompute prior years if Census republishes historical SPM under a new definition
Prime-age EPOP (7)None material
Incarceration (10)Release lag; occasional definitional changes for jail populationAnnotate; use most recent BJS definition
RSF Press Freedom (dropped)2013 methodology revisionN/A
Transparency International CPI (dropped)2012 methodology overhaul; pre/post-2012 scores not comparableN/A
FBI UCR/NIBRS (dropped)2021 NIBRS transition caused a severe coverage dropN/A; re-add candidate for v0.2 once coverage is stable

7.5 Weighting is a choice

Weights in §5.4 are a design decision, not a fact. They embody a claim that education, health, and prosperity are equal-weight primary pillars, with mobility and safety half a step behind and civic quality further down. Reasonable people will disagree. The methodology commits to publishing:

8. Reproducibility contract

Any ADRI value published on the site must be reproducible from:

  1. This document, at the git tag pinned in the record's methodology_version field.
  2. The raw source files under data/raw/, at the vintage pinned in each processed file's header.
  3. The scripts under scripts/ (to be written in Thread 2), at the same git tag.

If any of these three is missing, the ADRI value cannot be published.


Appendix A — Indicator quick reference

Full source URLs, access notes, and vintage tracking are maintained in ../data/raw/<indicator>/README.md (created per-indicator when Thread 2 begins retrieval work). This section is a locator, not a substitute for the source-verification reference in NOTES.md.

Appendix B — Change log

This release also marks the first fully-authoritative refresh of the underlying data: all four API-backed indicators (real median household income, prime-age EPOP, bachelor's degree attainment, Gini) now pull directly from FRED and Census APIs rather than the seed CSVs bundled during initial development. As a result, the aggregate ADRI for reference year 2024 moved from 44.16 (v0.1.2 seed values) to 43.86 (v1.0.0 authoritative values). The seed values were bundled to make the pipeline runnable without API credentials during initial development; they are no longer part of the reported series.