Repository navigation
Uprate benefits by the previous September's CPI - #2557
Conversation
Most benefits rise each April under the Social Security Administration Act 1992 s150 review, which measures prices by the CPI 12-month rate for the previous September (every Up-rating Order EM since April 2011; SI 2026/148 EM paras 6.4-6.5; HCWS1101). gov.benefit_uprating_cpi followed calendar-year CPI instead; it now follows gov.economic_assumptions.indices.september_cpi_uprating. The UC standard allowance and health element indices, built from it, follow September CPI as the Universal Credit Act 2025 requires. September 2026 CPI is 3.5% (ONS D7G7, 21 October 2026), so CPI-linked benefits rise 3.5% in April 2027 rather than 2.3%. Amounts outside the s150 prices review that were on the index keep their lagged calendar-year CPI projection, with the evidence in each file: the PC standard minimum guarantee (s150A) and savings credit threshold, the HB pension-age allowances, DfE funding rates and the council tax high value surcharge. IIDB moves from same-year CPI to the benefit index. Tests: property tests of the rate and index; every parameter on the index rises by September CPI after its last published value; a differential test that 22 CPI-linked series' published April rates from 2011 are the previous rate times the model's September CPI rise, rounded to 5p; triple lock tests updated for September 2026 being published; one HB test made explicit that its claimant does not claim UC (by 2030 a little UC would passport them). Fixes #2533. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Hand-off to the UK hub (session "September CPI benefit uprating", local_7d5c5e19-c54e-4c40-bea7-e72243a825d0).
|
|
UK hub note for the landing round (from the UK triple-lock project, 22 Oct): the cancelled scheduled job 🤖 Generated with Claude Code |
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 220 (thresholds in Notes
Moves flagged for review
180 more flags are in the report artifact. Receipts by tax head
Spending by benefit and service
Caseloads
Government balance, each component counted once
Model totals
Household income totals
Poverty rates
People in poverty
Inequality
Mean household net income in each side's own deciles
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileMean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.
No change in any year: population. Checks failing on both base and head (1)
Counted-once checkEach of 84 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped. Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
|
UK hub independent review at d8aae1b: REQUEST_CHANGES (two small blockers; the core change is right). September 2026 CPI = 3.5% checked against ONS; the new index reproduces every published September rise from April 2011 to April 2027; the triple lock is unaffected (earnings 3.9% binds).
The owner session has archived itself, so the hub will run a build for B1, B2 and S1–S4 once Fleet ops lifts disk pause #13, and a separate PR for F1. Full review: 🤖 Generated with Claude Code |
|
UK hub note (22 Oct), from the review of the Budget dashboard's CPI model limit:
🤖 Generated with Claude Code |
|
UK hub fix hand-off — runtime validation blocked by Fleet ops disk pause #14. Head:
Workspace hand-off: |
The node's propagate_metadata_to_children copies its metadata onto every descendant with dict.update (policyengine-core propagate_parameter_metadata.py:20-28), so the node-level uprating: gov.benefit_uprating_cpi overwrote each band threshold's own lagged-CPI uprating and test_hb_non_dependant_income_bands_keep_lagged_cpi_ while_deductions_use_september failed in CI. Move the September CPI uprating from the node onto each deduction amount; units and references still propagate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged by the UK hub (Claude session 8e19f9d5) at head
|
Brings in #2557 (the base this PR was stacked on, now merged) so the PR workflow runs against main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #2557 (the base this PR was stacked on, now merged) and the other PRs merged since, so the PR workflow runs against main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves the conflicts with #2557 (September CPI uprating), which moved the standard minimum guarantee, Savings Credit threshold and pension-age HB allowances onto lagged CPI "until its own basis is modelled". This branch is that basis, so its projection indices replace the lagged-CPI placeholder, with a comment on each allowance and the guarantee saying why. Keeps main's NI scale validation ahead of the generation steps in process_parameter_tree, and both sides' Savings Credit YAML cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1913's aged_from_cutoff allowances equal the Pension Credit standard minimum guarantee in every enacted year (SI 2006/214 Sch 3 para 1(1)(c) and (2)(c)). On main both were on lagged CPI, so they stayed equal; once this branch moves the guarantee to the statutory earnings floor, the allowances would have drifted below it from 2027. They now use the same index, and a test checks they are equal in every year to 2040. #2557's lagged-CPI test now checks that these amounts have left lagged CPI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2533.
Summary
Most benefits rise each April by the previous September's CPI, the measure every Social Security Administration Act 1992 s150 review uses.
gov.benefit_uprating_cpi, which about 80 benefit rate parameters name as theiruprating, followed the previous calendar year's CPI instead. It now followsgov.economic_assumptions.indices.september_cpi_uprating, the series #2180 added. This PR also enters September 2026 CPI, 3.5% (ONS D7G7, release of 21 October 2026), which sets the April 2027 rise. So CPI-linked benefits rise 3.5% in April 2027, not 2.3%.Law and practice
gov.benefit_uprating_cpi, so they now follow September CPI as the Act requires.What changes
gov.benefit_uprating_cpifollowsindices.september_cpi_uprating: April Y rises by September Y-1 CPI, rounded to 0.1pp, and by nothing when prices fall. The YAML references s150, HCWS1101 and the SI 2026/148 EM.statutory_uprating_inputs.cpi_september: 2026 = 0.035 (ONS 21 October 2026); the null moves to 2027. The triple-lock project cancelled the duplicatetl2027-inputsjob; this is the September 2026 CPI entry of record. May–July 2026 earnings remain 3.9%, confirmed unrevised by ONS KAC3 in the 20 October 2026 release. The triple lock is unchanged for April 2027: earnings at 3.9% exceed CPI at 3.5%.gov.benefit_uprating_cpikeep exactly their previous projection (indices.obr.lagged_cpi), each with a YAML comment giving the evidence. Modelling their own bases is follow-up work:aged, +4.75% in April 2026;aged_from_cutoff, equal to the guarantee in every year 2021-2026);The savings credit threshold and HB pension-age allowances are inside the s150 review (s150(1)(l) and (h)); their increases in practice are linked to earnings rather than September CPI.
gov.benefit_uprating_cpi, since it is an Up-rating Order amount.April 2027 rates
Aggregate impact
The Aggregate impact report, workflow and full report, compares base
9d81a5dfa8with merged head28632cd8c9onenhanced_frs_2024_25.h5(uk-data 1.58.1, sha256056e80fd8e91). Quoting its 2027-28 column:The report records zero changes in 2025-26 and 2026-27, and “0 broken by this change, 1 failing on both sides, 0 fixed”. † Totals exclude suppressed small cells as explained in the report. These figures precede the hub fixes: the cap propagation and the HB threshold override need the new head's Aggregate impact report before landing. No local aggregate simulation was run for this fix job.
Invariants and tests
test_september_cpi_uprating_properties.py(Hypothesis):test_september_cpi_uprating.py:gov.benefit_uprating_cpirises by exactly that rise after its last published (raw YAML) value;start_instantwith a later value;test_benefit_uprating_published.py(differential against DWP's own upratings):published_benefit_rates.py;test_triple_lock_statutory_inputs.pyis updated for September 2026 now being published: 2027 is the first forecast year.The earlier claim that the local run covered every reader was incorrect: it missed the DfE test identified in B1. This fix job selects every Python test file returned by
git grep -l -e cpi_september -e benefit_uprating_cpi -e lagged_cpi -- policyengine_uk/tests(16 files), plus the published benefit-rate and related triple-lock tests.uvx ruff format --check .: pass, 1920 files already formatted (workspace-local UV directories; cache disabled after cached runs stalled).ruff check --no-cache .: pass.git diff --check: pass.uptimeand disk were checked before any install or test. The actual Data volume free space stayed below the required 60 GB throughout this job (about 55 GB initially, about 42 GB at hand-off), and Fleet ops declared disk pause Add reported but unmodelled benefits #14 at 11:34Z. No venv installation, pytest suite, YAML suite or local microsimulation was started. The proposed cleanup is awaiting its own review, so validation needs resuming after the explicit lift..job/pytest-files.txt(all 16 grep matches plus three related modules). Resume withpython3 .job/run-validation.py --install, thenpython3 .job/run-validation.py: frozen worktree venv,pytest -n 2 --dist worksteal -p no:cacheprovider, BLAS/OpenMP=2, foreground only, gated on load1 ≤110, free ≥60 GB and the Fleet ops pause lift.Reproducer: policyengine_uk/tests/test_childcare_funding_rates.py::test_existing_cpi_projection_starts_from_the_2026_funding_anchor, policyengine_uk/tests/test_september_cpi_uprating.py::test_node_uprating_reaches_every_leaf, policyengine_uk/tests/test_september_cpi_uprating.py::test_uc_childcare_caps_rise_by_september_cpi_in_april_2027
Axiom
axiom: TheAxiomFoundation/rulespec-uk#367 queued (SSAA 1992 s150 with WBUA 2013 s1, WRWA 2016 s11 and UC Act 2025 ss1-4).
Follow-ups from the hub review
household.wealth.national_balance_sheet.householdhas an older propagation omission, not an intentional freeze: GDP-per-capita metadata does not reachfinancial_net_worth, used by the corporate-incidence fallback. Preserve that unrelated behavior here with one exact node/leaf exception in the new invariant; repair and measure it separately.🤖 Generated with Claude Code