Skip to content

Exclude corporate_wealth from Universal Credit countable capital pending a pension split - #1837

Draft
MaxGhenis wants to merge 1 commit into
mainfrom
uc-capital-exclude-corporate-wealth
Draft

Exclude corporate_wealth from Universal Credit countable capital pending a pension split#1837
MaxGhenis wants to merge 1 commit into
mainfrom
uc-capital-exclude-corporate-wealth

Conversation

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Interim fix for the Universal Credit capital test counting imputed pension wealth. Part of the diagnosis in policyengine-uk-data#452 (mechanism M2 in this comment). The proper fix is a dataset-side pension split (separate task); no new uk-data release is involved here.

What changes

corporate_wealth leaves gov.dwp.universal_credit.means_test.capital.sources. Both dataset builds construct it from the WAS Round 8 household file as (total private pension wealth − current defined benefit pension wealth) + employee shares and options + UK shares + investment ISAs + collective investments (policyengine-uk-data imputations/wealth.py:145-154; the microcosm build uses the same arithmetic). The Universal Credit Regulations 2013 disregard the value of pension scheme rights (Schedule 10 paragraph 10, verified against the in-force text); shares, investment ISAs and collective investments are countable under regulation 46 with no general Schedule 10 disregard. Pension wealth is 85% of the bundle's mass in the WAS donor, so counting the bundle fails the £16,000 test for claimants whose only large asset is a pension, and no artifact column isolates the share-like remainder. The parameter description states the approximation and the intent to restore the share-like remainder once the dataset splits it out.

Note the asymmetry this fixes only partially: 96.7% of FRS-reported-UC benefit units failing the capital test have corporate_wealth alone above £16,000, but only 47% of them pass after this change — the rest also carry imputed savings above the limit (see follow-ups).

Verified scope

Every consumer of corporate_wealth and uc_assessable_capital was traced (multi-agent read + adversarial verification, plus two independent full-population diffs):

  • The sources list has exactly one reader, uc_assessable_capital. Housing Benefit, JSA, ESA, Income Support and Pension Credit each read their own sources list (all still include corporate_wealth); their assessable capital and awards are bit-identical before/after, as are total_wealth, shareholding, corporate_land_value and the LVT/land inputs, which read the input variable directly.
  • Changes propagate only through universal_credit itself: council tax reduction (national schemes count UC in applicable income; the legacy-style local schemes also read uc_assessable_capital when a UC award exists), benefit cap, deductions, poverty rates, MTRs, deciles and government balance all move for UC-award reasons only.
  • The dividend gate at uc_unearned_income.py:24 still reads corporate_wealth > 0 directly, deliberately: shares remain countable capital in law, corporate_wealth is the only available signal a benunit holds them, and regulation 72(3) treats dividends as capital once tariff income applies. Worth about £0.25bn of UC in 2025 on the measured artifact; the capital_derived.yaml description now documents the reasoning.
  • No runtime randomness confounds any of this: would_claim_uc is a stored dataset column and deduction draws are deterministic hashes of benunit_id; repeated runs are bit-identical.

Measured impact (enhanced_frs_2024_25.h5, uk-data v1.56.16, year 2025, stored weights)

Engine before: main @ c93e1a0. Engine after: this branch. Admin: DWP Apr–Dec 2025 monthly averages (deductions-derived households; childcare Jan–Aug 2025), GB geography.

series admin avg (m) before (m) gap after (m) gap
households (GB) 6.759 6.199 −8.3% 6.708 −0.8%
housing element (GB) 4.304 4.868 +13.1% 5.067 +17.7%
LCWRA element (GB) 2.417 2.102 −13.0% 2.195 −9.2%
carer element (GB) 1.134 0.641 −43.4% 0.683 −39.7%
childcare element (GB) 0.184 0.471 +156.1% 0.492 +167.6%
single, no children (GB) 3.447 2.969 −13.9% 3.279 −4.9%
single, with children (GB) 2.226 2.135 −4.1% 2.160 −3.0%
couple, no children (GB) 0.284 0.225 −20.8% 0.330 +16.3%
couple, with children (GB) 0.900 0.871 −3.3% 0.939 +4.3%

Other movements (UK basis): caseload 6.346m → 6.896m; spend £75.30bn → £78.48bn (the #735 target surface's two OBR UC spend references sum to £79.3bn for FY2025-26); eligible benefit units 10.52m → 17.35m; FRS-reported-UC benefit units failing the capital test 2,958 → 1,578 records (1.38m → 0.87m weighted); benefit units over £16,000 across the whole population 22.5m → 13.3m; poverty 11.3% → 11.0% BHC and 14.6% → 14.3% AHC (child AHC 17.7% → 17.2%); benefit-capped benunits 0.134m → 0.148m; council tax reduction £2.290bn → £2.288bn (UC passthrough only).

Regressions this knowingly worsens (they measure other defects, previously masked by the capital test): the housing element overshoot rises to +17.7%, the childcare element overshoot to +167.6%, and couple-no-children flips from −20.8% to +16.3%. Element incidence is formula-driven with no direct calibration target (see #452), and the flat 55% take-up draw is a separate mechanism (M1).

This differs from counterfactual C in the #452 diagnosis (caseload 6.69m GB, spend £78.23bn), which zeroed the corporate_wealth input and therefore also relaxed the HB/JSA/ESA/IS/PC and local-CTR capital tests and disabled the dividend gate. This PR changes none of those.

Tests and CI

  • is_UC_eligible.yaml: the corporate-wealth case now asserts exclusion.
  • test_stock_capital_periods.py: replaces the corporate-wealth contribution with non_residential_property_value so the stock-proration assertions keep their force, and asserts the exclusion.
  • New test_uc_capital_sources.py: pins the list across instants, the exclusion, the still-counted sources, and the deliberate scope limit (HB and total_wealth still count the bundle).
  • reforms_config.yaml: the "Reduce Universal Credit taper rate to 20%" regression fixture is re-baselined from −18.1 to −30.3 on the CI dataset (enhanced_frs_2023_24.h5 @ 1.40.3) — the taper reform now operates on the larger eligible caseload. The fixture file states expected values are current-model regression values, not external costings. All other fixtures move by at most £0.1bn; the UC deductions DWP-statistics bands still pass.
  • Full local funnel: 1,118 YAML cases, non-microsimulation pytest suite, and the microsimulation-marked suite on the CI-pinned artifact.

Follow-ups (out of scope here)

  1. Dataset-side pension split (the proper fix, own task): split private_pension_wealth out of corporate_wealth in the microcosm WAS stage, add a matching model input variable, and return the share-like remainder to this list. The remainder is not DC-only — it keeps retained DB rights and pensions in payment.
  2. Legacy means tests: HB, JSA, ESA, IS and PC still count the bundle through their own lists, though the same disregard exists in their regulations (HB 2006 Sch 6 paras 31-32; IS 1987 Sch 10 paras 23-23A; JSA 1996 Sch 8 paras 28-29; ESA 2008 Sch 9 paras 28-29; SPC 2002 Sch V para 22, where pension-age treatment needs its own check). Deliberately unchanged pending the maintainer's call and the build split.
  3. The savings tail: 1,578 reporter benunits still fail the £16k test, almost all on imputed savings, whose artifact distribution is far heavier than the WAS donor's (weighted median £4,000 vs £800; share above £16k 38.7% vs 19.3%) — a build-side imputation question, not a model one.

Measurement provenance: artifact sha256 e433e532… (HF revision a9e52499), licensed data, aggregates only; scripts under ~/PolicyEngine/_uk-defects-452-448/measure/ (measure_pr_before_after.py), matched dependency pins across both venvs (policyengine-core 3.31.0).

🤖 Generated with Claude Code

…split

The dataset builds corporate_wealth as total private pension wealth less
current defined benefit pension wealth plus employee shares and options,
UK shares, investment ISAs and collective investments. The Universal
Credit Regulations 2013 disregard pension scheme rights (Schedule 10
paragraph 10) while counting the share-like components, and pensions are
85% of the bundle's mass in the WAS donor, so counting the bundle failed
the GBP 16,000 test for claimants whose only large asset is a pension.
Excluding it is an interim approximation until the dataset splits the
share-like remainder out (policyengine-uk-data#452), at which point that
remainder should return to the list.

Only the UC list changes: Housing Benefit, JSA, ESA, Income Support and
Pension Credit read their own source lists, and the wealth, LVT and land
variables read the input directly (verified bit-identical on the
licensed artifact). The uc_unearned_income dividend gate deliberately
keeps reading corporate_wealth as the available signal that a benunit
holds shares, whose dividends regulation 72(3) treats as capital once
tariff income applies; capital_derived.yaml documents the reasoning.
Re-baselines the UC taper regression fixture (-18.1 to -30.3 on the CI
dataset) because the reform now operates on the larger eligible
caseload.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant