From e5c06168c7ec10e242e70c89665eb4d3efa4e04e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 4 May 2026 08:36:45 -0400 Subject: [PATCH 1/2] Document post-CTR council tax calibration path --- docs/myst.yml | 1 + docs/post_ctr_council_tax_calibration.md | 68 ++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 docs/post_ctr_council_tax_calibration.md diff --git a/docs/myst.yml b/docs/myst.yml index 29f21f0a3..e039a341d 100644 --- a/docs/myst.yml +++ b/docs/myst.yml @@ -19,6 +19,7 @@ project: - file: pension_contributions.ipynb - file: constituency_methodology.ipynb - file: LA_methodology.ipynb + - file: post_ctr_council_tax_calibration.md site: options: logo: logo.png diff --git a/docs/post_ctr_council_tax_calibration.md b/docs/post_ctr_council_tax_calibration.md new file mode 100644 index 000000000..56f7ffaf4 --- /dev/null +++ b/docs/post_ctr_council_tax_calibration.md @@ -0,0 +1,68 @@ +# Post-CTR Council Tax Calibration + +This draft is contingent on UK-wide Council Tax Reduction (CTR) support +landing in PolicyEngine/policyengine-uk#1534. Until then, the data +pipeline should keep using the existing FRS-derived Council Tax inputs +for production outputs. + +## Current state + +The dataset pipeline starts from FRS Council Tax variables, then +calibrates household weights to public Council Tax targets: + +- `council_tax` comes from FRS-reported annual Council Tax, with missing + values imputed from FRS cells. +- `council_tax_band` comes from the FRS band variable. +- `council_tax_less_benefit` is the PolicyEngine UK signal for net + Council Tax receipts. +- National OBR Council Tax targets use `council_tax_less_benefit`. +- LA calibration includes Council Tax band counts and net Council Tax + targets where direct or derived public sources are available. + +## Post-CTR target state + +After UK-wide CTR coverage is complete, the production pipeline should +be able to validate and then switch to: + +```text +structural gross Council Tax liability +- modelled Council Tax Reduction += net Council Tax paid +``` + +FRS-reported Council Tax and reported CTB/CTR should remain available as +validation signals, imputation predictors, and fallback diagnostics, but +they should not be the long-run source of truth for policy counterfactual +net Council Tax. + +## Acceptance gates before switching + +Do not switch production calibration outputs until all of these are true: + +- PolicyEngine UK has CTR schemes for every council tax billing + authority that the dataset can assign. +- Unsupported or unmapped local authority records are explicitly + counted and small enough to accept, or handled with a documented + fallback. +- Modelled national and country Council Tax Reduction totals are within + agreed tolerances of admin spend or caseload targets where available. +- Modelled `council_tax_less_benefit` remains within agreed tolerances of + OBR net Council Tax receipts. +- LA-level net Council Tax diagnostics are no worse than the current + FRS-derived calibration baseline for England and Wales where targets + exist. +- Scotland and Northern Ireland remain explicitly handled rather than + silently folded into England/Wales assumptions. + +## Draft implementation sequence + +1. Add compare-only structural gross Council Tax liability outputs from + PolicyEngine UK. +2. Add diagnostics comparing FRS-reported net Council Tax with structural + gross liability minus modelled CTR. +3. Add CTR calibration targets and diagnostics for spend, caseload, and + net receipts where primary public sources support them. +4. Add a guarded pipeline switch that can choose either the current + FRS-derived net Council Tax signal or the structural/modelled signal. +5. Make the structural/modelled signal the default only after the + acceptance gates pass in release validation. From 0d225289994f214c32daa5e798e3249c62ad7b84 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 4 May 2026 08:58:44 -0400 Subject: [PATCH 2/2] Tighten post-CTR calibration gates --- docs/post_ctr_council_tax_calibration.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/post_ctr_council_tax_calibration.md b/docs/post_ctr_council_tax_calibration.md index 56f7ffaf4..2e7c01c1e 100644 --- a/docs/post_ctr_council_tax_calibration.md +++ b/docs/post_ctr_council_tax_calibration.md @@ -37,20 +37,24 @@ net Council Tax. ## Acceptance gates before switching -Do not switch production calibration outputs until all of these are true: +Do not switch production calibration outputs until a release validation +artifact records all of these checks. Default tolerances are below; a +future PR may change them, but it must update this list and report the +new thresholds with the release results. - PolicyEngine UK has CTR schemes for every council tax billing authority that the dataset can assign. - Unsupported or unmapped local authority records are explicitly - counted and small enough to accept, or handled with a documented - fallback. + counted and either below 0.5% of weighted households or handled with a + documented fallback. - Modelled national and country Council Tax Reduction totals are within - agreed tolerances of admin spend or caseload targets where available. + 5% of admin spend or caseload targets where available. - Modelled `council_tax_less_benefit` remains within agreed tolerances of - OBR net Council Tax receipts. + OBR net Council Tax receipts, with 2% as the default national + tolerance and 5% as the default country tolerance. - LA-level net Council Tax diagnostics are no worse than the current FRS-derived calibration baseline for England and Wales where targets - exist. + exist, measured by weighted absolute percentage error. - Scotland and Northern Ireland remain explicitly handled rather than silently folded into England/Wales assumptions.