Skip to content

DO NOT MERGE YET: Add an initial council tax reduction framework#1534

Draft
MaxGhenis wants to merge 80 commits intomainfrom
codex/ctr-framework
Draft

DO NOT MERGE YET: Add an initial council tax reduction framework#1534
MaxGhenis wants to merge 80 commits intomainfrom
codex/ctr-framework

Conversation

@MaxGhenis
Copy link
Copy Markdown
Collaborator

@MaxGhenis MaxGhenis commented Mar 23, 2026

Summary

  • add a jurisdiction-scoped Council Tax Reduction framework and wire simulated CTR into council_tax_benefit, council_tax_less_benefit, and household net income
  • support national Wales and Scotland CTR, English pension-age CTR, and 73 current English working-age billing-authority schemes
  • keep each local scheme in separate authority folders for parameters and variables, matching the jurisdiction-first pattern used elsewhere in PolicyEngine
  • add source-linked parameters, local edge-case YAML tests, coverage metadata, and a work queue for the remaining councils

Current CTR Scheme Coverage

  • 73 current English working-age billing authorities are implemented in this PR
  • current batch additions include Plymouth and Basildon, both from official 2026/27 council sources
  • unsupported English working-age authorities continue to fall back to reported baseline council_tax_benefit values rather than guessed local rules

Source And Modeling Notes

  • sources are primary council material where available: formal S13A scheme PDFs, current council pages, budget/adoption papers, or official no-change papers paired with the carried-forward scheme text
  • variables and parameters are jurisdiction-scoped even when formulas are similar, because councils set distinct schemes and may later move to separate jurisdiction repos
  • known source conflicts are documented in scheme_work_queue.md; for example Plymouth's adopted PDF controls over a conflicting live summary amount

Validation

  • uv run policyengine-core test policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction.yaml
    • latest local result: 577 passed in 177.17s
  • uv run ruff check on touched CTR variable/shared files
  • uv run ruff format --check on touched CTR variable/shared files
  • git diff --check
  • import checks for newly added authority variables and parameter trees

Latest Checkpoint

  • pushed Basildon implementation and a follow-up review-fix commit after subagent review
  • Basildon review fixes covered UC childcare deductions, SSP/SMP childcare work treatment, UC capital boundary tests, and the two-or-more-dependants top-band row
  • PR head is mergeable as of this checkpoint; CI is pending on the latest pushed commit

Paused Next Work

  • next likely councils to implement: Southend, Thurrock, Colchester, and Chelmsford
  • Southend has a current official council page plus a formal 2026/27 S13A PDF available, and is the next clean candidate

@MaxGhenis MaxGhenis marked this pull request as draft March 23, 2026 11:16
@MaxGhenis
Copy link
Copy Markdown
Collaborator Author

This draft still looks like real work, but not something to merge in its current form. It is stale, conflicting with current main, and large enough that the right next step is probably to split it into smaller PRs rather than revive this branch directly. A sensible breakdown would be: 1. core CTR variable/plumbing and netting behavior, 2. pensioner/Wales/Scotland baseline support, 3. local-authority-specific overrides and comparison scripts. If no one is planning to actively do that split soon, closing this draft would be cleaner than leaving it to rot.

@MaxGhenis MaxGhenis changed the title Add an initial council tax reduction framework DO NOT MERGE YET: Add an initial council tax reduction framework Apr 12, 2026
@MaxGhenis
Copy link
Copy Markdown
Collaborator Author

CTR scheme checkpoint:

  • Added Southend-on-Sea working-age/local CTR scheme from the official 2026/27 S13A PDF: 75% max support, income bands, £20 earnings disregard, childcare caps/gate, strict £6k capital cutoff, UC element disregards, pension-age UC routing.
  • Added Colchester working-age/local CTR scheme from the official 2026/27 PDF plus live working-age page: 80% max support, Band D cap, income bands by family type, protected-group route, £25 earnings disregard, childcare caps/gate, strict £6k capital cutoff, actual-UC-award gating, UC element disregards, applicant/partner capital source input for non-dep households, no working-age non-dep table found.
  • Coverage count in the work queue is now 75 current English working-age billing authorities, plus Wales/Scotland/national England pensioner CTR.
  • Local verification: Southend focused tests passed; Colchester focused tests passed with 14 cases; full CTR suite passed with 602 tests; ruff and import checks passed.
  • Scout notes: Colchester was the quick next scheme and is now done. Chelmsford and Thurrock are implementable but are legacy means-tested schemes, so they are larger than the income-banded patches and should be the next batch if we continue.

@MaxGhenis MaxGhenis force-pushed the codex/ctr-framework branch from 87f52e3 to ccbd2d7 Compare May 4, 2026 11:02
@MaxGhenis
Copy link
Copy Markdown
Collaborator Author

Opened contingent post-CTR draft PRs so the follow-on pipeline work is ready but blocked on this PR completing UK-wide CTR coverage:\n\n- #1657 clarifies Council Tax/CTR semantics and adds a zero-floor regression test.\n- PolicyEngine/policyengine-uk-data#387 documents the data-side calibration switch path and acceptance gates.\n\nBoth are draft/non-switching until #1534 is complete.

Copy link
Copy Markdown
Collaborator

Checkpoint update on codex/ctr-framework:

  • added Chichester working-age CTR support and pushed it at e29c6e179d95803e5e7d48c7a1716e94ebf7a7a5
  • encoded jurisdiction-scoped Chichester params and vars for:
    • legacy means-tested cases with 100% max support, 20% taper, £6,000 tariff-income threshold, and £16,000 capital limit
    • local-scheme handling for pension-age UC / relevant income-based benefit cases
    • UC Class F household-type income bands and Chichester non-dependant deductions
  • added focused baseline CTR tests covering full support, taper behavior, capital cutoff, UC band thresholds, non-dependant deductions, and pension-age UC local-scheme handling
  • updated the CTR README, work queue, and changelog with Chichester coverage and notes

Source/modeling note:

  • Chichester’s published couple-band table appears to contain a typo (£2229.00 in the 60% row). I modeled that row as £229.00 based on the continuous grid in both the 2026/27 appendix and the carried-forward 2025/26 appendix, and documented that assumption in the repo.

Verification for this checkpoint passed:

  • uv run ruff check ...
  • import smoke for newly added CTR variables/params
  • focused CTR suite: 655 passed

Branch is clean and pushed. Next likely candidate remains Cotswold unless we want to reprioritize.

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