Skip to content

Charge VAT on private school fees at current law - #2319

Merged
MaxGhenis merged 15 commits into
mainfrom
fix/private-school-vat-current-law
Oct 25, 2026
Merged

MaxGhenis merged 15 commits into
mainfrom
fix/private-school-vat-current-law

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 11, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2318

Private school fees have borne standard-rate VAT since 1 January 2025, but the model's contributed rate was zero at current law. This PR adds the statutory charge and separates it from receipt-calibrated general VAT, so government receipts count it once and no household's general VAT goes negative.

Statutory charge and incidence

  • Finance Act 2025 s.47 removes private school education, vocational training and closely related board/lodging from the VATA 1994 Schedule 9 education exemption. Section 49 applies the change to supplies from 1 January 2025.
  • gov.hmrc.vat.private_school_fees_exempt switches off on that date; the standard rate then applies. private_school_vat charges pupils × mean fee × effective VAT basis × max(statutory rate, contributed rate). Setting the contributed rate to 20% from 2025 produces no additional charge; 25% charges 25%.
  • gov_tax counts the level. household_tax counts private_school_vat_change, as it counts vat_change, preserving baseline household net income. Baseline policy is applied to this simulation's attendance and fee assumptions.

VAT receipts: the fees' share comes out of general VAT

The grossing factor (0.67 × 0.7 = 0.469) fits household VAT on consumption other than energy bills to OBR VAT receipts net of energy-bill VAT (#2189), and those receipts include VAT on private school fees. Counting private_school_vat on top would count that VAT twice. Let G be a household's grossed-up VAT on that consumption, E its VAT on energy bills (domestic_energy_vat, which is not grossed up), s private school fees' official share of VAT receipts, P0 the baseline school charge and P the current school charge:

vat          = G  × (1 − s) + E
baseline_vat = G0 × (1 − s) + E0
combined VAT = vat + P

E0 is baseline_domestic_energy_vat. The school share comes out of G only: energy bills bear no school fees, so an energy-VAT reform moves vat by exactly the change in E (main's test_extending_the_zero_rate_to_fy2027 asserts −50 exactly).

s is the new parameter gov.simulation.vat.private_school_share_of_receipts: HMRC's OBR-certified costing (Applying VAT to private school fees, Autumn Budget 2024 Table 5.1) over OBR cash-basis VAT receipts (March 2026 EFO, detailed forecast tables, table 3.8), by fiscal year from 1 April:

Fiscal year School-fee VAT VAT receipts s
2025-26 £1,505m £180,169m 0.8353%
2026-27 £1,560m £187,704m 0.8311%
2027-28 £1,610m £195,923m 0.8218%
2028-29 £1,665m £204,591m 0.8138%
2029-30 £1,725m £213,118m 0.8094% (held after)

It is zero for model year 2024, where private_school_vat is also zero (annual policy is read before the January 2025 commencement); the £460m part-year receipt stays in general VAT. vat and baseline_vat both read s from the simulation's own parameters, as baseline_private_school_vat reads its assumptions, so vat_change is exactly zero at baseline.

What this fixes

The reviewed head (4dcfa03c2) set vat = G − P0 × r / r0, subtracting each household's own school charge from its own VAT. A pupil with £10,000 fees and no recorded consumption had general VAT of −£2,000, and restoring the exemption left combined VAT at −£2,000. On the certified Enhanced FRS (policyengine-uk-data 1.58.1), measured locally before #2189's energy split, 549 households with non-negative gross VAT had negative general VAT in 2025-26 (306,750 weighted households, −£0.58bn), rising to 572 in 2030-31. With the share, vat is G × (1 − s) + E with 0 ≤ s < 1, so it is negative only where G or E is: no newly negative household. At 4f3522828 (run 40116746457) and at this head (run 40130442489), CI's sign check finds the same 76 households below zero on main and on this branch in every year from 2025-26 to 2031-32 (data#565's negative recorded consumption).

Why the official share (design a) rather than a population share (design b)

Both were implemented and measured.

  • (b) a share measured on each simulation's population, s = Σw·P0·(r/r0) / Σw·G, has precedent (shareholding, consumption_shareholding and corporate_land_value divide by weighted national totals). On the certified dataset, measured locally before Model the temporary 0% VAT on GB domestic electricity #2189's energy split, it preserved combined receipts to within £0.003m in 2024-25 to 2026-27. I rejected it because every household's VAT would then depend on the imputed attendance of every other household, and attendance is imputed from net income. Raising anyone's income tax, NI or council tax could move every household's VAT by G × Δs. The Aggregate impact counted-once check fails a head wherever such a response is one for one. It already fails vat in fewer than 10 households at the reviewed head (run 39830541074: counted_once:income_tax, :national_insurance, :council_tax), through the per-household subtraction. A household calculator would also measure its own school charge against its own VAT, which is the original defect, merely capped at zero.
  • (a) the official share keeps each household's VAT a function of its own consumption. vat no longer reads attendance or fees, so those three failures have no route, and the partition drops vat's attendance reads. Its cost is that current-law receipts are preserved only up to the share's accuracy: combined VAT changes by Σw·P0 − s·Σw·G.

Impact (CI Aggregate impact on the certified dataset)

Run 40130442489 at this head (8f205015d, merged with main d1cbf3d9d) against main d1cbf3d9d, on Enhanced FRS 2024-25, policyengine-uk-data 1.58.1 (sha256 056e80fd8e91…, the CI pin). Status pass, no failures. Aggregates only.

Fiscal year Main's vat (Σw·(G + E)) School charge Σw·P0 = repeal cost Combined VAT vs main
2025-26 £251.45bn £1.95bn −£133.6m (−0.053%)
2026-27 £257.40bn £2.00bn −£125.4m (−0.049%)
2027-28 £263.96bn £2.05bn −£102.0m (−0.039%)
2028-29 £270.05bn £2.10bn −£79.4m (−0.029%)
2029-30 £276.34bn £2.21bn −£4.1m (−0.001%)
2030-31 £282.83bn £2.21bn −£62.1m (−0.022%)
2031-32 £289.13bn £2.31bn −£5.8m (−0.002%)

Against run 40116746457 (head 4f3522828 against main 6fa9fb8f5), which the doc and the fiscal partition cite, every year is within £9m except 2030-31 (−£6.3m there). That year's school charge is £2.21bn here against £2.28bn there. This PR's commits since 4f3522828 change tests, docs and parameter metadata, not formulas or values, so the difference comes from main's commits between the two runs.

"Combined VAT vs main" is Σw(vat + private_school_vat) − main's Σw·vat = Σw·P0 − s·Σw·G. gov_tax and gov_balance move by the same amounts in every year. 2024-25 is unchanged (share and charge both zero).

  • Household net income, vat_change and private_school_vat_change are unchanged at current law (deltas of 0 in every year).
  • Repeal (restore gov.hmrc.vat.private_school_fees_exempt): vat is unchanged household by household and combined receipts fall by exactly the school charge (invariants 3 and 4, tested). Before the energy split, a local repeal run measured £1.95bn in 2025-26 rising to £2.28bn in 2030-31, equal to Σw·P0 to floating-point precision.
  • The school charge is above HMRC's £1.5–1.6bn costing because attendance is imputed for 751,000 weighted pupils in 2025-26 (data#568 tracks the imputation), not because of the split. The current-law residual is small because two overstatements nearly offset: VAT is 40% above OBR receipts on this dataset (£251.5bn against £180.2bn), and the school charge is 29% above HMRC's.
  • Checks: sign:private_school_vat passes. sign:vat fails on both sides with the same 76 households (pre-existing, data#565). The counted-once checks for vat, vat_change, private_school_vat and private_school_vat_change pass. sign: nonnegative stays on the vat head (main's setting).

Invariants (tested)

For any population, year from 2024 to 2030, fee, consumption, energy bills and weights, with the exemption at current law or restored (test_private_school_vat_receipts.py, including Hypothesis properties):

  1. Non-negative: vat ≥ 0 and vat + private_school_vat ≥ 0 wherever recorded consumption and energy bills are non-negative.
  2. Differential: vat = G × (1 − s) + E, with G recomputed from the inputs, s from the published costing and receipts, and E from the energy bills at the statutory electricity and gas rates, independently of the formula. A parameter test ties each share to its cited numbers.
  3. National identity: Σw(vat + P) = (1 − s)·Σw·G + Σw·E + Σw·P0 at current law. It equals Σw·(G + E) when the school charge is s of G (tested on a small weighted population built to that condition). Restoring the exemption lowers it by exactly Σw·P0.
  4. Once: school-specific reforms (exemption, contributed rate) leave vat unchanged household by household, including households with energy bills; vat does not read attendance or fees; vat_change is zero at baseline.
  5. Energy bills bear no school share: zero-rating domestic electricity moves vat by exactly the change in domestic_energy_vat and leaves private_school_vat unchanged (test_school_share_never_touches_energy_bill_vat). Standard-rate and grossing-factor reforms move general VAT by ΔG × (1 − s) and the school head on its own base.

The energy property fails both mutants the review tried, each run alone on it: (G + E) × (1 − s) in vat and baseline_vat fails the per-household differential, and baseline_vat reading domestic_energy_vat in place of baseline_domestic_energy_vat fails the zero-rating check.

Validation

Head 8f205015d. Local, foreground, -n 4 under nice, with the host gate held (load1 ≤ 110, ≥ 55 GB free):

  • test_private_school_vat_receipts.py, test_private_school_vat_properties.py, test_domestic_electricity_vat.py, test_vat_grossing_legacy.py and test_fiscal_partition.py: 167 passed (at c1882c2a9; the fiscal partition file again at this head, 41 passed).
  • policyengine-core test policyengine_uk/tests/policy/baseline/gov/hmrc -c policyengine_uk: 1,059 passed.
  • ruff format --check and ruff check pass on the changed files.

The full suite and Aggregate impact run in CI on this head.

Reproducer: policyengine_uk/tests/test_private_school_vat_receipts.py::test_a_pupil_with_no_recorded_consumption_has_no_negative_vat, policyengine_uk/tests/test_private_school_vat_receipts.py::test_vat_is_never_negative_and_receipts_are_counted_once, policyengine_uk/tests/test_private_school_vat_receipts.py::test_school_share_never_touches_energy_bill_vat, policyengine_uk/tests/policy/baseline/gov/hmrc/private_school_vat.yaml

Updated stack

Merged #2235 at 8c1b54dd9, preserving its corporate SDLT counted-once fix, then merged main. The only conflicts were in the fiscal partition: retained upstream schema, spending/uncovered-receipt rows and other guards, together with the school level/change heads. #2235 merged during that job; this PR therefore targets main.

Then merged main 6fa9fb8f5 after #2189 (4f3522828), resolving vat.py, baseline_vat.py, the coverage doc, the coverage parameter's metadata, the fiscal partition and the receipts tests to G × (1 − s) + E. The next two commits address the hub's review r4: the energy property test, a tighter published receipts check (0.1%), doc and metadata passages restated with E, and the vat head's negative-household note restated on 1.58.1.

Remaining limits

  • Attendance is still imputed over under-18s, without separating nursery classes, chargeable 18-year-olds or local-authority placements, and gives 751,000 weighted pupils on the certified dataset; policyengine-uk-data#568 tracks the imputation limits and lack of behavioural response.
  • The official share is not the model's own school charge as a share of the model's gross VAT, so current-law combined receipts differ from the pre-PR total by Σw·P0 − s·Σw·G (above). Recalibrating gross VAT (data#567) and attendance (data#568) shrinks that difference.
  • Annual model year 2024 does not separately identify January–March 2025 school VAT. Those part-year receipts remain in general VAT.
  • General VAT still uses blended consumption shares; the split reconciles receipts, not actual household fee expenditure within COICOP consumption.
  • Existing scorecard events that set the contributed rate to 20% need reverse-delta treatment once they adopt this model release.
  • The hub owns independent review at the final head; review r4 requested the changes now made.

axiom: TheAxiomFoundation/rulespec-uk#453 queued

The signed encoder is blocked on the Schedule 9/Finance Act provisions being added to its pinned corpus; #453 records the module, law, companion tests and blocker and is labelled pe-parity.

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits October 11, 2026 14:50
Finance Act 2025 s.47 takes private school education, vocational training
and closely related board and lodging out of the VATA 1994 Sch 9 Group 6
exemption, with effect for supplies on or after 1 January 2025 (s.49). The
new gov.hmrc.vat.private_school_fees_exempt parameter records the
exemption; when it is off the fees bear the standard rate. The contributed
reform rate now raises the rate instead of adding to it, so setting it
never charges the fees twice.

private_school_vat moves to variables/gov/hmrc. Household taxes include it
as a change from baseline (private_school_vat_change), as they do VAT;
government tax revenue includes the level.

Fixes #2318

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
private_school_vat is now non-zero at current law, so it leaves the
zero-at-baseline heads and stays in gov_tax only; household_tax sums the
new private_school_vat_change head, which is zero at baseline, with
baseline_private_school_vat as its baseline measure. A level-and-change
guard mirrors vat and vat_change. The vat overlap guard becomes a
disjointness property: vat's full-rate share was trained when the fees
were exempt, and neither head reads the other's inputs or parameters.

Adds Hypothesis properties: private_school_vat matches the statute
computed independently, a reform rate at or below the statutory rate never
taxes the fees twice, the head is monotone in both rates, vat and
private_school_vat are disjoint, and the level, baseline and change agree.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
baseline_private_school_vat now applies baseline policy (the exemption,
the standard rate and the reform rate) to this simulation's attendance,
mean fee and share of fees bearing VAT, so a reform that changes only those
assumptions (such as disabling economic assumptions, which moves the fee
uprating) is no longer scored as a household tax change. YAML cases now
compute the change and include reforms that raise and remove it; a grid
test checks the statutory rate exhaustively across the commencement, the
exemption, reform rates and standard rates. The exemption parameter starts
when VAT did (Finance Act 1972 Sch 5 Group 6), so no earlier lookup reads
as taxable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The vat guard becomes overlapping_base: the heads read separate inputs,
but vat applies one household share to all consumption including
education, so a fee-paying household's fees are charged at its blended
share, and in a household calculation education consumption entered as an
input is charged in both heads. On calibrated data the overlap is in
aggregate, because policyengine-uk-data targets vat at total OBR VAT
receipts (policyengine-uk-data#567). The partition header lists the guard
kinds and says data overlaps are recorded under their guards.

The identity property now draws households with a child at private school
and a scenario restoring the exemption, and checks the head is positive
exactly where a pupil's fees are charged. The changelog says contributed
reforms at 20% now score nothing from 2025.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the second independent review:
- The identity property always includes a household with a pupil, and
  under a restored exemption checks the head is zero and the change is
  minus the baseline charge exactly where a pupil's fees bore it.
- The grid's reference uses the statutory 20 per cent, not the model's
  parameter.
- The eligibility-reads guard says its check is vacuous for the private
  school heads on situations; the header says formula overlaps between
  heads with unseparated bases are recorded under their guards.
- private_school_vat notes that every imputed pupil is charged (nursery
  classes excepted by law, 18-year-olds chargeable), and the baseline notes
  it reads 1 January values where the level reads 30 April.

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

Copy link
Copy Markdown
Collaborator Author

Adoption hand-off for the UK hub:

  • Published head: 5440614f3625c590f57f7f08516ada361c8c0b8b, pushed once as a fast-forward from 22be892e5. Original author/history preserved. Merged Count corporate SDLT once and let SDLT abolition remove all of it #2235 at 8c1b54dd9 (23274dbb8), then main at fe0b99a36 (b0c73519e). The only conflicts were fiscal-partition metadata; upstream heads/schema and this PR's school-VAT changes were retained. Count corporate SDLT once and let SDLT abolition remove all of it #2235 has merged, so the base is main.
  • Prepared follow-up: 4dcfa03c2aa940ec1b12f3e41c05c48b797f672c is local, not pushed. It forms the scalar standard-rate ratio before multiplying the float32 school allocation, preventing a tiny nonzero baseline vat_change for fractional fees. It adds a regression case. The job's one-push limit has been used; an explicit exception for this additional fast-forward push is pending. Keep draft until that fix is published and validated.
  • Tests: uvx ruff format --check . passes (1,942 files), along with full-tree Ruff lint and F811/F821 checks, including the local follow-up. Targeted locked-env tests were held by the required host gate: disk stayed around 54–57 GB, below 60 GB, and load1 intermittently exceeded 110. No local venv install, pytest suite or microsimulation ran. Remote Code changes and Aggregate impact are still queued; there is no measured impact report yet.
  • VAT accounting and receipts check: general vat now nets out modeled baseline school VAT scaled by current/baseline standard rate before gov_tax adds the explicit school charge. At current law combined VAT equals the existing receipt-calibrated gross amount; ordinary standard-rate changes also count the school response once. The factor remains 0.67 × 0.7 = 0.469, fitted to combined receipts. Published rounded Microcosm inputs give £80.48bn / 0.469 = £171.599bn against OBR 2024-25 £170.994bn (+0.35%); this existing fit is preserved, rather than adding the official £1.56bn 2026-27 school-fee costing on top. This is an algebraic/published-aggregate check, not a fresh microsimulation. docs/engineering/vat-coverage.md explains the exact identity, part-year timing and dataset limitations.
  • Open items: authorize/publish the prepared rounding commit; obtain green full-suite CI and the measured Aggregate impact/VAT breakdown; mark ready only then; hub independent review at the final head. No in-job review was run. Existing nursery/18-year-old, local-authority-placement, behavior and dataset-fit limitations remain documented. Do not merge.

.job/RESOLUTIONS.md, .job/PROGRESS.md, .job/HANDOFF.md, handoffs.jsonl and recovery bundles are in the assigned workspace. Git metadata is workspace-local (source .job/env, then .job/git) because the original caller-owned Git metadata is sandbox read-only. The hub must salvage from that local Git directory or the bundles. .hypothesis/ and .job/uv-cache are deleted; no background process was started or left running.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base d1cbf3d9d8 against head 4fad40e178, 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: 14 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • This change edits the fiscal partition; review the partition diff alongside the moves it explains.
  • 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.
  • Change in private school VAT from its baseline (receipts.private_school_vat_change) is measured on the head only.

Moves flagged for review

Measure Year Base Head Change
VAT on private school fees 2031-32 £0.00bn £2.31bn +£2.31bn
VAT on private school fees 2029-30 £0.00bn £2.21bn +£2.21bn
VAT on private school fees 2030-31 £0.00bn £2.21bn +£2.21bn
VAT on private school fees 2028-29 £0.00bn £2.10bn +£2.10bn
VAT on private school fees 2027-28 £0.00bn £2.05bn +£2.05bn
VAT on private school fees 2026-27 £0.00bn £2.00bn +£2.00bn
VAT on private school fees 2025-26 £0.00bn £1.95bn +£1.95bn
VAT excluding private school fees 2025-26 £251.45bn £249.37bn -£2.08bn
VAT excluding private school fees 2026-27 £257.40bn £255.28bn -£2.12bn
VAT excluding private school fees 2027-28 £263.96bn £261.81bn -£2.15bn
VAT excluding private school fees 2028-29 £270.05bn £267.87bn -£2.18bn
VAT excluding private school fees 2031-32 £289.13bn £286.81bn -£2.32bn
VAT excluding private school fees 2030-31 £282.83bn £280.56bn -£2.27bn
VAT excluding private school fees 2029-30 £276.34bn £274.12bn -£2.22bn

Receipts by tax head

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
VAT excluding private school fees -£2.08bn -£2.12bn -£2.15bn -£2.18bn -£2.22bn -£2.27bn -£2.32bn
VAT on private school fees +£1.95bn +£2.00bn +£2.05bn +£2.10bn +£2.21bn +£2.21bn +£2.31bn
Change in private school VAT from its baseline (new: head levels) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn

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

Government balance, each component counted once

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once -£133.6m -£125.4m -£102.0m -£79.4m -£4.1m -£62.1m -£5.8m
Government balance, each receipt once -£133.6m † -£125.4m † -£102.0m † -£79.4m † -£4.1m † -£62.1m † -£5.8m †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax -£133.6m -£125.4m -£102.0m -£79.4m -£4.1m -£62.1m -£5.8m
gov_balance -£133.6m † -£125.4m † -£102.0m † -£79.4m † -£4.1m † -£62.1m † -£5.8m †

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp -£0.5m -£2.4m +£2.2m -£2.8m -£2.4m +£75.4m -£0.9m
Raise higher rate by 1pp -£0.7m +£0.9m -£1.4m -£4.8m -£5.9m +£55.8m -£1.7m
Raise personal allowance by ~800GBP/year +£4.3m -£3.5m +£0.5m -£3.8m -£0.1m +£57.0m -£1.9m
Raise child benefit by 25GBP/week per additional child +£0.4m -£0.2m +£19.9m +£14.8m +£21.0m +£21.9m +£36.5m
Reduce Universal Credit taper rate to 20% +£12.7m -£0.3m -£1.0m +£63.3m +£5.3m +£57.2m +£16.7m
Raise Class 1 main employee NICs rate to 10% -£1.0m -£44.4m +£2.0m -£2.5m -£39.1m +£17.6m -£60.5m
Raise VAT standard rate by 2pp -£13.4m -£12.5m -£10.2m -£7.9m -£0.4m -£6.2m -£0.6m
Raise additional rate by 3pp -£0.3m +£0.9m -£0.3m -£3.2m -£9.8m suppressed suppressed
Raise the Universal Credit standard allowance by 10% -£0.5m -£1.0m -£0.7m +£16.8m +£21.0m +£20.7m +£33.6m
Raise the State Pension by 10% -£11.9m -£8.2m -£2.7m -£2.1m -£55.6m +£0.4m -£59.9m

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise VAT standard rate by 2pp: change in vat -£208.0m -£212.5m -£214.9m -£217.8m -£221.7m -£226.9m -£232.0m
Raise additional rate by 3pp: change in income_tax 0 0 0 0 0 suppressed suppressed

Household net income by decile

No household's net income changes in any year.

No change in any year: household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles.

Checks failing on both base and head (1)
  • VAT excluding private school fees is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-53,889,156 in total; 2026-27: 76 units below zero, a weighted £-55,420,387 in total; 2027-28: 76 units below zero, a weighted £-56,618,038 in total
Counted-once check

Each of 88 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.

  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; gov_spending; not a failure)
  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; household_benefits; not a failure)
Provenance
Side Commit Runtime Environment hash Partition hash Time
base main d1cbf3d9d8 uk 2.155.0 (files 054b513bde33), core 3.33.2, py 3.13.17 aarch64 f3ccadd18308 06ff679de152 1698.84s
head #2319 merged into main 4fad40e178 uk 2.155.0 (files 8b3e68427c60), core 3.33.2, py 3.13.17 aarch64 f3ccadd18308 5a120bf829f9 1726.54s

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 £298.41bn £318.00bn £335.26bn £350.17bn £365.42bn £383.13bn £400.61bn
National Insurance (employee and self-employed) £52.37bn £54.71bn £56.48bn £58.15bn £60.22bn £62.11bn £64.44bn
National Insurance (employer) £152.00bn £158.47bn £163.28bn £167.71bn £174.87bn £180.28bn £187.05bn
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.61bn £13.05bn £13.53bn £14.02bn £14.52bn £15.05bn £15.58bn
Student loan repayments £7.79bn £8.09bn £8.31bn £8.51bn £8.72bn £8.97bn £9.28bn
VAT excluding private school fees £249.37bn £255.28bn £261.81bn £267.87bn £274.12bn £280.56bn £286.81bn
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 £1.95bn £2.00bn £2.05bn £2.10bn £2.21bn £2.21bn £2.31bn
Change in private school VAT from its baseline £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
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.41bn £4.42bn £4.44bn £4.45bn £4.47bn £4.48bn
Council tax £49.21bn £51.88bn £54.97bn £58.29bn £61.55bn £64.92bn £68.49bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.50bn £0.51bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.60bn £0.63bn £0.66bn £0.69bn £0.72bn
Business rates £34.68bn £38.04bn £38.88bn £39.76bn £43.07bn £43.13bn £44.57bn
Stamp duty land tax on the household's own purchases £6.90bn £7.39bn £7.81bn £8.21bn £8.62bn £9.02bn £9.42bn
Stamp duty land tax paid by companies £4.81bn £5.98bn £6.73bn £7.46bn £8.21bn £8.87bn £9.16bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.09bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.34bn £0.35bn £0.37bn £0.38bn £0.40bn
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 £121.64bn £126.07bn £127.08bn £128.87bn £132.52bn £136.31bn £140.08bn
Pension Credit £6.66bn £7.04bn £7.32bn £7.46bn £7.60bn £7.77bn £7.94bn
Winter Fuel Payment £1.69bn £1.67bn £1.58bn £1.56bn £1.56bn £1.54bn £1.51bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.21bn £80.38bn £82.93bn £84.23bn £85.58bn £86.87bn £87.97bn
Housing Benefit £8.55bn £8.89bn £9.17bn £9.31bn £9.57bn £9.83bn £10.10bn
Council Tax Reduction £1.98bn £2.02bn £2.07bn £2.11bn £2.16bn £2.21bn £2.25bn
Employment and Support Allowance (income-related) £0.79bn £0.81bn £0.83bn £0.85bn £0.86bn £0.89bn £0.90bn
Employment and Support Allowance (contribution-based) £5.20bn £5.34bn £5.46bn £5.59bn £5.72bn £5.85bn £5.99bn
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.32bn £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 £26.94bn £28.06bn £29.13bn £29.83bn £30.54bn £31.26bn £31.96bn
Disability Living Allowance £7.49bn £7.80bn £8.10bn £8.29bn £8.49bn £8.69bn £8.88bn
Attendance Allowance £8.68bn £9.04bn £9.38bn £9.61bn £9.83bn £10.07bn £10.29bn
Carer's Allowance £4.48bn £4.67bn £4.84bn £4.96bn £5.08bn £5.19bn £5.31bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.33bn £0.34bn £0.35bn £0.36bn £0.37bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.50bn £0.52bn £0.53bn £0.54bn £0.55bn £0.57bn £0.58bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.68bn £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.16bn £16.83bn £17.43bn £17.85bn £18.26bn £18.69bn £19.10bn
Scottish Child Payment £0.49bn £0.52bn £0.54bn £0.55bn £0.56bn £0.57bn £0.56bn
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.30bn £3.39bn £3.47bn £3.55bn £3.63bn £3.72bn £3.80bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.15bn £1.18bn £1.21bn £1.24bn £1.27bn £1.29bn
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.73bn £0.75bn £0.77bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.59bn £0.61bn £0.59bn
Extended childcare entitlement £2.76bn £3.25bn £3.35bn £3.41bn £3.50bn £3.58bn £3.67bn
Universal childcare entitlement £2.25bn £2.44bn £2.50bn £2.56bn £2.63bn £2.70bn £2.76bn
Targeted childcare entitlement £0.47bn £0.49bn £0.49bn £0.51bn £0.52bn £0.53bn £0.47bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.30bn £0.31bn
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 £203.83bn £204.54bn £205.13bn £205.79bn £206.49bn £207.23bn £207.73bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.13bn £25.21bn £25.29bn £25.37bn £25.46bn £25.53bn
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,261k 11,158k 10,849k 10,746k 10,783k 10,822k 10,848k
Pension Credit 1,485k 1,483k 1,480k 1,461k 1,462k 1,464k 1,460k
Winter Fuel Payment 7,061k 6,979k 6,565k 6,472k 6,446k 6,328k 6,184k
Pension Age Winter Heating Payment (Scotland) 803k 803k 803k 800k 803k 806k 808k
Universal Credit 6,334k 6,341k 6,366k 6,347k 6,345k 6,333k 6,298k
Housing Benefit 1,249k 1,247k 1,250k 1,234k 1,238k 1,240k 1,239k
Council Tax Reduction 3,174k 3,198k 3,208k 3,228k 3,243k 3,256k 3,263k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 72k 72k
Employment and Support Allowance (contribution-based) 719k 721k 723k 726k 728k 731k 732k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 68k 68k 68k 68k
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,566k 3,579k 3,589k 3,601k 3,613k 3,626k 3,635k
Disability Living Allowance 1,291k 1,295k 1,299k 1,303k 1,308k 1,312k 1,316k
Attendance Allowance 1,694k 1,700k 1,705k 1,711k 1,716k 1,723k 1,727k
Carer's Allowance 1,034k 1,038k 1,041k 1,044k 1,048k 1,051k 1,053k
Carer Support Payment (Scotland) 71k 71k 72k 72k 72k 72k 73k
Carer's Allowance Supplement (Scotland) 0k 71k 72k 72k 72k 72k 73k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 138k 138k 139k 139k 140k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 95k 95k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,102k 8,128k 8,142k 8,165k 8,191k 8,216k 8,232k
Scottish Child Payment 350k 352k 353k 357k 354k 355k 342k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 199k 200k 201k 201k 202k 203k 203k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 332k 334k 335k 336k 337k 338k 339k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 183k 183k 184k 185k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 27k 27k
Bereavement Support Payment 98k 98k 98k 99k 99k 99k 100k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,014k 1,024k 1,024k 1,027k 1,027k 1,031k 1,013k
Extended childcare entitlement 715k 722k 725k 727k 733k 735k 736k
Universal childcare entitlement 982k 985k 987k 991k 996k 1,004k 1,005k
Targeted childcare entitlement 98k 97k 95k 95k 96k 96k 84k
Childcare Offer for Wales 39k 39k 39k 39k 39k 39k 39k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 98k 99k 99k 99k 100k 100k
Adult Dependants' Grant 18k 18k 12k 12k 12k 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.83bn £942.92bn £981.18bn £1,014.94bn £1,054.03bn £1,090.17bn £1,130.30bn
Government spending £528.63bn † £543.42bn † £551.15bn † £557.43bn † £565.84bn † £574.45bn † £582.36bn †
Government balance, each receipt once £371.20bn † £399.49bn † £430.03bn † £457.51bn † £488.19bn † £515.72bn † £547.94bn †
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 £899.83bn £942.92bn £981.18bn £1,014.94bn £1,054.03bn £1,090.17bn £1,130.30bn
household_tax £496.50bn £527.17bn £554.05bn £577.26bn £602.82bn £627.12bn £654.13bn
pre_budget_change_household_tax £488.71bn £519.08bn £545.75bn £568.28bn £593.61bn £617.65bn £644.33bn
gov_spending £528.63bn † £543.42bn † £551.15bn † £557.43bn † £565.84bn † £574.45bn † £582.36bn †
household_benefits £528.63bn † £543.42bn † £551.15bn † £557.43bn † £565.84bn † £574.45bn † £582.36bn †
gov_balance £371.20bn † £399.49bn † £430.03bn † £457.51bn † £488.19bn † £515.72bn † £547.94bn †
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,651.49bn £1,713.03bn £1,764.05bn £1,812.97bn £1,862.19bn £1,918.39bn £1,985.28bn
Household net income £1,644.51bn † £1,688.72bn † £1,719.48bn † £1,750.46bn † £1,781.44bn † £1,820.74bn † £1,866.93bn †
Household net income (HBAI definition) £1,457.74bn £1,504.86bn £1,537.87bn £1,569.56bn £1,602.79bn £1,640.51bn £1,686.67bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,224k 69,466k 69,668k 69,891k 70,128k 70,381k 70,550k
Benefit units 35,100k 35,223k 35,325k 35,438k 35,558k 35,686k 35,772k
Households 31,037k 31,145k 31,236k 31,336k 31,442k 31,555k 31,631k
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 16.0% 15.1% 15.5% 15.6% 15.7% 15.7% 15.8%
Absolute poverty, before housing costs: children 24.0% 21.1% 21.5% 21.5% 21.7% 21.7% 21.8%
Absolute poverty, before housing costs: working-age adults 13.8% 13.5% 14.0% 14.1% 14.2% 14.2% 14.3%
Absolute poverty, before housing costs: pensioners 13.6% 13.2% 13.1% 13.4% 13.5% 13.5% 13.5%
Absolute poverty, after housing costs: everyone 21.4% 20.8% 21.2% 21.5% 21.8% 21.9% 22.2%
Absolute poverty, after housing costs: children 33.0% 30.7% 31.0% 31.1% 31.4% 31.7% 32.3%
Absolute poverty, after housing costs: working-age adults 19.8% 19.6% 20.2% 20.5% 20.7% 20.9% 21.1%
Absolute poverty, after housing costs: pensioners 12.7% 12.3% 12.3% 12.5% 12.9% 12.9% 13.0%
Relative poverty, before housing costs: everyone 17.2% 16.4% 16.5% 16.4% 16.3% 16.4% 16.6%
Relative poverty, before housing costs: children 26.2% 23.5% 23.4% 23.1% 22.8% 23.0% 23.3%
Relative poverty, before housing costs: working-age adults 14.6% 14.3% 14.7% 14.7% 14.6% 14.7% 14.9%
Relative poverty, before housing costs: pensioners 15.0% 14.8% 14.1% 14.1% 14.0% 14.0% 14.2%
Relative poverty, after housing costs: everyone 21.6% 21.0% 21.2% 21.2% 21.3% 21.4% 21.8%
Relative poverty, after housing costs: children 33.2% 31.2% 30.9% 30.7% 31.0% 31.0% 31.5%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.1% 20.3% 20.4% 20.5% 20.7%
Relative poverty, after housing costs: pensioners 12.9% 12.4% 12.1% 11.9% 11.8% 11.9% 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,042k 10,465k 10,769k 10,890k 10,993k 11,057k 11,136k
Absolute poverty, before housing costs: children 3,579k 3,171k 3,230k 3,240k 3,280k 3,300k 3,324k
Absolute poverty, before housing costs: working-age adults 5,846k 5,744k 6,034k 6,134k 6,183k 6,218k 6,267k
Absolute poverty, before housing costs: pensioners 1,617k 1,550k 1,504k 1,517k 1,530k 1,539k 1,546k
Absolute poverty, after housing costs: everyone 14,840k 14,418k 14,804k 15,005k 15,265k 15,431k 15,663k
Absolute poverty, after housing costs: children 4,937k 4,609k 4,667k 4,687k 4,755k 4,820k 4,919k
Absolute poverty, after housing costs: working-age adults 8,401k 8,356k 8,734k 8,907k 9,048k 9,135k 9,257k
Absolute poverty, after housing costs: pensioners 1,503k 1,453k 1,404k 1,412k 1,461k 1,476k 1,487k
Relative poverty, before housing costs: everyone 11,890k 11,390k 11,463k 11,486k 11,426k 11,531k 11,707k
Relative poverty, before housing costs: children 3,915k 3,517k 3,517k 3,489k 3,449k 3,491k 3,549k
Relative poverty, before housing costs: working-age adults 6,197k 6,128k 6,335k 6,400k 6,388k 6,442k 6,537k
Relative poverty, before housing costs: pensioners 1,777k 1,744k 1,611k 1,597k 1,588k 1,598k 1,621k
Relative poverty, after housing costs: everyone 14,943k 14,586k 14,741k 14,809k 14,944k 15,039k 15,355k
Relative poverty, after housing costs: children 4,967k 4,674k 4,650k 4,630k 4,688k 4,712k 4,792k
Relative poverty, after housing costs: working-age adults 8,441k 8,448k 8,700k 8,836k 8,913k 8,976k 9,102k
Relative poverty, after housing costs: pensioners 1,535k 1,464k 1,391k 1,342k 1,343k 1,352k 1,460k
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.3085 0.3058 0.3065 0.3071 0.3076 0.3082 0.3096
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,769 † £17,866 † £17,838 † £17,887 † £18,174 † £18,309 † £18,446 †
Decile 2: mean household_net_income per household £27,979 † £28,847 † £28,638 † £28,880 † £29,095 † £29,614 † £30,130 †
Decile 3: mean household_net_income per household £34,362 † £35,449 † £35,981 † £36,489 † £36,760 † £37,291 † £38,112 †
Decile 4: mean household_net_income per household £39,269 † £40,695 † £41,909 † £42,378 † £43,105 † £43,923 † £44,173 †
Decile 5: mean household_net_income per household £43,314 † £44,625 † £45,559 † £46,288 † £47,354 † £48,261 † £49,593 †
Decile 6: mean household_net_income per household £48,195 † £49,500 † £50,754 † £51,500 † £52,202 † £53,162 † £54,294 †
Decile 7: mean household_net_income per household £56,164 † £57,176 † £57,763 † £58,419 † £58,909 † £59,958 † £61,826 †
Decile 8: mean household_net_income per household £69,144 † £70,966 † £71,797 † £73,236 † £74,250 † £75,671 † £77,435 †
Decile 9: mean household_net_income per household £79,644 † £81,041 † £82,857 † £84,156 † £85,561 † £87,071 † £89,924 †
Decile 10: mean household_net_income per household £117,592 † £120,304 † £122,094 † £124,173 † £126,053 † £128,344 † £131,114 †
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.19bn £6.47bn £6.67bn £6.86bn £7.06bn £7.37bn £7.55bn
Raise higher rate by 1pp £3.52bn £3.81bn £4.03bn £4.24bn £4.46bn £4.78bn £4.91bn
Raise personal allowance by ~800GBP/year £-3.81bn £-3.94bn £-4.01bn £-4.09bn £-4.18bn £-4.18bn £-2.00bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.56bn £-1.46bn £-1.35bn £-1.24bn £-1.12bn
Reduce Universal Credit taper rate to 20% £-20.39bn £-20.96bn £-21.38bn £-21.57bn £-21.87bn £-22.17bn £-22.60bn
Raise Class 1 main employee NICs rate to 10% £11.02bn £11.42bn £11.78bn £12.07bn £12.37bn £12.75bn £13.04bn
Raise VAT standard rate by 2pp £24.89bn £25.55bn £26.14bn £26.75bn £27.39bn £28.03bn £28.66bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.26bn £3.46bn £3.65bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.02bn £-3.15bn £-3.26bn £-3.30bn £-3.34bn £-3.39bn £-3.44bn
Raise the State Pension by 10% £-7.79bn £-8.02bn £-8.02bn £-8.12bn £-8.42bn £-8.53bn £-8.93bn
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.33bn £6.62bn £6.83bn £7.03bn £7.24bn £7.47bn £7.73bn
Raise higher rate by 1pp: change in income_tax £3.53bn £3.81bn £4.04bn £4.25bn £4.47bn £4.74bn £4.93bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.95bn £-4.08bn £-4.17bn £-4.24bn £-4.34bn £-4.41bn £-1.76bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.95bn £1.84bn £1.73bn £1.62bn £1.50bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.39bn £20.95bn £21.37bn £21.62bn £21.87bn £22.22bn £22.61bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.28bn £11.74bn £12.06bn £12.37bn £12.69bn £13.03bn £13.49bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.35bn £25.94bn £26.54bn £27.17bn £27.81bn £28.43bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.06bn £3.26bn £3.46bn £3.66bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.02bn £3.15bn £3.26bn £3.32bn £3.39bn £3.44bn £3.48bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.18bn £11.31bn £11.55bn £12.00bn £12.44bn £12.94bn

vat subtracted each household's own baseline school charge from its own
grossed-up VAT, so a pupil with little recorded consumption had negative
general VAT (-2,000 for one pupil, 10,000 fees and no consumption), and
restoring the exemption left it there. On the certified Enhanced FRS that
made 549 households' general VAT negative in 2025-26.

General VAT is now gross VAT times one less private school fees' official
share of VAT receipts (new gov.simulation.vat.private_school_share_of_receipts:
HMRC's OBR-certified costing over OBR March 2026 cash-basis VAT receipts).
It keeps the sign of gross VAT, reads neither attendance nor fees, and
school-specific reforms move only private_school_vat. A repeal lowers
receipts by exactly the weighted school charge. Current-law combined
receipts change by the weighted school charge less the share of weighted
gross VAT (-£0.17bn in 2025-26 on the certified dataset).

The fiscal partition drops vat's attendance reads and restores
sign: nonnegative on the vat head.

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

Copy link
Copy Markdown
Collaborator Author

Hand-off for the UK hub (P1 fix from REVIEW_2319.md, reviewed head 4dcfa03c2):

  • Head: 7ed18347cfe23c559a5eabb0609d235ae4e2fa91, one commit on top of 4dcfa03c2 (fast-forward push, no force; original history kept).
  • Fix: vat = G × (1 − s) and baseline_vat = G0 × (1 − s), where s is the new gov.simulation.vat.private_school_share_of_receipts: HMRC's OBR-certified school-fee VAT costing over OBR March 2026 cash-basis VAT receipts (0.8353% in 2025-26 to 0.8094% in 2029-30, zero before). vat keeps the sign of gross VAT and reads neither attendance nor fees. The partition drops vat's attendance reads and restores sign: nonnegative. The PR body explains why this beats a population-measured share. That design was implemented and measured as exact, but would make every household's VAT depend on everyone's imputed attendance, the route behind the three counted_once failures in run 39830541074.
  • Measured locally on the certified Enhanced FRS 1.58.1 (aggregates only): newly negative vat households fall from 549 (2025-26) to 572 (2030-31) at 4dcfa03c2 to 0 in every year, at baseline and under repeal. Repeal (restore private_school_fees_exempt) lowers receipts by exactly Σw·P0: £1.95bn in 2025-26 to £2.28bn in 2030-31. Current-law combined VAT vs main: −£0.17bn (2025-26), −£0.16bn, −£0.13bn, −£0.11bn, −£0.04bn, −£0.04bn (2030-31). vat_change is 0 at baseline.
  • Tests (local, -n 2, foreground, gate held): focused YAML 21 passed; test_private_school_vat_receipts.py + test_vat_grossing_legacy.py 40 passed; test_fiscal_partition.py, test_aggregate_impact_partition.py, test_private_school_vat_properties.py, test_scenario_baseline_parameters.py, test_dated_reform_routes.py::test_baseline_vat_is_current_law_on_every_route 125 passed, 1 skipped (microsimulation-marked, no dataset env var). ruff format --check . and ruff check . pass.
  • Pending: CI on this head (Aggregate impact should clear the three counted_once failures, and should report sign:vat as failing on both sides for the 76 data#565 households). Then the hub's GPT-6.1 Sol review. Not run in-job, per adopt-common.
  • Open item: the repeal cost exceeds HMRC's £1.505bn because attendance is imputed for 751,000 weighted pupils (policyengine-uk-data#568), not because of the split.
  • Still a draft; not merged or marked ready.

MaxGhenis and others added 2 commits October 23, 2026 04:31
The share's denominators are OBR March 2026 receipts sheet 3.8, row 13,
E13:I13; record the cells and the workbook's SHA-256 so the values can be
reproduced. Also correct three passages that still said the two VAT heads
sum exactly to the gross amount: they match it to within the share's
accuracy (at most 0.07% below on Enhanced FRS 1.58.1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 23, 2026 11:30
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 23, 2026
vahid-ahmadi added a commit that referenced this pull request Oct 23, 2026
CI at 9bbcef8 failed test_head_totals_agree_with_the_model_weighted_sums:
receipts plus double counts were GBP 2,646 (2.8e-9) off gov_tax on GBP 935bn,
against a GBP 935 tolerance. Merge-queue groups containing #2319 fail the same
assertion (GBP 994 on GBP 939bn), so it is rounding, not a missing head.
rel=1e-8 still catches any head above about GBP 9,000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 24, 2026
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 24, 2026
#2189 adds VAT on household energy bills after grossing, and derives the
survey coverage against receipts net of it. Private school fees' share of
receipts now comes out of the grossed-up amount on other consumption only:
vat = G x (1 - s) + E. Energy bills bear no school fees, and a reform to
energy VAT moves vat by exactly the change in energy VAT.

The doc places #2189's energy section before the private school section,
which now defines E and restates the identity with it. Figures measured
before the split are labelled as such. The published receipts check uses
the split inputs, and a new test checks that energy-bill VAT carries no
school share.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis removed this pull request from the merge queue due to a manual request Oct 24, 2026
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged main (with #2189's energy split) at 4f3522828; the queue had marked the PR unmergeable. Five conflicts, one of them semantic:

  • vat.py / baseline_vat.py: G x (1 - s) + E. Private school fees' share of receipts comes out of the grossed-up amount on other consumption only. Energy-bill VAT is not grossed up and bears no school fees, so an energy-VAT reform moves vat by exactly the change in domestic_energy_vat (main's zero-rate extension test asserts −50 exactly, which (G + E) x (1 - s) would fail).
  • docs/engineering/vat-coverage.md: Model the temporary 0% VAT on GB domestic electricity #2189's energy section now comes before the private school section, which defines E and restates the identity with it. s is a share of total receipts while G is calibrated net of energy VAT. On f9d1922c in 2025-26 that removes about £17m less than the costing (0.8353% of main's £2.01bn; arithmetic, not a run). Figures measured before the split are labelled as such.
  • survey_consumption_coverage.yaml metadata and the vat head's data_note.
  • Tests: the published receipts check uses the split inputs (79.23 / 0.469 + 1.99), and a new test checks that energy-bill VAT carries no school share.

Locally: 163 pytest passed (1 skipped) across the private school, VAT legacy, domestic electricity, fiscal partition and code-sharing files, and 1,164 YAML passed on gov/hmrc and reforms. A delta review of the composition is running; the impact section will be refreshed from CI's Aggregate impact at this head before re-queuing.

MaxGhenis and others added 2 commits October 24, 2026 16:30
- Add test_school_share_never_touches_energy_bill_vat: households with
  electricity and gas bills across GB and Northern Ireland, 2024-2030.
  It checks vat = G x (1 - s) + E with E from the statutory rates, that
  restoring the exemption leaves vat unchanged, that zero-rating
  electricity moves vat by exactly the change in domestic_energy_vat and
  leaves private_school_vat unchanged, and the national identity with E.
- Tighten the published receipts check to 0.1%.
- Restate the doc, the share and coverage parameter metadata, the fiscal
  partition note, the vat documentation and the test docstrings with E,
  and replace pre-split figures with CI run 40116746457 at 4f35228.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r4's N6: the data_note measured 76 negative households on
policyengine-uk-data 1.58.0 (-£72m in 2026). CI's Aggregate impact run
40116746457 on 1.58.1 finds 76 in every year from 2025 to 2031, -£55.7m
weighted in 2026. The 1.58.0 cause breakdown is kept and labelled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit ddcac74 Oct 25, 2026
20 of 21 checks passed
@MaxGhenis
MaxGhenis deleted the fix/private-school-vat-current-law branch October 25, 2026 02:00
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged by the UK hub (Claude session 8e19f9d5) at head 8f205015d, through the merge queue with the head pinned.

  • What it fixes: VAT on private school fees has been current law since 1 January 2025, but main modelled it as £0. This PR charges it as its own head, private_school_vat, and takes school-fee VAT's official share out of general VAT, because the survey coverage factor is fitted to total receipts that already include it.
  • Reviews:
    • Rounds 1 to 3 (GPT-6.1 Sol):
      • Round 1, at 4dcfa03c2: P1. Subtracting each household's own school charge left about 550 households with negative general VAT.
      • Round 2, at 7ed18347c: approved the share design.
      • Round 3: APPROVE at d4a4ccf2f, after reproducing every share from the OBR March 2026 receipts workbook (SHA-256 f65b6cb7…).
    • Round 4 (Opus 5.5, in session; the Codex lanes were on hold): at 4f3522828, the merge of main after Model the temporary 0% VAT on GB domestic electricity #2189's energy-bill split. It approved the composition vat = G × (1 − s) + E, where the school share comes out of the grossed-up non-energy amount only. It requested four text and metadata fixes and an energy-bill property test.
    • Round 5 (Opus 5.5, in session): APPROVE at 8f205015d. It confirmed each fix with file and line, and confirmed that every figure matches CI run 40116746457. It checked the SI 2026/987 electricity blend against the made instrument. It re-ran both mutants under an RSS cap, and the new property kills both: (G + E)(1 − s), and baseline_vat reading current-law energy VAT. Its optional notes are below as follow-ups.
  • The hub's changes since round 3:
  • CI: all 19 checks pass at this head, and the PR is mergeable. The merge queue re-runs the full suite against current main.
  • Impact (Aggregate impact run 40130442489, this head against main d1cbf3d9d, certified Enhanced FRS 1.58.1):
    • Combined VAT changes by −£133.6m in 2025-26, −£62.1m in 2030-31 and −£5.8m in 2031-32, at most 0.053% of VAT.
    • Household net income, vat_change and private_school_vat_change are unchanged at current law.
    • The counted-once checks for VAT, the school charge and both change heads pass. sign:vat fails on both sides with the same 76 households (pre-existing, data#565).
    • A repeal costs the weighted school charge: £1.95bn in 2025-26, above HMRC's £1.5bn because attendance is over-imputed (policyengine-uk-data#568).
  • Follow-ups (optional review notes):
    • Add a 2026 @example to the energy property: the fixed seed never draws 2026, although the reviewer ran that year directly and it passes.
    • Widen two "tested" claims: invariant 3's special case is tested without energy bills.
  • Why now: current law for the Budget baseline on Mon 26 Oct, and part of the stack the Budget coordinator asked to land before the final cut. Max asked on 22 Oct to clear the UK PR backlog.

MaxGhenis added a commit that referenced this pull request Oct 25, 2026
docs/engineering/vat-coverage.md conflicted because both sides added a
section after "Energy bills are not grossed up". Both are kept: main's
private school split first, since it describes the current formula, then the
later-cuts record. vat_grossing.yaml merged cleanly; the 2024 case is
unaffected because the school-fee share is zero in model year 2024.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

Private school VAT is £0 at current law although fees bear VAT from 1 January 2025

1 participant