Repository navigation
UK WAS stage: split private pension wealth out of corporate_wealth (uk-data#452 M2) #750
Description
What
The UK WAS wealth stage folds WAS private pension wealth less the current-employment defined-benefit component (totalpenr8_aggr − dvvaldbt_scaper8_aggr) into corporate_wealth, and policyengine-uk counts corporate_wealth as capital in every means test (UC means_test/capital/sources.yaml and the HB/JSA/ESA/IS/PC equivalents). The value of a right to receive a pension under an occupational or personal pension scheme is disregarded capital (UC Regs 2013 Sch 10 para 10; HB Regs 2006 Sch 6 paras 31–32 and HB(SPC) Regs 2006 Sch 6 para 24; JSA Regs 1996 Sch 8 paras 28–29; ESA Regs 2008 Sch 9 paras 28–29; IS Regs 1987 Sch 10 paras 23–23A; SPC Regs 2002 Sch V paras 22–23). On the incumbent enhanced_frs_2024_25.h5 (uk-data 1.56.14) at 2025, 46% of benefit-unit records that report UC fail the £16,000 test, 96% of them on corporate_wealth alone.
Diagnosed as mechanism M2 of PolicyEngine/policyengine-uk-data#452 (the UC caseload shortfall); machinery lives here per the 2026-08-22 routing (uk-data gets at most one last mirrored release, then freezes).
Measured on the donor (WAS round 8, aggregates)
The folded remainder is £3,659bn of the £4,318bn old corporate_wealth mass (84.7%): current occupational DC 314 + AVCs 12 + retained DC 550 + current personal pensions 204 + retained DB 864 + pensions in payment 1,692 + pension-sharing rights 23 — so it is not DB-free and is named private_pension_wealth (WAS/ONS private pension wealth less current-employment DB), not non_db_pension_wealth.
Change
- WAS stage emits
private_pension_wealthas its own household output (drawn first in chain segment 2; share-like holdings conditional on it; segment 3 conditional on both) and keepscorporate_wealthto employee shares/options, UK shares, unit and investment trusts and the stocks-and-shares ISA fold. Row identityold corporate_wealth == corporate_wealth + private_pension_wealthon the donor. - Lockstep spec, regenerated support bounds,
UK_ALLOWED_EXTRA_EXPORT_COLUMNS/uk_export_surfaceallow-list entry, coverage manifest and digest re-cuts; measurement receipt inexperiments/452-uk-pension-wealth-split.md. - Model side (policyengine-uk, separate PR):
private_pension_wealthinput as an explicit capital disregard;total_wealthre-sums it;corporate_sector_wealth = corporate_wealth + private_pension_wealthkeeps the shareholding / corporate land value / employer-NI keys whole.
Effect (microcosm machinery at a fixed seed, weights unchanged, 2025)
UC benefit units 5.19m → 6.27m (+1.07m, +21%); eligible benefit units 9.8m → 16.3m; reporter records over £16k 3,165 → 1,757; GB elements: housing +0.51m, LCWRA +0.36m, carer +0.08m, childcare +0.14m, child +0.52m. Full table and caveats in the experiments receipt.
Follow-ups registered here
- Current-employment DB entitlements (
DVValDBT_SCAPE, £1,149bn on the donor) are not carried; a futurecurrent_db_pension_wealthwould complete WAS private pension wealth (it would changetotal_wealth). - Cash ISAs (
cash_isa, WASDVCISAVR8) are capital for the means tests but the model'ssavingsmaps savings accounts only — the opposite-direction gap. - The microcosm re-draw of the whole wealth block sits ~1.15m UC benefit units below the incumbent artifact on the same households even with the old arithmetic (continuous-quantile full-leaf draws vs microimpute's 10-point grid; predictor surface) — worth its own look alongside microcosm#145's predictor-quality revisit.
- Ordering: microcosm split → uk-data mirror (held for Max) → re-pin the
efrs-post-calibrationinput-mass reference; re-pinning first would breach the input-mass gate oncorporate_wealth. - Engine coupling: bump the
ukextra lock to the policyengine-uk release carryingprivate_pension_wealthbefore any national build/calibration (the UK targetsons.land.corporate_land_value/land_valueare materialised through the engine's keys).
Refs: PolicyEngine/policyengine-uk-data#452, microcosm#701, microcosm#145, microcosm#736.
Activity
Merge pull request #755 from PolicyEngine/uk-was-pension-wealth-split…
MaxGhenis commentedon Aug 28, 2026
Both PRs are merged after all-green CI and the cross-family (Claude + sol) review converged: PolicyEngine/policyengine-uk#1824 (squash
dd301b9c3, 2026-08-26) and #755 (merge1225a276f, 2026-08-28, after four union merges of main with the spec/battery/certification digests re-cut each time — #793's new certification part digests included).Now actionable / still open here:
ukextra floors (policyengine-uk>=) to the release carryingprivate_pension_wealthand re-lock, before any national build or calibration on a split dataset.efrs-post-calibrationinput-mass reference (re-pinning earlier breaches the gate oncorporate_wealth).current_db_pension_wealth, and the same-seed-per-segment pattern in the E6 chains, as registered above.MaxGhenis commentedon Aug 28, 2026
Engine release confirmed: policyengine-uk 2.92.0 (PyPI) is the first version carrying
private_pension_wealth/corporate_sector_wealth— the floors follow-up above should targetpolicyengine-uk>=2.92.0.Re-pin the UK spec digest for the registered adjudication register
juaristi22 commentedon Aug 28, 2026
Certification readout — the lever is landed and measured. First calibrated measurement of the split, isolated cleanly: v10 (spine-i, pre-split) vs v11 (spine-j, first post-#755 spine), same seam, same code (
c046b48c), same doctrine (1500 epochs,family_equal), same register. Receipts:runs/uk-623-first-calibrated/spine-assessment-{v10,v11,v12}/.dwp.uc.householdsmoves inside the 25%uk_target_fitband for the first time.households_single_no_children−38.3% → −26.4%,households_children_2−42.1% → −37.7%, TCL claimant-PIP −45.1% → −40.0%, TCL disabled-child −61.6% → −56.5%.ons.land.corporate_land_valueinitials byte-identical at 2.044e12).Closing state. Machinery merged (#755), model side merged and released (PolicyEngine/policyengine-uk#1824 → policyengine-uk 2.92.0), lever measured (above), engine floors landed (#811,
ukextra at>=2.92, lock 2.89.0 → 2.92.1). The post-merge checklist residuals graduate:efrs-post-calibrationre-pin orderingsavingsmaps savings accounts only)current_db_pension_wealth(£1,149bn current-employment DB not carried)Closes via #811.
Merge pull request #811 from PolicyEngine/750-engine-floor