Repository navigation
Apply Housing Benefit and national Council Tax Reduction non-dependant deductions as legislated - #2007
Apply Housing Benefit and national Council Tax Reduction non-dependant deductions as legislated#2007MaxGhenis wants to merge 9 commits into
Conversation
|
Composition note: #2015 (stacked on #2009 → #2006) deletes the two household flags this PR reads.
See the "National schemes and the exemption" section of #2015. (Corrected per this PR's author.) |
Cherry-picks #2007 (59c7082: HB reg 74 / SPC reg 55 bands, remunerative-work test, couple rule and exemptions; national CTR own scales and exemptions) onto the in-unit non-dependant change (#2014) and the #2006 rent shares, as agreed with #2007's author: - HB and national CTR aggregation: one deduction for a non-dependant couple (the claimant and partner of a non-dependant family, the higher amount; both for a Welsh working-age couple on UC), any other adult in that family counted separately, in-unit non-dependants pooled and apportioned by rent share (HB) or joint-liability share (CTR), and the claimant's exemption. - Joint income for the bands is the couple's only (reg 74(4), para 8(4)); another adult is banded on their own income. - The IS, income-based JSA, income-related ESA, Pension Credit and UC exemptions apply only to the award's claimant and partner. - The HB claimant exemption reads is_claimant_or_partner, not is_adult. Drops council_tax_reduction_pension_credit.yaml and the in_receipt_of_guarantee_credit output, which depend on #1909 (main only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cherry-picks #2007 (59c7082: HB reg 74 / SPC reg 55 bands, remunerative-work test, couple rule and exemptions; national CTR own scales and exemptions) onto the in-unit non-dependant change (#2014) and the #2006 rent shares, as agreed with #2007's author: - HB and national CTR aggregation: one deduction for a non-dependant couple (the claimant and partner of a non-dependant family, the higher amount; both for a Welsh working-age couple on UC), any other adult in that family counted separately, in-unit non-dependants pooled and apportioned by rent share (HB) or joint-liability share (CTR), and the claimant's exemption. - Joint income for the bands is the couple's only (reg 74(4), para 8(4)); another adult is banded on their own income. - The IS, income-based JSA, income-related ESA, Pension Credit and UC exemptions apply only to the award's claimant and partner. - The HB claimant exemption reads is_claimant_or_partner, not is_adult. Drops council_tax_reduction_pension_credit.yaml and the in_receipt_of_guarantee_credit output, which depend on #1909 (main only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Response to review r1 of #2007 (59c7082)The review asked for changes and was right on all five P1s. Each is fixed below with the law, the change, and a test that fails on 59c7082 and passes now.
Also from the review:
Not changed: the review's UNVERIFIED items on impact (exact zeros, decomposition, poverty causation). The impact is rerun on the new head after the host is free (the Axiom build has priority until about 10:00Z). The PR description's impact section is replaced with the rerun. |
Applies #2007 at 6257277 (59c7082 plus the r1 review commit) onto #2017 (in-unit non-dependants, #2006 rent shares): - One definition of claimant or partner: #1896's is_claimant_or_partner variable. #2007's proxy helper (benefit-unit head or any member who is not a Child Benefit child or QYP) is removed and its call sites read the variable. - HB and national CTR aggregation: another family's non-dependants per deduction_per_family (the couple's higher amount, both for a Welsh working-age UC couple, and each other member's own), counted once per family and apportioned by rent share (HB) or joint-liability share (CTR); a family's own in-unit non-dependants in full (LHA Guidance Manual 2.093; HBGM A5 5.622); the claimant exemptions. charged_to_other_families ("household minus own family") is no longer used and is removed. - #2007's property oracle reads is_claimant_or_partner; the in-unit property oracle counts a couple once and applies the claimant exemptions. - Drops council_tax_reduction_pension_credit.yaml and the in_receipt_of_guarantee_credit output (#1909, main only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Carries 2d54628 (review r2 F3-F5) onto the composition with #2007: - HB pools every non-dependant family amount, in-unit ones included, through #2007's deduction_per_family and apportions it by rent share; a boarder or lodger also bears its own in full; the claimant exemption still zeroes the claim. - National CTR pools every family's amount (one per couple, the higher, or both for a Welsh working-age UC couple), replaces the applicant's own family amount with its in-unit non-dependants only, and apportions by joint-liability share; the per-applicant exemption still zeroes the claim. - CTR eligibility includes a lodger's adult son; the local schemes stay neutral. The blind-sharer case now expects the non-exempt head to bear half of the sharer's son (para 8(5)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Response to review r2 of #2007 (6257277)The review asked for changes again and was right on all five P1s. Findings 2-5 are fixed in the next commit, each with a YAML test that fails on 6257277 (
On the property tests, the review said the oracles repeat the implementation's classification. They now take the payee as the head (the generator reports no awards) and read the child benefit QYP flag from the model. After the #1896 rebase they read |
Codex review — changes requiredReviewed commit code-1 — [P1] Replace the QYP-complement helper with actual claimant/partner rolesThe current helper Executed illustration: a reported continuing HB award for an intended couple aged70/19, both parent-flagged, with the19-year-old in qualifying education and receiving standard PIP daily living, plus a separate40-year-old working non-dependant earning£30,000. The QYP complement excludes the young partner and sets the claimant exemption false. With £10,000 council rent and HB assessable income isolated at zero, the deduction is£6,232.20 and final HB£3,767.80. A control supplying the legally appropriate claimant/partner disability exemption gives deduction£0 and final HB£10,000. This snapshot lacks the canonical explicit claimant/partner input; the diagnostic's relationship is stated as the intended premise, while the code defect is the inability of this helper to honor that premise. Adopt the canonical relationship/role variable after the prerequisite lands, then add explicit young-partner and third-adult regression cases through final awards. Do not repeat the other four r2 findings: the current tree now includes statutory sick/maternity pay, employed pension deductions and MIF; the benefit-payee test; UC after the benefit cap; and CTR's adult Child Benefit QYP exemption. Confidence: high for the current unresolved helper/integration defect. Independent source review corroborates the actual-couple and claimant/partner conditions in HB regulation 74(3)–(6), HB interpretation and England CTR paragraph 8. The overlapping code and policy finding is counted once. The current tree addresses round-two findings 2–5; this review does not repeat those stale blockers. Current 2026 scale values were corroborated. The remaining confirmed blocker is adoption of the canonical claimant/partner roles and coverage of their downstream HB/CTR behavior. Outstanding evidence/decision:
Validation: 123 focused tests passed, including round-two regression tests. An executed controlled diagnostic isolates the missing partner disability exemption's final-HB effect. The intended relationship is an explicit scenario premise, and supplied benefits/HB assessable income isolate this path; the run does not establish any actual data record's demographics. Six official source originals were inspected and their cached bytes verified. 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:41:08.415704+00:00): same commit, UNSTABLE; 0 failed checks; 1 pending checks. |
|
Review pass (Claude Code, on Vahid's behalf) at Short version: the rules match the law I read, and the tests pass locally. Two things before merge: the claimant-or-partner helper still needs #1896's role variable (the Codex review's P1, which I agree with and won't repeat), and one new should-fix on the student exemption's age default in the household calculator. 1. Should-fix: with no education input, every 18- or 19-year-old non-dependant counts as a full-time student and is exempt.
On main this non-dependant is charged, so the PR introduces the gap for HB and the national CTR schemes (the English local schemes already had it through the same helper). Datasets are unaffected, since the Enhanced FRS stores 2. The claimant-or-partner helper (Codex P1). Checked and correct:
|
A person is on income-based JSA or income-related ESA on a day it "is payable to him" (reg 2(3), (3A)), and a person on income support is one "in receipt of" it (reg 2(1)). A couple's award is paid to the claimant, not the partner. is_on_income_related_esa, is_on_income_based_jsa and is_on_income_support now hold, of the claimant and partner, only for the payee: the one who reports the award, or the claimant where neither does (is_payee_of_couple_award). Another member's report never moves the payee. Anyone else is unchanged (their own report while the award is modelled as paid). Agreed with #2007, whose round-2 review raised the same point and which applies the same reading through its is_award_payee helper; the codebase now reads "who is on" one way. Effects: in the local working-age CTR schemes a non-dependant couple on one of these benefits pays the partner's deduction (one deduction per couple, the higher: Default Scheme Sch para 30(3)); the maintenance-loan ESA proxy follows the student's own award, not their partner's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
e92b5d1 to
f5aae26
Compare
|
Composition note from #2078 (stacked on #2009), which makes the CTR means test assess the applicant and partner rather than the benefit unit's claimant and partner. #2078 changes When this PR's national exemption ( |
Housing Benefit (SI 2006/213 reg 74; SI 2006/214 reg 55): - bands include their lower edge, and only a non-dependant in remunerative work (16+ hours, reg 6(1)) is banded, on the couple's joint income; anyone else pays the reg 74(1)(b) amount; - one deduction per couple, the higher (reg 74(3)); - no deduction for full-time students, State Pension Credit recipients, or under-25s on IS, income-based JSA or UC without earned income (reg 74(7), (8), (10)), nor for any non-dependant when the claimant or partner is blind or on AA, DLA care, PIP daily living or AFIP (reg 74(6)). Council Tax Reduction (SI 2012/2885 Sch 1 para 8; WSI 2013/3029 Sch 1 para 3 and Sch 6 para 5; SSI 2012/319 reg 48; SSI 2012/303 reg 67 and SSI 2021/249 reg 90): - each national scheme's own weekly scale for 2013-14 to 2026-27, instead of the Housing Benefit amounts; - the same banding and couple rules, with Wales's working-age exception for couples on UC; - the schemes' any-age exemptions, the UC limb from the year each scheme added it, and the existing applicant exemption. Fixes #2004; the non-dependant half of #1934. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s, gross income - Identify the claimant or partner as the benefit unit's head or any member who is not an SSCBA s.142 child or qualifying young person (HB Regs 2006 regs 2(1) and 19; CTR regs 2(1)), replacing is_adult in the HB and CTR claimant exemptions. - Band a couple on the couple's joint income only, give the couple one deduction and any other adult in the family their own, and count benefit receipt (IS, JSA(IB), ESA(IR), SPC, UC) only for the award's claimant or partner. - Treat a non-dependant on IS, JSA(IB) or ESA(IR) as not in remunerative work for HB (reg 6(6)). - Take self-employed losses as nil in the UC no-earned-income test (UC reg 57(2)). - Add the family's UC (before the cap), tax credits and child benefit to gross income. - Tests: the review's counterexamples, a non-vacuous SPC exemption case, and property-test generators and oracles for dependent young people and losses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…A disregard - "No earned income" follows UC Regs 2013 regs 52-62: employment income plus SSP and SMP less relievable pension contributions (reg 55(4)-(5)), self-employed earnings with losses nil and the minimum income floor where the UC model applies it (regs 57(2), 62), and other paid work. - IS, JSA(IB), ESA(IR) and SPC count only for the person they are payable to (HB Regs 2006 reg 2(3)-(3A)): the member reporting the award, or the head; used for the exemptions and HB reg 6(6). UC still counts for both joint claimants. - Gross income uses UC after the benefit cap (UC reg 81), applying the cap to the capped benefits other than HB, which a non-dependant family does not receive. - CTR exempts an adult for whom another person is entitled to child benefit (LGFA 1992 Sch 1 para 3, via para 8(8)(b) and equivalents). - Tests: the review's counterexamples, and property oracles for the payee and the child benefit disregard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the local claimant-or-partner helper (benefit unit head, or anyone not a child benefit child or qualifying young person) with the is_claimant_or_partner variable: the SSCBA s.137 couple, at most two people. A partner at school is now a partner, and a third adult in a benefit unit is deducted separately. Adds the round-2 review cases: a blind 16-year-old partner (Wales), a non-dependant couple with a partner at school, and a 17-year-old partner's PIP in Merton. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The changelog and the property generator's comment now name is_claimant_or_partner instead of the SSCBA s.142 definitions, and is_award_payee says that both members of a joint-claim jobseeker's allowance couple are on it (HB reg 2(3)(c)), which the model cannot identify. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ap childcare, child benefit claims - Gross income adds statutory sick, maternity and paternity pay (earnings, HB reg 35(1)(i)) and Maternity Allowance to each person's taxable income, and the family's IS, JSA(IB), ESA(IR) and Pension Credit to a couple's. - Earned income for the UC limb adds statutory paternity pay (UC reg 55(4)(c)), and relievable pension contributions come off self-employed earnings when there are no employed earnings (reg 57(2), step 4). - Scotland's working-age scheme exempts a non-dependant whose partner is on IS, JSA(IB) or ESA(IR) and who is not on Universal Credit, from April 2022 (SSI 2021/249 reg 90(8)(a), reg 4(1)). - The after-cap UC in gross income keeps the cap's childcare protection (UC reg 81(1)-(2)). - The LGFA 1992 Sch 1 para 3 disregard needs a child benefit claim. - The property oracle derives the claimant and applicant exemptions from the generated inputs, and the generator varies statutory pay, pension contributions, the start-up period, the award's reporter and child benefit claims. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
f5aae26 to
084e1f9
Compare
HB(SPC) Sch 3 para 6 has the working-age premium's conditions and para 12 its amounts, so the pension-age premium is severe_disability_premium for a family over State Pension age. A Pension Credit reform no longer moves pension-age HB or CTR. The schedule property keeps the Pension Credit addition as a cross-check. References add the CTR nomination rule and the other premium schedules; the conditions YAML notes the three income-rule defects its awards include (#1908, #2112, #2007). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes main's uv.lock, which drops an unintended one-line lock change from this branch's first commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Independent review, round 3 (452d6bb)Review textVERDICT: REQUEST CHANGES Reviewed #2007 at
Round-2 findings
Tests and legal coverage Round-2/3 YAML expectations are hand-derivable from the legislation with explicit roles. The ESA comment omits £50/week from joint income but lands in the same band; the cap comment's pre-cap £576.92 should be £577.92; the school-couple comment's £269 threshold should be £279. The MIF test exercises an explicitly supplied applicability flag: the upstream default trigger requires positive profit, so this test does not prove inference at zero profit. That upstream approximation is disclosed as applying the MIF where the UC model does. Reading #1896's No new entity-projection error or dependency cycle was found. The live smoke covers computed UC, the cap, tax credits, Child Benefit and the MIF path. Relative to #1896, #2007 does not change any local-scheme formula, shared eligibility or the shared household exemption; national exemptions stay inside the national amount path. Impact and wording The displayed impact table matches The PR still names old main UNVERIFIED: clean-base impact provenance ( Commands and outcomes
Direct Git commits are blocked by the filesystem sandbox: the checkout's Response to review r3 of #2007 (452d6bb)The review asked for changes. It confirmed every round-2 finding resolved, and found three P1s, three P2s, a test-oracle gap and wording points. All are addressed. Each fix has a YAML case that fails on the previous head (75604f5, the rebased 452d6bb content) and passes now: the "Round 3 of the independent review" section of The review was cancelled by Subfleet at 2026-10-02 15:55Z, a minute after it wrote its report. The report is complete apart from the property-test run it had left going.
Tests.
Wording and impact.
Still interpretations, disclosed in the PR. The per-person UC earned-income reading, the Welsh UC-couple reading, and now the Scottish working-age reading of reg 4(1) for a non-dependant. |
… in gross income - The after-cap UC used in a couple's gross income counts Maternity Allowance among the capped benefits (Welfare Reform Act 2012 s.96(10)(i)). - A self-employment or property loss no longer cancels other gross income: it is added back to taxable income (DWP HB guidance A5.551). - A YAML case for the Scottish partner rule's "not on Universal Credit" condition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves the HB docs notebook: main's text with #2000's passport paragraph, plus this PR's reg 74 description after the reg 70 sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Independent review, round 4 (7a5cbe2)Review textVERDICT: REQUEST CHANGES Reviewed exact head
Round-3 findings
The Scottish reading is defensible and adequately disclosed. Reg 90(8)(a) applies the defined category to a non-dependant; the context-dependent reg 4(1) reading makes that limb operative while retaining partner inclusion. The temporal and pension-age distinctions are tested. Settled administrative guidance remains UNVERIFIED. Round-2 preserved probes pass 21/21 comparisons across 10 households. Earlier-round policy regressions also pass. No automatic double counting or entity projection error was found. The newly added income classes are outside The claimant oracle is now independent where required. Remaining upstream identity/QYP/MIF classifications are unchanged. Coverage still omits generated binding caps and MA; the generator also pins The scope list is incomplete for the two findings above and should explicitly identify the net-profit/gross-receipts limitation. Actual-period tax/NI, carried losses, surplus/notional income and mixed-employment excess-pension offsets remain UNVERIFIED, without additional established failures from matching inputs. Commands and results All
Full model suite, survey reproduction, CI status, independent legislative scale re-verification, and author mutation outcomes: UNVERIFIED / not run. No individual survey records were printed. Saved full review and verified commit bundle, containing commits Direct commits were blocked because the worktree’s Git index is outside the writable workspace. Production files remain unchanged at Response to review r4 of #2007 (7a5cbe2)The review asked for changes. It confirmed:
Its two P1s are fixed in aa44a1a, each with a YAML case in the "Round 4 of the independent review" section that fails on 7a5cbe2 and passes now. The P3 wording points are addressed in the PR body. Main is merged in as d872f57; the only conflict was the HB docs notebook.
Mutation: the YAML suites killed 30 of 31 on 7a5cbe2. The survivor was the Scottish rule's "not on Universal Credit" condition, which the property tests killed. aa44a1a adds a YAML case that kills it ("Scotland's partner rule does not cover a couple on Universal Credit", CTR £288.60). Tests on d872f57: targeted YAML 499 passed, properties 6 passed. |
Review r5 (P3-3): the case is Scottish, so cite SSI 2021/249 reg 20(2) and reg 79(4) for the student exclusion and the divisor, and note that reg 90(7)(c) makes no deduction for a full-time student non-dependant. The model's national deduction is nil there only because the head has no income; #2007 adds the student exemption. Comment only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2004. Also fixes the non-dependant half of #1934; its pensioner-gate half stays open.
Summary
Housing Benefit and the national Council Tax Reduction schemes now make non-dependant deductions the way the regulations set them. Law was read on legislation.gov.uk at the 7 April 2025 point in time, plus each year's version for the CTR scales.
Housing Benefit (SI 2006/213 reg 74; SI 2006/214 reg 55 is the same for these rules):
right=True, so £192.00 a week fell in the band below and £0 paid nothingCouncil Tax Reduction: the England pensioner (SI 2012/2885 Sch 1 para 8), Welsh (WSI 2013/3029 Sch 1 para 3 and Sch 6 para 5) and Scottish (SSI 2012/319 reg 48; SSI 2012/303 reg 67, then SSI 2021/249 reg 90) schemes.
gov.benefit_uprating_cpi, as Set DWP benefit rates to the announced amounts, not CPI projections #1925 does for the HB scale.would_claim_child_benefit). An election not to be paid keeps entitlement (s.13A), so the opt-out flag is not read;council_tax_reduction_household_has_non_dep_exemptionexisted but only the local schemes used it. It now applies to the national schemes too.council_tax_reduction_individual_non_dep_deduction_eligible, so the national exemptions are applied insidecouncil_tax_reduction_individual_non_dep_deduction, not there.New variables:
housing_benefit_non_dep_deduction_exempt(Person)housing_benefit_non_dep_deductions_claimant_exempt(BenUnit)council_tax_reduction_non_dep_deduction_exempt(Person)New parameters:
remunerative_work_hours(16)income_related_benefit_age_limit(25)non_dep_deduction/{amount, remunerative_work_hours, exempt_universal_credit_without_earned_income}HB
age_threshold(18) now starts in 2006, when the 2006 Regulations were made, not 2019.Inputs and choices
Full-time student:
current_education != NOT_IN_EDUCATIONorin_HE, the helper the local schemes already use. In the Enhanced FRS,current_educationcomes from FTED/EDUCFT ("in full-time education"), so it is the full-time flag. Note the age-based default: with no input, an 18- or 19-year-old is in tertiary education and so exempt.Claimant or partner:
is_claimant_or_partner(Replace generic child and adult flags with each programme's legal definitions #1896), the SSCBA s.137 couple a benefit unit is formed around: the claimant and at most one partner, supplied by the dataset or inferred from the benefit unit. That matches the HB Regs 2006 (regs 2(1), 19) and the CTR regulations (reg 2(1)), where a family's other members are the children and young persons. It is used for:council_tax_reduction_household_has_non_dep_exemption, which the English local schemes also read);Gross income: a person's own income is their taxable income (
total_income, floored at zero) plus statutory sick, maternity and paternity pay, which are earnings (HB reg 35(1)(i)) that the model keeps outsidetotal_income, and Maternity Allowance. A claimant or partner of the non-dependant's family is banded on the couple's own income plus the family's UC, CTC, WTC, child benefit, Income Support, income-based JSA, income-related ESA and Pension Credit. Anyone else in the family is banded on their own income.universal_credititself depends on HB through the cap, so using it would be circular.On a benefit: the IS, JSA(IB), ESA(IR) and SPC exemptions, and HB reg 6(6), apply only to the person the award is payable to (HB reg 2(3)-(3A), "payable to him"). That is the member who reports the award, or the benefit unit's head where none does. UC counts for both joint claimants (reg 2(3B), entitlement). The award is read from the benefit unit's total, which on main includes any other member's report. Count only the claimant's and partner's legacy awards in means tests and passports #2027 adds payee-only
is_on_income_support,is_on_income_based_jsaandis_on_income_related_esa, which read the couple's own award. A follow-up (task_6c880fe4) switches these exemptions to them once both PRs are on main. In the Enhanced FRS, no member outside the couple reports these awards (Count only the claimant's and partner's legacy awards in means tests and passports #2027's analysis), so the interim reading changes nothing in the data.HB reg 6(6): the person an IS, JSA(IB) or ESA(IR) award is payable to is treated as not in remunerative work, so pays the lowest amount whatever their hours.
UC entitlement:
universal_credit_pre_benefit_cap > 0, becauseuniversal_creditdepends on Housing Benefit through the benefit cap and would be circular."Earned income" in the UC limb (UC regs 52-62):
Testing the person's own earnings rather than a joint award's is an interpretation. The limb reads "the award is calculated on the basis that the non-dependant does not have any earned income", and a joint award is calculated on combined earnings (UC reg 22(1)(b)). I found no DWP guidance that settles it. The local-scheme work on Charge non-dependant deductions for non-dependants within the claimant's benefit unit #2017 keeps the couple reading for the five English local schemes.
Not modelled
is_apprenticehas no £195 earnings cap, so it isn't used.benefit_cap_reductionalso leaves out Maternity Allowance, which this PR's helper now counts (a follow-up).Review
Round 1 (independent Subfleet review of 59c7082, Opus 5.5 after a rate-limited first attempt) asked for changes.
is_adultas claimant or partner;non_dependant_deduction_review_cases.yamland new cases inhousehold_benefits_individual_non_dep_deduction.yaml). The response is in the PR thread.What round 1 confirmed: 288 CTR fixture and parameter comparisons and the 11 HB 2026-27 values; no leak into the five English local schemes; no dependency cycle in 48 household-years; the full HB, UC and local-authority YAML suites passing.
Round 2 (Subfleet review of 6257277) asked for changes. Fixed in b7f9763 (e92b5d1 before the rebase), each with a test that fails on 6257277 (the "Round 2" section of
non_dependant_deduction_review_cases.yaml):Explicit young partners (round 2's identity finding): fixed by adopting Replace generic child and adult flags with each programme's legal definitions #1896's
is_claimant_or_partnerafter rebasing onto it. The local helper is gone. The "Round 3" section ofnon_dependant_deduction_review_cases.yamladds round 2's three cases: a blind 16-year-old partner of a Welsh 19-year-old applicant (HB and CTR £0), a non-dependant couple with a partner at school banded on joint income (HB £3,346.20, CTR £551.20), and a 17-year-old partner's PIP in Merton (deduction £0). Each fails with the partner'sis_claimant_or_partnerset to false.The round 1 and round 2 responses are in the PR thread.
Round 3 (Subfleet review of 452d6bb, the content rebased on Replace generic child and adult flags with each programme's legal definitions #1896) asked for changes. It confirmed every round-2 finding resolved. Fixed in 084e1f9, each with a case in the "Round 3 of the independent review" section of
non_dependant_deduction_review_cases.yamlthat fails without the fix:explain.py), the CTR recipient metric now counts national-scheme households only, and three YAML comments are corrected.Round 4 (Subfleet review of 7a5cbe2, GPT-6.1 Sol) asked for changes. It confirmed every round-3 finding resolved, the Scottish reading defensible and disclosed, all 72 impact-table cells, and no new cycles or local-scheme leaks. Fixed in the round-4 commit, each with a case in the "Round 4 of the independent review" section that fails without the fix:
Round 5 (a delta review of the round-4 fixes on the final head) gates the merge.
Invariants
These hold for every input:
tests/fixtures/council_tax_reduction_non_dependant_deductions.yaml.Tests
YAML (all with hand-worked expectations from the law):
current_educationandwould_claim_uc: false(an income-free 18-year-old is otherwise entitled to UC without earned income, and so exempt).test_non_dependant_deduction_properties.py: Hypothesis populations for invariants 1-6 and 9 (with explicit examples for the rare Welsh-couple and under-25 cases), the exhaustive edge check (7), and the fixture differential (8).Scale verification: an independent check (Subfleet, GPT-6.1 Sol) of all 294 CTR scale values against the amending instruments as made returned ALL MATCH, 42 scheme-years. It also confirmed that every instrument applies from 1 April, and that Wales's and Scotland's pensioner and working-age scales are identical. Three drafting points don't change any value:
Mutation testing (on 7a5cbe2,
mutate3.py): 31 hand-made mutations, each reverting one rule. They cover HB banding, exemptions, couples, the claimant exemption, reg 6(6) and the under-25 limit; CTR banding, exemptions, the Welsh and Scottish couple rules, the applicant exemption, the UC limb and LGFA para 3; and the shared gross-income, earned-income, cap and claimant-or-partner rules.Commands:
policyengine-core testonhousing_benefit,universal_credit,gov/local_authorities,LHA_claimant_composition.yamlandbenefit_cap.yaml: 489 passed.pytest test_non_dependant_deduction_properties.py: 6 passed.pyteston the parameter description, metadata, fiscal-year and build-metadata tests: 22 passed, 1 skipped.policyengine-core testonhousing_benefitandgov/local_authorities: 259 passed.test_council_tax_reduction_pension_credit_properties.py,test_housing_benefit_pension_age_properties.py,test_lha_freeze.pyandtest_carer_support_payment.py, passed.ruff format/ruff checkon the changed files.Targeted tests only. The full suite is left to CI.
Impact (Enhanced FRS 2024-25)
Real runs of
main(9eccc54) and this branch (d872f57) on the same dataset. Every row equals the run of 7a5cbe2 against main 6fa14dc, before the round-4 fixes; the fixes change no aggregate in this dataset. Nothing is scaled.compare.pyanddecompose.pyproduce the tables;explain.pyandexplain_ctr.pyproduce the figures in the bullets (weighted aggregates only).CTR losers, and the changes in Universal Credit and Pension Credit, round to zero (under 0.05k families; under £0.05m).
2025-26 is larger. That year 15.7k non-dependants live with HB recipients (14.1k in 2026-27), and HB recipients' non-dependant deductions are £23.6m (£14.1m in 2026-27). The effect grew with main, not with this branch:
compare4.md);base4.json,base6.json).2025-26 also uses main's 2025 HB scale, which Set DWP benefit rates to the announced amounts, not CPI projections #1925 corrects.
Housing Benefit, decomposed. Separate real runs of this branch for 2026-27, adding one part at a time (variable overrides in a separate process per run):
Who is affected (2026-27). 14.1k non-dependants live with HB recipients:
HB losers (2026-27). All 2.2k losing families live with a charged non-dependant who has no taxable income, and who now pays the lowest amount (£20.40 a week); before, zero income paid nothing. Losers with a charged non-dependant who has positive income round to zero (under 0.05k). 2.0k lose exactly £20.40 a week. In 2027-28, 0.9k people move below the BHC poverty line, all in households whose HB falls, and under 0.05k move above it; 2028-29 to 2030-31 show the same net +0.9k.
Council Tax Reduction.
Merge order and overlaps
household_benefits_individual_non_dep_deduction.yaml.ctr-claimant-household-head(stacked on Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006) makes the CTR applicant the family holdingis_household_head, not every family tied for oldest. It also excludes every claimant family from non-dependant eligibility. The changes compose, since this PR doesn't touch either variable, and its CTR tests make the applicant strictly oldest. Older relatives it reclassifies as non-dependants get this PR's scheme scales and exemptions (including SPC). Whichever lands second reruns its impact.is_claimant_or_partner. This PR reads it everywhere it needs the couple, and keeps Replace generic child and adult flags with each programme's legal definitions #1896's version ofcouncil_tax_reduction_household_has_non_dep_exemption.council_tax_reduction_non_dep_deductions, so it picks this up.Axiom
axiom: uk/regulation/uksi/2006/213/74, uksi/2006/214/55, uksi/2012/2885/schedule/1/paragraph/8, wsi/2013/3029/schedule/1/paragraph/3 and schedule/6/paragraph/5, ssi/2012/319/48, ssi/2021/249/90 queued TheAxiomFoundation/rulespec-uk#407uk/policies/housing_benefit_composed_entitlement_pipeline.yaml) has the reg 74 bands for 2026-27 only, with inclusive>=edges. But it bands every non-dependant, multiplies one amount by a non-dependant count, and has no couple rule or exemptions. The 2025-26 amounts are in rulespec-uk#382.review_finding, and companion tests from the same 2026-27 law as this PR's YAML tests. It carries thepe-paritylabel.🤖 Generated with Claude Code