Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions comparisons/affected_map.json
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,14 @@
],
"source": "comparisons/uk-child-benefit-ukmod.yaml"
},
{
"suite": "uk-council-tax-reduction",
"report": "axiom-policyengine-uk-council-tax-reduction.json",
"repos": [
"TheAxiomFoundation/rulespec-uk"
],
"source": "comparisons/uk-council-tax-reduction.yaml"
},
{
"suite": "uk-employer-nic",
"report": "axiom-euromod-uk-employer-nic.json",
Expand Down
45 changes: 45 additions & 0 deletions comparisons/uk-council-tax-reduction.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Council Tax Reduction — rulespec-uk England pension-age scheme vs PolicyEngine-UK
# on a synthetic pensioner-household grid. The Axiom side is the encoded England
# pension-age prescribed scheme (SI 2012/2885 Schedule 1),
# uk/policies/govuk/council-tax-reduction.yaml, evaluated through the axiom rules
# engine over PolicyEngine's own applicable amount / applicable income /
# non-dependant deductions / council_tax liability / savings (the uk-pension-credit
# bridge pattern). PolicyEngine gained a council_tax_reduction formula in 2.89.2
# (PolicyEngine/policyengine-uk#1769 national core + #1771 Kingston, both merged).
#
# council_tax liability is a supplied input on both sides, so the schemes are
# commensurable and the grid matches to the penny (full award below the
# applicable amount, the 20 per cent taper interior, the 16000 capital screen,
# single and couple applicable amounts); the only residuals are sub-0.001
# PolicyEngine float32 artifacts, inside tolerance.
#
# Run locally (needs a PolicyEngine-UK 2.89.2 env, a built axiom rules engine and
# the rulespec-uk checkout):
# uv run python scripts/run_comparison.py uk-council-tax-reduction

name: uk-council-tax-reduction
title: UK Council Tax Reduction — Axiom vs PolicyEngine
description: >-
Compares the encoded England pension-age Council Tax Reduction scheme
(rulespec-uk uk/policies/govuk/council-tax-reduction.yaml, SI 2012/2885) against
PolicyEngine-UK council_tax_reduction (2.89.2) at the 2026 validation year on a
synthetic pensioner-household grid crossing the 20 per cent taper and the 16000
capital limit. council_tax liability is a supplied input on both engines.
documentation: docs/uk-coverage-matrix.md

runner:
type: uk-council-tax-reduction-grid
parameters:
period: "2026"
policyengine_uk_version: "2.89.2"
# Links this suite to the rulespec-uk monorepo in the affected map so a
# change to the encoded England pension-age scheme triggers a re-run.
rulespec_roots:
- $HOME/TheAxiomFoundation/rulespec-uk

artifacts:
report_basename: axiom-policyengine-uk-council-tax-reduction

dashboard:
filename: axiom-policyengine-uk-council-tax-reduction.json
suite: uk-council-tax-reduction
22 changes: 11 additions & 11 deletions conformance/detail/uk-pe.json
Original file line number Diff line number Diff line change
Expand Up @@ -152,18 +152,18 @@
"oracle_policy_name": "council_tax_reduction",
"in_scope": true,
"exclusion_reason": null,
"suite": null,
"covered": false,
"comparisons": null,
"matches": null,
"raw_match_rate": null,
"suite": "uk-council-tax-reduction",
"covered": true,
"comparisons": 11,
"matches": 11,
"raw_match_rate": 100.0,
"explained_rate": null,
"unexplained": null,
"axiom_attributed_open": null,
"oracle_attributed": null,
"bridge_artifacts": null,
"note": "In-scope uncovered \u2014 council_tax_reduction now HAS a formula in PE-UK 2.89.2 (the matrix ambiguity at HEAD 45eb181c, where the variable was absent, is resolved on this pin); rulespec encodes England pension-age + council schemes but no CTR suite runs yet (matrix row 29 \u2192 LGFA 1992 s.13A + Sch.1A).",
"status": "uncovered"
"unexplained": 0,
"axiom_attributed_open": 0,
"oracle_attributed": 0,
"bridge_artifacts": 0,
"note": "Covered by the uk-council-tax-reduction case-grid suite. council_tax_reduction gained a formula in PE-UK 2.89.2 (#1769 national core + #1771 Kingston, both merged), resolving the matrix ambiguity at HEAD 45eb181c where the variable was absent. The suite compares PE-UK's England pension-age path (gov.local_authorities.england.council_tax_reduction.pensioners: max-support 1, capital limit 16000, withdrawal 0.20) against the rulespec SI 2012/2885 England pension-age scheme (uk/policies/govuk/council-tax-reduction.yaml) on a synthetic pensioner grid, 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). council_tax is a supplied input on both sides, so the schemes are commensurable; all 11 cases match to the penny (the taper interior, the capital screen, single and couple), residuals sub-0.001 (PE float32), inside tolerance. The England pension-age income test does not inherit the #1794 Housing Benefit earnings-disregard defect \u2014 council_tax_reduction_applicable_income applies no earnings disregard. matrix row 29 \u2192 LGFA 1992 s.13A + Sch.1A; SI 2012/2885.",
"status": "conformant"
},
{
"id": "uk-pe:dla",
Expand Down
2 changes: 1 addition & 1 deletion conformance/ratchet.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ ratchets:
axiom_attributed_open_max: 0
policies_in_scope: 27
- jurisdiction: uk-pe
covered_min: 13
covered_min: 14
unexplained_max: 0
axiom_attributed_open_max: 0
policies_in_scope: 25
7 changes: 3 additions & 4 deletions conformance/scoreboard.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,8 @@
"jurisdiction": "uk-pe",
"oracle": "policyengine-uk_2.89.2/uk",
"policies_in_scope": 25,
"covered": 13,
"covered_pct": 52.0,
"covered": 14,
"covered_pct": 56.0,
"excluded": 8,
"excluded_by_reason": {
"input_carrying": 8
Expand All @@ -87,7 +87,6 @@
"attendance_allowance",
"business_rates",
"capital_gains_tax",
"council_tax_reduction",
"fuel_duty",
"lbtt_ltt",
"legacy_means_tested",
Expand All @@ -98,7 +97,7 @@
"winter_fuel_allowance"
],
"blocking_reasons": [
"12 of 25 in-scope policies are not covered by a live suite: attendance_allowance, business_rates, capital_gains_tax, council_tax_reduction, fuel_duty, lbtt_ltt, legacy_means_tested, state_pension, tax_free_childcare, tv_licence, vat, winter_fuel_allowance"
"11 of 25 in-scope policies are not covered by a live suite: attendance_allowance, business_rates, capital_gains_tax, fuel_duty, lbtt_ltt, legacy_means_tested, state_pension, tax_free_childcare, tv_licence, vat, winter_fuel_allowance"
]
}
]
Expand Down
18 changes: 14 additions & 4 deletions conformance/uk-pe.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,20 @@ policies:
output_vars:
- council_tax_reduction
in_scope: true
suite: null
note: In-scope uncovered — council_tax_reduction now HAS a formula in PE-UK 2.89.2 (the matrix ambiguity
at HEAD 45eb181c, where the variable was absent, is resolved on this pin); rulespec encodes England
pension-age + council schemes but no CTR suite runs yet (matrix row 29 → LGFA 1992 s.13A + Sch.1A).
suite: uk-council-tax-reduction
note: 'Covered by the uk-council-tax-reduction case-grid suite. council_tax_reduction gained a formula
in PE-UK 2.89.2 (#1769 national core + #1771 Kingston, both merged), resolving the matrix ambiguity
at HEAD 45eb181c where the variable was absent. The suite compares PE-UK''s England pension-age path
(gov.local_authorities.england.council_tax_reduction.pensioners: max-support 1, capital limit 16000,
withdrawal 0.20) against the rulespec SI 2012/2885 England pension-age scheme
(uk/policies/govuk/council-tax-reduction.yaml) on a synthetic pensioner grid, 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). council_tax is a supplied
input on both sides, so the schemes are commensurable; all 11 cases match to the penny (the taper
interior, the capital screen, single and couple), residuals sub-0.001 (PE float32), inside tolerance.
The England pension-age income test does not inherit the #1794 Housing Benefit earnings-disregard
defect — council_tax_reduction_applicable_income applies no earnings disregard. matrix row 29 → LGFA
1992 s.13A + Sch.1A; SI 2012/2885.'
- id: uk-pe:dla
oracle_policy_name: dla
oracle_policy_type: rate_from_category
Expand Down
228 changes: 228 additions & 0 deletions dashboard/public/data/axiom-policyengine-uk-council-tax-reduction.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,228 @@
{
"schema_version": "axiom.comparison_report.v2",
"suite": "uk-council-tax-reduction",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"population": "case-grid",
"validation_year": 2026,
"locales": [
"UK"
],
"scope": {
"type": "country",
"geoid": "UK"
},
"engines": {
"axiom": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"policyengine": "council_tax_reduction"
},
"tolerance": {
"absolute": 0.01,
"relative": 2e-07
},
"case_count": 11,
"summary": {
"comparison_count": 11,
"match_count": 11,
"mismatch_count": 0,
"axiom_vs_policyengine_match_rate": 100.0,
"policyengine_matches": 11,
"weighted": {
"comparison_weight": 11,
"match_weight": 11,
"mismatch_weight": 0,
"match_rate": 100.0
},
"mismatches_by_concept": [],
"mismatches_by_kind": [],
"mismatches_by_scenario": [],
"error_count": 0,
"errors_by_engine": []
},
"mismatches": [],
"errors": [],
"cases": [
{
"case_id": "ctr-pa-single-full-below-aa",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "full-award-income-below-applicable-amount",
"couple": false,
"council_tax_liability": 1800.0,
"applicable_amount": 13312.0,
"applicable_income": 4000.0,
"household_capital": 0.0,
"axiom": 1800.0,
"policyengine": 1800.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-single-full-income-at-aa",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "full-award-income-near-applicable-amount",
"couple": false,
"council_tax_liability": 1800.0,
"applicable_amount": 13312.0,
"applicable_income": 12914.0,
"household_capital": 0.0,
"axiom": 1800.0,
"policyengine": 1800.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-single-taper-interior-a",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "taper-interior",
"couple": false,
"council_tax_liability": 3000.0,
"applicable_amount": 13312.0,
"applicable_income": 17163.599609375,
"household_capital": 0.0,
"axiom": 2229.680078125,
"policyengine": 2229.68017578125,
"axiom_vs_policyengine": {
"difference": -9.765625009094947e-05,
"match": true
}
},
{
"case_id": "ctr-pa-single-taper-interior-b",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "taper-interior",
"couple": false,
"council_tax_liability": 3000.0,
"applicable_amount": 13312.0,
"applicable_income": 22645.19921875,
"household_capital": 0.0,
"axiom": 1133.36015625,
"policyengine": 1133.360107421875,
"axiom_vs_policyengine": {
"difference": 4.8828125045474735e-05,
"match": true
}
},
{
"case_id": "ctr-pa-single-taper-interior-c",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "taper-interior",
"couple": false,
"council_tax_liability": 2500.0,
"applicable_amount": 13312.0,
"applicable_income": 18514.0,
"household_capital": 0.0,
"axiom": 1459.6,
"policyengine": 1459.5999755859375,
"axiom_vs_policyengine": {
"difference": 2.441406240905053e-05,
"match": true
}
},
{
"case_id": "ctr-pa-single-taper-to-zero",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "taper-exhausts-award",
"couple": false,
"council_tax_liability": 1800.0,
"applicable_amount": 13312.0,
"applicable_income": 28114.0,
"household_capital": 0.0,
"axiom": 0.0,
"policyengine": 0.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-single-capital-at-limit",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "capital-at-limit-eligible",
"couple": false,
"council_tax_liability": 1800.0,
"applicable_amount": 13312.0,
"applicable_income": 4000.0,
"household_capital": 16000.0,
"axiom": 1800.0,
"policyengine": 1800.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-single-capital-over-limit",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "capital-over-limit-excluded",
"couple": false,
"council_tax_liability": 1800.0,
"applicable_amount": 13312.0,
"applicable_income": 4000.0,
"household_capital": 20000.0,
"axiom": 0.0,
"policyengine": 0.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-single-high-council-tax",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "full-award-high-liability",
"couple": false,
"council_tax_liability": 2600.0,
"applicable_amount": 13312.0,
"applicable_income": 8000.0,
"household_capital": 0.0,
"axiom": 2600.0,
"policyengine": 2600.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-couple-full-below-aa",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "couple-full-award",
"couple": true,
"council_tax_liability": 2200.0,
"applicable_amount": 19934.19921875,
"applicable_income": 6000.0,
"household_capital": 0.0,
"axiom": 2200.0,
"policyengine": 2200.0,
"axiom_vs_policyengine": {
"difference": 0.0,
"match": true
}
},
{
"case_id": "ctr-pa-couple-taper-interior",
"concept": "uk:policies/govuk/council-tax-reduction#council_tax_reduction_annual_amount",
"scenario": "couple-taper-interior",
"couple": true,
"council_tax_liability": 2400.0,
"applicable_amount": 19934.19921875,
"applicable_income": 21966.0,
"household_capital": 0.0,
"axiom": 1993.63984375,
"policyengine": 1993.639892578125,
"axiom_vs_policyengine": {
"difference": -4.8828125045474735e-05,
"match": true
}
}
],
"provenance": {
"generated": "2026-07-06",
"generator": "scripts/generate_uk_council_tax_reduction.py",
"axiom_engine": "axiom rules engine over rulespec-uk uk/policies/govuk/council-tax-reduction.yaml",
"policyengine_uk": "2.89.2",
"commensurability": "PolicyEngine-UK England pension-age Council Tax Reduction (gov.local_authorities.england.council_tax_reduction.pensioners: max-support 1, capital limit 16000, withdrawal 0.20) vs the SI 2012/2885 prescribed pension-age scheme; council_tax liability is a supplied input on both sides. PolicyEngine's computed applicable amount, applicable income and non-dependant deductions are bridged into the rulespec supplied inputs."
}
}
Loading
Loading