Exclude corporate_wealth from Universal Credit countable capital pending a pension split - #1837
Draft
MaxGhenis wants to merge 1 commit into
Draft
Exclude corporate_wealth from Universal Credit countable capital pending a pension split#1837MaxGhenis wants to merge 1 commit into
MaxGhenis wants to merge 1 commit into
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_wealthleavesgov.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-dataimputations/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_wealthalone above £16,000, but only 47% of them pass after this change — the rest also carry imputedsavingsabove the limit (see follow-ups).Verified scope
Every consumer of
corporate_wealthanduc_assessable_capitalwas traced (multi-agent read + adversarial verification, plus two independent full-population diffs):uc_assessable_capital. Housing Benefit, JSA, ESA, Income Support and Pension Credit each read their own sources list (all still includecorporate_wealth); their assessable capital and awards are bit-identical before/after, as aretotal_wealth,shareholding,corporate_land_valueand the LVT/land inputs, which read the input variable directly.universal_credititself: council tax reduction (national schemes count UC in applicable income; the legacy-style local schemes also readuc_assessable_capitalwhen a UC award exists), benefit cap, deductions, poverty rates, MTRs, deciles and government balance all move for UC-award reasons only.uc_unearned_income.py:24still readscorporate_wealth > 0directly, deliberately: shares remain countable capital in law,corporate_wealthis 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; thecapital_derived.yamldescription now documents the reasoning.would_claim_ucis a stored dataset column and deduction draws are deterministic hashes ofbenunit_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.
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_wealthinput 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 withnon_residential_property_valueso the stock-proration assertions keep their force, and asserts the exclusion.test_uc_capital_sources.py: pins the list across instants, the exclusion, the still-counted sources, and the deliberate scope limit (HB andtotal_wealthstill 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.Follow-ups (out of scope here)
private_pension_wealthout ofcorporate_wealthin 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.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