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 36 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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
…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 <[email protected]>
…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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
…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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
Response to round 6Round 6 (an independent Subfleet review of 0b6c3db, the composition with main) asked for changes and found no P1. Its report is below this response. Each finding is addressed at 4a0935b. P2-1: main's sharers property test failed.
P2-2: the body described the pre-composition head. The body is rewritten for 4a0935b:
P3-3: no test of the mixed-scheme recompute.
P3-4: the cap basket counted every member. 2574473 counts a person's own contributory JSA and ESA, incapacity benefit, SDA and Maternity Allowance only for the claimant or partner (UC Regs 2013 reg 79(1)).
P3-5: thin 2025-26 coverage. There are now 2025-26 second- and middle-band cases (£45.15 and £101.35). 9ae8f16 also replaces main's "Other investment income does not move a worker's band" with the lawful band, £126.65 a week. CI at 4a0935b:
Aggregate impact on certified uk-data 1.58.1 (base main 07985ed). Spending, caseloads, incomes, absolute poverty and relative BHC poverty are identical to the run for 0b6c3db. Only relative AHC poverty differs, because the base moved. A delta review (round 7) of 4a0935b gates the merge. Round 6 review (independent Subfleet review of 0b6c3db)VERDICT: REQUEST CHANGES Review of #2007 at 0b6c3db (composing merge bd5dd8d plus the #2078 merge), against main 76cfc9e. The model code is right on every composition point I tested. No P1 was found. Two P2s block merge at this exact head, and neither needs a model change:
Clearing them needs CI green on 8e60349 plus a refreshed body. A delta check of those two suffices unless the model code changes. FindingsP2-1: main's sharers property test fails at the reviewed head (fixed by test-only 8e60349)
P2-2: the PR body does not describe this headSource: the live body ( Composition says the opposite of the code.
Removed variables are named.
Impact is for another head.
Changed main tests aren't listed. "Two existing tests change" omits:
Merge-order section is stale. It calls #2006 a draft; #2006 is merged. Failing input: N/A (disclosure). Expected:
P3 (non-blocking)P3-3: the new mixed-scheme recompute path has no test in the PR.
P3-4: the after-cap UC basket counts every member, not just the couple.
P3-5: 2025-26 mid-band HB coverage is thinner. Main's 2025 "Middle amount" (101.35) and second-band (45.15) cases were replaced:
The replacement is justified: main's cases had no hours input, so under reg 74(2) they now pay the lowest amount. 1. Composition with mainHB.
This composes correctly with #2006's reg 3 and 74(5) treatment:
Probes:
CTR. For each applicant B,
The result is then multiplied by
Welsh and Scottish working-age-only rules. Wales Sch 6 para 5(3) ("other than where there is an award of universal credit") is absent from Sch 1 para 3(3). The PR applies the UC-couple rule only when the applicant's own family is working-age, and the Scottish partner rule only in the working-age scheme. Both are correct. Leakage into the English local schemes. There is none.
Cap.
Randomised differential against an independent oracle.
2. Main's tests that this PR changedAll four changes are justified by the law; none hides a regression.
The removed 2014 cases in
3. Earlier rounds still hold
To compose with main's API, I changed the old probes in two ways: 4. Tests
The first probe run was invalid: my builder omitted household members. It is kept as 5. Impact
Not verified
All scripts, logs, statutory texts and the review are committed on the detached workspace ( |
…ain's per-applicant exemption Resolutions in the PR's hand-off. The local schemes now take the shape of #2017's national aggregator (deduction_per_family over the CTR applicant's in-unit set), main's is_on_* payee tests for every para 30(8)(a) benefit, and the person's own earnings for the Universal Credit limb. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…gs, and #2017's head-alone couple Para 30(8)(c) of each local scheme exempts a non-dependant entitled to Universal Credit "calculated on the basis that the person does not have any earned income". The merge reads it on the person's own earnings, as #2007's national schemes read the same words, so the non-earning member of a UC couple is exempt: Merton's couple pays 691.60, not 962 (CTR 1,108.40), and Newham's partner's own deduction is nil (the couple's one deduction, the worker's, is unchanged). Main's IIDB case for a grandmother who applies alone noted that the model charged nothing for the couple in her benefit unit until #2017. With #2017 they are her non-dependants: one deduction, the lowest (5.20 a week), so council_tax_benefit is 1,195.968. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Apply the 16-hour threshold and the IS/JSA(IB)/ESA(IR) exclusions, using the existing personal receipt flags and #2007 parameter files. Retain existing rates, eligibility, couple rules and band edges. Add 2026 regressions and update fixtures for the flat non-worker amount. Co-Authored-By: Claude Opus 5.5 <[email protected]>
The independent delta review of 404daf7 found a P1. The work gate charged the flat £20.40 a week to every non-worker. Before the gate, a non-worker with no banding income got the scale's zero, because calc(0, right=True) hits the zero sentinel. Many such non-dependants are exempt by law, and the model can identify them: - the non-dependants of an Attendance Allowance claimant (HB reg 74(6), reg 55(6), CTR Sch 1 para 8(6) and equivalents); - for CTR, a non-dependant on IS, JSA(IB), ESA(IR) or Pension Credit, or on UC without earnings (para 8(8)(a), (c)); - for HB, a non-dependant under 25 on IS (reg 74(8)). Measured alone, the gate cut HB about £6m a year and CTR about £1.7m. A non-worker's deduction is now the lower of the banded amount and the flat amount. At positive banding income, including pension income, that is the flat amount, as reg 74(1)(b) and its equivalents require. At nil income it is still zero, until #2007 models the exemptions together with the flat charge. The six snapshots the gate moved for nil-income non-workers are back to their pre-gate values. These are the two pension-age AA claimant cases, the two CTR claimant cases, and the two investment-income non-worker cases. The two new files' nil-income cases now assert zero. Two guards are added, an HB non-dependant under 25 on IS and a CTR non-dependant on UC without earnings, both at nil income. The CTR IS, JSA(IB) and ESA(IR) cases note that para 8(8)(a) exempts them; that exemption stays for #2007. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Resolve the conflicts with #2620's programme gross incomes and work gate: the deduction bands each programme's own gross income (now with losses as nil and other investment income), inclusive band edges and the flat reg 74(1)(b) amount replace right=True and the min_ cap, and the exemptions and the work test read #2027's is_on_* status. Co-Authored-By: Claude Opus 5.5 <[email protected]>
#2620's gate cases, gross-income cases and the national CTR maintenance test now expect each CTR scheme's own scale, the flat (1)(b) amount for non-workers and the exemptions; the PR's own cases band the programme gross-income variables instead of total_income, which main now defines as the Income Tax Step 1 total. The property tests read #2027's is_on_* status, check banding against gross income built from the inputs, and check the after-cap Universal Credit against universal_credit. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…he fragment Co-Authored-By: Claude Opus 5.5 <[email protected]>
…income Another member of the benefit unit claims those awards in their own right (#2027's claimant_or_partner_* awards), so they no longer raise the couple's band. The HB work-gate cases hold family awards at zero so a nil income is nil, and the property oracle follows the same rules. Co-Authored-By: Claude Opus 5.5 <[email protected]>
A family's UC counts in the couple's joint gross income where either of them claims it, and in another member's own income where is_uc_claimant makes them the claimant; the UC limb of the exemptions reads the same assessed claimants. Two cases pin it, and that another adult's own ESA stays out of the couple's income. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
…pendants The exemption for a non-dependant on Universal Credit "calculated on the basis that [they do] not have any earned income" now reads uc_individual_earned_income, so allowable expenses, company income, trading losses and the couple minimum income floor follow UC's own rules. The capped award counted in a couple's gross income now shares the award's calculation of the regulation 81 reduction and of the part a protected minimum floor lets it take, and reads a stored or neutralized universal_credit, a universal_credit formula a reform replaces, and a stored cap reduction or welfare-benefit total. Co-Authored-By: Claude Opus 5.5 <[email protected]>
… award WSI 2013/3029 Sch 6 para 5(3) lifts the one-deduction rule where there is an award of Universal Credit to the couple. Another member's award as a single claimant now leaves the couple one deduction. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Four earned-income cases (expenses, a trading loss, company income, a couple's floor), two Welsh cases where a third adult alone claims Universal Credit, the capped award under an 85% protected floor and with stored and replaced values, and an invariant comparing the exemption with Universal Credit's earned income. The property generator now varies is_uc_claimant. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Both gross-income variables now add tax_free_savings_income (ISA interest unless a total is supplied) and individual_savings_account_dividend_income, as main's local CTR schemes do. The documentation describes treating a loss as nil as an approximation: the model holds profits, not the receipts DWP guidance A5.551 counts. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Each English case had a sole 30-year-old forced onto the pension-age scheme. It now has a 70-year-old applicant and a separate 30-year-old non-dependant, and the model works out each family's scheme. Expected deductions don't change. Co-Authored-By: Claude Opus 5.5 <[email protected]>
A family with a 0.5% share of the rent is a joint occupier, not a non-dependant (HB reg 3(2)(d)), and a partner's PIP daily living component exempts the claimant's family (reg 74(6)). Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
An is_uc_claimant input for some people stores False for the rest, so the generated populations now enter it for every person or leave the model's default. The earned-income invariant compares the exemption with Universal Credit's earned income for the claimants the award assesses, and the capped-award invariant sets the protected floor in place on one simulation and checks that the floor never lowers an award. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A reform that scales main's universal_credit formula still reads the cap reduction, and so Housing Benefit and the non-dependant deduction. The deduction now catches that cycle and calculates the award without Housing Benefit, as for current law, and a test pins the result. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
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. The law was read on legislation.gov.uk at the 7 April 2025 point in time. For the CTR scales, each year's version was also read.
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 covers three schemes:
The changes:
gov.benefit_uprating_cpi, as Set DWP benefit rates to the announced amounts, not CPI projections #1925 did for the HB scale.would_claim_child_benefit).council_tax_reduction_applicant_has_non_dep_exemption(Assess each Council Tax Reduction claim under its own family's scheme and exemption #2015). Before, only the English local schemes did.council_tax_reduction_individual_non_dep_deduction_eligible.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}working_age_exempt_partner_of_income_related_benefit_claimant(from 2022-04-01)HB
age_threshold(18) now starts in 2006, when the 2006 Regulations were made, not 2019.How this composes with main
Since this PR opened, main has changed who is charged and who claims (#2006, #2009, #2015, #2027, #2078, #2089). This PR keeps those structures and supplies the amounts and exemptions.
housing_benefit_non_dep_deductions). For each family, the deduction is built in four steps:is_non_dependant_of_household_head, Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006). Joint occupiers, boarders and lodgers are not non-dependants (reg 3(2)(d)-(e), 3(4)). A family that bears a share of the rent is a joint occupier, so it is left out even where the rent is nil. In that caseis_non_dependant_of_household_head, which tests the family's own rent, counts it.share_of_household_rent(reg 74(5), Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006). So each family liable for the rent bears its share, and a boarder or lodger bears none.council_tax_reduction_non_dep_deductions). Each applicant family is assessed under its own scheme (council_tax_reduction_pensioner, Assess each Council Tax Reduction claim under its own family's scheme and exemption #2015).council_tax_reduction_individual_non_dep_deductionandcouncil_tax_reduction_non_dep_deduction_exemptreport each person under the scheme of the household head's family. That family is the applicant under Give Council Tax Reduction to the household head's family, not the oldest adult's #2009._national_non_dependants.py. Three rules depend on the scheme:council_tax_reduction_joint_liability_share(para 8(5)).council_tax_reduction_applicant_has_non_dep_exemption.uc_benefit_cap, which replacedbenefit_cap.uc_benefit_cap_reductionoruniversal_credit: both depend on Housing Benefit throughbenefit_cap_welfare_benefits. Reading either raises aCycleError(checked by the round-6 review).is_on_income_support,is_on_income_based_jsaandis_on_income_related_esa.is_award_payee) for the IS, JSA(IB) and ESA(IR) exemptions and HB reg 6(6).Inputs and choices
Full-time student:
current_education != NOT_IN_EDUCATIONorin_HE, the helper the local schemes already use.current_educationcomes from FTED/EDUCFT ("in full-time education"), so it is the full-time flag.Claimant or partner:
is_claimant_or_partner(Replace generic child and adult flags with each programme's legal definitions #1896).Gross income:
total_income, floored at zero), plus:total_income;uc_benefit_cap) is applied to the capped benefits other than Housing Benefit, which a non-dependant family does not receive.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").
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. Readinguniversal_creditwould be circular (see "Benefit cap" above)."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:
Not modelled
is_apprenticehas no £195 earnings cap, so it isn't used.benefit_cap_welfare_benefits, the total UC and HB actually cap, also leaves out Maternity Allowance, as its documentation says.Review
Each round was an independent Subfleet review with a workspace that could run tests. In rounds 1-5, every fix came with a test that fails on the reviewed head. The reviews and responses are in the PR thread.
Round 1 (59c7082) asked for changes. It found five P1s:
is_adultused as claimant or partner;It also found two omissions to disclose.
Round 2 (6257277) asked for changes:
is_claimant_or_partner.Round 3 (452d6bb) asked for changes:
Round 4 (7a5cbe2, GPT-6.1 Sol) asked for changes:
Round 5, a delta review, approved d872f57. That was the last head before main was merged in.
Round 6 reviewed the composition with main at 0b6c3db.
council_tax_reduction_non_dep_deductions_mixed_schemes.yamladds the review's England, Wales and Scotland cases.is_claimant_or_partner. A YAML case gives a 17-year-old in the family her own Maternity Allowance; it fails on 8e60349 (HB £5,470.40, CTR £551.20 instead of £6,232.20 and £691.60).Round 7, a delta review of this head, gates the merge.
Invariants
These hold for every input:
tests/fixtures/council_tax_reduction_non_dependant_deductions.yaml.Tests
non_dependant_deduction_review_cases.yaml.household_benefits_individual_non_dep_deduction.yaml.housing_benefit_non_dep_deductions.yaml.right=True, and its comment deferred the reg 74(1)(b) amount to this PR.housing_benefit_individual_non_dep_deduction_eligible.yaml. The 18-year-old "Eligible" case now setscurrent_educationandwould_claim_uc: false. Otherwise the age default makes them a student, and an income-free 18-year-old is entitled to UC without earned income. Both would exempt them.council_tax_reduction_individual_non_dep_deduction.yaml. This is rewritten on England's 2025-26 pensioner scale (SI 2025/39).council_tax_reduction_pension_credit.yaml. The guarantee-credit case's son has no hours, so he pays England's £5.20 a week (it was the HB scale's £20.40). CTR is £1,729.60.claimant_family_scheme.yaml. The 40-year-old adult child has no work, no award and no education, so pays para 8(1)(b)'s £5.20 × 52 = £270.40. CTR is £1,800 − £270.40 = £1,529.60. Main's £1,800 came fromright=Truegiving zero income nothing.test_rent_of_sharers_boarders_and_lodgers_properties.py(main's Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006 test). Its non-dependant invariant assumed the household's HB deductions equal the sum of every non-dependant's individual amount. With reg 74(3) and (6) they are invariant 10 above, so the test now asserts that. A sharer's family is never in the HB pool, even at nil rent.test_non_dependant_deduction_properties.py:mutate3.py). There were 31 hand-made mutations, each reverting one rule. The YAML suites kill 30, and a round-4 case kills the 31st. The property tests kill 21; YAML cases kill the ten survivors.CI, merged with main 07985ed. All checks pass:
The host's disk was paused for local test suites at this head. Every new YAML case passes in CI's YAML job. Some were also run by direct calculation:
Charge non-dependant deductions for non-dependants within the claimant's benefit unit #2017's branch, which merges this head, also ran the targeted YAML suites (1,645 passed) and the three property suites (15 passed).
Round 6 ran the targeted suites at 0b6c3db: 1,108 + 150 YAML passed, and the property tests passed.
ruff formatandruff checkon the changed Python files: clean.Impact (Enhanced FRS 2024-25, certified uk-data 1.58.1)
CI's aggregate impact job for 4a0935b compared main (07985ed) with this PR merged into it. Both sides ran on the certified dataset: policyengine-uk-data 1.58.1, sha256 056e80fd8e91. Each fiscal year is a full microsimulation run on each side, and nothing is scaled. The job passed with no check broken. The model changes since round 6 (the cap basket and the joint-occupier mask) moved no figure here: spending, caseloads and incomes equal the CI run for 0b6c3db (base 76cfc9e) to the rounding shown.
The flagged move: +25.3k pensioners in relative poverty before housing costs in 2027-28. This comes from the poverty line moving, not from anyone becoming poorer.
relative_line.py; main 76cfc9e against 0b6c3db, whose relative BHC figures equal this head's) compared each person's equivalised HBAI income with the line.The rule-by-rule decomposition in earlier rounds was for d872f57, on an older main and dataset, so it isn't repeated here. For that head, 2026-27:
Merge order and overlaps
is_claimant_or_partner);council_tax_reduction_non_dep_deductions, so it picks this up.is_on_*variables.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#407HB. rulespec-uk's HB pipeline (
uk/policies/housing_benefit_composed_entitlement_pipeline.yaml) has the reg 74 bands for 2026-27 only, with inclusive>=edges. But it:The 2025-26 amounts are in rulespec-uk#382.
CTR. Every CTR spine takes non-dependant deductions as a supplied input.
The issue. All seven provisions are in axiom-corpus.
pe-paritylabel.Reproducer:
policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_chain.yaml::A zero-income full-time student does not reduce the claimant's HB,policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/housing_benefit_non_dep_deduction_chain.yaml::A zero-income non-student non-dependant pays the lowest deduction,policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.yaml::Exactly 192 a week is in the band starting at 192,policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_non_dep_deductions.yaml::A Pension Credit pensioner living with a working son (issue 1934)🤖 Generated with Claude Code