Repository navigation
Conversation
The five English working-age local schemes (Merton, Kingston upon Thames, Newham, Westminster, Oxford) reproduce the Default Scheme's para 9: an adult in the applicant's benefit unit who is not the claimant, partner, child or young person is a non-dependant. local_non_dep_deductions now charges the claiming family the household pool (claims x pool x share, as the national variable), counting the higher of each non-dependant couple (each member in Merton and Kingston where the couple has UC) and every other adult separately. normal_gross_income_non_dep_deduction bands a claimant/partner on the couple's joint income and anyone else on their own, uses each person's own hours, and gates the IS/JSA/ESA/PC/UC exemptions to the award's claimant and partner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ncil's scale Hypothesis properties 6 and 7: each council's individual and family deductions equal an independent calculation from its 2026-27 scale, and an adult who is not a claimant or partner changes no one else's deduction through their earnings (both fail on the previous aggregation). A Merton case for a 19-year-old who has left education, and #2017's Newham case now apportions the head's own son between the jointly liable families (para 30(5)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…amily Review r1 of #2077: an in-unit adult who personally pays the householder as a boarder or lodger, or is personally liable for the rent, was still a non-dependant, and a household head whom the inference left outside his benefit unit's couple was charged as his own non-dependant. The household head (the person liable for the council tax), anyone liable for the household's rent and anyone paying rent as a boarder or lodger is now nobody's non-dependant, in the national and local schemes alike. Property 6's oracle now derives who claims and each claim's share from the generated structure and checks the model's against them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi
left a comment
There was a problem hiding this comment.
Thanks Max. The rules applied match each scheme:
- Who is a non-dependant: charging in-unit adults follows para 9 ("any person ... who normally resides with an applicant", except "any member of the applicant's family").
- Couples: one deduction, the higher, on joint income follows para 30(3)-(4).
- Joint liability: the apportionment follows para 30(5).
- Merton and Kingston: the per-member UC deduction matches the Default Scheme's own "(other than where there is an award of universal credit)".
Verified at 663a5b7:
- Tests: the local_authorities YAML passes 67/67, benefit_unit_non_dependants 28/28 and properties 6/6.
- Probe for Newham, 2026:
- The household: a grandmother aged 55 applies alone. A 19-year-old couple live with her as another family; the father earns £30,000 and works 37.5 hours.
- The deduction is £1,175.72 (£22.61 × 52 on joint income of £576.92 a week). The mother's own deduction, £392.08, is the lower, so it is not taken.
- CTR is £84.28.
- Blocking: needs a rebase. #2017 conflicts with main in 6 files, and this PR adds a seventh,
_legacy.py(from #2009, merged 4 Oct). This is the same standard as #2015 and #2078. #2030 is also stacked on #2017. - Should fix: #2027 is missing from Coordination, and the conflict at
_legacy.py:175-179changes amounts.- The case: Merton, a non-dependant couple. One reports £5,000 of income-related ESA; the other works 20 hours on £15,000.
- Here: no deduction, CTR £1,800.
- With #2027's
is_on_*: £551.20 deducted, CTR £1,248.80. - Default Scheme para 2(4) ("payable to him") with para 30(3) supports #2027.
- Take #2027's
is_on_*there, keep your claimant-or-partner gate on the Pension Credit (:179) and UC limbs, and add the case.
- Should fix: this does not fix the #2078 grandmother cases.
- Both
own_family_member(_legacy.py:114) andin_unit(council_tax_reduction_individual_non_dep_deduction_eligible.py:40) key onis_claimant_or_partner. - So when the head applies alone and the inference makes the 19-year-olds the unit's couple, they count as neither her family nor her non-dependants.
- Put my probe household in one benefit unit and this PR gives a £0 deduction. Under paras 6 and 9 it should be £1,175.72, giving CTR of £84.28.
- Whichever PR lands second should key both on
is_council_tax_reduction_applicant_or_partnerfrom #2015/#2078. - #2078's Newham and Kingston grandmother cases also need explicit inputs:
- set the young father's
weekly_hours, so the hours band applies; - set
current_educationfor the 19-year-olds, who otherwise default to tertiary education and fall under the full-time student exemption (para 30(7)(c)). - Without these, those cases give a £0 deduction whatever the non-dependant logic does.
- set the young father's
- Both
- Should fix: the agreed #2015 resolution covers
_legacy.pybut not the eligibility file. - Should fix: the review-1 fix changes
council_tax_reduction_individual_non_dep_deduction_eligible, which the national schemes share. That is the body's −£3.4bn on the intermediate.- Say so in the title and changelog:
changelog.d/2014-local.fixed.mdmentions only the local schemes. - Also remove the survey household counts ("135 survey households", "134", "54").
- Say so in the title and changelog:
- Nit: close relatives who pay board are non-dependants.
- Para 9(3)(a)(i) makes someone who pays a close relative a non-dependant again: "that person is a close relative of his or his partner".
council_tax_reduction_individual_non_dep_deduction_eligible.py:47-51excludes every boarder and lodger, for example an adult son paying his mother board. Main does the same throughin_other_non_liable_family.- There is no relationship input, so document the gap in the variable and open a follow-up issue.
|
#2062 is now on This PR still adds formulas that read the raw flag:
Each needs to read the resolved head instead:
|
|
Cross-reference from #2027 (a maintainer review there, 5 October, raised this household). #2027 (head The household: Merton, a non-dependant couple. One reports £5,000 of income-related ESA; the other works 20 hours on £15,000.
The resolution the reviewer proposed: when this PR merges main after #2027, read |
|
Independent review (GPT-6.1 Sol, UK hub sweep, 2026-10-12): REQUEST_CHANGES at VERDICT: REQUEST_CHANGES
Validation: 51 focused YAML cases passed serially after checking compressor usage below 30 GB. Python property tests could not collect because Hypothesis was unavailable; xdist was also unavailable. Ruff lint and formatting checks passed. No tests were weakened, skipped or xfailed by this PR, and no protected infrastructure files changed. Both requested |
|
Parent update: What changed under you:
|
|
UK hub takeover for the Budget fix sprint (Max, 21 Oct). The owner session If the owner session wakes, please don't push to this branch; comment here instead, so there's only one writer. 🤖 Generated with Claude Code |
…ain's per-applicant exemption Resolutions in the PR's hand-off. The local schemes now take the shape of #2017's national aggregator (deduction_per_family over the CTR applicant's in-unit set), main's is_on_* payee tests for every para 30(8)(a) benefit, and the person's own earnings for the Universal Credit limb. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gs, and #2017's head-alone couple Para 30(8)(c) of each local scheme exempts a non-dependant entitled to Universal Credit "calculated on the basis that the person does not have any earned income". The merge reads it on the person's own earnings, as #2007's national schemes read the same words, so the non-earning member of a UC couple is exempt: Merton's couple pays 691.60, not 962 (CTR 1,108.40), and Newham's partner's own deduction is nil (the couple's one deduction, the worker's, is unchanged). Main's IIDB case for a grandmother who applies alone noted that the model charged nothing for the couple in her benefit unit until #2017. With #2017 they are her non-dependants: one deduction, the lowest (5.20 a week), so council_tax_benefit is 1,195.968. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… outside the head's family Reg 9(2)(d)-(e) exclude the person, but reg 9(3)(a) keeps as a non-dependant anyone who pays a close relative of the applicant or partner, or pays on a non-commercial basis. The model has no relationship input, so a member of the household head's own family who pays board is taken to be a close relative and stays a non-dependant; anyone else who pays the householder is excluded (Sol review r1 finding 2, maintainer point 6). The gap for a close relative in another family is documented in the variable. The household head and anyone liable for the rent are no longer excluded wholesale: #2017's in-unit set is built on the CTR applicant, so an applicant is never in it, and is_liable_for_household_rent marks the young couple of a grandmother who applies alone as liable, which wrongly excluded them (maintainer point 3). A joint tenant who is not their unit's claimant or partner (an input) is still excluded. A student head whose family cannot claim stays the co-tenant's non-dependant, as main's case has it. No raw is_household_head read remains. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s the Default Scheme does Westminster publishes only a summary of its working-age scheme, which states that the Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 form its basis, and the Appendix A scale. The Default Scheme's para 30(3) makes one deduction for a couple "(other than where there is an award of universal credit)", as Merton's and Kingston upon Thames's full texts do. With no Westminster provision departing from it, the model follows the Default Scheme (Sol review r1 finding 4, d1398 part 2, logged in RULINGS.md). A YAML case pins it: a UC couple, one earning £30,000 at 37.5 hours and one £2,600 at 10 hours, pays £15.95 + £5.20 a week (1,099.80 a year). The property oracle's Westminster entry follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e changelog Sol review r1 finding 2 asked for regression coverage across the national and devolved schemes, since the eligibility variable is shared. A son in his mother's benefit unit who pays her board stays her non-dependant in England's pensioner scheme (270.40), Scotland's (288.60), Wales's (348.40) and Merton's (691.60 on his own earnings); a lodger's son who pays the householder himself is excluded in Scotland. The relationship gap is #2559. The changelog now says what changes in the national schemes too (maintainer point 5): who is excluded for paying board or as a joint tenant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…endants are charged Each case said it was provisional until #2017: the 19-year-old parents are the grandmother's non-dependants, but the model charged none in her benefit unit. They passed only because the couple defaulted to tertiary education, so the full-time student exemption applied (maintainer review point 3). The couple are now not in education, and the Newham father works 37.5 hours: - England pensioner (JSA): the payee is exempt, the other pays the lowest amount, 270.40, so the reduction is 489.20, not 759.60. - Newham (UC): one deduction, the father's 22.61 a week on £576.92 (1,175.72); the mother has no earned income of her own, so is exempt. The reduction is 84.28, as the maintainer's probe gave. - Kingston upon Thames (UC): both on UC with no earned income, so both are exempt; the reduction is unchanged at 1,627.32. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Para 2(3)-(4) define being on income-based JSA and income-related ESA as the award being payable to the person, and para 2(1) a person on Income Support as one in receipt of it; State Pension Credit has no definition, so the model reads it the same way. Comment only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
UK hub build sprint-2077b: hand-off at The branch is a fast-forward of
Tests (local, locked venv):
Impact (Aggregate impact workflow, certified enhanced FRS, dispatched because this base gets no PR CI):
Open items:
🤖 Generated with Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles; standard reform costings (change in gov_balance); standard reforms: change in each reform's target. Checks failing on both base and head (1)
Counted-once checkThe check raised each of 92 components by £1 per unit in 2026-27 and read every head of its totals household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A response that is not finite breaks every rule. The check measures a head that breaks a rule twice more: once holding every other head at its baseline value, and once holding every other head at its value after the first £1 while the component rises again. The head fails where either measurement still shows the response. The check cannot hold a head at a value that is not finite. In each unit where another head is not finite after the first £1, it holds that head at its baseline value, and the second measurement judges no household the unit belongs to. There a head fails wherever it first broke a rule, or wherever the check could not confirm whether its response contains the component. 0 failed and the check skipped 0.
Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
The local schemes' oracle left out a lodger's qualifying young person aged 18 or over, whom the model and the national oracle count as a non-dependant: reg 9(2)(e) of SI 2012/2885 excludes only the person liable to pay the householder. CI found a Westminster household where the model charged such a young person £270.40 a year and the oracle charged nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2014
#2017, which landed through #2010, charges non-dependants inside the claimant's own benefit unit in UC, HB and the national CTR schemes, and keeps the five English working-age local schemes on their old aggregation behind a mask. This PR brings those schemes (Merton, Kingston upon Thames, Newham, Westminster, Oxford) into line with the law and with #2017's national variable. It also narrows who the shared eligibility variable excludes personally, which touches the national schemes too.
Status
Head
a5231bac0corrects the local schemes' oracle on top of0be31733c. That commit mergesmainat0520d9646and takesmain's side of one comment incouncil_tax_reduction_prescribed_benefits.yaml, where both sides expect £270.40.At
0be31733c, CI failedtest_local_scheme_deductions_match_the_oracleon a Westminster household where a lodger lives with a young person aged 18 whom a local authority placed with them. The model charged the young person £270.40 a year and the oracle charged nothing. Para 9(2)(e) excludes only a person liable to pay the householder, and the young person pays nothing, so the model counts them as a non-dependant.a5231bac0adds that case to the local oracle, matching the national oracle in the same file, and leaves the model unchanged.The law
Each council's 2026-27 scheme reproduces the Default Scheme's (SI 2012/2886) definitions:
What follows from the texts:
Changes
_legacy.py:local_non_dep_deductionsnow has the shape of Charge non-dependant deductions within the claimant's benefit unit #2017's nationalcouncil_tax_reduction_non_dep_deductions: claims × joint-liability share × (the household's pool, less the claiming family's own amount, plus its own in-unit non-dependants). It uses Fix HB and national CTR non-dependant deductions #2007'sdeduction_per_family: one deduction per couple, the higher, or each member's where the scheme keeps the UC exception; anyone else separately. The claiming family's own non-dependants are Charge non-dependant deductions within the claimant's benefit unit #2017'sis_benefit_unit_non_dependant_for_council_tax_reduction, built on the CTR applicant (Means-test the Council Tax Reduction applicant and partner, not the benefit unit's claimant #2078). So a grandmother who applies alone is charged for the couple in her benefit unit. Main's per-applicant exemption guard (Assess each Council Tax Reduction claim under its own family's scheme and exemption #2015) stays. The local mask is gone.normal_gross_income_non_dep_deduction:is_on_income_support,is_on_income_based_jsa,is_on_income_related_esa(Count only the claimant's and partner's legacy awards in means tests and passports #2027) andis_on_pension_credit;is_on_universal_creditand the person's own earned income (Fix HB and national CTR non-dependant deductions #2007'shas_earned_income, UC Regs 2013 reg 52).council_tax_reduction_individual_non_dep_deduction_eligible(shared with the national schemes) is(other family | in-unit) & ~personally excluded. The personal exclusions are:is_liable_for_household_rent) who is not their benefit unit's claimant or partner;A member of the head's own family who pays board is taken to be a close relative (9(3)(a)(i)) and stays a non-dependant. The model has no relationship input, so a close relative in another family who pays is still treated as a commercial lodger. That gap is documented in the variable and is #2559. The raw
is_household_headread is gone.westminster_council_tax_reduction_non_dep_deductionsdeducts for each member of a non-dependant couple with Universal Credit, as the Default Scheme's para 30(3) does.Review responses
Sol review r1 (REQUEST_CHANGES at 663a5b7):
Maintainer review (vahid-ahmadi, 5 Oct):
is_on_*for IS, JSA and ESA, andis_on_pension_creditfor State Pension Credit, because para 30(8)(a) uses one "who is on" for all four (Readings 3). Count only the claimant's and partner's legacy awards in means tests and passports #2027's Merton case ("A non-dependant couple on ESA with a working partner pays the partner's deduction on their joint income") is on main and passes here.applicant_or_partner.yamlpassed only because the 19-year-old parents defaulted to tertiary education. They are now not in education, and the Newham father works 37.5 hours. Newham gives your probe's result: one deduction, the father's £1,175.72, and a reduction of £84.28. The mother has no earned income of her own, so she is exempt. The England pensioner JSA case charges the non-payee £270.40 (reduction £489.20). In Kingston upon Thames both are exempt on UC with no earned income (unchanged £1,627.32).council_tax_benefitis £1,195.968.(other_family | in_unit) & ~personally_excluded, with Assess each Council Tax Reduction claim under its own family's scheme and exemption #2015's claimant-family test insideother_family.Max's comment (6 Oct, resolved head): no formula here reads
is_household_head.Readings
Invariants
For every input:
Tests
These local runs predate
0be31733c, and CI runs the full suite at the head.policyengine-core test, single process). This includeslocal_scheme_non_dependants.yaml(25 cases, every expectation hand-computed from the scheme text).benefit_unit_non_dependants.yamlgains 5 cases, and the renamed Newham case replaces Charge non-dependant deductions within the claimant's benefit unit #2017's mask-pinning one.git archiveexport of the parent (Charge non-dependant deductions within the claimant's benefit unit #2017 at3efa8bd60merged with main,7ba613fb9), 21 of this head's cases in the three PR YAML files fail, including all three reproducers. The national close-relative cases pass there too. They guard against the previous head's wholesale lodger exclusion.-n 4): the four core files,test_benefit_unit_non_dependant_properties.py(including local properties 5-6),test_household_head_agreement_properties.py,test_non_dependant_deduction_properties.pyandtest_council_tax_reduction_claimant_family_scheme_properties.py: 17 passed. A second batch of eight CTR property files (applicant, claimant, legacy award readers, sharers/boarders/lodgers, young person, Child Benefit, UC non-dependant Pension Credit, prescribed benefits): 45 passed. That makes 62 of 62.uvx ruff@latest(0.17.1, CI's unpinned version):format --check .,check .andcheck --select F811,F821 policyengine_ukare all clean.Impact
The Aggregate impact check (run 42645033702) compares
mainatd51471bf7withmainplusa5231bac0, on the certifiedenhanced_frs_2024_25.h5(policyengine-uk-data 1.58.1). In every fiscal year from 2025-26 to 2031-32, no household's net income or reported aggregate changes, no check breaks and the run flags no move. Thesign:vatcheck fails on both sides.The local-scheme, Westminster and eligibility changes alter household calculations in the five councils, and for board-payers outside the head's family and joint tenants that a user enters as inputs.
Axiom
axiom: TheAxiomFoundation/rulespec-uk#426 queued. The Kingston upon Thames, Merton and Newham modules derive each non-dependant's deduction from their own income and hours, which is encoded-correct given its inputs. They take who is a non-dependant, the exemption and the household total as inputs. Westminster defers Appendix A, and Oxford has no module.
Coordination
Reproducer:
policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/local_scheme_non_dependants.yaml::Merton charges the applicant's own non-dependant son for his own earningsReproducer:
policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/local_scheme_non_dependants.yaml::Westminster deducts for each member of a Universal Credit couple, as the Default Scheme doesReproducer:
policyengine_uk/tests/policy/baseline/finance/benefit/family/benefit_unit_non_dependants.yaml::CTR (Scotland), a lodger's adult son who pays the householder himself is not a non-dependant🤖 Generated with Claude Code