Conversation
…dest adult's The claimant family was the one whose oldest member was the household's oldest adult. Families tied for oldest were both flagged, and every CTR scheme (England pensioners, Scotland, Wales, the four London schemes and Oxford) then paid each of them a full award: two single 85-year-olds in one household with no income got twice the council tax. The same flag left both out of each other's non-dependant deductions. Only a person liable to pay the council tax is in a class entitled to a reduction (SI 2012/2885 Sch 1 paras 2(a), 3(a); SI 2013/3029 regs 22(a) to 25(a); SSI 2021/249 reg 13(3)(a); SSI 2012/319 reg 14(3)(a)). Liability goes to the resident with the greatest interest in the dwelling (LGFA 1992 s.6, s.75), not the eldest. The FRS household reference person is a householder, in whose name the accommodation is owned or rented, which the data carries as is_household_head. So the claimant family is now the head's, plus any family liable for a share of the rent (jointly liable, s.6(3), s.75(3)). - benunit_contains_household_head: the family holding the household head. Exactly one per household: with several flagged, the eldest flagged; with none, the eldest member. - council_tax_reduction_claimant_benunit: head's family or a sharer family. - council_tax_reduction_joint_liability_share: counts the claimants and partners of the claimant families as jointly liable. - council_tax_reduction_individual_non_dep_deduction_eligible: no member of a claimant family is a non-dependant (reg 9(2)(d)). Tests: 12 YAML cases (each scheme, ties, a parent in their child's home, malformed head flags) and Hypothesis properties (one head per household, at most one claimant family unless the rent is shared, no reduction outside claimant families or above the council tax, non-dependants, a differential with the person-level head, age invariance, and the previous rule where the head is the eldest). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 1, 2026
…tr-claimant-household-head Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 1, 2026
Reg 9(2)(a) excludes the applicant's family (claimant, partner and the children they are responsible for) from non-dependants, not every member of the FRS benefit unit. PR #2017 charges non-dependants who share a benefit unit with the claimant, so the property now asserts that no claimant or partner of a claimant family is a non-dependant. It holds on this branch and on its composition with #2017. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e and non-dependant changes Review r1 (20261001-133703-ctr-claimant-review-r1) found that a sharer family with no claimant or partner (a lone 15-year-old) claimed with a share of one, paying the household twice its council tax, where the base excluded it. council_tax_reduction_claimant_benunit now also requires a claimant or partner aged 18 or over. No one under 18 is a "resident" who can be liable (LGFA 1992 s.6(5), s.99(1)). The joint-liability count likewise takes only claimants and partners aged 18 or over. Documentation no longer says the head is the liable resident, only that the model takes the head as that resident. It names what is not identified: joint owners in separate families, and owner-liable dwellings. It notes that rent and non-dependant rules read the raw is_household_head flag. Citations add LGFA 1992 ss.9, 13A, 77, 77A, 99 and Sch 1A para 2; SI 2012/2885 Sch 1 para 3; SI 2012/2886 Sch para 16 (default working-age class D); and Wales regs 21, 23 and 25. YAML: - the Merton, Kingston and Westminster ties now compute the friend's non-dependant deduction from each scheme's scale; - the no-flag case is now a tie that fails on the base; - new cases cover a zero-rent sharer (a claimant, not a non-dependant), shared rent with no head flagged and with two heads flagged (shares sum to one), and sharer families aged 15 and 17. 16 of 17 cases fail on the base; the 15-year-old case guards e9b1185's regression. Properties: the generator adds minor-only sharer families. New invariant 8 says claimant shares sum to at most one. Invariant 3 is scoped to simulated CTR. Formula restatements are labelled as pins. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
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>
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
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>
…, not the generic claimant/partner Review r2c (20261002-044503-ctr-claimant-review-r2c, GPT-6.1 Sol) found N2. The 18+ claimant-or-partner gate dropped a supported grouping: an 80-year-old household head living in one benefit unit with two 17-year-old parents and their baby. #1896's parent-couple rule makes the parents the claimant and partner, so the family had no adult claimant or partner and lost a £1,800 award to £0. The model now names the liable people directly, in a new person-level variable, council_tax_reduction_liable_person. Each must be aged 18 or over (LGFA 1992 s.6(5), s.99(1)). They are: - the household head; - the head's partner, where the head is a claimant or partner (s.9, s.77, s.77A); - the claimant and partner of a family liable for a share of the rent. A family claims if and only if it has such a member, and the joint-liability share counts exactly these people. The settled one-per-household head moves into council_tax_reduction_household_head (Person), and benunit_contains_household_head now reads it. For all-adult households with the head as claimant, the liable set is unchanged. Tests: - YAML: a grandparent head with 17-year-old parents in her family (claims £1,800), and adult parents in a grandparent's family (not jointly liable). Both fail on 7b21ab4. - Properties: the generator adds 16-17-year-old parent couples with a baby in the head's family. New independent checks: the head's family always claims when the head is 18+; every liable person is 18+ and in the head's family or a sharer family. These fail on 7b21ab4. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
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>
This was referenced Oct 2, 2026
Collaborator
Author
|
Heads-up from #2006 (its base): the independent review of #2006 asked for changes, now pushed as 01d140e. Three touch files this PR edits.
New cases in 🤖 Generated with Claude Code |
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
#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>
This was referenced Oct 2, 2026
Open
MaxGhenis
added a commit
that referenced
this pull request
Oct 2, 2026
#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>
This branch has not been deployed
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.
Stacked on #2006 (
benefit-unit-rent-liability), which addscouncil_tax_reduction_claimant_benunit. Merge after #2006; it retargets tomainthen.The bug
benunit_contains_household_headwasbenunit_max_age == household_max_age. When the oldest adults of two benefit units have the same age, both units are flagged, and every Council Tax Reduction scheme pays each of them a full award:simulated_council_tax_reduction_benunit.py;_legacy.py;The same flag also left both units out of each other's non-dependant deductions.
Reproduction: two single adults in separate benefit units of one household, council tax £1,800, zero income (2026,
claims_all_entitled_benefits).The age rule is also wrong without a tie. A pensioner living in their adult child's home was treated as the claimant, and the household was put on the pensioner scheme.
The law
Read on legislation.gov.uk on 2026-10-01 (revised text):
Only a liable person is in an entitled class.
Who is liable. LGFA 1992 s.6 (England and Wales) and s.75 (Scotland) take the resident with the greatest interest, in order:
Two or more at the same level are jointly and severally liable (s.6(3), s.75(3)). A resident spouse, civil partner or cohabitant of the liable person is jointly liable too (s.9, s.77, s.77A). Age plays no part, apart from the 18-or-over definition of "resident" (s.6(5); s.99(1) for Scotland).
Who is not a non-dependant.
The data. The FRS household reference person (
is_household_head, fromhrpid) is "the highest-income householder", a householder being "the person in whose name the accommodation is owned or rented" (DWP, FRS background information and methodology, 2024-25). In most households that is the person at the top of the s.6/s.75 order. It is not the same in every case: joint householders of the same rank, owner-liable dwellings such as houses in multiple occupation, and households where the HRP is not the one who owns or rents. Every household in the enhanced FRS 2024-25 has exactly one HRP.The decision: the household head's family, not a tie-break
A deterministic tie-break would stop the double award. But it would keep a rule the law does not use: the claim would still go to the eldest resident instead of the householder. The data already marks the liable person, and Universal Credit and Housing Benefit already use that person for rent and non-dependants (
is_non_dependant_of_household_head,is_liable_for_household_rent). So the model now takes the household head's family as the claimant, plus #2006's sharers as jointly liable.Scope: in the household calculator, where
is_household_headis not entered, the head defaults to the eldest member (is_household_head's own formula). There, ties are fixed, but a pensioner in their adult child's home still claims unless the user marks the child as head.Changes
council_tax_reduction_household_head(new, Person): the household head, exactly one per household.get_ranksorts stably.benunit_contains_household_head: the family holding that person.council_tax_reduction_liable_person(new, Person): the people the model treats as liable for the council tax, each aged 18 or over (no one under 18 is a "resident"):Other adults in the head's family are not liable. That includes grown-up children, and a young couple living in a grandparent's family.
council_tax_reduction_claimant_benunit: a family claims if and only if it has a member treated as liable. That is the head's family, and Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006's sharer families.where(rent_is_shared, any(is_liable_for_household_rent), …).council_tax_reduction_joint_liability_share: counts exactly the people treated as liable. For well-formed all-adult input that is the same set asis_liable_for_household_rent. Without this, malformed head flags plus a sharer could pay more than the council tax.council_tax_reduction_individual_non_dep_deduction_eligible: excludes every claimant family, not just the head's. A sharer with zero rent was both a claimant and a non-dependant (reg 9(2)(d)).A changelog fragment, and a stale comment in Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006's property test (7).
Invariants (property-tested)
policyengine_uk/tests/test_council_tax_reduction_claimant_properties.pyruns Hypothesis over populations of up to 8 households with 1-4 families each. The populations mix:The tests are derandomized, with 20 examples each. Items marked "pin" restate the formula, so they guard against regressions rather than checking it independently.
is_household_headthat Housing Benefit and Universal Credit use.On the base branch, properties 1/2 and 6 fail. Hypothesis minimized the failure to two single 18-year-olds, head flagged on one: both claim, and raising the other's age moves the claim. Property 7 passes on both, as intended.
Tests
YAML.
claimant_household_head.yaml, 19 cases:18 of 19 fail on the base. The 15-year-old case passes on the base; it guards against this PR's first version, which paid that household twice. The two grandparent cases fail on the intermediate
7b21ab460.Suites on
4b84ea069:test_council_tax_reduction_claimant_properties.py: 3 passed;test_rent_of_sharers_boarders_and_lodgers_properties.py: 6 passed;ruff format --check: clean.e9b1185ee, where a family with no member aged 18 or over claims.7b21ab460, where the head's family with 16-17-year-old parents doesn't claim.7b21ab460passed in run 36972969501 (1,517 YAML, 2,089 pytest).e9b1185eethe full suites had one failure, Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006's ownTestHeadOrdering(personal_rent). Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006 fixed it inb065a48d2, which is merged in here.CI runs only on PRs whose base is
main, so the "Code changes" workflow is dispatched on this branch by hand.Enhanced FRS impact
Real
Microsimulationruns, baseb065a48d2(#2006's head) against branch4b84ea069, on the same dataset. That is six runs: two datasets, and two years on the first. Every output matches the earlier runs ofe9b1185eeand7b21ab460. The liable-person rules change nothing in the survey data. Aggregates only. Any cell behind fewer than 10 survey households is suppressed. Survey households are counted by a (region, sorted ages) fingerprint, which merges the enhanced FRS's capital gains clones and SPI copies with their source households.Production enhanced FRS 2024-25 (sha256
e433e532…, the certified 1.56.16 file):What the runs show about why:
claims_all_entitled_benefitsis false for every family; it is true only when a simulation has no reported benefits. So a family claims CTR exactly when it has reported CTR. The runs confirm this: no family would claim without reported CTR, and every family with reported CTR would claim.claims_all_entitled_benefitsis true, not in the survey totals.compare_efrs_2026.out).#2006's companion data (uk-data#512 build, sha256
ed1a2991…, which carriesliable_for_share_of_household_rent), 2026-27:Both sets of figures use the national CTR non-dependant deduction as it stands on this base, the Housing Benefit schedule. None of the measured change runs through non-dependant deductions: simulated CTR is unchanged in every family.
Interaction with #2007.
Scripts, logs and outputs (local, not published):
~/reviews/ctr-claimant-household-head-2026-10-01/impact/.Review record
Independent reviews on Subfleet lanes, each by a different reviewer:
e9b1185ee7b21ab4607b21ab4604b84ea0694b84ea069b065a48d2; deferral accepted; nothing else openThe reports are local, in
~/reviews/ctr-claimant-household-head-2026-10-01/review/.Conflicts and stacking
council_tax_reduction_individual_non_dep_deduction_eligible.py. Resolve the conflict by keeping Charge non-dependant deductions for non-dependants within the claimant's benefit unit #2017's structure, withother_family = ~council_tax_reduction_claimant_benunit & ~benunit_is_rent_liable, and keeping itsown_familyterm. Confirmed withgit merge-tree.Not in this PR
Scheme choice in shared-rent households.
council_tax_reduction_household_has_pensionerandcouncil_tax_reduction_household_has_non_dep_exemptionare household-level and read the head's family. Assess each Council Tax Reduction claim under its own family's scheme and exemption #2015 makes both per family.Malformed head flags outside CTR. CTR settles on one head, but the rent and Universal Credit/Housing Benefit non-dependant variables read the raw
is_household_head. With two members flagged, the second flagged family has a share of the rent but is neither a CTR claimant nor a non-dependant. Survey data always has exactly one head. A shared, settled head for every programme is a separate follow-up.Who is means-tested when the liable head is not the family's claimant. In a grouping Replace generic child and adult flags with each programme's legal definitions #1896 supports, a grandparent head lives in one benefit unit with a couple of 17-year-old parents and their baby. Replace generic child and adult flags with each programme's legal definitions #1896's parent-couple rule makes the parents the family's
is_claimant_or_partner.b065a48d2, where the family claims under the old age rule (checked on both heads). This PR keeps the base's behaviour for the grouping.7b21ab460refused the claim instead, which was wrong for a grandparent with no income.Joint owners and owner-liable dwellings. Joint owner-occupiers in separate benefit units are jointly liable under s.6(2)(a) and (3), but nothing in the data marks them; only Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006's renting sharers are marked. Dwellings where the owner rather than a resident is liable are not modelled.
axiom: TheAxiomFoundation/rulespec-uk#409 queued (LGFA 1992 ss.6, 9, 75, 77 and the CTR class liability conditions; joint-liability division is TheAxiomFoundation/rulespec-uk#406)
🤖 Generated with Claude Code