Repository navigation
Give sharers, boarders and lodgers their own rent, tenure and LHA category - #2006
Merged
Merged
Conversation
Stand-ins for rent_paid_as_boarder, rent_paid_as_lodger and pays_rent_to_householder, which the householder-side branch (boarder-lodger-rent) adds. This commit is dropped when that branch is merged in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…egory - personal_rent / benunit_rent: each family's own liability. The household's rent is shared equally among the people liable for it (the household head's family plus any family liable_for_share_of_household_rent: UC Regs 2013 Sch 4 para 24(4); HB Regs 2006 reg 12B(4)), plus what boarders and lodgers pay the householder (UC Sch 1 para 2(b); HB reg 12(1)). - benunit_tenure_type: a boarder or lodger rents privately whatever the household's tenure (UC Sch 4 para 20; HB reg 13C(5)(a)); in_social_housing and uc_housing_costs_element follow the family's tenure. - Non-dependants: only the household head's family has them, and families liable for rent are never non-dependants (UC Sch 4 para 9(2)(d)-(f); HB reg 3(2)(d)-(e), 3(4)). Applied to UC and HB deductions, UC bedrooms and the specified-renter test. - LHA category: Universal Credit by entitlement only (Sch 4 para 25(2)(b)); a new Housing Benefit category (reg 13D(2)-(3)) with its own size criteria and rate, including the shared rate for a claimant entitled to one bedroom who lacks exclusive use, used by LHA_cap. - Housing Benefit meals: fixed weekly amounts (Sch 1 para 2, 2008-2026) and a meals_included_in_rent input; deducted from HB eligible rent (reg 12B(2)(b), 13(13)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…on-dependants - Council Tax Reduction: where the household's rent is shared, every family liable for it is jointly and severally liable for the council tax and claims on the council tax divided by the number of people jointly liable (SI 2012/2885 Sch 1 para 7(3)-(4); Wales and Scotland the same), with a shared non-dependant apportioned equally (para 8(5)). Joint tenants and lodgers are not non-dependants (reg 9(2)(d)-(e)). National schemes and the five local schemes. - Housing Benefit: a non-dependant of several joint occupiers is apportioned by their shares of the rent (reg 74(5); SPC reg 55(5)). - Cite the current HB reg 13(7) (as substituted by SI 2007/2868) for the meals deduction on the rent officer route. - Tests: meals amounts, sharers, boarders and lodgers, CTR joint liability. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…housing support Hypothesis invariants over generated households: rent conservation and bounds, boarder and lodger tenure, non-dependant exclusion, UC category independent of the shared-accommodation input, HB shared rate where exclusive use is lacking, meals never raising HB eligible rent, CTR claim shares in shared households, monotonicity in household rent, and a no-op check against the previous rent and deduction formulas. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rent_paid_as_boarder, rent_paid_as_lodger and pays_rent_to_householder are copied byte for byte from boarder-lodger-rent (#2002) at the same paths, so the two branches merge without conflict in either order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 1, 2026
Draft
personal_rent puts the family's share (share_of_household_rent, per person liable) on the household head for the head's family and on the family's head otherwise, so the household head still carries the whole rent when no one else is liable (test_deterministic_variables TestHeadOrdering). Family totals and the UC Sch 4 para 24(4) split are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 1, 2026
MaxGhenis
added a commit
that referenced
this pull request
Oct 1, 2026
Cherry-picks #2007 (59c7082: HB reg 74 / SPC reg 55 bands, remunerative-work test, couple rule and exemptions; national CTR own scales and exemptions) onto the in-unit non-dependant change (#2014) and the #2006 rent shares, as agreed with #2007's author: - HB and national CTR aggregation: one deduction for a non-dependant couple (the claimant and partner of a non-dependant family, the higher amount; both for a Welsh working-age couple on UC), any other adult in that family counted separately, in-unit non-dependants pooled and apportioned by rent share (HB) or joint-liability share (CTR), and the claimant's exemption. - Joint income for the bands is the couple's only (reg 74(4), para 8(4)); another adult is banded on their own income. - The IS, income-based JSA, income-related ESA, Pension Credit and UC exemptions apply only to the award's claimant and partner. - The HB claimant exemption reads is_claimant_or_partner, not is_adult. Drops council_tax_reduction_pension_credit.yaml and the in_receipt_of_guarantee_credit output, which depend on #1909 (main only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 1, 2026
Cherry-picks #2007 (59c7082: HB reg 74 / SPC reg 55 bands, remunerative-work test, couple rule and exemptions; national CTR own scales and exemptions) onto the in-unit non-dependant change (#2014) and the #2006 rent shares, as agreed with #2007's author: - HB and national CTR aggregation: one deduction for a non-dependant couple (the claimant and partner of a non-dependant family, the higher amount; both for a Welsh working-age couple on UC), any other adult in that family counted separately, in-unit non-dependants pooled and apportioned by rent share (HB) or joint-liability share (CTR), and the claimant's exemption. - Joint income for the bands is the couple's only (reg 74(4), para 8(4)); another adult is banded on their own income. - The IS, income-based JSA, income-related ESA, Pension Credit and UC exemptions apply only to the award's claimant and partner. - The HB claimant exemption reads is_claimant_or_partner, not is_adult. Drops council_tax_reduction_pension_credit.yaml and the in_receipt_of_guarantee_credit output, which depend on #1909 (main only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 2, 2026
Open
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
Applies #2007 at 6257277 (59c7082 plus the r1 review commit) onto #2017 (in-unit non-dependants, #2006 rent shares): - One definition of claimant or partner: #1896's is_claimant_or_partner variable. #2007's proxy helper (benefit-unit head or any member who is not a Child Benefit child or QYP) is removed and its call sites read the variable. - HB and national CTR aggregation: another family's non-dependants per deduction_per_family (the couple's higher amount, both for a Welsh working-age UC couple, and each other member's own), counted once per family and apportioned by rent share (HB) or joint-liability share (CTR); a family's own in-unit non-dependants in full (LHA Guidance Manual 2.093; HBGM A5 5.622); the claimant exemptions. charged_to_other_families ("household minus own family") is no longer used and is removed. - #2007's property oracle reads is_claimant_or_partner; the in-unit property oracle counts a couple once and applies the claimant exemptions. - Drops council_tax_reduction_pension_credit.yaml and the in_receipt_of_guarantee_credit output (#1909, main only). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 2, 2026
Draft
This was referenced Oct 2, 2026
Open
Collaborator
Author
|
Pointer for this stack: #2089 (each scheme its own benefit cap and LHA shared-accommodation rules, stacked on #2084) uses this PR's names and helpers for the Housing Benefit LHA side:
|
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
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>
…ability Conflicts in LHA_cap and housing_benefit_entitlement resolved by keeping main's cap-before-taper structure (#1926) and its 'Maximum rent (LHA)' label, with this branch's Housing Benefit LHA rate and meals routes: LHA_cap is gross on the LHA route and rent less meals after a rent officer's board finding; the non-LHA path deducts meals (reg 12B(2)(b)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Housing Benefit reads housing_benefit_LHA_rate in this branch, so the tests that pin the rate as an input set that variable rather than BRMA_LHA_rate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 3, 2026
…ted claim Review r2 found that capping every jointly liable claimant's reported reduction at its share could discard a lawful report: the model's divisor (#2006's joint-liability share) counts students that SI 2012/2885 Sch 1 para 7(5) leaves out. The cap exists to stop a reported claim and a simulated claim together exceeding the bill, so it now applies only where another claim in the household is simulated, on the share that claim uses. Where nothing is simulated, reports are kept as reported, as on the base. Tests: - YAML: a jointly liable claimant keeps its whole report where nothing is simulated; a pension-age grandmother in working-age applicants' family does not make their claim a pensioner's (an intended change under reg 3(1): the base paid £1,800 on the pensioner scheme). - Properties: the fallback oracle follows the narrowed cap, and property 4 compares council_tax_benefit wherever the household's reconciliation is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bility # Conflicts: # uv.lock
…t a blind partner as the HB rules do Round 2 of the independent review found three wrong results the sharer claims introduce. Council Tax Reduction scheme. Where families share the rent and each claims on its part, every claim used the household's oldest family's pensioner status. A working-age sharer then claimed under a pensioner co-tenant's scheme, and a pensioner sharer lost the pension-age scheme beside a mixed-age couple on Universal Credit. Each such claim now follows the applicant's own family (SI 2012/2885 reg 3), in the national schemes, the five councils' schemes and the choice between a simulated and a reported reduction. A household with a single claim is unchanged. Non-dependant exemption. In the councils' schemes one sharer's disability benefit exempted every claim, or none. The exemption is now the applicant's own, applied to that claim's share of the deduction. Housing Benefit severe disability conditions. A partner who is blind and gets no qualifying benefit is treated as not being the claimant's partner (HB Sch 3 para 14(3); pension age Sch 3 para 6(3)), and a blind non-dependant is disregarded (para 14(4)(b)). Without this a claimant sharing the rent with a joint tenant fell to the shared accommodation rate. Property tests: a sentinel family that meets the severe disability conditions, each joint claim's scheme, the bound on the household's simulated reductions, and no change to Council Tax Reduction without sharers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
council_tax_benefit_reported is a person variable; the property test compared it against benefit-unit values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
marked this pull request as ready for review
October 4, 2026 02:05
Collaborator
Author
|
Merged by the UK hub (session local_8e19f9d5, Opus 5.5) under the PE-UK merge-on-gates rule. The owner session (local_bc7d2596) was cut off by a network drop after its review came back.
|
MaxGhenis
added a commit
that referenced
this pull request
Oct 4, 2026
Keep main's joint-liability share on the liability, and route the Scottish and Welsh working-age rules on council_tax_reduction_claim_pensioner, the per-claim scheme flag the national formula uses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 4, 2026
…ed rates Main's #2006 gives Housing Benefit its own category of dwelling (housing_benefit_LHA_category) and a housing_benefit_LHA_rate that the HB maximum rent reads. Rent officers determine one rate per BRMA and category, so that variable now looks up the same determined table as BRMA_LHA_rate through benunit_lha, which takes the category variable to read. The list-of-rents helper main added (lha_rate_for_category) and the helpers left in LHA_category.py go, as before; LHA_category keeps main's Universal Credit-only rule and documentation. A new test sets every BRMA and category with the UC category set to a different one, and checks each variable follows its own category and matches the table and every published cell; pointing the HB variable at LHA_category makes it fail. Also from the delta review: the Welsh restatement wording (16 of the 17 monthly figures are multiples of GBP 5; Vale of Glamorgan one bedroom is GBP 100 a week) and a stale comment in housing_benefit_lha_order.yaml (the model's 2026 Maidstone one-bedroom rate is 8,975.20; the test keeps its 9,467.64 input). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 4, 2026
MaxGhenis
added a commit
that referenced
this pull request
Oct 4, 2026
…old-head Conflicts, resolved by keeping this PR's liable set (council_tax_reduction_liable_person) and everything main added: - council_tax_reduction_claimant_benunit: a family claims through a member treated as liable; where the rent is shared (council_tax_reduction_claims_are_joint), that member must not be in higher education (#2006's student exclusion, Default Scheme Sch para 75(1)). Outside shared rent the head's family claims whatever its members' studies, as on main. - council_tax_reduction_joint_liability_share: counts the people treated as liable, leaving out students as #2006 does (Sch 1 para 7(5)); the applicant always counts. - council_tax_reduction_individual_non_dep_deduction_eligible: main's version, which already excludes every claimant family and reads sharers and boarders/lodgers directly. - test_rent_of_sharers_boarders_and_lodgers_properties.py: main's checks, this PR's comment; the pensioner-status comment now names the head's family. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 4, 2026
- joint_liability.yaml: #2006's "An older parent who is not liable stays the claimant where no rent is shared" asserted the oldest-adult rule this PR replaces. The head's family now claims and the father is its non-dependant; the award stays £0 (default council's working-age scheme, not simulated). Values checked by running the case. - claimant_household_head.yaml: a composition case. Where the rent is shared, a student head's family does not claim, and the co-tenant claims the whole council tax with the head as its non-dependant (LGFA 1992 s.75(4); #2006's student exclusion). - test_council_tax_reduction_claimant_properties.py: generate adults in higher education; the claimant pin and the head-claims check allow for the student exclusion where the rent is shared; a new check that no family there claims through students alone; the non-dependant pin follows main's formula (sharer families and boarders' and lodgers' families). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 5, 2026
Brings in #2009, #2006, #1944, #1907, #2033 and the rest of main since 4b84ea0. Each claim's scheme and non-dependant exemption still follow its own family's council_tax_reduction_pensioner and council_tax_reduction_applicant_has_non_dep_exemption, read on is_council_tax_reduction_applicant_or_partner, for every claim. - council_tax_reduction_pensioner: keeps #1944's reg 3 test (#1907's qualifying age, the IS/JSA/ESA and Universal Credit conditions) on this PR's applicant-and-partner members. - #2006's joint-claims-only machinery is replaced by the per-family rule it anticipated: council_tax_reduction_claim_pensioner, council_tax_reduction_claim_scheme_supported and _legacy.single_claim_is_pensioner are removed, and nothing reads council_tax_reduction_claims_are_joint for a scheme or an exemption. council_tax_benefit keeps this PR's reconciliation. - council_tax_reduction_household_has_pensioner is deleted again. - simulated_council_tax_reduction_benunit keeps main's council_tax_reduction_assessable_capital. - Tests on main that read the deleted flags now read the per-family ones: council_tax_reduction_pensioner.yaml, joint_liability.yaml, state_pension_credit_qualifying_age.yaml and four property tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 5, 2026
…head Conflicts: - LHA_allowed_bedrooms, lha_renter_has_non_dependant, uc_non_dep_deductions: take main's (#2006) `counted = benunit("uc_non_dependants_counted", period)`. - housing_benefit_LHA_allowed_bedrooms: take main's (#2006) rewrite, which reads is_liable_for_household_rent and no head. - test_council_tax_reduction_claimant_properties docstring: main's invariant 4, this branch's invariant 5. New raw reader from main: uc_non_dependants_counted now reads benunit_contains_household_head. The household-head property test computes it, and its Universal Credit assertion follows #2006's rule: deductions fall only on the counted claim, at most one per household, and on the head's family wherever that family is liable for the rent and claims. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 5, 2026
Main's uc_non_dependants_counted (UC Regs 2013 Sch 4 para 9(2)(f)) gives the household's non-dependants to the head's family's Universal Credit claim if it claims, else to the first liable family that does. The resolved head here is 70, over State Pension age and not eligible for UC, so the sharer's claim carries the £1,000 deduction. The well-formed twin (only the elder flagged) gives the same values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 5, 2026
…mple Review after-merge-delta, nit 1: no explicit example told #2006's head-first order in uc_non_dependants_counted from the order the families are given. The new HEAD_LISTED_AFTER_SHARER household flags no one, so the eldest member is the head, and lists the head's family after a sharer's, beside a non-dependant, all claiming Universal Credit. The head's family's claim counts the non-dependant; read from the raw flag, or without the head-first order, the sharer's would. Both properties carry it. Nit 2: the YAML comment on the head-and-sharer case now separates what UC Regs 2013 Sch 4 para 9(2)(f) requires (only one claim counts the non-dependant) from the model's choice of the head's family's claim. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi
pushed a commit
that referenced
this pull request
Oct 8, 2026
… and exemption (#2015) * Assess each Council Tax Reduction claim under its own family's scheme and exemption In a shared-rent household every family liable for the rent claims, but the pensioner scheme and the non-dependant exemption were picked once per household from the head's family. SI 2012/2885 reg 3 (and SI 2012/2886 Sch para 3, SI 2013/3029 reg 3, SSI 2021/249 reg 3, SSI 2012/319 reg 12) define "pensioner" per person and partner, and the exemption applies where "the applicant or his partner" is blind or gets a listed benefit (SI 2012/2885 Sch 1 para 8(6) and equivalents). - council_tax_reduction_pensioner (BenUnit) replaces the household flag; the name and entity match #1944 and #1966, which extend the same definition. - council_tax_reduction_applicant_has_non_dep_exemption (BenUnit) replaces the household exemption; the councils' schemes apply it per claim. - council_tax_reduction_scheme_supported is per family, so each family falls back to its reported reduction only where its own scheme is unmodelled. - Councils' person-level non-dependant deductions no longer depend on the head's family; each claimant's own scheme decides whether to use them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Reconcile reported and simulated reductions within a household With the scheme chosen per family, one household can hold a simulated claim and a family whose scheme is not simulated. Review r1 found that a family that cannot claim then kept its reported reduction beside a head whose simulated award already covered the whole bill: £3,000 against £1,800. - A family that cannot claim keeps a reported reduction only where no claim in its household is simulated (new household flag council_tax_reduction_household_has_simulated_claim). Without sharers this is the base behaviour. - A jointly liable claimant's reported reduction is limited to its own share of the council tax (SI 2012/2885 Sch 1 para 7(3)-(4)), the most any scheme could give it. Tests: three YAML cases; the property tests now generate reported reductions, check the fallback and the household bound, and toggle one claimant's exempting benefit to show it leaves the other claim unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Set a claim's scheme and exemption from the applicant and their partner #2009 now names the liable people directly. A household head can be liable without being the claimant or partner of their family (a grandparent heading a family formed around a young couple), so "the applicant or his partner" (SI 2012/2885 reg 3, Sch 1 para 8(6)) is not always the family's claimant and partner. New person-level council_tax_reduction_applicant_or_partner: the liable member, and the other member of the couple where the liable member is the claimant or partner, whatever the partner's age; in a family that cannot claim, its claimant and partner. The pensioner flag and the applicant exemption read it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Use #2078's CTR applicant-or-partner variable #2078 (also stacked on #2009) adds is_council_tax_reduction_applicant_or_partner and council_tax_reduction_head_applies_alone for the CTR means test. They define the same people as this PR's council_tax_reduction_applicant_or_partner: the claimant and partner where the liable person is one of them, the liable head alone otherwise, and the claimant and partner in a family that cannot claim. Take #2078's two files byte for byte, so whichever PR lands second merges without conflict, and point the pensioner flag and the applicant exemption at it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Cap a reported reduction at the claimant's share only beside a simulated claim Review r2 found that capping every jointly liable claimant's reported reduction at its share could discard a lawful report: the model's divisor (#2006's joint-liability share) counts students that SI 2012/2885 Sch 1 para 7(5) leaves out. The cap exists to stop a reported claim and a simulated claim together exceeding the bill, so it now applies only where another claim in the household is simulated, on the share that claim uses. Where nothing is simulated, reports are kept as reported, as on the base. Tests: - YAML: a jointly liable claimant keeps its whole report where nothing is simulated; a pension-age grandmother in working-age applicants' family does not make their claim a pensioner's (an intended change under reg 3(1): the base paid £1,800 on the pensioner scheme). - Properties: the fallback oracle follows the narrowed cap, and property 4 compares council_tax_benefit wherever the household's reconciliation is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Apply the reported-reduction cap only beside a simulated claim that pays On the payer build, the only remaining change came from heads whose reported reduction was capped beside a sharer whose simulated claim paid nothing. With no simulated reduction competing for the bill there is nothing to reconcile, so the cap now applies only where the simulated claims in the household pay something. The household bound still holds: each simulated award is within its share, and a capped report within its own. Tests: a YAML case where the simulated claim beside a report pays nothing; the fallback oracle, the bound and property 4's comparison follow the paid condition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Test the per-family pensioner flag against #1944's reg 3 conditions council_tax_reduction_pensioner is now #1944's SI 2012/2885 reg 3 test on this PR's members: the qualifying age for State Pension Credit, and no Income Support, income-based JSA, income-related ESA or Universal Credit award. Property 1's oracle computes that directly. A family's own Universal Credit award depends on the rent it pays, which changes when it lives alone, so property 2 compares the families whose own awards are the same either way (and checks there are some). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Address the after-merge review: student share, head's own awards, P5 - council_tax_benefit: the share leaves out only people in higher education, so where a jointly liable person it counts is in other education (who may be a student SI 2012/2885 Sch 1 para 7(5) leaves out), the share may be too small; a report is then kept rather than capped. - council_tax_reduction_pensioner: where the household head applies alone, the benefit unit's Income Support, income-based JSA, income-related ESA and Universal Credit are its claimant and partner's, not the applicant's (as #2078 does for council_tax_reduction_relevant_income_based_benefit). - Two YAML regressions: a report beside a paying simulated claim where a further-education student is counted in the share, and a grandmother head who stays a pensioner when the young parents get Income Support. - Property test: the alone simulation is given each family's own awards instead of filtering; some generated adults are further-education students, and properties 5 and 6 follow the new rule. - test_benefit_cap_and_ctr_pension_age_properties P5 compares against a reform of the cap exception alone, so the CTR pensioner test (which also sets the applicable amount) is held fixed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Hold the means test fixed in property 4 CI found that swapping the other claiming families' ages and disability benefits can move a family's simulated award through its applicable amount: the model's severe disability premium counts the other adults in the household (has_non_dependant_for_severe_disability_premium), joint occupiers included. That is main's means test, not the scheme or the exemption, so the perturbed run is given each family's applicable amount and income from the unperturbed one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Read the student test and in_FE for the cap's student guard The re-review of 38364ca found that the guard missed in_FE, and that current_education's age default (tertiary at 18 and 19) turns it on with no education input. The guard now uses the model's student test for non-dependants (_legacy.is_full_time_student_non_dep) or in_FE, for a jointly liable person the share counts. The age default is kept deliberately: in the enhanced FRS current_education is an observed input, and the same test already treats an 18- or 19-year-old non-dependant as a student. The documentation says so, including that part-time students and students para 75(2) brings back in are treated the same way. Regressions: the student shown by in_FE (fails on 38364ca), and a jointly liable sharer with no education input at 19 (report kept) and 20 (capped). The property generator makes students by current_education or by in_FE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Hold each family's own awards fixed in property 4 CI on d988725 (run 37383946508) failed property 4 on a Newham household: a working-age head (47) claiming Universal Credit, a sharer couple aged 100 and 63 with earnings, and a non-dependant. Perturbing the head to 85 moves the non-dependant into the sharer's claim (uc_non_dependants_counted: the household's non-dependants count in one claim only, UC Regs 2013 Sch 4 para 9(2), the head family's where it claims). The sharer's size criteria rise from one bedroom to two, its LHA cap from 9,000 to 10,860 and its award from 0 to 1,288.29, and reg 3(1)(a)(ii) then makes it not a pensioner. That is the family's own award, which the pensioner test is meant to follow, so the change is intended. Property 4 now holds each family's own UC, IS, JSA and ESA awards fixed, as property 2 already does, along with its means test. The same population fails on a9466b8, so this predates the merge of main; CI on a9466b8 did not generate it. With the awards held, a household-level pensioner flag still fails property 4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Hold the household allocations, not the awards, in property 4 The review of 94041e9 found that holding every family's own awards still let property 4 fail through the same channel, and hid cross-family reads of awards: - In Newham, when the head's family stops claiming Universal Credit, the non-dependant moves into the sharer's claim and raises its uc_maximum_amount, which the four _legacy councils use as a UC family's applicable amount. The sharer's council award moved from 241.67 to 417.02 with its awards held. - Holding every family's awards also gives a perturbed 85-year-old head the award of the 47-year-old it replaced, and a mutant that read another family's UC survived. Property 4 now holds, with each family's CTR means test, the two household allocations through which other families reach a family's own awards: uc_non_dependants_counted (UC Regs 2013 Sch 4 para 9(2)) and has_non_dependant_for_severe_disability_premium. Each family's awards are computed. The body passes on CI's population, its minimal household and the reviewer's counterexample, and catches all five mutants the reviewer and author built. The generator also sets is_claimant_or_partner on every family's adults, so wide-gap couples stay couples once #2082 presumes a member 20 or more years younger to be a child. build() keeps each held value's own type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Hold the CTR capital in property 4 and pin its counterexamples Pension Credit's guarantee credit sets a family's CTR capital to nil, and the model lets other families reach that guarantee credit twice: the severe disability addition's residence condition counts every other adult in the household, and pension_credit_assessable_capital divides the household's savings among its pension-age adults. Property 4 held the CTR applicable amount and income but not the capital, so a head reaching pension age, or gaining Attendance Allowance, could move a pension-age sharer's award from nil to its £900 share of an £1,800 bill (review r5, finding 1). Hold council_tax_reduction_assessable_capital with the rest of the means test, name the two Pension Credit routes in the docstring, and pin as Hypothesis examples the four populations that broke earlier versions of the property: CI's Universal Credit non-dependant move, the uc_maximum_amount move, and the two Pension Credit routes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #2005
Built on #1896 (merged), which adds
is_claimant_or_partner,lha_renter_has_non_dependantand the specified-renter test that this builds on. The data input comes from PolicyEngine/policyengine-uk-data#512.Summary
Families other than the household head's had no rent. This gives them the treatment the regulations set out:
The law (read for this PR; texts and an independent legal memo in the review folder)
Rent liability
Tenure
Non-dependants
LHA category
UC. The cap rent is the LHA for the category the renter is entitled to (Sch 4 para 25(2)(b); paras 8-12, 26-29). Only a "specified renter" (single, under 35, not excepted, no child, no non-dependant) is limited to shared accommodation (paras 27-28). A single renter aged 35 or over in a room gets the one-bedroom rate.
HB. The shared rate applies (reg 13D(2)) to:
Either way it does not apply where the severe disability premium applies. In the exclusive-use test, rooms shared with the claimant's household, non-dependants or people paying the claimant rent still count as exclusive.
HB size criteria count every "occupier" except a joint tenant outside the claimant's household (13D(3), (12)). So a householder's lodger adds an HB bedroom but not a UC one.
Meals
CTR, joint liability. The maximum reduction uses the council tax divided by the number of persons jointly and severally liable, with no division where the only other liable person is the partner (England pensioners SI 2012/2885 Sch 1 para 7(3)-(4); Wales SI 2013/3029 Sch 1 para 2, Sch 6 para 4; Scotland SSI 2021/249 reg 79).
What changed
Rent liability.
benunit_rentand the newshare_of_household_renthold each family's own liability.personal_rentputs the family's share on the household head (head's family) or the family head (others), so the household head still carries the whole rent where no one else is liable. The family's liability is:liable_for_share_of_household_rent;rent_paid_as_boarderandrent_paid_as_lodger.Those two inputs and
pays_rent_to_householderare byte-identical copies of #2002's files at the same paths, so the two PRs merge in either order.Tenure.
benunit_tenure_typeis the family's own tenure: a boarder or lodger rents privately.in_social_housinganduc_housing_costs_elementfollow it.Non-dependants
is_non_dependant_of_household_head.uc_non_dependants_counted: the household's non-dependants count in one UC claim (Sch 4 para 9(2)(f)), the head's family if it is eligible for UC and claims, otherwise the first such sharer. UC deductions, UC bedrooms andlha_renter_has_non_dependantread it.LHA
LHA_category(UC) is set by entitlement only;is_shared_accommodationno longer affects it.housing_benefit_LHA_allowed_bedrooms,housing_benefit_shares_accommodation,is_housing_benefit_young_individual,housing_benefit_LHA_categoryandhousing_benefit_LHA_rate.housing_benefit_severe_disability_premium_applies(HB Sch 3 para 14; pension age Sch 3 para 6), including the blind-partner rule (para 14(3)) and the disregard of a blind non-dependant (para 14(4)(b)).LHA_cap(HB) uses the HB rate.lha_rate_for_categoryandcategory_maximumtake the category variable.Meals. New inputs
meals_included_in_rent(default none) andhousing_benefit_board_and_attendance_determination(default false), parametersgov.dwp.housing_benefit.ineligible_charges.meals.*(dated 2008-2026 from legislation.gov.uk point-in-time texts and each up-rating order), andhousing_benefit_meals_deduction.The FRS records neither meals nor the finding, so the dataset leaves both at their defaults.
CTR
council_tax_reduction_claimant_benunit: every jointly liable family where the rent is shared, claiming through a liable member who is not an excluded full-time student; otherwise the old age rule.council_tax_reduction_joint_liability_share. Excluded students are left out of the count (Sch 1 para 7(5)).council_tax_reduction_claims_are_joint), each claim is assessed on the applicant's own family:council_tax_reduction_claim_pensioner; SI 2012/2885 reg 3);council_tax_reduction_claim_scheme_supported);council_tax_reduction_applicant_has_non_dep_exemption).Behaviour change for API users
BRMA_LHA_ratestays the published rate forLHA_category. Housing Benefit now readshousing_benefit_LHA_rate, so an input set onBRMA_LHA_rateno longer drives HB.is_shared_accommodationnow affects only HB.Choices where the law leaves room (each documented on the variable)
housing_benefit_shares_accommodationcan be set directly to rebut this.Invariants and tests
Property tests (Hypothesis) in
test_rent_of_sharers_boarders_and_lodgers_properties.py, over generated multi-family households. Each population includes a fixed household with every role and a family meeting the severe disability conditions, so no selection is empty.is_shared_accommodation; the HB category is A whenever a family is entitled to one bedroom, lacks exclusive use and does not meet the severe disability conditions, and is never A where it does.YAML tests, with the arithmetic in comments:
rent_of_sharers_boarders_and_lodgers.yaml(19 cases)housing_benefit/housing_benefit_meals_deduction.yaml(8 cases)council_tax_reduction/joint_liability.yaml(12 cases)Updated tests whose expectations encoded the old proxies:
LHA_claimant_compositioncases;Results
test_deterministic_variables).Found while testing and fixed in PRs stacked on this one:
benunit_contains_household_headgave CTR to two families when their oldest adults were the same age.Impact (real microsimulation runs, head 16a455b against main 5232f9a)
All runs compare this PR's head with the main commit it merged, on the same dataset and weights, for 2025-26 and 2026-27. Survey households are counted by a fingerprint of household rent and members' ages, which joins the enhanced FRS copies; any cell behind fewer than 10 is suppressed.
1. Today's published enhanced FRS (snapshot ace89433, sha256
03fe15e40a4c). It has neither the sharer flag nor the boarder and lodger inputs, so this is what the PR does if it merges alone.2. Enhanced FRS built from policyengine-uk-data#512 (a9e3371, sha256
ed1a29912656). The build is stacked on #506 and #503, so it carries the sharer flag and the boarder and lodger inputs. #512 has since added one more signal for the sharer flag, which marks fewer than 10 more survey units; this build predates it.Against calibration targets (build 2)
The weights were calibrated with policyengine-uk 2.93.0, so these figures hold weights fixed and isolate the rule change. Main's own UC level has risen since the last measurement, through other merged PRs. This PR's deltas are within £0.1m of those measured at 7769fa3 against main 3c48247.
Methodology readings, ruled by Max as built (d836):
Review
axiom: uk/regulations/uksi/2013/376/schedule/4/paragraph/24 encoded-correct (test
listed_and_other_persons_are_apportioned_by_formula); TheAxiomFoundation/rulespec-uk#406 queued (UC Sch 4 paras 9 and 20; HB regs 3, 12B, 13(7), 13D, 74(5) and Sch 1 para 2; CTR reg 9 and Sch 1 paras 7-8)🤖 Generated with Claude Code