The Fixed Basket
The Fixed Basket · Basket v1.0.14

The Basket

One unchanging cart of everyday household items. The weights are frozen at the 2000 vintage — we never re-weight and never swap in cheaper substitutes. Here is exactly what's in it.

What's in the basket

17 strata, biggest share first. The bar shows each item's share of the basket; the weights are fixed at 2000 and sum to 100%.

  1. Healthcare — total premium 14.9%

    Health-insurance premium

  2. Transportation — vehicles 12.8%

    Buying a vehicle

  3. Food at home 11.3%

    Groceries — 22 staple items

  4. Transportation — services 10.1%

    Driving costs, airfare & transit

  5. Shelter — rent 7.6%

    Rent for a home

  6. Entertainment and reading 7.5%

    Movies, streaming & cable

  7. Apparel 6.9%

    Clothing & shoes

  8. Home energy 4.9%

    Home electricity & natural gas

  9. Gasoline 4.8%

    Gasoline at the pump

  10. Shelter — property tax 4.3%

    Property taxes on a home

  11. Communications 3.3%

    Phone & internet service

  12. Shelter — maintenance & repair 3.1%

    Home maintenance & repair

  13. Healthcare — medical services 2.5%

    Doctor, hospital, dental & vision

  14. Education 2.4%

    College tuition & fees

  15. Other lodging 1.8%

    Hotels & short stays

  16. Healthcare — prescription drugs 1.6%

    Prescription drugs (generic)

  17. Postage (USPS) 0.1%

    Postage stamps

17 strata · weights sum to 100.00% (validated to 1.0 ± 0.0001 at module import) · weights vintage 2000, BLS CEX + NIPA 7.8 augmentation.


Where each number comes from

Every stratum's price comes from a published, citable source — never from BLS CPI. Open any item to see its precedence ladder (lower precedence wins where sources overlap). From app/engine/strata.py.

Food at home

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000709112

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000708111

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000703112

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000706111

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000702111

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000711211

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000712112

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000715211

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000717311

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000701312

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000711311

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000712311

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000710212

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000701111

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000702212

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000FC3101

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000704111

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000704211

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000710411

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000711412

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000712211

Precedence 0 — BLS Average Price Data (APU), monthly, national.
series_id: APU0000713111

Gasoline

Precedence 0 — EIA, weekly (rolled to monthly), national + state ladder.
series_id: eia_gasoline_regular_weekly

Home energy

Precedence 0 — EIA, monthly, national + state ladder.
series_id: eia_electricity_residential_monthly

Precedence 0 — EIA, monthly, national + state ladder.
series_id: eia_natgas_residential_monthly

Shelter — rent

Precedence 0 — zillow_zori, national.
series_id: zillow_zori_us_national_smoothed

Precedence 1 — census_hvs, national.
series_id: census_hvs_median_asking_rent_us

Shelter — property tax

Precedence 0 — census_property_tax, national.
series_id: fred_us_property_tax_per_capita_quarterly

Shelter — maintenance & repair

Precedence 0 — shelter_maintenance_ppi, national.
series_id: ppi_maint_repair_inputs_us

Other lodging

Precedence 0 — ahla_str_adr, national.
series_id: str_us_hotel_adr_annual

Apparel

Precedence 0 — levis_501, national.
series_id: levis_501_original_fit_msrp_us

Precedence 0 — converse_chuck, national.
series_id: converse_chuck_taylor_coreox_msrp_us

Precedence 0 — dr_martens_1460, national.
series_id: dr_martens_1460_msrp_us

Precedence 0 — dickies_874, national.
series_id: dickies_874_list_us

Transportation — vehicles

Precedence 0 — manheim_uvvi, national.
series_id: manheim_uvvi_seasonally_adjusted

Transportation — services

Precedence 0 — aaa_driving, national.
series_id: aaa_ydc_composite_cents_per_mile

Precedence 0 — bts_atpi, national.
series_id: bts_us_domestic_air_fare_quarterly

Healthcare — total premium

Precedence 0 — KFF Employer Health Benefits Survey, annual, national.
series_id: kff_ehbs_premium_family_total

Healthcare — prescription drugs

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_metformin_hcl_500mg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_atorvastatin_20mg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_lisinopril_10mg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_levothyroxine_50mcg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_amoxicillin_500mg_capsule

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_omeprazole_dr_20mg_capsule

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_simvastatin_20mg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_sertraline_50mg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_lansoprazole_dr_30mg_capsule

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_paroxetine_20mg_tablet

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_fluoxetine_20mg_capsule

Precedence 0 — NADAC (CMS National Average Drug Acquisition Cost), weekly (rolled to monthly), national.
series_id: nadac_clopidogrel_75mg_tablet

Healthcare — medical services

Precedence 0 — CMS Physician Fee Schedule, annual, national.
series_id: cms_pfs_99213_non_facility

Precedence 0 — CMS Physician Fee Schedule, annual, national.
series_id: cms_pfs_99214_non_facility

Precedence 0 — CMS Physician Fee Schedule, annual, national.
series_id: cms_pfs_99203_non_facility

Precedence 0 — CMS Physician Fee Schedule, annual, national.
series_id: cms_pfs_99283_facility

Precedence 0 — CMS Physician Fee Schedule, annual, national.
series_id: cms_pfs_93000_non_facility

Precedence 0 — cms_opps, national.
series_id: cms_opps_45378_colonoscopy

Precedence 0 — cms_opps, national.
series_id: cms_opps_66984_cataract

Precedence 0 — cms_opps, national.
series_id: cms_opps_43239_egd_biopsy

Precedence 0 — cms_opps, national.
series_id: cms_opps_70553_mri_brain

Precedence 0 — cms_opps, national.
series_id: cms_opps_93306_echo

Precedence 0 — cms_opps, national.
series_id: cms_opps_99284_ed_visit

Precedence 0 — cms_opps, national.
series_id: cms_opps_64483_epidural

Precedence 0 — meps, national.
series_id: meps_dental_visit

Precedence 0 — meps, national.
series_id: meps_vision_eyewear

Education

Precedence 0 — nces_digest, national.
series_id: nces_avg_tuition_fees_all_inst_us

Precedence 1 — NCES IPEDS, annual, national + state ladder.
series_id: ipeds_in_state_tuition_and_fees

Communications

Precedence 0 — FCC URS, national.
series_id: fcc_urs_voice_us_residential_annual

Precedence 0 — FCC URS, national.
series_id: fcc_urs_broadband_us_residential_annual

Precedence 0 — fcc_wireless_arpu, national.
series_id: fcc_us_wireless_arpu_annual

Entertainment and reading

Precedence 0 — nato_tickets, national.
series_id: nato_us_avg_ticket_price

Precedence 0 — the_numbers_tickets, national.
series_id: the_numbers_us_avg_ticket_price

Precedence 0 — household_subscription, national.
series_id: cable_fcc_expanded_basic_monthly

Precedence 0 — household_subscription, national.
series_id: netflix_us_standard_monthly

Postage (USPS)

Precedence 0 — usps_stamp, national.
series_id: usps_first_class_stamp_1oz


How the weights are built

Weights come from the BLS Consumer Expenditure Survey 2000 standard tables (Tables 1, 3, 5, 7), with employer-paid private group health insurance added to the healthcare premium from NIPA Table 7.8 line 17. They are fixed at the 2000 vintage — they do not re-weight when BLS releases updated CEX tabulations or when BEA rebenchmarks NIPA.

Any change to a SKU, source, weight, or stratum is logged in the change log below with a basket version bump; prior versions stay reproducible from observations tagged with their basket_version.


How weights differ by household

The same prices, but a different weight schedule per household. Here are the four largest strata across all 10 household profiles — read from weights.py.

Household Healthcare — total premium Transportation — vehicles Food at home Transportation — services
National Average 14.9% 12.8% 11.3% 10.1%
Homeowner 14.8% 13.6% 11.6% 10.9%
Renter 15.4% 10.8% 10.6% 8.2%
Working Parent 13.2% 13.4% 12.2% 9.8%
Retiree 9.0% 10.5% 13.5% 9.7%
Income — Lowest Quintile 22.6% 8.8% 11.1% 6.9%
Income — Second Quintile 18.4% 10.7% 12.9% 8.3%
Income — Middle Quintile 15.6% 12.8% 12.1% 9.8%
Income — Fourth Quintile 13.5% 14.2% 11.8% 10.7%
Income — Highest Quintile 10.0% 14.1% 10.6% 12.3%
Shares vary widely by household — e.g. the health-insurance premium runs from 6.5% (Retiree) to 18.5% (lowest income quintile).

Change log

Every change to the basket, newest first. Each entry: what changed and why, in one factual sentence.

2026-06-07 — Deeper food-at-home sampling: 13 → 22 BLS APU items

Version: data tag 1.0.12 → 1.0.13

What changed. The food_at_home stratum's single-SKU set grew from 13 to 22 BLS Average Price items. Added (each verified against the BLS API for continuous 2000-01→present coverage): flour, whole-wheat bread, beef steaks, bacon, pork chops, ice cream, lemons, iceberg lettuce, and frozen orange juice. The stratum's basket weight is unchanged — this is a within-stratum deepening, not a stratum add/remove, so the archetype weights still sum to 1.0 with no renormalization.

Why. The original 13 thinly sampled protein (only ground chuck, whole chicken, eggs) and carried no pork and no non-ground beef cut, so the Carli average under-represented meat — a high-inflation group. The new mix spreads across grains, beef, pork, dairy, produce, and juice without letting any group dominate (meat and produce each ≈27% of SKUs). Still 100% BLS APU observed average prices — no BLS CPI. APU carries no processed/prepared-food SKUs, so the set necessarily skews toward staples/produce/meat — a disclosed limit, not a fixable skew.

Effect on headline. food_at_home's long-run rate rises 2.47 → 2.72%/yr (correcting the thin protein sample); the National Average headline moves +0.018pp, 3.540 → 3.559%/yr, index 246.36 → 247.50. Surviving rows were re-stamped basket_version 1.0.12 → 1.0.13 (values unchanged); the 9 new SKU series were ingested at 1.0.13. Strata count stays 15.

2026-05-30 — Movie-ticket series continued: NATO → The Numbers

Version: data tag 1.0.10 → 1.0.11

What changed. The entertainment stratum's movie-ticket SKU gained a continuation source. NATO rebranded to Cinema United (Mar 2025) and stopped publishing the annual US average ticket price, so the NATO series ends at 2024. The Numbers (the-numbers.com) computes the same quantity by the same method — total box-office gross ÷ admissions — and its 2024 figure ($11.31) matches NATO's final figure to the cent. It is wired in as its own parallel series (2024 overlap anchor + 2025 = $11.96), and the chain-link engine splices NATO → The Numbers automatically across the 2024/2025 boundary.

Why. With NATO dead after 2024 and cable ending in 2011, entertainment was 100% Netflix for 2025 — so the whole stratum's 2025 reading was the Netflix January price hike (+16%), a single-SKU over-weighting artifact. Restoring a real theatrical-ticket price gives 2025+ a representative streaming + theatrical blend. No BLS CPI is involved; non-CPI share stays 100%.

Effect on headline. Entertainment's 2024→2025 move drops from +16.1% (Netflix-only) to +12.3% (blended). Long-run decay is essentially unchanged (3.55 → 3.54%/yr — one annual SKU over 25 years); the trailing-12 rate corrects from 3.29%/yr to 2.95%/yr. Surviving rows were re-stamped basket_version 1.0.10 → 1.0.11 (values unchanged); the new ticket rows were ingested at 1.0.11. Strata count stays 15.

2026-05-29 — Zero-CPI recomposition, chain-linked headline, CPI ingester removed

Version: v1.1.4 → v2.0.0

What changed. Retired BLS CPI from the index entirely and removed its last infrastructure. (1) Five CPI/proxy-dependent strata EXITED and weights renormalized over the surviving 15: household_goods, personal_care, alcohol (pure CPI primaries), food_away (single-chain Big Mac proxy, rejected as non-representative), and tobacco (CPI Tobacco was its only 2020+ path). (2) The last CPI bridge — CUUR0000SEMF01 (Rx CPI) — removed from healthcare_oop, now NADAC (5 generic drugs) + CMS PFS (2 CPT codes) only. (3) shelter_rent moved to Zillow ZORI (2015+) spliced to Census HVS median asking rent (≤2014), and the state healthcare_premium chain-link to BLS CPI SEME was dropped — these SUPERSEDE the v1.1.2 'chain-link to BLS CPI SEME for 2025+' and v1.1.3 'leaving BLS CPI Rent of Primary Residence as sole source' entries below, which describe the now-replaced v1.1.x state. (4) Headline switched to a drift-free fixed-base-within-spans construction, chain-linked only at composition boundaries, so late-starters splice in at entry with no level jump and the index spans the full window. (5) The dormant bls_cpi ingester, its CLI/freshness/reingest wiring, its fixture, and 7,174 inert CUUR rows were deleted from price_observations (local + prod).

Why. The load-bearing commitment is that the index contains NO BLS CPI anywhere — not a primary, not a bridge, not a fallback — because claiming to improve on CPI while still consuming CPI is incoherent. These changes realize it fully: non-CPI share = 100%.

Effect on headline. Published window 2000-01 → 2025-12 (312 months, up from a truncated 2010-2023); long-run decay 3.440%/yr; Dollar Half-Life 20.5 yr; CPI series in index 0; strata count 20 → 15. Price rows remain tagged basket_version=1.0.10 (a weighting + engine-construction change, not a re-ingest); exited strata's rows stay in the store at weight 0 so prior versions remain reconstructable.

2026-05-27 — /state/<code>/coverage endpoint rebuilt

Version: v1.1.3 → v1.1.4

What changed. Public API endpoint /api/v1/state/<code>/coverage rebuilt to surface per-stratum source, state_coverage_first_month, state_coverage_last_month, and weight_national_average; replaces v1.1 endpoint with a band-inference logic bug exposed by the v1.1.1 splice fix.

Why. METHODOLOGY.md §5.8 publication obligation requires per-stratum first-month state-coverage disclosure so consumers can identify which months mix state-specific signal with national fallback.

Effect on headline. None (disclosure surface only).

2026-05-27 — HUD FMR removed from engine path

Version: v1.1.2 → v1.1.3

What changed. Removed HUD Fair Market Rents ingester, series, fixture, tests, and schedule entries; deleted 46,833 HUD FMR rows from price_observations; shelter_rent precedence-1 fallback dropped, leaving BLS CPI Rent of Primary Residence as sole source.

Why. HUD FMR is administrative data (40th-percentile ceiling for Section 8 vouchers, derived from 5-year-smoothed ACS gross-rent data) measuring assistance-payment standards rather than market rent; never fired as a fallback under existing BLS coverage; retention implied a methodology promise the engine was not honoring.

Effect on headline. ~0.001 pp (rounding noise).

2026-05-27 — Full annual KFF state series + post-2024 trim

Version: v1.1.1 → v1.1.2

What changed. State-level healthcare_premium rebuilt from the complete 2013-2024 annual MEPS-IC publication (12 years × 51 geographies = 612 measurements), replacing the 3-anchor (2014/2019/2024) v1.1.0 simplification; post-2024 hold-forward removed; state series chain-link to BLS CPI SEME for 2025+.

Why. The 3-anchor approach forced stepped hold-forward interpolation between anchors and a post-2024 flat tail that depressed long-run decay rates by ~20-40 bp vs national; KFF publishes annually so ingesting all 12 years removes both artifacts.

Effect on headline. National unchanged. State-vs-region gaps moved from -240/-380 bp to -3/-125 bp.

2026-05-27 — Per-period geography splice + unified series_ids

Version: v1.1.0 → v1.1.1

What changed. EIA and BLS-CPI now write per-state and per-region rows under the same internal series_id as their national equivalent with the geography column differentiating; the §5.4 fallback ladder rewritten from per-ref to per-period with chain-link rescale at geography transitions.

Why. The prior per-ref geography routing silently dropped KFF national 1999-2013 rows for state queries (because the engine picked a single best geography for the whole window); the audit revealed pop-weighted state-vs-national headline gaps of -240/-380 bp driven by a -1860/-2120 bp gap in healthcare_premium that traced to this routing.

Effect on headline. National unchanged. State headlines moved 25-40 bp toward their region's value; per-stratum decomposition now surfaces real state divergence in 4 of 20 strata.

2026-05-27 — Cross-source calibration for state healthcare_premium

Version: v1.0.2 → v1.0.3

What changed. State-level healthcare_premium rows are now emitted with the calibration calibrated_state(s, y) = MEPS_IC_state(s, y) × (KFF_EHBS_US(y) / MEPS_IC_US(y)), with the calibration ratio, raw MEPS-IC value, and adjustment basis surfaced in each observation's raw_payload.

Why. MEPS-IC (the state-level source) and KFF EHBS Figure 1.12 (the national source) measure the same construct through different operational definitions and persistently disagree at the US level by 3-5% in levels; without calibration, state-vs-national comparisons mixed two surveys and state pop-weighted aggregates did not match the national headline.

Effect on headline. None at national level. State family premium values run ~1-4% higher than raw KFF State Health Facts; per-state ranking unchanged.

2026-05-25 — Weighting basis pivot — BEA PCE to BLS CEX + NIPA 7.8 augmentation

Version: v1.0.1 → v1.0.2

What changed. Weight source changed from BEA PCE 2000 to BLS CEX 2000 standard tables with NIPA Table 7.8 line 17 employer-paid private group health insurance augmentation ($329.199 billion in 2000, $3,010/CU for working-age archetypes, $0 for Retiree); basket extended to ten archetypes (five demographic + five income quintile); stratum count increased from 18 to 20 (alcohol, tobacco, other_lodging broken out).

Why. PCE is a national-accounts construct that includes OER, Medicare/Medicaid, imputed banking services, and nonprofit consumption — categories that do not represent cash leaving a household; CEX is what households self-report spending out of pocket; CEX 2000 tabulations are vintage-stable while PCE comprehensive revisions would force a vintage-policy stance.

2026-05-25 — Food-at-home BLS APU coverage audit

Version: v1.0.0 → v1.0.1

What changed. Chicken: APU0000FF1101 (boneless breast) replaced with APU0000706111 (whole fresh chicken). Apples (APU0000711111, Red Delicious) removed — BLS ceased publishing after 2017-10. Butter (APU0000FS1101) removed — six-year publishing gap May 2012 to March 2018 that would require interpolation.

Why. Boneless-breast series begins 2006-01; whole fresh chicken is continuously published 2000-01 to present. Apples and butter have no continuously-published alternative SKU.


What's left out

What is deliberately not in the basket, and why. The underlying rationale lives in METHODOLOGY.md §3.2.

Excluded Reason Disposition
Mortgage interest Debt service, not consumption. Published in companion AEI v1.1+.
Personal insurance and pensions Savings, not consumption. Excluded from basket denominator.
Taxes (federal + state income, payroll, property) Out of scope for a price-of-consumption index. Published in companion DIEI v1.1+.
Owners' Equivalent Rent (OER) Imputed price, not a market transaction. Replaced by market rent + composite owned-shelter operating cost per METHODOLOGY.md §3.2.6 and §4.2.
Medicare and Medicaid (government-paid) Not household cash burden. Excluded from healthcare premium numerator; only worker-paid + employer-paid private group health insurance counted.
Imputed banking services National-accounts construct, not household cash. Excluded with PCE pivot in v1.0.2.
Nonprofit consumption National-accounts construct, not household cash. Excluded with PCE pivot in v1.0.2.
OPPS facility component of ED visit Not yet ingested; CMS PFS 99283 captures professional component only. Documented gap; v1.1 candidate.
Property tax and maintenance/repair components of owned-shelter operating cost No clean 2000-current annual national series available without methodological interpolation. Documented partial composite; v1.x candidate.