Conversation
…ans test Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…al schemes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gston's tariff income Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 2, 2026
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 was referenced Oct 2, 2026
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.
Summary
Council Tax Reduction (CTR) is means-tested on the applicant's own income and their partner's. The applicant is the person liable for the council tax. The model means-tested the benefit unit's claimant and partner (
is_claimant_or_partner) instead, and the two are not always the same people.The case that shows it (#2009 review r3, finding N3): an 80-year-old grandmother heads a household in Scotland and shares a benefit unit with two 17-year-old parents and their baby. #1896's parent-couple rule makes the young parents the benefit unit's claimant and partner. #2009 makes the grandmother the liable person, so the family claims through her. The means test still read the young couple:
This was already so on #2009's base (b065a48), so #2009 did not introduce it.
What changes
Two new variables say who is assessed:
council_tax_reduction_head_applies_alone(BenUnit): the household head is liable for the council tax but is not the benefit unit's claimant or partner.is_council_tax_reduction_applicant_or_partner(Person):Every part of the assessment that read the generic claimant, or the whole benefit unit, now reads the applicant:
council_tax_reduction_premiums)Where the head applies alone, she is assessed as a single person with no partner or children. The benefit unit's own awards (Child Benefit, Income Support, income-based JSA, income-related ESA, Universal Credit, tax credits) and its children belong to its claimant and partner.
Families whose applicant is the benefit unit's claimant are unchanged, with one exception: the pension-age allowance and the pensioner scheme no longer switch on a pension-age member who is neither the applicant nor the partner.
Law
Invariants
These hold for every input, and the property tests check them:
Tests
YAML,
applicant_or_partner.yaml, 11 end-to-end cases. None sets applicable income. 9 fail on Give Council Tax Reduction to the household head's family, not the oldest adult's #2009's head (4b84ea0); the other 2 pin behaviour that should not change (a partner under 18's income counts).Hypothesis,
test_council_tax_reduction_applicant_properties.py: 2 tests, the 5 invariants above, across all eight modelled schemes.Mutation checks. Ten mutations each put back one piece of the old behaviour, and every one makes a test fail:
The first draft of the differential missed the Universal Credit route, because its savings and bills rarely gave a part-withdrawn award. Its strategy now weights toward those values.
Regression. All 113 cases in the 12 YAML files that read Council Tax Reduction, its council schemes or the premiums pass. So do Give Council Tax Reduction to the household head's family, not the oldest adult's #2009's and Give sharers, boarders and lodgers their own rent, tenure and LHA category #2006's property tests (
test_council_tax_reduction_claimant_properties.py,test_rent_of_sharers_boarders_and_lodgers_properties.py). CI runs the full suite.Enhanced FRS impact
Real
Microsimulationruns, base 4b84ea0 against this branch at 905d0d9, on the same file each time. Later commits change only tests. Aggregates only.e433e532)e433e532)ed1a2991, uk-data#512)The reduction is identical for every household in all three runs. So are applicable income, applicable amount, the passport, the pensioner flag, the exemption, net income and poverty status. No household in the microdata has a head who applies alone, and none has a pension-age member of the head's family who is not the applicant or partner. The FRS forms a benefit unit from one adult or a couple and their dependent children, so it does not put parents into a grandparent's benefit unit. The fix therefore changes household calculations entered that way, and no population estimate.
Not in this PR
is_council_tax_reduction_applicant_or_partnerfor CTR (see Coordination).Coordination
is_council_tax_reduction_applicant_or_partnerin its per-family pensioner and exemption flags, and carries byte-identical copies of this PR's two identity variables. It deletescouncil_tax_reduction_household_has_pensionerandcouncil_tax_reduction_household_has_non_dep_exemption, which this PR edits. Whichever lands second keeps Assess each Council Tax Reduction claim under its own family's scheme and exemption #2015's per-family variables, and points the twoapplicant_or_partner.yamlcases that read the household flags at them.council_tax_reduction_pensioner): the same swap.council_tax_reduction_household_head, whichcouncil_tax_reduction_head_applies_alone,is_council_tax_reduction_applicant_or_partnerand the identity property test read. Itsis_resolved_household_headhas the same formula, so whichever lands second renames it in those three files.council_tax_reduction_premiumsusesbenefits_premiumsfor ordinary families, so their changes flow through. Its head-alone path mirrors the single-claimant rules, and invariant 5 fails if the two drift apart.axiom:
uk/regulations/uksi/2012/2885/schedule/1/paragraph/11encoded-correct (testsapplicant_income_and_capital_are_calculated,partner_income_and_capital_are_calculated,household_member_is_not_treated_without_polygamous_marriage) | Scotland and Wales (SSI 2012/319 reg 21, SSI 2021/249 reg 36, WSI 2013/3029 Sch 1 para 5 and Sch 6 para 7) TheAxiomFoundation/rulespec-uk#427 queued🤖 Generated with Claude Code