Skip to content

UK wave 2 continuation: DWP, VOA, scotgov, DfT and ONS national packages (#133) - #141

Open
juaristi22 wants to merge 14 commits into
PolicyEngine:mainfrom
juaristi22:uk-wave2-remaining-national
Open

UK wave 2 continuation: DWP, VOA, scotgov, DfT and ONS national packages (#133)#141
juaristi22 wants to merge 14 commits into
PolicyEngine:mainfrom
juaristi22:uk-wave2-remaining-national

Conversation

@juaristi22

@juaristi22 juaristi22 commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Part of #133 (and closes the last #132 package row). Stacked on #139 (branched from its head a335f37) so the two drafts share SOURCE_PACKAGE_ALIASES and one bundle-constants lineage; the diff collapses to this branch's commits once #139 merges.

Lane: ledger-source-ingestor — judges ledger-source-fidelity + ledger-boundary.

What (current state, after batches 1-4 + adversarial review)

15 packages, 552 facts, five new source directories (voa, scotgov, dft, isc, plus the first dwp Stat-Xplore extracts), and one new parser lane (statxplore_table_json_rows — raw Open Data API responses unpivoted to one row per cube cell; the census api_response precedent generalized):

batch packages facts
1 dwp-benefit-statistics-february-2026, voa-council-tax-bands-2025 (incl. the UNMD unmatched row), scotgov-council-tax-bands-2025, scotgov-scottish-budget-social-security-assistance-2026, dft-nts-vehicle-ownership-2024, ons-public-sector-employment-2026 279
2 dwp-pip-daily-living-foi-2025 (FOI2025/24990, manually-downloaded PDF, provenance in the package comment) 2
3 dwp-uc-payment-distribution-may-2025, dwp-uc-households-children-may-2025, dwp-uc-households-family-type-may-2025, dwp-uc-scotland-youngest-child-may-2025 (Stat-Xplore Open Data API, key-authenticated, query echoed in each artifact) 176
4 ons-national-balance-sheet-land-2025, hmrc-salary-sacrifice-reform-2029-headcounts, isc-annual-census-2023, isc-annual-census-2024 95

Also adds docs/pe-uk-source-checklist.md — the per-family uk-data→Ledger migration tracker (fixes a dead harness-doc link).

Key fidelity notes

  • Publisher truth over uk-data transcriptions throughout, with every delta enumerated: ESA total "1 million" vs Stat-Xplore-precision 999,000; PSE reclassification revisions (6,089k/6,146k vs 5.90m/5.94m); Stat-Xplore May-2025 revised vs uk-data's provisional extracts (family-type deltas +2.6% to +15.0%, children +2.6% to +5.6%); NBS land 2021-2023 byte-exact matches, 2024 approximation replaced, 2020 sector split unmatchable (earlier vintage); ISC 557,000 = the Jan-2024 census figure rounded.
  • Computed uk-data values never ported (facts-only ADR): undercount inflation, 3%/2.4% growth extensions, flat-fills, share splits, ×12 annualization, shares×29.6m products, the Scottish band-share fallback, and the publisher-withdrawn £11.3m Two Child Limit Payment allocation.
  • Link-rot found: uk-data's Scottish-budget cite serves the wrong chapter; the 2025 SPP Review PDF (NI-relief bases) is dead with no Wayback snapshot — tracked as blocked.

Gates

  • validate-package + build-suite + agent_acceptance green for all 15; adversarial review re-derived every value independently from committed artifact bytes (2,100 checks, zero mismatches) plus cross-package additivity checks (VOA E&W = England+Wales+Unmatched within publisher rounding; Scottish budget lines sum exactly to the published totals).
  • Bundle expectations set to post-publication truth, proven by the merged-bundle test passing under the disclosed-and-reverted local storage.r2 sandbox. Committed manifests remain upload-truthful.
  • Draft because the consumer export awaits uv run ledger publish-raw --root db/data by a credentialed maintainer (15 artifacts). Note: a whole-tree run crashes on cms_nhe/historical_service_source's non-year historical_service_source manifest key (and ssa/ssi_monthly_statistics_2024_12 carries a similar source_capture key) — run per-directory roots, or fix those manifests first.

Remaining #133 scope after this PR

SLC (gated on #131/#136), housing.py base facts (needs scoping — PRHI + EHS tables), the SPP Review bases (blocked, artifact lost), and the uk_national profile PR. Wave 3 (#134) untouched.

🤖 Generated with Claude Code

juaristi22 and others added 10 commits August 6, 2026 14:22
…icyEngine#133)

Wave-2 batch 1: policyengine-uk-data's OBR calibration surface from
publisher truth. obr-efo-receipts-march-2026 (63 facts: income tax and
NIC classes from sheet 3.4 accrued, NI total/VAT/fuel duties/CGT/SDLT
from the cash-basis current-receipts sheet 3.8) and
obr-efo-expenditure-march-2026 (133 facts: council tax by nation plus
total from 4.1, 13 welfare lines with UC in/outside cap disambiguated
by row from 4.9, BBC licence fee from 4.19). 196 source_projection
facts, fiscal_year periods 2024-2030 storing the opening year, GBP
billion value_scale 1e9, all rows table_record_kind total (each line is
a total over its program population).

Artifacts fetched directly from obr.uk (residential passes the 403 wall
that forces uk-data's committed fallback and forced CBO's curated-CSV
compromise), double-fetched byte-identical. Explicit per-year record
sets rather than {year} templating so the full forecast surface lands
in every build (PolicyEngine#135 year handling). Excluded as uk-data-computed:
salary-sacrifice uprated series (SPP-PDF base values become their own
package); private_school_students is ISC data in wave-1 scope.

Registers both aliases and updates bundle expectations to the measured
post-publication truth (39,415 facts, 62 packages, 22 periods, source
obr=196, 57 tables). Consumer export awaits ledger publish-raw.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…icyEngine#133)

Wave-2 batch 2. ons-savings-interest-income: UKEA HAXV annual
observations 2018-2025 (GBP million, value_scale 1e6, 30-06-2026
release); policyengine-uk-data's flat-fill of the last actual through
2029 is a computed extension the facts-only ADR excludes.
ons-families-households-2025: Table 7 household counts by type, 10
types x 2018-2025 (thousands, value_scale 1e3), LFS-derived so
provenance_class survey_aggregate with survey_instrument named; row
guards are exact cell text including indentation and note markers.

Deliberately not ported: ons_tenure England totals (the SPREE workbook
is LA-grain only; uk-data sums ~300 LA rows in code, and Ledger stores
only publisher-emitted aggregation levels - the workbook becomes the
wave-3 LA package). Salary sacrifice moves to batch 3: uk-data's
pinned asset now returns status gone (its runtime download fails
silently); current asset is media/6a673e0e5e87122783093901 (Private
pension statistics, 2026-07-30).

Bundle expectations re-measured with all four wave-2 packages: 39,503
facts, 64 packages, 24 periods, ons 1,334, obr 196, 59 tables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…licyEngine#133)

Wave-2 batch 3. Six facts from the Private pension statistics tidy CSV
(updated 2026-07-30): income tax relief on salary sacrificed pension
contributions, total and by rate band, plus Class 1 employee and
employer NICs relief. tax_year period 2024 (opening year). Six guard
cells per row; [z]-suppressed by-rate NICs splits not ported.

policyengine-uk-data's pinned asset for these tables returns status
gone, so its runtime download silently drops the targets today, and its
3 percent p.a. uprating from the old 2023-24 base is a computed series
the facts-only ADR excludes either way.

Correction recorded on the PR: the resolve_pending first-print lane
referenced in earlier issue comments does not exist in this repo;
hand-transcribed uk-data families will be packaged from their actual
publication files. HMRC CGT scoped: Table 1 is ODS, so CGT joins SPI
behind the ods_used_range parser (next infrastructure item).

Bundle expectations: 39,509 facts, 65 packages, hmrc 199, 60 tables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…consumer (PolicyEngine#133)

Wave-2 batch 4. hmrc-cgt-statistics-2025: the full published Table 1
history, 37 disposal years (1987-88 to 2023-24) x 9 measures = 333
facts - taxpayer counts (thousands), chargeable gains and tax
liabilities (GBP million), each for individuals, trusts, and the
publisher's own Total columns. tax_year periods store the opening
year; 2023-24 is provisional per the publication notes; percentage
columns are derivable and not ported.

Correction recorded on the PR: the ods_used_range lane already existed
(dispatch + repeat-aware reader) with zero consumers - the earlier
'missing ODS parser' scoping mistook no-usage for no-capability. This
package proves the lane end to end; SPI and the ODS-format DWP tables
were never parser-blocked.

Fidelity: policyengine-uk-data's hardcoded 378k taxpayers / GBP 65.9bn
gains are exactly the publisher's Total columns for 2023-24 (verbatim);
its AEA gating and PE-parameter uprating are populace-side measurement
semantics. populace's native UK_CGT_TARGET_SPECS single-homes onto this
package in populace#622.

Bundle expectations: 39,842 facts, 66 packages, 59 periods, hmrc 532,
61 tables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ngine#133)

Wave-2 batch 5, both on the ods_used_range lane.

hmrc-spi-income-bands-2023: SPI collated tables 2023-24, Tables 3.6 and
3.7 - 13 total-income bands x 7 income types, counts (thousands) and
amounts (GBP million), 182 facts at tax_year 2023. survey_aggregate
with the Survey of Personal Incomes named as instrument. Numeric ODS
band cells make numeric row-header guards workable here. uk-data's
1.9x property-income scale and its uprated projections are
populace-side adjustments; means are derivable and not ported. Same
artifact populace's national HMRC stage parses.

dwp-benefit-cap-november-2025: benefit-cap tables to November 2025,
Table 4 point-in-time - UC households capped at Nov-2025, GB Total
(110,637) plus the 13 amount-capped bands, 15 facts at month 2025-11
(first UK month-period facts; first dwp source). uk-data's 110,637 is
exactly this GB Total; its GBP 320.9m annualized reduction is a
computed band-midpoint construction, excluded - populace can declare
its own annualization over the ported distribution.

Stat-Xplore families (UC by children, Scotland UC) stay parked pending
an API key; two-child limit, PIP and DWP benefit-statistics
publications are the next batch.

Bundle expectations: 40,039 facts, 68 packages, 60 periods, 31 sources,
hmrc 714, dwp 15, geography 1,054, 63 tables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…yEngine#133)

Wave-2 batch 6 (final batch on this PR). dwp-uc-two-child-limit-2025:
Tables 01, 03A/03B and 04A/04B of the April 2025 two-child limit data
tables - all four status rows (in receipt / affected / not receiving a
child element / exception granted) x headline, family-size and
disability columns, 92 facts at month 2025-04. uk-data hand-transcribed
only the 'not receiving' row and models the values at 2026, a
populace-side timing declaration; the exception-granted rows are new
coverage. Regional and time-series sheets are backfill-lane candidates.

This PR is now content-complete for review: 9 packages, 912 facts.
Remaining wave-2 families (PIP Jan-2026, DWP benefit statistics
Feb-2026, VOA, NTS, ScotGov budget, land values, SLC after PolicyEngine#136, the
Stat-Xplore extracts after an API key, and the uk_national profile in
its own profile-lane PR) land in successor PRs after this merges, so
the alias map and bundle constants stay conflict-free.

Bundle expectations: 40,131 facts, 69 packages, 61 periods, dwp 107,
64 tables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…citations, complete bundle expectations (PolicyEngine#133)

Review verdict was needs-fixes; all findings resolved:

- Entity correction (medium): DWP two-child-limit children counts were
  typed entity household. Table 01 is split into a household record set
  (column B) and a person record set (columns C-D); tables 03B/04B flip
  to entity person, role child_in_uc_household. DWP's captions count
  children, and 03B values are exact child-multiples of 03A households
  (891,930 = 3 x 297,310). Fact count unchanged (92).
- Concept ids (low): all 23 TCL concepts hand-curated, replacing
  48-char slug truncations (one with a trailing underscore) - concepts
  are durable join keys and renames after first publish are migrations.
- SPI citations (medium): the income-tax-summarised-accounts landing
  URL now 404s; manifest source_page and all measure evidence URLs
  point at the live personal-incomes-statistics-2023-24 page.
- OBR assertions (low): FY2024-25 columns are labelled Outturn in the
  workbooks; all 28 fy2024 record sets now carry assertion observation
  while fy2025-2030 remain source_projection.
- Named exclusions (low): TCL and SPI head NOTEs now enumerate every
  within-sheet scope drop (04x columns H-J, exception-reason and
  family-type rows; SPI Other-income pair and total column);
  salary-sacrifice NOTE cites where the GBP-million unit is asserted.
- Bundle expectations (high): the deep assertion blocks (by_period,
  by_geography length, K02000001, by_entity) are set to post-publication
  truth - 61 period keys, geography 1,054 with K03000001 at 107,
  K02000001 2,244, entities household 209 / person 4,453 (reflecting
  the entity split) - and PROVEN by running the bundle test under the
  disclosed, reverted R2 sandbox: 1 passed.

Not changed, deliberately: OBR row kind stays total (flipping to detail
would retrigger the acceptance battery's constraints requirement, which
unfiltered aggregate lines cannot satisfy); commit 88d2ebb's message
says 13 amount-capped bands where the artifact has 14 - the yaml and
counts were always right.

Review confirmations recorded: ~1,500 pins independently re-derived
from artifact bytes with zero mismatches across all nine packages; all
912 facts distinct at fact/aggregate/semantic key levels.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…icyEngine#133)

Fixes the dead pe-uk-source-checklist.md reference in the harness doc and
records, per uk-data target family at the pinned ref ebf733c: ported / gated /
parked / wave-3 / excluded-as-computed status, which Ledger PR carries it, and
whether the package reuses uk-data's exact source bytes or had to re-pin
(runtime downloads, link rot, transcriptions). Also queues the harness
commands for the two new wave-2 packages without entries.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…olicyEngine#133)

270 facts across the remaining unblocked wave-2 families:

- dwp-benefit-statistics-february-2026 (4): ESA total/contributions/income
  and JSA claimants at Aug-2025 from the archived HTML statistical summary
  (html_tables_and_text document-numbers lane; the release is HTML-only).
  The ESA total lands as the publisher-emitted 1,000,000 ("1 million");
  uk-data's 999,000 is Stat-Xplore precision for the same series.
- voa-council-tax-bands-2025 (110): CTSOP2.0 stock by band at 31 Mar 2025,
  publisher national + regional rows; Wales-only band I split into its own
  record set ([z]-suppressed for England and regions).
- scotgov-council-tax-bands-2025 (9): CTAXBASE Sep-2025 Scotland chargeable
  dwellings by band; the publisher's cached SUM row (total 2,623,149 -
  byte-identical to uk-data's hardcoded fallback total).
- scotgov-scottish-budget-social-security-assistance-2026 (54): full Table
  5.08 by line x FY2024-26 from the archived Chapter 5 HTML; uk-data's
  2027-29 3% uprating excluded per the facts-only ADR.
- dft-nts-vehicle-ownership-2024 (81): NTS0205a car-availability shares at
  publisher precision, 27 single-year rows; combined-period rows are a
  named exclusion. First dft source.
- ons-public-sector-employment-2026 (12): PSE March-2026 edition Table 1
  headcount by sector, Dec-2023 + Dec-2024, CDID column guards; ONS
  reclassifications revised the series above uk-data's transcription.

Manifests are upload-truthful (no storage.r2 until publish-raw runs).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…kages (PolicyEngine#133)

Measured under the disclosed-and-reverted local storage.r2 sandbox (same
protocol as PolicyEngine#137/PolicyEngine#139), where the merged-bundle test passes: 40,401 facts,
75 packages, 34 sources, 9 entities (dwelling is new), 84 periods, 1,067
geographies. All deep blocks (by_period, by_source, by_geography spot keys,
by_entity, table count) re-measured together so the test converges with zero
further commits once `ledger publish-raw --root db/data` runs on the branch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ine#133)

2 facts: PIP claimants in receipt of the enhanced (1,608,000) and standard
(1,283,000) daily living component, caseload at end January 2025 - the true
publisher of policyengine-uk-data's pip_dl targets (its cited Jan-2026 PIP
statistics publication carries clearance/journey tables only; correction
recorded in the checklist). First pdf_text_numbers UK consumer. Publisher
scope carried as first-class constraints: DWP policy ownership (England,
Wales and Abroad), working-age, normal rules only; volumes publisher-rounded
to the nearest 1,000. The FOI's less-than-4-points percentages are a named
exclusion (withdrawn UC/PIP Bill analysis). Artifact provenance: the FOI
host blocks automated fetches, so the response PDF was downloaded manually
in a browser and registered from the local file; the manifest source_url is
the canonical public attachment URL. Bundle expectations re-measured under
the disclosed-and-reverted sandbox: 40,403 facts / 76 packages, test passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Batch 2: dwp-pip-daily-living-foi-2025 — the parked PIP family is now in scope, PR totals 7 packages, 272 facts.

2 facts from DWP FOI response FOI2025/24990 (caseload at end January 2025): enhanced daily living 1,608,000, standard 1,283,000 — the true publisher of uk-data's pip_dl_* targets. First pdf_text_numbers UK consumer. Publisher scope carried as first-class constraints (DWP policy ownership incl. Abroad, working-age, normal rules only); the FOI's less-than-4-points percentages are a named exclusion. The FOI host blocks automated fetches, so the response PDF was downloaded manually in a browser (provenance in the package comment; manifest source_url is the canonical public attachment).

Bundle expectations re-measured under the same disclosed-and-reverted sandbox: 40,403 facts / 76 packages, merged-bundle test passes. publish-raw now covers 7 artifacts on this branch.

🤖 Generated with Claude Code

…Engine#133)

176 facts from the 'Households on Universal Credit' dataset at May 2025,
closing the parked Stat-Xplore lane now that an API key exists:

- dwp-uc-payment-distribution-may-2025 (140): Monthly Award Amount (bands)
  x Family Type, GB. Publisher band labels are the categorical identities
  (incl. 'No payment' and the overlapping '£1500.01 or over' summary band);
  the x12 annualization uk-data applies is populace-side, and the open
  '£2500.01 or over' band - which uk-data's parser drops to NaN - is an
  ordinary category here.
- dwp-uc-households-children-may-2025 (8): integer number_of_children
  constraints for digit categories, categorical for '5 or more' and tails.
- dwp-uc-households-family-type-may-2025 (5): raw counts only; uk-data's
  undercount_relative inflation stays populace-side per the facts-only ADR.
- dwp-uc-scotland-youngest-child-may-2025 (23): Scotland by single year of
  age of youngest child; age 0 = 14,412, the precise value behind uk-data's
  rounded 14,000. Single-year cells differ from the published 0-4 band by 4
  households (Stat-Xplore disclosure-control rounding).

Each artifact is the raw API response with its query echoed inside it
(api_response precedent), on a new generic statxplore_table_json_rows lane
(ledger/sources/rows.py + dispatch): one source row per cube cell, columns =
measure, value, and a label/URI pair per dimension; publisher value URIs
carry the codes (GSS S92000003 guard) and serve as row headers for digit
categories, which int-coerce in the guard contract (mye precedent).

Vintage note: uk-data's transcriptions are the provisional May 2025 (p)
extract; DWP has since revised the month, so these are the current revised
series (deltas roughly 3-5%, enumerated in the PR). Bundle expectations
re-measured under the disclosed-and-reverted sandbox: 40,579 facts / 80
packages, merged-bundle test passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Batch 3: the four parked Stat-Xplore UC families — PR totals now 11 packages, 448 facts.

An API key is now available, so the parked lane closes: dwp-uc-payment-distribution-may-2025 (140 facts, bands × family type), dwp-uc-households-children-may-2025 (8), dwp-uc-households-family-type-may-2025 (5), dwp-uc-scotland-youngest-child-may-2025 (23, single year of age; age 0 = 14,412, the precise value behind uk-data's rounded 14,000). All from the "Households on Universal Credit" dataset at May 2025, following the api_response precedent — each artifact is the raw /table response with its query echoed inside it.

New lane for review: statxplore_table_json_rows (ledger/sources/rows.py + the two dispatch entries) — a generic unpivot of Stat-Xplore cubes to one source row per cell, columns = measure, value, and a label/URI pair per dimension. Publisher value URIs carry the codes (the Scotland row is guarded on its S92000003 URI) and serve as row headers for digit categories, which int-coerce in the guard contract (the mye caveat).

Fidelity notes:

  • Vintage: uk-data's transcriptions (1,222,944 children-1 households, 2,868.011k single-no-children, etc.) are the provisional May 2025 (p) extract it committed; DWP has since revised the month, and the API serves only the revision (deltas ~3–5%). Same genus as the salary-sacrifice and PSE vintage notes — enumerated intentional differences.
  • The open £2500.01 or over band, which uk-data's parser drops to NaN (its four impossible nan_to_nan targets), is an ordinary category here.
  • uk-data's undercount_relative inflation of the family-type counts stays populace-side per the facts-only ADR.
  • Internal cross-check: Scotland single-year ages 0–4 sum to 73,423 vs the published 0–4 band's 73,427 — Stat-Xplore disclosure-control rounding, both publisher-emitted.

Gates: all four validate-package + build-suite + agent_acceptance green; values spot-verified against the raw cubes; bundle expectations re-measured under the disclosed-and-reverted sandbox (40,579 facts / 80 packages, merged-bundle test passes). publish-raw now covers 11 artifacts on this branch.

Remaining #133 scope after this batch: SLC (gated on #131/#136), land values, SPP Review PDF bases, ISC census (#132 remainder), and the uk_national profile PR.

🤖 Generated with Claude Code

…ngine#133, PolicyEngine#132)

95 facts across the last unblocked wave-2 families plus the wave-1 remainder:

- ons-national-balance-sheet-land-2025 (90): Land (AN.211) at current
  prices, 1995-2024, whole economy / households / non-financial
  corporations (E44R/E44N/E43B) from the 2025-edition NBS reference tables.
  uk-data's hand-transcribed totals match exactly for 2021-2023; its 2024
  value approximated the published 7,117,771 and its 2020 sector split is
  an earlier, since-revised vintage. Flat-fills, the fixed share split and
  the regional split stay populace-side per the facts-only ADR.
- hmrc-salary-sacrifice-reform-2029-headcounts (3): 7.7m employees using
  salary sacrifice for pensions, 3.3m above / 4.3m within the GBP 2,000
  threshold, from the archived HMRC policy paper (publisher relabel from
  uk-data's obr tag; the x1.024 growth extension is excluded).
- isc-annual-census-2023 / isc-annual-census-2024 (1 each): 554,243 and
  556,551 pupils at ISC member schools - the true publisher behind
  obr/private_school_students (557,000 = the 2024 figure rounded), closing
  the last wave-1 row of PolicyEngine#132. New isc source directory.

Also recorded in the checklist: the 2025 SPP Review PDF behind the
NI-relief bases is link-rotted with no Wayback snapshot - blocked until the
document resurfaces; the ported TY2024-25 relief package is the anchor.

Bundle expectations re-measured under the disclosed-and-reverted sandbox:
40,674 facts / 84 packages / 35 sources, merged-bundle test passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Batch 4 (final for this PR's reachable scope): land values, salary-sacrifice headcounts, ISC census — PR totals now 15 packages, 543 facts.

package facts notes
ons-national-balance-sheet-land-2025 90 Land (AN.211) 1995–2024 for whole economy / households / NFCs (CDIDs E44R/E44N/E43B) from the 2025-edition NBS reference tables. uk-data's totals match byte-exact for 2021–2023; its 2024 (£7,100,000m) approximated the published £7,117,771m, and its 2020 household/corporate split (4,309,138 / 1,757,818) matches no series in this edition — an earlier, since-revised vintage. Its fixed-share split, flat-fills, and regional split stay populace-side.
hmrc-salary-sacrifice-reform-2029-headcounts 3 7.7m / 3.3m above / 4.3m within the £2,000 threshold from the archived HMRC policy paper (publisher relabel from uk-data's obr tag; the paper pins no reference period, so the 2024 keying + 2.4%-growth extension are populace declarations).
isc-annual-census-2023, isc-annual-census-2024 1+1 554,243 (Jan-2023) and 556,551 (Jan-2024) pupils at ISC member schools — the true publisher behind obr/private_school_students (557,000 = the 2024 figure rounded, flat-filled 2018–2031 in uk-data). New isc source; this closes the last wave-1 row of #132.

Blocked, recorded in the checklist: the 2025 SPP Review PDF behind the £1.2bn/£2.9bn NI-relief bases is link-rotted (status: not found) with no Wayback snapshot — currently unrecoverable. The ported hmrc-salary-sacrifice-relief-2024 package carries the successor TY2024-25 estimates as the anchor.

Gates: all four green through validate-package + build-suite + agent_acceptance; land values spot-verified against the workbook incl. the uk-data-matching years; bundle expectations re-measured under the disclosed-and-reverted sandbox (40,674 facts / 84 packages / 35 sources, merged-bundle test passes). publish-raw now covers 15 artifacts on this branch.

What remains on #133 after this PR: SLC (gated on #131/#136), the housing.py base facts (needs its own scoping — PRHI + EHS tables), the SPP Review bases (blocked above), and the uk_national profile PR. Wave 3 (#134) untouched.

🤖 Generated with Claude Code

… summary-band kind, caveat notes (PolicyEngine#133)

Fidelity core: every value across the 15 packages independently re-derived
from committed artifact bytes (2,120 checks - manifest shas, cell geometry,
sentence pins, cube walks - zero mismatches), plus cross-package additivity
checks. Fixed from findings:

- VOA (from additivity): the publisher's UNMD 'Unmatched' row (note 15,
  properties unmatched to any constituency) is now ported with a
  geography_match == unmatched identity - England + Wales + Unmatched
  reconciles to the England-and-Wales row within nearest-10 cell rounding
  (band I exactly). +10 facts. Comment also corrects '[z]' to
  not-applicable (England has no Band I), not suppression.
- NTS (major): the workbook's own note 3 says pre-1989 rows are Great
  Britain - the 1951/1961/1971/1981 record sets now carry K03000001, and
  per note 2 name the pre-NTS household surveys as their instrument.
- Scottish budget (major): the FY2025-26 Two Child Limit Payment GBP 11.3m
  allocation is no longer ported - the publisher's same-table footnote
  withdraws it at Spring Budget Revision; now a named exclusion. -1 fact.
- UC payment distribution: the five overlapping '£1500.01 or over' rows are
  table_record_kind total (machine-visible subtotal; detail rows are now
  disjoint), and the three UC cubes document cross-cube non-additivity from
  DWP cell-level adjustment.
- DWP benefit statistics: the JSA 71,000 is flagged post-methodology-break
  (inactive-claims removal at Aug-2025), and the ESA notes state that the
  claim-type categories do not partition the total.
- Salary-sacrifice headcounts: provenance_class corrected to model_output -
  the paper's counts are unnamed-source policy-costing estimates.
- Checklist: family-type provisional-vintage deltas corrected to the
  measured +2.6%..+15.0% range; wrong PR link and a stale cross-reference
  fixed. PR body refreshed (crash-key name, current totals).

Bundle expectations re-measured under the disclosed-and-reverted sandbox:
40,683 facts / 84 packages (552 on this branch), merged-bundle test passes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Adversarial review complete — all findings addressed in 1159ec4. PR is now 15 packages, 552 facts.

Fidelity core: every value independently re-derived from the committed artifact bytes across all 15 packages — 2,120 checks (manifest shas/sizes, xlsx/zip cell geometry and guards via direct openpyxl, prose facts via page-pinned sentence checks, Stat-Xplore facts via an independent cube walk with label-identity verification), zero mismatches. All 552 fact keys distinct. Cross-package arithmetic: Scottish budget lines sum exactly to the published totals in all three years; UC cross-cube marginals and VOA additivity produced the review's best catches below.

Fixed from findings:

  • VOA additivity (the review's best catch): England + Wales ≠ England-and-Wales by 9,060 properties — explained by the publisher's own UNMD "Unmatched" row (note 15: postcodes unmatched to any constituency), which the package silently omitted. Now ported with a geography_match == unmatched identity; additivity reconciles within the publisher's nearest-10 cell rounding, and band I exactly. +10 facts. Also: [z] corrected from "suppressed" to not-applicable — England's 1993 list has no Band I.
  • NTS geography (major): the workbook's own note 3 makes the pre-1989 rows Great Britain, not England — 1951/1961/1971/1981 record sets now carry K03000001, and per note 2 name the pre-NTS household surveys as their instrument.
  • Withdrawn allocation (major): the Scottish budget's FY2025-26 Two Child Limit Payment £11.3m is footnote-withdrawn in the same table ("will be removed at Spring Budget Revision") — no longer ported; named exclusion. −1 fact.
  • Summary band machine-visible: the five overlapping £1500.01 or over rows are now table_record_kind: total, so summing detail rows gives disjoint band coverage; the three UC cubes also document cross-cube non-additivity (family-type total 6,584,241 vs children total 6,584,239 — DWP cell-level adjustment).
  • Caveats now first-class: JSA 71,000 flagged post-methodology-break (Aug-2025 inactive-claims removal); ESA notes state the claim types don't partition the total (dual/credits-only remainder); salary-sacrifice headcounts reclassified model_output (unnamed-source policy-costing estimates).
  • Documentation accuracy: family-type provisional-vintage deltas corrected to the measured +2.6%…+15.0% (my batch-3 "~3–5%" understated them); checklist's wrong PR link and stale cross-reference fixed; PR body refreshed (current totals, and the publish-raw crash key is historical_service_sourcessa/ssi_monthly_statistics_2024_12 carries a similar source_capture key).

Accepted-as-disclosed (no change): PIP's K04000001 footprint with the FOI's "Abroad" tail carried via the pip_policy_ownership constraint + comment (no GSS code exists for that universe); headcounts period/geography inference documented in the comment; geography_vintage naming drift (VOA gss_2024 vs current elsewhere) left for a convention ruling.

Bundle expectations re-measured under the disclosed-and-reverted sandbox: 40,683 facts / 84 packages / 35 sources, merged-bundle test passes — converges with zero further commits after publish-raw (15 artifacts).

🤖 Generated with Claude Code

@juaristi22
juaristi22 marked this pull request as ready for review August 7, 2026 16:24
@juaristi22
juaristi22 requested a review from MaxGhenis August 7, 2026 16:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant