Repository navigation
Conversation
…limit The legacy enhanced disability premium read is_enhanced_disabled_for_benefits, whose formula tested only the highest-rate DLA care component. The Regulations (HB Regs 2006 Sch 3 para 15, IS Regs 1987 Sch 2 para 13A, ESA Regs 2008 Sch 4 para 7, JSA Regs 1996 Sch 1 para 15A and the Northern Ireland equivalents) also name the enhanced PIP daily living component and armed forces independence payment, and they limit the premium to people who have not attained the qualifying age for State Pension Credit. - receives_enhanced_disability_premium_qualifying_benefit reads a GB and a Northern Ireland list of qualifying benefits, with each country's dates. - The claimant-or-partner count applies the age limit. - Council Tax Reduction applies its scheme's own condition: Scotland's working-age scheme adds attendance allowance from April 2023 and has had no age limit since 20 June 2022. - is_enhanced_disabled_for_benefits becomes a deprecated alias. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases worked by hand from HB Regs 2006 Sch 3 para 15 and Part 4, IS Regs 1987 Sch 2 para 13A, the Northern Ireland lists and the Welsh and Scottish Council Tax Reduction schemes. Read the Scottish age-limit switch as a scalar with `not`, since `~` on a Python bool is bitwise inversion. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The pension-age Council Tax Reduction applicable amount now adds an amount for each child or young person in the family (England SI 2012/2885 Sch 1 para 6(1)(b) and Sch 2 para 2, with the 2018-19 to 2024-25 two-child limit and its Child Tax Credit exception; Wales WSI 2013/3029 Sch 2 para 2; Scotland SSI 2012/319 reg 20(b) and Sch 1 para 3) and the family premium where the scheme still has one (Wales; England and Scotland to April 2016). General-rule income now counts tariff income from capital over 10,000 (SI 2012/2885 Sch 1 para 37; WSI 2013/3029 Sch 1 para 31; SSI 2012/319 reg 27(2)), reusing the pension-age Housing Benefit tariff parameters. Four existing YAML expectations move with the law: the 16,000 capital case gains 624 a year of tariff income, and three pensioner cases with a child or young person gain the child amount. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An oracle computed from the award inputs checks the legacy and Council Tax Reduction premiums for single people, couples and lone parents in every nation across 2016-2026, with monotonicity, rate bounds, the CTR-versus- legacy differential and the Housing Benefit child premiums' own copy of the paragraph 15 list. The CTR applicant differential now also draws enhanced PIP daily living for the household head, since the deprecated flag it drew no longer reaches the premium. Add the changelog fragment and cite the Income Support and ESA claimant age conditions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…riff The new property tests check that tariff income is the statutory tariff and never falls as capital rises, that adding a dependent child never lowers the applicable amount, and that pensioners with no child and capital up to 10,000 and every working-age family get none of the new amounts. A frozen differential checks those households against values computed on origin/main at 2da212a. Two existing property tests move with the law: the Child Benefit test's State Pension range rises so its award stays interior above an applicable amount that now includes the children, and the Pension Credit test's recomputed general-rules income adds the statutory tariff income. Wales's 2013-14 child amount is 65.62, set by WSI 2013/112 reg 5(b). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
legislation.gov.uk serves SI 2012/2885 Schedule 2 paragraphs 2 and 3 under Parts 1 and 2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… cases A lone-applying household head aged 60 in Edinburgh with attendance allowance now meets Scotland's working-age enhanced disability premium condition, which SSI 2023/38 extended to attendance allowance from 1 April 2023 (SSI 2021/249 Sch 1 para 14(1)(g)). Each case's premiums and applicable amount rise by the single rate, 22.00 * 52 = 1,144.00. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The applicant in these three Scottish cases receives the enhanced PIP daily living component, which meets the enhanced disability premium condition for Housing Benefit (HB Regs 2006 Sch 3 para 15(1)(c)), Income Support (IS Regs 1987 Sch 2 para 13A(1ZA)(c)) and Scotland's working-age Council Tax Reduction (SSI 2021/249 Sch 1 para 14(1)(f)). Each premium total and applicable amount rises by 22.00 * 52 = 1,144.00, and each reduction by 20% of that, 228.80. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…heme's own list An award of the highest DLA care rate or the enhanced PIP daily living rate now needs a positive amount, and takes its rate from the award category or, for an amount entered without its category, from an amount within £1 a week of the top rate. A zero or neutralised amount is no award. The Housing Benefit child premium reads the same awards. Merton and Kingston upon Thames count PIP daily living at either rate and no armed forces independence payment; Newham counts both (Sch 3 para 12 of each council's 2026-27 scheme). Westminster keeps the Housing Benefit condition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…list Adds YAML for amounts entered without a category, the £1 tolerance, explicit zero amounts and part amounts, the child premium, a Merton applicant whose AFIP adds no premium and each London council's list, and replaces the property test's outside-Scotland equality with scheme-specific expectations. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ters Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ption SI 2012/2885 Sch 1 para 6(1B)(a) asks whether the applicant has an award of Child Tax Credit "whether or not any amount is payable". The child amounts read an award only from would_claim_CTC and is_CTC_eligible, so an entered final child_tax_credit with three individual elements gave two child amounts. A positive final child_tax_credit now counts as an award too, and the claim-and-eligibility route stays for a nil-rate award. New YAML cases: the entered award (three amounts), a claim without eligibility (two), and a nil-rate award (three). Case 16's name uses "their". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SI 2012/2885 Sch 1 para 37 and WSI 2013/3029 Sch 1 para 31 count capital in excess of £10,000 "but not exceeding £16,000". SSI 2012/319 reg 27(2) has no such ceiling; reg 40 separately ends entitlement above £16,000. The tariff now caps capital only in England and Wales, so a Scottish pensioner with £20,000 has 20 * 52 = £1,040 of tariff income, not £624, and still no reduction. New YAML cases for Scotland and Wales at £20,000. The Pension Credit and children/tariff property tests' reference calculations cap only England and Wales. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The general-rules income floors cash income after tax, pension contributions and the earnings disregards, then adds tariff income as a separate source. A pensioner with no cash income, £3,000 of pension contributions and £10,001 of capital has applicable income of £52. Moving the tariff inside the floor would give nil. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Capital changes a savings-credit-only pensioner's applicable income through the Secretary of State's assessment, and a child who brings Universal Credit into payment for a mixed-age couple moves them to the working-age scheme. The property docstring now states each invariant for the route its generated families stay on, and names those route changes as model behaviour. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The applicable amount comment now says we include the severe disability and carer premiums for pensioners, rather than that the pension-age schedules have only those (England's Sch 2 paras 7 and 8 have more). The applicable income comment uses "them", and the new documentation names the Ministers, councils or "we" that act. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A situation that supplies an amount for one person supplies zero for everyone else, so the oracle's per-person category rate did not hold once any person in the example entered an amount. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rules Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tariff documentation and comments now say who acts (councils, the Scottish Ministers) rather than giving the verb to a regulation, and the "Nil for working-age families" fragments become sentences. No code changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Give the qualifying verbs to claimants, councils and the Scottish Ministers in the parameter descriptions, docstrings, changelog and test comments, state the stored flag's exact DLA boundary, and qualify Kingston upon Thames's printed amounts with its adopted uprating mechanism. No executable code or parameter value changes: ASTs without docstrings and parameter YAML without descriptions and references match 7c42ca7. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
State that the council delegated annual uprating in December 2013, kept its 2015-17 scheme apart from Annex 3's uprating in July 2014, and that its 2026-27 introductions name the Prescribed Requirement Scheme. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The child-limit exception in council_tax_reduction_pensioner_child_amounts now reads the claim and eligibility only while gov.dwp.tax_credits.active holds, as has_tax_credit_award does. A supplied positive final award still counts. Case 21 covers eligibility without a claim, and Case 22 an inactive-scheme reform with a reported award. 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
Government balance, each component counted once
Model totals
Household income totals
Inequality
Mean household net income in each side's own deciles
Standard reform costings (change in gov_balance)
Household net income by decileMean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.
No change in any year: receipts by tax head; population; poverty rates; people in poverty; standard reforms: change in each reform's target. Checks failing on both base and head (1)
Counted-once checkEach of 92 components was raised by £1 per unit in 2026-27, and every head of its totals was read 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 head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.
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
|
|
Ready for hub review Verdict: APPROVE WITH NITS at I reviewed FindingsP1None. P2P2-1. The family-total property's oracle is wrong for a child under 5 whose only award is the lower DLA mobility rate. I ran the module's own test body on explicit inputs ( Replace line 204, disabled = any(
AWARDS[award][1]
# dla_m pays the lower mobility rate only from age 5.
and not (
award == "dla_mobility_lower"
and child["kind"] == "child"
and child["age"] < 5
)
for award in child["awards"]
)On a patched copy, ruff leaves this unchanged, and the test body passes for a child aged 3, 4, 5 and 10 with P2-2. The AFIP-exception property draws no AFIP, so it can't check the AFIP half of invariant 3.
So from hypothesis import HealthCheck, assume, example, given, settingsand, between the # Each AFIP route for a child and a young person, which the six drawn
# examples may not reach.
@example("ENGLAND", 2022, "child", ["afip"])
@example("ENGLAND", 2022, "young_person", ["afip"])
@example("ENGLAND", 2023, "child", ["afip"])
@example("ENGLAND", 2023, "young_person", ["afip"])
@example("WALES", 2023, "child", ["afip"])
@example("WALES", 2023, "young_person", ["afip"])
@example("WALES", 2024, "child", ["afip"])
@example("WALES", 2024, "young_person", ["afip"])
@example("SCOTLAND", 2026, "child", ["afip"])
@example("SCOTLAND", 2026, "young_person", ["afip"])On a patched copy, ruff leaves this unchanged and the test passes at the head. Under the no-AFIP, route-swap and Wales-2023 mutations it fails ( P2-3. The body's "No survey-data run measured this change." is stale. Replace the line with:
P3P3-1. The Welsh and Scottish A2c comments cite England's provisions. # Applicable income 21,714.00 falls short of 25,092.60, so the council
# gives the maximum reduction, the whole council tax
# (gov.local_authorities.wales.council_tax_reduction.maximum_support_rate),
# here 2,000. # Applicable income 21,753.67 falls short of 25,183.60, so the council
# gives the maximum reduction, the whole council tax
# (gov.local_authorities.scotland.council_tax_reduction.maximum_support_rate),
# here 2,000.P3-2. No test covers the Northern Ireland nil that the body and the documentation claim. - name: Nil, a pensioner in Northern Ireland with a child on the highest DLA care rate gets no child disability premium.
period: 2026
absolute_error_margin: 0.01
input:
people:
pensioner:
age: 72
state_pension: 12_570
child:
age: 10
dla_sc_category: HIGHER
benunits:
benunit:
members: [pensioner, child]
would_claim_pc: false
would_claim_uc: false
households:
household:
members: [pensioner, child]
country: NORTHERN_IRELAND
output:
council_tax_reduction_pensioner: true
# The child meets both conditions, as Housing Benefit's reading shows.
housing_benefit_child_disability_premiums: 6_159.40
council_tax_reduction_pensioner_child_disability_premiums: 0P3-3. Four cases give a 10-year-old an AFIP. # The Secretary of State and the Welsh Ministers name AFIP for a child or
# young person (England para 7(1)(c); Wales paras 7(1)(c) and 8(d)); the
# cases with a 10-year-old on AFIP test that wording.P3-4. The property module's docstring names a constant that doesn't exist and understates invariant 3. Lines 23-26 limit Wales's exception to a child under 16, but the test ( Line 154 calls the household head "her" although the generator never sets a sex. Replace "as the claimant couple in her benefit unit." with "as the claimant couple in the head's benefit unit." P3-5. The helper's docstring says both conditions read only DLA and PIP fields. P3-6. Fix history in a durable comment. P3-7. Writing rules: a provision, scheme or benefit acts, or "we" does.
P3-8. The body's revert claim describes a run with the helper copied in. P3-9. Two more body lines.
P3-10. P3-11. Reference titles in England's two amount files list paragraphs out of order. P3-12. The hand-off's resolution of the #2827 conflict drops a fact from #2827's side. # The working-age severe disability premium takes Council Tax
# Reduction's own family test (council_tax_reduction_severe_disability_
# premium) and the working-age carer premium its own caring test
# (council_tax_reduction_carer_premium); both differ from the shared
# premiums only in Scotland. The enhanced disability premium takes the
# scheme's own condition
# (council_tax_reduction_enhanced_disability_premium). + (
benunit("council_tax_reduction_enhanced_disability_premium", period)
- benunit("enhanced_disability_premium", period)
)
+ (
benunit("council_tax_reduction_carer_premium", period)
- benunit("carer_premium", period)
),P3-13. rulespec-uk#533.
Checked and soundLaw. I checked every condition against the law files, nation by nation and year by year. For the disabled child condition, England para 8(a)-(b) (2015, 2022, 2023, 2026), Wales para 8(a)-(b) (2015, 2023, 2024, 2026) and Scotland para 9(a)-(b) (2015, 2026) each rest on receipt of DLA or PIP, either component, or blindness. The helper tests AFIP routes, cell by cell. Each cell matches the law files:
The start dates follow SI 2023/16 reg 1(3) and WSI 2024/56 reg 1(3) as quoted. I printed all twelve booleans for each year from 2015 to 2030 through Who counts. For any pensioner family, Amounts. I compared all six files with rulespec-uk#533's table: 82 cells, with Wales starting in 2014 and 2016 read through the 2015 entry, and no differences. They also match the law files for England 2015, 2022, 2023 and 2026 and Scotland 2015 and 2026. The files start on 2013-04-01 (England and Scotland) and 2014-04-01 (Wales). Every dated reference opens Pre-2015 years. The England and Wales AFIP files start in 2015. A 2013 or 2014 run of Code. Housing Benefit unchanged. Housing Benefit keeps its own AFIP route, any child or young person in both premiums: The issue's cases. On the base merge The 30 YAML cases by hand.
All 30 match. The inputs describe families the model allows; the head-alone household follows the example in Invariants against the properties.
Invariant 6 has no test, but my differential covers it. Mutations. I applied each to a scratch copy of the head, ran the new YAML and the property file (
rulespec-uk#533. Every quote of a provision that the law files contain matches them word for word, except the England amount formatting in P3-13. That covers England paras 7 and 8 (2015, 2023), Wales paras 7 and 8 (2015, 2024), Scotland paras 8 and 9 (2015) and the Scottish amounts (2026). The AFIP table matches the law files. I worked C1 to C12 by hand and ran them through the model at the head: C1 118.45, C2 84.46, C3 84.46, C4 0, C5 104.86, C6 30.17, C7 30.17, C8 112.21, C9 0, C10 118.45, C11 84.49, C12 33.99 + 2 × 84.46 = 202.91 a week. All twelve match. Changelog, title and descriptions. Fix evidence. I ran Tests at the head (
CI at the head. All 21 check runs completed with Merges (
Hand-off claims. No earlier review round exists, so there are no earlier findings to close. I reproduced the base tree What I couldn't check
Generated by Claude Code |
|
Picking this up for the UK hub. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM
… tests The family-total oracle now gives a child under 5 nothing for the lower DLA mobility rate alone, as dla_m does, and explicit examples check that boundary and each AFIP route on every run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM
…n the YAML cases Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM
|
Generated by Claude Code |
|
Ready for hub review Head: Commits after the merge:
Before starting I checked the branch: its last push was 13:58Z, more than 6 hours before 21:10Z, and no comment said anyone was mid-change. I posted the pickup comment (6615519254) before pushing. FindingsAll file:line references are at
Tests at the head (clean runs,
|
| Run | Result |
|---|---|
| new YAML file | 31 passed |
| CTR YAML directory | 416 passed |
housing_benefit_pre_cutoff_period.yaml |
4 passed |
new property file, -n 4 |
6 passed (266.77 s) |
the five property files the body names, -n 4 |
96 passed |
policyengine_uk/tests/code_health -n 4 |
3,140 passed (the review had 3,135, at 9ef585def without the main merge) |
.github/check_fix_pr.py |
Fix evidence: PASS, 16 changed executable tests, exit 0 |
ruff format --check ., ruff check ., --select F811,F821, git diff --check 9ef585def..HEAD |
all clean |
I ran check_fix_pr.py on the live title, the new body and no labels. Its --changes-file came from git diff --name-status --no-renames -z between merge-base 9b456bda6 (the current main) and the head.
Mutations
I ran each on a scratch worktree of the head, with shrinking off: a local profile with the explicit, reuse and generate phases. The control run gives 31 YAML passes and 6 property passes.
| Mutation | New YAML (31) | Properties (6) |
|---|---|---|
nil |
20 fail | 3 fail: family total, AFIP exception, differential |
no_afip |
5 fail | 2 fail: family total, AFIP exception |
swap_routes |
4 fail | 2 fail: family total, AFIP exception |
ni_gets_england |
1 fails: the NI case | 0 |
no_head_alone_gate |
1 fails | 1 fails: nil property |
enhanced_any_care_rate |
3 fail; HB YAML 4 of 62 fail | 1 fails: family total |
wales_dcp_afip_from_2023 |
1 fails | 1 fails: AFIP exception (survived the properties before P2-2) |
not_in_premiums |
15 fail | 0 |
young_person_any_16_plus |
0 | 0: survives, an equivalent mutant |
helper_drops_dla |
13 fail (the review's 12 plus the NI case, whose HB output reads the helper) | 3 fail: family total, helper implication, AFIP exception |
Merges (git merge-tree --write-tree --name-only of the head)
No head moved during the run, except #2827's, which had already moved to 31139e822 when I started.
| With | Result |
|---|---|
origin/main 9b456bda6 |
clean (already merged) |
#2827 31139e822 |
conflict in council_tax_reduction_premiums.py (P3-12) |
#2845 f379377f9 |
clean. On the scratch merge: new YAML 31 passed, properties 6 passed |
#2016 983488065 |
clean. On the scratch merge: new YAML 31 passed, properties 6 passed |
#1966 a013f520a |
conflict only in severe_disability_premium_young_person.yaml |
Skipped, and judgement calls
- I ran no survey-data test, having no dataset access. P2-3 rests on the two CI reports.
- I didn't rerun the 300-unit Housing Benefit differential that the body cites, and that sentence is unchanged.
- I added "Merge notes" and "Survey data" sections to the body. I also extended the commit list with the four new commits, and described the new explicit examples in the Tests section.
- In the "Survey data" text I kept the review's "this PR's five commits". It refers to the five model commits, and the commits since add only tests and text.
- The head-alone case name in
Ystill says "her", and so does thecouncil_tax_reduction_premiumsdocumentation inherited from the base. Neither is in the review, so I left them.
Generated by Claude Code
juaristi22
left a comment
There was a problem hiding this comment.
Reviewed captured head 9ef585defd64daa7fb592b26af631c058c1be497, scoped to the five introduced commits after declared stack merge 5acffdbd82cb839c7d6246abd6b871d68ceb871f and their affected dependencies. COMPLETE — no critical findings or material evidence gaps; A1 and S1 remain open.
A1 — Correct the family-total test oracle below the DLA mobility minimum age. In test_council_tax_reduction_pensioner_child_disability_premium_properties.py, the lower-DLA-mobility entry in AWARDS is treated as qualifying across the drawn ages 0–15. child_premiums predicts a disabled-child premium for a three- or four-year-old with that category alone, while the actual DLA mobility reader requires age 5 and pays zero. The 2026 oracle therefore predicts £4,391.92 where the receipt-based premium should be zero. Correct the age/payability oracle or its generated domain. The 191 passing seeded checks did not cover this combination; they do not refute the static counterexample. This is a test-reference defect, not a demonstrated new wrong-cash result.
S1 — Use the appropriate national sources in the test comments. The Welsh and Scottish A2c comments cite the English provisions. Cite the corresponding Welsh and Scottish rules. The amounts and core statutory conditions were independently corroborated.
Late author feedback and the proposed 16a74f… candidate were assessed for relevance to this captured head. That candidate and proposed description remain unadopted and were not reviewed as the PR head. Other named coverage/editorial/prospective-merge items are qualified in the report rather than promoted to additional defects.
All 191 focused checks and three native final-accounting cases passed; all 82 independent official rate/parameter comparisons matched. The final cases trace the new premiums through CTR, council-tax benefit, household/HBAI income and spending once, with HB, tax and DLA unchanged. Existing parent/local working-age gaps remain outside this new national pensioner scope; no isolated survey score or prospective combined merge is certified.
Current-head CI is green. Approval is withheld for the findings, draft status and the stated #2826/#2808 parent-first hold. The workflow time targets were exceeded; original elapsed time is preserved and current head, body, feedback, source evidence, parent status and CI are guarded again before publication.
The Welsh and Scottish A2c cases now cite the provisions that give a pensioner whose income does not exceed the applicable amount the whole council tax: WSI 2013/3029 reg 22(e) and Sch 1 paras 2(1) and 4(2), and SSI 2012/319 regs 14(5)(a)(ii) and (8)(a) and 47(1). A case name drops a pronoun. Comments and one case name only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, juaristi22. We moved the branch to
The head also takes up the nits in the review comment of 3 November:
The body's new "Merge notes" section gives the resolution for #2827. Its "Survey data" section shows that the Aggregate impact report's CTR rows match #2826's own. We also corrected the record, TheAxiomFoundation/rulespec-uk#533: it restores the England amounts' sub-paragraph numbers and quotes the Welsh and Scottish amending regulations. This PR still lands after #2826 and #2808. |
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed current head 6e96ffef8246550731553561623e97d8a3bdd258. PARTIAL — A1 and S1’s original wrong-nation citation defect resolved; one description finding and one narrow source check remain. No confirmed payment defect.
The family-total oracle now respects the lower DLA mobility minimum age, with the explicit ages3/4/5 example. 51 focused tests and three-country final CTR/net-income checks passed on the matched current runtime. The additional AFIP examples and Northern Ireland nil case are adopted.
A2 — Qualify the own-commit survey-data inference. The published CTR rows match, but this PR’s report compares 1d4d020aa1→1461ec9bdb, while #2826’s report compares 46a60678ff→2d90bcc1c8. Matching rounded/suppressed rows from different stacked comparisons do not isolate this component’s causal effect. State the observed equality and comparison identities; qualify the sentence that this PR’s own commits move no printed figure unless an isolated comparison exists. This does not allege that the effect is nonzero.
G1 — Scottish citation verification remains incomplete. The new national references replace the English ones. The Welsh provisions, Scottish regulation47(1), both maximum-support parameters and the unchanged actual #533 contract were checked. I could not independently retrieve Scottish regulation14, specifically (5)(a)(ii) and (8)(a), after bounded current/dated source attempts and a retained-cache check. Their accuracy remains unverified; this is not a finding that they are wrong. An accessible official extract would close that narrow check.
The draft status, pending CI and stated #2826/#2808 merge-first requirements remain. Earlier191 passing tests are retained with their original runtime qualifications; no private population run or prospective merge is certified.
Resolve the three conflicts to main's side where both add tariff income: council_tax_reduction_applicable_income adds main's council_tax_reduction_tariff_income, the £16,000 pension credit case reads its outputs, and invariant 4 states main's tariff recomputation. The property file's recomputation adds tariff income once, through main's expected_tariff_income. The docstring keeps main's text with this branch's active wording of the war pensions sentence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HDAHLr6RSvBAdeFM1
Delete council_tax_reduction_pensioner_tariff_income, which the merge left unused, and point the pensioner tariff YAML and property tests at council_tax_reduction_tariff_income. That variable also carries the Welsh and Scottish working-age tariffs, so tariff Case 14 (a Welsh earner aged 40 with 12,000 of capital) now expects 1,248 (24 * 52 under WSI 2013/3029 Sch 6 para 33), the property test checks nil tariff income at working age only in England, and the frozen differential now holds main's values at 9dd44e1, which add those working-age tariffs in Wales and Scotland. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HDAHLr6RSvBAdeFM1
SSI 2012/319 reg 27(2) treats capital as yielding £1 a week for each £500, or part, over £10,000 with no ceiling; reg 40 separately bars a reduction above £16,000. council_tax_reduction_tariff_income now leaves the Scottish pensioner branch uncapped and keeps the £16,000 ceiling in England and Wales. No award moves: a Scottish pensioner with £16,500 or £20,000 of capital still gets no reduction. A new income_from_capital.yaml case checks a Scottish pensioner's 1,040 and an English one's 624 at £20,000, and the pension credit property test's tariff recomputation follows reg 27(2). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HDAHLr6RSvBAdeFM1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6HDAHLr6RSvBAdeFM1
The tariff property test now asserts invariant 4 of #2826's description: councils give no award where capital exceeds £16,000 (SI 2012/2885 reg 11(2); WSI 2013/3029 reg 30; SSI 2012/319 reg 40), so Scotland's uncapped pensioner tariff changes no award. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the re-review. The survey-data paragraph now names each comparison (A2). This PR's report, from the run at We fetched SSI 2012/319 reg 14 from legislation.gov.uk for G1: its current text and its text as in force on 30 April 2026 match (current, 30 April 2026). Paragraphs (5)(a)(ii) and (8)(a) read:
In Case A2c, the pensioner's income of £21,753.67 doesn't exceed the applicable amount of £25,183.60. So (5)(a)(ii) applies, and under (8)(a) the council awards the appropriate maximum council tax reduction, the whole £2,000. Could you take another look? |
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed unchanged head 6e96ffef8246550731553561623e97d8a3bdd258 and the new reply. COMPLETE — all findings resolved and no material evidence gaps.
A2 resolved. The description now names each Aggregate comparison and correctly says their matching printed figures do not isolate this PR’s own commits. The current child report compares 9b456bda65→9b7d5da44e; the parent report compares 46a60678ff→2d90bcc1c8.
G1 resolved. I independently retrieved and checked the official current Scottish regulation 14 XML and its 30 April 2026 text. Their operative text matches: paragraphs (5)(a)(ii) and (8)(a) support the maximum reduction where the income condition and other entitlement conditions apply. Together with the previously verified regulation 47(1), this closes the narrow citation check for Case A2c’s £2,000 result. A1 and S1 remain resolved.
The prior 51 passing focused tests and three final CTR/net-income checks are retained at this identical head; no tests, calculations or private population analysis were repeated.
Approval remains withheld because this is a draft and the stated #2826/#2808 merge-first requirements remain. The child still contains #2826 at 06e51a8a, so this review does not certify integration of its subsequent 87cbc397 changes. Parent approval does not establish that integration.
The merge has no conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed adopted head 254fac3c2e68ef9da952f8c59a13fc5b35cb8be7 after the #2826 and main merges. PARTIAL — prior findings remain resolved, and no new defect is confirmed; final validation is incomplete.
62 focused checks passed, including all 31 child-premium YAML cases, all 17 parent tariff YAML cases and the nine Pension Credit properties. The serial campaign reached its 420-second limit with no failed or skipped test outcomes.
Three checks remain: the unchanged-household comparison for 2024 (unfinished), its 2026 counterpart (not run), and the prepared three-country check through final CTR and household net income (not run). These are explicit evidence gaps; the earlier head’s results are not presented as current-head validation. The next round will run only these remaining checks.
The source review remains complete, including the earlier Scottish citation check. This head now contains #2826 at 87cbc397; both stated parent merge-first requirements remain open, and the PR remains a draft. Approval is withheld.
juaristi22
left a comment
There was a problem hiding this comment.
Completed the remaining validation at unchanged head 254fac3c2e68ef9da952f8c59a13fc5b35cb8be7. COMPLETE — prior findings remain resolved; no findings or material evidence gaps.
The two unfinished year comparisons and the three-country final CTR/household-income diagnostic all passed. With the 62 earlier passing outcomes retained, all 65 selected checks are now accounted for across the two runs; this round ran only the three remaining checks. The final diagnostic confirms that the £624 tariff lowers CTR and household income by £124.80 once, alongside the child-premium effects.
The source review remains complete. Approval is withheld while the PR is a draft and the stated parent/CI requirements remain unmet; those live conditions will be checked again before any approval.
Fixes #2824
Reproducer:
policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml::Case A2 England, a child on the highest DLA care rate adds both premiums.;policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml::AFIP England 2023, a child under 16 on AFIP alone meets the enhanced condition only.axiom: TheAxiomFoundation/rulespec-uk#533 queued
This PR lands after #2826 and #2808. Its first commit,
5acffdbd8, merges #2808's head (6563f73e5) into #2826's head (06e51a8ab) with no conflict (treeef486deac). Review the commits after it:e2699b77moves the conditions that Housing Benefit and CTR share into one helper;67004f48adds each nation's amounts and AFIP routes as parameters;e4767ab5addscouncil_tax_reduction_pensioner_child_disability_premiumsand adds it to a pensioner'scouncil_tax_reduction_premiums;7d8b70ddadds the YAML cases;9ef585deadds the property tests and the changelog fragment;a2434433mergesmainat9b456bda6(tree8f3bdeef6);f00ad5begives the family-total oracle the lower DLA mobility age and adds explicit examples for that boundary and for each AFIP route;2df03f2badds the Northern Ireland nil case and cites each nation's own provisions in the YAML comments;16a74f81names the actor in the comments, docstrings and parameter notes;6e96ffefcites the Welsh and Scottish provisions in the A2c comments and drops a pronoun from a case name;5a6c8d9emerges Add pensioner CTR child amounts and uncap Scotland's tariff income #2826's head at87cbc397e(tree4c486e260), with no conflict;254fac3cmergesmainat5c7744144(tree50316afa1), with no conflict.What the model does now
Councils add the disabled child premium and the enhanced disability premium to a pensioner's applicable amount for each qualifying child or young person in the family: England under SI 2012/2885 Sch 1 para 6(1)(d) and Sch 2 paras 7, 8 and Part 4; Wales under WSI 2013/3029 Sch 1 para 1(1)(d) and Sch 2 paras 7, 8 and 12; Scotland under SSI 2012/319 reg 20(d) and Sch 1 paras 8, 9 and 13. Before this PR the model added neither for pensioners.
council_tax_reduction_pensioner_child_disability_premiums(BenUnit, YEAR, GBP) sums over the family's children and young persons (is_child_or_young_person_for_council_tax_reduction). Each who meets the disabled child condition adds 52 times the nation's disabled child premium, and each who meets the enhanced condition adds 52 times its enhanced disability premium. It returns nil for a working-age family, for a household head who applies alone, and outside England, Wales and Scotland, ascouncil_tax_reduction_pensioner_child_amountsdoes.child_disability_premium_benefit_conditions(policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py), returns the conditions the two schemes share. The disabled child condition rests on a positive DLA or PIP amount (either component) oris_blind, and the enhanced condition onhas_highest_dla_sc_awardorhas_enhanced_pip_dl_award.housing_benefit_child_disability_premiumsand the new variable each add their own armed forces independence payment (AFIP) route.council_tax_reduction_premiumsnow adds the new variable topension_age_benefits_premiums, and so holds every premium that Sch 1 para 6(1)(d) includes.is_qualifying_young_person_for_child_benefit, the Child Benefit qualifying young person. The Secretary of State, the Welsh Ministers and the Scottish Ministers define a young person by SSCBA s.142 (SI 2012/2885 reg 2; WSI 2013/3029 reg 2; SSI 2012/319 reg 4), andis_child_or_young_person_for_council_tax_reductionapplies that definition to every pensioner's family. Anyone counted who does not meet it is a child under 16.Amounts and their sources
The Secretary of State, the Welsh Ministers and the Scottish Ministers set both amounts in the table of premium amounts in each schedule (England Sch 2 Part 4 entries (2) and (3); Wales Sch 2 para 12 entries (2) and (3); Scotland Sch 1 para 13 entries (2) and (3)). Each parameter cites the version in force on 30 April of the year, at
https://www.legislation.gov.uk/<instrument>/schedule/<n>/<year>-04-30. They set the same amounts in all three nations, in pounds a week:From 2015-16,
gov.dwp.housing_benefit.premiums.disabled_childand.enhanced_disabled_childhold the same amounts, but the CTR formula reads its own parameters, so a Housing Benefit reform leaves CTR alone. The files sit undergov.local_authorities.<nation>.council_tax_reduction.pensioners.applicable_amount, asdisabled_child_premium.yamlandenhanced_disability_premium.yaml, and uprate withgov.benefit_uprating_cpiafter 2026-27, aschild_or_young_person.yamldoes.AFIP routes
Boolean parameters under
applicable_amount.armed_forces_independence_payment.<premium>.{child,young_person}hold these routes, so the formula holds no dates:housing_benefit_child_disability_premiumskeeps its own route: AFIP for any child or young person in both premiums.Who reads
council_tax_reduction_premiumscouncil_tax_reduction_applicable_amount: rises for a pensioner family with a qualifying child or young person; otherwise unchanged. Through it, the excess ofcouncil_tax_reduction_applicable_incomeover the applicable amount can fall, andcouncil_tax_reductionandcouncil_tax_benefitcan rise, for such a family.enhanced_disability_premium.yaml,applicant_or_partner.yaml(CTR directory) andhousing_benefit_pre_cutoff_period.yaml: unchanged; none has a pensioner family with a qualifying child.test_housing_benefit_pension_age_cohorts.pysets the variable as an input; unchanged.test_council_tax_reduction_applicant_properties.pyreads it among its outputs; unchanged; its test passes.The comments at
benefits_premiums.pyandcouncil_tax_reduction_applicable_amount.py, and the documentation ofcouncil_tax_reduction_premiumsandcouncil_tax_reduction_applicable_amount, now say that a pensioner's CTR premiums include the two child premiums. No page underdocs/describes the pension-age CTR premiums, so no page changes.Out of scope
is_blind.Invariants
housing_benefit_child_disability_premiums.Tests
We ran the tests below at
6e96ffef8, before commits 11 and 12.council_tax_reduction_pensioner_child_disability_premiums.yaml(new, 31 cases): the issue's cases A0 to A4 in each nation in 2026, oncouncil_tax_reduction_applicable_amountand the new variable; A2c in each nation oncouncil_tax_reduction; AFIP alone in England (a young person in 2022 and 2023, a child in 2023), Wales (a child in 2023 and 2024) and Scotland (a child and a young person in 2026); a working-age family and a head who applies alone, each with a qualifying child; a pensioner in Northern Ireland with a child on the highest DLA care rate; and 2015 in each nation. Each comment shows the sum from the amounts table.test_council_tax_reduction_pensioner_child_disability_premium_properties.py(new, 6 Hypothesis properties, invariants 1 to 5) builds many families in one simulation per example. Explicit examples check, on every run, children aged 3, 4 and 5 on the lower DLA mobility rate alone, sincedla_mpays that rate only from age 5. They also check each AFIP route for a child and a young person in England (2022, 2023), Wales (2023, 2024) and Scotland (2026).housing_benefit_child_disability_premiums.yamlpasses (62 cases). On 300 drawn benefit units in each year from 2015 to 2030 (4,800 values, 2,224 of them positive, across all four nations, with AFIP, DLA, PIP and blindness),housing_benefit_child_disability_premiumsgives identical results before and after.housing_benefit_pre_cutoff_period.yaml(4 cases) pass.test_council_tax_reduction_pensioner_children_tariff_properties.py,test_council_tax_reduction_child_benefit_properties.py,test_enhanced_disability_premium_properties.py,test_council_tax_reduction_applicant_properties.pyandtest_housing_benefit_pension_age_cohorts.pypass (96 tests), andpolicyengine_uk/tests/code_healthpasses (3,140 tests).Merge notes
This head merges
mainat5c7744144(commit 12).We merged this head with Apply SI 2014/1230 reg 28 to the UC qualifying young person test #2845 (
f379377f9) and with Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016 (983488065), each in a copy of the branch, since both change the child flags that the variable and the differential test read. Both merge without conflict, and on each merge the new YAML file and properties pass.Give Scotland and Wales working-age CTR their own rules #1966 (
a013f520a) conflicts only insevere_disability_premium_young_person.yaml, which this PR doesn't touch; Count enhanced PIP daily living and AFIP for the enhanced premium #2808's head alone conflicts there with Give Scotland and Wales working-age CTR their own rules #1966.Count UC carer awards for severe disability and Scottish CTR premiums #2827 (
31139e822) changes the same two hunks ofcouncil_tax_reduction_premiums.py. This resolution keeps both sides. The comment reads:and the working-age branch ends:
We merged Count UC carer awards for severe disability and Scottish CTR premiums #2827 into a copy of this head with that resolution. On that merge the new YAML passes (31 cases) and so does the CTR YAML directory (428 cases, 12 more than this head's 416).
Survey data
The Aggregate impact job compares
mainwith this PR merged into it, so it includes #2826 and #2808. This PR's report, from the run at6e96ffef8, comparesmainat9b456bda65with this PR merged into it (9b7d5da44e). #2826's report comparesmainat46a60678ffwith #2826 at06e51a8amerged into it (2d90bcc1c8). Apart from the run details, the two reports print the same figures, including the Council Tax Reduction rows (spending from −£0.1m in 2025-26 to −£0.2m in 2031-32, caseload from +254 to −104). They compare different pairs of commits, so the match doesn't isolate what this PR's own commits change on the certified data.🤖 Generated with Claude Code