You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
UK pensions: calibrate State Pension, Pension Credit and pension contributions to the resident administrative facts (PolicyEngine/chronicle#305), pin the State Pension age boundary, fix the pension spine stages, and the engine pieces a State Pension uprating analysis needs #1069
Measured on the #1045 head (arm ch3, c306cc07d, the latest candidate; every spine and terminal gate passes) with policyengine-uk 2.102.3 at FY2025-26, against the pension facts on the feed and in PolicyEngine/chronicle#305. The #979 national build, the v21c measurement and the eFRS 1.57.3 file were measured alongside.
State Pension is about 9% short of what UK residents receive, and the calibration cannot see it.
Engine: £131.1bn paid to 11.33m people.
UK residents: about £144bn and 12.45m. That is GB residents from DWP's Spring 2026 table less the "paid outside UK" line (£146.07bn − £5.63bn and 13.20m − 1.09m), plus Northern Ireland (NISRA: 0.34m, about £3.8bn).
The only bound level is obr.state_pension, at −9.7%. It has drifted down across builds (−8.0%, −9.0%, −9.5%, −9.7%) and is a single row among 1,090.
The missing State Pension sits with non-taxpayers.
SPI 2023-24 Table 3.6 bands are +6.4% (£20–30k), +16.6% (£30–40k), +8.3% (£40–50k) and +25.2% (£50–70k, deferred under D6 to 2026-10-21), while the counts fit.
The taxpayer bands sum to £96.2bn and 8.36m recipients; the model carries £102.3bn and 8.33m there. The resident total therefore implies about £48bn and 4.1m non-taxpaying recipients, and the model has £27.9bn and about 3.0m. The shortfall is almost entirely below the tax threshold.
Pensioners sit too high in the income distribution. Shares by quintile before housing costs, bottom to top: 18.7 / 23.3 / 22.2 / 19.4 / 16.5%, against HBAI FYE 2025's 22 / 25 / 21 / 18 / 14.
Only five-year bands (65–69) are bound. Single ages 64–68 are 0.73 / 0.98 / 0.64 / 0.73 / 0.59m, against ONS 0.80 / 0.77 / 0.75 / 0.71 / 0.68m: age 65 is 27% high and age 66, the first year of State Pension age, 15% low.
0.25m people under State Pension age (mostly exactly 65) carry state_pension_reported, which the engine drops.
New State Pension recipients are 4.23m against DWP's 5.05m (−16%).
Pension Credit pays too many small awards.
Spending fits (−0.1%), but the caseload is 1.665m against 1.382m (+20%).
Savings Credit only is 0.298m against 0.176m (+69%), and Savings Credit spending £0.52bn against £0.36bn.
Take-up is one flat draw at 0.70 (DWP FY2019-20).
Pension contributions are untargeted.
Employer contributions are three times employee contributions: £127.8bn against £35.2bn. DWP's savings trends put eligible savers' 2025 contributions at 61% employer, 27% employee and 12% tax relief of £166.1bn, i.e. about £101bn employer and £45bn employee.
Salary-sacrifice amounts are free: £22.5bn now, against £30–32bn on earlier builds. Only user counts are bound.
The engine cannot run the analysis as it stands (policyengine-uk 2.102.3):
Dict reforms of the triple-lock switches do nothing.
State Pension age stays at 66, with no rise to 67 over 2026–28.
Basic→new reclassification double-counts additional State Pension: +£5.8bn by FY2030-31.
The Pension Credit guarantee for FY2025-26 is £221.85 against the published £227.10.
The April 2027 triple-lock rate is 3.4%, against the OBR's 3.7%.
Additional State Pension is uprated by the triple lock rather than CPI.
The distribution of a State Pension reform is not yet stable. In an illustrative CPI-only-from-April-2027 probe:
The budget effect is stable across builds: +£1.07bn (FY2027-28) to +£2.70bn (FY2030-31), with a bootstrap standard error of at most £0.13bn.
Extend the band-label parser to "£X to under £Y" and "Under £Y", reading each row's own upper bound (all-zero series are dropped, so the next sibling's lower edge is wrong).
Add the England-and-Wales and Northern Ireland geography pins in tools/generate_uk_target_references.py.
Rows (new family dwp_state_pension):
GB-resident recipients and amount from the Stat-Xplore cubes over the FY2025-26 points; Northern Ireland from the DfC cube.
Recipients by single year of age (66–89, 90+) × gender × type. Fan-out pins one dimension, so there is one target per gender × type.
Region × type (the nine English regions, Wales and Scotland).
Weekly amount bands × type.
Diagnostics.obr.state_pension and DWP's "paid outside UK" and GB-plus-overseas lines become diagnostics (the obr.capital_gains_tax precedent). The SPI Table 3.6 £50–70k deferral (D6) is re-measured, then retired or re-ruled.
Acceptance:
Resident level and caseload within 2%.
Type × gender within 5%.
Single-age counts within 5% for ages 66–75.
SPI 3.6 bands no worse.
The non-taxpaying remainder within 10% of the implied figure.
WP2: the State Pension age boundary and the pension-age SPI channel (spine)
Root cause.
SPI donors get ages drawn uniformly within their SPI age band (65–74), so a copy aged 65 receives SPI State Pension at the 65–74 receipt rate. The stage-2 bridge then turns that into state_pension_reported.
Band carriers pool by income band × region with no age term, which is where the recipients aged 16–54 come from.
spi_income and spi_band_donors disagree on the band edges: (65,74)/(74,90) against (65,75)/(75,…).
Fix.
Draw donor ages by ONS single-year shares, with SPI State Pension recipients drawn only at State Pension age or over.
The bridge requires age ≥ State Pension age; a postprocess rule zeroes State Pension, Pension Credit and Winter Fuel Payment reports below State Pension age, with a receipt.
Calibration. Bind ONS single ages 64–68 × sex (on the feed; mid-2024).
Acceptance:
Zero recipients below State Pension age.
Single ages 64–68 within 3%.
The State Pension-age population within 1% of ONS.
Spine gates pass.
WP3: Pension Credit
Rows. Benefit units by type (Guarantee only / Savings only / both) × partner × age band (GB), the Northern Ireland total, and the Guarantee/Savings spending split.
Take-up (stage).would_claim_pc is today one 0.70 draw over all benefit units, made before the SPI chain and never refreshed. Restrict it to benefit units with an adult over State Pension age, band it by entitlement type (the uc_reporter_redraw precedent), set the rates against the admin caseloads, and refresh after the SPI chain.
Prerequisite. Correct the engine's FY2025-26 guarantee and Savings Credit threshold (WP6) before measuring.
Acceptance: caseload within 3%, each type within 5%, spending within 1%.
WP4: pension contributions
Employee and personal contributions.
Bind SPI Table 3.8 (net-pay and relief-at-source contributions by income band; on the feed, unbound).
Remove the personal-contribution clip at the 95th percentile of all amounts. The clip leaves the median and 99th percentile both at £1,441 and the total at £2.5bn, against HMRC's £15.9bn of individual personal-pension contributions.
Employer contributions (stage). Replace employer = 3 × employee (the incumbent's "rough estimate") with a vendored rate resource: at minimum a ratio fitted to DWP savings trends, better ASHE rate bands by sector and employee-rate band. ASHE counts salary sacrifice as employer contributions, so compare employer plus salary sacrifice against the ASHE and DWP totals.
Acceptance: Table 3.8 bands within 10%; employer and employee totals within 5% of their anchors; salary-sacrifice users unchanged.
WP5: the other pension-age benefits a State Pension change interacts with
Attendance Allowance recipients by country.
Winter Fuel Payment 2025/26 recipients (England and Wales; the engine variable is household-level, so it needs a person-count rule). HMRC's count above £35,000 as a diagnostic.
It deletes gov.dwp.state_pension.age.{male,female}, which microcosm reads in uk_runtime/frs_take_up.py:132-133. Migrate microcosm with the engine bump.
On the enhanced FRS it lowers State Pension by £1.6bn (FY26-27) to £7.7bn (FY30-31).
Dict reforms edit the tree after processing and do nothing.
Scenario(parameter_changes=...) re-processes, but a "2027" key lands a year late.
The fix is one reform path that re-runs the derivation when its inputs are touched.
The basic→new reclassification double count, measured at +£5.8bn by FY30-31.
Additional State Pension uprated by CPI, not the triple lock.
Pension Credit FY2025-26 rates (guarantee £227.10 / £346.60, Savings Credit threshold £198.27 / £314.34, carer and severe disability additions), a CPI-uprated Savings Credit maximum with a derived threshold, and the guarantee's uprating rule.
The April 2027 rate: the OBR's 3.7% assumption until the announced rate (May–July earnings 3.9%).
A switch for the promised income-tax easement for pensioners on State Pension alone from FY27-28.
A guard against datasets that carry a state_pension column.
Until the follow-up merges, reforms must pass the basic and new State Pension amounts for every year as dict keys "2027".."2030".
WP7: validation
HBAI: pensioner quintile shares and pensioner relative poverty against HBAI FYE 2025, as validation only (HBAI is FRS-derived).
DWP path: the baseline State Pension and Pension Credit path against DWP's forecast to FY2030-31, after WP6. Ages stay static across years, so it is read with that caveat.
Reform stability: a State Pension uprating reform's budget and decile effects, with bootstrap standard errors, on the final build and a second calibration seed. Acceptance: budget within 3%, decile loss shares within 1 point.
Multi-year runs, to be a separate piece. The engine copies the 2024 cross-section forward with static ages and total-population weight growth: no ageing and no cohort turnover. The candidate there is year-specific weights calibrated to the ONS 2024-based single-age projections and scored against DWP's caseloads to FY2030-31 (see Fix age progression in multi-year projections for two-child limit policyengine-uk#1351, closed, for why incrementing ages was rejected).
Any reform costing: this issue makes the data and the engine fit for one.
Decisions needed
The resident State Pension window. FY2025-26 points (May, Aug and Nov 2025, and Mar 2026) or calendar-2025 points. The engine pays FY2025-26 rates in period 2025.
The fitted resident source. The Stat-Xplore cubes plus Northern Ireland (with DWP's forecast lines as diagnostics), or the reverse.
Single ages. Split the 65–69 band into singles, or bind singles beside it.
obr.state_pension. Demote it to a diagnostic. And keep obr.pension_credit bound, or rely on the DWP type rows.
Employer contributions. A savings-trends ratio or ASHE rate bands; and whether the DWP totals are bound or diagnostic.
Why
Measured on the #1045 head (arm ch3,
c306cc07d, the latest candidate; every spine and terminal gate passes) with policyengine-uk 2.102.3 at FY2025-26, against the pension facts on the feed and in PolicyEngine/chronicle#305. The #979 national build, the v21c measurement and the eFRS 1.57.3 file were measured alongside.obr.state_pension, at −9.7%. It has drifted down across builds (−8.0%, −9.0%, −9.5%, −9.7%) and is a single row among 1,090.state_pension_reported, which the engine drops.Work packages
Delivery is one microcosm PR, stacked on #1045 while it is open, plus PolicyEngine/policyengine-uk#1899 and one follow-up engine PR.
WP0: re-pin the Chronicle feed to the post-PolicyEngine/chronicle#305 artifact
chronicle_feed.json, vendor the resources, and regenerate the references, membership, compile-parity receipts and coverage manifest (thedocs/uk-chronicle-feed-repin.mdprocedure used by UK CGT: BADR-qualifying gains, the Table 3 income joint and wealth-conditioned gain carriers (#1014) #1045).WP1: State Pension level and shape for UK residents
count_x_meanso it pairs Add UK pension facts: State Pension, Pension Credit, workplace pensions, salary sacrifice and Winter Fuel Payment chronicle#305's count and mean facts (by concept, not by id suffix), annualises weekly means (× 52) and composes with the monthly window.tools/generate_uk_target_references.py.dwp_state_pension):obr.state_pensionand DWP's "paid outside UK" and GB-plus-overseas lines become diagnostics (theobr.capital_gains_taxprecedent). The SPI Table 3.6 £50–70k deferral (D6) is re-measured, then retired or re-ruled.WP2: the State Pension age boundary and the pension-age SPI channel (spine)
state_pension_reported.spi_incomeandspi_band_donorsdisagree on the band edges: (65,74)/(74,90) against (65,75)/(75,…).WP3: Pension Credit
would_claim_pcis today one 0.70 draw over all benefit units, made before the SPI chain and never refreshed. Restrict it to benefit units with an adult over State Pension age, band it by entitlement type (theuc_reporter_redrawprecedent), set the rates against the admin caseloads, and refresh after the SPI chain.WP4: pension contributions
salary_sacrifice_anchor.jsonfrom Chronicle, per the fixtures-from-Chronicle rule.WP5: the other pension-age benefits a State Pension change interacts with
WP6: the engine (policyengine-uk)
gov.dwp.state_pension.age.{male,female}, which microcosm reads inuk_runtime/frs_take_up.py:132-133. Migrate microcosm with the engine bump.Scenario(parameter_changes=...)re-processes, but a "2027" key lands a year late.state_pensioncolumn.WP7: validation
Stacking and order
Related, not in scope
Decisions needed
obr.state_pension. Demote it to a diagnostic. And keepobr.pension_creditbound, or rely on the DWP type rows.🤖 Generated with Claude Code