Skip to content

Count only the claimant's and partner's income in the legacy means tests - #2387

Draft
MaxGhenis wants to merge 1 commit into
mainfrom
means-tests-dependants-income
Draft

MaxGhenis wants to merge 1 commit into
mainfrom
means-tests-dependants-income

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2385

Summary

Housing Benefit, Income Support, tax credit and Council Tax Reduction applicable income counted the family's own children's and young persons' income, and subtracted their tax, National Insurance and pension contributions. Each formula's comment said the law counts only the claimant's and partner's, and that "dropping dependants' own income is a follow-up". This PR does that.

On main (e01f2f5), 2026-27, England, a lone parent with a 17-year-old at school who earns £8,000 (YAML Case 1):

Variable main This PR
housing_benefit_applicable_income £8,000 £0
income_support_applicable_income £6,960 £0
tax_credits_applicable_income £8,000 £0
council_tax_reduction_applicable_income £8,000 £0

It is needed by #2299 (Child Benefit routes for young people who have left education), whose review ran a working 18-year-old school-leaver: once rightly a young person, their £20,000 of earnings entered the parent's Housing Benefit, Income Support and Council Tax Reduction means tests.

The law

Change

The four formulas' member mask is now is_claimant_or_partner, where it was that or the programme's own child or young person. That covers the income components, the personal benefits, tax, National Insurance and pension contributions they add up. Unchanged: who is a child or young person, the allowances for them, and the benefit-unit awards these formulas add (Child Benefit, Income Support, the claimant-or-partner JSA and ESA, Universal Credit, tax credits). Council Tax Reduction keeps the household head who applies alone as #2288 left them: counted when they are a Child Benefit young person. Counting every such applicant is #2078's change, which overlaps this reader.

Invariants

  1. A child's or young person's own income, tax and personal benefits never change any of the four (nor Universal Credit's or Pension Credit's income, which already followed the rule).
  2. The claimant's and partner's income still counts in full.
  3. Anyone outside the family still never counts (the existing property).

Tests

  • Properties, test_means_test_income_properties.py: new test_income_of_children_and_young_persons_never_counts (invariant 1), on generated families with a child under 16 or a young person at school, each with up to £50,000 of earnings, pension and savings income, with every family on and off Universal Credit, across all seven income totals. It first checks that the dependant is each legacy programme's own child or young person, so the property cannot pass by excluding them. The existing outside-member property (invariant 3) is unchanged.
  • YAML, new means_tests_young_person_income.yaml, three cases hand-computed (2026-27), each failing on main:
Case Family Expected
1 lone parent, no income; 17-year-old at school earning £8,000 all four applicable incomes £0
2 as 1, parent earning £5,000 HB £5,000 − £25 × 52 = £3,700; IS £5,000 − £20 × 52 = £3,960; tax credits and CTR £5,000
3 pension-age HB: grandparent with a £20,000 pension, grandchild of 17 earning £8,000 HB and CTR £20,000 − £1,486 income tax = £18,514 (on main £26,514)
  • Changed expectations. council_tax_reduction_young_person.yaml Cases 2 and 3 counted the young person's £2,000 of earnings (£3,406.60); they now give Child Benefit alone, £1,406.60. test_council_tax_reduction_young_person_properties.py invariant 6: a non-applicant young person's earnings never count; the applicant's always do.

Mutation checks at fafd220, each applied alone in a copy of the branch (mutation/prG2.txt):

Mutation YAML cases that fail Property test
HB counts dependants again 1, 2, 3 fails
IS counts dependants again 1, 2 fails
Tax credits count dependants again 1, 2 fails
CTR counts dependants again 1, 2, 3, and the Scottish CTR file's Cases 2 and 3 fails
CTR drops the household head who applies alone the Scottish CTR file's Cases 9 and 10 passes (no head applicant in its families)

Run locally at fafd220:

  • policyengine-core test on the 103 YAML files that mention Housing Benefit, Income Support, tax credits or Council Tax Reduction (the new one included): 1,140 passed. Before the two changed CTR expectations, those 2 cases were the only failures.
  • pytest on the 18 Python test files that read the four totals: 105 passed.
  • The new YAML file on main e01f2f5: all 3 cases fail (HB applicable income £8,000, £11,700 and £26,514 against £0, £3,700 and £18,514).
  • ruff format --check and ruff check on policyengine_uk: clean.

The full suites run in CI.

Microsimulation impact

Real runs on Enhanced FRS 2024-25 (uk-data 1.58.0, sha256 5ba399ea5ab9a6c7), main e01f2f5 against this branch at fafd220, one run each for 2024-25 to 2030-31, exact comparison of every record (impact/prG2/ in the session folder).

Household incomes change only in 2024-25, for 2 records (343 weighted households), +£42,197 in working tax credit (mean £123). No household loses, and no Housing Benefit, Income Support, Council Tax Reduction, Universal Credit or Pension Credit award changes in any year: few families in the data have a dependant with income of their own, and those that do are not on these benefits.

The applicable incomes move (£ million a year; records that differ in brackets):

Variable 2024-25 2026-27 2030-31
tax_credits_applicable_income −840.1 (555) −913.1 (557) −1,049.4 (557)
housing_benefit_applicable_income −0.42 (6) −0.34 (8) +0.38 (12)
income_support_applicable_income −0.46 (4) −0.34 (8) +0.38 (12)
council_tax_reduction_applicable_income −0.42 (6) −0.34 (8) +0.38 (12)

Tax credits count investment income at step one, so children's savings and the like drop out there in many more records than in the other three. In the other three, the change can be upward: where a dependant paid income tax on income those formulas never counted, main subtracted the tax from the family's income. In 2030-31 each such rise equals the dependant's own income tax (£337.18, £110.64, £484.63, £2,199.95), and the one fall is a 19-year-old's own social security income of £4,880.24 (impact/prG2/dependants_2030.txt).

Reproducer: policyengine_uk/tests/test_means_test_income_properties.py::test_income_of_children_and_young_persons_never_counts

axiom: SI 2012/2885 Sch 1 para 11 encoded-correct (uk/regulations/uksi/2012/2885/schedule/1/paragraph/11.yaml, companion test household_member_is_not_treated_without_polygamous_marriage); HB Regs 2006 reg 25, HB (SPC) Regs 2006 reg 23, IS Regs 1987 reg 23, SI 2002/2006 reg 3, WSI 2013/3029 Sch 1 para 5, SSI 2012/319 reg 21 and SSI 2021/249 reg 36 TheAxiomFoundation/rulespec-uk#463 queued (blocker stated there: no module cites the rows, and a billed encoder run needs approval)

🤖 Generated with Claude Code

Fixes #2385. Housing Benefit, Income Support, tax credit and Council Tax
Reduction applicable income counted the family's own children's and young
persons' income, tax, contributions and personal benefits too, an
approximation each formula's comment called a follow-up. The law counts
the claimant's and partner's alone: HB Regs 2006 reg 25(3) and IS Regs
1987 reg 23(2) say in terms that a child's or young person's income is
not the claimant's; the tax credit income regulations (reg 3(1)) and every
Council Tax Reduction scheme count the claimant or applicant and partner
(SSI 2021/249 reg 36(2) says so in terms). The household head who applies
alone for Council Tax Reduction keeps the treatment #2288 gave them.

Tests: new YAML (three cases, each failing on main), a property test that
a dependant's income never changes any of the seven income totals, and
the Scottish CTR young-person tests updated to the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 12, 2026
…routes

Brings in #2387 (only the claimant's and partner's income in the legacy
means tests), which this PR needs, and main e01f2f5 with it. The one
conflict, the means-test property docstring, keeps both changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 12, 2026
…ent's means tests

Review round 1 of #2299: a young person who qualifies through reg. 7 and
works 24 hours stays a young person, so their earnings must not enter the
parent's Housing Benefit, Income Support or Council Tax Reduction income.
#2387, merged in here, makes that so; Case 11 now has £20,000 of earnings
and asserts the three applicable incomes are nil.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 12, 2026
…outes

Brings in #2299's round 1 fixes, #2387 and #2279's head 9d2fadb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 12, 2026
…lusion

Brings in #2301 and #2299's round 1 fixes, #2387 and #2279's head. The
one conflict, the CTC QYP docstring, keeps both changes: the ceased-
education wording and the Income Support own-right input.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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.

Housing Benefit, Income Support, tax credit and CTR means tests count a young person's own income

1 participant