Skip to content

Add uk-council-tax-reduction comparison; cover CTR on uk-pe (13/25 → 14/25)#192

Merged
MaxGhenis merged 3 commits into
mainfrom
claude/uk-pe-council-tax-reduction
Jul 6, 2026
Merged

Add uk-council-tax-reduction comparison; cover CTR on uk-pe (13/25 → 14/25)#192
MaxGhenis merged 3 commits into
mainfrom
claude/uk-pe-council-tax-reduction

Conversation

@MaxGhenis

Copy link
Copy Markdown
Contributor

Council Tax Reduction — rulespec-uk vs PolicyEngine-UK 2.89.2

PolicyEngine-UK gained a council_tax_reduction formula in 2.89.2
(PolicyEngine/policyengine-uk#1769 national core + #1771 Kingston, both merged),
unblocking the CTR comparison that the M3 verdict had held on the PE side. This
adds the comparison and covers the program on the uk-pe conformance universe.

Pairing

PE-UK's England pension-age path
(gov.local_authorities.england.council_tax_reduction.pensioners: maximum-support
1, capital limit £16,000, withdrawal rate 0.20) is parameter-identical to the
rulespec SI 2012/2885 England pension-age prescribed scheme
(uk/policies/govuk/council-tax-reduction.yaml). council_tax liability is a
supplied/projected input on both sides (PE
council_tax_reduction_maximum_eligible_liability = council_tax; rulespec
council_tax_liability_for_year).

Comparison

scripts/generate_uk_council_tax_reduction.py runs a synthetic England
pensioner-household grid through PolicyEngine-UK 2.89.2 live and the encoded
scheme through the axiom rules engine, bridging PE's own applicable amount,
applicable income, non-dependant deductions, council_tax liability, and
savings into the rulespec supplied inputs (the uk-pension-credit bridge
pattern). Both engines are real; no numbers are hand-written.

Result: 11/11 cases match to the penny (100%) — full award below the
applicable amount, the 20% taper interior (three award levels), the £16,000
capital screen at and above the limit, high council tax, single and couple.
Residuals are sub-£0.001 PolicyEngine float32 artifacts, inside the £0.01
tolerance. Zero mismatches → no dispositions file needed.

#1794 interaction

CTR's England pension-age income test does not inherit the #1794 Housing
Benefit earnings-disregard defect: council_tax_reduction_applicable_income
applies no earnings disregard and never calls
housing_benefit_applicable_income_disregard (where #1794 lives). Noted in the
coverage matrix and universe.

Coverage movement

uk-pe PolicyEngine-UK conformance: 13/25 (52%) → 14/25 (56%);
council_tax_reduction leaves the uncovered list; ratchet floor lifted to 14.
Regenerated scoreboard, per-policy detail, burn-down, freshness, affected-map.

Files

  • scripts/generate_uk_council_tax_reduction.py — two-engine grid generator
  • comparisons/uk-council-tax-reduction.yaml + uk-council-tax-reduction-grid runner
  • dashboard/public/data/axiom-policyengine-uk-council-tax-reduction.json — committed report
  • conformance/uk-pe.yaml — CTR bound to the suite; scoreboard/detail/ratchet/burndown regen
  • docs/uk-coverage-matrix.md — row 29 + note 6 refreshed for 2.89.2
  • tests/test_conformance.py — covered-suite allowlist admits the case-grid suite

All 12 CI gates + pytest (1231 passed) green locally.

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits July 6, 2026 15:06
council_tax_reduction gained a formula in PolicyEngine-UK 2.89.2
(PolicyEngine/policyengine-uk#1769 national core + #1771 Kingston, both
merged), so matrix row 29 and note 6 — which said the variable "does NOT
exist in PE-UK" and the surface was "PE-blocked" — were stale. Update them
to the resolved state: the England pension-age path
(gov.local_authorities.england.council_tax_reduction.pensioners: max-support
1, capital limit 16000, withdrawal 0.20) is parameter-identical to SI
2012/2885 and matches the rulespec England pension-age award penny-for-penny
on a synthetic grid (verified, PE-UK 2.89.2). Record that CTR does not
inherit the #1794 Housing Benefit earnings-disregard defect (its
applicable-income path applies no earnings disregard) and note the uk-pe
universe pins 2.89.2 where the running EFRS suites pin 2.88.56.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
….89.2)

Adds a case-grid comparison of the encoded England pension-age Council Tax
Reduction scheme (rulespec-uk uk/policies/govuk/council-tax-reduction.yaml,
SI 2012/2885 Schedule 1) against PolicyEngine-UK's council_tax_reduction
(present from 2.89.2). council_tax liability is a supplied input on both
engines, so the schemes are commensurable.

scripts/generate_uk_council_tax_reduction.py runs a synthetic England
pensioner-household grid through PolicyEngine-UK 2.89.2 live and the rulespec
scheme through the axiom rules engine, bridging PE's own applicable amount /
applicable income / non-dependant deductions / council_tax liability / savings
into the rulespec supplied inputs (the uk-pension-credit bridge pattern), and
writes a v2 report. comparisons/uk-council-tax-reduction.yaml registers it;
the uk-council-tax-reduction-grid runner delegates to the generator and reuses
the committed dashboard report on a runner without the PE-UK/engine stack
(mirroring state-income-tax-liability-grid).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The committed uk-council-tax-reduction report matches all 11 pensioner
case-grid cases to the penny (the 20% taper interior, the 16000 capital
screen, single and couple), residuals sub-0.001 from PolicyEngine float32,
inside the 0.01 tolerance. Bind uk-pe:council_tax_reduction to the
uk-council-tax-reduction suite so the scoreboard scores it covered, moving
PolicyEngine-UK conformance coverage from 13/25 (52%) to 14/25 (56%) and
lifting the ratchet floor to 14. Regenerate the scoreboard, per-policy
detail, burn-down, freshness, and affected-map. Widen the covered-suite
allowlist test to admit the case-grid CTR suite alongside the two EFRS suites.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis merged commit 37f2e24 into main Jul 6, 2026
1 check passed
@MaxGhenis
MaxGhenis deleted the claude/uk-pe-council-tax-reduction branch July 6, 2026 19:11
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.

1 participant