Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
c124ea3
Draw SPI donor ages by ONS single-year shares and respect State Pensi…
juaristi22 Sep 30, 2026
567f9d1
Re-pin the UK Chronicle feed to 825406f (PolicyEngine/chronicle#302 v…
juaristi22 Sep 30, 2026
a580e12
Add the consumer operations the UK pension targets need (#1069 c2)
juaristi22 Sep 30, 2026
5aab4fa
Bind the UK resident State Pension on the national surface (#1069 c3)
juaristi22 Sep 30, 2026
07646c8
Keep the OBR State Pension line and DWP's forecast lines as diagnosti…
juaristi22 Oct 1, 2026
a2bfee0
Sign out the empty new State Pension £40-£60 band (#1069)
juaristi22 Oct 1, 2026
dae9cc9
Query the SPI donor forest at the middle of each person's year of age…
juaristi22 Oct 1, 2026
7cac27b
Allocate the SPI channel's prior mass by region and State Pension age…
juaristi22 Oct 1, 2026
f795e91
Bind the Pension Credit caseload and draw take-up by component after …
juaristi22 Oct 1, 2026
9b66ab3
Bind SPI pension contributions by total income band and stop clipping…
juaristi22 Oct 1, 2026
b19f14d
UK target-fit register: retire the state-pension 50-70k deferral (#1069)
juaristi22 Oct 1, 2026
8b3e9f9
Draw employer pension contributions from ASHE rate bands and bind wor…
juaristi22 Oct 1, 2026
be5c132
Read the SPI support allocation's reason from its declared shares eve…
juaristi22 Oct 1, 2026
1308994
Bind the pension-age benefit caseloads: Attendance Allowance, pension…
juaristi22 Oct 1, 2026
fcb5c46
Resolve counterfactual target measures through the engine and bind th…
juaristi22 Oct 1, 2026
d9fca7b
Take the SPI Table 3.8 rows and the DWP gross employee row out of the…
juaristi22 Oct 1, 2026
b03b0df
Receipts: the UK pensions arms, the final build and WP7 (#1069 c12)
juaristi22 Oct 1, 2026
4262b75
Re-pin the UK gate digests and two tests the pension stages moved (#1…
juaristi22 Oct 1, 2026
004b5c9
Let synthetic smoke builds record the Pension Credit take-up gate wit…
juaristi22 Oct 2, 2026
3a3fc10
Lower the SPI channel's pension-age prior share to 0.2 (#1069, ruled …
juaristi22 Oct 2, 2026
677336b
Uprate the SPI State Pension amount rows by their count rows' recipie…
juaristi22 Oct 2, 2026
c78dff4
Receipts: review round 1, the σ_p ruling and the State Pension amount…
juaristi22 Oct 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/uk-chronicle-feed-repin-825406f.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Re-pin the UK Chronicle feed to 825406f (PolicyEngine/chronicle#302 via #305). The feed now carries the UK pension facts: State Pension and Pension Credit caseloads and amounts for Great Britain and Northern Ireland, the DWP Spring 2026 pensioner forecast lines, Winter Fuel Payment, Attendance Allowance, workplace pension savings and ASHE contribution bands, HMRC pension contribution and salary sacrifice relief, and the OBR salary-sacrifice costing (344,402 rows). No compiled target value moved on either surface. The vendored resources and the membership reports restate the feed identity, and the five salary-sacrifice relief targets now also see the 2023-24 rows while still resolving to 2024-25. Because of those rows, the 2023 production compile-parity receipt gains five ledger-only rows (microcosm#1069).
1 change: 1 addition & 0 deletions changelog.d/uk-contribution-rows-unbound-1069.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Take the UK SPI Table 3.8 contribution rows and the DWP gross employee contribution row out of the national fit (#1069). The c9 measurement arm showed both definitionally mismatched with the engine's columns. Table 3.8 splits contributions by relief mechanism (net pay against relief at source), while `employee_pension_contributions` holds every workplace deduction and `personal_pension_contributions` only the FRS personal and stakeholder pensions; workplace group personal pensions and many master trusts take relief at source. At prior weights net pay sat 67% above SPI and the relief-at-source contributors 82% below (about 2.0m against 10.9m), out of reach of reweighting; binding them cut the effective sample size from 5,004 to 4,060 and roughly doubled the loss. DWP's gross employee contributions (£66.2bn) pulled against SPI's net pay and the engine's pay deductions. The DWP employer row, the employer contribution draw, the salary-sacrifice conversion fix and the clip removal stay. Active national references go from 1,283 to 1,230.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Declare Great Britain on the measurement of DWP's employer pension contributions target (#1069). DWP's figure covers England, Scotland and Wales; the engine binding already measured GB households only, and the contract's measurement block now says so too.
3 changes: 3 additions & 0 deletions changelog.d/uk-employer-pension-contributions-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Draw UK employer pension contributions from ASHE rate bands and bind workplace pension contributions (#1069 c9; PolicyEngine/chronicle#302 via #305). The FRS HMRC spine leaves no longer set employer contributions to three times the employee contribution. Each member of an employer scheme (FRS `PENPROV.STEMPPEN` 1 to 4; occupational first when a person reports several) draws a contribution rate within an ASHE 2024 Table P10 rate band for their scheme type and job sector (`JOB.JOBSECT`), and the rate applies to their pay. The bands are vendored as `ashe_employer_pension_contribution_rates.json` (81 rows); all-sector rows are the public and private bands weighted by Table P2 jobs. Converted salary-sacrifice records now also lose the sacrificed amount from `employment_income`.

Three targets: DWP's employer contributions into workplace pensions in calendar 2025 (£104.2bn, Great Britain, all savers, 2025 earnings terms) against the engine's employer contributions plus salary sacrifice, which ASHE and DWP count as an employer contribution; DWP's gross employee contributions (£66.2bn: the employee part net of tax, £45.5bn, plus its tax relief, £20.7bn) against the engine's employee contributions; and the 2024-25 salary-sacrifice amount, HMRC Table 6.2's employer National Insurance relief divided by the 13.8% employer rate (about £24.6bn, a declared conversion until the relief rows bind directly). The salary-sacrifice users total (7.7m) leaves the fit; the two headcounts either side of £2,000 stay bound.
3 changes: 3 additions & 0 deletions changelog.d/uk-pension-age-benefits-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Bind the UK pension-age benefit caseloads (#1069 c10; PolicyEngine/chronicle#302 via #305, #259/#260). Attendance Allowance cases with entitlement in England (1.60m) and Wales (124k), each the mean of the four quarterly Stat-Xplore points inside calendar 2025, in a new `dwp_attendance_allowance` family that declares its source months. Scotland is not bound: its caseload moves to Social Security Scotland's Pension Age Disability Payment through 2025 (171k in February, 25k in November), which the engine does not model. Pension-age Housing Benefit benefit units in Great Britain, all tenures (1.11m) and the social (891k) and private (217k) rented sectors, on the twelve 2025 months of the existing Housing Benefit rows; the engine reads the eldest adult's age against 66.

DWP's winter 2025/26 Winter Fuel Payment recipients in England and Wales (11.0m) sit beside the bound OBR line as a required diagnostic, never fitted: DWP pays everyone and HMRC recovers the payment above £35,000, while the engine withholds it (PolicyEngine/policyengine-uk#1760).
3 changes: 3 additions & 0 deletions changelog.d/uk-pension-credit-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Bind the UK Pension Credit caseload and draw Pension Credit take-up by component (#1069 c7; PolicyEngine/chronicle#302 via #305). Fourteen caseload targets in the new `dwp_pension_credit` family, each the mean of the four quarterly Stat-Xplore points inside calendar 2025: the Great Britain total (1.39m benefit units), its six type-by-partner cells (Guarantee Credit only, Savings Credit only, both; with and without a partner), six age bands of the eldest adult, and the Northern Ireland total from DfC. `obr.pension_credit` stays bound.

A new spine stage, `pension_credit_take_up`, redraws `would_claim_pc` after the SPI income chain. One temporary engine materialization gives each benefit unit's pre-take-up Guarantee Credit and Savings Credit; within each DWP take-up component (Guarantee Credit, Savings Credit only) a reporter claims and the other entitled units claim at r = (t·E − R)/(E − R), with t DWP's financial year ending 2024 caseload take-up (69% and 37%, replacing the flat 70% from FYE 2020), E the entitled units and R the reporters, weighted. A stage gate checks each component's realised take-up; the terminal take-up signal gate no longer measures `would_claim_pc`. The roster moves from 35 to 36 stages.
1 change: 1 addition & 0 deletions changelog.d/uk-pension-window-consumers-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add the consumer operations the UK pension targets need (microcosm#1069 c2). The new `monthly_window_count_x_mean` value operation averages a published count times its published mean over declared months. Two operands name the count and mean concepts, since DWP names its measures `recipients` and `mean_weekly_amount`, not `*_count` and `*_mean`, and the mean operand's `period_factor` annualises a weekly mean (52). Each month's count and mean must come from the same published cell and publication, even though Stat-Xplore files them in sibling record sets. The engine-index uprating applier restates each window month's mean at the rate the engine pays in the calibration year: April onward at that year's rate, January to March at the previous year's. Only a February point moves, per ruling R1. The UK State Pension level compiles from the Stat-Xplore cube to £138.6bn for Great Britain and £3.7bn for Northern Ireland in calendar 2025 at 2025 rates. The amount-band parser reads DWP's half-open labels ("£20.00 to under £40.00", "Under £20.00") with their own published upper edges. `dwp_state_pension` and `dwp_pension_credit` join the source-month families. The generator pins `dfc_ni.*` targets to Northern Ireland and `dwp.winter_fuel_payment.*` to England and Wales (`K04000001`, now a labelled geography).
3 changes: 3 additions & 0 deletions changelog.d/uk-salary-sacrifice-relief-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Resolve UK counterfactual target measures through the engine and bind the salary-sacrifice relief rows (#1069 c11; PolicyEngine/chronicle#302 via #305). The measure resolution loop no longer refuses `input_substitution_counterfactual` bindings: a provider with `counterfactual_delta(binding, period)` resolves each binding's per-row delta into a slash-free measure-input column (`counterfactual_delta__<metric>`), which the frame adapter reads. `UKMeasureResolver` builds one extra engine simulation per substitution from the same source at the calibration year, zeroing the sacrifice and adding it to `employment_income` (uk-data's recipe), and returns the output's delta against its baseline. Banded counterfactual measures are refused.

Rows (HMRC Table 6.2, 2024-25): the employee (£1.0bn) and employer National Insurance relief rows, already declared, now bind, the employer row restated from the 13.8% HMRC's £3.4bn was charged at to the 15% the engine charges in 2025 (£3.70bn, through a new engine index parameter, the employer Class 1 rate); a new all-rates income-tax relief total (£8.8bn) binds. The employer row anchors the sacrificed amount directly, so c9's interim amount row (employer relief ÷ 13.8%) retires. The three income-tax rate-band rows stay excluded until their band test reads after-allowance thresholds and the Scottish bands. `income_tax` carries the High Income Child Benefit charge and the annual-allowance charge, so the income-tax delta includes their response to the returned pay.
1 change: 1 addition & 0 deletions changelog.d/uk-spi-channel-pension-age-1069.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allocate the UK SPI support channel's prior mass by region × State Pension age status (#1069). The channel's 10,000 households are drawn unweighted and every adult in them carries a taxpayer's SPI income, and a region-only allocation gave each of them the region's average weight, so the channel held more pension-age mass than the FRS design gives pension-age households (5.67m against 4.44m pension-age households in the FRS channel, 13.9m people aged 66 and over against about 12.1m at design weights). Within each region the allocation now splits households with a member at or over the engine's State Pension age from the rest; the channel takes 50% of the stratum mass of households without one and the declared pension-age share of those with one. The receipt records both shares and the pension-age masses, and the stage gate checks both.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Lower the UK SPI channel's share of pension-age prior mass from 0.5 to 0.2 (#1069). Measured at the final state, 0.2 keeps more low-income pensioners in the prior: before calibration the Pension Credit caseload sits 24% short instead of 36%, and pension-age Housing Benefit 28% short instead of 41%. The effective sample size rises from 4,900 to 4,994, and non-taxpayer State Pension from £35.5bn to £37.5bn. The coverage manifest's required allocation reason, the charter-H2 fixture and the gate digests move with the stage parameter.
3 changes: 3 additions & 0 deletions changelog.d/uk-spi-pension-contributions-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Bind UK pension contributions by range of total income from SPI Table 3.8 and stop clipping reported personal pension contributions (#1069 c8; PolicyEngine/chronicle#302 via #305). Four targets in the `hmrc_spi` family, each fanned over the table's total-income bands for tax year 2023-24: net-pay-arrangement contributions (the engine's `employee_pension_contributions`) and relief-at-source contributions (`personal_pension_contributions`), amount and count. Amounts move to calendar 2025 by the engine's average-earnings index, counts by HMRC's projected taxpayer growth for the band, as the other SPI counts do. Active national references go from 1,224 to 1,276.

The FRS spine no longer clips personal and stakeholder pension contributions at the 95th percentile of every PENPROV amount. The clip removed 28% of the reported amount (1.8% of rows) against the relief-at-source total the new rows bind; the engine caps the relief itself at the annual allowance.
1 change: 1 addition & 0 deletions changelog.d/uk-spi-state-pension-age-1069.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Make the UK SPI income stage respect State Pension age (#1069). SPI donor ages are now drawn within each AGERANGE band by the ONS mid-2023 single-year populations of the donor's sex, vendored from the pinned Chronicle feed as `uk/ons_single_year_age_populations.json` and declared as a stage artifact. Donors receiving State Pension (`SRP > 0`) are drawn at or above the engine's State Pension age, and a band's below-SPA population share is drawn from its non-recipients, with any shortfall receipted. The 65–74 band edge is corrected so that 74-year-olds fall in band 6. The stage-1 forest is queried at the middle of each person's year of age (whole-year age plus half a year), because donors carry a fractional age: at the whole year a 66-year-old sat on the forest's split at State Pension age and drew a 65-year-old donor's zero State Pension leaf about half the time. Band carriers draw only donors on their own side of State Pension age, then from their own SPI age band when that pool holds 20 records (composites never age-match), then narrow by region as before. A deterministic guard zeroes State Pension, Pension Credit and Winter Fuel reports below State Pension age: the SPI State Pension leaf before the stage-2 receipt bridge, the base channel's State Pension reports before stage 2 trains on them, and the SPI channel's three reports after stage 2. A receipt records the rows, weighted people and pounds removed at each step.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Uprate the UK SPI State Pension amount rows by total-income band as recipients times the amount per recipient (#1069). Each amount row now moves by the growth its count row already declares (HMRC's projected Income Tax payers in the Table 2.5 band containing it, calendar-2025 window over 2023-24) times the new State Pension rate the engine pays (230.25 against 203.85 a week, 1.1295). Before, the amount rows moved by the rate alone, so each band's amount held the 2023-24 number of recipients while its count row grew them: in the £50,000 to £70,000 band the count row grew by 1.217 and the amount row by 1.130, which left that band 24.5% above its amount target at the final arm even with its count fitted. The new factors run from 1.106 (£15,000 to £20,000, where taxpayer numbers fall) to 1.405 (£100,000 to £150,000); the thirteen rows sum to £100.9bn instead of £96.3bn. Both component factors are receipted on every row, and a row compiled at its own year (the production-2023 parity surface) stays as published.
1 change: 1 addition & 0 deletions changelog.d/uk-spi-support-reason-readers-1069.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Read the UK SPI support allocation's mass-change reason from its declared shares everywhere (#1069). Since the allocation separates households with a member at or over State Pension age (c6), its MassChangeRecord carries the stratified sentence, but the SPI income stage's graph kernel still rebuilt the preceding record with the 50% sentence (so the stage evidence named the old allocation), and the release-input coverage manifest required the 50% sentence on the final dataset, which the release-cut coverage gate would fail. Both now take the reason from `uk_spi_support_mass_change_reason`, which reads the declared allocation.
7 changes: 7 additions & 0 deletions changelog.d/uk-state-pension-diagnostics-1069.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Move the OBR State Pension line out of the UK fit and keep it, with DWP's forecast-table lines, as diagnostics beside the bound resident level (microcosm#1069 c4, rulings R2 and R4).

- **Why:** the OBR FY2025-26 forecast (£146.19bn) counts Great Britain plus pensioners paid abroad and leaves out Northern Ireland. It is a different quantity from the resident level that the DWP Stat-Xplore and DfC rows now bind.
- **What is attached:** `dwp.state_pension.amount` carries the exact OBR figure and DWP Spring 2026's Great Britain total (£146.07bn) and paid-abroad line (£5.63bn) as metadata only. `dwp.state_pension.recipients` carries DWP's caseload lines (13.204m, of which 1.088m are abroad).
- **How:** the diagnostic attachment, until now written for the CGT cash forecast alone, is driven by the contract's `diagnostic_references`. Each declaration names its metadata prefix and value unit.
- **Fail-closed:** `UK_REQUIRED_TARGET_DIAGNOSTICS` names the declarations each target requires, so a missing or misdirected one still refuses the target. The CGT diagnostic's metadata is unchanged.
- **Knock-on changes:** the incumbent `obr/state_pension` row moves to `registry_parity.excluded`, and the compile-parity receipts give it and the State Pension rows their ruled rationales. The UC support probes protect `dwp.state_pension.amount` in its place.
8 changes: 8 additions & 0 deletions changelog.d/uk-state-pension-targets-1069.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
Bind the UK resident State Pension on the national surface (microcosm#1069 c3; PolicyEngine/chronicle#302 via #305). The calendar-2025 window is the mean of the four quarterly Stat-Xplore points (February, May, August and November 2025). There are 26 contract targets, compiling to 60 references in the new `dwp_state_pension` family, of which 59 are bound.

- **Level:** Great Britain residents' recipients (12.05m) and amount (£138.6bn), plus Northern Ireland from DfC (0.33m and £3.7bn). The amounts are recipients times the mean weekly amount times 52, restated per point at the engine's 2025 rate.
- **Age:** recipients by age band (66–69 to 90 and over) × sex × State Pension type, binding only the cells DWP populates. Type follows the State Pension age date, so 66–69 is all new State Pension and 75 and over all pre-2016.
- **Area:** recipients by type in the nine English regions (a region-tier fan-out pinned to England), with Scotland and Wales as their own rows.
- **Weekly amount:** recipients by weekly amount band × type. These keep only the May–November points, which DWP pays at the 2025-26 rate the engine pays. The new State Pension £40.00 to under £60.00 band (2,903 recipients) has no record on the frame, so it is signed out in `target_reference_signed_exclusions.json`.

The contract gains the `dfc_ni` provider and the two State Pension categories, so the local references restate the hierarchy.
24 changes: 24 additions & 0 deletions docs/uk-chronicle-feed-repin.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,12 @@ Verify the complete compiled target diff on both surfaces, including targets
outside the intended policy area, and record the value moves in the changelog
fragment.

A re-pin also moves the charter-H2 parity fixture: every stage that declares a
vendored resource as an artifact binds that resource's digest into its
`stage_contract_sha256`, and the vendored headers restate the feed identity.
Regenerate it with `tools/graph_uk_spine_fixture.py` and check that only those
contract hashes move.

Two-level (country + region) contract targets fan out over the region tier
(`UK_REGION_TIER` in `microcosm.calibrate.geography_constants`), one reference per area
(microcosm#905); their cells resolve Chronicle's region- and country-stamped
Expand Down Expand Up @@ -97,3 +103,21 @@ claimants, qualifying gains and tax by band of qualifying gain, individuals, tru
taxpayers, 2021-22 to 2024-25; 287,150 rows). The addition is purely additive: the national and
local reference files are byte-identical, the vendored resources carry the same rows under the new
feed identity, and the three compile-parity receipts are unchanged.
The `825406f` re-pin (microcosm#1069, PolicyEngine/chronicle#302 via #305, on top of `505e0e7`) brought
the UK pension facts: Stat-Xplore State Pension and Pension Credit caseloads and amounts from
February 2023 to March 2026 (by type, age, gender, region, partner and amount band), Northern
Ireland State Pension and Pension Credit (DfC, May 2026), the DWP Spring 2026 State Pension and
Pension Credit forecast lines, Attendance Allowance, Winter Fuel Payment recipients and statistics
for winters 2023-24 to 2025-26 and the HMRC charge, the DWP workplace pension savings trends, ONS
ASHE pension membership and contribution-rate bands, HMRC pension contribution relief (2023-24) and
salary sacrifice relief (2024-25), and the OBR salary-sacrifice costing (344,402 rows). It also
carries chronicle #246, #278, #292 and #304. No compiled value moved on either surface: the
national and local reference files are byte-identical and the vendored resources carry the same
rows under the new feed identity. The artifact carries every `505e0e7` value but is not a strict
row superset: #305 rebuilt the DWP Spring 2026 package's record sets, so 44 incapacity-benefit
forecast rows come back under new keys with the same forecast line and value, and 192 rows change
only their layout fields; no UK target binds them. The five salary-sacrifice relief targets now
match two facts each (the new 2023-24 Table 6.2 rows beside the bound 2024-25 ones) and still
resolve to the 2024-25 fact. For the same reason the 2023 production compile-parity receipt gains
five ledger-only rows (the relief targets now compile at that comparison period from the 2023-24
facts); the two 2025 incumbent receipts are unchanged.
Loading
Loading