Conversation
housing_benefit_applicable_income_disregard gave every single person, couple and lone parent £5, £10 or £25 a week, and housing_benefit_applicable_income took it off total income, so pensioners with only a State Pension had £5 a week of it disregarded. The amounts were uprated with CPI (£5 became £7.02 a week in 2026). The additional earnings disregard was £37.10, also uprated, and went to anyone whose benefit unit's summed hours exceeded 30 (16 for lone parents). SI 2006/213 Sch 4 and SI 2006/214 Sch 4 (NI: SR 2006/405 and SR 2006/406 Sch 5) are "sums to be disregarded in the calculation of earnings". The disregards are now taken from the claimant's and partner's net earnings (housing_benefit_net_earnings: earnings less income tax, National Insurance and half of pension contributions, regs 36 and 38/39) and capped at them. The £5, £10 and £25 amounts have not changed since 2006 and are no longer uprated. The additional earnings disregard is £17.10 (£37.10 from 6 April 2020 to 4 April 2021 under SI 2020/371 reg 5), and it needs one of the work conditions in para 17(2) / 9(2) (one person aged at least 25 working at least 30 hours; 16 hours for lone parents, couples with a child and disabled workers) and net earnings at least equal to the other disregards, the childcare charges deducted and £17.10. A working-age claimant on Income Support, income-based JSA or income-related ESA has all earnings disregarded (SI 2006/213 Sch 4 para 12). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The work-conditions variable said paragraph 17(2)(a) and 9(2)(a) need Working Tax Credit entitlement, which requires one of the modelled conditions. WTC Regs reg 4 also entitles a couple through a partner aged 60 working 16 hours, and its disability test differs from the disability premium's, so the route adds two narrow cases. Neither is modelled, and no tax credit can be claimed for 2025-26 onwards (SI 2014/1230 reg 6A(9)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Para 17(1) and 9(1) add £17.10 where net earnings "equal or exceed" the other disregards, the childcare charges and £17.10. Net earnings are float32, so exactly £1,149.20 (£5 + £17.10 a week) was held as £1,149.19995 and failed the test. The comparison is now in pence, and new cases pin £1,149.20 (single, 30 hours) and £2,189.20 (lone parent, 16 hours) as granted and a penny below each as not. The end-to-end pension-age cases are aged 72 and set the applicable amount (£256 x 52) as an input. SI 2006/214 Sch 3 para 1(1) gives £256 only to a claimant who reached pensionable age before 1 April 2021, and £238 to one who reached it later; #1913 models that split. The working-age case asserts housing_benefit_entitlement, which #1910's 2026 abolition scaling does not change. The disabled-worker case is labelled as a model limitation: the disability premium also brings in Sch 4 para 3's £20 in place of £5, which is not modelled. A new case pins the is_adult proxy counting an 18-year-old young person's earnings and hours (the law excludes them) until #1896 replaces it. The net earnings documentation names the provisions that set the tax deducted (213 regs 36(3) and 39(1); 214 regs 36(2) and 40(1)), calls the proportional attribution a lower bound for employees, and says what the proxy counts. The changelog fragment is a bullet. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Reviewed: approve with nits (the one Should fix is a description edit). The disregards are now taken from net earnings and capped by them, with the correct non-uprated amounts and the correct £17.10 conditions. This fixes #1794.
Verified: I read on legislation.gov.uk SI 2006/213 reg 36(3), Sch 4 paras 4, 10 and 17 and Sch 5 para 4; SI 2006/214 Sch 4 paras 1, 2, 7 and 9; and SI 2020/371 reg 5 (£37.10 from 6 April 2020 to 4 April 2021). The 30 hours, age 25 and "equal or exceed" wording matches. In a fresh environment the new YAML passed 48/48 and the property tests passed 7/7. CI: all 6 checks pass. |
…imitations The £17.10 series started in 2010. Add the earlier sums from the point-in-time texts of SI 2006/213 Sch 4 para 17 and SI 2006/214 Sch 4 para 9: £14.50 as made, then £15.45, £16.05 and £16.85 from 1 April 2007, 2008 and 2009 (SI 2007/688, 2008/632, 2009/497), with the orders cited. Mark the two YAML cases that pin known model limitations with the value the law gives. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Vahid. All four points are handled:
An independent round-2 review is running. |
|
Cross-reference from #2000 (fixes #1993, the SI 2006/213 Sch 5 para 4 / Sch 6 para 5 passport).
🤖 Generated with Claude Code |
Fixes #1794.
Problem
housing_benefit_applicable_income_disregardgave every single person £5 a week, every couple £10 and every lone parent £25, whether or not anyone had earnings.housing_benefit_applicable_incomethen took it off total income, including the State Pension, private pensions and benefits. The amounts carrieduprating: gov.benefit_uprating_cpi, so £5 had become £7.02 a week by 2026. The "worker" disregard was £37.10, also uprated (£52.11 a week in 2026). It went to any benefit unit whose members' hours added together exceeded 30 (16 for lone parents), with no age condition, no earnings test and none of the other conditions.These are real runs of origin/main (1c5b4d0) and this branch. A, B and C are the three end-to-end YAML cases below. A has no earnings, so the law disregards nothing. C works exactly 30 hours: main required more than 30, so it gave no worker disregard. D is under 25, so the law gives no additional disregard. E's disregard is capped at earnings; HB is at the maximum either way. In F neither partner works 30 hours, but main added their hours together.
The pension-age allowance in A and B (£256 vs £238). The model gives every pension-age single claimant £256 a week (£13,312 a year). In law that is the rate for a claimant "who has attained pensionable age before 1st April 2021"; one who attained it "on or after 1st April 2021" has £238.00 (SI 2006/214 Sch 3 para 1(1), as amended by SI 2021/188). A and B are aged 72, so they reached pensionable age before that date, and £256 is also the law's rate for them. A claimant aged 70 in 2026-27 reached it later: at £238 this branch gives £4,850.30 (A) and £4,499.30 (B), but the change from main is the same (−£237.38 and −£68.38), since both are on the taper either way. #1913 splits the allowance by that date. The end-to-end YAML sets the applicable amount as an input, so it tests the disregard whether or not #1913 lands.
Law
All texts were read from legislation.gov.uk CLML (
/data.xml) on 2026-09-30. The current revised texts, point-in-time versions and commentaries are saved in the research folder.SI 2006/213 (working age), Schedule 4: "Sums to be disregarded in the calculation of earnings" (regs 36(2) and 38(2)).
SI 2006/214 (pension age), Schedule 4: "Sums disregarded from claimant's earnings" (reg 36(1)).
Net earnings.
Why para 17(2)(a) and (c) add nothing.
Amounts over time. I fetched point-in-time versions from legislation.gov.uk.
Northern Ireland. The NI earnings disregards are in Schedule 5, not Schedule 4 (Schedule 4 of both NI instruments is applicable amounts).
Change
housing_benefit_net_earnings(new, benefit unit), for each claimant or partner (is_adult, the proxy the other HB variables use):is_adultexcludes the earnings of members under 18. It still counts a qualifying young person aged 18 or 19, whose income the law excludes (213 reg 19(1) and 25(3)). That is a known limitation of the proxy, pinned in the YAML, until Replace generic child and adult flags with each programme's legal definitions #1896's claimant-or-partner variable replaces it.meets_housing_benefit_additional_earnings_disregard_conditions(new). One of:is_disabled_for_benefits, the input behinddisability_premium.>=.is_adultproxy, so an 18- or 19-year-old young person's hours can meet a condition (Replace generic child and adult flags with each programme's legal definitions #1896).housing_benefit_applicable_income_disregard(rewritten):min(£25 lone parent / £10 couple / £5 otherwise × 52, net earnings);housing_benefit_applicable_income_childcare_element+ £17.10 × 52. "Equal or exceed" is compared in pence. Net earnings are float32, so exactly £1,149.20 is held as £1,149.19995, and an exact comparison failed at equality;single,couple,lone_parent: nouprating, dated from 6 March 2006, with references to both instruments and NI and the "disreagrded" typo fixed.worker: £17.10 from 1 April 2010, £37.10 for 2020-21, £17.10 from 5 April 2021, nouprating.worker_hours: 30, with its references corrected.worker_hours_lower(16) andworker_age(25).means_test/pension_contribution_deduction_rate(0.5).housing_benefit_applicable_income.pyis unchanged, since fix 1 edits it. It still subtracts the disregard from total income; with the disregard now capped at net earnings, that is the same as taking it from earnings.The pension-age and working-age schedules give the same result in every case the model covers, except para 12 (and given the lone-parent reading above). A property test checks this metamorphically, within the limits stated under Invariants. The branch uses
any member over State Pension age, ashousing_benefit_tariff_incomeand the capital limit do.Invariants
These are property-tested in
test_housing_benefit_earnings_disregard_properties.py: Hypothesis,derandomize=True, 5 examples of up to 30 families (single, couple, lone parent, couple with children; ages 18 to 90, including 24 and 25; hours including 15, 16, 29 and 30; earnings £0 to £60,000; disability; pension contributions; childcare). Runtime is 48 s on an idle host (113 s under load in the latest run).Mutation check. Ten mutations were each applied to a scratch copy of the branch (before the review round) and run against the new YAML and property tests. The unmutated control passed both.
>for the 30 hours;test_income_support_disregards_all_working_age_earningscatches it.Tests
applicable_income/housing_benefit_applicable_income_disregard.yaml(29):is_adulttreats the young person as a partner. The law gives 0 (213 regs 19(1) and 25(3)). Pinned until Replace generic child and adult flags with each programme's legal definitions #1896.applicable_income/housing_benefit_net_earnings.yaml(6): below thresholds; half of £400 pension contributions; £20,000 → £17,919.60 (tax £1,486, NI £594.40); pensioner with State Pension £15,000 + earnings £1,000 → £957.13 (tax £686 × 1/16); self-employment loss not offset; couple added.applicable_income/meets_housing_benefit_additional_earnings_disregard_conditions.yaml(10): each route and its boundary, including "the 25-year-old must be the 30-hour worker" and "the disabled partner must be the one working".housing_benefit_earnings_disregards.yaml(3 end-to-end; cases A, B and C above):housing_benefit_applicable_amountto £13,312 (£256 × 52) as an input, the rate for a claimant who reached pensionable age before 1 April 2021. So they test the disregard independently of the allowance, which Split pension-age Housing Benefit allowances by when State Pension age was attained #1913 splits by that date.guarantee_credit: 0as an input. It is working age, but the model computes £2,376 of Guarantee Credit for it, so the input keeps any form of the passport out.housing_benefit_entitlement, nothousing_benefit. Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) #1910 multiplies the entitlement by the share of 2026 before working-age HB is abolished, inhousing_benefit_pre_benefit_cap, and leaves the entitlement unchanged.uc_legacy_mutual_exclusion.yamlYAML: 161 passed, 0 failed (113 existing, all unchanged, + 48 new);pytest policyengine_uk/tests -m "not microsimulation"): 325 passed, 15 skipped, 30 deselected, 0 failed. The log records no commit. The run started at 07:49 and ended at 09:17, so it began on 6737dd5 (committed 07:44), before 8bed988 (08:08).ruff format --checkis clean on every changed Python file.test_carer_support_payment.pycheckshb_income == max(0, csp - disregard), which still holds with a disregard of 0).Dataset impact (Enhanced FRS 2024-25, current weights, real runs of main vs this branch)
HB falls by £21.7m in 2026, in two parts that move in opposite directions relative to the law:
87.7k benefit units lose. None gain, and none lose all their HB. The largest possible loss is the whole of the old lone-parent disregard tapered at 65%: 0.65 × £35.12 a week (the uprated £25) × 52 = £1,186.91 a year, for a lone parent without earnings whose income is above the applicable amount. Working-age losers of this kind are almost all on Income Support, income-based JSA or income-related ESA, so the law gives them maximum HB (see below).
Who moves, and why:
housing_benefit_net_earningsto each bound: no income tax attributed to earnings, and all of each person's income tax attributed. Both give exactly the same HB for every record (0 records differ), so the proportional attribution does not affect the 2026 results.Caveats:
policyengine-uk-datarebuild will move these numbers.impact/diag_disregard.pyandimpact/diag_disregard_2026.json: the breakdown above;impact/diag_disregard_final.pyandimpact/diag_disregard_final_2026.json: the IS/JSA/ESA split and the largest loss.impact/disregard-final*). Every per-unit and per-person array and every total is identical to the first run, so the change to the earnings-test comparison moves no record.Not in this PR
disability_premium> 0 andcarer_premium> 0 exist for working age (213 paras 3(2) and 5(1)), andis_disabled_for_benefits(orattendance_allowance> 0) can stand in for 214 para 5(1). The occupations are not observable.housing_benefit_applicable_income_childcare_elementhas three problems:childcare_1/childcare_2parameters uprated by CPI (£322.67 and £553.14 in 2026), where reg 27(3) and 214 reg 30(3) fix £175 and £300.housing_benefit_applicable_income, although 213 reg 25(3) and Sch 4 para 15 and 214 reg 23(3) exclude them. The new net earnings exclude members under 18 but not a qualifying young person aged 18 or 19 (theis_adultproxy; see the overlap with Replace generic child and adult flags with each programme's legal definitions #1896 below). In 2026 no HB unit has a child with earnings, and none (to the nearest 0.01k) has an 18- or 19-year-old young person with earnings.income_support_applicable_incomeapplies its own flat disregards to all income, in the same way this PR fixes for HB. It was not checked against the IS Regulations.0.5pension-contribution factor inhousing_benefit_applicable_incomecould use the new parameter. It is left alone to keep this PR out of that file.Overlap with #1896 (
remove-is-child-flags, open, conflicting):referenceinhousing_benefit_applicable_income_disregard.py, which this PR rewrites. When it rebases, it should drop those two lines.is_adultas deprecated. The two new variables each readis_adultonce, as the claimant-and-partner proxy, and Replace generic child and adult flags with each programme's legal definitions #1896 should switch those reads tois_claimant_or_partner. That also fixes the 18-year-old young person case, whose YAML expectation (£1,409.20; law 0) should then change to 0.axiom: SI 2006/213 Sch 4 and SI 2006/214 Sch 4 — TheAxiomFoundation/rulespec-uk#375 queued
🤖 Generated with Claude Code