Skip to content

Give sharers, boarders and lodgers their own rent, tenure and LHA category - #2006

Merged
MaxGhenis merged 13 commits into
mainfrom
benefit-unit-rent-liability
Oct 4, 2026
Merged

MaxGhenis merged 13 commits into
mainfrom
benefit-unit-rent-liability

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2005

Built on #1896 (merged), which adds is_claimant_or_partner, lha_renter_has_non_dependant and 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:

  • Sharers. Joint tenants and other sharers of a household's rent are each liable for a per-person share of it.
  • Boarders and lodgers are liable for what they pay the householder, and they rent privately whatever the household's tenure.
  • Non-dependants. Families liable for rent are not non-dependants of anyone. A household's non-dependants count once for Universal Credit, in the first UC claim among the families liable for the rent, and are apportioned between those families for Housing Benefit and Council Tax Reduction.
  • HB LHA category. Housing Benefit gets its own LHA category and size criteria next to Universal Credit's.
  • HB meals. Meals in the rent come off Housing Benefit eligible rent on the routes the regulations say: not on the LHA route, where the cap rent is gross.
  • CTR. Council Tax Reduction divides the council tax among jointly liable sharers, and assesses each of their claims on the applicant's own family.

The law (read for this PR; texts and an independent legal memo in the review folder)

Rent liability

  • UC. A licence or other permission to occupy is a rent payment (UC Regs 2013 Sch 1 para 2(b)).
  • UC, sharers. Where several people are liable for the same rent, the renter's core rent is A/B × C: the total ÷ all persons liable × listed persons liable (Sch 4 para 24(4)).
  • HB. A licence is rent (HB Regs 2006 reg 12(1)). Shared rent is apportioned having regard to the number of persons and the proportion each pays (reg 12B(4)).

Tenure

  • UC Part 4 (private rented) applies to renters liable to anyone other than a social landlord (Sch 4 para 20). A lodger of a council tenant is therefore a private renter.
  • For HB this is a rent allowance with the LHA (reg 13C; SSAA 1992 s. 134).

Non-dependants

  • UC. None of these is a non-dependant (Sch 4 para 9(2)(d)-(f)):
    • a person liable on a commercial basis "whether to the renter, joint renters or another person";
    • the person to whom the renter's liability is owed, or a member of their household;
    • anyone already counted in another claim for the same accommodation.
  • HB.
    • Joint occupiers and commercial occupiers are excluded (reg 3(2)(d)-(e)). Sharers liable separately to the landlord do not "reside with" each other (reg 3(4)).
    • A non-dependant of several joint occupiers is apportioned between them (reg 74(5); SPC reg 55(5)).
  • CTR. People jointly and severally liable for the council tax, and commercial occupiers, are excluded (SI 2012/2885 reg 9(2)(d)-(e)). A shared non-dependant is apportioned equally (Sch 1 para 8(5)).

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:

    • a young individual with no non-dependant;
    • anyone entitled to one bedroom who lacks exclusive use of two rooms, or of a room with a bathroom, toilet and kitchen.

    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

  • UC. The food exclusion in service charges applies only in the social sector and to owner-occupiers (Sch 1 para 8(1), (6)(c); ADM F2060). A private boarder's whole payment is core rent, capped at the LHA.
  • HB. On the LHA route the cap rent is gross. Where a rent officer finds that a substantial part of the rent is board and attendance, the case leaves the LHA (reg 13C(5)(e), 13D(10)). The fixed Sch 1 para 2 amount for meals is then deducted from the maximum rent (reg 13(7) as substituted by SI 2007/2868).

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_rent and the new share_of_household_rent hold each family's own liability. personal_rent puts 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:

  • the household's rent per person liable, across the household head's family and any family with the new input liable_for_share_of_household_rent;
  • plus rent_paid_as_boarder and rent_paid_as_lodger.

Those two inputs and pays_rent_to_householder are byte-identical copies of #2002's files at the same paths, so the two PRs merge in either order.

Tenure. benunit_tenure_type is the family's own tenure: a boarder or lodger rents privately. in_social_housing and uc_housing_costs_element follow it.

Non-dependants

  • New is_non_dependant_of_household_head.
  • New 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 and lha_renter_has_non_dependant read it.
  • HB deductions are apportioned by share of rent (reg 74(5)).

LHA

  • LHA_category (UC) is set by entitlement only; is_shared_accommodation no longer affects it.
  • New housing_benefit_LHA_allowed_bedrooms, housing_benefit_shares_accommodation, is_housing_benefit_young_individual, housing_benefit_LHA_category and housing_benefit_LHA_rate.
  • New 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_category and category_maximum take the category variable.

Meals. New inputs meals_included_in_rent (default none) and housing_benefit_board_and_attendance_determination (default false), parameters gov.dwp.housing_benefit.ineligible_charges.meals.* (dated 2008-2026 from legislation.gov.uk point-in-time texts and each up-rating order), and housing_benefit_meals_deduction.

  • LHA route: the cap rent is the gross rent, with no deduction (regs 12D, 13D(5), (12)).
  • With a rent officer's board-and-attendance finding: the case is off the LHA (reg 13C(5)(e)) and eligible rent is the rent less the Sch 1 para 2 amount (reg 13(7)).
  • Social-sector path: the reg 12B(2)(b) deduction.

The FRS records neither meals nor the finding, so the dataset leaves both at their defaults.

CTR

  • New 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.
  • New council_tax_reduction_joint_liability_share. Excluded students are left out of the count (Sch 1 para 7(5)).
  • Applied in the national schemes and the five local schemes.
  • Joint tenants and lodgers are excluded from CTR non-dependants.
  • Where families claim on their shares (council_tax_reduction_claims_are_joint), each claim is assessed on the applicant's own family:
    • its scheme, by its own pensioner status (council_tax_reduction_claim_pensioner; SI 2012/2885 reg 3);
    • whether it is simulated or taken as reported (council_tax_reduction_claim_scheme_supported);
    • its exemption from non-dependant deductions (council_tax_reduction_applicant_has_non_dep_exemption).
  • A household with a single claim keeps that claim's scheme, exemption and simulated-or-reported choice exactly as on main.

Behaviour change for API users

  • BRMA_LHA_rate stays the published rate for LHA_category. Housing Benefit now reads housing_benefit_LHA_rate, so an input set on BRMA_LHA_rate no longer drives HB.
  • is_shared_accommodation now affects only HB.

Choices where the law leaves room (each documented on the variable)

  1. Sharers' split: per person liable, the UC para 24(4) default. HB reg 12B(4) and UC 24(5) allow departures for the actual proportions. In the FRS, HHRENT is about n/(n−1) × the other units' SRENTAMT (median 1.5; 2.0 with two units), which is consistent with equal shares.
  2. CTR, couple sharing with others. The regulations' wording divides by every person liable, the partner included, so a couple with one other sharer gets a third. An IFS commentary on the old Council Tax Benefit (C123, 2012) said two-thirds, citing nothing. No DWP or MHCLG guidance was found.
  3. UC: one claim per non-dependant. A non-dependant counts in one UC claim only (para 9(2)(f)). The model gives it to the head's family if that family is eligible for UC and claims, otherwise to the first sharer family that is; input order stands in for the order the claims were made.
  4. HB meals. With a rent officer's board-and-attendance finding the case leaves the LHA, and eligible rent is modelled as the rent less the Sch 1 para 2 amount. That is an approximation: reg 13(7) takes the meals amount off the rent officer's maximum rent, which the model does not represent, and the LHA does not cap this route.
  5. HB exclusive use. The data record no rooms, so a family that shares the rent or pays the householder is presumed to lack exclusive use of two rooms. housing_benefit_shares_accommodation can be set directly to rebut this.
  6. Not modelled:

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.

  1. Conservation: shares of household rent sum to 1, and families' rents sum to household rent plus boarder and lodger payments.
  2. Bounds: shares in [0, 1]; rents ≥ 0; non-liable families have no rent.
  3. Tenure: a boarder's or lodger's family rents privately, is never in social housing and is LHA-eligible.
  4. Non-dependants:
    • nobody in a family liable for rent is a non-dependant;
    • at most one family per household counts the household's non-dependants for UC, it is liable for the rent, and only it has UC deductions;
    • HB deductions over the liable families sum to the household's non-dependants' deductions;
    • boarders and lodgers have no UC or HB deductions;
    • no sharer, boarder or lodger is a CTR non-dependant.
  5. Category: the UC category is invariant to 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.
  6. Meals: deduction ≥ 0; on the LHA route eligible rent does not depend on meals; with a board finding it is the rent less the deduction, floored at zero.
  7. CTR, where rent is shared: claim shares total ≤ 1; each claim's scheme follows its own family's pensioner status; the household's simulated reductions never exceed its eligible council tax.
  8. Monotonicity in household rent.
  9. No-op: without sharers, boarders or lodgers, rent, the head's UC deductions and bedrooms equal the previous formulas, and CTR keeps the household's single claim, scheme and simulated-or-reported choice.

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:

  • UC and HB non-dependant aggregation;
  • four LHA_claimant_composition cases;
  • the pension-age HB LHA case.

Results

  • Full policy YAML suite at 16a455b: 1,870 passed.
  • At 16a455b: the six property tests passed, and 11 other housing, CTR and UC pytest files passed (62 tests, including test_deterministic_variables).
  • Full Python suite at b065a48 (round 1): 2,042 passed, 45 skipped, 0 failed.

Found while testing and fixed in PRs stacked on this one:

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.

  • Universal Credit, Council Tax Reduction and Pension Credit awards: no change in either year.
  • Housing Benefit: changes in fewer than 10 survey households (suppressed).
  • The potential UC housing costs element is computed for every renting family, claimant or not. It moves −£130m (2025-26) and −£117m (2026-27) because a non-dependant now counts only in a UC claim that is made (Sch 4 para 9(2)(f)). No award moves.

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.

£ a year 2025-26 2026-27
Universal Credit (all families) +£31.2m +£34.1m
UC housing costs element, sharers (91 survey households) £0 → £665m £0 → £674m
UC housing costs element, boarders and lodgers (36 survey households) £0 → £147m £0 → £147m
UC award, sharers +£72.9m +£74.5m
UC award, household heads −£50.4m −£49.2m
Housing Benefit <10 survey households (suppressed) <10 (suppressed)
Council Tax Reduction <10 survey households (suppressed) <10 (suppressed)
Pension Credit no change no change

Against calibration targets (build 2)

  • UC 2025-26: OBR £79.29bn. Main −4.52%, this PR −4.48%.
  • UC 2026-27: OBR £87.65bn. Main −8.82%, this PR −8.78%.
  • HB: unchanged against the OBR figure (+11.74% in 2025-26, +20.24% in 2026-27, on main and on this PR).

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):

  • the per-person split of shared rent (UC Sch 4 para 24(4));
  • one-third of the council tax for a couple jointly liable with one other person.

Review

  • Round 1 (independent, at b065a48): REQUEST_CHANGES with nine findings, three of them blockers. All are addressed in 01d140e.
  • Round 2 (independent, GPT-6.1 Sol, at 7769fa3): REQUEST_CHANGES with three blockers, all fixed in 0d7fae3 after merging main.
    • Joint CTR claims used the oldest family's pensioner status. Each now uses its own.
    • In the five councils' schemes, one sharer's disability exemption covered every claim or none. It is now the applicant's own.
    • The HB severe disability conditions missed the blind-partner rule (Sch 3 para 14(3)), which sent a couple sharing rent with a joint tenant to the shared rate.
    • It confirmed all nine round 1 findings resolved or unchanged as deferred, and no award change in 22 constructed households with no sharer, boarder or lodger other than seven legally supported corrections.
  • Round 3 (independent delta review at 16a455b): pending.

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

MaxGhenis and others added 6 commits October 1, 2026 10:04
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>
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>
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>
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>
@MaxGhenis

Copy link
Copy Markdown
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:

  • housing_benefit_LHA_category, housing_benefit_LHA_rate, is_housing_benefit_young_individual (verbatim), housing_benefit_severe_disability_premium_applies;
  • gov.dwp.housing_benefit.severe_disability_premium.qualifying_benefits (verbatim);
  • lha_rate_for_category and category_maximum(..., category_variable) (verbatim).

LHA_category stays the UC category. Where the files differ, this PR's versions are the superset and should win at merge. The details are in the comment on #2030.

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>
MaxGhenis and others added 2 commits October 2, 2026 15:15
…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>
MaxGhenis and others added 3 commits October 3, 2026 14:31
…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
MaxGhenis marked this pull request as ready for review October 4, 2026 02:05
@MaxGhenis
MaxGhenis merged commit 27dd5f7 into main Oct 4, 2026
6 checks passed
@MaxGhenis

Copy link
Copy Markdown
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
MaxGhenis deleted the benefit-unit-rent-liability branch October 4, 2026 02:05
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>
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>
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 sharers, boarders and lodgers their own rent, tenure and LHA category

1 participant