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:
- FY2020-FY2024: Vintage 2024 (post-2020-Census base), file
co-est2024-alldata.csv, columnsPOPESTIMATE2020throughPOPESTIMATE2024, FIPS carried inSTATE(2-digit) andCOUNTY(3-digit) columns. URL: https://www2.census.gov/programs-surveys/popest/datasets/2020-2024/counties/totals/co-est2024-alldata.csv — fetched live and returned HTTP 200 on 2026-09-22. - FY2015-FY2019: Vintage 2020 (pre-2020-Census base — the final annual postcensal estimate
series Census produced for the 2010s decade, before the 2020 Census count was available), file
co-est2020-alldata.csv, columnsPOPESTIMATE2015throughPOPESTIMATE2019, sameSTATE/COUNTYFIPS columns. URL: https://www2.census.gov/programs-surveys/popest/datasets/2010-2020/counties/totals/co-est2020-alldata.csv — fetched live and returned HTTP 200 on 2026-09-22. This resolves RESEARCH.md assumption A5: the working file path exists and was fetched successfully at the exact path RESEARCH.md’s earlier guess (which 404’d) was aiming for; the correct filename isco-est2020-alldata.csv, confirmed via the directory index at https://www2.census.gov/programs-surveys/popest/datasets/2010-2020/counties/totals/ (trailing slash, no filename).
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:
- https://www2.census.gov/programs-surveys/popest/datasets/2020-2024/counties/totals/co-est2024-alldata.csv
— Vintage 2024 county population file; header confirms
STATE,COUNTY,ESTIMATESBASE2020,POPESTIMATE2020-POPESTIMATE2024columns. - https://www2.census.gov/programs-surveys/popest/datasets/2010-2020/counties/totals/co-est2020-alldata.csv
— Vintage 2020 county population file (resolves RESEARCH.md assumption A5); header confirms
STATE,COUNTY,CENSUS2010POP,ESTIMATESBASE2010,POPESTIMATE2010-POPESTIMATE2020columns. - https://www2.census.gov/programs-surveys/popest/datasets/2010-2020/counties/totals/ (trailing
slash, no filename) — the directory index confirming
co-est2020-alldata.csvas the correct filename. - https://data.bls.gov/timeseries/CUUR0000SA0 — confirms Series Id
CUUR0000SA0, “All items in U.S. city average, all urban consumers, not seasonally adjusted,” Base Period1982-84=100. - https://api.bls.gov/publicAPI/v2/timeseries/data/CUUR0000SA0?latest=true — confirms the latest published value (August 2026, 334.980) as of the retrieval date, establishing the release vintage this record pins.
- https://fred.stlouisfed.org/series/A829RD3Q086SBEA — confirms series title “Government consumption expenditures and gross investment: State and local (implicit price deflator)” and index base “2017=100”.
- https://fred.stlouisfed.org/graph/fredgraph.csv?id=CPIAUCNS and https://fred.stlouisfed.org/graph/fredgraph.csv?id=A829RD3Q086SBEA — the raw series used to compute the 32.35% / 33.48% / 1.13-percentage-point figures above (calendar-year annual averages, 2015 vs. 2024).
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 —
- Orange County (FIPS 12095): Vintage 2020’s
POPESTIMATE2020is 1,404,396; Vintage 2024’sPOPESTIMATE2020is 1,431,720 — a difference of +27,324 (+1.95%). - All 67 Florida counties, percent difference between the two vintages’
POPESTIMATE2020values: minimum -14.92% (Glades), median -1.27% (Indian River), maximum +12.11% (Monroe).
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.