Repository navigation
Conversation
Merges 6563f73 into 06e51a8. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a
…ld premiums Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a
|
Generated by Claude Code |
|
Ready for hub review Head: Base
Commits after the merge
Judgement calls
Who reads
|
| Run | Result |
|---|---|
| New YAML | 30 passed |
| New properties | 6 passed (198 s) |
housing_benefit_child_disability_premiums.yaml |
62 passed |
CTR YAML directory plus housing_benefit_pre_cutoff_period.yaml |
419 passed |
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.py, test_housing_benefit_pension_age_cohorts.py |
96 passed |
code_health |
3,135 passed |
ruff format check, ruff check, ruff F811,F821, git diff --check |
clean |
| Housing Benefit before and after | 300 drawn benefit units in each year from 2015 to 2030 (4,800 values, 2,224 positive, all four nations, with AFIP, DLA by category and amount, PIP and blindness): identical |
Revert and mutation checks
- Revert. On the base merge without my commits, all 30 YAML cases fail, because the variable doesn't exist there. The property module fails to import there, since the helper doesn't exist. With only the helper file copied in, 5 of 6 properties fail;
test_shared_enhanced_condition_implies_disabled_child_conditionpasses, since it reads only the helper. - Mutations on a scratch copy of the head:
- The formula returns nil: 20 of 30 YAML cases fail.
- The AFIP routes are removed: 5 fail.
- The child and young person routes are swapped: 4 fail.
Merges
| Merge with | Result |
|---|---|
origin/main (1d4d020aa) |
clean |
#2845 (f379377f9) |
clean; on the scratch merge the YAML passes (30) and the properties pass (6) |
#2016 (983488065) |
clean; on the scratch merge the YAML passes (30) and the properties pass (6) |
#2827 (f9fdc636a) |
the conflict above, which this PR doesn't widen |
Skipped
- No survey-data run: I have no dataset access, so the PR body gives no aggregate figure.
- I didn't run the full suite; CI covers it.
- I didn't touch
shard_durations.toml: I added tests and renamed or removed none. - The differential test takes about 150 s on 4 workers in my run. Lower
max_examplesfrom 3 if CI time matters.
Out of scope (also in the body)
- The section 145A run-on and the hospital limbs.
- Fields for child disability payment, adult disability payment and Scottish Adult Disability Living Allowance.
- The gap between the schemes' registration test for blindness and
is_blind. - Working-age CTR child premiums (Scotland and Wales working-age council tax reduction ignores the Universal Credit rules, child amounts and the benefit passport #1962, Give Scotland and Wales working-age CTR their own rules #1966).
The Axiom packet is the comment above, AXIOM_ISSUE.md.
Generated by Claude Code
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
|
|
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.
|
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.
Merges main at 117e674. The merge has no conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main now gives a working-age benefit unit Council Tax Reduction's own carer premium (council_tax_reduction_carer_premium) in place of the shared one, as it does for the severe disability and enhanced disability premiums. The documentation's list of those substitutes now names all three. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE at 4788937fe09a96e4d86c6c1f271b10778b4fa55c, incrementally from 254fac3c2e68ef9da952f8c59a13fc5b35cb8be7. No new findings or material evidence gaps; A1, A2 and S1 remain resolved.
All 50 focused tests passed (44 YAML and 6 Python), including final £2,000 CTR awards in England, Wales and Scotland, the corrected DLA mobility age boundaries, family totals, AFIP/nil routing and 12-year Housing Benefit child-premium parity. The merged working-age carer-premium route also passed its direct regressions. The current locked Core 3.34.9 environment was verified.
The pensioner child-premium formula, parameters and authored tests are unchanged. The affected premium aggregator retains the child addition once and incorporates the working-age substitutions from main; the follow-up documentation matches that routing. The earlier aggregate results retain their original head and attribution qualifications. Sixty cached source originals and 59 extracts were validated.
Both declared parents, #2826 and #2808, have merged, so their former delivery hold is satisfied. This is a follow-up comment while the PR remains Draft. Approval awaits Ready status and passing required checks at the exact current head.
test_ordinary_parameters_read_every_key_as_before drew its ordinary parameters from every gov leaf outside yoy_growth, so it also drew the energy price indices, which read calendar years. A pull request that moves the derandomized sample onto one of them fails the check. The ordinary list and the calendar-year check now share one prefix tuple, and a new test asserts that no ordinary parameter reads calendar years. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE at 3b1a89f79058fddf667fe845bef454de42dac972, incrementally from 4788937fe09a96e4d86c6c1f271b10778b4fa55c. No new findings or material evidence gaps; A1, A2 and S1 remain resolved.
The delta corrects only the parameter test’s sample domain. The three targeted classifier/sampler tests passed, including the property configured for 200 examples. This branch now draws ordinary parameters from 2,275 non-calendar leaves; growth and energy calendar-year leaves are excluded, and the new invariant checks the domain against production metadata.
The prior 50 model tests remain applicable after validation that production code, parameters and locked dependencies are unchanged. They were retained rather than rerun or added to the three current passes. Sixty source originals and 59 extracts remain valid; no policy or source provision changed.
This is a follow-up comment while the PR remains Draft and hosted CI is pending. Approval still awaits Ready status and passing required checks at the exact current head.
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE
Reviewed head: 3b1a89f79058fddf667fe845bef454de42dac972
A2 — aggregate comparison attribution (reopened, nonblocking). The updated Survey data paragraph attributes comment 6608138001 to head 4788937fe, base 117e67475a and synthetic merge 74e19e0812. The linked comment’s current body instead reports base 3cf10f8c73, synthetic merge 692d1e520f and run 42912722998. Please update the identifiers to the current report, or link an immutable archived report supporting the historical identifiers.
This is the same A2 attribution issue, not a new policy or cash defect. The supplied report supports the no-change result with its documented DSA suppression/aligned-total qualifications; the VAT sign failure is unchanged on both sides, so equal receipts do not validate absolute VAT levels. Private raw records are not recertified.
A1 and S1 remain resolved. The code head is unchanged, and the completed code/statutory-source/test evidence remains applicable: 61 source originals and 60 extracts validated, with no new network acquisition, tests or model calculations. The PR is now Ready and its 21 latest exact-head CI contexts pass. Approval is withheld while A2 remains open.
|
Thanks, @juaristi22. A2: I updated the Survey data paragraph to the current report's identifiers. It now cites run 42912722998, which ran at this head |
juaristi22
left a comment
There was a problem hiding this comment.
Approve at 3b1a89f79058fddf667fe845bef454de42dac972. Review status: COMPLETE.
A2 is resolved: the updated Survey data paragraph and author reply name the current run42912722998, base 3cf10f8c73 and synthetic merge 692d1e520f. They retain the DSA suppression and unchanged VAT-sign qualifications; equal receipts do not establish correct absolute VAT levels. A1 and S1 remain resolved. There are no remaining findings or material evidence gaps.
The code head is unchanged. Completed code/statutory/test evidence remains applicable;61 cached originals and60 extracts were validated, with no new network acquisition, tests or model runs. The prior3focusedpasses and50qualifiedmodelpasses are retained, not rerun. This PR is Ready; immediately before approval I refresh exact-head required CI, human activity, source/parent guards and duplicate-review checks.
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
#2826 and #2808 have merged. This PR's 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;c9dd4e11mergesmainat117e67475(tree09fbfb2cb), with no conflict;4788937fnames CTR's own carer premium among the working-age substitutes in the documentation ofcouncil_tax_reduction_premiums;3b1a89f7samplestest_ordinary_parameters_read_every_key_as_before's ordinary parameters from outside every calendar-year series, the same commit as Sample ordinary parameters from outside every calendar-year series #2906. Main's version of that test drew the energy price indices, which read calendar years, and failed here at4788937fe.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
CI passed all 21 checks at
3b1a89f79, the head, including the eight Python shards, the YAML tests and the aggregate impact run.We ran the tests below at
6e96ffef8, before commits 11 to 15.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
mainat117e67475(commit 13). Main now holds Count UC carer awards for severe disability and Scottish CTR premiums #2827 and Give Scotland and Wales working-age CTR their own rules #1966.council_tax_reduction_premiums.pyas this PR. The merged file keeps both sides: a pensioner's premiums addcouncil_tax_reduction_pensioner_child_disability_premiums, and the working-age branch substitutes CTR's own enhanced disability and carer premiums.590a2cc39) and Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016 (2f42ce1af, the head it will take) change the child flags that the new variable and the differential test read. Each merges with this head without conflict.Survey data
#2826 and #2808 now sit in
main, so the Aggregate impact job measures this PR's own commits. Run 42912722998, at this head3b1a89f79, comparesmainat3cf10f8c73with this PR merged into it (692d1e520f) on the certified enhanced FRS 2024-25 (policyengine-uk-data 1.58.1). The job's comment shows the latest run's report, so later runs replace it. The run finds no change in any year from 2025-26 to 2031-32: no household's net income changes, and no published figure for spending, caseloads, receipts, poverty or inequality moves. On both sides the report suppresses Disabled Students' Allowance, which rests on fewer than 10 records. One check fails on both sides by the same amounts: VAT excluding private school fees goes negative for 76 units. Equal receipts on the two sides therefore say nothing about the level of VAT.🤖 Generated with Claude Code