Skip to content

Give benefit-unit members aged 16 or over a bedroom under LHA rules - #2010

Merged
juaristi22 merged 115 commits into
mainfrom
lha-bedroom-young-people
Nov 9, 2026
Merged

juaristi22 merged 115 commits into
mainfrom
lha-bedroom-young-people

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2008
Reproducer: policyengine_uk/tests/policy/baseline/finance/benefit/family/LHA_young_person_bedroom.yaml::A qualifying young person has their own bedroom; policyengine_uk/tests/policy/baseline/finance/benefit/family/universal_credit/housing_costs_element/non_dep_deduction/uc_non_dep_deductions_renter_exempt.yaml::UC Sch 4 para 15, a partner whom reg 3(3) excludes from the claim brings no exemption by being blind; policyengine_uk/tests/test_uc_renter_exemption_properties.py::test_the_single_claimants_afip_removes_the_deductions
axiom: TheAxiomFoundation/rulespec-uk#527 queued; UC Sch 4 para 13 encoded-correct; TheAxiomFoundation/rulespec-uk#413 queued (UC Sch 4 paras 15-16); TheAxiomFoundation/rulespec-uk#406 queued (UC Sch 4 para 9, HB reg 3, CTR reg 9: who is a non-dependant, joint occupiers, lodgers, the household head); TheAxiomFoundation/rulespec-uk#407 queued (HB reg 74, SPC reg 55, CTR Sch 1 para 8)

Merge order

This PR contains #2007 and #2017 by merge. 0198ce4c9 merges main at 5c7744144 into #2007's head fde435bd3, and 6900b88b7 supplies Housing Benefit with main's supplied benefit cap totals. 9f951ed43 merges that into #2017's head b3e0d76b8; #2017 then limits the renter exemption to the claimants and counts reg 2's attendance allowance (866d0941f, 65009ed34, 33cd8db44) and moves two of main's CTR cases for its deduction (d2faa3bc9). 7a99a5953 merges #2017's head d2faa3bc9 into this branch. Git reported no conflict in the last two merges. af54f8fec moves the renter exemption cases to the 2 bedrooms this PR gives the son, and 135b41ef8 lets property 4's test read main's new qualifying young person route (UC reg 5(1)(a)). #2007's ce2aef8c6 then merges main at fed9bcabe, 109fe2dd4 merges that into #2017, and 56de9a693 merges that into this branch. #2007's ae4721f24 then keeps two ESA band cases off the legacy closure claim, ae2be5fbe merges that into #2017, and 1bda5418d merges that into this branch. Git reported no conflict in those merges; #2007's description covers its own. c536e7bd0 then merges main at d60944e9e into this branch and resolves its conflicts, and 7ff98b0b0 and e2376fed0 adjust two properties. #2007's fe69a8caa then merges main at e0502003d, which brings #2300, and 4b44c61a0 merges that into this branch. Git stopped on the two files this branch resolved at c536e7bd0, housing_benefit_individual_non_dep_deduction_eligible.py and programs.yaml, and the merge keeps this branch's versions. #2007's cc94e715b then moves main's lodger's son case in boarders_and_lodgers_non_dependants.yaml to Scotland's CTR scale, which this branch already expected at c536e7bd0. 3c4feda57 merges it into this branch and keeps this branch's version of that file, so no file here changes. #2007's 52fbb2400 then puts main's shard_durations.toml back, and 4bb3813f4 merges it into this branch. #2007's seven extra timings had moved three more tests from tests/microsimulation/ into Python shard 7 of 7, and that shard's runner shut down three minutes in, with 390 MB of memory free (run 42402482489).

#2007 and #2017 land through this PR. This branch contains #2007's head 52fbb2400, so landing this PR lands #2007. #2017 charges an in-unit non-dependant's housing cost contribution, and this PR gives them their bedroom, so #2017 stays a draft and reaches main inside this PR. This PR's diff against main shows #2007's and #2017's changes too. #2017's branch carries b3e0d76b8, which updates a main CTR case for #2017's deduction (see Tests).

What the code does now

LHA_allowed_bedrooms (Universal Credit size criteria) gives a bedroom to each member of the benefit unit aged 16 or over who is not the claimant or partner:

  • a qualifying young person the renter is responsible for (is_child_or_qualifying_young_person_for_universal_credit), under UC Regs 2013 Sch 4 para 10(1)(b);
  • any other such member, as a non-dependant under para 10(1)(c) with para 9(2), unless they head the household. The formula reads is_benefit_unit_non_dependant_for_universal_credit for this, the variable Charge non-dependant deductions within the claimant's benefit unit #2017 adds and the one uc_individual_non_dep_deduction_eligible reads, so the bedroom and the housing cost contribution follow one definition.

uc_non_dep_deductions (from #2017) charges a housing cost contribution for each such non-dependant aged 21 or over who is not exempt (paras 13, 16), in their own family's claim if it makes one, and otherwise in the claim that uc_non_dependants_counted selects (para 9(2)(f)). The bedroom follows the same routing: an in-unit non-dependant of a family that makes no Universal Credit claim of its own also has a bedroom in the claim that counts the household's non-dependants. Where that claim is the non-dependant's own family (a family the model counts as the claim although benunit_is_rent_liable reads false, for example with no rent input), the family's own bedroom already covers them, and the formula adds none. So a joint tenant who claims, sharing with a pensioner head who does not, has 2 bedrooms and pays £1,158.60 a year for the head's son aged 30, as when the son has his own benefit unit; without that routing, the joint tenant would pay the contribution with 1 bedroom.

An adult son in the claimant's benefit unit now has a bedroom and bears the contribution. A claimant aged 45, renting privately at £10,400 a year in Maidstone in 2026, with a son aged 22 who is not in education and has no income, has 2 bedrooms (category C, whose £208.85 weekly rate exceeds the rent), a contribution of £96.55 a month (£1,158.60 a year), a housing costs element of £9,241.40 and Universal Credit of £14,340.20. Household net income comes to £14,260.20: the award, plus the £100 Household Energy Payment, less the £180 TV Licence. Coding the son, not claiming, in a benefit unit of his own gives the same bedrooms, contribution, award and household income.

A qualifying young person no one is responsible for (is_qualifying_young_person_for_universal_credit but not is_child_or_qualifying_young_person_for_universal_credit, so one looked after by a local authority) gets no bedroom. The formula applies this para 9(2)(g) exclusion both to the family's own members and to the household's non-dependants from other families, which count in the claim that uc_non_dependants_counted selects.

The exclusion sits in the UC formula, not in is_non_dependant_of_household_head, because that variable also feeds the Housing Benefit non-dependant rules (housing_benefit_has_non_dependant, housing_benefit_non_dep_deductions), where para 9(2)(g) does not apply.

The formula reads the household head (is_resolved_household_head), whose documentation describes the householder who owns or rents the accommodation in their name, as liable to make payments on a commercial basis for their occupation. A member who heads the household but does not claim then counts as neither a renter (paras 1(2) and 9(1)(a)) nor, under para 9(2)(d), a non-dependant, so the formula gives them no para 10(1)(c) bedroom, and uc_non_dep_deductions charges no contribution for them. A woman aged 45 who claims has 1 bedroom at 2025 if her son, aged 20, not in education and in her benefit unit, heads the household. Liability takes no one out of para 9(1)(b), so a head who is a qualifying young person the renter is responsible for stays in the extended benefit unit and keeps the para 10(1)(b) bedroom. The same woman has 2 bedrooms at 2025 if instead her daughter, aged 17 and in upper secondary education, heads the household. Members of other families never count the head as a non-dependant, because is_non_dependant_of_household_head excludes the head's family.

On main the formula counts only the renter or couple, non-dependants from other families, and children under 16. So a lone parent with a 17-year-old at college gets one bedroom (category B) instead of two (C). On main at 6c6e229, that household (rent £10,400 a year, Maidstone, 2026) has LHA_allowed_bedrooms 1 and a uc_housing_costs_element of £9,000; on this branch it has 2 bedrooms and £10,400.

The renter exemption (from #2017)

uc_non_dep_deductions_renter_exempt (UC Sch 4 para 15) reads is_uc_single_or_joint_claimant, the single claimant or each joint claimant, less a partner whom uc_is_ineligible_partner flags under reg 3(3). Para 1(2) makes the claimants the renters, so a partner who stays in the couple for capital and income but makes no claim brings no exemption. For para 15(2)(c) the formula reads uc_receives_attendance_allowance, reg 2's attendance allowance, which counts head (a), Attendance Allowance, and head (f), armed forces independence payment; the model holds no separate amount for heads (b), (d) and (e).

At 135b41ef8, a claimant aged 45 in Maidstone in 2026 heads the household and pays £10,400 of rent. Reg 3(3) excludes the partner, aged 43, and a son aged 22 shares their benefit unit, with no income and not in education. The model gives the claim 2 bedrooms (category C, whose £208.85 weekly rate exceeds the rent) and a claimant mask of [true, false, false]. With nobody blind, or with only the partner blind, DWP deducts £96.55 × 12 = £1,158.60 for the son, and Universal Credit comes to £5,098.80 + (£10,400 − £1,158.60) = £14,340.20. With the claimant blind, or receiving £5,000 of armed forces independence payment and no Attendance Allowance, the claim pays no contribution and Universal Credit comes to £15,498.80. #2017's head alone gives the son no room, 1 bedroom at the model's £9,000.00, and £12,940.20 with the contribution.

Housing Benefit needs no size-criteria change. housing_benefit_LHA_allowed_bedrooms on main already gives each couple or single adult among the occupiers one bedroom (the formula cites reg 13D(3)(zb) and (a)), and each other occupier aged 16 or over one bedroom under reg 13D(3)(b). That includes a member who heads the household but does not claim: Housing Benefit counts occupiers, not non-dependants (reg 13D(3)), and leaves out of them only "any joint tenant who is not a member of the claimant's household" (reg 13D(12)). The model records joint tenancy only for a whole family (liable_for_share_of_household_rent) and leaves such a family out of the claimant's occupiers. This PR adds HB cases that pin those counts. The HB and CTR non-dependant deductions come from #2017 and #2007; this PR's own code reads neither, and neither reads LHA_allowed_bedrooms.

The law

Universal Credit. Under UC Regs 2013 Sch 4 para 10(1), "A renter is entitled to one bedroom for each of the following categories of persons in their extended benefit unit":

  • (a) the renter (or joint renters);
  • (b) "a qualifying young person for whom the renter or either joint renter is responsible";
  • (c) "a non-dependant who is not a child";
  • (d)-(f) children.

Claimants to whom reg 26(2) applies count as "renters", and joint claimants as "joint renters" (para 1(2)). The extended benefit unit takes in the renter (or joint renters), any child or qualifying young person the renter is responsible for, and any non-dependant (para 9(1)). Anyone else who normally lives with the renter counts as a non-dependant, with exceptions (para 9(2)). Three matter here:

  • (d) "a person who is liable to make payments on a commercial basis in respect of the person's occupation of the accommodation (whether to the renter, joint renters or another person)";
  • (f) "a person who has already been treated as a non-dependant in relation to a claim for universal credit by another person liable to make relevant payments …";
  • (g) "a child or qualifying young person for whom no-one in the renter's extended benefit unit is responsible", such as a young person looked after by a local authority (reg 4(6)). It applies across the whole extended benefit unit, so it also covers a looked-after young person in a non-dependant's family.

Under para 13(1), "a deduction is to be made in respect of each non-dependant who is a member of the renter's extended benefit unit". The Secretary of State exempts a renter to whom para 15(2) applies, and each non-dependant on para 16's list, which includes "(a) a person who is under 21 years old".

Parliament defines a child as a person under 16 (WRA 2012 s.40), and the Secretary of State defines a qualifying young person in reg 5.

For the renter exemption, para 1(2) says: "Claimants who fall within sub-paragraph (1) are referred to in this Schedule as “renters” (and references to “joint renters” are to joint claimants to whom regulation 26(2) applies)." Para 15(1): "No deduction is to be made under paragraph 13 in the case of— (a) any renter who is a single person to whom sub-paragraph (2) applies; or (b) any joint renter where at least one joint renter is a person to whom sub-paragraph (2) applies." Para 15(2) includes "(a) a person who is ... blind" and "(c) a person in receipt of attendance allowance". Reg 2 defines "attendance allowance" by six heads, including "(a) an attendance allowance under section 64 of the Contributions and Benefits Act" and "(f) armed forces independence payment under the Armed Forces and Reserve Forces (Compensation Scheme) Order 2011". Under reg 3(3), "A person who is a member of a couple may make a claim as a single person if the other member of the couple—" has not reached 18 and falls outside reg 8, lives outside Great Britain, serves as a prisoner, has no entitlement under reg 19, or falls within section 115 of the Immigration and Asylum Act 1999.

Housing Benefit. Under reg 13D(3) of the HB Regs 2006 and the HB (SPC) Regs 2006 (SI 2006/213, SI 2006/214), a claimant has "one bedroom for each of the following categories of occupier", including "(a) a couple" and "(b) a person who is not a child". "Occupiers" takes in the persons who occupy the dwelling as their home, "except for any joint tenant who is not a member of the claimant's household" (reg 13D(12)).

Invariants

The Hypothesis properties in policyengine_uk/tests/test_lha_bedroom_young_people_properties.py each run 25 derandomized examples over populations of up to 4 households (up to 3 for properties 5 and 6), with sharers, boarders, lodgers and non-dependant families. On some draws the generator makes the person it adds to the head's family the household head in place of that family's first adult, who stays the claimant. Properties 5 and 6 also draw whether each family would claim Universal Credit.

  1. Monotonicity. Adding a person aged 16 to 19 to any family never lowers any family's UC or HB bedrooms, whether the test supplies the claimant and partner or the model infers them.

  2. Exact effect. When the added person is not the claimant or partner, only these changes happen:

    • their family gains one HB bedroom, and one UC bedroom unless they are a qualifying young person no one is responsible for, or they head the household and are not a qualifying young person;
    • if they join a non-dependant's family, the claim counting the household's non-dependants gains one UC bedroom (with the same exception), and every family liable for the rent gains one HB bedroom;
    • if they are an in-unit non-dependant of a family that makes no UC claim of its own, the claim counting the household's non-dependants gains one UC bedroom;
    • if they join a boarder's or lodger's family, every family liable for the rent gains one HB bedroom.

    Two explicit @examples add a qualifying young person a local authority looks after (aged 17, in upper secondary education, started at 16, before the terminal date), one to a single renter's family and one to a non-dependant's family, so the property always checks the para 9(2)(g) exclusion in both places.

  3. Reference agreement. Every family's bedrooms equal an independent count of the size criteria under both schemes, including the routing in 2. Children's rooms are the fewest that hold them two to a room (same sex, or both under 10), found by brute force, pooled across the HB occupiers.

  4. In-unit non-dependants have a bedroom. Every benefit-unit member aged 16 or over who is not the claimant, partner, a UC qualifying young person or the household head (is_resolved_household_head, whom the formula reads as liable, and so not a non-dependant under para 9(2)(d)) counts as a non-dependant with a bedroom. The test computes that set from age, is_claimant_or_partner, is_qualifying_young_person_for_universal_credit and is_resolved_household_head, and asserts that is_benefit_unit_non_dependant_for_universal_credit, which the formula reads, marks the same people. The bedroom goes to their family, and also to the claim counting the household's non-dependants where their family makes no claim and is not that claim. Making every such member a qualifying young person the renter is responsible for leaves every family's LHA_allowed_bedrooms unchanged, except that the counting claim loses the bedroom of one whose family makes no claim: another family's qualifying young person is not that renter's non-dependant (para 9(2)(g)).

  5. Rooms and contributions. Nobody owes a housing cost contribution without being a non-dependant. When the test adds an adult aged 16 to 64, not in education, with or without Attendance Allowance, to any family as an in-unit non-dependant, they owe a contribution unless aged under 21 or receiving Attendance Allowance (para 16(2)). The claim that bears it (their own family's if it makes a claim, otherwise the counting claim) gains that contribution unless its renter is exempt under para 15, and gains one bedroom; no other family's contributions change.

  6. Coding. Moving such an adult, not claiming, between a family and a benefit unit of their own leaves every claiming family's UC bedrooms, contributions and award unchanged.

test_uc_renter_exemption_properties.py (from #2017) checks two more, with 10 derandomized examples each over 8 households of a renting claimant aged 18 to 64, a partner whom uc_is_ineligible_partner flags, an adult son in their benefit unit and an adult in a non-claiming family of their own:

  1. An excluded partner changes nothing. Making the flagged partner blind, or giving them Attendance Allowance, armed forces independence payment, the middle or highest DLA care rate or the PIP daily living component, in any combination, never changes any family's UC non-dependant deductions or para 15 flag.
  2. The claimant's armed forces independence payment exempts the claim. Giving the single claimant any positive armed forces independence payment always exempts the claim and removes its non-dependant deductions.

The formula computes a fixed expression of its inputs, with no randomness, so it gives the same result for the same inputs.

Tests

  • LHA_young_person_bedroom.yaml, 14 cases:

    • qualifying young people aged 17 and 19;
    • an 18-year-old non-dependant;
    • a looked-after qualifying young person (no UC bedroom);
    • a couple with a young person, a boy of 12 and a girl of 8 (4 bedrooms, E);
    • a partner aged 19 (no extra bedroom);
    • a pension-age couple's grandchild at college under HB (SPC);
    • a looked-after young person in a non-dependant's family (adds no UC bedroom for the household head);
    • a non-dependant couple (UC 3 bedrooms, HB 2);
    • a claimant aged 45 whose son aged 20, in her benefit unit, heads the household (UC 1 bedroom, B, at 2025);
    • a claimant aged 45 whose daughter aged 17, a qualifying young person in her benefit unit, heads the household (UC 2 bedrooms, C, and HB 2 bedrooms, C, at 2025);
    • the adult son aged 22 in the claimant's benefit unit, through universal_credit (£14,340.20) and household_net_income (£14,260.20), with the arithmetic in the comments;
    • the same son in a benefit unit of his own, not claiming: the same figures;
    • a pensioner head's son aged 30, in her benefit unit, counted in a claiming joint tenant's claim: 2 bedrooms and a £1,158.60 contribution.

    The £ expectations use a rent of £200 a week, between the model's Maidstone one-bedroom (B, £173.08 a week) and two-bedroom (C, £208.85 a week) rates, the same in 2025 and 2026.

  • uc_non_dep_deductions_renter_exempt.yaml (from Charge non-dependant deductions within the claimant's benefit unit #2017), six cases through universal_credit and household_net_income in the household above, each with 2 bedrooms, category C, at 135b41ef8:

    • reg 3(3) excludes the partner, who alone is blind: no exemption, £1,158.60 contribution, UC £14,340.20, household net income £14,350.20;
    • the claimant blind: exempt, UC £15,498.80;
    • a joint claim, both members eligible, with the partner blind: exempt, UC £8,003.64 + £10,400 = £18,403.64;
    • nobody blind: £1,158.60 contribution, two bedrooms, UC £14,340.20 (Charge non-dependant deductions within the claimant's benefit unit #2017's head alone gives £12,940.20);
    • the single claimant receives £5,000 of armed forces independence payment and no Attendance Allowance: exempt, UC £15,498.80;
    • only the excluded partner receives it: £1,158.60 contribution, UC £14,340.20.

    Household net income adds the £100 Household Energy Payment and takes off the £180 TV Licence, which the model halves where a household member is blind. household_benefits lists afcs but not armed_forces_independence_payment, so household net income leaves out the £5,000 payment, as on main.

  • test_lha_bedroom_young_people_properties.py, property 5's test: main added UC reg 5(1)(a), under which a 16-year-old outside education counts as a qualifying young person before the 1 September after their 16th birthday. Without 135b41ef8 the test, which assumed the added member never qualifies, fails on a 16-year-old added to a household headed by a 20-year-old; that commit reads is_qualifying_young_person_for_universal_credit for the added member, and the file reports 6 passed.

  • LHA_claimant_composition.yaml: two cases, a 17-year-old apprentice non-dependant and an 18-year-old qualifying young person, now assert UC category C (para 10(1)(c) and (b)) beside main's HB category C.

  • Against d8c2249 (with fa6ddae's YAML, less the one output that names Charge non-dependant deductions within the claimant's benefit unit #2017's variable): the adult son's case fails (uc_non_dep_deductions 0, expected £1,158.60), and so does the joint tenant's (uc_non_dep_deductions 0 for the joint tenant, expected £1,158.60); the other 12 cases pass.

  • Against main (6c6e229, with d8c2249's test files copied in; the YAML gives the same result at 0080274): 8 of the 28 cases in the two YAML files then failed, all on the UC bedroom count or category. Three of the first four properties failed (exact effect, reference agreement, in-unit non-dependants).

  • Mutations at e700316 (the same model code as d8c2249) of LHA_allowed_bedrooms, each run against the two YAML files (28 cases) and the first four properties:

    • Dropping the para 10(1)(c) family term (family_rooms = benunit.sum(qualifying_young_person)) failed two YAML cases (A member aged 18 who is not a qualifying young person is a non-dependant with a bedroom and A 17-year-old apprentice in the renter's benefit unit is a non-dependant) and properties 2, 3 and 4.
    • Dropping the para 9(2)(g) exclusion on other families' non-dependants (& ~no_one_responsible) failed one YAML case (A qualifying young person no one is responsible for in a non-dependant's family adds no Universal Credit bedroom) and property 2.
    • Dropping both the in-family para 9(2)(g) exclusion and the head exclusion (family_non_dependant = family_member) failed three YAML cases and properties 2 and 3.
    • Dropping only the head exclusion (family_non_dependant = family_member & ~qualifying) failed one YAML case (A member who heads the household but does not claim adds no Universal Credit bedroom) and properties 2 and 3.
    • Taking the para 10(1)(b) bedroom from a head who is a qualifying young person failed one YAML case and property 2.
  • Mutations at 50e2e44, each run against LHA_young_person_bedroom.yaml, LHA_claimant_composition.yaml and benefit_unit_non_dependants.yaml (76 cases; 2d362d2 changes only the property file). The first four ran against the six properties at fa6ddae, whose model differs only by the guard the sixth mutation drops; the last two ran against the six properties at 2d362d2.

    • Dropping the household-head exclusion from is_benefit_unit_non_dependant_for_universal_credit, which the bedroom now reads (& ~household_head): killed. It fails two YAML cases (A member who heads the household but does not claim adds no Universal Credit bedroom and UC and HB, a head who applies for CTR alone is not her benefit unit's non-dependant) and properties 2, 3 and 4.
    • Removing is_benefit_unit_non_dependant_for_universal_credit from the UC gate (uc_individual_non_dep_deduction_eligible reads only is_non_dependant_of_household_head): killed. It fails 10 YAML cases, among them An adult son in the renter's benefit unit has a bedroom and bears a housing cost contribution and A claiming joint tenant has the bedroom of the non-claiming head's adult son whose contribution it bears, and property 5.
    • Removing is_benefit_unit_non_dependant_for_legacy_benefits from the HB gate (housing_benefit_individual_non_dep_deduction_eligible): killed. It fails 8 HB cases in benefit_unit_non_dependants.yaml and test_benefit_unit_non_dependant_properties.py::test_deductions_match_the_oracle. The six properties here pass, as they check UC only.
    • Removing the in-unit term from the CTR gate (council_tax_reduction_individual_non_dep_deduction_eligible returns age >= 18 & other_family): killed. It fails 3 CTR cases in benefit_unit_non_dependants.yaml and test_deductions_match_the_oracle. The six properties here pass.
    • Dropping the passed-on bedroom (person.household.sum(non_dependant) without | passed_on): killed. It fails one YAML case (A claiming joint tenant has the bedroom of the non-claiming head's adult son whose contribution it bears) and properties 2, 3 and 5.
    • Dropping the guard for a family that is itself the counting claim (~benunit.project(own_claim) without | counted): killed. It fails one YAML case (A 17-year-old apprentice in the renter's benefit unit is a non-dependant, UC category D instead of C) and none of the six properties, whose generator always sets a rent, so no family is the counting claim without being liable for the rent.
  • council_tax_reduction_prescribed_benefits.yaml: main's case Where a household head applies alone, her own IIDB counts with her State Pension, and the father's does not predates Charge non-dependant deductions within the claimant's benefit unit #2017 and expected no deduction for the couple in her benefit unit. Under Charge non-dependant deductions within the claimant's benefit unit #2017 they are her non-dependants, one deduction of £5.20 a week (£270.40 a year), so the case now expects council_tax_reduction_non_dep_deductions £270.40 and council_tax_benefit £1,195.968 (1,466.368 − 270.40). It fails at 9c6a994 without that change and passes with it.

  • test_council_tax_reduction_devolved_working_age_properties.py and council_tax_reduction_devolved_working_age.yaml: the generator now gives every family explicit roles (is_claimant_or_partner). Without them, of two adults 20 or more years apart, the model presumed the younger to be the elder's child. This PR makes such an adult in the claimant's benefit unit a non-dependant, and the ESA passport property's whole-liability oracle left out their deduction. The maximum reduction equals the liability less any non-dependant deductions (SSI 2021/249 reg 79(1); WSI 2013/3029 Sch 6 para 4(1)), so the property also checks that its families have none. Two YAML cases give a passported claimant aged 50 a son aged 25 in the same benefit unit: a Scottish council deducts £5.55 a week (reg 90(1)(b)), leaving £1,511.40 of £1,800, and a Welsh council £6.70 (Sch 6 para 5(1)(b)), leaving £1,451.60.

  • test_benefit_cap_lha_scheme_split_properties.py: main added an example of a lone parent with a 19-year-old in full-time education who is past UC's terminal date, and asserted that the UC and HB bedroom counts differ. Under para 10(1)(c) that young person counts as a non-dependant with a UC bedroom, so the test now asserts 2 bedrooms under each scheme. Invariant 3's docstring now says where the two counts still differ: a qualifying young person a local authority looks after, and other occupiers' children.

  • Mutations at 135b41ef8, each run against uc_non_dep_deductions_renter_exempt.yaml and test_uc_renter_exemption_properties.py: putting is_claimant_or_partner back as the renter fails the excluded partner's blindness and armed forces independence payment cases and invariant 7; putting attendance_allowance > 0 back fails the single claimant's armed forces independence payment case and invariant 8. Both mutants die, as at Charge non-dependant deductions within the claimant's benefit unit #2017's head d2faa3bc9.

  • At 135b41ef842e87947da3e8ec0fdb13e2648cbd23, locally with no survey data, each run under -n 4:

    • policyengine-core test on finance/benefit/family 1,878 passed, gov/dwp 968 passed and gov/local_authorities/council_tax_reduction 391 passed, none failing;
    • test_lha_bedroom_young_people_properties.py 6 passed; test_benefit_unit_non_dependant_properties.py 3, test_council_tax_reduction_claimant_properties.py 3, test_household_head_agreement_properties.py 3, test_non_dependant_deduction_properties.py 10, test_uc_afip_housing_contribution_properties.py 3 and test_uc_renter_exemption_properties.py 2 passed; the other files that read uc_non_dep_deductions, uc_receives_attendance_allowance or uc_is_ineligible_partner: test_benefit_cap_lha_scheme_split_properties.py 7, test_rent_of_sharers_boarders_and_lodgers_properties.py 6, test_uc_legacy_closure_properties.py 4, test_uc_non_dep_pension_credit.py 3, test_uc_receiving_education_properties.py 5, test_uc_single_claim_properties.py 8 and test_uc_work_related_groups_properties.py 14 passed; policyengine_uk/tests/code_health 3,172 passed. The other property files ran on a build of this head whose tree differs only in the three test files 6900b88b7, d2faa3bc9 and 135b41ef8 change;
    • uvx ruff@0.17.2 format --check ., ruff check . and ruff check --select F811,F821 policyengine_uk report nothing; git diff --check over this branch's new commits reports nothing; git merge-tree --write-tree --name-only HEAD origin/main against main at 5c7744144 reports no conflict; .github/check_fix_pr.py passes on this title and body.
  • At 2d362d2 (the YAML and the model code match 50e2e44, where the YAML ran):

    • policyengine-core test on finance/benefit/family (1,840 passed), gov/dwp (806 passed) and gov/local_authorities/council_tax_reduction (376 passed), none failing;
    • test_lha_bedroom_young_people_properties.py 6 passed; test_benefit_unit_non_dependant_properties.py 3 passed, test_council_tax_reduction_claimant_properties.py 3 passed and test_household_head_agreement_properties.py 3 passed (at 50e2e44, the same model); policyengine_uk/tests/code_health 3,110 passed;
    • ruff format --check, ruff check, ruff check --select F811,F821 policyengine_uk and git diff --check d8c224979..HEAD clean; .github/check_fix_pr.py passes on this title and body.

A lodger's adult son

The model charges a boarder or lodger no Housing Benefit non-dependant deduction, as main does, even for a non-paying adult son in the lodger's own benefit unit. The householder bears his deduction in full, as when the survey puts him in a benefit unit of his own. He normally resides with the lodger too, and I found no decision on whether HB reg 74(5) would split his deduction between the two claims, or whether the lodger alone would bear it under C1 para 1.185's wider exclusion. This comment sets out the sources on each side, and #2894 tracks the question.

Impact

CI's Aggregate impact report for e2376fed0 (run 42230879312) compared main d60944e9e with 7c2d70eb7, its merge of that revision into that main, on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1), a full microsimulation for each side and year. The report counts #2007 and #2017, which this PR contains. It finds no check broken and flags 51 moves, among them Universal Credit spending in every year and child poverty. d16a2e89c and 3f16ec07f change only tests and documentation, and 96aa31067 stops charging a lodger for a non-dependant in its own benefit unit.

We estimate that Universal Credit spending rises by £224.2m in 2025-26, £246.9m in 2026-27, £261.3m in 2027-28, £274.6m in 2028-29, £287.0m in 2029-30, £300.7m in 2030-31 and £313.0m in 2031-32. Housing Benefit spending rises by £11.2m to £16.1m a year, and Council Tax Reduction by £9.8m to £13.1m. Household net income on the HBAI definition rises by £250.3m, £268.6m, £283.9m, £298.2m, £311.4m, £326.2m and £338.5m in those years. Each year 0.8% of people gain over £1, and 0.0% lose over £1. Absolute child poverty before housing costs falls by 0.05 points (7,100 children) in 2025-26, 0.24 points (35,500) in 2026-27, and 0.22 to 0.23 points (33,000 to 33,900) in each later year.

#2007's own report at ae4721f24 moves Housing Benefit and Council Tax Reduction and leaves Universal Credit alone, so the Universal Credit rise comes from #2017 and this PR. For #2017 at 89beee8 (base #2007 at 0b6c3db), we estimate that Universal Credit paid rises by £59.9m in 2026, all from the para 15 renter exemption.

Known gaps (other PRs)

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 1, 2026 13:23
…ze criteria

Universal Credit: a qualifying young person the renter is responsible for has
a bedroom (UC Regs 2013 Sch 4 para 10(1)(b)), and any other member aged 16 or
over is a non-dependant with one (para 9(2), 10(1)(c)), except a qualifying
young person no one is responsible for (para 9(2)(g)).

Housing Benefit: every member aged 16 or over other than the claimant or
partner is a person who is not a child (HB Regs 2006 and HB (SPC) Regs 2006
reg 13D(3)(b); reg 2(1)).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases for a qualifying young person aged 17 and 19, an 18-year-old
non-dependant, a looked-after qualifying young person (no UC bedroom), a
couple with a young person and two younger children (category E), a partner
aged 19 (no extra bedroom) and a pensioner couple's grandchild under HB (SPC).
Two LHA_claimant_composition cases asserted the old one-bedroom count for an
apprentice non-dependant and an 18-year-old qualifying young person; both are
now two bedrooms (Sch 4 para 10(1)(c) and (b)).

Hypothesis properties: bedrooms never fall when a person aged 16-19 joins any
family; the exact change when they do; and agreement with an independent
count of the size criteria, children's rooms found by brute force.

Fixes #2008

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…t's benefit unit

A member of a benefit unit aged 16 or over who is not the claimant, partner
or a qualifying young person (UC) or child or young person (HB, CTR) is a
non-dependant of the renter (UC Regs 2013 Sch 4 para 9; HB Regs 2006 and HB
(SPC) Regs 2006 reg 3; SI 2012/2885 reg 9 and the Welsh and Scottish
equivalents). The deductions now charge them:

- UC: to the renter's own claim; non-dependants in other families stay with
  the household head's claim (para 9(2)(f)). Adds the para 15 renter
  exemption and limits the para 16 Pension Credit exemption to the claimant
  or partner who receives it.
- HB: apportioned between joint occupiers by rent share (reg 74(5)); a
  boarder or lodger bears their own.
- National CTR: pooled across the claiming families by joint-liability
  share; only claiming families bear deductions.

Fixes #2014.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 1, 2026 15:12
… cost contributions

UC Regs 2013 Sch 4 para 15(1)(a) turns on the renter's own circumstances;
found by a mutation that applied the exemption to every family member.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mutation testing (15 one-line mutations of the new logic) left the
in-unit age floor surviving the YAML tests, and dropping in-unit
non-dependants from HB or CTR eligibility surviving the properties. The
YAML case now checks a child's classification, and the oracle checks HB
and CTR eligibility independently. All 15 mutations are now killed by both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 5 commits October 2, 2026 02:30
A non-dependant in a family's own benefit unit is that family's alone, not
shared between joint occupiers: DWP guidance treats a joint tenant's sister
as "Sarah's non-dependant" only (LHA Guidance Manual 2.093, example 2) and
says "if a person is a non-dependant of only one of the joint occupiers,
take the whole of the deduction from that joint occupier's entitlement"
(HBGM A5 5.622). Reg 74(5) and CTR Sch 1 para 8(5) apportionment now apply
only to non-dependants from other families. A lodger's family is one
commercial arrangement for CTR too, so its adult son is no one's
non-dependant there.

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

Review r2 (F3, F4, F5) found three departures from the text.

F3. 155766b charged a joint occupier's own adult son wholly to that
occupier, citing LHA Guidance Manual 2.093 example 2 and HBGM A5 5.622. HB
reg 3(1) and (4) and CTR reg 9(1) make him a non-dependant of every joint
occupier he shares accommodation with: none of reg 3(2)(a)-(f) excludes him
in relation to the other occupier. Reg 74(5) and CTR Sch 1 para 8(5) then
apportion him. The LHA example concerns the size criteria and a sister, whom
the model already treats as another family's non-dependant and apportions;
5.622 is conditional. The old rule also made the result depend on whether the
survey codes the son in his parent's benefit unit or his own. HB and national
CTR now pool every non-dependant, in any family, and apportion by rent share
(HB) or joint-liability share (CTR).

F4. A lodger's adult son was no one's non-dependant for CTR. Reg 9(2)(e)
excludes only the person liable to pay the applicant, as HB reg 3(2)(e)(i)
does; the household extension in (iii) is for the landlord's side. He is now
eligible and is the householder's non-dependant for CTR and HB, and still
the lodger's own for HB, in full, since they are not joint occupiers.

F5. Widening the shared CTR eligibility made a jointly liable sharer's local
claim bear the head's own son (Newham: £489.84 in 2025). The local
aggregation now counts only other families' non-dependants, as before, so
this change is neutral for the five local schemes until each council's
aggregation is brought into line.

YAML: joint tenants share one tenant's son by rent share (and get the same
result with him coded in his own unit); jointly liable applicants share one's
son equally; a lodger's son is the householder's non-dependant (HB and CTR)
and the lodger's (HB); Newham sharer does not bear the head's son. Property
oracle and conservation invariants restated for pooling.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The local schemes' aggregation masks the shared individual deductions to
members of other families not liable for rent, so it stays as on base while
the national eligibility also covers in-unit non-dependants. That mask must
be exactly the eligibility's other-family term. #2009 changes the term to the
claimant family, so that a sharer with no rent is a claimant and not a
non-dependant (reg 9(2)(d)). in_other_non_liable_family now holds the term
once, and both the eligibility and local_non_dep_deductions call it, so
composing with #2009 is one edit.

No change in behaviour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mutation check v3 found that dropping the applicant's own-family
subtraction survived every test: with formula-computed eligibility the
applicant's family never has an eligible member. An individual deduction set
directly as an input does, and reg 9(2)(a) still keeps the applicant's own
family out of its non-dependants, as base did. The YAML case pins it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r3:
- R3-6: in_other_non_liable_family's docstring stated the proxy as if it
  were reg 9(2)(a), (d)-(e). It is a proxy: a family jointly liable for the
  council tax but paying no rent is wrongly included, which #2009's
  claimant-family test fixes.
- R3-3: an in-unit non-dependant's own benefit awards are not modelled, so
  the HB reg 74(8) and CTR Sch 1 para 8(8) exemptions for a non-dependant on
  an income-related benefit or on UC with no earned income never apply to
  them. The documentation of is_benefit_unit_non_dependant_for_legacy_benefits
  now says so.

No change in behaviour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 2, 2026 08:28
…milies; one HB bedroom for an occupier couple

Review findings on #2010:

- UC Sch 4 para 9(2)(g) applies to the whole extended benefit unit, so a
  qualifying young person no one is responsible for (reg 4(6)) in a
  non-dependant's family adds no bedroom for the household head.
- HB reg 13D(3)(a): an ordinary occupier couple outside the claimant's family
  shares one bedroom (DWP circular HB A3/2017); only non-couple occupiers
  aged 16 or over take one each under (b).

The property oracles encoded both errors as law; they now count the law, and
two YAML cases pin the cross-family results.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Take #2006's housing_benefit_LHA_allowed_bedrooms.py whole: its rewrite over
the claim's occupiers already gives the benefit unit's own members aged 16 or
over a bedroom (reg 13D(3)(b)) and an occupier couple one bedroom (13D(3)(a)),
so #2010's HB change is dropped and its HB YAML cases stay as tests.

Keep #2010's UC change on top of #2006's LHA_allowed_bedrooms.py: the family
term (para 10(1)(b), (c)) and the para 9(2)(g) exclusion on the non-dependant
count, which now goes to uc_non_dependants_counted's claim. The exclusion
stays in the UC formula, not in is_non_dependant_of_household_head, because
that variable also feeds HB and CTR, where para 9(2)(g) does not apply.

The property oracles follow #2006's claim rules: UC non-dependants count in
the uc_non_dependants_counted claim, and every family liable for the rent
counts the HB occupiers, with their children pooled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 8 commits October 2, 2026 23:00
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>
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>

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: PARTIAL — REQUEST_CHANGES
Reviewed head: e2376fed08ffa9dc19314531ed735eecd7bd4c3e

C4 — Fix the intended family roles or oracle in the ESA-passport property. The required Python 7/7 job fails test_council_tax_reduction_devolved_working_age_properties.py::test_income_related_esa_passports_to_the_full_liability at line 177. Its Scottish 32/52-year-old fixture omits explicit couple roles: the older adult becomes claimant and the younger a non-dependant. The passport flag is true, but a £288.60 deduction gives £211.40 CTR against the unconditional £500 oracle. The recorded case reproduces on the raw PR head; setting the intended claimant/partner roles explicitly makes the same property body pass. Please repair the generated household roles or account for actual non-dependants, then obtain passing required CI.

A3 is resolved: the description now dates the old 1bda5418d impact comparison. The new A4/C1/LHA/regulation 12 evidence strengthens the documented argument but leaves HB_APPORTIONMENT unverified for the householder/lodger/adult-son full-versus-apportioned deduction. The qualified interpretation remains a material evidence gap.

Prior C1/C2/C3/A1/A2 remain resolved. Validation reused the unchanged review and added one 8.224-second diagnostic campaign with an expected failing recorded case and passing role control; these are diagnostic calls, not a newly passed generated test suite. Hosted checkout was synthetic merge 7c2d70eb72; the local reproduction used the raw reviewed head.

MaxGhenis and others added 2 commits November 6, 2026 14:07
The generator gave couples no roles, so of two adults at least 20 years
apart the younger was presumed to be the elder's child and became a
non-dependant, whose deduction the property's oracle left out. Families now
carry is_claimant_or_partner, and the property checks that they have no
non-dependant deductions. Two YAML cases cover a passported claimant's adult
son: SSI 2021/249 regs 79(1) and 90(1)(b) in Scotland, WSI 2013/3029 Sch 6
paras 4(1) and 5(1)(b) in Wales.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
housing_benefit_non_dep_deductions now states that the model reads a boarder
or lodger as outside reg 74(5)'s joint occupiers, the sources for that
reading, that it is a qualified one, and what the other readings would
charge. Its references add HB Regs 2006 reg 12, the 1987 reg 3 as made, and
DWP's A4, C1 and LHA guidance.

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

Copy link
Copy Markdown
Collaborator Author

C4

d16a2e89c gives the generator's families explicit roles (is_claimant_or_partner), so a couple stays a couple at any age gap. The ESA property now also checks that its families have no non-dependant deductions, since the maximum reduction equals the liability less those deductions (SSI 2021/249 reg 79(1); WSI 2013/3029 Sch 6 para 4(1)). Two YAML cases cover a passported claimant aged 50 with a son aged 25 in the same benefit unit. A Scottish council deducts £5.55 a week for the son (reg 90(1)(b)) and awards £1,511.40 of £1,800, and a Welsh council deducts £6.70 (Sch 6 para 5(1)(b)) and awards £1,451.60.

HB_APPORTIONMENT

3f16ec07f puts the reading and its sources in housing_benefit_non_dep_deductions's documentation and references. The model keeps this qualified reading. The FRS gives any adult other than a benefit unit's head and partner a benefit unit of their own, and policyengine-uk-data keeps the FRS benefit units. So in the survey data a lodger's grown-up son heads his own benefit unit, where the model charges the householder alone. If you read reg 74(5) as reaching a householder and lodger, say so and I'll apportion the deduction.

A3

The Impact section now reports run 42230879312 for e2376fed0. The two new commits change only tests and documentation.

I'll ask you to look again when CI passes at 3f16ec07f.

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: PARTIAL — COMMENT
Reviewed head: 3f16ec07f81db0afe6551554050a69343d80651a

C4 is resolved. The generator now assigns the intended claimant/partner and child roles, and the ESA-passport property checks that its generated families have no non-dependant deductions. The full affected batch passed 58 tests: 8 Python and 50 YAML, with no failures or skips. The recorded 32/52-year-old couple now receives the full £500 with no deduction; the new genuine adult-son cases receive £1,511.40 in Scotland and £1,451.60 in Wales from £1,800 liability. The deduction expectations were checked against the applicable official rules. Prior C1–C3/A1–A3 remain resolved.

HB_APPORTIONMENT remains unverified. The documentation correctly labels the lodger reading as qualified, but the additional 1987 regulation does not settle the full-versus-apportioned deduction under current HB reg 74(5). The FRS benefit-unit representation claim concerns survey incidence; it does not settle the reachable household-input case.

CI_EXECUTION remains unverified. The new Python 7/7 job stopped after a runner shutdown signal; its test step was cancelled and uploads skipped. The captured log showed no failed assertion before interruption. A complete successful current-head execution is still needed. C4's prior assertion failure is separately fixed and locally verified.

The computational model, parameter tree and lockfile are unchanged; the production-file delta is documentation/references. The Impact section now attributes the retained e237 report to run 42230879312. No new population calculation was performed. Approval remains withheld for the interpretation and CI evidence gaps.

@juaristi22
juaristi22 dismissed their stale review November 6, 2026 19:28

C4 is resolved at 3f16ec0: explicit family roles and the full affected 58-test batch pass. Superseded by current-head review 5805802928. Approval remains withheld for HB_APPORTIONMENT and CI_EXECUTION evidence gaps.

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

HB_APPORTIONMENT

No source I've found settles reg 74(5) for a householder and a lodger, and a user can enter that household. If they put the lodger's son in the lodger's benefit unit and both adults claim, the model charges each claim the whole deduction for him. I've documented that reading in housing_benefit_non_dep_deductions, with two readings under which the council would take one deduction for him. I've opened #2894 to track the question until a decision or DWP guidance settles it, with the regulations, the guidance on each side and what councils would charge under each reading.

Would you approve with the reading documented in the code and tracked there?

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: PARTIAL — two material evidence gaps remain

Reviewed head: 3f16ec07f81db0afe6551554050a69343d80651a.

Responding to the HB_APPORTIONMENT reply: documenting the competing readings and tracking them in #2894 preserves the uncertainty, but does not resolve it, so I cannot approve this scope yet.

  • HB_APPORTIONMENT — UNVERIFIED. The reachable householder/lodger/adult-son household still produces a full deduction on each claim. The retained regulations and DWP guidance do not settle whether reg 74(5) requires apportionment between these claimants, or the commercial-household exclusion leaves only one charge. The new issue supplies no decisive official evidence. An authoritative interpretation covering that relationship, or a scope change that removes the unresolved behavior, is needed before this gap can close. This remains an evidence gap; I am not asserting a newly confirmed wrong statutory award.
  • CI_EXECUTION — UNVERIFIED. The current Test result records 11,018 outcomes out of 12,908 collected across six completed shards, leaving 1,890 missing. The failed Python 7/7 leaf is the same previously reported runner shutdown. The rollup does not establish a new assertion failure or a recurrence of C4. A passing replacement for the incomplete required execution is still needed.

The new aggregate-impact run succeeded for main e0502003… versus merge 6ed7c73e…, which contains this head. Its headline rows agree with the retained report, supporting the updated impact comment. These are verified hosted outputs; no population estimate was recomputed locally.

C1, C2, C3, C4, A1, A2 and A3 remain RESOLVED. There are no new confirmed findings. The previous 58 passing repository tests and recorded family-role control remain valid for this unchanged head; no tests or models were rerun in this follow-up.

A lodger's non-paying adult son normally resides with the lodger and
with the householder. We know of no regulation or decision that settles
whether reg 74(5) splits his Housing Benefit deduction between their
claims or the lodger alone bears it (HBGM C1 para 1.185), and #2894
tracks the question. housing_benefit_non_dep_deductions no longer
charges the lodger as well: the householder bears the deduction in full
and the lodger none, as on main.

- The variable's documentation states that reading and the open
  question.
- The YAML cases for a lodger's adult son expect the lodger's family to
  bear none.
- The benefit-unit property's oracle and conservation check drop the
  lodger's second charge and assert that a lodger's family bears none,
  and the household head property again asserts that a family with no
  share of the rent bears no deduction.

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

Copy link
Copy Markdown
Collaborator Author

Thanks. I've made the scope change. At 96aa31067 the model charges a lodger nothing for a non-dependant in its own benefit unit, as main does: the householder bears the son's deduction in full and the lodger none. The YAML cases and the benefit-unit property expect that now, and #2894 keeps open whether reg 74(5) splits the deduction or the lodger alone bears it. The push started a full CI run in place of the one whose shard 7/7 lost its runner.

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: COMPLETE — APPROVE

Approved head: 96aa310679f7aab5fd9cc09b9472064f61174454.

HB_APPORTIONMENT — resolved by scope removal. The commercial lodger now pays no deduction for the non-dependant in its own benefit unit, while the householder bears the full deduction. Replacing only this formula with main’s gives the same final Housing Benefit in the checked lodger cases. The underlying statutory interpretation remains a baseline question tracked in #2894; this approval covers the narrowed PR scope.

67 current-head repository tests passed (61 YAML, six Python), along with four final Housing Benefit/household-income scenarios. Explicit 2026 working-age and pension-age controls give deductions of [£3,346.20, £0] and final HB of [£7,053.80, £5,200] for householder and lodger. Removing the addend raises the lodger’s HB and household net income by £3,346.20 relative to the previous PR head. Representation and ordinary non-lodger controls also pass. Invalid reviewer probe attempts were retained as diagnostics and excluded from this validation.

C1, C2, C3, C4, A1, A2 and A3 remain resolved. The new aggregate-impact run is bound to this head through merge 3776ee74… into main e0502003…; its headline outputs agree with the retained report. No population calculation was rerun locally.

All 21 latest observed checks pass at this head. The old 3f16… runner-shutdown gap is superseded by the passing new-head execution. There are no open findings or material evidence gaps in the reviewed scope; head, description, review activity, source dependencies, CI and duplicate reviews are checked again before publication.

MaxGhenis and others added 2 commits November 7, 2026 13:24
Main e050200 brings Scotland's and Wales's working-age Council Tax
Reduction route (#1966) and rent from boarders and lodgers (#2002). Two
files conflicted:

- housing_benefit_individual_non_dep_deduction_eligible: keep main's
  exclusion of a boarder or lodger and their partner (pays_rent_to_householder,
  reg 3(2)(e)(i)) beside this branch's exemptions
  (housing_benefit_non_dep_deduction_exempt), and cite reg 3, reg 74 and
  HB (SPC) reg 55.
- programs.yaml: main's Council Tax Reduction notes, plus this branch's
  non-dependant deductions and exemptions for each scheme.

Council Tax Reduction needs no change: both of this branch's deduction paths
read council_tax_reduction_individual_non_dep_deduction_eligible, which keeps
main's boarder and lodger exclusion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2007's fe69a8c merges main e050200, which brings #2300, and resolves
#2007's own conflicts with #2002. This branch resolved the same two files
when it merged main at 2c16fe5, and its versions build on #2017:

- housing_benefit_individual_non_dep_deduction_eligible: this branch's
  version, which reads is_non_dependant_of_household_head and
  is_benefit_unit_non_dependant_for_legacy_benefits, so neither flag counts
  a boarder or lodger who pays the householder.
- programs.yaml: this branch's Council Tax Reduction notes.

With #2007's head in this branch, #2007 and this PR can land in either
order without another merge.

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

Copy link
Copy Markdown
Collaborator Author

I merged #2007's head fe69a8caa, which merges main at e0502003d, into this branch at 4b44c61a0. Git stopped on housing_benefit_individual_non_dep_deduction_eligible.py and programs.yaml, and the merge keeps this branch's versions of both, so beyond your approval at 96aa31067 the branch gains only main's #2300 and version bumps.

MaxGhenis and others added 2 commits November 7, 2026 13:39
Main's case took the Housing Benefit scale for council tax reduction,
as the model did before this PR. This PR gives Scotland its own scale
(SSI 2021/249 reg 90(2)(b)), so the son's 300 a week falls in the band
from 286 to 497 and the deduction is 10.95 x 52 = 569.40.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cc94e71 updates main's lodger's son case to Scotland's own CTR
non-dependant scale, 10.95 x 52 = 569.40. This branch already expects
569.40 there (c536e7b), and its version of the file adds the claiming
lodger case, so the merge keeps this branch's file and changes no tree.

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

Copy link
Copy Markdown
Collaborator Author

I merged #2007's new head cc94e715b into this branch at 3c4feda57, and no file here changes. cc94e715b moves main's lodger's son case to Scotland's CTR scale on #2007, and this branch already expected that scale at c536e7bd0.

MaxGhenis and others added 2 commits November 7, 2026 14:05
conftest.py deals the tests in shard_durations.toml out longest first,
each to the least loaded shard, so the seven entries that e4f5062 added
for test_non_dependant_deduction_properties.py move most of the shorter
tests. Shard 7 of 7 picks up three more tests from tests/microsimulation/,
and one worker runs them back to back with the shard's other
microsimulation tests as the shard starts.

That shard's runner already peaks near its 16 GB with main's table:
15,468 MB in run 42393088220. With this table, run 42314506461 peaked at
15,586 MB, and in runs 42402370483 and 42402482489 memory reached 15.4 GB
within 80 seconds of the session's start and the runners shut down before
the shard got through 14% of its tests.

Main's table goes back in, so the listed tests take main's placement and
the seven property tests take their shards from the hash.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2007's 52fbb24 puts main's shard_durations.toml back. This branch
carried the same seven extra entries, and with them its Python shard 7 of
7 ran out of memory as it started (run 42402482489).

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

Copy link
Copy Markdown
Collaborator Author

4bb3813f4 merges #2007's 52fbb2400, which puts main's shard_durations.toml back. With #2007's seven extra timings, three more microsimulation tests landed in Python shard 7 of 7, one worker ran them back to back, and the shard's runner shut down within three minutes with under 400 MB of memory free, both here at 3c4feda57 and on #2007 at cc94e715b. No other file changes since 3c4feda57.

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Resumed review at 4bb3813f4d41c59636a10d420da887f8f980b1e2 — PARTIAL, with no confirmed new findings. One local-validation gap remains; approval is withheld.

The only change since the saved 3c4feda57 assessment is the test timing table, now byte-identical to captured main. Production code, dependencies and the tested files are unchanged. The balancing dry run supports three fewer timed microsimulation nodes on shard 7; it does not establish the cause of the previous runner shutdown.

Nine additional regressions passed. The earlier 85 passes were retained after byte/dependency checks and were not rerun: 94 covered cases in total. Four actual 2026 household-context calculations now validate the before/past terminal-date effects through LHA, HB, UC, Pension Credit and household income. The diagnostic's initial input-name error and incomplete benefit-cap oracle were corrected and excluded; the final UC comparison includes the existing benefit-cap interaction.

The bounded campaign ended before these two nodes produced completed outcomes:

  • test_benefit_cap_lha_scheme_split_properties.py::test_maximum_rent_reads_the_housing_benefit_category
  • test_benefit_cap_lha_scheme_split_properties.py::test_examples_reach_the_cases

Cached records contain no prior passing evidence for those exact cases, and their input domain includes 19-year-olds. They remain explicitly unverified. A successful current-head execution, locally or with attributable hosted test outcomes, can close the gap without repeating the completed checks.

Prior C1–C4 and A1–A3 remain resolved, with the HB-apportionment question still outside the removed scope. The old 3c4 runner shutdown is historical; current 4bb CI is pending. No new population estimate or standalone approval of #2016/#2017 is certified.

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Completion follow-up at unchanged 4bb3813f4d41c59636a10d420da887f8f980b1e2 — COMPLETE, with no open findings or material evidence gaps. Approval remains withheld while exact-head CI is pending.

Both previously unfinished scheme-split regression nodes passed in one focused run (40.23 seconds). The completed review now covers 96 cases: two new passes plus 94 validated retained passes. The four actual final-result household contexts and their corrected benefit-cap/Pension Credit/Housing Benefit arithmetic were retained without reruns.

LOCAL_CAMPAIGN_COMPLETION is resolved. Prior C1–C4 and A1–A3 remain resolved; the removed Housing Benefit apportionment question and old child-head limitations remain outside this verdict. No production code, test-oracle or dependency change occurred between the saved checkpoint and this run. The historical 3c4 runner shutdown is not a failure of the reviewed 4bb head.

The completed code/source assessment is saved for a CI-only approval check once the current required checks pass, provided head, description, source evidence and substantive feedback remain applicable. No new population estimate is certified.

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review status: COMPLETE — no findings or material evidence gaps

Approved head: 4bb3813f4d41c59636a10d420da887f8f980b1e2.

The completed code and source review remains applicable. C1–C4 and A1–A3 remain resolved. Its 96 covered tests (54 YAML and 42 Python) and four previously validated native household contexts are retained; no model calculations or tests were repeated for this approval.

All current-head CI contexts have now passed, including Lint, Test / Result and Aggregate impact. The current aggregate report’s 51 flagged moves reproduce the previously assessed published metrics. Its dataset/year, suppression and pre-existing VAT-sign qualifications remain. Decile means use each side’s own households and do not establish individual gains or losses. Population estimates were not independently recomputed.

The baseline Housing Benefit apportionment question tracked in #2894 retains its recorded scope exclusion. Unintegrated child-branch combinations remain separate review work.

@juaristi22
juaristi22 added this pull request to the merge queue Nov 9, 2026
Merged via the queue into main with commit fdc0c78 Nov 9, 2026
22 checks passed
@juaristi22
juaristi22 deleted the lha-bedroom-young-people branch November 9, 2026 12:03
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.

Give benefit-unit members aged 16 or over a bedroom in the LHA size criteria

3 participants