Stop counting interest, dividends and rent as Universal Credit unearned income - #1950
Conversation
e59cd0c to
b501021
Compare
Codex review — ready to mergeReviewed commit No actionable introduced code/test defect found. Both dated unearned-income lists remove the three actual capital-income variables, and The strict expected failure for dividend tax reducing UC earned income identifies the unchanged whole-benefit-unit tax allocation in#1942. That formula is outside this diff; the issue is exposed by this correction and should remain an integration follow-up, not be misreported as a new formula defect here. Coordinate the dated-list changes with#1943 and update its private-pension/property-income equivalence test and documentation when the branches are combined. Retained-capital timing and the separately documented letting-as-trade classification remain scope assumptions. Confidence: high for code/test behavior in the stated scope. No confirmed policy defect in removing actual interest, dividends and ordinary property rent from the UC unearned-income source list. UC reg66 uses a closed list of income categories; actual savings interest, dividends and ordinary rental income are not included merely because they are taxable or because capital is below£6,000. Reg72 counts assumed yield from qualifying capital and treats its actual receipts as capital, subject to the annuity/trust exceptions. Removing the old conditional capital-derived subtraction therefore fixes the zero-tariff/no-matching-asset cases without requiring actual income to be re-added. The current diff removes the three variables from both dated lists and retains Sources: UC66, UC72, NI equivalent closed list. Trading/owner-manager earnings, trust/annuity income and retained receipts as capital are distinct categories. The PR documents the landlord/trade representation limit; it does not warrant moving every company or trading receipt into these removed ordinary-income variables. Existing tax-on-unearned-income allocation defects belong to#1949, not this diff. Resolve shared-list edits with#1943 by retaining its State Pension addition. No evidence-backed new regression was found. Validation: 26 passed, 1 xfailed, 1 warning. Changed implementation and relevant final-award/dependency tests were checked at this exact commit. 3 official source originals were inspected and their cached bytes verified. No material review gaps remain within this scope; private population-impact claims were not independently rerun. Focused tests used an existing cached Python 3.13 environment (Core 3.32.9, NumPy 2.1.3, pandas 2.3.1, microdf-python 1.2.1, Hypothesis 6.168.2, pytest 8.4.2) with this PR’s isolated source snapshot. No dependencies were installed; this was not a freshly synced lock environment or a full-suite/population run. This is a review comment, not a formal GitHub review vote. Live check before posting (2026-10-02T10:43:04.069390+00:00): same commit, CLEAN; all reported CI checks pass. |
b501021 to
3a6b1a2
Compare
|
Rebased onto main The combined changes exposed an obsolete test that treated State Pension and ordinary rental income as equivalent for Universal Credit. The repaired test checks that rental income leaves UC unchanged, while State Pension reduces the award before the benefit cap. It preserves private-pension equivalence and the existing tax-allocation expected failures. The UC notebook now describes the same capital-income treatment. Validation on the rebased head: both affected Python files plus UC income YAML passed 72 tests, with 2 expected failures; the full UC YAML directory passed 174 tests. Ruff formatting, lint and whitespace checks passed. GitHub CI is pending. |
UC Regs 2013 reg 66(1) lists every description of unearned income, and none covers actual interest, dividends or rent: (m) reaches only ITTOIA 2005 Part 5 income, while interest and dividends are Part 4 and property income Part 3. Capital counts only through its assumed yield (reg 72(1), reg 66(1)(k)), and reg 72(3) treats actual income derived from capital as capital. The UC Regs (NI) 2016 are the same. DWP ADM H5002 and H5112 say income outside the list does not affect the award. The model counted all three unless tariff income applied and a matching household asset flag was set, so it both counted them below the tariff threshold and added interest on top of tariff income when savings were missing from the data. Remove them from the unearned list and delete the capital_derived parameter and its subtraction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rewrite the uc_unearned_income cases from UC Regs 2013 reg 66(1) and reg 72, add hand-computed award cases (single and couple, lodger, Northern Ireland), and add Hypothesis properties: capital yield counted once (checked against a reference reg 72(1) calculation), interest, dividends and rent changing nothing in the means test, and the award non-increasing in capital. A strict xfail pins the #1942 whole-unit tax deduction. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l counts Reg 72(3) applies only where capital is treated as yielding income; the exclusion of interest, dividends and rent rests on reg 66(1) being a closed list. Name the routes that still count (trust and annuity income, estate income) and record that whether other letting is a trade is unsettled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1958 split the list into 2013-04-29 and 2023-11-19 blocks. The rebase removed interest, dividends and rent from the later block only, so remove them from the earlier one too. The single-count property now reads the listed sources from the parameter and asserts none of the three is on it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3a6b1a2 to
b2369e4
Compare
- #1950: rent and dividends are not UC unearned income (reg. 66(1) is a closed list), so the single parent's unearned income is nil (UC 11,308.50) and the self-employed claimant's is the pension alone (UC 3,975.29). - #1881: without gross receipts, a trade profit above the trading allowance gets no allowance (ITTOIA 2005 s. 783AI), so the tax on the trade is (18,000 - 12,570) x 20% = 1,086. The tax and NI this PR deducts are unchanged in method; the cases' gaps against the pre-fix formula are still 0.55 x the tax on other income. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
Universal Credit counts capital through its assumed yield (tariff income), not through the interest, dividends or rent it actually pays. PolicyEngine-UK counted
savings_interest_income,dividend_incomeandproperty_incomeas UC unearned income. It subtracted them only when tariff income was positive and a household asset flag for that stream was set (capital_derived.yaml). So the model:savingswas 0. In 2026, 304k UC-eligible benefit units had £2.73bn of interest counted this way. Only 35k of them had an award on main, so their UC rises by only £0.005bn.This PR removes all three from
gov.dwp.universal_credit.means_test.income_definitions.unearnedfrom 2013-04-29. It also deletescapital_derived.yamland the subtraction inuc_unearned_income, which becomes a plain sum of the listed sources.Worked case (2026): a single claimant aged 30 with £5,000 of savings, £200 of interest, £300 of dividends and £1,000 of rent.
Law
All texts were read from legislation.gov.uk (
/data.xml, 2026-09-30). The verbatim copies are saved with the review notes.UC Regs 2013 reg 66(1) (https://www.legislation.gov.uk/uksi/2013/376/regulation/66) defines a closed list:
Sub-paragraphs (a)–(j) cover retirement pension income, listed benefits, foreign benefits, spousal maintenance, foreign state pensions, student income, ETA/ENTSA payments, Sports Council awards, income-protection insurance, annuity income and trust income. None of them covers a claimant's own interest, dividends or rent.
Reg 72 (https://www.legislation.gov.uk/uksi/2013/376/regulation/72). It is unamended since it was made, and the as-made text matches the current text:
ITTOIA 2005: interest, dividends and rent are not Part 5 income, so reg 66(1)(m) cannot reach them.
Reg 22(1) deducts only earned income (tapered) and "all of the claimant's unearned income". Welfare Reform Act 2012 s.8(3) allows deductions only for earned and unearned income "calculated in the prescribed manner". Income that is neither earned income (reg 52) nor within reg 66(1) is not deducted.
Northern Ireland. The UC Regs (NI) 2016 (SR 2016/216) regs 66(1) and 72 are the same on these points.
DWP Advice for Decision Making, Chapter H5 (unearned income) and Chapter H1 (capital), current GOV.UK versions:
What still counts, and how the model handles it
uc_tariff_income, unchangedself_employment_income, which is already earned income.property_incomeis FRS subletting rent, "rent before tax from other property", and CVPAY (see Legal review).miscellaneous_income, which UC wrongly counts as earned income (#1961).Accrued yield. The model still does not add retained interest, dividends or rent to
uc_assessable_capitalunder reg 72(3). The data record each capital stock at one point and do not say whether a year's receipts were retained, spent or are already in that stock. This was the reasoncapital_derived.yamlgave, and it is unchanged.Legal review
Three adversarial reviews tried to refute the reading from three angles: the statutory text, DWP practice, and edge cases (trusts, annuities, estates, reg 77, lettings, Part 5). None found a route by which a claimant's own interest, dividends or rent is UC unearned income.
The memo, with verbatim texts, is kept with the review notes.
Refinements, all reflected in the parameter description:
The exclusion rests on reg 66(1) being a closed list, not on reg 72(3). Reg 72(3) applies only "Where a person's capital is treated as yielding income". For capital of £6,000 or less, or disregarded capital, the receipts are simply outside reg 66(1).
Some income derived from capital still counts:
None of it is in the three variables. From the FRS 2024-25 data dictionary (UKDA 9563) and uk-data
datasets/frs.py:savings_interest_incomeis interest on current, NS&I, savings, ISA, basic and credit-union accounts;dividend_incomeis gilts, unit and investment trusts, and shares;property_incomeis SUBRENT ("Amount of rent from subletting"), ROYYR1 ("Rent before tax from other property") and CVPAY ("Amount of rent after state benefits (boarders/lodgers)"). CVPAY is rent a boarder or lodger pays, which the build wrongly counts as their income; Stop counting rent paid by boarders and lodgers as their property income policyengine-uk-data#503 removes it. Royalties (ROYYR2) are inmiscellaneous_income.ADM H1673 values unit trusts as the claimant's own capital.
The literal reg 46(3) → 66(1)(l) loop. Could regular rent or interest that 72(3) deems capital come back as "paid regularly and by reference to a period"? The loop would make 72(3) pointless, and ADM H5093 says such income "cannot be treated as income". So the specific rule prevails. No case law was found.
The one genuinely unsettled point is on the earned side: is a landlord's letting a trade?
Rent is not unearned income under any reading, so the list change here is right either way. Under DWP's reading, though, some
property_incomeshould also count as self-employed earnings: 55% taper, and the minimum income floor if it is the main employment. Neither main nor this PR does that, and the data do not identify such landlords.Main's full deduction of rent was no stand-in for that route either. It also deducted subletting rent in the home, which H5112 excludes in terms, and rent that lodgers pay (CVPAY), which is not income at all. And it removed rent entirely for £6,000–£16,000 of let property.
The independent review judged that this earned-side question does not make the change in this PR ambiguous.
Invariants (stated and tested)
For every input:
uc_unearned_incomeequalsuc_tariff_incomeplus the other sources on the model's reg 66(1) list for the year, read from the parameter, and none of the three capital incomes is on that list. The test checksuc_tariff_incomeagainst an independent reg 72(1) calculation onuc_assessable_capital.policyengine_uk/tests/test_uc_income_from_capital_properties.pyruns these with Hypothesis over populations of up to 20 families in 2020 and 2026, across five tenures and five regions including Northern Ireland, with optional reported capital. All three fail on main.Invariant 3's counterexample on main, reproduced by hand: a single claimant aged 30 with £3,000 of interest.
uc_income_from_capital.yaml.On this branch the properties pass: 4 passed and 1 strict xfail with 10 examples each, and the same with 60 examples each.
The award clause of invariant 2 is limited to families without earnings. The model deducts the whole benefit unit's income tax from earnings, so tax on dividends raises a working family's award (#1942). A strict xfail pins that case.
Tests
uc_unearned_income.yaml: every case is rewritten with its legal basis.uc_income_from_capital.yaml: seven award cases hand-computed from regs 22, 66 and 72 at 2026-27 rates (the arithmetic is in the file):Enhanced FRS impact
Both sides are real
Microsimulationruns on private copies ofenhanced_frs_2024_25.h5(sha256e433e532…), with no modified tracked files:UK totals:
The poverty changes rest on few survey records, like the aggregate. The 2030 jump in the poverty effect, with little change in the UC figure, is one sign of that.
The breakdowns below were measured before #1958 merged: main 44240bd against this branch at 191bfa0, on the same dataset. There the 2026 change was +£1.66bn with 1.70m gainers, so the totals barely moved on rebase. The model change is the same; only the base differs.
2026 breakdown:
max(pre-cap − (benefit cap reduction + uc_deductions), 0): the cap reduction takes £0.04bn, and deductions and the zero floor take the remaining £0.05bn.universal_creditin applicable income, so part of the UC gain is withdrawn at the CTR taper, and newly entitled units change route.Most of the £1.66bn rests on imputed dividends and missing capital
The rule change is right whatever the data. The size of the impact is not the effect of the law alone.
Dividends are imputed. policyengine-uk-data
imputations/income.pyimpute_income()callsimpute_over_incomes(dataset, model, ["dividend_income"])on the FRS half too, so every respondent's dividends are an SPI QRF draw on age, gender and region (found on #1948; read in uk-datamainb45c373). Splitting each gainer's gain pro rata by the gross interest, dividends and rent it records, for 2026:The table's attribution is a convention wherever the award, not the counted income, limited the gain. As a real-run subset: FRS-half gainers with interest or rent and no dividends gain £0.32bn, and there the whole gain comes from reported interest and rent.
Real rebuilds with the dividend fix. The #1948 session rebuilt the Enhanced FRS twice at production settings (512 epochs):
main(b45c373), dataset sha2566baf2953…;person_idand stops overwriting them, dataset sha256c9878b7f….Both were run with policyengine-uk main 44240bd and with this PR at 473adff (the same capital-income rule change, measured before the rebase onto #1958). UC change from this PR, £bn:
With dividends that are reported rather than imputed, the change is about £0.9bn a year. That is roughly half of what it costs on today's data. The rebuild of main differs from the published artifact (+£1.66bn in 2026), because of rebuild settings.
Capital stocks and income flows disagree.
corporate_wealth, and those dividends are imputed.savings.property_incomehas no let property behind it: subletting rent in the claimant's own home, which the law excludes, and CVPAY, which is rent paid and not income (Stop counting rent paid by boarders and lodgers as their property income policyengine-uk-data#503). That part of the rent gain is not missing capital. The data do not separate the components on the Enhanced FRS.Real-run sensitivity. Both main and this branch were run on a copy with capital raised to income ÷ yield (4% interest and dividends, 7% rent).
Concentration. The 10 records with the largest weighted gain carry 46% of it, and the 100 largest carry 85% (1,284 gaining records).
The data side is PolicyEngine/policyengine-uk-data#495, covering capital for reported interest and rent, and the #1948 work on keeping FRS-reported dividends and adding director dividends. PolicyEngine/policyengine-uk-data#498 fixes the dividend part. Until the data fixes land, quote this change's effect on households, not its aggregate.
Coordination
state_pensionto the same list. Its property testtest_state_pension_counts_like_property_incomeasserts that UC treatsproperty_incomeheld without property capital like State Pension. That is no longer true on this branch. Whichever of the two merges second must drop that equivalence or change it to "property income does not count". The list entries themselves do not conflict.capital_derived.yaml, which this PR deletes.uc-dividends-owner-managers-1948.uc-capital-sale-expenses(reg 49's 10% sale-cost deduction) touches none of this PR's files.axiom: uk/regulation/uksi/2013/376/66 encoded-correct (TheAxiomFoundation/rulespec-uk#388, merged first:
66.test.yamlcasesbank_interest_is_not_unearned_income,dividends_are_not_unearned_income,rent_from_let_property_is_not_unearned_income,rent_from_a_lodger_in_the_home_is_not_unearned_income,assumed_yield_on_let_property_counts_as_unearned_income. #388 also pins reg 72(3) in72.test.yaml, where Axiom is ahead of PolicyEngine, which does not model reg 72(3) accrual.)Follow-ups
miscellaneous_incomeas earned income.property_income. IS Regs 1987 reg 48(4) treats income from capital as capital, except income from certain disregarded capital (Sch 9 para 22). A separate session will verify and fix HB and IS.🤖 Generated with Claude Code