Status
active
Date
September 22, 2026
Methodology version
4

0005: Population series and CPI series selection

This record documents two related decisions in one file because both feed the same family of normalized metrics — spending per resident, revenue per resident, real (inflation-adjusted) spending, and real spending per resident (METRIC-04 through METRIC-10, .planning/REQUIREMENTS.md).

Context

Per-resident and real (inflation-adjusted) figures are half of TaxpayerScope’s core value proposition: “understand how spending changed over ten years — adjusted for inflation and population” (.planning/PROJECT.md). Both a population series and an inflation index have to be selected and documented before Phase 3 can compute a single per-capita or real metric (SRC-09). PITFALLS.md Pitfall 7 (population series / 2020 Census discontinuity) and Pitfall 8 (CPI choice presented as neutral) both name this as a real methodology decision, not a configuration default. RESEARCH.md’s own assumption A5 flagged that the exact Census file path for the FY2015-2019 portion of the window was unresolved as of the prior research session; this record resolves it directly.

Promotion of the sourced observation (this plan’s own assumption-delta decision, 01-04-PLAN.md): population and CPI stop being global constants the pipeline assumes and become selected series — an agency, a series identifier, a release vintage, and (for CPI) a base year. population.parquet carries a source_id per row recording which vintage produced that year’s figure, never a global default; the CPI series identifier, release vintage, and base year are pinned in pipeline configuration and stamped on every published real figure. This is the primary noun this record fixes: the population observation, identified by (government_id, fiscal_year, source_id), not “the population series” as a single global setting.

Decision

Population

Census Bureau Population Estimates Program (PEP), the latest available vintage applied to each portion of the FY2015-FY2024 window that vintage actually covers.

Census publishes county population estimates in vintages, each covering the span from the most recent decennial census forward. No single vintage spans both sides of the 2020 Census — Vintage 2024 (the latest available vintage as of this record’s date) begins at 2020, and the final vintage of the 2010s decade (Vintage 2020) ends at 2020. TaxpayerScope’s population series therefore draws from exactly two vintages, one per decade the FY2015-FY2024 window spans, never more than one vintage for any given year:

The vintage must be carried per year through a source_id in population.parquet, not once per agency — a population observation for (Orange County, FY2019) carries a different source_id than one for (Orange County, FY2020), because they come from two different, named, dated Census releases. A later vintage revision (e.g., Census publishing Vintage 2025) is then a visible, diffable event — new source_id values appear in the manifest and in population.parquet — never a silent re-basing of every published per-resident figure.

Disclosed limitation at the FY2019-FY2020 boundary. Because no single vintage spans both sides of the 2020 Census, FY2019’s population figure comes from a pre-2020-Census base (Vintage 2020) and FY2020’s comes from the actual 2020 Census count (Vintage 2024’s ESTIMATESBASE2020). Census Bureau does not publish a retroactive “intercensal” reconciliation of the 2010s decade against the 2020 Census the way it did for some earlier decades — Vintage 2020 remains the official historical record for 2010-2019 population, unrevised. This means a small, genuine population-level step can appear at the FY2019-FY2020 boundary in TaxpayerScope’s per-capita series, distinct from — and much smaller than — the failure mode Pitfall 7 warns against (mixing arbitrary vintages within one side of the boundary). Each year still uses the single best, officially published Census estimate available for that year; nothing is interpolated or blended. Phase 3 should quantify the magnitude of this specific boundary step (comparing Vintage 2020’s POPESTIMATE2020 against Vintage 2024’s ESTIMATESBASE2020 for each of the 67 governments) and carry that finding into the Phase 7 methodology page as a documented limitation, not silently absorb it into the ten-year trend line.

Inflation

CPI-U is the published headline inflation index. Series identifier: CUUR0000SA0 (“All items in U.S. city average, all urban consumers, not seasonally adjusted” — confirmed via https://data.bls.gov/timeseries/CUUR0000SA0 (fetched live, HTTP 200, 2026-09-22)). Base year: 1982-84=100 (confirmed on the same page: “Base Period: 1982-84=100”). Release vintage: the series as published through August 2026 (value 334.980, not seasonally adjusted), retrieved 2026-09-22 via https://api.bls.gov/publicAPI/v2/timeseries/data/CUUR0000SA0?latest=true (HTTP 200) and cross-confirmed against https://data.bls.gov/timeseries/CUUR0000SA0 . All three — series identifier, release vintage, and base year — are stored in pipeline configuration and stamped on every published real figure, so a reader can independently reproduce any inflation adjustment TaxpayerScope publishes (METH-05).

Rationale

Population: Census PEP over BEBR

Rejected alternative: the University of Florida Bureau of Economic and Business Research (BEBR) population estimates. BEBR is a credible, widely used Florida series — Florida state agencies including EDR itself frequently use it in preference to Census vintage estimates. It was not chosen because it is Florida-only: PRD sections 12 and 61 make expansion beyond Florida to additional states a foreseeable, planned event (Phase 7 of the PRD’s own roadmap), and a Florida-only population series would have to be replaced entirely at the first state expansion — every per-capita figure for every Florida county would need to be recomputed under a generalizable series at that point anyway. Census PEP, chosen now, generalizes to every future state without a series change.

Real discrepancy to disclose: EDR’s own compiled per-county Excel files carry a different, DFS/EDR-sourced “Countywide Population” figure baked directly into their own Per Capita column (verified in .planning/phases/01-source-data-verification/01-RESEARCH.md’s SRC-09 finding). Because TaxpayerScope computes per-resident figures from the Census PEP series described above, TaxpayerScope’s per-resident figures will not equal EDR’s own Per Capita column for the same government and year. The Phase 7 methodology page must state this discrepancy explicitly rather than let a reader discover a mismatch between TaxpayerScope’s number and EDR’s own published number and conclude one of the two is simply wrong.

Inflation: CPI-U over the BEA state & local government deflator

CPI-U is the index general readers already recognize from headlines, and it is the stronger choice specifically for expressing per-resident dollar amounts in terms a taxpayer intuitively understands — PRD section 64’s success questions ask “how much did spending increase after inflation,” a question a taxpayer reads against their own cost of living, which CPI-U tracks.

Disclosed alternative: the BEA State & Local Government implicit price deflator, FRED series A829RD3Q086SBEA (“Government consumption expenditures and gross investment: State and local (implicit price deflator)”, index base 2017=100 — confirmed via https://fred.stlouisfed.org/series/A829RD3Q086SBEA (fetched live, HTTP 200, 2026-09-22)). Multiple public-finance sources argue this deflator is the more methodologically appropriate index for adjusting government expenditures specifically, because it tracks the actual cost of the mix of goods and services governments buy (heavily weighted toward labor, healthcare benefits, and construction) rather than a household consumption basket.

Magnitude of the difference (computed, not asserted): using each series’ own published values fetched live on 2026-09-22 — https://fred.stlouisfed.org/graph/fredgraph.csv?id=CPIAUCNS (CPI-U, the same series as CUUR0000SA0, mirrored on FRED) and https://fred.stlouisfed.org/graph/fredgraph.csv?id=A829RD3Q086SBEA (the deflator) — cumulative growth in the annual average from calendar year 2015 to calendar year 2024 was 32.35% for CPI-U (237.017 -> 313.689, 1982-84=100) versus 33.48% for the state & local government deflator (97.566 -> 130.226, 2017=100), a difference of 1.13 percentage points over the covered window. The choice of CPI-U over the deflator therefore understates cumulative government-cost inflation by roughly one percentage point over ten years for the Florida county series — a real but modest effect, disclosed here and to be restated on the Phase 7 methodology page rather than left implicit in a single “inflation adjusted” toggle label.

A user-facing index toggle in the historical spending chart (letting a reader switch between CPI-U and the deflator) is deferred past this milestone — deferring the toggle is exactly why this disclosure has to live in the methodology text: a reader cannot self-serve the alternative view yet, so the record has to state the choice and its cost explicitly rather than let the toggle stand in for the disclosure.

Source Evidence

All URLs below were fetched live on 2026-09-22 and returned HTTP 200 at the time of retrieval:

Invariant for Phase 3

Every published per-resident or real figure resolves to a population observation and a CPI observation, each carrying its own source_id — this is the assertion named in this plan’s assumption-delta decision (01-04-PLAN.md), and it is the invariant Phase 3 must encode as a test when it builds population.parquet and the metrics stage. That assertion goes red the instant a later phase reintroduces a global population or CPI constant with no per-observation source_id. Phase 1 produces no population.parquet, so the test has nothing to run against yet; this record is where Phase 3 finds the requirement.

Methodology Version

This decision takes effect in methodology_version: 1. It has no prior version to supersede — this is the first record of the population and CPI series selection.

Revision (2026-09-24)

This revision supersedes methodology_version: 1 with methodology_version: 2 (03-CONTEXT.md D-06 through D-09, D-14). It records five metric conventions this record left open, plus the FY2019→FY2020 vintage step it called for and the archived CPI release pin. No sentence above is edited or removed.

D-06 — the dollar-year base for real figures. Real (inflation-adjusted) figures are expressed in the latest covered fiscal year’s dollars — currently FY2024 dollars. dollar_year is stamped on every real figure and in summary.json, so a reader always knows which year’s purchasing power a “real” figure is denominated in. When a later fiscal year (FY2025 and beyond) is ingested, moving the base forward is itself a revision-log event (PRD §45) — never a silent recomputation that changes a previously-published real figure’s meaning without a dated record of the change. Rejected: fixing FY2024 as a permanent base regardless of later years; using CPI’s own native 1982-84=100 base directly (unintuitive to a taxpayer reader).

D-07 — CPI annualization, fiscal-year-aligned. The fiscal-year CPI figure used for every real computation is the mean of the twelve monthly not-seasonally-adjusted CUUR0000SA0 values, October through September — the same twelve months as a Florida county’s fiscal year (per CLAUDE.md’s stack notes: Florida counties run an October-start fiscal year), not the calendar-year annual average this record’s own Rationale section computed for illustration. The pipeline stores the exact twelve-month sum for each fiscal year; a real figure is computed from the ratio of two sums (target fiscal year’s sum over dollar_year’s sum), so the division by 12 on each side cancels exactly rather than being applied, rounded, and re-applied. Rejected: the calendar-year annual average this record’s Rationale section already computed (simpler, but three months misaligned with the fiscal year every figure in this project is keyed to).

D-08 — FY N pairs with POPESTIMATE{N} from the latest archived vintage containing that column; FY2020 from Vintage 2024. This resolves the ambiguity this record’s own Decision section left open by citing both POPESTIMATE2020 (Vintage 2020) and ESTIMATESBASE2020 (Vintage 2024): FY2020 is paired with Vintage 2024’s POPESTIMATE2020 — the July 1, 2020 postcensal estimate, consistent with every other fiscal year in the series being paired with a July 1 estimate — not ESTIMATESBASE2020, which is the April 1, 2020 decennial census count itself and would misalign FY2020 with every other fiscal year’s mid-year-estimate convention. Rejected: pairing FY2020 with ESTIMATESBASE2020, the April 1 census base.

Measured vintage step, FY2019→FY2020 boundary (Task 1, this plan): re-running normalize.population vintage-step --year 2020 over both archived PEP files (census-pep-v2020-co-est2020-alldata, census-pep-v2024-co-est2024-alldata) for every FIPS in the Florida registry —

This is the disclosed, genuine population-level step this record’s own “Disclosed limitation at the FY2019-FY2020 boundary” section anticipated — a small but real discontinuity at the vintage boundary, distinct from and far smaller than the arbitrary-vintage-mixing failure mode Pitfall 7 warns against. Every county still uses the single best, officially published Census estimate available for its fiscal year; nothing here is interpolated. This finding belongs on the Phase 7 methodology page (METH-05) as a stated limitation, not silently absorbed into the ten-year per-capita trend line.

D-09 — growth is endpoint to endpoint, always labelled with the span. “Ten-year” growth means FY2015→FY2024 — nine intervals, not ten — and every published label states both endpoints rather than only the word “ten-year.” Five-year growth is FY2019→FY2024; one-year growth is FY2023→FY2024. The growth-span constants a later plan implements are fixed here as methodology: ONE_YEAR_OFFSET = 1, FIVE_YEAR_OFFSET = 5, TEN_YEAR_OFFSET = 9 (offsets in covered fiscal years back from the latest year, not calendar years). No maximum fiscal year is hard-coded; the latest covered year is derived from the data on every pipeline run (PRD §11), so a later FY2025 ingestion extends every span automatically without a code change. Rejected: ingesting FY2014 as a base-only year to make “ten-year” a literal ten-interval span.

D-14 — rounding, applied once, at publish. Every derived value in this project’s real/per- resident metric family is rounded exactly once, at the publish stage, using ROUND_HALF_UP — never accumulated through multiple intermediate roundings. The precisions: per-resident figures to the cent; real (inflation-adjusted) dollar figures to the whole dollar; ratios (growth percentages, per-capita ratios) to 6 decimal places; the CPI fiscal-year mean itself to 3 decimal places. Nominal amounts are never rounded — they are stored as the exact integer dollar figure reported in the source (ADR-0001’s Revision, this same date, states the fail-closed rule this implies for Total Expenditures; the identical rule applies to Total Revenue under ADR-0008). Rejected: floats throughout with no single rounding point, which drift across pipeline re-runs and break byte-for-byte JSON reproduction (SC5).

The CPI release pin, archived. The CUUR0000SA0 series this record selects is archived in two BLS API response windows, both committed in data/sources/fl-edr-sources.json and both readable under raw/bls/cpi/cuur0000sa0/ per ADR-0007’s national archive key layout:

source_id Window sha256
bls-cpi-cuur0000sa0-2014-2023 2014–2023 384f2b3428d44a9e2f5304c0acfccb21c61f108db2008bd52a9d3da2cc9dc5fc
bls-cpi-cuur0000sa0-2024-2024 2024–2024 ca44405466c9cc4f64e09d81c25f070ac732e91a5b43c61a4cb5a048d19054bd

The two Census PEP files this record selects are likewise archived and committed:

source_id Vintage sha256
census-pep-v2020-co-est2020-alldata Vintage 2020 983708e1b68c8e7c4ecbef4d45137bea34ee286abe07662ccc0d6dfc6411fe83
census-pep-v2024-co-est2024-alldata Vintage 2024 abcc8720d669e793bbfdcd440eeec37a78db3b452adbe4ccd1eadf7c72b522b9

This revision recorded by Task 3, 03-06-PLAN.md.

Revision (2026-09-24)

This revision supersedes methodology_version: 2 with methodology_version: 3 (ADR-0009, 04-01-PLAN.md). The decision recorded above is carried forward unchanged into methodology_version 3; the changes this version-3 coordinated bump makes are recorded in 0009-category-and-revenue-classification.md. This revision recorded by Task 3, 04-01-PLAN.md.

Revision (2026-09-25)

This revision supersedes methodology_version: 3 with methodology_version: 4 (ADR-0010, 05-01-PLAN.md). The decision recorded above is carried forward unchanged into methodology_version 4; the changes this version-4 coordinated bump makes are recorded in 0010-statewide-publication-rules.md. This revision recorded by Task 3, 05-01-PLAN.md.