0010: Statewide publication rules: empty cells, no-data years, the counties index and flag review
Context
PIPE-09 (statewide 67-county pipeline scale-out), STATE-02 (the six statewide figures
counties.json publishes), VALID-03 (year-over-year anomaly detection), VALID-05 (missing
fiscal years, zero population, duplicate rows, unknown codes, unexpected negatives) and VALID-07
(suspicious records flagged for review, never published silently) all depend on four rules that
are undecided going into statewide scale-out: 05-CONTEXT.md records these as D-02, D-03, D-06
through D-10. Two of the four (D-02, D-03) change published figures; one (D-10) fixes the field
names of a permanent /data/v1/ contract; one (D-06 through D-09) decides which data-quality
flags a reviewed file may let through the release gate. Per T-03-26 (03-SECURITY.md, applied
identically at ADR-0008 and ADR-0009), a rule that changes published numbers or fixes a permanent
field name is never agent-chosen — this record puts all four questions in front of the maintainer
at once, with numbers measured from the real archive, exactly as ADR-0008 and ADR-0009 did before
their own maintainer decisions.
All figures below are measured, read-only, by a scratch script outside the repository (mode_notes)
that caches the real archived EDR workbooks via collectors.cache.fill_cache and parses them with
the adapter’s own production parsing primitives — read_sheet_structure, forward_fill,
_format_account_code — and, for the Q1 proposed rule, an in-memory copy of that rule applied to
the raw grid. Task 1 changed nothing under pipeline/ or apps/; its own verification confirmed
active_methodology_version still returned 3 and both trees were clean at that point, before
Task 2’s maintainer reply and Task 3’s coordinated version-4 bump. Covered fiscal years for every
government come from data/audit/coverage-status.csv’s status == "present" rows (never a
literal), matching every prior decision record’s convention.
Decision
Every subsection below states the option the maintainer chose, after Task 1 measured every
option and Task 2’s checkpoint:decision (gate="blocking-human") recorded the maintainer’s
reply (Decision sign-off, below). The rejected alternatives for every question are recorded
under “Considered Options” in Rationale, not repeated here as if they were also in effect.
Q1 — The empty-string fund-column leaf cell (D-02)
An exhaustive scan of all 134 archived workbooks’ fund-column leaf cells and total-row cells,
across every covered fiscal year (1,097,659 cells scanned; see Source Evidence), found exactly
21 leaf cells whose raw value is the empty string, and zero total-row cells. Every one of
the 21 is on one of two sheets: Liberty County’s FY2023 revenues sheet, row 72 (account 351.5,
“Court-Ordered Judgments and Fines — As Decided by Traffic Court”), and Monroe County’s FY2024
revenues sheet, rows 87 (361.1, “Interest and Other Earnings — Interest”) and 92 (369.9,
“Other Miscellaneous Revenues — Other”). No other government, year, series, row or cell — leaf or
total-row — carries an empty string anywhere in the archive.
Chosen: leaf-only blank-as-zero (option a). An empty-string cell in a fund-column leaf row
is read as Decimal("0.00"). A non-leaf empty string (a sheet total-row cell) still raises
ValueError, unchanged. Applying this rule in memory to both affected sheets, every fund
column’s leaf sum equals that sheet’s own reported total-row value exactly — a $0.00
difference on all 12 fund columns of both sheets (well inside the existing $1.00 reconciliation
tolerance; see Source Evidence). Liberty FY2023’s resulting governmental Total Revenue (ADR-0008
scope, excluding account codes 381/382 — neither appears on this sheet’s governmental columns)
is $26,508,391.00; Monroe FY2024’s is $408,031,532.00. Option b (keep raising, which
would leave Liberty and Monroe permanently unpublishable, SC1 unmet) is recorded in Rationale’s
Considered Options.
Q2 — The whole-sheet-zero no-data year (D-03)
The same exhaustive scan computed, for every (government_id, series, fiscal_year) triple in the
archive (1,340 triples: 67 governments × 2 series × 10 covered fiscal years each), the
governmental-fund leaf SUM over every account code — the exact categorize.compute
no_data_by_key predicate — and, separately, the leaf SUM across every fund group
(governmental, proprietary, fiduciary, component_unit) on the same sheet. Exactly one triple is
zero on both measures: Jefferson County, fiscal year 2018, both the expenditures and revenues
series — governmental leaf sum $0.00 and whole-sheet leaf sum $0.00 for each. No other
government-year-series in the archive is zero on either measure. data/audit/coverage-status.csv
marks Jefferson FY2018 present for expenditures; that marking is not itself examined for
“present” meaning “has real leaf data” anywhere in the current pipeline, and is the root cause a
later plan’s check_yoy_change/check_missing_fiscal_year must correct for.
Today, metrics.compute._build_windows raises ValueError outright the moment any window’s
start year has total_expenditures == 0 (pipeline/metrics/compute.py:256-260) — so simply
adding Jefferson to publish_scope without a null-year rule does not silently publish a wrong
number, it crashes the pipeline. A null-year rule is required before Jefferson can be included at
all, not just before its figures read correctly.
Every published field this changes for Jefferson FY2018:
spending.jsonFY2018 years-row:total_expenditures,spending_per_resident,real_expenditures,real_spending_per_resident— currently non-nullableFigure/CentsFigurefields; each becomes nullable.revenue.jsonFY2018 years-row:total_revenue,revenue_per_resident— same non-nullable → nullable change.summary.jsonseparately_reportedFY2018 row:proprietary,fiduciary,component_unit— already-nullableFigure[int] | Nonefields (SeparatelyReportedYear); because the whole sheet is zero for FY2018, not just the governmental fund group, all three read zero activity that year and becomenullunder the model’s own existing “no activity reported” semantics, never a fabricated$0.- Metrics growth windows whose start or end year is FY2018: the
one_yearwindow ending FY2018 (start FY2017, real data — only the end value is affected) and theone_yearwindow ending FY2019 (start FY2018 — the window’s start value is affected); thefive_yearwindow ending FY2023 (start FY2018). Theten_yearwindow is not affected for any of Jefferson’s covered years: the only ten-year window Jefferson can publish is FY2015→FY2024 (its own first and last covered years), and FY2018 is neither endpoint — Jefferson’s ten-year figures are computed from two real, non-zero years exactly as every other county’s are.
Chosen: null with reason (option a1). The listed SpendingYear/RevenueYear fields become
T | None with a new sibling null_reason field carrying the literal "no_data_reported",
mirroring the existing RevenueGroupRow/PropertyTaxYear null-with-reason convention exactly.
data/audit/coverage-status.csv stays byte-identical (parse, population and inflation stages
all read covered years from it as-is); a new, dated data/audit/revisions.md entry records that
FY2018 was found to carry no real data despite the present marking, with the source evidence
above cited. Options a2 (omit-with-list, which changes the years array’s length semantics) and
b (publish $0, explicitly rejected by D-03) are recorded in Rationale’s Considered Options.
Q3 — The /data/v1/florida/counties.json contract (D-10)
The proposed shape, from <interfaces>, reusing every existing model this codebase already
publishes for summary.json so a consumer who knows that file already knows these field names:
- Top level
CountiesIndex:methodology_version(int),cpi_series(str),counties(list ofCountyRow, sorted bygovernment_id, one perpublish_scopegovernment, non-empty, no duplicate id). CountyRow:government_id,slug,name,consolidated(bool),first_fiscal_year,last_fiscal_year,dollar_year(equalslast_fiscal_year),latest_spending(existingLatestSpending),ten_year_spending_change(existingChangeFigure[int]),population_change(existingChangeFigure[int]),real_spending_change(existingChangeFigure[int]),real_spending_per_resident(existingRealPerResidentChange),spending_per_resident(newLatestPerResident:fiscal_year,value— a cents-precision dollar figure, matchingCentsFigure’s own existing rounding rule —source_ids),population(newLatestPopulation:fiscal_year,valueint,source_ids; needed by D-13’s population-band filter).
Orange County’s real row, built from its own currently-published summary.json and
spending.json (methodology_version 3; the fields below are unchanged by the version-4 bump —
only the stamp moves):
{
"government_id": "US-FL-COUNTY-ORANGE",
"slug": "orange-county",
"name": "Orange",
"consolidated": false,
"first_fiscal_year": 2015,
"last_fiscal_year": 2024,
"dollar_year": 2024,
"latest_spending": {
"fiscal_year": 2024,
"value": 2979127753,
"source_ids": ["fl-edr-orange-expenditures"]
},
"ten_year_spending_change": {
"start_fiscal_year": 2015, "end_fiscal_year": 2024,
"start_value": 1347470899, "end_value": 2979127753, "ratio": 1.210903,
"source_ids": ["fl-edr-orange-expenditures"]
},
"population_change": {
"start_fiscal_year": 2015, "end_fiscal_year": 2024,
"start_value": 1291844, "end_value": 1533646, "ratio": 0.187176,
"source_ids": ["census-pep-v2020-co-est2020-alldata", "census-pep-v2024-co-est2024-alldata"]
},
"real_spending_change": {
"start_fiscal_year": 2015, "end_fiscal_year": 2024,
"start_value": 1773435949, "end_value": 2979127753, "ratio": 0.679862,
"source_ids": ["bls-cpi-cuur0000sa0-2014-2023", "bls-cpi-cuur0000sa0-2024-2024", "fl-edr-orange-expenditures"]
},
"real_spending_per_resident": {
"fiscal_year": 2024, "value": 1942.51,
"start_fiscal_year": 2015, "start_value": 1372.79, "ratio": 0.415007,
"source_ids": ["bls-cpi-cuur0000sa0-2014-2023", "bls-cpi-cuur0000sa0-2024-2024", "census-pep-v2020-co-est2020-alldata", "census-pep-v2024-co-est2024-alldata", "fl-edr-orange-expenditures"]
},
"spending_per_resident": {
"fiscal_year": 2024, "value": 1942.51,
"source_ids": ["census-pep-v2024-co-est2024-alldata", "fl-edr-orange-expenditures"]
},
"population": {
"fiscal_year": 2024, "value": 1533646,
"source_ids": ["census-pep-v2024-co-est2024-alldata"]
}
}
Every value above is copied verbatim from the real, already-published summary.json/
spending.json files (apps/web/public/data/v1/florida/US-FL-COUNTY-ORANGE/) — nothing here is
recomputed, matching the “same six figures, once each” invariant 05-RESEARCH.md’s Pattern 1
recommends.
Chosen: accept the field list as proposed. The edit (maintainer-supplied old=new name
pairs) and drop population (which leaves D-13’s population-band filter with no published
figure to band on) alternatives are recorded in Rationale’s Considered Options.
Q4 — The review-disposition file, thresholds and negative-leaf scope (D-06 through D-09)
Every flag below is re-derived directly from the archive this session — none is copied from 05-RESEARCH.md’s own (explicitly labeled, lower-confidence) estimates, and none reproduces the retired, unreproducible “451 rows” figure (05-RESEARCH.md Assumptions Log A1).
Custodial-share flags (>2%, ADR-0002), recounted from the committed
data/audit/gasb84-statewide-check.csv’s flagged_governments column (pipe-delimited):
| Fiscal year | Flagged / 67 |
|---|---|
| 2015–2020 | 0 (no Custodial column exists before FY2021 — a structural no-op) |
| 2021 | 35 |
| 2022 | 53 |
| 2023 | 66 |
| 2024 | 66 |
These exactly match ADR-0002’s own recorded figures — confirmed, not re-derived independently,
since ADR-0002’s underlying dataset (gasb84-statewide-check.csv) is itself the committed source
of record for this check and was not re-generated this session.
Negative leaf rows, governmental fund group only (the scope D-07 proposes), across every covered year in the archive:
| Scope | Rows | Distinct (government_id, series) pairs |
|---|---|---|
| All roots | 743 | 83 |
| Root 361 only (“expected negative” — interest and investment earnings) | 454 | 44 |
| Every root except 361 (the “unexpected negative leaf” candidate set under D-07) | 289 | 75 |
The same breakdown across every fund group (governmental, proprietary, fiduciary, component_unit) — for comparison, not the proposed scope:
| Scope | Rows | Distinct (government_id, series) pairs |
|---|---|---|
| All roots | 1232 | 95 |
| Root 361 only | 705 | 44 |
| Every root except 361 | 527 | 92 |
Root-361 negative leaf rows specifically in FY2022 (the year 05-RESEARCH.md’s qualitative finding names — a rate-hike year producing unrealized investment losses statewide):
| Scope | Rows |
|---|---|
| All fund groups | 224 |
| Governmental only | 141 |
None of these figures match the retired “451” figure or 05-RESEARCH.md’s own approximate “220/138” estimate; both are superseded by this exhaustive, session-fresh re-derivation.
Year-over-year rule (+100% / −50% strict, applied to each county’s governmental headline
total — metrics.parquet’s own total_expenditures/total_revenue computation: governmental
leaf sum minus headline_rules.json’s transfer-code exclusions, never a raw leaf sum,
05-RESEARCH.md Pitfall 1), across every consecutive covered-year pair in the archive:
Exactly 2 flags, both Jefferson County, FY2017→FY2018 (the same whole-sheet-zero year Q2 measures):
| Government | Series | FY range | Start value | End value | Ratio |
|---|---|---|---|---|---|
| Jefferson | expenditures | 2017→2018 | $21,337,587.00 | $0.00 | −100.0000% |
| Jefferson | revenues | 2017→2018 | $20,317,385.00 | $0.00 | −100.0000% |
This confirms D-08’s “only Jefferson trips it today” claim exactly, and confirms it is the same
government-year Q2’s whole-sheet-zero rule already covers (a missing_fiscal_year flag and a YoY
flag on the same underlying fact, both real and both needing acknowledgement or the null-year
rule’s own resolution).
Chosen: accept the <interfaces> schema, key, check list, unmatched-entry rule, thresholds
and governmental negative-leaf scope as proposed — the review-disposition file at
pipeline/adapters/florida/review_dispositions.json, matched on the five-field key
(government_id, fiscal_year, check, subject, observed_value), restricted to the six check ids
named in <interfaces>, thresholds in pipeline/adapters/florida/validation_thresholds.json
(custodial share >2%, YoY strictly above +100% or strictly below −50% on headline totals,
expected-negative roots starting with 361, negative-leaf scope governmental). No disposition
is pre-filled by this task or any task in this plan — Task 3 records the schema itself, never a
real acknowledgement (T-03-26); the maintainer’s first review of real flags is plan 05-06’s own
work, not this plan’s. The edit alternative (maintainer names which parts to change) is
recorded in Rationale’s Considered Options.
Q5 — Sarasota FY2022 revenues row 26 (324.XXX) source double-count subtotal
Discovered during plan 05-04’s Task 1 full local release chain (not one of the four questions
Task 1 originally measured): the full 67-county release failed exactly 3 of 23,464 checks, all
Sarasota County FY2022 revenues. A corpus-wide scan of all 134 archived workbooks’ 268
series-sheets for an account-code label matching \d+\.XXX (a subtotal row EDR itself prints,
never a leaf account code) found exactly one hit in the whole archive: Sarasota’s FY2022
revenues sheet, row 26, account label 324.XXX (“Impact Fees - Total”). Its Special Revenue
column value ($34,281,953.00) equals exactly the sum of the seven leaf impact-fee rows under
root 324 that post to Special Revenue (rows 17, 18, 21-25: codes 324.11/.12/.31/.32/.61/.91/.92);
its Enterprise column value ($23,783,293.00) equals exactly the sum of the two leaf impact-fee
rows under root 324 that post to Enterprise (rows 19-20: codes 324.21/.22).
read_sheet_structure’s leaf scan already excludes row 26 correctly — its account-code cell is
the string "324.XXX", not a number, so it is read as a category-rollup row and never
double-counted in the parsed leaf records. The workbook’s own Total - All Account Codes row,
however, sums every printed cell in each fund column including row 26’s own subtotal — double-
counting the leaf rows it summarizes. This is the source file’s own arithmetic error, not a
TaxpayerScope parsing defect: the leaf-derived sum is correct; the sheet’s own printed total is
inflated by exactly the subtotal it prints alongside its parts.
No published /data/v1/ figure is affected. metrics.parquet‘s total_revenue for Sarasota
FY2022 is computed from the leaf-derived (categorized) sum, which already excluded row 26
correctly; only the reconciliation checks’ own comparison baseline — totals.parquet’s
reported_amount, sourced directly from the sheet’s own Total - All Account Codes row — was
wrong. This is a reconciliation-validation correction, not a figure-derivation rule, and does not
bump methodology_version.
Chosen: Correct it (option a, maintainer-recommended). Apply a narrowly-scoped, keyed
correction to totals.parquet‘s reported total for exactly this
(source_id, fiscal_year, sheet_row, account_code_label, fund_group, fund_type, subtotal_amount)
— never a tolerance widening, an exclusion, or a scope edit (mode_notes’ stop rule, T-03-26).
Recorded in pipeline/adapters/florida/reported_total_corrections.json (Florida-adapter data,
never core code) and applied by edr_workbook.py‘s _apply_reported_total_corrections, which
re-reads the named row’s raw label and cell value before ever subtracting — a relabeled row, a
different fund column, or a changed amount all raise rather than silently applying a stale
correction. Option b (widen the reconciliation tolerance) and option c (exclude Sarasota FY2022
from publish_scope) are recorded in Rationale’s Considered Options — both were rejected as
exactly the moves mode_notes’ stop rule forbids.
Q6 — Published whole-dollar guard cents (headline, category, revenue-group and property-tax totals)
Discovered during plan 05-04’s Task 1 second continuation (not one of the five questions above):
the full 67-county local release chain’s publish stage raised ValueError for
US-FL-COUNTY-LEE FY2022, whose exact total_revenue is $1,048,712,617.15 —
write_government_data.py’s five whole-dollar guards each required their own published figure to
be exactly integral, raising rather than rounding, whenever the source archive’s own arithmetic
carried a sub-dollar remainder.
A corpus-wide, read-only scan of every government-year-figure protected by these five guards —
total_expenditures and total_revenue (metrics.parquet, every covered fiscal year, both
series), category and revenue-group amount (categories.parquet, each government’s first and
last covered fiscal year, both series), and property_tax_revenue (property_taxes.parquet,
every non-null year) — found exactly 8 government-year-figures across the whole archive that
carry a nonzero cent remainder. Every one is fiscal year 2022; none is a category or revenue-group
amount:
| Government | FY | Figure | Exact value | Rounds to (ROUND_HALF_UP) |
|---|---|---|---|---|
| Lee | 2022 | total_revenue | $1,048,712,617.15 | $1,048,712,617 |
| Miami-Dade | 2022 | total_expenditures | $5,057,995,762.26 | $5,057,995,762 |
| Miami-Dade | 2022 | total_revenue | $7,134,886,653.25 | $7,134,886,653 |
| Osceola | 2022 | total_revenue | $896,790,206.43 | $896,790,206 |
| Palm Beach | 2022 | total_expenditures | $2,430,987,593.63 | $2,430,987,594 |
| Sarasota | 2022 | property_tax_revenue | $270,076,080.61 | $270,076,081 |
| Sarasota | 2022 | total_expenditures | $703,733,583.49 | $703,733,583 |
| Sarasota | 2022 | total_revenue | $782,656,292.21 | $782,656,292 |
Six of the eight round down (Lee’s own $.15 among them); Palm Beach’s total_expenditures and
Sarasota’s property_tax_revenue round up — ROUND_HALF_UP applied uniformly, not a rule chosen
per row.
Chosen: Round to dollar (option a, maintainer-recommended). Every one of the five whole-dollar
guards rounds its exact Decimal value with ROUND_HALF_UP — the same convention _round_int
already uses for every other rounded published figure (D-14) — instead of requiring it to already
be exactly whole. A new shared helper, _round_whole_dollar_total (with its delta check split out
as _assert_rounding_delta_ok for independent testability), still fails closed, naming the
government/year/figure, if the value is non-finite or the rounding delta is $1.00 or more —
mathematically unreachable through Decimal.quantize(..., ROUND_HALF_UP) itself, since no number
is ever more than $0.50 from its own nearest whole dollar, but asserted explicitly as a defensive
backstop against a different class of upstream computation error than the expected cents-level
noise this rule absorbs. This is a validation-tolerance correction, not a figure-derivation rule:
the underlying exact Decimal total is unchanged, and reconcile.py‘s checks — which run earlier,
in the validate stage, before publish ever executes — already passed all 23,464 checks against
the exact (unrounded) values before this fix; nothing in reconcile.py changed, and no
categories-sum-to-headline style check needed adjustment (Rationale). Option “keep raising” (the
status quo prior to this decision, which leaves these five governments’ FY2022 permanently
unpublishable) is recorded in Rationale’s Considered Options.
Machine-readable lines
The eleven lines below are parsed directly by pipeline/tests/publish/test_methodology_v4.py and
pin the values plans 05-03, 05-04, 05-05 and 05-07 compare their own code and contracts against.
empty_leaf_cell_rule: blank_as_zero_leaf_only no_data_year_reason: no_data_reported no_data_year_contract: nullable_with_reason counties_index_path: /data/v1/florida/counties.json counties_index_top_fields: methodology_version, cpi_series, counties counties_index_row_fields: government_id, slug, name, consolidated, first_fiscal_year, last_fiscal_year, dollar_year, latest_spending, ten_year_spending_change, population_change, real_spending_change, real_spending_per_resident, spending_per_resident, population review_disposition_key: government_id, fiscal_year, check, subject, observed_value acknowledgeable_checks: yoy_change_beyond_threshold, zero_population, custodial_share_above_threshold, missing_fiscal_year, unexpected_negative_leaf, unexpected_negative_aggregate negative_leaf_fund_group: governmental sarasota_fy2022_reported_total_correction_row: 26 whole_dollar_cents_rounding_rule: round_half_up
Decision sign-off
Maintainer reply, recorded verbatim: “Accept recommended”
Interpretation (the option the maintainer selected from Task 2’s checkpoint options): option
recommended — accept every recommendation in this record as originally proposed: Q1 a
(leaf-only blank-as-zero; non-leaf empty string still raises); Q2 a1 (null year with reason
no_data_reported, data/audit/coverage-status.csv unchanged plus a dated
data/audit/revisions.md entry); Q3 accept the /data/v1/florida/counties.json field list as
proposed; Q4 accept the review-disposition schema, five-field match key, six acknowledgeable
check ids, thresholds and the governmental negative-leaf scope as proposed.
Recorded: 2026-09-25T19:57:19Z (Task 2 of 05-01-PLAN.md, checkpoint:decision,
gate="blocking-human"). This reply is the sole authority for the empty-cell rule, the no-data-
year rule and shape, every counties.json field name, and the review-disposition schema recorded
in this Decision section — T-03-26’s mitigation: a rule that changes a published figure and a
permanent field name are never chosen by the agent alone.
Decision sign-off (Q5)
Maintainer reply, recorded verbatim: “a: Correct it (Recommended)”
Interpretation: option a — correct Sarasota FY2022 revenues row 26’s (324.XXX) source
double-count via a narrowly-scoped, keyed exception to the reported total, exactly as this
record’s Q5 subsection describes; never a tolerance widening, an exclusion of the county, or a
generic rule.
Recorded: 2026-09-25T21:03:58Z (plan 05-04-PLAN.md Task 1 continuation,
checkpoint:decision, gate="blocking-human", raised after Task 1’s full local release chain
surfaced this finding). This reply is the sole authority for the Sarasota FY2022 reported-total
correction — T-03-26’s mitigation: a rule that changes what a published-adjacent validation check
compares against is never chosen by the agent alone.
Decision sign-off (Q6)
Maintainer reply, recorded verbatim: “a: Round to dollar (Recommended)”
Interpretation: option a — round every published whole-dollar total that carries cents to
the nearest dollar using ROUND_HALF_UP, exactly as this record’s Q6 subsection describes; never
a tolerance widening on the publish-stage guard’s own comparison, and never a scope exclusion of
the affected governments.
Recorded: 2026-09-25T21:26:21Z (plan 05-04-PLAN.md Task 1’s second continuation,
checkpoint:decision, gate="blocking-human", raised after the Sarasota Q5 fix’s own full local
release chain re-run surfaced Lee FY2022’s cents figure). This reply is the sole authority for
rounding a published whole-dollar total that carries cents — T-03-26’s mitigation: a rule that
changes a published figure’s computed value is never chosen by the agent alone.
Rationale
Every recommendation above follows the same reasoning ADR-0008 and ADR-0009 already used: prefer
the option that keeps every dollar attributed to a named, auditable rule rather than folded into
an undifferentiated bucket or silently dropped, and prefer the option that lets the largest
number of the 67 counties actually publish without either fabricating a number or crashing the
pipeline. Q1’s leaf-only rule is the narrowest fix that unblocks Liberty and Monroe without
weakening the non-leaf raise that catches a genuinely corrupt total-row cell. Q2’s null-with-reason
option is the only one of the three that neither fabricates a number nor silently changes the
years array’s row-per-covered-year invariant every other government’s page already relies on.
Q3 reuses existing, already-tested model shapes rather than inventing new field names for figures
that already have one. Q4’s governmental-only negative-leaf scope and the five-field disposition
key are what the measured flag volumes above are actually sized against — widening either without
re-sizing the checkpoint would surprise the maintainer with a materially larger review burden than
this record describes (05-RESEARCH.md Pitfall 2). Q6’s ROUND_HALF_UP rule reuses _round_int’s
own existing convention rather than inventing a second whole-dollar rounding rule, and applies
uniformly across all five whole-dollar guards rather than special-casing the two headline totals —
the corpus scan found a real cents-bearing property_tax_revenue (Sarasota) that the same
inconsistency would otherwise have left unpublishable even after Lee’s fix.
Considered Options
Recorded here, not repeated in the Decision section above: Q1 option b (keep raising, leaves two
counties permanently unpublishable); Q2 option a2 (omit-with-list, changes array-length semantics)
and option b (publish $0, explicitly rejected by D-03); Q3’s edit/drop-population alternatives
(no specific edit is proposed pending the maintainer’s own preference); Q4’s broader “every fund
group” negative-leaf scope (93/95-pair volumes shown above for comparison, not proposed as the
default scope); Q5 option b (widen RECONCILIATION_TOLERANCE_DOLLARS past $1.00 so Sarasota’s
$34.3M/$23.8M diffs pass) and option c (drop Sarasota FY2022 from publish_scope) — both rejected
as exactly the moves mode_notes’ stop rule forbids (T-03-26), and option b would additionally
mask a genuine future divergence on every other government’s reconciliation check; Q6’s “keep
raising” status quo (leaves Lee, Miami-Dade, Osceola, Palm Beach and Sarasota’s FY2022 permanently
unpublishable — SC1 unmet for five more of the 67 counties).
Source Evidence
Q1 evidence: every empty-string leaf cell found (21 of 21, exhaustive)
| Government | Series | FY | Row | Account | Fund type | Fund group |
|---|---|---|---|---|---|---|
| Liberty | revenues | 2023 | 72 | 351.5 | General | governmental |
| Liberty | revenues | 2023 | 72 | 351.5 | Debt Service | governmental |
| Liberty | revenues | 2023 | 72 | 351.5 | Capital Projects | governmental |
| Liberty | revenues | 2023 | 72 | 351.5 | Permanent | governmental |
| Liberty | revenues | 2023 | 72 | 351.5 | Enterprise | proprietary |
| Liberty | revenues | 2023 | 72 | 351.5 | Internal Service | proprietary |
| Liberty | revenues | 2023 | 72 | 351.5 | Pension | fiduciary |
| Liberty | revenues | 2023 | 72 | 351.5 | Trust | fiduciary |
| Liberty | revenues | 2023 | 72 | 351.5 | Private Purpose | fiduciary |
| Liberty | revenues | 2023 | 72 | 351.5 | Component Units | component_unit |
| Monroe | revenues | 2024 | 87 | 361.1 | Permanent | governmental |
| Monroe | revenues | 2024 | 87 | 361.1 | Custodial | fiduciary |
| Monroe | revenues | 2024 | 87 | 361.1 | Pension | fiduciary |
| Monroe | revenues | 2024 | 87 | 361.1 | Trust | fiduciary |
| Monroe | revenues | 2024 | 87 | 361.1 | Private Purpose | fiduciary |
| Monroe | revenues | 2024 | 92 | 369.9 | Debt Service | governmental |
| Monroe | revenues | 2024 | 92 | 369.9 | Permanent | governmental |
| Monroe | revenues | 2024 | 92 | 369.9 | Custodial | fiduciary |
| Monroe | revenues | 2024 | 92 | 369.9 | Pension | fiduciary |
| Monroe | revenues | 2024 | 92 | 369.9 | Trust | fiduciary |
| Monroe | revenues | 2024 | 92 | 369.9 | Private Purpose | fiduciary |
Zero empty-string cells found on any sheet’s own total row (Total - All Account Codes), across
all 134 covered-year workbooks. Total cells scanned: 1,097,659.
Reconciliation under the proposed rule (blank leaf → $0.00), every fund column, both
sheets — every diff is exactly $0.00:
Liberty FY2023 revenues: General, Special Revenue, Debt Service, Capital Projects, Permanent, Enterprise, Internal Service, Custodial, Pension, Trust, Private Purpose, Component Units — 12 of 12 fund columns reconcile to the sheet’s own total row exactly. Governmental Total Revenue (ADR-0008 scope, 381/382 excluded — neither present on this sheet’s governmental columns): $26,508,391.00.
Monroe FY2024 revenues: the same 12 fund columns all reconcile exactly. Governmental Total Revenue (same scope): $408,031,532.00.
Q2 evidence: every whole-sheet-zero government-year-series found (1 of 1,340, exhaustive)
| Government | Series | FY | Governmental leaf SUM | Whole-sheet leaf SUM (all fund groups) |
|---|---|---|---|---|
| Jefferson | expenditures | 2018 | $0.00 | $0.00 |
| Jefferson | revenues | 2018 | $0.00 | $0.00 |
Jefferson’s adjacent covered years are real: FY2017 expenditures $21,337,587.00 (governmental headline, transfer codes excluded) / revenues $20,317,385.00; FY2019 expenditures/revenues both real and non-zero (ADR-0009’s own Jefferson evidence table records the exact figures). Jefferson’s FY2015 and FY2024 endpoints — the only ten-year window Jefferson can publish — are both real, non-zero years; the ten-year window is unaffected by the FY2018 null-year rule.
Q4 evidence: negative leaf rows and YoY flags
See tables in the Decision section’s Q4 subsection above — reproduced here rather than twice, per this record’s own economy: the custodial-share recount, the governmental/all-fund-group and with/without-root-361 negative-leaf counts, the FY2022 root-361 breakdown, and the two-flag YoY table are all Source Evidence for Q4’s proposal, not separately restated.
Q5 evidence: the one \d+\.XXX hit and its reconciliation, before and after correction
A corpus-wide scan of every archived workbook’s label columns (all 134 workbooks, both series,
every covered fiscal year) for an account-code label matching \d+\.XXX found exactly one hit:
| Government | Series | FY | Row | Account label | Account name |
|---|---|---|---|---|---|
| Sarasota | revenues | 2022 | 26 | 324.XXX | Impact Fees - Total |
Row 26’s own printed values, and the leaf rows they duplicate:
| Fund column | Fund group | Row 26 value | Duplicated leaf rows (root 324) |
|---|---|---|---|
| Special Revenue | governmental | $34,281,953.00 | 17 (324.11), 18 (324.12), 21 (324.31), 22 (324.32), 23 (324.61), 24 (324.91), 25 (324.92) |
| Enterprise | proprietary | $23,783,293.00 | 19 (324.21), 20 (324.22) |
Every other fund column on this row (General, Debt Service, Capital Projects, Permanent, Internal Service, and every fiduciary/component-unit column) reads $0 — the double-count is scoped to exactly these two fund columns.
Before correction (fund_columns_reconcile_to_reported_totals, check_fund_columns):
| Check | Derived (leaf sum) | Reported (sheet total row) | Diff |
|---|---|---|---|
| fl-edr-sarasota-revenues FY2022 governmental/special_revenue | $403,942,141.48 | $438,224,094.48 | −$34,281,953.00 |
| fl-edr-sarasota-revenues FY2022 proprietary/enterprise | $272,580,280.97 | $296,363,573.97 | −$23,783,293.00 |
| revenues_headline_matches_governmental_minus_exclusions US-FL-COUNTY-SARASOTA FY2022 | computed $782,656,292.21 | expected $816,938,245.21 | −$34,281,953.00 |
After correction (this task’s automated re-run of the full local release chain,
pipeline/tests/adapters/test_edr_workbook.py::test_exhaustive_sarasota_fy2022_reported_total_correction_reconciles_exactly):
all three checks reconcile to an exact $0.00 diff — the corrected reported totals
($403,942,141.48 special_revenue, $272,580,280.97 enterprise) equal the leaf-derived sums exactly,
to the cent, not merely within the $1.00 tolerance.
Q6 evidence: the corpus-wide whole-dollar cents scan (8 of 8, exhaustive)
A read-only scan, run against the real data/parquet/{metrics,categories,property_taxes}.parquet
produced by a full 67-county run.py chain through the categorize stage (post-Q5 correction,
post-scope-widening), of every government-year-figure protected by write_government_data.py’s
five whole-dollar guards, reproduced from the Decision section’s Q6 table above rather than twice:
8 government-year-figures carry a nonzero cent remainder, all fiscal year 2022, none a category or
revenue-group amount. Pinned exactly by
pipeline/tests/publish/test_publish_writer.py::test_corpus_wide_whole_dollar_cents_scan_matches_adr_0010_q6_pin
(archive-marked, skips without the real data/parquet/ present, fails instead of skipping under
TAXPAYERSCOPE_REQUIRE_ARCHIVE=1) — a future archive re-run that introduces a new cents-bearing
figure fails this pin rather than silently rounding one nobody reviewed, the same discipline Q1’s
_KNOWN_FULL_PARSE_FAILURES pin already applies to the empty-cell rule.
Methodology Version
This decision took effect in methodology_version: 4. Q1 and Q2 both change how a published
figure is derived (an empty-cell parsing rule and a null-year rule), which is the same bar
ADR-0008 (v2) and ADR-0009 (v3) each crossed — a version bump, not a same-version patch.
active_methodology_version returned 3 while this record’s status was proposed; it now
returns 4 following the maintainer’s recorded Task 2 decision (Decision sign-off, above) and
Task 3’s coordinated bump across every other active decision record.
Revision (2026-09-25)
Same-day activation record, for the same visible-diff discipline every other active record in
this directory carries: Task 1 wrote this record as status: proposed with all four questions
quantified and no option chosen; Task 2 (checkpoint:decision, gate="blocking-human") obtained
the maintainer’s reply the same date; Task 3 rewrote the Decision section to the chosen options
only, moved rejected alternatives into “Considered Options” under Rationale, added the
Machine-readable lines subsection and the Decision sign-off section quoting the reply verbatim,
and flipped status to active at methodology_version: 4 — all recorded here as one dated,
diffable event rather than an untracked same-day edit. This revision recorded by Task 3,
05-01-PLAN.md.
Revision (2026-09-25) — Q5 Sarasota FY2022 324.XXX source double-count
Same-day, second dated event: plan 05-04-PLAN.md Task 1’s full local release chain surfaced
exactly 3 failing checks (all Sarasota County FY2022 revenues), traced to the source workbook’s
own row-26 324.XXX subtotal being double-counted in its Total - All Account Codes row (Q5
evidence above). A checkpoint:decision (gate="blocking-human") presented the finding and three
options (correct it / widen the tolerance / exclude the county); the maintainer chose “a: Correct
it (Recommended)” the same date (Decision sign-off (Q5), above). This revision adds the Q5
subsection, its machine-readable line, its Decision sign-off, its Considered Options entries and
its Source Evidence subsection — status stays active and methodology_version stays 4
unchanged, since no published /data/v1/ figure is affected (Q5 subsection, above). Implemented
in pipeline/adapters/florida/reported_total_corrections.json and
pipeline/adapters/florida/parsers/edr_workbook.py’s _apply_reported_total_corrections, with
RED/GREEN tests in pipeline/tests/adapters/test_edr_workbook.py proving the correction reconciles
exactly, is scoped to its exact key, and fails closed on a drifted amount. This revision recorded
by 05-04-PLAN.md Task 1’s continuation.
Revision (2026-09-25) — Q6 published whole-dollar guard cents (round to dollar)
Same-day, third dated event: plan 05-04-PLAN.md Task 1’s second continuation re-ran the full
local release chain after the Q5 Sarasota fix and hit a new publish-stage failure —
US-FL-COUNTY-LEE FY2022’s exact total_revenue, $1,048,712,617.15, carries cents, which
write_government_data.py’s whole-dollar guards rejected outright (Q6 evidence above). A
corpus-wide scan (Q6 evidence) found 7 more government-year-figures with the same property, all
FY2022. A checkpoint:decision (gate="blocking-human") presented the finding; the maintainer
chose “a: Round to dollar (Recommended)” the same date (Decision sign-off (Q6), above). This
revision adds the Q6 subsection, its machine-readable line, its Decision sign-off, its Considered
Options entry and its Source Evidence subsection — status stays active and
methodology_version stays 4 unchanged: the underlying exact Decimal total each guard protects
is unchanged, reconcile.py’s checks continue to compare exact Decimal values in the validate
stage (unmodified, and already passing all 23,464 checks before this fix), and only the
publish-stage guard’s own tolerance for its own comparison changed — the same “validation
correction, not a figure-derivation rule” bar Q5 already crossed at this same version. Implemented
in pipeline/publish/write_government_data.py’s _round_whole_dollar_total and
_assert_rounding_delta_ok, applied uniformly across all five whole-dollar guards (headline
expenditures/revenue, category, revenue-group, property-tax), with RED/GREEN tests in
pipeline/tests/publish/test_publish_writer.py proving a cents amount rounds ROUND_HALF_UP, a
non-finite or implausible-delta value still fails closed, and an archive-marked pin of the
corpus scan’s exact 8-figure set. This revision recorded by 05-04-PLAN.md Task 1’s second
continuation.