Skip to content

Release the third uk-data batch - #608

Draft
MaxGhenis wants to merge 103 commits into
mainfrom
release/uk-data-2026-10-19
Draft

MaxGhenis wants to merge 103 commits into
mainfrom
release/uk-data-2026-10-19

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 17, 2026 •

Copy link
Copy Markdown
Contributor

This draft assembles the third uk-data release batch on release/uk-data-2026-10-19, based on main a43e8c519 (1.58.2). It brings together the 14 independently approved heads below for the hub’s combined seeded build.

Max's go: d1621 (2026-10-17)

The release remains a draft. Local checks use fixtures and mocks. This assembly job does not run the combined seeded dataset build or production calibration, merge the release PR, or publish. Those steps remain with the hub after the combined seeded build and measurements.

CI handoff: fit regression requires the hub’s seeded investigation. Run 39040600634 completed: six checks passed; the final comparison check failed because the share of 11,228 common local targets within 10% fell from 79.4% to 75.1% (−4.3 percentage points), exceeding the 2-point allowance. National fit moved from 64.9% to 64.6% over 627 common targets. The comparison ran successfully and deliberately failed its regression gate; no missing artifact or test-integration error was reported. Distribution comparison passed with no flags; aggregate checks passed with zero newly broken checks, four failures present on both sides and 446 moves flagged for review. The cause of the local-fit change is unresolved, particularly given #598. Approved member computations and gate thresholds are unchanged. See the CI comparison comment.

Members and merge order

Each member is merged with git merge --no-ff, preserving its approved commits. Order: #604, #557, #595, #571, #589, #537, #561, #592, #594, #599, #600, #601, #602, #603. #601 is included as specified in ~/reviews/uk-data-release-batch-2026-10/batch3-decision.md and the 14-member d1621 approval. #599, #600 and #602 each receive a merge commit; #602 contains the first two.

Order PR Approved head Title Independent review Effect
1 #604 29ca7542 Match ONS age targets to the FRS top code of 80 ~/reviews/uk-hub/reviews/ud604/review-r2-final.md Combines national and regional ages 80+ to match the FRS adult-age top code.
2 #557 473adafc Calibrate SPI income bands to their projected values, and map the 2023-24 outturn to 2023 ~/reviews/uk-hub/reviews/ud557/review-r2-final.md Combines SPI target years by name so calibration uses projected income-band values.
3 #595 0785612c Fail the calibration build on targets it drops or cannot fit ~/reviews/uk-hub/reviews/ud595/review-delta-full.md Adds target-coverage checks; integrates #604/#557 with 17 zero-signal and three duplicate exemptions.
4 #571 77b6527b Start capital gains on HMRC's 2024-25 size-of-gain table ~/reviews/uk-hub/reviews/ud571/review-r2-full.md Uses HMRC’s 2024–25 gain distribution and preserves calibration priors through twinning.
5 #589 a2eedce4 Fix local UC target alignment by area code ~/reviews/uk-hub/reviews/ud589/review-r2-final.md Aligns local UC targets and corrects Scottish income, age and housing target ordering.
6 #537 f5de403e Stop calibrating OBR total NICs on ni_employee ~/reviews/uk-hub/batch-reviews/ud537-r2/review-r2-full.md Stops calibrating total OBR NIC receipts against employee NICs alone.
7 #561 98b2583c Read approved training from the FRS TRAINEE flag for dependants ~/reviews/uk-hub/batch-reviews/ud561-r2/review-r2-full.md Derives dependants’ education/training eligibility proxy from FRS TRAINEE.
8 #592 133632af Build OBR targets only from hash-verified EFO workbooks ~/reviews/w3-uk-data-gates-2026-10-11/sol-delta-592b.md Reads OBR targets from hash-verified EFO workbooks with recorded provenance.
9 #594 cac704bb Save the calibrated weights from the final optimiser step ~/reviews/w3-uk-data-gates-2026-10-11/sol-delta-p3s.md Saves weights from the final optimiser step.
10 #599 dc81b55e Compare each pull request's calibration fit with its base build's ~/reviews/w3-uk-data-gates-2026-10-11/sol-delta-p3s.md Adds before/after calibration-fit comparison in CI.
11 #600 45d47428 Measure each build's HBAI distribution and single ages against its base ~/reviews/w3-uk-data-gates-2026-10-11/sol-delta-p3s.md Measures HBAI distributions and single-age fit alongside the comparison.
12 #601 0cf62aaa Read Scottish council tax targets from a hash-verified committed workbook ~/reviews/w3-uk-data-gates-2026-10-11/sol-review-600-601.md Pins and hash-verifies the Scottish council-tax workbook, removing the download fallback.
13 #602 08226999 Compare each build's national aggregates with its base's, model fixed ~/reviews/w3-uk-data-gates-2026-10-11/sol-delta-602b-603c.md Adds national aggregate comparison on the same locked model, withholding suppressed HBAI totals and deciles.
14 #603 5881ce3e Stop uploading raw calibration logs as public Actions artifacts ~/reviews/w3-uk-data-gates-2026-10-11/sol-delta-603d.md Stops uploading raw calibration logs as public workflow artifacts.

All member heads were checked against GitHub before merging. Main is unchanged from the approved base. #595’s approval at 6e03d4c1 carries to 0785612c: the hub verified that its additional commit changes only a YAML header comment and leaves parsed YAML identical (BATCH.md, 2026-10-16 10:30Z entry).

Merge resolutions

All 14 members have been merged in the stated order with merge commits, and every approved head is verified as its merge’s second parent. Resolutions retain the approved members’ computations:

Each conflict resolution was recorded with git show --remerge-diff; details are in .job/RESOLUTIONS.md.

Integration tests found one additional interaction, corrected in release-only commit 21d5dbf9: policyengine_uk_data/targets/build_loss_matrix.py:175 now iterates over #595’s selected all_targets, retaining #537’s helper for its invariant tests. The automatic merge had selected the helper’s list instead and bypassed the coverage gate’s selected/emitted list. The correction preserves #595’s approved first-name/level selection without changing target formulas or values. #537’s offline OBR mapping/conflict fixtures at policyengine_uk_data/tests/test_obr_target_conflicts.py:85 and test_obr_target_mapping.py:42 now use #592’s verified committed-workbook API, retaining their assertions and blocking HTTP. The workbook-target expectations in test_obr_sources.py:68 and :367 change from 25 to 24 because #537 removes obr/ni.

Generated-file checks reproduce approved bytes: the production SPI generator reproduces incomes_projection.csv from committed public inputs, SHA256 39445e49c9cb101fffd99185cf41d94a78d6c5a9fd93c99d8ea027593a7ea475, identical to #557. The production ONS generator reproduces the 80+ CSV from four existing pinned public ZIPs, identical to #604’s committed bytes. The OBR manifest has the semantic parity described above. No generated-file diff remains.

Release notes and limitations

The limitation wording and release requirements come from ~/reviews/uk-data-release-batch-2026-10/BATCH.md and batch3-decision.md. The annual allowance limitation above is reproduced verbatim from BATCH.md.

Validation

  • All 14 approved heads checked before assembly. Main refreshed before publication and remains a43e8c519 (1.58.2).
  • uv lock --check passes with Python 3.13; locked and installed policyengine-uk is 2.122.2. The only lock refresh updates this project's stale version from 1.58.0 to 1.58.2; all dependency versions are unchanged.
  • Every member's own tests ran in one foreground suite with four workers. The integration corrections pass a targeted rerun: 48 passed, 1 dataset-dependent skip.
  • Standard make test, four workers with one numerical thread each and frozen public-input replay: 2,532 passed, 134 skipped, 1 expected failure. Missing datasets account for 132 skips; the other skips are the known NISRA endpoint and optional bundle tooling. No dataset was downloaded or built locally, and no production calibration ran.
  • Fit/distribution tests with -W error::RuntimeWarning: 41 passed. Artifact guard: 93 passed. Coverage gate: 29 passed, 1 dataset-dependent skip.
  • Combined-tree named known gaps reproduce zero_signal 17, duplicates 3, and no_value_for_year 15. A fresh source-registry replay independently confirms exactly 3 duplicate names, with live HTTP disabled. Actual combined-matrix signal measurement remains pending the hub's seeded build.
  • SPI projection regenerated with the production generator from committed public aggregates: SHA-256 39445e49c9cb101fffd99185cf41d94a78d6c5a9fd93c99d8ea027593a7ea475, exactly the approved member output. ONS 80+ CSV regenerated from existing pinned public sources and is byte-identical. OBR manifest regenerated with every field unchanged except removing Stop calibrating OBR total NICs on ni_employee #537's obr/ni requirement.
  • uvx ruff format --check .: 294 files already formatted. Changelog-fragment check against origin/main, and git diff --check: pass.
  • Draft release PR CI completed: six checks pass; calibration-fit comparison fails on the local-fit regression described above. Both CI builds, repository tests (2,662 passed, 4 skipped, 1 expected failure) and all report producers passed. The built-data coverage test passed, though CI logs do not print actual zero-signal/duplicate counts. The completed logs and generated comparison comment were read; no integration-only fix is indicated. The hub must investigate the measured regression in the pending matched-seed build.

Reproducer: policyengine_uk_data/tests/test_obr_universal_credit_target.py::test_target_matrix_counts_gb_households_only

axiom: n/a: data release integration with no policy rule changes

The combined seeded build and its before and after measurements are pending (hub, Mon 10/19 22:00Z at the earliest)

Independent review and the final release decision remain hub-owned. This PR must remain a draft until the hub completes the build, measurements and required checks.

MaxGhenis and others added 30 commits October 4, 2026 21:37
The cash-receipts parser targeted Table 3.8 "National insurance
contributions" (total NICs, £200.08bn in 2025-26) on the ni_employee
variable, which _parse_nics also targets at the Class 1 employee figure
(£49.54bn). The two targets on one matrix column contradicted each other;
the seeded constituency calibration on main b45c373 ended with obr/ni at
0.242 of target.

Drop the row rather than retarget it: the Table 3.4 class targets
(employee, employer, self-employed) already cover every NIC class the data
populates, and a total target on total_national_insurance would conflict
with them through the statutory payment recoveries and "Other NIC" lines
PE-UK does not model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test_obr_target_mapping: pin the variable of every target parsed from the
  committed receipts workbook, the Table 3.4 rows behind the NIC class
  targets, and the source identity that rules out a total-NICs target.
- test_obr_target_conflicts: no two calibration targets whose matrix column
  is the same plain variable sum or count may disagree on a year's value,
  checked over the OBR targets offline and over every target the national
  matrix uses; it flags the removed obr/ni mapping, and a seeded random
  check holds the grouped check to its pairwise definition.
- build_loss_matrix.calibration_targets: the target list create_target_matrix
  already built inline, extracted so the test checks the same set.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PolicyEngine UK's year N is tax year N to N+1: convert_to_fiscal_year_parameters
gives every parameter, the uprating indices included, its value at 30 April N.
hmrc_spi mapped the 2023-24 SPI to 2024 and hmrc_cgt followed, so both treated
2023-24 outturns as 2024-25 values and every projected year carried one year
too little uprating. The FRS release (2024-25 -> 2024), OBR targets, the SPI
microdata (2022-23 -> 2022) and #533's salary sacrifice tables already use the
start year; the end-year mapping arrived without stated reasoning in the
February 2026 registry refactor (de061fc).

- _SPI_YEAR and _CGT_BASE_YEAR move to 2023; incomes_projection.csv is
  regenerated from the same ODS (its 2023 rows equal main's 2024 rows).
- The CGT base year is now gated at the £6,000 AEA the outturn was realised
  under.
- Tests tie _SPI_YEAR to the tax year in the configured ODS name, check the
  CGT base-year AEA against policyengine-uk, and (as in #541) check that the
  committed projection is the SPI table uprated with the committed factors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build_loss_matrix fetches targets without a year filter, and the registry
keeps only the first target of each name. hmrc_spi emitted each band twice:
the ODS outturn (base year only), then the projection (later years). The
projected target was dropped, so _resolve_value carried the base-year outturn
forward unuprated: the 2025 calibration has targeted raw 2023-24 SPI values
since the February 2026 registry refactor. get_targets now merges the two
into one target per band, and a test checks every projected band, variable
and year through the calibration's own resolution path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
derive_is_in_approved_training_from_frs_person read a `train` column. No FRS
release has one (2020-21 to 2024-25 carry TRAIN2 and TRAINEE), and the
function returned False when the column was missing, so every record was
coded as not in approved training.

DWP's FRS counts a 16- to 19-year-old as a dependent child only when in
full-time non-advanced education or unwaged government training. In FRS
2024-25 all 20 child-table records aged 16 to 19 outside full-time education
have TRAINEE = 1 (33.0k grossed), and uk-data coded every one as failing the
qualifying-young-person education-or-training condition.

Read TRAINEE = 1 (yes; the same yes/no format as EDUCFT), and fail the build
when the column is missing instead of defaulting to False.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #561 (Subfleet 20261010-193520-ud561-review-r1) found that an
adult-table trainee aged 16 to 19 would become a qualifying young person of
their own benefit unit. FRS 2024-25 has none, but 2020-21 has one and 2023-24
three. The FRS has already decided those records are not dependants, and the
adult TRAINEE question does not say the training is unwaged, so it may be
training under a contract of employment (UC reg. 5(3)).

- Flag TRAINEE = 1 on child-table records only. On FRS 2020-21, 2022-23,
  2023-24 and 2024-25 the result equals the child-table records aged 16 to 19
  outside full-time education exactly (8, 26, 16 and 20 records).
- Say why TRAINEE and not TRAIN2: `train` was TRAIN2's question name, only the
  adult table has TRAIN2, and its value labels are not in the repo.
- Property test over numeric, float and string codes and adult/child status;
  a create_frs test with an adult-table trainee in the same household.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Delta review r2 of #561 (Subfleet 20261010-201405-ud561-review-r2, APPROVE
WITH NITS at c952694):

- The docstring said a dependant outside full-time education "carries
  TRAINEE = 1" as if it were guaranteed. It is what the four FRS releases
  checked show, so say that, and call the adult exclusion a proxy.
- The adult-trainee fixture set age80 = 18 but kept age = 30, and create_frs
  adds the two, so it built a 48-year-old. Set age = 0 and assert age 18.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r2 (APPROVE_WITH_NITS): with the live ODS download failing, the merge
test passed even without the merge, because only the projection targets were
emitted. The test now serves get_income_band_table from incomes.csv, checks the
outturn year as well as the projected years through the calibration resolver,
and requires every SPI target to carry all of them. The comment now names
30 April N, the date convert_to_fiscal_year_parameters samples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 1.58.0 enhanced FRS carries £53bn of gains above the annual exempt
amount, and -£15bn of losses on 1.4m people, against the £65.9bn the
build targeted and the £119.3bn HMRC now reports for individuals in
2024-25 (uk-data#570).

The calibration started 17 times over on CGT taxpayers and 5 times over
on gains: the has-gains copy of each zero-weight SPI household kept a
zero weight, so it received a full zero-weight prior, the same as its
no-gains original. After 512 epochs the taxpayer count was still 56%
over while the £12,300 to £250,000 bands had overshot to 23-64% under.

- Split every household's mass between itself and a has-gains twin by
  the Advani-Summers share for its income band, in closed form, and
  split a zero-weight household the same way.
- Give no twin to draws at or under the lowest HMRC band limit, losses
  included: no target describes them.
- Stack donors only for the bands from £500,000 up.
- Scale the calibration's starting weights so each HMRC size band's
  taxpayer count begins on target (rake_priors_to_targets).
- Target Table 2.1a for 2024-25 (2026 release), individuals only, from
  the £3,000 exempt amount up, with the aggregates as the band sums.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The has-gains copies of zero-weight SPI households now carry a weight,
so that the calibration starts from the right share of each. Salary
sacrifice, student loan plans and Pension Credit take-up count people on
survey weights and draw per record. Run before capital gains, they see
neither those weights nor the copies, and a copy matches its original in
everything but the gain.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test_obr_efo_fallback: the receipts and NICs set from #536 listed
  obr/ni, which this branch no longer emits.
- test_obr_target_conflicts: #490/#530 added Target.countries, and
  create_target_matrix zeroes a column outside them, so the column key
  now includes countries. The random differential check uses Hypothesis,
  now a dev dependency, and draws country restrictions too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- obr.py: name what PE-UK lacks (statutory payment recoveries, Class 1A,
  1B, settlements, unallocated) and say ni_class_3 exists but is unfilled;
  the _parse_nics docstring no longer claims it covers Class 3.
- test_obr_target_conflicts: compare every pair in a shared column (isclose
  is not transitive), key countries as a set (restrict_to_countries uses
  np.isin), guard the registry-wide test against a silently empty registry,
  draw carry_forward and both orders of a two-country restriction, and pin
  the tolerance edge with an example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol review r2: the pairwise reference checked a pair only in its own
listed years, so two carried-forward targets that disagree in a year only
a third target lists were reported by the grouped check alone. The
reference now uses the column's full year set, and a regression pins the
reviewer's three-target case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The OBR targets came from whatever obr.uk served, falling back to
committed workbooks matched by URL substring, with the vintage label
taken from sources.yaml rather than the bytes, year columns fixed by
letter, and missing rows logged and dropped.

A manifest per EFO vintage (targets/source_manifests/) now names the two
workbooks with their SHA-256, size and own title, the unit and financial
years every parsed table must head, and the targets they must yield.
Builds read only the verified committed bytes; each table's years come
from its header row; a missing target or year, or an undeclared one,
fails the build. `python -m policyengine_uk_data.targets.obr_sources
ingest` adopts a new vintage from browser-downloaded workbooks and
prints each target's change.

On the March 2026 bytes all 29 OBR targets are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
calibrate_local_areas saved and returned the weights only when
epoch % 10 == 0, so a 512-epoch build shipped the state after step 511
and a 32-epoch build the state after step 31, dropping the last update
(#456). Save at the last epoch too, in both the verbose and the
non-verbose loop, so the saved file, the returned dataset and the
logged fit are the final optimiser state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
create_target_matrix skipped a target whose year did not resolve with no
log line (#456), skipped one whose column raised with a warning, and
accepted columns no household contributes to (#593). It now records each
offered target's status and fails unless every target is in the matrix
with a finite value and signal, or is listed in targets/known_gaps.yaml
under that status with a reason and an issue. Errors and non-finite
values can never be listed; a listed gap that no longer applies is
logged as stale.

known_gaps.yaml lists the 34 gaps measured on uk-data 1.58.1 at the
calibration year 2025: 15 two-child-limit targets dated 2026 only, and
19 targets with no signal. The matrix built is unchanged. The diagnostic
get_loss_results and the CPS transfer reweighting opt out.

`python -m policyengine_uk_data.targets.coverage` reports every target's
status on a dataset (names, statuses and counts only).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pull request CI now also builds the PR's base, in the same way as the
head (TESTING, one clone) and with the head's lockfile, so both run one
model and environment. A new job compares the two final-epoch fits from
their calibration logs. It fails when the share of national or local
targets within 10% falls by more than 2pp, flags national targets whose
error rises by more than 0.2, and posts the comparison on the PR.

The thresholds (targets/fit_policy.yaml, adopted under d1344) come from
five builds of the same data code: their shares moved by at most 0.93pp
(national) and 0.69pp (local), and they flagged 0 to 6 targets per pair.
Per-target moves only flag while #598 (two weight sets from one code)
is open. Only calibration logs are uploaded, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n unit

Sol review of #592:
- The manifest's vintage, its label and both workbook titles must agree
  (march_2026, "March 2026", "March 2026 Economic and fiscal outlook ...
  receipts"), at load and at ingest, so verified March bytes cannot be
  labelled October.
- A row whose label states its own unit ("Standard colour licence fee
  (£)") is refused under a "£ billion unless otherwise stated" table, and
  the TV licence target reads the "BBC licence fee receipts" row only.
- Ingest checks both workbooks and parses them in a staging folder before
  copying anything, and never replaces an ingested vintage.
- Coverage checks every workbook target, including one without the
  vintage.
- The NICs docstring no longer claims Class 3 or that partial results
  pass.

All 29 OBR targets are still identical to main's on the March bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Calibration fits grouped targets; these checks measure what the groups
hide, on the built dataset. Each PR build and its base build report
person-weighted equivalised income medians, means and Gini, and relative
low income for everyone, children, working-age adults and pensioners,
against DWP's HBAI FYE 2025 estimates and 95% intervals (tables 8a and
8b, read from the published ODS files), at period 2024. They also report
people by sex and single year of age against the ONS 2024-based
projection at the calibration year. The comparison job adds them to the
PR comment and flags a measure that leaves its interval; it fails only on
a broken or mismatched report until the same-code spread is measured
(#598).

On uk-data 1.58.1, 5 of 14 HBAI measures are outside their intervals
(median AHC, both Gini coefficients, child low income BHC and AHC), and
single ages 0 to 79 are off by 19.5% on average.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first CI build of this branch failed the gate on three single-claimant
UC payment bands (24,000 to 28,800 a year). Pull request (TESTING) builds
hold fewer records than the release: across the final calibration logs of
12 recent ones, these three have no signal in 11 or all 12, while the
released 1.58.1 build has signal in all three. A listed gap that applies
to one kind of build only warns as stale in the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…book

The Scottish band targets came from a live gov.scot download. When
gov.scot's CloudFront challenge blocked it, as in two of five recent pull
request builds of the same code, the loader substituted a fixed 2025
total spread by fixed shares, so identical code calibrated to different
targets (#596). Commit the September 2025 chargeable-dwellings workbook,
verify its SHA-256, and fail if it is missing or changed. Its Scotland row
equals the targets of the builds whose download succeeded.

Fixes #596.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both builds are measured with policyengine-uk's aggregate-impact tool at
a pinned commit (policyengine-uk#2425, stacked on #2335), under the head's
locked model: receipts by tax head, spending and caseloads, poverty,
inequality, deciles and the ten standard reform costings, 2025-26 to
2031-32. The comparison job runs `compare --axis data`, which fails unless
both sides ran one model, runtime and set of definitions, and adds the
result to the PR comment. It fails on a check the head breaks that the
base passes. Only each side's result.json (aggregates) is uploaded; the
tool's private household detail stays on the runner.

Under the locked 2.122.2 the tool falls back to policyengine-uk main's
partition, whose lists differ from that model's, so closure and two
identities fail on both sides (pre-existing) until uk-data locks a model
that ships its own partition.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
obr.uk refuses scripted downloads, so on Budget day a person downloads the
two EFO workbooks in a browser. The manifest now records each workbook's
download time with its SHA-256 and size: the file's modification time,
which a browser sets on saving, unless --downloaded-at is given. `ingest
--dry-run` checks everything and prints titles, hashes, sizes, download
times and every target's change, writing nothing; on the active vintage
it says whether the bytes match the committed workbooks, so a March 2026
download rehearses the Budget-day path.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol review of #600:
- Negative incomes before housing costs are reset to zero, and income
  after housing costs is derived from the adjusted figure (DWP HBAI
  methodology FYE 2025, "Negative incomes"). Weekly amounts use 365.25 / 7,
  as the FRS loader annualises them.
- A report missing any reference measure, or with a missing or
  non-finite single-age summary, fails the comparison.
- A missing distribution report fails the job.

On uk-data 1.58.1, four of 14 measures are now outside their intervals
(both Gini coefficients, child low income BHC and AHC); median AHC moves
inside.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rint commit

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Raw calibration logs stay on the runner. Each build uploads a summary:
  whether every national and local target is within 10%, and the error of
  national targets supported by at least 10 households only (the
  constituency log gains a records column). An estimate from a few records,
  divided by a published count, could give one household's value back.
  The test job's raw-log uploads are replaced by the summary too.
- The gate compares shares over the targets both builds have; added and
  removed targets are notes.
- An empty national or local group, or a last epoch with fewer rows than
  the one before, fails.
- The comment step writes a failure comment when the comparison never ran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Calibration fit against the base build: fail

Targets within 10% (those both builds have) Base Head Change
National (627) 64.9% 64.6% -0.3pp
Local (11,228) 79.4% 75.1% -4.3pp

A drop of more than 2.0% fails.

Failures

  • The share of local targets within 10% falls from 79.4% to 75.1%, over the 11228 targets both builds have, by more than the 2.0% allowed.

Notes

  • The base log ends at epoch 30 and the head's at 31: one of them saves the final epoch (Save the calibrated weights from the final optimiser step #594).
  • 20 national targets are new: hmrc/capital_gains_band_10000, hmrc/capital_gains_band_3000, hmrc/capital_gains_band_6000, hmrc/cgt_taxpayers_band_10000, hmrc/cgt_taxpayers_band_3000, hmrc/cgt_taxpayers_band_6000, ons/east_age_80_plus, ons/east_midlands_age_80_plus, ons/female_80_plus, ons/london_age_80_plus
  • 17 national targets are gone: obr/ni, ons/east_age_80_89, ons/east_midlands_age_80_89, ons/female_80_84, ons/female_85_90, ons/london_age_80_89, ons/male_80_84, ons/male_85_90, ons/north_east_age_80_89, ons/north_west_age_80_89
  • 46 national targets are in a better band on the head.

National targets in a worse error band on the head (37)

Target Base Head
dwp/uc/claimants_with_5+_children within 10% 25-50%
dwp/scotland_uc_households_child_under_1 within 10% 10-25%
dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_1_200_to_2_400 within 10% 10-25%
dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_24_000_to_25_200 within 10% 10-25%
dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_25_200_to_26_400 within 10% 10-25%
dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600 25-50% 50-100%
dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_4_800_to_6_000 within 10% 10-25%
dwp/uc_payment_dist/LONE_PARENT_annual_payment_20_400_to_21_600 within 10% 10-25%
dwp/uc_payment_dist/LONE_PARENT_annual_payment_8_400_to_9_600 within 10% 10-25%
hmrc/dividend_income_count_income_band_50_000_to_70_000 10-25% 25-50%
hmrc/employment_income_count_income_band_200_000_to_300_000 within 10% 10-25%
hmrc/employment_income_income_band_20_000_to_30_000 10-25% 25-50%
hmrc/private_pension_income_count_income_band_200_000_to_300_000 25-50% 50-100%
hmrc/private_pension_income_count_income_band_300_000_to_500_000 10-25% 25-50%
hmrc/private_pension_income_income_band_20_000_to_30_000 within 10% 10-25%
hmrc/property_income_count_income_band_100_000_to_150_000 25-50% 50-100%
hmrc/property_income_count_income_band_150_000_to_200_000 25-50% 50-100%
hmrc/property_income_count_income_band_40_000_to_50_000 25-50% 50-100%
hmrc/property_income_income_band_15_000_to_20_000 within 10% 10-25%
hmrc/self_employment_income_count_income_band_300_000_to_500_000 within 10% 10-25%
hmrc/self_employment_income_income_band_50_000_to_70_000 within 10% 10-25%
hmrc/state_pension_income_band_500_000_to_1_000_000 within 10% 10-25%
hmrc/state_pension_income_band_70_000_to_100_000 within 10% 10-25%
obr/esa within 10% 10-25%
obr/statutory_maternity_pay within 10% 10-25%
ons/corporate_land_value within 10% 10-25%
ons/female_50_54 within 10% 10-25%
ons/female_55_59 within 10% 10-25%
ons/household_land_value/YORKSHIRE within 10% 10-25%
ons/london_age_0_9 10-25% 25-50%

7 more in the job log.

Flags are for review: builds of the same code move 2 to 12 national targets to a worse band (#598). Bands are of |estimate / target - 1|; no target's estimate or error is published.

Workflow run

Income distribution and single ages against the base build: pass

HBAI FYE 2025 (DWP), period 2024: equivalised income in £ a week, rates and Gini in per cent. A value outside HBAI's 95% interval is marked (outside).

Measure Base Head HBAI 95% interval
median_bhc 665.96 (outside) 678.78 (outside) 719.48 703.57 to 735.58
median_ahc 571.27 (outside) 584.61 (outside) 623.14 605.21 to 637.07
mean_bhc 783.20 (outside) 802.19 (outside) 854.98 836.37 to 870.35
mean_ahc 674.61 (outside) 693.44 (outside) 749.82 732.33 to 764.50
gini_bhc 33.18 33.20 32.74 31.89 to 33.98
gini_ahc 38.65 (outside) 38.46 (outside) 36.78 35.90 to 38.29
relative_low_income_bhc_all 18.37 (outside) 17.94 (outside) 15.91 14.45 to 17.64
relative_low_income_bhc_children 23.75 23.21 20.52 17.36 to 23.96
relative_low_income_bhc_working_age 17.88 (outside) 17.23 (outside) 14.28 12.91 to 16.02
relative_low_income_bhc_pensioners 13.30 (outside) 14.01 15.90 13.69 to 17.99
relative_low_income_ahc_all 23.56 (outside) 23.15 (outside) 19.64 17.99 to 21.27
relative_low_income_ahc_children 33.39 (outside) 32.60 (outside) 27.41 23.49 to 30.64
relative_low_income_ahc_working_age 23.46 (outside) 22.88 (outside) 18.58 17.01 to 20.34
relative_low_income_ahc_pensioners 11.40 (outside) 12.38 13.87 11.62 to 15.90
Single ages against the ONS projection Base Head
Mean error, ages 0 to 79 10.7% 11.0%
Largest error, ages 0 to 79 42.1% 44.1%
Largest error, ages 15 to 19 37.4% 37.7%

Flags

None.

These measures report and flag but do not fail yet: their same-code spread is unmeasured (#598).

Aggregate impact of the data change: pass

Base dataset enhanced_frs_2024_25.h5 (the base's build, sha256 4c171915fbaa) against head dataset enhanced_frs_2024_25.h5 (this pull request's build, sha256 1eb22f3a373f), both measured with policyengine-uk 2.122.2, fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 4 failing on both sides, 0 fixed. Moves flagged for review: 446 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • The check sign:sda no longer applies on the head: 2025-26: not checked, from fewer than 10 records
  • The check sign:dfe_education_spending no longer applies on the head: 2025-26: not checked, from fewer than 10 records
  • In the years a figure from fewer than 10 records is suppressed (spending.dfe_education_spending, spending.disabled_students_allowance, spending.sda), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

Measure Year Base Head Change
Capital gains tax 2031-32 £67.23bn £30.98bn -£36.25bn
Capital gains tax 2030-31 £64.72bn £29.89bn -£34.83bn
Capital gains tax 2029-30 £62.20bn £28.83bn -£33.36bn
Capital gains tax 2028-29 £59.90bn £27.86bn -£32.04bn
Capital gains tax 2027-28 £57.63bn £26.90bn -£30.73bn
Capital gains tax 2026-27 £55.37bn £25.95bn -£29.42bn
Capital gains tax 2025-26 £53.35bn £25.10bn -£28.25bn
Income tax 2025-26 £280.16bn £298.23bn +£18.07bn
Income tax 2026-27 £298.50bn £317.70bn +£19.20bn
Income tax 2027-28 £313.53bn £333.66bn +£20.13bn
Income tax 2028-29 £327.06bn £348.05bn +£20.99bn
Income tax 2029-30 £342.06bn £363.99bn +£21.94bn
Income tax 2030-31 £358.46bn £381.37bn +£22.91bn
Income tax 2031-32 £377.14bn £401.24bn +£24.10bn
National Insurance (employer) 2025-26 £144.43bn £151.23bn +£6.79bn
National Insurance (employer) 2029-30 £166.01bn £173.80bn +£7.80bn
National Insurance (employer) 2026-27 £150.60bn £157.67bn +£7.07bn
National Insurance (employer) 2030-31 £171.21bn £179.24bn +£8.03bn
National Insurance (employer) 2027-28 £155.28bn £162.56bn +£7.28bn
National Insurance (employer) 2031-32 £177.95bn £186.30bn +£8.34bn
National Insurance (employer) 2028-29 £159.61bn £167.08bn +£7.47bn
VAT 2025-26 £311.20bn £323.95bn +£12.75bn
VAT 2027-28 £327.17bn £340.57bn +£13.41bn
VAT 2026-27 £319.57bn £332.67bn +£13.09bn
VAT 2029-30 £343.25bn £357.32bn +£14.06bn
VAT 2028-29 £335.05bn £348.77bn +£13.73bn
VAT 2030-31 £351.69bn £366.10bn +£14.41bn
VAT 2031-32 £360.27bn £375.03bn +£14.76bn
Household market income 2030-31 £2,029.30bn £1,951.71bn -£77.59bn
Household market income 2031-32 £2,104.03bn £2,023.72bn -£80.31bn
Household market income 2028-29 £1,900.00bn £1,827.63bn -£72.37bn
Household market income 2029-30 £1,967.62bn £1,893.14bn -£74.47bn
Household market income 2027-28 £1,846.37bn £1,776.93bn -£69.44bn
Household market income 2025-26 £1,726.69bn £1,661.88bn -£64.81bn
Household market income 2026-27 £1,790.77bn £1,724.14bn -£66.63bn
State Pension 2031-32 £150.88bn £156.20bn +£5.31bn
State Pension 2028-29 £138.28bn £143.14bn +£4.87bn
State Pension 2029-30 £142.36bn £147.37bn +£5.01bn
State Pension 2030-31 £146.57bn £151.73bn +£5.16bn
State Pension 2027-28 £136.12bn £140.80bn +£4.69bn

406 more flags are in the report artifact.

Receipts by tax head

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax +£18.07bn +£19.20bn +£20.13bn +£20.99bn +£21.94bn +£22.91bn +£24.10bn
National Insurance (employee and self-employed) +£2.07bn +£2.14bn +£2.20bn +£2.25bn +£2.32bn +£2.38bn +£2.47bn
National Insurance (employer) +£6.79bn +£7.07bn +£7.28bn +£7.47bn +£7.80bn +£8.03bn +£8.34bn
Capital gains tax -£28.25bn -£29.42bn -£30.73bn -£32.04bn -£33.36bn -£34.83bn -£36.25bn
Student loan repayments +£366.2m +£380.1m +£390.6m +£400.4m +£411.0m +£422.8m +£260.4m
VAT +£12.75bn +£13.09bn +£13.41bn +£13.73bn +£14.06bn +£14.41bn +£14.76bn
Fuel duties +£98 -£361 +£75 -£80 -£493 -£186 -£278
TV licence fee +£96.3m +£98.5m +£99.6m +£99.6m +£100.0m +£100.2m +£101.0m
Council tax +£1.10bn +£1.16bn +£1.24bn +£1.32bn +£1.40bn +£1.48bn +£1.49bn
High value council tax surcharge 0 0 0 +£54.9m +£56.2m +£57.6m +£59.0m
Northern Ireland domestic rates +£12.2m +£12.8m +£13.4m +£14.0m +£14.7m +£15.4m +£15.5m
Business rates -£83 +£2,609 +£399 -£9,541 +£220 -£1,842 +£1,906
Stamp duty land tax (own purchases, and corporate until the +£60.8m +£69.8m +£75.4m +£81.7m +£88.8m +£98.3m +£108.8m
Land transaction tax (Wales) +£0.7m +£0.7m +£0.8m +£0.8m +£0.9m +£1.0m +£1.0m
Land and buildings transaction tax (Scotland) -£0.7m -£0.7m -£0.7m -£0.7m -£0.7m -£0.6m -£0.6m

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension +£4.33bn +£4.53bn +£4.69bn +£4.87bn +£5.01bn +£5.16bn +£5.31bn
Pension Credit +£25.6m +£25.3m +£21.1m +£6.4m +£4.6m +£4.2m -£8.8m
Winter Fuel Payment +£53.2m +£54.1m +£51.6m +£49.5m +£48.8m +£49.1m +£49.1m
Pension Age Winter Heating Payment (Scotland) +£0.6m +£0.8m +£0.9m +£0.8m +£0.8m +£0.9m +£0.9m
Universal Credit +£1.48bn +£1.59bn +£1.65bn +£1.73bn +£1.70bn +£1.54bn +£1.54bn
Housing Benefit +£78.9m +£85.9m +£84.0m +£85.9m +£91.2m +£92.3m +£82.6m
Council Tax Reduction +£18.8m +£16.8m +£19.1m +£16.3m +£16.3m +£16.8m +£17.9m
Employment and Support Allowance (income-related) -£42.5m -£43.6m -£44.7m -£45.9m -£47.0m -£48.1m -£49.3m
Employment and Support Allowance (contribution-based) +£152.9m +£157.0m +£160.7m +£164.6m +£168.6m +£172.8m +£177.0m
Jobseeker's Allowance (income-based) +£0.7m 0 0 0 0 0 0
Jobseeker's Allowance (contribution-based) -£10.2m -£10.4m -£10.7m -£10.9m -£11.2m -£11.5m -£11.8m
Income Support +£6.7m 0 0 0 0 0 0
Personal Independence Payment +£290.6m +£302.9m +£311.0m +£318.5m +£326.3m +£334.3m +£342.4m
Disability Living Allowance -£172.2m -£179.4m -£184.2m -£188.7m -£193.3m -£198.0m -£202.9m
Attendance Allowance +£401.8m +£418.7m +£429.9m +£440.3m +£451.1m +£462.1m +£473.4m
Carer's Allowance +£62.5m +£65.2m +£66.9m +£68.5m +£70.2m +£71.9m +£73.7m
Carer Support Payment (Scotland) -£60.7m -£63.2m -£64.9m -£66.5m -£68.1m -£69.8m -£71.5m
Carer's Allowance Supplement (Scotland) 0 -£8.6m -£8.6m -£8.6m -£8.7m -£8.7m -£8.7m
Severe Disablement Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Industrial Injuries Disablement Benefit +£23.2m +£23.8m +£24.4m +£25.0m +£25.6m +£26.2m +£26.8m
Armed Forces Compensation Scheme +£76.7m +£78.8m +£80.7m +£82.6m +£84.6m +£86.7m +£88.8m
Child Benefit +£44.1m +£43.8m +£43.4m +£44.8m +£53.8m +£55.2m +£56.2m
Scottish Child Payment -£48.2m -£50.3m -£51.7m -£53.0m -£53.7m -£55.0m -£55.3m
Healthy Start vouchers -£0.2m -£0.2m -£0.2m -£0.2m -£0.2m -£0.2m -£0.2m
Statutory Maternity Pay +£386.8m +£397.2m +£406.7m +£416.4m +£426.6m +£437.1m +£447.8m
Statutory Sick Pay +£15.8m +£16.2m +£16.6m +£17.0m +£17.4m +£17.9m +£18.3m
Sure Start Maternity Grant -£0.3m -£0.3m -£0.3m -£0.3m -£0.3m -£0.3m -£0.3m
Bereavement Support Payment +£7.4m +£7.6m +£7.7m +£7.9m +£8.1m +£8.3m +£8.5m
Tax-Free Childcare +£10.0m +£3.8m +£3.9m +£3.8m +£5.7m -£3.7m -£6.8m
Extended childcare entitlement -£61.9m -£80.7m -£79.1m -£83.0m -£74.4m -£123.0m -£94.4m
Universal childcare entitlement -£8.3m -£3.1m -£2.9m +£0.4m -£4.3m -£3.3m -£0.6m
Targeted childcare entitlement +£7.0m +£7.3m +£7.5m +£7.6m +£7.8m +£7.3m +£19.7m
Parents' Learning Allowance +£0.2m +£0.2m +£0.2m +£0.2m +£0.2m +£0.2m +£0.2m
Adult Dependants' Grant +£1.3m +£1.3m -£1.0m -£1.0m -£1.0m -£1.0m -£0.9m
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
NHS spending +£4.22bn +£4.23bn +£4.25bn +£4.27bn +£4.28bn +£4.30bn +£4.32bn
State education spending suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Transport subsidy spending -£53 -£55 -£110 -£161 -£147 -£73 +£25

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension +372.6k +372.1k +372.0k +376.9k +378.6k +380.3k +381.9k
Pension Credit +12.5k +21.0k +14.6k +14.2k +15.4k +17.3k +15.0k
Winter Fuel Payment +184.9k +189.4k +180.3k +169.6k +166.4k +168.3k +168.8k
Pension Age Winter Heating Payment (Scotland) +4.6k +4.4k +4.8k +4.5k +4.5k +4.5k +4.6k
Universal Credit +84.2k +85.5k +89.6k +87.0k +84.5k +88.4k +84.0k
Housing Benefit +16.0k +16.2k +15.7k +15.5k +15.9k +15.9k +15.1k
Council Tax Reduction +59.7k +58.5k +58.8k +55.2k +57.5k +57.7k +67.4k
Employment and Support Allowance (income-related) -2.3k -2.4k -2.4k -2.4k -2.4k -2.4k -2.4k
Employment and Support Allowance (contribution-based) +20.7k +20.7k +20.8k +20.9k +21.0k +21.1k +21.2k
Jobseeker's Allowance (income-based) +194 0 0 0 0 0 0
Jobseeker's Allowance (contribution-based) -2.3k -2.3k -2.3k -2.4k -2.4k -2.4k -2.4k
Income Support +86 0 0 0 0 0 0
Personal Independence Payment +47.5k +47.7k +47.9k +48.0k +48.3k +48.5k +48.7k
Disability Living Allowance -27.0k -27.1k -27.2k -27.3k -27.5k -27.6k -27.7k
Attendance Allowance +78.2k +78.5k +78.8k +79.1k +79.4k +79.8k +80.1k
Carer's Allowance +14.4k +14.5k +14.5k +14.6k +14.7k +14.7k +14.8k
Carer Support Payment (Scotland) -14.0k -14.1k -14.1k -14.2k -14.2k -14.3k -14.4k
Carer's Allowance Supplement (Scotland) 0 -14.1k -14.1k -14.2k -14.2k -14.3k -14.4k
Severe Disablement Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Industrial Injuries Disablement Benefit +6.9k +7.0k +7.0k +7.0k +7.0k +7.1k +7.1k
Armed Forces Compensation Scheme +9.3k +9.3k +9.4k +9.4k +9.4k +9.5k +9.5k
Child Benefit +21.5k +20.5k +19.1k +19.3k +24.7k +24.8k +24.6k
Scottish Child Payment -34.1k -34.3k -34.4k -34.6k -34.3k -34.5k -34.0k
Healthy Start vouchers -721 -724 -727 -730 -733 -736 -739
Statutory Maternity Pay +16.8k +16.8k +16.9k +17.0k +17.0k +17.1k +17.2k
Statutory Sick Pay +2.2k +2.3k +2.3k +2.3k +2.3k +2.3k +2.3k
Sure Start Maternity Grant -507 -509 -511 -513 -515 -517 -520
Bereavement Support Payment -2.2k -2.3k -2.3k -2.3k -2.3k -2.3k -2.3k
Tax-Free Childcare +10.2k +8.4k +7.1k +6.6k +11.7k +1.3k -3.1k
Extended childcare entitlement -13.4k -15.1k -14.3k -15.3k -13.0k -30.6k -12.3k
Universal childcare entitlement -2.4k -866 -795 +95 -1.1k -855 -159
Targeted childcare entitlement +1.4k +1.5k +1.5k +1.5k +1.5k +1.3k +3.6k
Parents' Learning Allowance +116 +116 +117 +117 +118 +118 +119
Adult Dependants' Grant +365 +366 -283 -284 -285 -286 -242
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Government balance, each component counted once

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once +£13.07bn +£13.81bn +£14.10bn +£14.37bn +£14.83bn +£15.08bn +£15.45bn
Government spending +£11.29bn † +£11.61bn † +£11.87bn † +£12.16bn † +£12.35bn † +£12.33bn † +£12.55bn †
Government balance, each receipt once +£1.78bn † +£2.19bn † +£2.23bn † +£2.22bn † +£2.48bn † +£2.75bn † +£2.90bn †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax +£13.07bn +£13.81bn +£14.10bn +£14.37bn +£14.83bn +£15.08bn +£15.45bn
household_tax -£6.48bn -£6.36bn -£6.58bn -£6.83bn -£7.03bn -£7.36bn -£7.65bn
pre_budget_change_household_tax -£6.84bn -£6.74bn -£6.97bn -£7.28bn -£7.50bn -£7.84bn -£7.97bn
gov_spending +£11.29bn † +£11.61bn † +£11.87bn † +£12.16bn † +£12.35bn † +£12.33bn † +£12.55bn †
household_benefits +£11.29bn † +£11.61bn † +£11.87bn † +£12.16bn † +£12.35bn † +£12.33bn † +£12.55bn †
gov_balance +£1.78bn † +£2.19bn † +£2.23bn † +£2.22bn † +£2.48bn † +£2.75bn † +£2.90bn †

Components the model counts twice

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt -£1 +£259 +£63 -£954 +£16 -£181 +£202

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income -£64.81bn -£66.63bn -£69.44bn -£72.37bn -£74.47bn -£77.59bn -£80.31bn
Household net income -£47.22bn † -£48.84bn † -£51.18bn † -£53.58bn † -£56.14bn † -£58.96bn † -£61.22bn †
Household net income (HBAI definition) suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Population

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People +1,134.3k +1,138.6k +1,142.8k +1,147.4k +1,152.4k +1,157.6k +1,162.6k
Benefit units +631.5k +633.9k +636.3k +638.8k +641.6k +644.5k +647.3k
Households +668.3k +670.8k +673.3k +676.0k +679.0k +682.0k +685.0k

Poverty rates

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed

People in poverty

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Inequality

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Mean household net income in each side's own deciles

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 2: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 3: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 4: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 5: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 6: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 7: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 8: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 9: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 10: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp +£252.1m +£260.0m +£266.1m +£272.1m +£279.0m +£285.0m +£294.1m
Raise higher rate by 1pp +£309.6m +£329.5m +£345.5m +£360.6m +£381.3m +£400.0m +£415.3m
Raise personal allowance by ~800GBP/year -£106.8m -£104.2m -£104.3m -£106.6m -£99.6m -£101.5m -£41.1m
Raise child benefit by 25GBP/week per additional child -£1.6m -£3.5m -£3.8m -£5.5m -£5.6m -£5.2m -£5.8m
Reduce Universal Credit taper rate to 20% -£290.2m -£298.5m -£297.3m -£290.4m -£295.0m -£303.4m -£319.9m
Raise Class 1 main employee NICs rate to 10% +£376.5m +£382.0m +£388.4m +£397.1m +£404.2m +£409.1m +£422.8m
Raise VAT standard rate by 2pp +£1.26bn +£1.29bn +£1.32bn +£1.35bn +£1.39bn +£1.42bn +£1.46bn
Raise additional rate by 3pp +£239.7m +£258.6m +£273.8m +£288.9m +£302.7m +£319.7m +£345.3m
Raise the Universal Credit standard allowance by 10% -£55.3m -£60.8m -£65.8m -£69.9m -£70.0m -£72.0m -£73.8m
Raise the State Pension by 10% -£367.5m -£379.0m -£399.1m -£414.1m -£424.2m -£437.5m -£457.2m

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax +£253.1m +£261.7m +£267.7m +£273.5m +£280.7m +£287.4m +£296.2m
Raise higher rate by 1pp: change in income_tax +£310.1m +£330.1m +£346.3m +£361.3m +£382.0m +£400.6m +£416.1m
Raise personal allowance by ~800GBP/year: change in income_tax -£139.2m -£138.4m -£139.6m -£143.6m -£138.3m -£142.0m -£57.8m
Raise child benefit by 25GBP/week per additional child: change in child_benefit +£6.7m +£5.9m +£5.8m +£5.6m +£5.3m +£5.0m +£4.7m
Reduce Universal Credit taper rate to 20%: change in universal_credit +£288.6m +£296.7m +£295.4m +£288.5m +£294.1m +£301.9m +£318.1m
Raise Class 1 main employee NICs rate to 10%: change in national_insurance +£377.2m +£386.2m +£393.8m +£399.9m +£407.5m +£413.5m +£426.0m
Raise VAT standard rate by 2pp: change in vat +£1.26bn +£1.29bn +£1.32bn +£1.35bn +£1.39bn +£1.42bn +£1.46bn
Raise additional rate by 3pp: change in income_tax +£239.7m +£258.6m +£273.8m +£288.9m +£302.7m +£319.7m +£345.3m
Raise the Universal Credit standard allowance by 10%: change in universal_credit +£55.4m +£60.9m +£65.5m +£69.6m +£69.7m +£71.8m +£74.0m
Raise the State Pension by 10%: change in state_pension +£433.3m +£452.7m +£468.6m +£486.7m +£501.1m +£515.9m +£531.1m

Household net income by decile

The datasets hold different households, so households are not matched; compare the mean income in each side's own deciles.

Checks failing on both base and head (4)
  • Each model total's components are exactly the partition's heads and declared double counts (closure): gov_spending: the partition puts 'healthy_start_vouchers' in this total, but the model does not add it; gov_spending: the partition puts 'scottish_child_payment' in this total, but the model does not add it; gov_spending: the partition puts 'statutory_paternity_pay' in this total, but the model does not add it
  • VAT is never negative (sign:vat): 2025-26: 67 units below zero, a weighted £-80,645,124 in total; 2026-27: 67 units below zero, a weighted £-82,813,467 in total; 2027-28: 67 units below zero, a weighted £-84,782,272 in total
  • The partition's heads and declared double counts add up to gov_spending (identity:gov_spending): 2025-26: 358 households differ, by a weighted £537,912,139 in total (households holding a figure from fewer than 10 records aren't checked this year); 2026-27: 360 households differ, by a weighted £559,003,978 in total (households holding a figure from fewer than 10 records aren't checked this year); 2027-28: 360 households differ, by a weighted £572,626,660 in total (households holding a figure from fewer than 10 records aren't checked this year)
  • The partition's heads and declared double counts add up to household_benefits (identity:household_benefits): 2025-26: 1,819 households differ, by a weighted £92,232,364 in total (households holding a figure from fewer than 10 records aren't checked this year); 2026-27: 1,791 households differ, by a weighted £94,164,626 in total (households holding a figure from fewer than 10 records aren't checked this year); 2027-28: 1,739 households differ, by a weighted £94,519,139 in total (households holding a figure from fewer than 10 records aren't checked this year)
Counted-once check

Counted-once check not run: not requested.

Provenance
Side Commit Runtime Environment hash Partition hash Time
base policyengi uk 2.122.2 (files 0cb87d75a516), core 3.32.13, py 3.13.16 x86_64 038f9f2c132e e8ea8a019873 224.27s
head policyengi uk 2.122.2 (files 0cb87d75a516), core 3.32.13, py 3.13.16 x86_64 038f9f2c132e e8ea8a019873 156.06s

Base dataset: enhanced_frs_2024_25.h5, sha256 4c171915fbaac929f2cdb8af4070527c5e8f1fd693b40266b36a5fc4149aa820, the base's build.

Head dataset: enhanced_frs_2024_25.h5, sha256 1eb22f3a373f9fb74b33c64f6da8aa97c5a8d1ef8c298e81d3986853ec896c54, this pull request's build.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax £298.23bn £317.70bn £333.66bn £348.05bn £363.99bn £381.37bn £401.24bn
National Insurance (employee and self-employed) £51.17bn £53.37bn £55.12bn £56.71bn £58.62bn £60.43bn £62.76bn
National Insurance (employer) £151.23bn £157.67bn £162.56bn £167.08bn £173.80bn £179.24bn £186.30bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £25.10bn £25.95bn £26.90bn £27.86bn £28.83bn £29.89bn £30.98bn
Student loan repayments £7.71bn £8.00bn £8.23bn £8.43bn £8.66bn £8.90bn £8.29bn
VAT £323.95bn £332.67bn £340.57bn £348.77bn £357.32bn £366.10bn £375.03bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.04bn £24.14bn £26.10bn £26.16bn £25.89bn £25.24bn £25.82bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.50bn £4.66bn £4.68bn £4.70bn £4.72bn £4.74bn £4.77bn
Council tax £48.71bn £51.55bn £54.81bn £58.35bn £61.87bn £65.55bn £65.83bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.69bn £0.71bn £0.72bn £0.74bn
Northern Ireland domestic rates £1.12bn £1.18bn £1.23bn £1.29bn £1.35bn £1.42bn £1.42bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax (own purchases, and corporate until the £19.69bn £20.58bn £21.55bn £22.53bn £23.54bn £24.66bn £25.86bn
Land transaction tax (Wales) £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Land and buildings transaction tax (Scotland) £0.06bn £0.06bn £0.06bn £0.06bn £0.07bn £0.07bn £0.07bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension £133.44bn £138.52bn £140.80bn £143.14bn £147.37bn £151.73bn £156.20bn
Pension Credit £6.54bn £7.14bn £7.03bn £7.08bn £7.18bn £7.29bn £7.30bn
Winter Fuel Payment £1.69bn £1.66bn £1.62bn £1.59bn £1.58bn £1.58bn £1.57bn
Pension Age Winter Heating Payment (Scotland) £0.09bn £0.09bn £0.09bn £0.10bn £0.10bn £0.10bn £0.10bn
Universal Credit £78.86bn £83.07bn £84.89bn £86.44bn £87.37bn £84.57bn £85.07bn
Housing Benefit £8.34bn £8.67bn £8.87bn £9.07bn £9.35bn £9.59bn £9.55bn
Council Tax Reduction £2.17bn £2.23bn £2.30bn £2.36bn £2.42bn £2.50bn £2.46bn
Employment and Support Allowance (income-related) £3.20bn £3.28bn £3.36bn £3.43bn £3.52bn £3.60bn £3.69bn
Employment and Support Allowance (contribution-based) £4.74bn £4.87bn £4.99bn £5.11bn £5.23bn £5.36bn £5.49bn
Jobseeker's Allowance (income-based) £0.05bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.29bn £0.30bn £0.31bn £0.32bn £0.32bn £0.33bn
Income Support £0.17bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £30.45bn £31.73bn £32.58bn £33.37bn £34.18bn £35.02bn £35.88bn
Disability Living Allowance £8.12bn £8.46bn £8.69bn £8.90bn £9.11bn £9.34bn £9.57bn
Attendance Allowance £7.78bn £8.11bn £8.33bn £8.53bn £8.74bn £8.95bn £9.17bn
Carer's Allowance £3.98bn £4.15bn £4.26bn £4.36bn £4.47bn £4.58bn £4.69bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.33bn £0.34bn £0.34bn £0.35bn £0.36bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Severe Disablement Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Industrial Injuries Disablement Benefit £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £0.70bn £0.72bn
Armed Forces Compensation Scheme £0.59bn £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.68bn
Child Benefit £16.35bn £16.99bn £17.41bn £17.81bn £18.23bn £18.67bn £19.07bn
Scottish Child Payment £0.48bn £0.50bn £0.51bn £0.53bn £0.53bn £0.55bn £0.56bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.06bn £0.06bn £0.06bn £0.06bn £0.06bn £0.06bn £0.06bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.83bn £3.94bn £4.03bn £4.13bn £4.23bn £4.33bn £4.44bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £0.97bn £0.99bn £1.02bn £1.04bn £1.07bn £1.09bn £1.12bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £1.13bn £1.16bn £1.18bn £1.21bn £1.24bn £1.27bn £1.30bn
Tax-Free Childcare £0.45bn £0.44bn £0.44bn £0.45bn £0.46bn £0.47bn £0.47bn
Extended childcare entitlement £3.76bn £4.17bn £4.29bn £4.40bn £4.52bn £4.69bn £4.82bn
Universal childcare entitlement £1.51bn £1.59bn £1.64bn £1.68bn £1.72bn £1.75bn £1.79bn
Targeted childcare entitlement £0.37bn £0.38bn £0.39bn £0.40bn £0.41bn £0.41bn £0.41bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.19bn £0.19bn £0.19bn £0.19bn £0.19bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £208.41bn £209.21bn £209.98bn £210.82bn £211.75bn £212.70bn £213.61bn
State education spending suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £30.94bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension 11,747k 11,641k 11,395k 11,305k 11,355k 11,406k 11,455k
Pension Credit 1,369k 1,392k 1,346k 1,329k 1,328k 1,326k 1,307k
Winter Fuel Payment 7,151k 7,028k 6,806k 6,672k 6,649k 6,618k 6,607k
Pension Age Winter Heating Payment (Scotland) 709k 702k 689k 683k 686k 689k 692k
Universal Credit 6,372k 6,402k 6,428k 6,430k 6,405k 6,394k 6,371k
Housing Benefit 1,211k 1,208k 1,203k 1,199k 1,204k 1,204k 1,201k
Council Tax Reduction 3,612k 3,639k 3,681k 3,705k 3,727k 3,748k 3,722k
Employment and Support Allowance (income-related) 310k 311k 312k 313k 315k 316k 317k
Employment and Support Allowance (contribution-based) 668k 670k 673k 675k 678k 681k 684k
Jobseeker's Allowance (income-based) 9k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 60k 60k 60k 61k 61k 61k 61k
Income Support 26k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 4,136k 4,151k 4,167k 4,183k 4,202k 4,221k 4,239k
Disability Living Allowance 1,332k 1,337k 1,342k 1,347k 1,353k 1,359k 1,365k
Attendance Allowance 1,538k 1,544k 1,550k 1,556k 1,563k 1,570k 1,577k
Carer's Allowance 919k 922k 926k 929k 933k 938k 942k
Carer Support Payment (Scotland) 71k 71k 71k 72k 72k 72k 73k
Carer's Allowance Supplement (Scotland) 0k 71k 71k 72k 72k 72k 73k
Severe Disablement Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Industrial Injuries Disablement Benefit 158k 159k 159k 160k 161k 161k 162k
Armed Forces Compensation Scheme 66k 66k 67k 67k 67k 68k 68k
Child Benefit 7,955k 7,969k 7,983k 8,009k 8,036k 8,067k 8,080k
Scottish Child Payment 339k 341k 342k 343k 341k 343k 342k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 231k 231k 232k 233k 234k 235k 236k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 303k 305k 306k 307k 308k 310k 311k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 151k 152k 153k 153k 154k 155k 155k
Sure Start Maternity Grant 22k 22k 22k 23k 23k 23k 23k
Bereavement Support Payment 183k 183k 184k 185k 186k 186k 187k
Tax-Free Childcare 966k 951k 951k 957k 934k 945k 934k
Extended childcare entitlement 792k 783k 790k 793k 795k 804k 823k
Universal childcare entitlement 438k 449k 451k 453k 454k 453k 456k
Targeted childcare entitlement 76k 77k 77k 77k 78k 76k 75k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 95k 95k 95k 96k 96k 97k 97k
Adult Dependants' Grant 17k 17k 15k 15k 15k 15k 14k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £987.26bn £1,029.27bn £1,067.22bn £1,102.43bn £1,141.11bn £1,180.09bn £1,220.86bn
Government spending £554.16bn † £568.84bn † £576.31bn † £583.70bn † £592.69bn † £598.22bn † £611.75bn †
Government balance, each receipt once £433.10bn † £460.43bn † £490.91bn † £518.72bn † £548.42bn † £581.87bn † £609.11bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £990.39bn £1,032.40bn £1,070.35bn £1,105.56bn £1,144.24bn £1,183.22bn £1,223.99bn
household_tax £515.21bn £542.06bn £567.22bn £589.70bn £613.12bn £637.88bn £662.67bn
pre_budget_change_household_tax £507.50bn £534.06bn £558.99bn £580.58bn £603.76bn £628.25bn £653.63bn
gov_spending £554.16bn † £568.84bn † £576.31bn † £583.70bn † £592.69bn † £598.22bn † £611.75bn †
household_benefits £554.16bn † £568.84bn † £576.31bn † £583.70bn † £592.69bn † £598.22bn † £611.75bn †
gov_balance £436.23bn † £463.56bn † £494.04bn † £521.85bn † £551.55bn † £585.00bn † £612.24bn †
Components the model counts twice: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,661.88bn £1,724.14bn £1,776.93bn £1,827.63bn £1,893.14bn £1,951.71bn £2,023.72bn
Household net income £1,660.38bn † £1,708.92bn † £1,742.86bn † £1,777.39bn † £1,813.07bn † £1,851.04bn † £1,909.28bn †
Household net income (HBAI definition) suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 70,734k 71,003k 71,266k 71,551k 71,866k 72,189k 72,500k
Benefit units 38,921k 39,069k 39,213k 39,370k 39,543k 39,721k 39,892k
Households 32,059k 32,181k 32,300k 32,430k 32,572k 32,719k 32,860k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Absolute poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, before housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: everyone suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: children suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: working-age adults suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Relative poverty, after housing costs: pensioners suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 2: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 3: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 4: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 5: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 6: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 7: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 8: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 9: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Decile 10: mean household_net_income per household suppressed suppressed suppressed suppressed suppressed suppressed suppressed
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.04bn £6.31bn £6.52bn £6.71bn £6.91bn £7.14bn £7.40bn
Raise higher rate by 1pp £3.76bn £4.06bn £4.30bn £4.52bn £4.78bn £5.07bn £5.29bn
Raise personal allowance by ~800GBP/year £-3.59bn £-3.70bn £-3.80bn £-3.86bn £-3.91bn £-3.98bn £-1.67bn
Raise child benefit by 25GBP/week per additional child £-2.05bn £-1.82bn £-1.69bn £-1.59bn £-1.48bn £-1.37bn £-1.26bn
Reduce Universal Credit taper rate to 20% £-16.79bn £-17.42bn £-17.67bn £-17.86bn £-17.92bn £-18.13bn £-18.16bn
Raise Class 1 main employee NICs rate to 10% £10.63bn £11.04bn £11.35bn £11.60bn £11.89bn £12.19bn £12.63bn
Raise VAT standard rate by 2pp £31.95bn £32.80bn £33.58bn £34.39bn £35.24bn £36.10bn £36.98bn
Raise additional rate by 3pp £3.28bn £3.53bn £3.74bn £3.95bn £4.19bn £4.44bn £4.80bn
Raise the Universal Credit standard allowance by 10% £-2.97bn £-3.11bn £-3.17bn £-3.22bn £-3.24bn £-3.28bn £-3.33bn
Raise the State Pension by 10% £-9.77bn £-10.02bn £-10.10bn £-10.19bn £-10.43bn £-10.68bn £-10.97bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.15bn £6.43bn £6.64bn £6.84bn £7.05bn £7.28bn £7.54bn
Raise higher rate by 1pp: change in income_tax £3.77bn £4.07bn £4.30bn £4.53bn £4.79bn £5.08bn £5.30bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.69bn £-3.81bn £-3.91bn £-3.98bn £-4.03bn £-4.11bn £-1.73bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.50bn £2.29bn £2.16bn £2.05bn £1.94bn £1.82bn £1.69bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £16.83bn £17.46bn £17.71bn £17.90bn £17.96bn £18.17bn £18.20bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £10.82bn £11.23bn £11.54bn £11.82bn £12.11bn £12.43bn £12.87bn
Raise VAT standard rate by 2pp: change in vat £31.95bn £32.80bn £33.58bn £34.39bn £35.24bn £36.10bn £36.98bn
Raise additional rate by 3pp: change in income_tax £3.28bn £3.53bn £3.74bn £3.95bn £4.19bn £4.44bn £4.80bn
Raise the Universal Credit standard allowance by 10%: change in universal_credit £2.97bn £3.12bn £3.17bn £3.22bn £3.25bn £3.29bn £3.33bn
Raise the State Pension by 10%: change in state_pension £13.34bn £13.85bn £14.08bn £14.31bn £14.74bn £15.17bn £15.62bn

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Release assembly handoff at 21d5dbf9de2d43ee1f0854146ad42a6484500c51 on release/uk-data-2026-10-19. All 14 approved heads were merged separately in the binding order, including #601 between #600/#602. Main remains a43e8c519 (1.58.2).

Local validation: make test 2,532 passed / 134 skipped / 1 expected failure, integration rerun 48 passed / 1 skipped, strict fit/distribution 41 passed, artifact guard 93 passed, coverage gate 29 passed / 1 skipped. Lock, formatting and changelog checks pass; policyengine-uk stays 2.122.2. Known-gap configuration reproduces 17 zero-signal / 3 duplicate targets; source replay independently confirms three duplicates. Fresh combined-matrix signals remain hub-build evidence.

Conflict resolutions preserve the selected coverage list, aggregate NIC exclusion, verified OBR loader and approved controlled-report allowlist. SPI and ONS production generators reproduce the approved bytes; OBR manifest differs only by removal of obr/ni. No local dataset build or production calibration ran. No survey data or weights were committed/pushed.

CI 39040600634 is complete: six checks passed; the calibration-fit comparison failed. Both builds, tests (2,662 passed / 4 skipped / 1 expected failure) and report production succeeded; all 30 coverage tests passed, including built-data coverage. CI does not print actual zero-signal/duplicate counts. The local share within 10% fell 79.4% → 75.1% (−4.3pp) across 11,228 common targets, exceeding the 2pp allowance; national share was 64.9% → 64.6% across 627 targets. Distribution comparison passed with no flags; aggregate checks passed with zero new broken checks, four failures on both sides and 446 flagged moves. This is the gate reporting a measured regression, with no missing-artifact or integration error indicated. Its cause remains unresolved; computations and gate thresholds were left unchanged. The hub must investigate it with the pending matched-seed build, considering #598. Full comparison.

The PR body includes the required #598 two-weight-set uncertainty, fewer-than-ten £1m+ records, annual-allowance limitation verbatim, and #589 size-table measure |old/new − 1|. Local evidence and recovery instructions are in .job/HANDOFF.md and .job/RESOLUTIONS.md; the hub can collect them from this workspace. The private Git metadata workaround is documented there; the pushed branch is the primary recovery source and a verified bundle is retained.

The combined seeded build and its before and after measurements are pending (hub, Mon 10/19 22:00Z at the earliest). Keep this PR draft for hub-owned final-head independent review, seeded build, measurements and release decision. This job has not marked it ready, merged it or published.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

UK hub: the fit-gate failure, broken down by target family (from the CI fit summaries, run 39040600634). All 11,228 common local targets are constituency targets. Shares within 10%, base against head:

Family n Base Head Change in count
hmrc/self_employment_income/amount 650 78.8% 41.8% −240
age/60_70 650 74.6% 53.2% −139
age/40_50 650 76.2% 58.6% −114
age/50_60 650 80.3% 67.8% −81
age/30_40 650 68.6% 57.7% −71
hmrc/employment_income/count 650 12.6% 7.4% −34
hmrc/employment_income/amount 650 53.2% 73.2% +130
uc_hh_0_children 650 80.9% 88.5% +49
hmrc/self_employment_income/count 650 86.6% 91.7% +33

The drop is concentrated in constituency self-employment amounts and working ages 30–70, while constituency employment amounts improve. It is about six times the same-code spread W3 measured, so it is not #598 noise.

The national aggregate moves look consistent with the members' intent, though that isn't verified:

Next (hub): seeded leave-one-out builds in the Monday hold (main, the release, the release without #557, the release without #604) to attribute the local drop. Then a merge decision. This release stays a draft until then.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Hub: release-only review at 21d5dbf9: APPROVE WITH NITS (independent GPT-6.1 Sol review, executed).

  • All 14 members are merged at their approved heads, and remerge diffs find exactly the three recorded resolutions.
  • The final matrix target selection equals Fail the calibration build on targets it drops or cannot fit #595 byte for byte, and Build OBR targets only from hash-verified EFO workbooks #592's resolution drops only obr/ni, keeping the other 24 targets and the hashes.
  • The SPI, ONS age and OBR manifest generators reproduce the committed bytes, and the lock matches main apart from this project's version.
  • make test: 2,532 passed, 134 skipped, 1 expected failure. CI: six pass, and the calibration-fit gate fails as known.
  • No release-only change explains the local fit drop. Attribution still waits on the seeded builds from Monday 10/19.

Nits:

  1. The artifact guard accepts a raw log copied over an allowed report name. Stop uploading raw calibration logs as public Actions artifacts #603 disclosed this limit, and nothing at this head does it. Filed as Workflow artifact guard accepts a raw log copied over an allowed report name #609.
  2. The £1m+ disclosure is now exactly the BATCH text; one apostrophe character differed. The PR body is updated.

This stays a draft until the attribution builds report.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Hub, 10/19 00:40Z: attribution status, and a release blocker found before merge.

The local fit drop. Seeded leave-one-out builds (#610–#617), all 32-epoch TESTING builds as in this PR's CI:

An independent investigation found no implementation defect in #571. Its prior raking of gain-bearing twins against the 12 CGT band targets shifts their pairs' mass at the start of calibration. Whether 512 epochs undo that is being measured in #618 (release) and #619 (−#571).

The release blocker. At production settings (TESTING unset, as in the publish workflow), #595's coverage gate stops the release build. Three UC payment bands have no signal and aren't excused for release builds:

  • dwp/uc_payment_dist/SINGLE_annual_payment_25_200_to_26_400
  • dwp/uc_payment_dist/SINGLE_annual_payment_27_600_to_28_800
  • dwp/uc_payment_dist/COUPLE_WITH_CHILDREN_annual_payment_27_600_to_28_800

That's runs 39180561028 and 39180562951, with and without #571. Zero signal is decided before calibration, so the seed and the epoch count don't affect it. This PR needs a release-only fix before merge. It stays a draft.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Hub, 01:05Z, update on the release blocker: the zero-signal set varies between release builds. A second production-setting run passed the three bands above, then lost dwp/uc_payment_dist/COUPLE_NO_CHILDREN_annual_payment_26_400_to_27_600, while another build of nearly the same code passed. This is #598's nondeterminism, but #595's known gaps allow patterns only for testing builds. So the release-only fix must name every top UC payment band (£24,000 and above, all four family types) as a release-build known gap, not only the bands one build lost. Bands that do have signal are only reported as stale, which is a warning.

This branch has not been deployed

No deployments
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