Skip to content

Exclude Child Benefit from pensioner Council Tax Reduction income - #2470

Merged
juaristi22 merged 1 commit into
mainfrom
fix-2111-pensioner-ctr-child-benefit
Oct 20, 2026
Merged

juaristi22 merged 1 commit into
mainfrom
fix-2111-pensioner-ctr-child-benefit

Conversation

@juaristi22

Copy link
Copy Markdown
Collaborator

Refs #2111.

Pensioner Council Tax Reduction currently includes Child Benefit in general-rule income. This subtracts the existing benefit-unit Child Benefit component before the income floor for GB pensioner claims, using the existing claim selector. SSP and SMP remain counted as earnings, as clarified in the issue. Guarantee Credit, savings-credit-only assessment, working-age schemes and Northern Ireland retain their existing treatment.

The exclusion follows England SI 2012/2885, Schedule 1 paragraph 16, Scotland SSI 2012/319, regulation 27, and Wales WSI 2013/3029, Schedule 1 paragraph 10.

For the tested England pensioner family with £16,000 pension income and £1,406.60 Child Benefit, assessed income falls by £1,406.60 and annual CTR increases from £2,318.28 to £2,599.60 under the existing 20% taper. This is a household example, not a population estimate.

Validation:

  • 134 targeted cases passed: eight new YAML cases, three new properties, 115 existing YAML cases and all eight affected Pension Credit properties. Coverage includes final CTR/household outputs, family/query order, working-age councils, the income floor, Pension Credit routes, and SSP/SMP.
  • New GB cases failed on the unchanged formula. An initial invalid marriage-allowance fixture oracle was corrected separately; the corrected SSP/SMP control also failed on the unchanged formula. The interrupted initial property run is not counted as completed evidence.
  • The existing Pension Credit property's independent income oracle now excludes Child Benefit for its pensioner families. Its generators, settings and test assertions are unchanged.
  • make format, Ruff formatting/lint checks, duplicate/undefined-name checks and git diff --check passed. The changelog fragment is included.

Reproducer: policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_benefit.yaml::England pensioner Child Benefit is excluded before the CTR taper

axiom: needed

Local tests used Python 3.13.14, core 3.32.27 and Hypothesis 6.168.2; the lockfile specifies core 3.33.2 and Hypothesis 6.169.0. Hosted CI must verify the locked environment.

Keep #2111 open: representative Enhanced FRS impact and the RuleSpec/Axiom follow-up remain unrun. Draft #1966 owns working-age income changes; drafts #1995, #2368 and #2387 change adjacent income logic and need integration checks as they land. This PR does not change their branches or claim encoded parity.

@juaristi22 juaristi22 self-assigned this Oct 17, 2026

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks right, fine to approve.

@juaristi22 the law is right and the change is tightly scoped. Child Benefit is in the "other than" list of social security benefits in all three GB pensioner schemes: SI 2012/2885 Sch 1 para 16(1)(j)(vi), WSI 2013/3029 Sch 1 para 10(1)(j)(vi) and SSI 2012/319 reg 27(1)(j)(vii). I read each on legislation.gov.uk. Leaving SSP and SMP in as earnings matches the issue thread. Guarantee Credit, savings-credit-only, working-age and Northern Ireland paths are untouched.

Findings

  1. should (follow-up, not this PR): council_tax_reduction_applicable_amount.py gives pensioners no child or young person amount. SI 2012/2885 Sch 2 para 2 adds one per child (£87.88 a week in the current text). I did not check the Welsh and Scottish tables. So the PR's headline example (£2,318.28 to £2,599.60) is wrong for a real family with a child, because the full applicable amount would wipe out the taper. That is an existing gap, not this PR's. But it affects every case this PR changes, so the #2111 impact run should note it, or it should be its own issue.
  2. nit: council_tax_reduction_pensioner_child_benefit.yaml, SSP/SMP case: region: LONDON with local_authority: MAIDSTONE. The other cases use country: ENGLAND. That is harmless, but the inputs contradict each other.
  3. nit: the same file has comment typos where spaces went missing: "Model2026", "aged allowance256*52" in the header, and "removes the otherwise86tax" in the SSP/SMP case.
  4. nit: the zero-floor case passes on the unchanged formula too, because 1,406.60 minus 2,000 is already floored at zero. That is fine as a control, but its name suggests it tests the exclusion.

Overlaps: ten other open PRs touch council_tax_reduction_applicable_income.py or the Pension Credit property file (#1831, #1995, #2002, #2066, #2078, #2299, #2301, #2302, #2368, #2387). Whichever lands second will need a rebase. None of Vahid's open PRs (#1820, #1855, #1864, #2184, #2187, #2189, #2193, #2382, #2386, #2433) touch these files. #2184 changes the CTR non-dependant deduction, which is a separate variable.

What I checked

  • Read the PR body, the full diff and #2111 with its comments.
  • Read England Sch 1 para 16, Wales Sch 1 para 10, Scotland reg 27 and England Sch 2 on legislation.gov.uk.
  • Hand-checked the England case: tax (16,000 - 12,570) x 20% = 686, so income is 15,314. CTR is 3,000 - 0.2 x (15,314 - 13,312) = 2,599.60. Both match.
  • Ran policyengine-core test on the new YAML (8 passed) and on the whole council_tax_reduction test folder (190 passed).
  • Ran pytest on both property files (11 passed).
  • Restored main's formula: 4 of the 8 new cases fail (England, Scotland, Wales, and SSP/SMP). The controls pass as they should.
  • ruff check and ruff format --check are clean on the changed Python files.
  • .github/check_fix_pr.py passes. The Reproducer: and axiom: lines are present, and fixed is the right fragment type.
  • CI is green on the current head (11406ad).
  • Not checked: the population impact, and the Axiom mirror.

🤖 Generated with Claude Code

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving, per my review above. The shoulds and nits can follow.

@juaristi22
juaristi22 added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit aff7cd2 Oct 20, 2026
14 checks passed
@juaristi22
juaristi22 deleted the fix-2111-pensioner-ctr-child-benefit branch October 20, 2026 02:36
MaxGhenis added a commit that referenced this pull request Oct 20, 2026
Folds #2479's CTR-specific severe disability premium into the ordinary
branch of council_tax_reduction_premiums, and limits #2470's pensioner
Child Benefit exclusion to families whose applicant is the benefit unit's
claimant (a head who applies alone counts none of its awards).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants