Skip to content

Compute gross council tax from LA Band D amounts and statutory band ratios - #1855

Merged
MaxGhenis merged 8 commits into
mainfrom
council-tax-computed-liability
Oct 22, 2026
Merged

MaxGhenis merged 8 commits into
mainfrom
council-tax-computed-liability

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Sep 15, 2026 •

Copy link
Copy Markdown
Collaborator

Makes gross council tax a computed quantity (Nuffield deliverable: "Council tax by band and local authority; national model integration"). Context and full deliverable scope: #1854.

axiom: TheAxiomFoundation/rulespec-uk#468 queued (LGFA 1992 ss.5, 10, 36, 74, 93 and SSI 2016/368 art. 2 are not in the corpus; each returns 404)

Axiom status: rulespec-uk has no encoding of LGFA 1992 Part I charging yet. TheAxiomFoundation/rulespec-uk#468 is the dispatch-ready parity issue for this PR: ss.5, 10 and 36 for England and Wales (with band I), and ss.74 and 93 with SSI 2016/368 for Scotland, with the authority-set Band D amount kept as an input. The scope comes from TheAxiomFoundation/rulespec-uk#344, and the worklist entries for ss.5 and 10 are in TheAxiomFoundation/rulespec-uk#346 (open). Encoding is blocked until these sections are ingested into the corpus, which needs a signed ingest manifest.

What it adds

  • council_tax_band_d_amount (Household, YEAR, GBP) reads a new LA-keyed parameter, gov/local_authorities/council_tax/band_d/amounts.yaml, following the existing gov/local_authorities/domestic_rates/rates.yaml precedent for LA-keyed lookups.
    • All 350 April 2023 local authorities in England, Wales and Scotland, for fiscal 2025 and fiscal 2026 (700 values). Earlier years are held flat backwards from 2025.
    • The six April 2023 unitaries (North Northamptonshire, West Northamptonshire, Cumberland, Westmorland and Furness, North Yorkshire, Somerset) are already in LocalAuthority on main; this PR uses main's single definitions and adds no enum members.
    • Basis: England is Table 10 line 17, the area Band D including all local and major precepts; Wales is the overall average Band D (county, community council and police elements); Scotland is the council's Band D rate, excluding water and waste water charges. Each nation cites its specific workbook.
    • Northern Ireland districts (domestic rates) and English districts abolished in April 2023 have no Band D amount and return 0.
  • Band ratio parameters, per nation:
    • england.yaml: 6:7:8:9:11:13:15:18 relative to Band D = 9 (LGFA 1992 s.5), from 1993-04-01.
    • wales.yaml: the same plus band I at 21/9, from 1 April 2005 (LGFA 1992 s.5; Council Tax (Valuation Bands) (Wales) Order 2003, WSI 2003/3046).
    • scotland.yaml: all bands from 1993-04-01 on the original s.74(1) proportion; E to H then step to 473/360, 585/360, 705/360 and 882/360 from 1 April 2017 (Council Tax (Substitution of Proportion) (Scotland) Order 2016, SSI 2016/368, article 2). A to D are unchanged by that order.
  • simulated_council_tax = Band D amount x band ratio, zero for Northern Ireland.

Authority context

The Band D amount is looked up from the household's local_authority input, so the dataset must supply it. Without it the household takes the enum default (Maidstone).

  • Microcosm UK assigns an authority to every household row and will supply local_authority as an input from its dataset build (per @juaristi22's review of 18 September). This household-level lookup is the right shape for it.
  • Enhanced FRS does not populate local_authority; it reweights one national sample per authority instead. On the Enhanced FRS, every household therefore gets Maidstone's level.

This is documented on council_tax_band_d_amount.

Design choice

A new variable, simulated_council_tax; council_tax stays the dataset input, untouched. Reasons:

  1. council_tax feeds council_tax_less_benefit and the whole Council Tax Reduction stack. Redefining it would move CTR results for every household in the same change that introduces the arithmetic.
  2. On datasets without local_authority the computed value is a single-authority counterfactual, so switching now would degrade the model there.
  3. Keeping both lets the comparison be measured. The name follows the repo's simulated_council_tax_reduction_benunit convention for computed-vs-reported pairs.

Switching council_tax over is a follow-up, once the dataset supplies authorities.

Earlier aggregate exercise (historical, not rerun)

This table was computed at the first commit (7ef0352), when the table carried 344 authorities and a single vintage (2026-27 England and Wales, 2025-26 Scotland). Dataset enhanced_frs_2024_25, period 2026, every household on the Maidstone default. It has not been rerun on the current two-vintage table; the Scotland row in particular would differ, since 2026 now has its own Scottish vintage.

simulated_council_tax council_tax (input)
England £61.21bn £45.65bn
Wales £4.03bn £2.84bn
Scotland £7.00bn £3.97bn
UK £72.24bn £52.46bn

Against the ~£40bn England administrative total in the Nuffield application, the England figure was about 53% too high, for two reasons: every household is charged Maidstone's Band D (£2,502.59 in 2026, above the England mean), and this is gross liability (no single-person discount, exemptions or CTR). It measures how far the missing pieces reach, not a validation of the arithmetic.

Downstream hazard in policyengine-uk-data

policyengine_uk_data/targets/sources/la_council_tax.py:182 emits targets with variable="council_tax_band_d_amount". Today the variable does not exist, so the target is silently skipped. Once this merges and policyengine-uk-data bumps its policyengine-uk pin, the target goes live, and _compute_simple_gbp sums council_tax_band_d_amount across households while the target is a single Band D level (~£2.5k). Tracked in PolicyEngine/policyengine-uk-data#483; PolicyEngine/policyengine-uk-data#484 must merge before the pin is bumped past this PR. Both are open. Microcosm has no exposure.

Tests

22 YAML cases in policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/simulated_council_tax.yaml:

  • all eight England band ratios in Maidstone, and the Band D identity in Maidstone and Cardiff;
  • Wales band I in Cardiff, Scotland band H in Edinburgh;
  • the fiscal 2025 vintage for England, Wales and Scotland, and the pre-2017 Scottish Band H proportion;
  • three cases on the April 2023 unitaries, including Westmorland and Furness at 2025 and North Yorkshire 2026 (£2,544.34);
  • Belfast (Northern Ireland) and Allerdale (abolished 2023) give 0; no local_authority falls back to Maidstone (£2,502.59).

At head 7de51f6: the council tax directory gives 22 passed locally, and all CI checks pass (smoke import on py3.11 to 3.14, Lint, Documentation build, Test / YAML, Test / Python 1 to 4).

Not covered

  • local_authority in the Enhanced FRS (see Authority context).
  • Discounts (single-person and others): see Add statutory council tax discounts across Great Britain (LGFA 1992 ss.11 and 79; Welsh Regulations 2026) #1864, which builds on this PR.
  • Exemptions (student households, Class A to W).
  • Empty-home and second-home premiums.
  • Disabled band reduction.
  • Scottish water and waste water charges, and country-specific reliefs.
  • Precepts are inside the published Band D figures but are not modelled separately or made reformable.
  • Band D amounts before fiscal 2025 (held flat backwards); no uprating beyond fiscal 2026.
  • council_tax itself is unchanged, so CTR results are unaffected by this PR.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Flagging a design question for review that I think is the crux of this PR, plus a downstream hazard it creates.

The £61.21bn is an artefact, and the cause may be architectural rather than a missing dataset field

This PR computes liability as council_tax_band_d_amount (an LA-keyed parameter, looked up from household("local_authority")) × band ratio. The England aggregate comes out at £61.21bn against the ~£40bn administrative total cited in the Nuffield application.

The PR attributes this partly to local_authority being unpopulated — every household decodes to the enum default MAIDSTONE, so the result is "Maidstone's Band D (£2,502.59, above the £2,411 England unweighted mean) × the national band distribution".

That observation is correct, but I do not think the conclusion "the dataset needs to assign LAs" follows. Checking policyengine-uk-data:

  • No dataset builder ever writes a local_authority value onto households — grep local_authority policyengine_uk_data/datasets/*.py returns only target-matrix plumbing.
  • LA analysis is instead done by reweighting the national sample per LA: create_local_authority_target_matrix in datasets/local_areas/local_authorities/loss.py builds a target matrix over local_authorities_2021.csv codes, and calibrate.py writes one weight vector per LA to local_authority_weights.h5.

So local_authority appears to be unpopulated because per-household LA tagging is not the mechanism, not because of an oversight. If that reading is right, then a household-level variable that looks up a parameter by household("local_authority") cannot work under the current architecture — it will return the default LA's amount nationally, which is exactly the overstatement observed.

Question for review: should this be computed per-LA under the LA weighting context instead of via a household-level enum lookup? I would rather have that ruled on before the approach is built further, since the remaining deliverables (validation against administrative totals, distributional impacts) all depend on it.

Worth noting the £61.21bn also includes no single-person discount, exemptions, premiums or CTR, all of which are declared gaps here — so some overstatement is expected regardless. But the single-LA artefact is the larger term and it is the one with a design question attached.

Downstream hazard: filed as PolicyEngine/policyengine-uk-data#483

Independent of the above — merging this PR makes a latent defect in policyengine-uk-data go live.

That repo emits a target at targets/sources/la_council_tax.py:182 with variable="council_tax_band_d_amount". Today that variable does not exist, so _compute_simple_gbp hits KeyError → returns None → the target is silently discarded (not even the logger.debug fires). Once this PR merges and the pin is bumped, the target activates — and _compute_simple_gbp sums the variable across households while the target value is a single Band D level of ~£2,500. Weighted sum (order 1e10) compared against 2.5e3.

It will not raise. It will just calibrate against a wrong comparison. Detail and options in #483; that needs resolving before the pin is bumped, not before this merges.

Verified separately

The Scotland correction in this PR is right and worth not losing: Scotland raised the E–H multipliers to 473/360, 585/360, 705/360, 882/360 from April 2017 (SSI 2016/123), so the flat 9ths only hold for England. Wales Band I = 21/9 traces to LGFA 1992 s.5(1A) itself (proportions 6:7:8:9:11:13:15:18:21 for Wales from April 2005), not to separate Welsh legislation.

Also relevant to the Wales lane, from the parallel Axiom review (TheAxiomFoundation/rulespec-uk#344): LGFA 1992 s.12 was omitted with effect 1 April 2026 by the Local Government Finance (Wales) Act 2024 (asc 6), ss.18(6) and 23(7) — and 2026-27 is the year this PR's Band D amounts are drawn from.

Context and full deliverable scope: #1854.

🤖 Generated with Claude Code

@juaristi22 juaristi22 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.

The arithmetic is right, and both new variables have formulas, so they are safe for the Microcosm adapter. Requesting changes on data coverage, not on the design.

On the design question. The answer differs by consumer. policyengine-uk-data reweights one national sample per authority, so a household-level enum can never vary by authority there. Microcosm assigns an authority to every household row (an ONS code from its geography ladder), so a household-level local_authority lookup is exactly the right shape for us. What is missing is on our side: nothing maps that code into the LocalAuthority enum yet, so Microcosm builds also show the Maidstone default. We will supply local_authority as an input from the dataset build. The same gap already silences the bespoke CTR schemes in council_tax_reduction/config.py (Merton, Kingston upon Thames, Newham and the others test local_authority ==) on every dataset, which raises the priority of populating the input.

Changes requested:

  1. Enum coverage. Add the six 2023 unitaries (North Northamptonshire, West Northamptonshire, Cumberland, Westmorland and Furness, North Yorkshire, Somerset) to LocalAuthority. Microcosm's roster is the April 2023 local authority list, so those six are exactly the codes that would fall to the default, and adding them lets all 350 Band D rows load.
  2. Vintages. The parameter carries only 2026-27 for England and Wales and 2025-26 for Scotland. Microcosm measures at 2025, so England and Wales would be charged next year's level. The MHCLG Table 10 workbook prints the previous-year column alongside the current one, so fiscal 2025 values are in the same file, and Scotland's 2026-27 average Band D by council is published in the Scottish Government council tax datasets. Please carry 2025 and 2026 for all three nations.
  3. References. The England amounts.yaml href is the statistics collection page. Cite the specific table (Table 10, local authority level data, 2026-27) and say which Band D basis it is (including all precepts, if it is the area figure). The Scotland href should name the specific dataset.
  4. Scotland ratios before 2017. scotland.yaml starts every band at 2017-04-01, including A to D, which SSI 2016/123 did not change. Date A to D from 1993-04-01 so the parameter is defined before 2017.

Agreed on the hazard: policyengine-uk-data must merge PolicyEngine/policyengine-uk-data#484 before bumping its pin past this PR. Microcosm has no exposure; the Band D rate was never ported (it is a signed exclusion in our parity register).

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Thanks — all four addressed in 9673a4f. Point by point.

1. Enum coverage. Added the six April 2023 unitaries to LocalAuthority, alphabetically and in the existing UPPER_SNAKE / display-name convention: CUMBERLAND, NORTH_NORTHAMPTONSHIRE, NORTH_YORKSHIRE, SOMERSET, WEST_NORTHAMPTONSHIRE, WESTMORLAND_AND_FURNESS. amounts.yaml now carries 350 rows, up from 344, and a programmatic check confirms every row key resolves to an enum member with none left over. I also grepped for anything else keyed on LocalAuthority — only council_tax_reduction/config.py, which tests five named London/Oxford authorities and needs nothing added.

Four source names needed aliasing to the enum's existing spellings rather than new members: MHCLG's "Bristol", "Durham", "Herefordshire" and "Kingston upon Hull" map to BRISTOL_CITY_OF, COUNTY_DURHAM, HEREFORDSHIRE_COUNTY_OF, KINGSTON_UPON_HULL_CITY_OF.

2. Vintages. Both 2025 and 2026 now carried for all three nations.

One correction to the premise: Table 10 does print the previous-year column, but only for lines 8 and 9 (the billing-authority-only Band D). The figure this parameter actually uses is line 17, the area figure — and there is exactly one line-17 column per release, no prior-year twin. So rather than reconstruct it from line 8 plus 16(a)–(d), I took fiscal 2025 from the revised 2025-26 release. Cross-check: the 2025-26 release's line-8 current column equals the 2026-27 release's line-8 previous column row for row (Adur 365.05 in both), confirming the same authority ordering and basis.

Independent validation that I hit the same series you already had: every England and Wales 2026 value, and every Scotland 2025 value, reproduces the figure already in the file to the penny (0 mismatches across 344 rows).

Sources actually used:

No gaps: all 350 rows have both years.

3. References. The collection-page href is gone; each nation now cites its specific workbook, and both the parameter description and the variable documentation state the basis:

  • England — line 17, "average Band D (2 adult equivalent) council tax for the area of the billing authority, including both local and major precepts". So yes, it is the area figure: county, police, fire, combined authority and parish precepts are all in it.
  • Wales — Table 1 "Overall average band D", i.e. county council + community council + police authority elements.
  • Scotland — the council's own Band D rate, which excludes the separately billed water and waste water charges.

4. Scotland ratios before 2017. Verified first, and the citation turned out to be wrong: SSI 2016/123 is the Local Authority (Capital Finance and Accounting) (Scotland) Regulations, nothing to do with council tax. The substitution order is SSI 2016/368, article 2, which substitutes 240: 280: 320: 360: 473: 585: 705: 882 into s.74(1) of LGFA 1992 for financial years beginning on or after 1 April 2017. Reference corrected.

Relative to D = 360 that gives A–D = 240/360, 280/360, 320/360, 1 — identical to the original s.74(1) proportion 6: 7: 8: 9: 11: 13: 15: 18 (confirmed against the as-enacted text). So A–D are dated from 1993-04-01 as you asked.

One step past your literal ask, flagged deliberately: dating only A–D from 1993 would still have left E–H undefined before 2017. E–H now also take their original 11/9, 13/9, 15/9 and 18/9 values from 1993-04-01, with the 2017-04-01 step to 473/360, 585/360, 705/360, 882/360 retained. Happy to drop that half if you would rather the parameter stay silent pre-2017 for E–H.

Tests. policyengine-core test policyengine_uk/tests/policy: 1136 passed. pytest policyengine_uk/tests/ --ignore=microsimulation: 149 passed, 17 skipped. The council tax file went from 12 to 18 cases — six new ones pin the 2025 vintage for England, Wales and Scotland, the pre-2017 Scottish Band H proportion, and two of the new 2023 unitaries.

One expected break, updated rather than worked around: the Edinburgh Band H 2026 case moved from 3830.60 to 3983.82, because 2026 now has its own vintage (Band D 1626.05) instead of holding 2025-26 (1563.51) flat forwards. That is exactly the mis-vintaging you flagged, so the moved number is the fix landing, not a regression.

Only cosmetic note: regenerating the file moved NEWCASTLE_UPON_TYNE one line relative to NEWCASTLE_UNDER_LYME. No value change.

Not rebased and not force-pushed — #1864 is stacked here and its head is untouched.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator

Reviewed commit 9673a4f9cde2c27f2e5daf8138bce812b1a7851e. Needs changes; review coverage is partial. Keep this council-tax calculation work, but repair the current-main import failure and settle the data interface before merging.

Confirmed integration blocker. The additions at CUMBERLAND and WEST_NORTHAMPTONSHIRE collide with enum members already on main. A read-only three-way merge against main 3c48247eb92b221312565bff3a1dbf0b87306e22 completed without textual conflicts but produced both member names twice. The captured Test job fails during import with TypeError: 'CUMBERLAND' already defined. The PR head's file does not itself contain both copies; the defect appears when composing it with main.

Separate integration decision. council_tax_band_d_amount.py:22 looks up the household's local_authority. The existing architecture review questions how this works with local-authority reweighting and warns about activating a calibration target before the data path supplies the intended authority. The later enum/table corrections do not establish that this question is resolved. This audit did not execute a national population run or independently confirm the present dataset contract.

Repair and acceptance steps:

  1. Rebase onto actual main and retain one definition of each authority. Preserve all six new-unitary mappings and the intended 2025/2026 table entries. Check every table key resolves to an enum member; do not drop rates simply to make the import succeed.
  2. Run a smoke import, then the council-tax policy directory. Include explicit-authority households from England, Scotland and Wales; exercise the new unitaries, Northern Ireland and historical/unsupported authority handling.
  3. Resolve UK-data #483 or document the agreed alternative: which layer supplies authority context, how missing context behaves, and when downstream calibration may consume this output. Validate that path with a controlled fixture before claiming national totals.
  4. Obtain new-head hosted import/test checks after the rebase, then refresh dependent Add statutory council tax discounts across Great Britain (LGFA 1992 ss.11 and 79; Welsh Regulations 2026) #1864.

Suggested acceptance commands, not executed in this packaging pass:

uv run --no-sync python -c "import policyengine_uk"
uv run --no-sync policyengine-core test policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax -c policyengine_uk

Validation completed: captured CI-log inspection and independent merged-file/AST duplicate detection. Policy tests were not rerun on a repaired tree; the full rate table, current data pipeline and population totals remain unverified.

Live posting check (2026-10-02T15:12:23.228164+00:00): same reviewed commit; GitHub reports MERGEABLE. Failing checks: Install + smoke-import (py3.11), Install + smoke-import (py3.12), Install + smoke-import (py3.13), Install + smoke-import (py3.14), Test. These checks do not replace the remaining validation listed above.

vahid-ahmadi and others added 3 commits October 7, 2026 10:32
Add council_tax_band_d_amount (LA Band D amount, from a new LA-keyed
parameter following the domestic_rates/rates.yaml precedent) and
simulated_council_tax (Band D amount x statutory band ratio).

Band ratios are added per country: England and Wales use the section 5
proportions 6:7:8:9:11:13:15:18 relative to Band D = 9, Wales adding
band I at 21/9 from April 2005; Scotland uses the raised E-H
multipliers (473/360, 585/360, 705/360, 882/360) from April 2017.

The existing council_tax input variable is left untouched so the two
can be compared. council_tax_band_d_amount also fills a dangling
reference from policyengine-uk-data's la_council_tax target source.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…levels

Review follow-up on the four data-coverage items.

Enum coverage: add the six April 2023 unitary authorities (Cumberland,
North Northamptonshire, North Yorkshire, Somerset, West Northamptonshire,
Westmorland and Furness) to LocalAuthority. All 350 Band D rows now load,
up from 344.

Vintages: carry fiscal 2025 and 2026 for England, Wales and Scotland.
England comes from MHCLG Table 10 line 17 in both the 2026-27 and the
revised 2025-26 releases; the 2025-26 release's current-year column
reproduces the 2026-27 release's previous-year column, and every England
and Wales 2026 value reproduces the figures already in the file. Wales
comes from the Welsh Government council tax levels data tables, Table 1
"Overall average band D". Scotland comes from the Scottish Government
Band D council tax 1996-97 to 2026-27 dataset, whose 2025-26 column
reproduces the Scottish values already in the file.

References: cite the specific workbooks rather than the statistics
collection page, and state the basis. For England and Wales this is the
area figure, so it includes the county, police, fire, combined authority
and parish or community council precepts; for Scotland it excludes the
separately billed water and waste water charges. The variable
documentation and the stale "six authorities absent from the enum"
comment are corrected to match.

Scotland ratios: SSI 2016/368 (not 2016/123, which is the capital finance
regulations and was cited in error) substitutes 240:280:320:360:473:585:
705:882 into section 74(1) for financial years from 1 April 2017. Bands A
to D are unchanged from the original 6:7:8:9 proportion, so they are dated
from 1993-04-01; bands E to H keep the 2017 step and gain their original
11/9, 13/9, 15/9 and 18/9 values from 1993-04-01, so no band is undefined
before 2017.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…land, an abolished district and the missing-authority default; document the authority context

Main already added the six unitaries (52f4281), so composing this branch with
it defined CUMBERLAND and WEST_NORTHAMPTONSHIRE twice and the package failed to
import (TypeError: 'CUMBERLAND' already defined). Every Band D row still resolves
to an enum member (350 of 350).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi
vahid-ahmadi force-pushed the council-tax-computed-liability branch from 9673a4f to 283b0ae Compare October 7, 2026 10:48
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Thanks, María. Addressed at 283b0ae2 (rebased onto current main):

  • CI root cause: main already carries the six April 2023 unitaries (52f428184). Combined with main, the branch defined CUMBERLAND and WEST_NORTHAMPTONSHIRE twice, so the package failed to import (TypeError: 'CUMBERLAND' already defined), which broke all four smoke-import jobs and Test. locations.py now keeps main's single definition; all 350 Band D rows still map to an enum member. A clean-venv install imports.
  • Your 18 September items 1–4 were done in 9673a4f and carry through the rebase.
  • New tests in simulated_council_tax.yaml:
    • North Yorkshire 2026 (£2,544.34);
    • Belfast (Northern Ireland) gives 0;
    • Allerdale (abolished 2023) gives 0;
    • no local_authority supplied falls back to Maidstone (£2,502.59).
  • Data interface documented on council_tax_band_d_amount: the dataset must supply local_authority (Microcosm does; the Enhanced FRS doesn't), Northern Ireland and abolished districts return 0, and downstream calibration waits on policyengine-uk-data#484.

Locally: YAML suite 2,627 passed; pytest (excluding microsimulation) 3,113 passed; ruff clean.

@juaristi22

Copy link
Copy Markdown
Collaborator

Review of #1855 — Compute gross council tax from LA Band D amounts and statutory band ratios

Base repository: PolicyEngine/policyengine-uk
PR number: 1855
Reviewed head SHA: 283b0ae
Merge base SHA: e146253
Mode: full
Scope: changed behavior and affected dependencies
Source evidence: Official sources are linked below; local source copies and validation artifacts were retained.
Review status: COMPLETE

Source Documents

Critical

None.

Should Address

A1 — Use a configured Towncrier type for the changelog fragment (OPEN)

SHOULD ADDRESS — repository requirement. changelog.d/council-tax-computed-liability.md:1 lacks the required type component. Snapshot docs/engineering/skills/github-prs.md requires <issue-number-or-branch-slug>.<type>.md; pyproject.toml:96 configures added, alongside breaking/changed/fixed/removed. The new fragment has no configured type, so it does not meet the release-note classification contract. Rename it to council-tax-computed-liability.added.md and check the Towncrier draft. This is a release-note issue; no modeled tax defect is claimed.

Suggestions

None.

Evidence Gaps

No material gaps reported.

Notes

  • Standalone computed gross/discount outputs do not replace reported payable council tax or change household net income; this is the declared scope.
  • Initial collection failed for two unchanged optional uprating property paths because Hypothesis is unavailable; required changed/direct tests passed together after excluding them.
  • Policy role confirmed legal amounts/rates/dates within partial scope; private population claims and citation qualifications remain policy-owned.
  • All 700 Band D authority-year values and statutory nation band ratios corroborated.
  • Standalone gross diagnostic only; historical flat-back and missing-LA fallback disclosed.

Validation Summary

162 passed, 1 warning in 2.16s, exit 0; bounded elapsed 6.03s. Exact snapshot Python import with bytecode disabled; run_bounded.py --seconds 540 review-code-test-runner.py current-pr-1855-code-tests-config.json; passing output current-pr-1855-code-tests-required.log, initial collection output current-pr-1855-code-tests.log. Focused nation vector and final standalone/payable/net-income assertions: run_bounded.py --seconds 150 current-council-tax-code-diagnostic.py 1855, exit 0 in 4.34s; output current-pr-1855-code-diagnostic.log. Existing Python3.13 interpreter used; no installs.

Exact captured diff and source originals read. current-pr-1855-review-sources.json; current-pr-1855-review-source-cache-check.json. Independent 700-value comparison: current-pr-1855-policy-band-d-comparison.json. Source acquisition timing in current-policy-source-acquisition.json; source extracts checked independently of PR body. No duplicate policy-calculation diagnostics. Canonical source-manifest validator exited 0.

CI at 283b0ae: Install + smoke-import (py3.11)=SUCCESS, Install + smoke-import (py3.12)=SUCCESS, Install + smoke-import (py3.13)=SUCCESS, Install + smoke-import (py3.14)=SUCCESS, Lint=SUCCESS, Test=SUCCESS.

Detailed code, policy, source and reproduction artifacts were retained locally.

Timing

elapsed seconds: 1151.70s; setup seconds: 271.60s

Review Severity

COMMENT. Open findings: 0 critical, 1 should address, 0 suggestions.

…(review: typed fragment)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Thanks, María. Renamed the fragment to changelog.d/council-tax-computed-liability.added.md in 8b18c47, so Towncrier now files it under "added". No code changes.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 A1 is fixed in 8b18c47 (the fragment is now .added.md). Could you re-review so the change request can be cleared?

@juaristi22 juaristi22 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.

Re-reviewed 8b18c47. My A1 is resolved: the changelog fragment is now council-tax-computed-liability.added.md. This commit only renames the fragment; the model code and tests are unchanged from the prior full review. I am clearing my change request and approving this head. Please rerun the cancelled full Test check before merging.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@juaristi22 juaristi22 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.

Fresh review of 7de51f6a984dabeea828191fbb3f3933c405a0a8. The earlier approval body attests 8b18c4753, before the main merge, despite GitHub’s updated review pointer. All eight owned blobs match that ancestor; current integration and public-source checks were performed afresh.

C1 — Add the required Axiom status record. The description has no axiom: line. docs/engineering/skills/github-prs.md:113–123 and .github/CONTRIBUTING.md:51 require it for policy additions/parameter changes; this PR adds statutory band ratios, 700 authority amounts and a computed output. Please state the truthful permitted status with the supporting reference/reason (including the documented needed route if applicable). This is a missing required completion record, not a claim that the external encoding is absent or incorrect.

A2 — Refresh the stale description (nonblocking). The actual table covers 350 authorities in both fiscal 2025 and 2026, including the six unitary authorities the body still lists as missing. Reconcile the one-year/344-authority claims and the blanket dataset-assignment statement with the current variable documentation; label the older Enhanced FRS aggregate exercise with its dataset/vintage. No wrong calculation is established by this documentation issue. Prior A1 (changelog name) remains resolved.

Validation: 226 current-head checks passed, including final payable-tax/CTR/income compatibility, explicit overrides, country/authority lookups and fiscal-year/parameter machinery. All 700/700 public Band D amounts match freshly acquired official workbooks to the penny; statutory England/Wales/Scotland ratios and dates verified. Ten official sources accepted. The new output remains a standalone gross area benchmark; private population totals were not rerun. Formatting, lint and Towncrier checks pass. No model implementation or statutory-value defect found.

Review status: COMPLETE. Review severity: REQUEST_CHANGES. Confirmed critical count: 1 (the required status record).

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 thanks. Both points are addressed in the PR description only. No code changed, and the head is still 7de51f6a9, so #1864 stays on the same base.

C1. Added axiom: needed. Nothing in rulespec-uk encodes LGFA 1992 Part I charging yet. The scope (ss.5, 10, 11, 11A, 11B) is agreed in TheAxiomFoundation/rulespec-uk#344 and the worklist entries are in TheAxiomFoundation/rulespec-uk#346, but encoding is blocked on the signed corpus ingest step. #344 is not yet a dispatch-ready pe-parity issue, so queued would not be accurate today.

A2. The description now says:

  • 350 authorities for both fiscal 2025 and 2026 (700 values);
  • the six April 2023 unitaries come from main's enum;
  • the Scottish ratios are dated from 1993, with the 2017 step for E to H (SSI 2016/368);
  • the authority context matches the variable documentation (Microcosm supplies local_authority; the Enhanced FRS does not);
  • the old aggregate table is labelled as computed at 7ef0352 on enhanced_frs_2024_25 with the single-vintage, 344-authority table, and as not rerun;
  • the test list is now the current 22 cases.

Checked locally at 7de51f6a9: the council tax directory gives 22 passed.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 on C1: the axiom line is now

axiom: TheAxiomFoundation/rulespec-uk#468 queued (LGFA 1992 ss.5, 10, 36, 74, 93 and SSI 2016/368 art. 2 are not in the corpus; each returns 404)

TheAxiomFoundation/rulespec-uk#468 is the dispatch-ready pe-parity issue for this PR. It quotes the law and gives the modules, the required outputs and companion tests from this PR's cases, with the arithmetic shown. needed was the wrong option for a maintainer, and queued is accurate now that the issue exists. I also rewrote the "Axiom status" paragraph to match. No code changed (head still 7de51f6a9), and Fix evidence passes on the edit.

🤖 Generated with Claude Code

@juaristi22 juaristi22 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.

Re-reviewed 7de51f6a984dabeea828191fbb3f3933c405a0a8.

C1 and A2 are resolved. The description now records the permitted queued status through rulespec-uk#468; the issue has the required parity label, source/module detail, companion cases and signed-ingest blocker. This records queued work; encoding and differential parity remain pending.

The refreshed description correctly identifies 350 authorities and 700 amounts across fiscal 2025/2026, the six existing unitary definitions, dataset lookup assumptions and the historical aggregate exercise. The code commit is unchanged, so I retained the previous 226 passing checks and official 700/700 amount corroboration after validating the cached evidence. Current-head hosted checks pass. I am clearing my change request and approving.

Retain the documented downstream UK-data calibration fix before updating that repository's model pin.

Review status: COMPLETE. No open critical findings.

@vahid-ahmadi
vahid-ahmadi added this pull request to the merge queue Oct 20, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 20, 2026
vahid-ahmadi and others added 2 commits October 20, 2026 23:48
The restatement property test drew any stated parameter and any route.
Scenario.parameter_changes types its values as numbers and booleans, so a
draw of the list-valued gov.dwp.universal_credit.means_test.capital.person_sources
through that route failed Scenario validation before any check ran. The
council tax parameters this branch adds shift the derandomised draws onto
that case in the merge queue. List values now use the other routes, and an
explicit example pins the list restatement through the reform dict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 this PR left the merge queue three times, for two different reasons:

  • Runs 39429172270 and 39447572171 failed the YAML job on benefit_cap_specified_benefits.yaml (the AFIP case). That test isn't touched here, and it passes on current main merged into this branch, so it came from main at the time.
  • Run 39462060902 failed test_restating_a_parameters_own_value_changes_nothing. The property test can draw any parameter and any route. Scenario.parameter_changes only accepts numbers and booleans, so a draw of the list-valued UC person_sources parameter through that route failed validation. The test samples parameters in a fixed order, so adding this PR's council tax parameters moved it onto that draw.

In 0fb7c52 I merged main again and fixed the test strategy. List values now only go through the routes that accept them, and an explicit example covers the list case through the reform dict. The model code is unchanged.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 763d21defb against head c717288d1f, both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1, sha256 056e80fd8e91), fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • In the years a figure from fewer than 10 records is suppressed (spending.disabled_students_allowance), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

None.

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Household net income by decile

No household's net income changes in any year.

No change in any year: receipts by tax head; government balance, each component counted once; model totals; components the model counts twice; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles; standard reform costings (change in gov_balance); standard reforms: change in each reform's target.

Checks failing on both base and head (1)
  • VAT is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-54,797,972 in total; 2026-27: 76 units below zero, a weighted £-56,271,349 in total; 2027-28: 76 units below zero, a weighted £-57,609,146 in total
Counted-once check

Each of 84 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.

Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 763d21defb uk 2.143.0 (files 57c46847f2b0), core 3.33.2, py 3.13.16 aarch64 cea2a142c03b f210f83d5be4 1504.16s
head #1855 merged into main c717288d1f uk 2.143.0 (files 3def1bf7122f), core 3.33.2, py 3.13.16 aarch64 cea2a142c03b f210f83d5be4 1537.21s

Dataset: hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@2526edbbb687a3b54dbb11272e5389e4b62d2ac2, sha256 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784 (verified on both sides), policyengine-uk-data 1.58.1.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax £299.36bn £319.12bn £336.63bn £351.79bn £367.34bn £385.47bn £403.77bn
National Insurance (employee and self-employed) £52.58bn £54.94bn £56.75bn £58.48bn £60.62bn £62.57bn £65.03bn
National Insurance (employer) £152.64bn £159.18bn £164.14bn £168.73bn £176.11bn £181.72bn £188.90bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.62bn £13.06bn £13.55bn £14.04bn £14.54bn £15.09bn £15.65bn
Student loan repayments £7.83bn £8.12bn £8.35bn £8.56bn £8.79bn £9.04bn £9.38bn
VAT £253.71bn £260.53bn £266.72bn £273.14bn £279.83bn £286.71bn £293.71bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.28bn £4.43bn £4.44bn £4.46bn £4.49bn £4.51bn £4.53bn
Council tax £49.56bn £52.45bn £55.78bn £59.39bn £62.98bn £66.74bn £70.70bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.51bn £0.52bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.61bn £0.63bn £0.67bn £0.70bn £0.73bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax (own purchases, and corporate until the £10.06bn £10.56bn £10.98bn £11.40bn £11.81bn £12.23bn £12.64bn
Land transaction tax (Wales) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land and buildings transaction tax (Scotland) £0.01bn £0.01bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension £122.50bn £127.12bn £128.28bn £130.21bn £134.05bn £138.02bn £142.08bn
Pension Credit £6.66bn £7.04bn £7.02bn £7.09bn £7.21bn £7.34bn £7.44bn
Winter Fuel Payment £1.70bn £1.68bn £1.59bn £1.57bn £1.57bn £1.55bn £1.52bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £78.78bn £83.08bn £84.89bn £86.65bn £87.58bn £88.99bn £90.32bn
Housing Benefit £8.59bn £8.92bn £9.19bn £9.33bn £9.61bn £9.87bn £10.15bn
Council Tax Reduction £1.99bn £2.03bn £2.08bn £2.13bn £2.18bn £2.23bn £2.28bn
Employment and Support Allowance (income-related) £2.12bn £2.18bn £2.23bn £2.28bn £2.33bn £2.39bn £2.45bn
Employment and Support Allowance (contribution-based) £5.22bn £5.36bn £5.49bn £5.62bn £5.76bn £5.90bn £6.04bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.33bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £27.05bn £28.19bn £28.94bn £29.64bn £30.37bn £31.11bn £31.87bn
Disability Living Allowance £7.52bn £7.83bn £8.04bn £8.24bn £8.44bn £8.65bn £8.86bn
Attendance Allowance £8.71bn £9.08bn £9.32bn £9.55bn £9.78bn £10.02bn £10.26bn
Carer's Allowance £4.50bn £4.69bn £4.81bn £4.93bn £5.05bn £5.17bn £5.29bn
Carer Support Payment (Scotland) £0.35bn £0.37bn £0.38bn £0.39bn £0.40bn £0.41bn £0.41bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.57bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.23bn £16.91bn £17.32bn £17.73bn £18.16bn £18.60bn £19.04bn
Scottish Child Payment £0.50bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.58bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.32bn £3.41bn £3.49bn £3.57bn £3.66bn £3.75bn £3.84bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.13bn £1.16bn £1.19bn £1.22bn £1.25bn £1.28bn £1.31bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.74bn £0.76bn £0.78bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.66bn £3.14bn £3.23bn £3.30bn £3.38bn £3.47bn £3.55bn
Universal childcare entitlement £3.32bn £3.59bn £3.69bn £3.78bn £3.88bn £3.99bn £4.08bn
Targeted childcare entitlement £0.57bn £0.60bn £0.62bn £0.63bn £0.65bn £0.66bn £0.67bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £204.68bn £205.46bn £206.22bn £207.04bn £207.96bn £208.89bn £209.79bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £25.78bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension 11,308k 11,208k 10,906k 10,812k 10,860k 10,908k 10,955k
Pension Credit 1,490k 1,489k 1,477k 1,455k 1,457k 1,454k 1,450k
Winter Fuel Payment 7,091k 7,008k 6,593k 6,509k 6,491k 6,377k 6,242k
Pension Age Winter Heating Payment (Scotland) 806k 807k 807k 805k 809k 812k 816k
Universal Credit 6,371k 6,379k 6,409k 6,419k 6,395k 6,387k 6,371k
Housing Benefit 1,254k 1,252k 1,254k 1,240k 1,244k 1,247k 1,249k
Council Tax Reduction 3,184k 3,210k 3,223k 3,244k 3,261k 3,279k 3,292k
Employment and Support Allowance (income-related) 187k 188k 188k 189k 190k 190k 191k
Employment and Support Allowance (contribution-based) 722k 724k 727k 730k 733k 737k 740k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 68k 68k 68k 69k 69k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,581k 3,595k 3,608k 3,623k 3,639k 3,655k 3,671k
Disability Living Allowance 1,296k 1,301k 1,306k 1,311k 1,317k 1,323k 1,329k
Attendance Allowance 1,701k 1,708k 1,714k 1,721k 1,729k 1,736k 1,744k
Carer's Allowance 1,038k 1,042k 1,046k 1,050k 1,055k 1,059k 1,064k
Carer Support Payment (Scotland) 81k 82k 82k 82k 83k 83k 83k
Carer's Allowance Supplement (Scotland) 0k 82k 82k 82k 83k 83k 83k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 138k 139k 139k 140k 140k 141k
Armed Forces Compensation Scheme 94k 94k 94k 95k 95k 95k 96k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,136k 8,165k 8,185k 8,215k 8,249k 8,282k 8,314k
Scottish Child Payment 352k 354k 355k 356k 357k 358k 357k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 201k 202k 203k 204k 204k 205k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 334k 335k 336k 338k 339k 341k 342k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 182k 183k 183k 184k 185k 186k 186k
Sure Start Maternity Grant 26k 26k 26k 27k 27k 27k 27k
Bereavement Support Payment 98k 98k 99k 99k 100k 100k 101k
Tax-Free Childcare 1,017k 1,028k 1,028k 1,033k 1,034k 1,038k 1,023k
Extended childcare entitlement 665k 671k 675k 677k 682k 686k 687k
Universal childcare entitlement 986k 989k 992k 997k 1,002k 1,013k 1,015k
Targeted childcare entitlement 119k 120k 120k 121k 121k 122k 121k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 99k 99k 100k 100k 100k 101k
Adult Dependants' Grant 18k 18k 12k 13k 13k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £899.46bn £939.35bn £976.35bn £1,009.56bn £1,045.84bn £1,082.79bn £1,123.66bn
Government spending £536.58bn † £550.91bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.27bn †
Government balance, each receipt once £362.88bn † £388.44bn † £419.09bn † £445.24bn † £472.97bn † £500.67bn † £532.39bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £902.59bn £942.48bn £979.48bn £1,012.69bn £1,048.97bn £1,085.92bn £1,126.79bn
household_tax £496.24bn £522.77bn £548.61bn £570.81bn £593.03bn £617.48bn £644.19bn
pre_budget_change_household_tax £488.42bn £514.65bn £540.26bn £561.77bn £583.75bn £607.94bn £634.29bn
gov_spending £536.58bn † £550.91bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.27bn †
household_benefits £536.58bn † £550.91bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.27bn †
gov_balance £366.01bn † £391.57bn † £422.22bn † £448.37bn † £476.10bn † £503.80bn † £535.52bn †
Components the model counts twice: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,657.06bn £1,719.25bn £1,771.68bn £1,821.99bn £1,872.88bn £1,930.99bn £2,001.98bn
Household net income £1,658.12bn † £1,706.63bn † £1,738.44bn † £1,772.55bn † £1,808.65bn † £1,850.28bn † £1,902.01bn †
Household net income (HBAI definition) £1,466.68bn £1,513.41bn £1,545.63bn £1,578.61bn £1,612.63bn £1,651.68bn £1,702.11bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,514k 69,778k 70,036k 70,316k 70,626k 70,944k 71,249k
Benefit units 35,247k 35,381k 35,512k 35,654k 35,811k 35,972k 36,127k
Households 31,167k 31,285k 31,401k 31,526k 31,665k 31,808k 31,944k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 15.9% 14.9% 15.5% 15.6% 15.7% 15.8% 15.7%
Absolute poverty, before housing costs: children 23.7% 20.9% 21.6% 21.4% 21.6% 21.8% 21.7%
Absolute poverty, before housing costs: working-age adults 13.8% 13.4% 14.0% 14.1% 14.2% 14.3% 14.3%
Absolute poverty, before housing costs: pensioners 13.7% 13.1% 13.2% 13.4% 13.5% 13.6% 13.6%
Absolute poverty, after housing costs: everyone 21.1% 20.6% 21.3% 21.5% 21.9% 22.2% 22.3%
Absolute poverty, after housing costs: children 32.1% 30.3% 30.9% 31.1% 31.7% 32.3% 32.5%
Absolute poverty, after housing costs: working-age adults 19.6% 19.4% 20.2% 20.4% 20.8% 21.0% 21.0%
Absolute poverty, after housing costs: pensioners 12.7% 12.5% 12.6% 12.9% 13.0% 13.1% 13.4%
Relative poverty, before housing costs: everyone 16.9% 16.4% 16.4% 16.5% 16.6% 16.7% 16.7%
Relative poverty, before housing costs: children 25.6% 23.5% 23.2% 23.2% 23.3% 23.4% 23.4%
Relative poverty, before housing costs: working-age adults 14.4% 14.4% 14.7% 14.8% 14.9% 15.1% 15.0%
Relative poverty, before housing costs: pensioners 14.8% 14.9% 14.1% 14.3% 14.2% 14.2% 14.4%
Relative poverty, after housing costs: everyone 21.7% 21.3% 21.4% 21.5% 21.7% 21.8% 22.0%
Relative poverty, after housing costs: children 33.0% 31.6% 31.2% 31.1% 31.5% 31.6% 32.0%
Relative poverty, after housing costs: working-age adults 20.0% 20.0% 20.3% 20.4% 20.6% 20.8% 20.9%
Relative poverty, after housing costs: pensioners 13.5% 13.1% 12.7% 12.8% 12.7% 12.7% 12.8%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,051k 10,427k 10,848k 10,947k 11,079k 11,209k 11,220k
Absolute poverty, before housing costs: children 3,560k 3,141k 3,261k 3,253k 3,298k 3,334k 3,335k
Absolute poverty, before housing costs: working-age adults 5,864k 5,737k 6,070k 6,165k 6,237k 6,315k 6,321k
Absolute poverty, before housing costs: pensioners 1,627k 1,549k 1,517k 1,529k 1,544k 1,561k 1,565k
Absolute poverty, after housing costs: everyone 14,659k 14,362k 14,899k 15,116k 15,444k 15,724k 15,870k
Absolute poverty, after housing costs: children 4,809k 4,556k 4,676k 4,719k 4,835k 4,939k 4,994k
Absolute poverty, after housing costs: working-age adults 8,333k 8,326k 8,775k 8,931k 9,122k 9,275k 9,329k
Absolute poverty, after housing costs: pensioners 1,518k 1,480k 1,449k 1,466k 1,487k 1,509k 1,547k
Relative poverty, before housing costs: everyone 11,760k 11,456k 11,504k 11,625k 11,706k 11,868k 11,916k
Relative poverty, before housing costs: children 3,840k 3,538k 3,514k 3,525k 3,546k 3,582k 3,603k
Relative poverty, before housing costs: working-age adults 6,154k 6,160k 6,365k 6,465k 6,537k 6,651k 6,652k
Relative poverty, before housing costs: pensioners 1,766k 1,758k 1,625k 1,634k 1,623k 1,634k 1,661k
Relative poverty, after housing costs: everyone 15,065k 14,863k 14,993k 15,090k 15,319k 15,490k 15,653k
Relative poverty, after housing costs: children 4,948k 4,756k 4,711k 4,715k 4,798k 4,840k 4,919k
Relative poverty, after housing costs: working-age adults 8,511k 8,559k 8,822k 8,917k 9,070k 9,192k 9,260k
Relative poverty, after housing costs: pensioners 1,605k 1,548k 1,460k 1,458k 1,452k 1,457k 1,475k
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0.3074 0.3051 0.3065 0.3071 0.3077 0.3083 0.3094
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household £17,707 † £17,997 † £17,941 † £17,992 † £18,326 † £18,523 † £18,684 †
Decile 2: mean household_net_income per household £28,362 † £29,049 † £28,672 † £29,013 † £29,373 † £29,779 † £30,332 †
Decile 3: mean household_net_income per household £34,607 † £35,886 † £36,508 † £37,008 † £37,263 † £37,824 † £38,511 †
Decile 4: mean household_net_income per household £39,329 † £40,908 † £41,807 † £42,695 † £43,186 † £43,984 † £45,129 †
Decile 5: mean household_net_income per household £44,871 † £46,147 † £47,077 † £47,609 † £48,379 † £49,251 † £50,073 †
Decile 6: mean household_net_income per household £47,930 † £49,324 † £50,272 † £51,070 † £52,170 † £52,939 † £54,222 †
Decile 7: mean household_net_income per household £56,320 † £57,578 † £58,469 † £59,414 † £60,124 † £61,607 † £63,192 †
Decile 8: mean household_net_income per household £69,250 † £70,361 † £71,635 † £72,869 † £74,327 † £75,790 † £77,563 †
Decile 9: mean household_net_income per household £79,686 † £82,010 † £83,245 † £84,446 † £86,085 † £87,570 † £90,640 †
Decile 10: mean household_net_income per household £117,623 † £120,464 † £122,413 † £124,563 † £126,773 † £129,082 † £131,885 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.22bn £6.50bn £6.71bn £6.90bn £7.11bn £7.35bn £7.62bn
Raise higher rate by 1pp £3.54bn £3.82bn £4.05bn £4.27bn £4.49bn £4.76bn £4.96bn
Raise personal allowance by ~800GBP/year £-3.83bn £-3.96bn £-4.03bn £-4.10bn £-4.20bn £-4.30bn £-2.02bn
Raise child benefit by 25GBP/week per additional child £-2.00bn £-1.76bn £-1.64bn £-1.54bn £-1.44bn £-1.34bn £-1.24bn
Reduce Universal Credit taper rate to 20% £-20.54bn £-21.09bn £-21.45bn £-21.87bn £-21.95bn £-22.32bn £-22.79bn
Raise Class 1 main employee NICs rate to 10% £11.06bn £11.51bn £11.83bn £12.14bn £12.47bn £12.81bn £13.29bn
Raise VAT standard rate by 2pp £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10% £-3.04bn £-3.17bn £-3.24bn £-3.32bn £-3.37bn £-3.42bn £-3.47bn
Raise the State Pension by 10% £-8.92bn £-9.13bn £-9.03bn £-9.06bn £-9.26bn £-9.51bn £-9.78bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.36bn £6.65bn £6.87bn £7.07bn £7.29bn £7.53bn £7.81bn
Raise higher rate by 1pp: change in income_tax £3.55bn £3.83bn £4.06bn £4.28bn £4.50bn £4.78bn £4.97bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.96bn £-4.11bn £-4.19bn £-4.27bn £-4.36bn £-4.47bn £-1.77bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.34bn £2.15bn £2.03bn £1.92bn £1.82bn £1.71bn £1.59bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.53bn £21.08bn £21.44bn £21.86bn £21.95bn £22.32bn £22.78bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.33bn £11.79bn £12.13bn £12.44bn £12.78bn £13.13bn £13.62bn
Raise VAT standard rate by 2pp: change in vat £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.04bn £3.17bn £3.25bn £3.32bn £3.37bn £3.43bn £3.47bn
Raise the State Pension by 10%: change in state_pension £12.25bn £12.71bn £12.83bn £13.02bn £13.41bn £13.80bn £14.21bn

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit a67aeb7 Oct 22, 2026
16 checks passed
@MaxGhenis
MaxGhenis deleted the council-tax-computed-liability branch October 22, 2026 01:18
@MaxGhenis

Copy link
Copy Markdown
Collaborator

Merged by the UK hub (session local_8e19f9d5, Opus 5.5) on Max's explicit instruction to merge the team's ready PRs before the Budget (21 October, about 23:00Z: "go ahead and merge them. none of us has time to wait on each other"). One merge-queue enqueue, pinned to head 442525297055e7b2b026023883875c29e0f4eb44.

  • Gates at this head: every check passes; GitHub reports MERGEABLE; not a draft; vahid-ahmadi, review decision APPROVED. The merge queue re-tests against current main.
  • Review: no independent agent review was run at this head before merging, on Max's instruction. Any finding after merge goes to a follow-up PR.
  • Budget: the Budget runs on a locked pe-uk release (microcosm#1333). This change reaches Budget-day numbers only if the lock moves to a release that contains it.

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci-recheck Re-triggers Fix evidence without changing the PR (UK hub, 2026-10-12)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants