Skip to content

UK WAS stage: split private pension wealth out of corporate_wealth (uk-data#452 M2) #750

Closed

Description

@MaxGhenis

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_wealth as its own household output (drawn first in chain segment 2; share-like holdings conditional on it; segment 3 conditional on both) and keeps corporate_wealth to employee shares/options, UK shares, unit and investment trusts and the stocks-and-shares ISA fold. Row identity old corporate_wealth == corporate_wealth + private_pension_wealth on the donor.
  • Lockstep spec, regenerated support bounds, UK_ALLOWED_EXTRA_EXPORT_COLUMNS / uk_export_surface allow-list entry, coverage manifest and digest re-cuts; measurement receipt in experiments/452-uk-pension-wealth-split.md.
  • Model side (policyengine-uk, separate PR): private_pension_wealth input as an explicit capital disregard; total_wealth re-sums it; corporate_sector_wealth = corporate_wealth + private_pension_wealth keeps 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 future current_db_pension_wealth would complete WAS private pension wealth (it would change total_wealth).
  • Cash ISAs (cash_isa, WAS DVCISAVR8) are capital for the means tests but the model's savings maps 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-calibration input-mass reference; re-pinning first would breach the input-mass gate on corporate_wealth.
  • Engine coupling: bump the uk extra lock to the policyengine-uk release carrying private_pension_wealth before any national build/calibration (the UK targets ons.land.corporate_land_value / land_value are materialised through the engine's keys).

Refs: PolicyEngine/policyengine-uk-data#452, microcosm#701, microcosm#145, microcosm#736.

Activity

  1. added a commit that references this issue on Aug 28, 2026
  2. MaxGhenis commented on Aug 28, 2026

    @MaxGhenis
    ContributorAuthor

    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 (merge 1225a276f, 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:

    • Engine floors: bump the uk extra floors (policyengine-uk>=) to the release carrying private_pension_wealth and re-lock, before any national build or calibration on a split dataset.
    • uk-data mirror: held as a patch pending Max's last-release decision; after it ships, re-pin the efrs-post-calibration input-mass reference (re-pinning earlier breaches the gate on corporate_wealth).
    • Composite mass audit (old corporate wealth vs corporate + pension) so the input-mass gate distinguishes the intended transfer from pension-mass loss.
    • The cash-ISA gap, the OLD-redraw-vs-incumbent machinery difference, current_db_pension_wealth, and the same-seed-per-segment pattern in the E6 chains, as registered above.
  3. MaxGhenis commented on Aug 28, 2026

    @MaxGhenis
    ContributorAuthor

    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 target policyengine-uk>=2.92.0.

  4. juaristi22 commented on Aug 28, 2026

    @juaristi22
    Collaborator

    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}/.

    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, uk extra at >=2.92, lock 2.89.0 → 2.92.1). The post-merge checklist residuals graduate:

    item where it lives now
    uk-data mirror (Max's last-release decision) + efrs-post-calibration re-pin ordering #796 B4 bullet / uk-data#452
    wealth-block re-draw undershoot (~1.15m vs incumbent, confounded by the released-h5 predictor surface) #809 mechanism 1, with #145's predictor-quality revisit
    composite mass audit (old corporate wealth vs corporate + pension for the input-mass gate) #796 deferral ledger
    cash-ISA gap (capital for means tests; model savings maps savings accounts only) #796 deferral ledger
    current_db_pension_wealth (£1,149bn current-employment DB not carried) #796 deferral ledger
    what the split does NOT fix: the UC residual (support 4.24m vs 6.76m) and the TCL disability cells #809 and #808 respectively

    Closes via #811.

  5. added a commit that references this issue on Aug 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions