Skip to content

Gate supplied UC latent deduction rates on uc_has_deduction - #2760

Open
MaxGhenis wants to merge 5 commits into
mainfrom
fix-2739-uc-deduction-flag
Open

MaxGhenis wants to merge 5 commits into
mainfrom
fix-2739-uc-deduction-flag

Conversation

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Fixes #2739

What and why

The bug. uc_latent_deduction_rate's formula returns zero where uc_has_deduction is false. uc_deduction_rate and the advance estimate read the latent rate itself, so a rate that a dataset or situation supplies skipped the flag. In the issue's example, an 85% protected floor gave £720.25 of deductions to a family whose flag was false.

The fix (option 1). A new helper, assigned_latent_deduction_rate in _deduction_amounts.py, returns the latent rate where uc_has_deduction is true and zero elsewhere. uc_deduction_rate reads it for the capped part and for the above-cap excess, and the advance estimate reads it too. A supplied rate now follows the formula's rule. Two explicit inputs still apply whatever the flag says, because each describes a known deduction rather than a draw from the distribution:

  • uc_advance_repayment_amount, whose documented override (zero included) this keeps;
  • uc_deduction_rate itself.

The code supports option 1:

  • Microcosm. Its deduction writer (packages/microcosm-build/src/microcosm/build/uk_runtime/uc_deduction_attributes.py, Microcosm origin/main at 98aef7529) stores four columns: the two draws, uc_latent_deduction_rate and uc_deduction_combination. It writes a rate only where the incidence draw falls below the region's incidence (rates = np.where(assigned, rates, 0.0)). It stores no uc_has_deduction, so policyengine-uk computes the flag from the stored draw. The gate changes no deduction on such a dataset, under current law or a floor (differential below).
  • uk-data. Its origin/main (e1acdf96) mentions none of the deduction inputs (the two draws, the flag, the latent rate, the combination and the advance amount), so the Enhanced FRS takes the formula path. The gate leaves that path unchanged under current law.

The flag under a protected floor: changed, with no change under current law. uc_has_deduction read the award left after the gross benefit cap. Under a floor, allocate_uc_reductions meets deductions first from the award before the cap, up to the floor allowance (uc_maximum_reduction). The cap reduction then takes whatever allowance is left. So a family that the gross cap takes to nil keeps its award less the allowance, where the award exceeds the allowance, and deductions can come from what it keeps. The flag now reads universal_credit_pre_benefit_cap − min(uc_benefit_cap_reduction, uc_maximum_reduction).

  • Current law can't move. The floor is zero there, uc_maximum_reduction is infinite, and the minimum is the gross cap. The differential below finds the formula path bit-equal to origin/main.
  • Stored data keeps origin/main's deductions. With the gate alone, a family on a stored-rate dataset would lose its deductions under a floor. That family is one whose draw assigns deductions and whose award the cap takes whole. origin/main takes them from its stored rate. On the property module's 24-unit stored dataset under an 85% floor, the gate alone (mutation M3 below) drops the deductions of 4 units, by up to £720.25 each. The floor-aware flag keeps them. On a dataset that stores rates as Microcosm does, deductions, the applied cap and the award then equal origin/main's, and the formula path gives the same.
  • The model already counts such a family's debts. uc_award_carries_deductions is true for any family with an award before the cap in the baseline.
  • Only the split moves. On the formula path a floor moves money between deductions and the applied cap reduction for these families. Their award changes by at most the penny a month that the minimum-payable rule keeps.

What users see.

  • A household situation that supplies uc_latent_deduction_rate gets no deductions unless it also sets uc_has_deduction to true, or supplies an incidence draw that assigns them. Ten existing YAML cases (five in uc_deductions.yaml, five in uc_fixed_deductions.yaml) and three Python test files supplied a rate this way. They now set the flag, or in test_uc_tax_free_childcare_choice.py an incidence draw of 0.2, below London's 0.439. No expected value changed.
  • On a dataset that stores latent rates, a reform that lowers incidence now drops the stored rates of the units the flag no longer assigns. One that raises it flags more units, but adds no deductions, because the dataset stores no rate for them. On origin/main, incidence reforms never reached stored rates. A unit that keeps the flag keeps its stored rate, while the formula rescales each draw by the new incidence, so stored rates don't cost an incidence reform in full.
  • docs/book/validation/uc-deductions.md and the docstrings of the flag, the latent rate and the deduction rate state these rules.

Stored data. uc_has_deduction stays an engine formula over the stored draw, and its award test reads only reformable model outputs. A dataset that stores latent rates must now also store the draws that assign them. Microcosm stores both.

Invariants

These hold for every input. policyengine_uk/tests/test_uc_deduction_flag_properties.py checks properties 1 to 9 with Hypothesis over generated benefit units plus explicit examples, and property 10 on a fixed 24-unit dataset.

  1. Flag gate. Where uc_has_deduction is false, uc_deductions is zero, for any supplied latent rate, combination, gross cap reduction and floor. The documented exceptions are an explicitly supplied uc_advance_repayment_amount, which the property covers, and an explicitly supplied uc_deduction_rate, which replaces the formula altogether.
  2. Substitution. A supplied latent rate gives the same deductions, applied cap and award as where(uc_has_deduction, rate, 0).
  3. The gate removes only disagreeing rates. For a claimant whose draw assigns deductions, uc_deductions equals allocate_uc_reductions applied to the ungated demand, under any floor.
  4. Accounting. For a claimant with an award, uc_deductions + uc_benefit_cap_reduction_after_floor + universal_credit equals the award before the cap.
  5. The flag's award. For a claimant whose draw assigns deductions, the flag holds exactly where an award remains after the cap reduction that allocate_uc_reductions applies with no deductions, under any floor.
  6. Current law (differential). With no floor, the formula path gives the same flag, latent rate, combination, advance amount, deduction rate, deductions, applied cap and award as origin/main's rule, bit for bit.
  7. Floor (differential). Under a floor, the formula path changes the flag only for families the gross cap takes to nil, and only to true. Deductions and the applied cap change only for them. Their award rises by between £0 and the 12p a year that the penny rule keeps.
  8. Stored attributes. A dataset that stores the draws, and the formula's rate and combination for every unit the draw assigns (as Microcosm does), gives the formula path's flag, deductions, applied cap and award under any floor.
  9. Stored attributes against origin/main (differential). On that dataset, deductions, the applied cap and the award equal origin/main's under current law and under any floor.
  10. Incidence reforms on stored rates. A cut in incidence drops the deductions of the units the flag no longer assigns. A rise adds none.

Properties 6, 7 and 9 compare head with MAIN_RULE, which adds back origin/main's flag, rate and advance formulas (as of 7ed52038a; origin/main at 7bcf80b09 has the same deduction code) as a reform. A separate cross-version differential, below, runs the real origin/main tree.

Test plan

  • For policy changes: YAML tests whose expected values come from an external source: not applicable. uc_has_deduction and uc_latent_deduction_rate are imputations under gov.simulation, and the protected floor is a reform, zero under current law. The new YAML cases derive their expected values in comments from the 2025-26 standard allowance for a single claimant aged 25 or over, £400.14 a month.
  • uvx ruff@0.17.2 format --check and uvx ruff@0.17.2 check on the eight changed Python files, uvx ruff@0.17.2 check --select F811,F821 policyengine_uk, and git diff --check: all clean.
  • Changelog fragment changelog.d/2739.fixed.md.

Results at head e17612ec3, each file or node-id group run alone with -n 0:

Tests Head origin/main (7bcf80b09) with the new tests
test_uc_deduction_flag_properties.py (new, at the final head and on 02b380c1a) 10 passed 4 failed, 6 passed (3 compare head's rule with MAIN_RULE, and 3 cover rules origin/main already follows)
uc_deductions.yaml (14 cases, 9 new) and uc_fixed_deductions.yaml (11) 25 passed uc_deductions.yaml: 3 failed, 11 passed. The 3 are the supplied rate alone, the supplied rate under a floor without the flag, and the floor-flagged family. uc_fixed_deductions.yaml: 11 passed.
test_uc_deductions.py 24 passed
test_uc_advance_repayment_properties.py 8 passed
test_uc_tax_free_childcare_choice.py 20 passed
test_data_built_imputations.py 9 passed
test_uc_rebalancing.py -k deductions 2 passed
test_dataframe_dataset.py::test_a_frame_over_several_years_exports_the_same_frame_again, which lists the formulas that read the deduction draws 1 passed
YAML baseline/finance/benefit/family/universal_credit/ 569 passed
YAML that reads deductions elsewhere (integration/uc_disabled_child_addition.yaml, baseline/gov/dwp/benefit_cap/, benefit_cap_by_scheme.yaml, the HB UC passport, CTR pensioners) 166 passed
test_benefit_cap_lha_scheme_split_properties.py and test_benefit_cap_and_ctr_pension_age_properties.py 2 of 7 and 1 of 18 passed, none failed, before the 25-minute cap stopped each run. Both build household situations with no deduction inputs, incidence draws or floor, so the flag and the latent rate are false and zero there on both sides.

The universal_credit/ YAML directory ran at d143bcf77. Head's model code is the same, and uc_deductions.yaml, the only YAML file changed since, passes at head.

Cross-version differential. One hand-built dataset of 400 single-adult benefit units (seeded, all 13 regions, awards up to £20,000, gross cap shares from 0 to 2, about 85% claiming) ran under the origin/main tree and under head. It compares 13 variables in six variants:

Variant origin/main Head
Formula path, current law 84 flagged, 84 with deductions, £47,699.62 bit-equal on all 13 variables
Stored rates (Microcosm-style), current law £47,699.62; 0 deductions without the flag deductions, applied cap, award and flag bit-equal. The deduction rate falls to 0 for 93 units with a stored rate but no flag, none of which has deductions on either side.
Supplied rate of 20% for every unit, current law 103 units have £69,486.08 of deductions without the flag 0 units; deductions only for the 84 flagged units
Formula path, 85% floor 84 flagged, £47,546.53 The flag marks 50 more units, each a family the cap takes to nil. £25,720.00 moves from the applied cap to deductions; universal_credit stays the same on all 400 units.
Stored rates, 85% floor 50 units have £25,720.00 of deductions without the flag the same deductions, applied cap and award, bit-equal; those 50 units now carry the flag
Supplied rate of 20%, 85% floor 229 units have £162,545.28 of deductions without the flag 0 units

Mutations. Seven mutations of the fix, each in a scratch copy, run against uc_deductions.yaml and the property module (-x):

Mutation uc_deductions.yaml Property module
M1: uc_deduction_rate reads the ungated latent rate 1 case fails fails (property 1)
M2: the advance estimate reads the ungated latent rate 2 cases fail fails (property 1)
M3: the flag reads the award after the gross cap, as on origin/main 1 case fails fails (property 3; run alone, property 9 fails too)
M4: the above-cap excess reads the ungated latent rate 1 case fails fails (property 1)
M5: under any floor the flag ignores the cap 1 case fails fails (property 5)
M6: both allocator callers gate demand on the flag or an advance, so a supplied rate stops bypassing the flag passes fails (test_a_supplied_deduction_rate_applies_whatever_the_flag_says)
M7: the flag compares draw <= incidence passes fails (test_a_draw_equal_to_the_incidence_assigns_no_deductions)

M1 to M4 ran against the property module at d98c5b7f4, before property 5 existed. M5 ran against the module at e17612ec3, and M6 and M7 against the final head's three explicit tests.

Overlap.

Reproducer

Reproducer: policyengine_uk/tests/test_uc_deduction_flag_properties.py::test_the_issue_example_takes_no_deductions_without_the_flag

axiom: n/a: uc_has_deduction and uc_latent_deduction_rate are imputations under gov.simulation, not law; the protected floor is JRF's proposal, zero under current law.

🤖 Generated with Claude Code

MaxGhenis and others added 5 commits October 30, 2026 22:27
Saved from a build that stopped when the machine rebooted. The next build verifies this work and finishes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add two tests for a dataset that stores latent rates, as Microcosm does. One
shows deductions, the applied cap and the award match origin/main under
current law and any floor. The other shows a cut in incidence drops stored
rates while a rise adds none. The docs now name every condition the flag
checks and say what the floor limits.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An 85% floor allowance of £720.25 exceeds a £500 award that the cap takes
whole, so the floor does not bind and the family keeps no award for
deductions to come from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For a claimant the incidence draw assigns, uc_has_deduction now must hold
exactly where an award remains after the cap reduction that
allocate_uc_reductions applies with no deductions, under any floor. A new
example family has a £500 award the cap takes whole, below an 85% floor's
£720.25 allowance.

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

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 02b380c1a8 against head 4101222293, 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

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp 0 0 0 0 0 suppressed suppressed

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
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: receipts by tax head; government balance, each component counted once; model totals; 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,888,684 in total; 2026-27: 76 units below zero, a weighted £-55,774,885 in total; 2027-28: 76 units below zero, a weighted £-57,687,092 in total
Counted-once check

Each of 91 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 02b380c1a8 uk 2.168.1 (files d9e9197f1d2e), core 3.33.12, py 3.13.18 aarch64 843ff5e63f27 e90ddaeead60 1991.55s
head #2760 merged into main 4101222293 uk 2.168.1 (files dee3bef6c20f), core 3.33.12, py 3.13.18 aarch64 843ff5e63f27 e90ddaeead60 1992.15s

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
Final charge on cash interest in non-cash ISAs £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Lifetime ISA withdrawal charge £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Income tax £294.46bn £315.23bn £334.00bn £349.45bn £365.10bn £383.16bn £397.71bn
National Insurance (employee and self-employed) £51.70bn £54.14bn £56.13bn £57.73bn £59.76bn £61.64bn £63.51bn
National Insurance (employer) £148.71bn £155.37bn £160.88bn £165.09bn £172.06bn £177.36bn £182.57bn
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.60bn £13.15bn £13.60bn £14.11bn £14.67bn £15.24bn £15.80bn
Student loan repayments £7.82bn £8.13bn £8.39bn £8.58bn £8.79bn £9.04bn £9.29bn
VAT excluding private school fees £249.37bn £256.88bn £266.66bn £272.70bn £278.97bn £285.24bn £291.59bn
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.01bn £2.08bn £2.14bn £2.20bn £2.26bn £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.71bn £24.59bn £26.54bn £26.58bn £26.26bn £25.53bn £24.40bn
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.40bn £4.41bn £4.42bn £4.43bn £4.44bn £4.45bn
Council tax £49.21bn £52.16bn £54.89bn £57.95bn £61.16bn £64.47bn £67.91bn
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 £36.20bn £38.00bn £39.46bn £42.27bn £43.25bn £44.29bn
Stamp duty land tax on the household's own purchases £6.88bn £7.32bn £7.66bn £8.06bn £8.47bn £8.91bn £9.35bn
Stamp duty land tax paid by companies £4.72bn £4.57bn £5.29bn £6.03bn £6.37bn £6.92bn £7.45bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.08bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.33bn £0.35bn £0.36bn £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
Lifetime ISA bonus £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
State Pension £121.68bn £125.92bn £126.73bn £129.50bn £132.99bn £136.66bn £140.43bn
Pension Credit £6.66bn £7.03bn £7.30bn £7.51bn £7.65bn £7.84bn £8.03bn
Winter Fuel Payment £1.86bn £1.85bn £1.79bn £1.77bn £1.78bn £1.78bn £1.78bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.48bn £80.52bn £82.95bn £84.96bn £86.11bn £87.64bn £88.27bn
Housing Benefit £8.56bn £8.89bn £9.24bn £9.48bn £9.72bn £9.99bn £10.27bn
Council Tax Reduction £2.07bn £2.20bn £2.31bn £2.45bn £2.58bn £2.72bn £2.86bn
Employment and Support Allowance (income-related) £0.79bn £0.82bn £0.84bn £0.86bn £0.88bn £0.90bn £0.92bn
Employment and Support Allowance (contribution-based) £5.20bn £5.37bn £5.56bn £5.69bn £5.82bn £5.95bn £6.09bn
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.31bn £0.31bn £0.32bn £0.33bn £0.34bn
Income Support £0.11bn £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.95bn £28.03bn £29.05bn £30.09bn £30.75bn £31.51bn £32.21bn
Disability Living Allowance £7.49bn £7.79bn £8.07bn £8.36bn £8.55bn £8.76bn £8.95bn
Attendance Allowance £8.68bn £9.03bn £9.36bn £9.69bn £9.90bn £10.15bn £10.38bn
Carer's Allowance £4.48bn £4.66bn £4.83bn £5.00bn £5.11bn £5.24bn £5.36bn
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.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.50bn £0.52bn £0.54bn £0.55bn £0.56bn £0.58bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.63bn £0.65bn £0.66bn £0.68bn £0.69bn £0.71bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.19bn £16.82bn £17.39bn £18.00bn £18.39bn £18.84bn £19.25bn
Scottish Child Payment £0.49bn £0.52bn £0.53bn £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.41bn £3.54bn £3.62bn £3.70bn £3.78bn £3.87bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.16bn £1.20bn £1.23bn £1.26bn £1.29bn £1.32bn
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.71bn £0.73bn £0.75bn £0.76bn £0.78bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.56bn £0.57bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.59bn £3.71bn £3.78bn £3.86bn £3.93bn
Universal childcare entitlement £2.06bn £2.22bn £2.29bn £2.37bn £2.43bn £2.48bn £2.53bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.54bn £0.55bn £0.57bn £0.56bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.31bn £0.32bn
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.89bn £204.30bn £204.56bn £204.91bn £205.34bn £205.85bn £206.35bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.10bn £25.14bn £25.18bn £25.23bn £25.30bn £25.36bn
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
Lifetime ISA bonus 0k 0k 0k 0k 0k 0k 0k
State Pension 11,264k 11,145k 10,819k 10,700k 10,723k 10,750k 10,776k
Pension Credit 1,486k 1,480k 1,474k 1,455k 1,453k 1,455k 1,464k
Winter Fuel Payment 7,844k 7,783k 7,473k 7,375k 7,391k 7,409k 7,427k
Pension Age Winter Heating Payment (Scotland) 803k 802k 800k 797k 799k 801k 802k
Universal Credit 6,342k 6,347k 6,336k 6,297k 6,292k 6,271k 6,223k
Housing Benefit 1,249k 1,245k 1,246k 1,229k 1,229k 1,229k 1,232k
Council Tax Reduction 3,176k 3,195k 3,200k 3,215k 3,224k 3,235k 3,242k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 71k 71k
Employment and Support Allowance (contribution-based) 719k 720k 721k 722k 724k 726k 728k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 67k 67k 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,567k 3,575k 3,579k 3,585k 3,593k 3,602k 3,611k
Disability Living Allowance 1,291k 1,294k 1,296k 1,298k 1,300k 1,304k 1,307k
Attendance Allowance 1,695k 1,698k 1,700k 1,703k 1,707k 1,711k 1,715k
Carer's Allowance 1,034k 1,037k 1,038k 1,040k 1,042k 1,044k 1,047k
Carer Support Payment (Scotland) 71k 71k 71k 72k 72k 72k 72k
Carer's Allowance Supplement (Scotland) 0k 71k 71k 72k 72k 72k 72k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 137k 138k 138k 138k 139k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 94k 94k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,123k 8,120k 8,120k 8,130k 8,145k 8,161k 8,178k
Scottish Child Payment 351k 352k 352k 353k 350k 348k 337k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 200k 200k 201k 201k 201k 202k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 333k 333k 334k 334k 335k 336k 337k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 182k 182k 183k 183k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 26k 26k
Bereavement Support Payment 98k 98k 98k 98k 98k 99k 99k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,043k 1,027k 1,014k 1,009k 1,011k 1,009k 993k
Extended childcare entitlement 795k 800k 796k 797k 798k 798k 792k
Universal childcare entitlement 1,071k 1,072k 1,072k 1,073k 1,076k 1,079k 1,074k
Targeted childcare entitlement 165k 156k 154k 154k 155k 155k 150k
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 98k 99k 99k 99k 99k
Adult Dependants' Grant 18k 18k 12k 12k 12k 12k 12k
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 £892.00bn £935.14bn £979.55bn £1,013.84bn £1,052.13bn £1,089.13bn £1,122.37bn
Government spending £529.38bn † £543.55bn † £550.80bn † £559.56bn † £567.27bn † £575.95bn † £583.61bn †
Government balance, each receipt once £362.62bn † £391.59bn † £428.75bn † £454.28bn † £484.86bn † £513.17bn † £538.76bn †
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 £892.00bn £935.14bn £979.55bn £1,013.84bn £1,052.13bn £1,089.13bn £1,122.37bn
household_tax £491.97bn £520.87bn £549.93bn £573.92bn £598.90bn £624.26bn £645.90bn
pre_budget_change_household_tax £484.15bn £512.74bn £541.54bn £564.86bn £589.61bn £614.73bn £636.09bn
gov_spending £529.38bn † £543.55bn † £550.80bn † £559.56bn † £567.27bn † £575.95bn † £583.61bn †
household_benefits £529.38bn † £543.55bn † £550.80bn † £559.56bn † £567.27bn † £575.95bn † £583.61bn †
gov_balance £362.62bn † £391.59bn † £428.75bn † £454.28bn † £484.86bn † £513.17bn † £538.76bn †
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,637.96bn £1,702.77bn £1,757.35bn £1,806.41bn £1,855.97bn £1,912.43bn £1,970.44bn
Household net income £1,636.69bn † £1,685.25bn † £1,716.76bn † £1,749.63bn † £1,780.87bn † £1,819.46bn † £1,862.22bn †
Household net income (HBAI definition) £1,449.57bn £1,497.73bn £1,532.72bn £1,567.06bn £1,599.82bn £1,637.79bn £1,678.91bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,245k 69,383k 69,473k 69,592k 69,738k 69,912k 70,080k
Benefit units 35,110k 35,181k 35,226k 35,286k 35,360k 35,449k 35,534k
Households 31,046k 31,108k 31,149k 31,201k 31,267k 31,345k 31,420k
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.3% 15.6% 16.4% 16.3% 16.5% 16.5% 16.6%
Absolute poverty, before housing costs: children 24.7% 22.3% 23.3% 22.9% 23.1% 23.2% 23.5%
Absolute poverty, before housing costs: working-age adults 14.1% 13.9% 14.7% 14.7% 14.8% 14.8% 15.0%
Absolute poverty, before housing costs: pensioners 13.7% 13.5% 14.0% 13.9% 14.0% 13.9% 13.9%
Absolute poverty, after housing costs: everyone 21.6% 21.1% 22.0% 22.6% 22.9% 23.1% 23.4%
Absolute poverty, after housing costs: children 33.3% 31.3% 32.2% 32.5% 32.8% 33.4% 34.2%
Absolute poverty, after housing costs: working-age adults 19.9% 19.9% 20.8% 21.6% 21.9% 22.0% 22.3%
Absolute poverty, after housing costs: pensioners 12.7% 12.6% 13.1% 13.2% 13.3% 13.4% 13.6%
Relative poverty, before housing costs: everyone 17.0% 16.3% 16.4% 16.3% 16.3% 16.3% 16.7%
Relative poverty, before housing costs: children 25.9% 23.4% 23.3% 22.9% 22.8% 22.9% 23.7%
Relative poverty, before housing costs: working-age adults 14.5% 14.3% 14.6% 14.7% 14.7% 14.7% 15.0%
Relative poverty, before housing costs: pensioners 14.5% 14.7% 13.9% 13.9% 13.8% 13.9% 14.0%
Relative poverty, after housing costs: everyone 21.4% 21.0% 21.2% 21.3% 21.3% 21.5% 21.7%
Relative poverty, after housing costs: children 33.1% 31.1% 31.1% 31.0% 31.1% 31.2% 31.8%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.2% 20.4% 20.5% 20.6% 20.8%
Relative poverty, after housing costs: pensioners 12.5% 12.4% 12.2% 11.7% 11.7% 11.8% 12.0%
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,278k 10,837k 11,403k 11,374k 11,484k 11,512k 11,651k
Absolute poverty, before housing costs: children 3,688k 3,332k 3,496k 3,445k 3,480k 3,502k 3,549k
Absolute poverty, before housing costs: working-age adults 5,965k 5,921k 6,308k 6,362k 6,420k 6,429k 6,521k
Absolute poverty, before housing costs: pensioners 1,624k 1,584k 1,599k 1,568k 1,583k 1,580k 1,581k
Absolute poverty, after housing costs: everyone 14,944k 14,662k 15,304k 15,720k 15,939k 16,138k 16,423k
Absolute poverty, after housing costs: children 4,975k 4,689k 4,835k 4,887k 4,944k 5,039k 5,178k
Absolute poverty, after housing costs: working-age adults 8,463k 8,491k 8,969k 9,343k 9,491k 9,582k 9,703k
Absolute poverty, after housing costs: pensioners 1,506k 1,482k 1,500k 1,491k 1,505k 1,517k 1,542k
Relative poverty, before housing costs: everyone 11,750k 11,332k 11,389k 11,359k 11,364k 11,416k 11,711k
Relative poverty, before housing costs: children 3,872k 3,504k 3,496k 3,440k 3,434k 3,454k 3,582k
Relative poverty, before housing costs: working-age adults 6,159k 6,103k 6,301k 6,355k 6,366k 6,391k 6,544k
Relative poverty, before housing costs: pensioners 1,720k 1,724k 1,592k 1,563k 1,563k 1,571k 1,585k
Relative poverty, after housing costs: everyone 14,849k 14,583k 14,728k 14,809k 14,885k 15,018k 15,234k
Relative poverty, after housing costs: children 4,942k 4,664k 4,660k 4,663k 4,681k 4,709k 4,806k
Relative poverty, after housing costs: working-age adults 8,426k 8,460k 8,679k 8,821k 8,877k 8,970k 9,062k
Relative poverty, after housing costs: pensioners 1,482k 1,459k 1,389k 1,325k 1,327k 1,340k 1,366k
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.3080 0.3057 0.3064 0.3063 0.3069 0.3075 0.3091
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,681 † £17,895 † £17,899 † £18,153 † £18,306 † £18,543 † £18,727 †
Decile 2: mean household_net_income per household £27,939 † £28,874 † £28,675 † £29,031 † £29,318 † £29,702 † £30,162 †
Decile 3: mean household_net_income per household £34,320 † £35,455 † £36,083 † £36,591 † £37,213 † £37,742 † £38,188 †
Decile 4: mean household_net_income per household £38,933 † £40,603 † £41,867 † £42,782 † £43,367 † £43,818 † £44,447 †
Decile 5: mean household_net_income per household £43,239 † £45,442 † £45,782 † £47,007 † £47,727 † £48,901 † £50,212 †
Decile 6: mean household_net_income per household £47,927 † £49,126 † £50,886 † £51,693 † £52,584 † £54,196 † £55,183 †
Decile 7: mean household_net_income per household £55,662 † £56,509 † £57,442 † £57,963 † £59,080 † £59,209 † £60,671 †
Decile 8: mean household_net_income per household £68,789 † £70,704 † £71,778 † £73,355 † £73,950 † £75,359 † £77,245 †
Decile 9: mean household_net_income per household £78,890 † £80,992 † £82,907 † £84,246 † £85,584 † £87,170 † £89,598 †
Decile 10: mean household_net_income per household £117,005 † £120,262 † £122,221 † £124,681 † £126,774 † £129,108 † £131,486 †
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.41bn £6.66bn £6.64bn £6.86bn £7.04bn £7.25bn £7.49bn
Raise higher rate by 1pp £3.61bn £3.87bn £4.00bn £4.21bn £4.44bn £4.71bn £4.83bn
Raise personal allowance by ~800GBP/year £-3.80bn £-3.92bn £-3.98bn £-4.10bn £-4.18bn £-4.21bn £-1.94bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.55bn £-1.39bn £-1.30bn £-1.18bn £-1.07bn
Reduce Universal Credit taper rate to 20% £-20.77bn £-21.32bn £-21.80bn £-22.04bn £-22.40bn £-22.80bn £-22.99bn
Raise Class 1 main employee NICs rate to 10% £10.89bn £11.30bn £11.71bn £12.01bn £12.31bn £12.62bn £13.00bn
Raise VAT standard rate by 2pp £24.89bn £25.71bn £26.63bn £27.24bn £27.87bn £28.50bn £29.14bn
Raise additional rate by 3pp £2.90bn £3.15bn £3.22bn £3.42bn £3.61bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.06bn £-3.18bn £-3.26bn £-3.35bn £-3.44bn £-3.49bn £-3.50bn
Raise the State Pension by 10% £-7.78bn £-8.01bn £-7.99bn £-8.14bn £-8.42bn £-8.55bn £-8.89bn
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.55bn £6.86bn £6.80bn £7.01bn £7.21bn £7.44bn £7.66bn
Raise higher rate by 1pp: change in income_tax £3.61bn £3.92bn £4.01bn £4.23bn £4.45bn £4.72bn £4.84bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.93bn £-4.07bn £-4.16bn £-4.25bn £-4.32bn £-4.38bn £-1.75bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.94bn £1.76bn £1.65bn £1.52bn £1.40bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.74bn £21.31bn £21.79bn £22.05bn £22.37bn £22.78bn £22.99bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.15bn £11.63bn £12.00bn £12.29bn £12.61bn £12.94bn £13.31bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.51bn £26.42bn £27.03bn £27.65bn £28.28bn £28.91bn
Raise additional rate by 3pp: change in income_tax £2.90bn £3.15bn £3.22bn £3.42bn £3.62bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.06bn £3.19bn £3.28bn £3.37bn £3.43bn £3.49bn £3.51bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.17bn £11.28bn £11.60bn £12.04bn £12.47bn £12.97bn

@MaxGhenis
MaxGhenis marked this pull request as ready for review October 31, 2026 08:31

This branch has not been deployed

No deployments
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.

A supplied UC latent deduction rate can give deductions to a unit flagged as having none

1 participant