Skip to content

Fix the annual allowance on survey data, the UC benefit cap earnings threshold, relevant UK earnings and Scottish water uprating - #2536

Merged
juaristi22 merged 9 commits into
mainfrom
fix-2523-survey-pensions-uc-cap-water
Oct 21, 2026
Merged

juaristi22 merged 9 commits into
mainfrom
fix-2523-survey-pensions-uc-cap-water

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2523
Fixes #2501

Four fixes Microcosm UK needs before it locks the next release. Each is its own commit (or two), so they can be read separately. The branch also merges the heads of #2488 and #1863 so that it can resolve them against this PR; once they are on main, the diff here is only this PR's changes.

1. UC benefit cap earnings threshold (#2523 item 2)

is_uc_benefit_cap_exempt_earnings compared earned income with £10,152 a year in every year: £846 a month, the 2025-26 figure.

The Universal Credit Regulations 2013 set the threshold each year:

  • Reg. 82(1)(a): the pay for 16 hours a week at the national living wage, times 52 and divided by 12.
  • Reg. 6(1A)(za): any fraction of a pound is disregarded.
  • Before 1 April 2017, the threshold was a fixed £430 a month (SI 2017/138).

The new uc_benefit_cap_earnings_exception_threshold reads gov.hmrc.minimum_wage.non_apprentice, as the minimum income floor does. It gives:

  • £9,516 in 2024-25 (£793 a month);
  • £10,152 in 2025-26 (£846);
  • £10,572 in 2026-27 (£881).

These are DWP's published figures. The national living wage parameter ends at its April 2026 rate, so the threshold holds at £10,572 after 2026-27 until that parameter is projected (#2537), as the minimum income floor does. The benefit cap differential test's reference now reads the threshold too, and a £10,400 earner in 2026 joins its examples. This also covers the threshold part of #1986. #1820 and #1999 also touch this threshold, with a dated parameter.

2. One relevant-earnings rule (#2523 item 3, after #2488)

adjusted_total_income and pension_contributions_relief defined relevant UK earnings differently. FA 2004 s. 189(2) counts:

  • employment income chargeable to income tax: net taxable earnings (ITEPA 2003 ss. 9(2) and 11), so pay and statutory pay less the allowable expenses in s. 327(3). The pension deductions s. 327(5) also lists are the relief these earnings limit, so they stay in;
  • trading profits chargeable under ITTOIA 2005 Part 2: after capital allowances and the trading allowance, before losses.

relevant_uk_earnings and trading_profits_before_losses in utils/pensions.py now serve the relief, adjusted_total_income, threshold income and the annual-allowance net-income rebuild. adjusted_total_income does not change. Relief changes only where contributions exceed earnings once expenses, capital allowances or the trading allowance are counted.

3. Water and sewerage charges by country (#2501)

Ofwat's series covers England and Wales. Scottish Water's household charges rose 8.8% in 2024-25, 9.9% in 2025-26 (Ofwat: 27%) and 8.67% in 2026-27. Northern Ireland has no domestic water charges.

  • New series yoy_growth.scottish_water.water_bills:
  • New uprate_water_and_sewerage_charges grows the column by country during projection, as council tax is:
    • England, Wales and unknown regions take Ofwat's series;
    • Scotland takes Scottish Water's;
    • Northern Ireland takes no growth.
  • Uprate three more columns, and guard the gap that hid them #1863's Ofwat list entry is dropped so the column is grown once, and the column is recorded among its code-health test's exceptions. It is also kept out of the post-2030 fallback, reset with the other growth factors, and in the projection fingerprint.
  • After 2032 policyengine-core grows it by Ofwat's index everywhere, as before; the docs say so.

4. The annual allowance on survey data (#2523 item 1)

Defined benefits. The pension input amount of a defined-benefit arrangement is the increase in the value of rights (FA 2004 s. 234), not the cash paid.

  • defined_benefit_pension_share (input, default nil) says how much of the workplace contributions (employer, net pay, salary sacrifice) go to defined-benefit arrangements.
  • defined_benefit_pension_input_amount replaces those contributions; supply it where known.
  • Unsupplied, it is the contributions times gov.simulation.pensions.defined_benefit_input_per_contribution, set at 1:
    • In NHS 2015, Teachers 2015, Civil Service alpha and LGPS 2014 in 2024-25, an active member's statutory input is 0.8 to 1.2 times employer and member contributions together. The parameter file cites the accrual, revaluation and contribution rates.
    • Survey employer contributions drawn from regular rates leave out deficit repair.
  • Nothing changes unless data also supplies a valued input amount. At a ratio of 1, a supplied share alone changes the input only for net pay into a defined-benefit scheme from age 75, which now counts, because the defined-benefit input has no age limit.
  • The ratio of 1 is a chosen midpoint: ten years' service is assumed, and the comparison holds from 2023-24, when these schemes began revaluing on 6 April. Private-sector schemes would push it below 1.

Carry forward. unused_pension_annual_allowance stays an override. A supplied or stored value applies to its own year only: its three-year window moves on, so dataset projection drops it from later years, which use the estimate. From 2020-21 the estimate is:

  • each of the five previous years' input is this year's times gov.simulation.pensions.prior_year_input_ratio (1), with input and incomes deflated by average earnings growth;
  • each year's allowance is tapered on those incomes;
  • each excess uses the earlier unused allowance first (s. 228A(7)).

The ratio of 1 is a convention: HMRC publishes nothing on carry-forward use. Real excesses are lumpy, so it probably understates carry forward.

Against HMRC. HMRC's Private pension statistics (July 2026) give, for 2024-25 (provisional): 30,440 people reporting an excess through Self Assessment, after carry forward, with £672m of excess (Table 7), and £0.3bn of charge (Table 6).

On the certified Enhanced FRS 1.58.1 in 2024 the model gives:

  • main: about 267,000 payers and £3.5bn;
  • this PR: about 259,000 and £3.5bn. The fall is the carry-forward default; the relevant-earnings change does not move it at this precision.

Employer contributions are 69% of payers' input, because the dataset imputes them as three times employee contributions (policyengine-uk-data#606). With employer contributions at a third of their stored values, the 2024 model gives about 27,000 payers, £0.21bn of charge and £0.47bn of excess, all within half to one and a half times HMRC's figures.

test_annual_allowance_against_hmrc.py checks all three against that band. It is a strict expected failure, allowlisted to "known data gaps, chiefly policyengine-uk-data#606", and it reports no model value.

Reproducer: policyengine_uk/tests/policy/baseline/gov/dwp/benefit_cap/uc_benefit_cap_earnings_exception_threshold.yaml::Earnings between the 2024-25 threshold and the 2025-26 figure lift the cap in 2024-25; policyengine_uk/tests/policy/baseline/gov/hmrc/pensions/relevant_uk_earnings.yaml::Capital allowances reduce relevant UK earnings; policyengine_uk/tests/test_water_uprating.py::test_each_country_takes_its_own_water_growth

Tests

New:

  • uc_benefit_cap_earnings_exception_threshold.yaml (11 cases);
  • relevant_uk_earnings.yaml (4; 3 fail before);
  • test_water_uprating.py (11);
  • defined_benefit_pension_input.yaml (6);
  • unused_pension_annual_allowance_default.yaml (8, including the earliest-first case and a taper that binds only in an earlier year);
  • test_unused_annual_allowance_projection.py (a stored carry-forward stays in its own year);
  • tests/microsimulation/test_annual_allowance_against_hmrc.py.

Updated:

  • test_projection_horizon.py and the fingerprint read-set mock now cover water by country;
  • the annual allowance property test's earnings oracle;
  • the benefit cap differential reference;
  • the UC deductions case on the annual allowance charge (no carry-forward);
  • comments quoting £10,152.

Validation, run locally (targeted to the touched surfaces):

  • On this branch: 301 YAML passed across the benefit cap, UC, pensions and income tax reliefs tests. 95 Python passed across the water, projection, uprating fingerprint, Uprate three more columns, and guard the gap that hid them #1863 code-health, annual allowance property, benefit cap differential and parameter description tests.
  • Before combining, on each branch:
    • UC threshold: 629 YAML and 93 Python passed;
    • relevant earnings: 573 YAML and 97 Python passed;
    • water: 844 Python passed;
    • annual allowance: 444 YAML and 221 Python passed (2 skipped).
  • The HMRC test XFAILs on the certified dataset.
  • After review (25b5c3d): 156 YAML passed in the pensions and benefit cap threshold files. 77 Python passed in the carry-forward projection, projection-horizon, uprating fingerprint, water, Uprate three more columns, and guard the gap that hid them #1863 code-health and parameter description tests.
  • Not run locally: the 2029 reform-impact fixtures. The carry-forward default moves the 2026 charge by about £0.02bn, against their £1bn tolerance.

axiom: TheAxiomFoundation/rulespec-uk#399 queued (UC reg 82 threshold); TheAxiomFoundation/rulespec-uk#481 queued (FA 2004 s.189(2) relevant UK earnings and the s.191(7) limit); TheAxiomFoundation/rulespec-uk#444 queued (s.228A carry forward); n/a for the survey-data defaults and the water series, which are data assumptions

🤖 Generated with Claude Code

@juaristi22
juaristi22 marked this pull request as ready for review October 20, 2026 16:25

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@juaristi22 thanks, this is my review at baf3bf28f. I've reviewed #2536's own changes only (diffed against main merged with the heads of #2488 and #1863).

No blockers. The law is right in all four parts and the touched tests pass. The benefit cap threshold and the water split can go in as they are once items 1 and 11 are settled. The annual allowance part is right, but item 3 matters before Microcosm stores a carry-forward value.

What I ran (fresh venv, no private data):

  • Pensions YAML 144 passed, income tax reliefs YAML 60, the annual allowance property and taper tests 27.
  • Benefit cap, benefit_cap_by_scheme, uc_trading_loss and claims_as_single_person YAML 167 passed. The water, projection-horizon, uprating-inputs, code-health uprating and benefit cap split tests: 61 passed.
  • On the base, the new YAML fails as it should: relevant_uk_earnings 3 of 4, defined_benefit_pension_input 6 of 6, unused_pension_annual_allowance_default 2 of 7.
  • Not run: test_annual_allowance_against_hmrc.py, which needs the certified dataset.

Findings

PR body

  1. should: axiom: needed is only for external contributors. As a maintainer the line should be encoded-correct, encoded, queued or n/a: <reason>. The benefit cap threshold and relevant UK earnings are policy changes, so queued with a rulespec-uk issue fits those. The water series is data plumbing, so n/a would do for that part.

  2. should: say the minimum wage freezes the benefit cap threshold. uc_benefit_cap_earnings_exception_threshold.py:43-52 reads gov.hmrc.minimum_wage.non_apprentice, which ends at the April 2026 rate (£12.71). So the threshold is £10,572 in every year from 2026 to 2030 (I checked 2027, 2028 and 2030), while projected earnings grow. The share of capped families meeting the exception then creeps up each year. That gap is in the minimum wage parameter, not this PR, and the minimum income floor has it too. A line in the changelog or the docstring is enough here, plus a follow-up issue to project the national living wage.

Annual allowance and relevant UK earnings

  1. should: a stored carry-forward value doesn't stay in its own year. unused_pension_annual_allowance.py:20-21 and docs/engineering/pension-annual-allowance.md:194 say a supplied value applies to its own year only. But extend_single_year_dataset (data/economic_assumptions.py:228-229) copies every base-year column into each projected year, and the variable isn't in uprating_indices.yaml. So a 2024 value stored in Microcosm would be reused unchanged in every year to 2032. Under s. 228A the three-year window moves each year, so that's wrong. uk-data supplies no value today, so nothing breaks yet. Since Microcosm is the reason for this PR, either keep stored values out of the projected years, or say in the docs not to supply one until that's fixed.

  2. should: the defined-benefit path changes nothing on survey data yet. With defined_benefit_input_per_contribution at 1, defined_benefit_pension_input_amount equals the contributions it replaces. So pension_contributions_for_annual_allowance is unchanged, even with a share supplied. The one exception is net-pay member contributions to a defined-benefit scheme from age 75, which now count. The body says "With no share supplied, nothing changes". "Nothing changes unless the data also supplies a valued input amount" would stop anyone reading the fall from 267,000 to 259,000 payers as a defined-benefit effect. That fall comes from carry forward and relevant earnings.

  3. should: say the ratio of 1 is a chosen midpoint. I re-derived the figures in defined_benefit_input_per_contribution.yaml:9-20 from the cited accrual and revaluation rates:

    • NHS: 16/54 + 10 × (1/54) × 16 × 1.5% = 34% of pay.
    • Teachers: 33%.
    • Alpha: 16 × 2.32% = 37%.
    • LGPS: 16/49 = 33%.

    The ratios (0.94-1.18, 0.81-0.90, 1.00-1.10, 0.97-1.23) follow from the cited contribution rates. Three things should be written down. The ten years of service and the step to exactly 1 are judgement calls. The reasoning holds only because revaluation has fallen on 6 April since 2023, so it shares the s. 235 CPI; it fails for pension input periods before 2023-24. Private-sector defined-benefit schemes, whose employer rates are often much higher, would push the ratio below 1.

  4. should: prior_year_input_ratio is an assumption, and its label is wrong. HMRC publishes no count of carry-forward use (prior_year_input_ratio.yaml:15). So the description should say 1 is a convention, not a value drawn from statistics. The label (:22) says three previous years, but the formula uses five. Also, a ratio of 1 with smooth earnings growth almost rules out carry forward for anyone over this year's allowance. Real excesses are lumpy (defined-benefit promotions, one-off contributions), so this probably understates carry forward. The docs should say which way the bias runs.

  5. should: the xfail puts the whole HMRC gap down to one cause. HMRC's Private pension statistics (30 July 2026) confirm the PR's targets:

    • Table 7: 30,440 Self Assessment payers in 2024-25 (provisional).
    • Table 6: £300m of charges.

    The model's 259,000 payers and £3.5bn are about 8.5 and 12 times those. test_annual_allowance_against_hmrc.py:36 and the allowlist name only policyengine-uk-data#606. But employer contributions are 69% of payers' input, so even removing the threefold imputation may not bring the count within 1.5 times. Either show a quick sensitivity (for example employer contributions divided by 3), or word the reason as "known data gaps including #606". Otherwise the strict xfail can survive #606 being fixed and get blamed on the wrong cause. Optional: Table 7's £672m of excess contributions is a cleaner second target, since it doesn't depend on marginal rates.

  6. should: cite the authority for deducting employment expenses. relevant_uk_earnings (utils/pensions.py:26-39) now uses taxable_employment_income, which is net of employment_expenses. FA 2004 s. 189(2)(a) says only "employment income", and PTM044100 is silent on expenses. The reading is defensible through ITEPA ss. 9(2) and 11 (the amount charged is net taxable earnings). But by that route the net-pay deduction would come off too, and the PR keeps it in. Please cite ss. 9 and 11 in the docstring and in relevant_uk_earnings.yaml, and say why pension deductions stay in. The "allowable employment expenses" test case depends on this reading.

  7. nit: carry forward over five years slightly under-counts. The year-3 excess should draw on year 6 first, but year 6 is outside the window (unused_pension_annual_allowance.py:7). The 2015-16 alignment rules are also ignored when 2020-21 looks back. This is rare with a ratio of 1, but worth a line in the docstring. Separately, furnished holiday lettings income counted as relevant UK earnings before 2025-26 (s. 189(2)(ba), (bb)), and the model has no such variable. That's also a line in the docstring.

  8. nit: most of the carry-forward cases also pass on the base. Four of the seven do: excess every year, supplied override, no input, and pre-2020 nil. Only "steady saving" and "earliest first" test the new logic. A case where the taper binds only in an earlier year would help.

Benefit cap and water

  1. should: source the 2027-29 Scottish water rises, or use 4%. The 3.9%, 3.9% and 4.1% in yoy_growth.yaml (scottish_water, 2027-01-01 to 2029-01-01) and water-bills.md rest on "WICS's CPI assumption of 1.9%, 1.9% and 2.1%". The cited WICS page gives the CPI + 2% cap and a real-terms bill table, but no CPI path, and I couldn't find those figures in any WICS document. Either cite the page and table they come from, or use the model's own CPI (OBR March 2026, 2.0%) plus 2%, which gives 4.0%. Either way, the Final Determination on 29 October replaces them, so a tracking issue would help.

  2. nit: the £430 parameter starts on 2013-04-29. earnings_exception/fixed_monthly_amount.yaml:8 gives that date, so the threshold for 2013 raises ParameterNotFoundError. 2013-04-01 would remove one blocker for early years.

  3. nit: one row in docs/book/validation/hbai.md:111 is stale. It still says water is uprated by CPI "as proxy". My #2527 updates that row, so please carry it over.

Overlap with my PRs

  • #2527 (Scottish water): the published years (4.2%, 5%, 8.8%, 9.9%, 8.67%) match value for value, and so do Northern Ireland flat and the Ofwat fallback. #2536 also resolves the #1863 conflict. Both add changelog.d/scottish-water-uprating.fixed.md, so they can't both merge. I'll close #2527 as superseded once this lands. Keeping the uprating attribute after 2032, as you do, is fine by me.
  • #1863: the merge of its current head is clean. The only changes to it are the intended ones: water is dropped from the Ofwat entry and added to KNOWN_UNUPRATED. The Ofwat values and docs are untouched. #1863 is going into the merge queue first, as your body assumes. If this were squash-merged with #1863 still open, #1863 would conflict.
  • #2386 (docs): after this merges, pension-tax-relief.md and pensions-comparison-stbm.md there say carry forward defaults to nil, that defined-benefit accrual counts only through contributions, and give the old relevant-earnings definition. The £70,000 worked example still holds. I'll update those passages on my side, so nothing is needed here.

What looks right

  • Carry forward: it matches s. 228A. It uses the earliest year first (s. 228A(7)), an excess is used up only where it cut the charge (s. 228A(6)), and the window is three years.

  • Taper: annual_allowance_for_year reproduces the pre-2020 (A - £10,000)/£60,000 and post-2020 one-half rates, the whole-pound floor, the s. 228ZA(3)(b) threshold and the £4,000 and £10,000 minimums.

  • Adjusted income: money purchase input plus the defined-benefit share equals the old total. Adjusted income becomes defined-benefit input less member contributions, per s. 228ZA(4).

  • Trading profits: taken after capital allowances and the trading allowance, and before brought-forward losses, which matches s. 189(2)(b).

  • Earlier PRs kept: #2464's SSP and SMP are still in. #2488's relief-at-source-only £3,600 rule is kept, because adjusted_total_income now calls pension_contributions_relief_amount, and I checked it is equivalent to #2488's formula.

  • Benefit cap threshold: right against reg 82(1)(a) and reg 6(1A)(za) as amended by SI 2017/138:

    • 16 × £11.44 × 52/12 = 793.17, so £793 (2024-25);
    • £846 (2025-26) and £881 (2026-27), matching GOV.UK;
    • £430 in 2016 and £520 from April 2017.

    The order is right: floor the monthly amount, then multiply by 12. No hard-coded 10,152 is left in formulas.

  • Water mechanism: a per-region map like council tax's. Northern Ireland is flat, an unknown region uses Ofwat, and an unrecognised label raises an error. Water is excluded from the post-2030 fallback and test_water_charges_are_uprated_once guards against double growth.

  • Allowlist: its only new entry is the strict HMRC xfail.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator Author

@vahid-ahmadi thanks. Each item is addressed in 25b5c3d, except where noted below.

PR body

  1. Axiom line. It now reads:
  2. Frozen threshold. The threshold's docstring and the changelog now say the national living wage parameter ends at April 2026, so the threshold holds at £10,572 a year after 2026-27, as the minimum income floor does. Projecting the national living wage is The national living wage parameter ends at April 2026, so every rule that reads it freezes #2537.

Annual allowance and relevant UK earnings

  1. A stored value is now for its own year. Dataset projection drops a stored unused_pension_annual_allowance from every projected year (YEAR_SPECIFIC_INPUTS in data/economic_assumptions.py), so later years use the estimate.
    • test_unused_annual_allowance_projection.py covers the extended dataset and the Microsimulation.
    • It fails if the drop is removed.
  2. The defined-benefit path. You're right that it changes nothing on survey data yet. At a ratio of 1, a supplied share changes the input only for net pay into a defined-benefit scheme from age 75, which now counts because the defined-benefit input has no age limit. Results move only once data supplies a valued input amount. The docs and the body now say so.
    • On the combined head, the certified Enhanced FRS gives about 259,000 payers and £3.51bn in 2024, the same as the annual allowance commits alone. So the fall from about 267,000 is the carry-forward default; the relevant-earnings change does not move it at that precision.
  3. The ratio of 1. The parameter now says it is a chosen midpoint. The ten years' service and the step to 1 are judgements, and the comparison holds from 2023-24, when these schemes began revaluing on 6 April with the same September CPI as s. 235, not before. Private-sector schemes would push it below 1.
  4. prior_year_input_ratio.
    • The description now says 1 is a convention, not a statistic.
    • The label now matches the five years the estimate uses.
    • The parameter and the engineering doc say it probably understates carry forward, because real excesses are lumpy.
  5. The HMRC test. I ran the sensitivity you suggested on the certified dataset, 2024, combined head. With employer contributions at a third of their stored values, the model gives about 27,000 payers, £0.21bn of charge and £0.47bn of chargeable amount, against HMRC's 30,440, £0.3bn and £672m. All three are inside the half to one and a half band. So Add misc benefit payment #606 accounts for most of the gap, but a fix may not be a clean third.
    • The reason and the allowlist now say "Known data gaps, chiefly policyengine-uk-data#606".
    • The test also checks the chargeable amount against Table 7's £672m, as you suggested.
    • It still XFAILs on the certified dataset.
  6. Employment expenses. relevant_uk_earnings and the YAML header now cite ITEPA 2003 ss. 9(2) and 11 (net taxable earnings), so the s. 327(3) expenses come off.
    • They also say why the pension deductions that s. 327(5) lists stay in: they are the relief these earnings limit, so taking them off would make the limit depend on itself.
    • PTM044100 and PTM044230 don't settle it either way.
  7. Docstring limits. The docstrings now note three limits:
    • the five-year window can carry slightly too little forward;
    • the 2015-16 alignment rules are not applied;
    • furnished holiday lettings (s. 189(2)(ba) and (bb), omitted from 2025-26) are not modelled separately.
  8. A new carry-forward case. It covers a taper that binds only in an earlier year: 2022-23, with £180,000 of pay and £20,000 from the employer. 2019-20, deflated, is over that year's £150,000 limit, so its allowance is £26,300. The case expects £51,923.71 carried forward, against £65,623.70 untapered.

Benefit cap and water

  1. The 2027-29 Scottish water rises. The 1.9%, 1.9% and 2.1% are in the Draft Determination itself: Table 68, "Price inflation forecast (CPI in October of previous year)", page 258, which applies the OBR March 2026 forecast. The core CPI + 2% cap for the first three years is para. 9.1.3. The parameter and water-bills.md now cite both. A tracking issue for the 29 October Final Determination is Replace the 2027-30 Scottish water growth with WICS's Final Determination (due 29 October 2026) #2538.
  2. The 2013 nil is left as it is. Redating to 2013-04-01 doesn't help: convert_to_fiscal_year_parameters samples 30 April only for 2015 to 2040, so 2013 reads 1 January 2013 whatever the April date. Only a date in 2012 would make 2013 work, which would misstate the law. 2014 already gives £5,160. The other UC parameters dated 29 April 2013 also return nothing for 2013.
  3. The HBAI row is updated with your Uprate Scottish households' water charges by Scottish Water's path #2527 wording.

Overlaps. Thanks for closing #2527 once this lands. #1820 and Max's draft #1999 also touch the reg 82 threshold, with a dated gov.dwp.benefit_cap_earnings_exemption parameter. This PR derives the threshold from the national living wage instead, which is also what rulespec-uk#399 asks for. One of those would need to rebase onto this.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 68ce6a6fbc against head 111c974779, 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.

Receipts by tax head

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax -£17.1m -£22.2m -£31.6m -£13.8m -£6.2m -£9.3m -£39.5m

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Universal Credit 0 -£10.2m 0 -£54,740 -£1.1m -£4.7m -£15.3m
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 -£17.1m -£22.2m -£31.6m -£13.8m -£6.2m -£9.3m -£39.5m
Government spending 0 † -£10.2m † 0 † -£54,740 † -£1.1m † -£4.7m † -£15.3m †
Government balance, each receipt once -£17.1m † -£12.0m † -£31.6m † -£13.8m † -£5.1m † -£4.6m † -£24.3m †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax -£17.1m -£22.2m -£31.6m -£13.8m -£6.2m -£9.3m -£39.5m
household_tax -£17.1m -£22.2m -£31.6m -£13.8m -£6.2m -£9.3m -£39.5m
pre_budget_change_household_tax -£17.1m -£22.2m -£31.6m -£13.8m -£6.2m -£9.3m -£39.5m
gov_spending 0 † -£10.2m † 0 † -£54,740 † -£1.1m † -£4.7m † -£15.3m †
household_benefits 0 † -£10.2m † 0 † -£54,740 † -£1.1m † -£4.7m † -£15.3m †
gov_balance -£17.1m † -£12.0m † -£31.6m † -£13.8m † -£5.1m † -£4.6m † -£24.3m †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household net income +£17.1m † +£12.0m † +£31.6m † +£13.8m † +£5.1m † +£4.6m † +£24.3m †
Household net income (HBAI definition) +£17.1m +£12.0m +£31.6m +£13.8m +£5.1m +£4.6m +£24.3m

Poverty rates

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 0 0 0 0 0 0 +0.00pp
Absolute poverty, before housing costs: children 0 0 0 0 0 0 +0.01pp
Absolute poverty, before housing costs: working-age adults 0 0 0 0 0 0 +0.00pp
Absolute poverty, after housing costs: everyone -0.00pp 0 0 0 +0.01pp 0 0
Absolute poverty, after housing costs: children 0 0 0 0 +0.02pp 0 0
Absolute poverty, after housing costs: working-age adults -0.00pp 0 0 0 +0.00pp 0 0
Relative poverty, before housing costs: everyone 0 0 0 0 0 0 +0.00pp
Relative poverty, before housing costs: children 0 0 0 0 0 0 +0.01pp
Relative poverty, before housing costs: working-age adults 0 0 0 0 0 0 +0.00pp
Relative poverty, after housing costs: everyone 0 0 0 0 +0.01pp 0 0
Relative poverty, after housing costs: children 0 0 0 0 +0.02pp 0 0
Relative poverty, after housing costs: working-age adults 0 0 0 0 +0.00pp 0 0

People in poverty

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 0 0 0 0 0 0 +2.2k
Absolute poverty, before housing costs: children 0 0 0 0 0 0 +1.1k
Absolute poverty, before housing costs: working-age adults 0 0 0 0 0 0 +1.1k
Absolute poverty, after housing costs: everyone -501 0 0 0 +5.4k 0 0
Absolute poverty, after housing costs: children 0 0 0 0 +3.6k 0 0
Absolute poverty, after housing costs: working-age adults -501 0 0 0 +1.8k 0 0
Relative poverty, before housing costs: everyone 0 0 0 0 0 0 +2.2k
Relative poverty, before housing costs: children 0 0 0 0 0 0 +1.1k
Relative poverty, before housing costs: working-age adults 0 0 0 0 0 0 +1.1k
Relative poverty, after housing costs: everyone 0 0 0 0 +5.4k 0 0
Relative poverty, after housing costs: children 0 0 0 0 +3.6k 0 0
Relative poverty, after housing costs: working-age adults 0 0 0 0 +1.8k 0 0

Inequality

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000 +0.0000

Mean household net income in each side's own deciles

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household 0 † 0 † 0 † 0 † 0 † 0 † -£2.00 †
Decile 2: mean household_net_income per household 0 † +£8.93 † 0 † 0 † 0 † 0 † +£2.04 †
Decile 3: mean household_net_income per household 0 † -£15 † 0 † -£0.02 † -£0.35 † -£1.48 † -£3.13 †
Decile 5: mean household_net_income per household +£0.02 † +£0.06 † +£0.02 † -£0.00 † +£0.00 † 0 † 0 †
Decile 6: mean household_net_income per household 0 † -£0.00 † 0 † 0 † 0 † 0 † 0 †
Decile 7: mean household_net_income per household +£0.03 † +£0.02 † +£0.07 † +£0.09 † 0 † 0 † +£0.01 †
Decile 8: mean household_net_income per household 0 † +£0.02 † +£0.08 † +£0.09 † +£0.15 † +£0.65 † +£0.46 †
Decile 9: mean household_net_income per household +£16 † +£1.35 † +£2.73 † +£1.58 † +£0.19 † +£0.07 † +£0.39 †
Decile 10: mean household_net_income per household -£25 † +£5.43 † +£6.90 † +£2.57 † +£1.55 † +£2.12 † +£11 †

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 -£3,384 -£8,564 -£3,604 -£38 -£8 +£88 +£0.2m
Raise higher rate by 1pp -£0.3m -£0.4m -£0.6m -£0.3m -£62,148 -£0.2m -£0.3m
Raise personal allowance by ~800GBP/year -£0 +£13 +£51,866 -£1 -£0 -£5 -£0.1m
Raise child benefit by 25GBP/week per additional child -£0 +£1.4m -£3 +£0.6m +£0.6m +£1.5m +£2.4m
Reduce Universal Credit taper rate to 20% -£0 +£5.2m +£3.1m +£3.0m +£3.1m +£4.4m +£22.5m
Raise Class 1 main employee NICs rate to 10% +£4 +£32 -£3 -£12 +£17 -£1 -£83
Raise VAT standard rate by 2pp +£43 +£64 +£45 -£23 +£38 -£48 +£127
Raise additional rate by 3pp -£0.8m -£0.9m -£1.2m -£0.5m -£0.3m -£0.3m -£2.3m
Raise the Universal Credit standard allowance by 10% +£0 +£1.6m +£107 +£1.0m +£1.0m +£1.5m +£4.3m
Raise the State Pension by 10% -£1 0 -£19,653 +£18,702 -£0 0 0

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax -£3,427 -£8,686 -£3,651 +£1 -£0 +£7 +£34
Raise higher rate by 1pp: change in income_tax -£0.3m -£0.4m -£0.6m -£0.3m -£62,180 -£0.2m -£0.3m
Raise personal allowance by ~800GBP/year: change in income_tax 0 +£8 +£51,865 +£1 -£0 -£1 +£322
Reduce Universal Credit taper rate to 20%: change in universal_credit 0 -£5.2m -£3.1m -£3.0m -£3.1m -£4.4m -£22.5m
Raise additional rate by 3pp: change in income_tax -£0.8m -£0.9m -£1.2m -£0.5m -£0.3m -£0.3m -£2.3m
Raise the Universal Credit standard allowance by 10%: change in universal_credit 0 -£1.6m 0 -£1.0m -£1.0m -£1.5m -£4.3m

Household net income by decile

Mean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.

Base decile 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1 0 0 0 0 0 0 fewer than 10 households change
Decile 2 0 0 0 0 0 0 fewer than 10 households change
Decile 3 0 fewer than 10 households change 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 4 0 0 0 0 0 0 0
Decile 5 fewer than 10 households change fewer than 10 households change fewer than 10 households change 0 fewer than 10 households change 0 0
Decile 6 0 fewer than 10 households change 0 0 0 0 0
Decile 7 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change 0 0 fewer than 10 households change
Decile 8 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 9 +£3 (+0.0%) +£1 (+0.0%) +£3 (+0.0%) fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change
Decile 10 +£3 (+0.0%) +£5 (+0.0%) +£7 (+0.0%) +£3 (+0.0%) +£2 (+0.0%) +£2 (+0.0%) +£11 (+0.0%)
all +£1 (+0.0%) 0 +£1 (+0.0%) 0 0 0 +£1 (+0.0%)
Year People gaining over £1 People losing over £1
2025-26 0.1% 0.0%
2026-27 0.1% 0.0%
2027-28 0.1% 0.0%
2028-29 0.1% 0.0%
2029-30 0.0% 0.0%
2030-31 0.1% 0.0%
2031-32 0.1% 0.0%

No change in any year: components the model counts twice; population.

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

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

Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 68ce6a6fbc uk 2.141.10 (files 6748b40f2292), core 3.33.2, py 3.13.16 aarch64 115483567a8e f210f83d5be4 1097.08s
head #2536 merged into main 111c974779 uk 2.141.10 (files a6eaa49b9c2d), core 3.33.2, py 3.13.16 aarch64 115483567a8e f210f83d5be4 1067.82s

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

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

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@juaristi22 thanks for the quick turnaround. This is my second look, at 25b5c3dfb. The delta since my review at baf3bf28f is your one commit, with no main merges, so I read all of it.

Every item from my first review is settled: 12 fixed, 1 withdrawn. One new item stops me approving: the branch now conflicts with main, because #2462 merged this morning, and fixing that touches the annual allowance code itself. Once that merge is in and the tests below pass, I expect to approve.

What I ran (fresh venv, no private data):

  • Carry-forward default, relevant UK earnings and benefit cap YAML: 116 passed, including the new earlier-year taper case.
  • test_unused_annual_allowance_projection.py, test_water_uprating.py and test_projection_horizon.py: 27 passed.
  • With YEAR_SPECIFIC_INPUTS emptied, both projection tests fail (2 failed), so they guard the fix.
  • CI at 25b5c3dfb is green, including the Python install jobs.

Earlier items

  1. Axiom line: fixed. rulespec-uk#399, #481 and #444 are queued, and the data assumptions are n/a.
  2. Frozen threshold: fixed. The docstring and changelog now say it holds at £10,572 after 2026-27, and #2537 tracks the national living wage.
  3. Stored carry-forward: fixed. apply_single_year_uprating drops YEAR_SPECIFIC_INPUTS from each projected year (data/economic_assumptions.py:302-307). Years after 2032 have no stored value either, so they fall to the formula. The new test fails without the drop.
  4. Defined-benefit wording: fixed. The body and pension-annual-allowance.md:191-195 now say results move only once data supplies a valued input amount.
  5. Ratio of 1 as a midpoint: fixed. defined_benefit_input_per_contribution.yaml:18-26 names the judgements, the 2023-24 start and the private-sector direction.
  6. prior_year_input_ratio: fixed. It is now called a convention, the label no longer says three years, and the docs give the direction of the bias.
  7. xfail cause: fixed. Thanks for running the sensitivity. With employer contributions at a third, all three figures land inside the band, and that backs "chiefly #606". The Table 7 excess is now a third check.
  8. ITEPA ss. 9 and 11: fixed. They are cited in utils/pensions.py:29-36 and the YAML header. The reason for keeping the s. 327(5) pension deductions in (the limit would otherwise depend on itself) is sound.
  9. Docstring limits: fixed.
  10. Earlier-year taper case: fixed. I checked the arithmetic. 2019-20 adjusted income of 200,000 / (1.0614 × 1.059 × 1.003) = 177,400, which gives an allowance of 40,000 - floor(27,400.16 / 2) = 26,300.
  11. Scottish water 2027-29: fixed. I checked the Draft Determination PDF. Para. 9.1.3 gives the CPI + 2% core cap for the first three years, and Table 68 (p. 258) gives CPI of 1.9%, 1.9% and 2.1%. I'd missed that table, sorry. #2538 tracks the Final Determination.
  12. £430 date: withdrawn. You're right: convert_to_fiscal_year_parameters (utils/parameters.py:119) only builds 2015 to 2040, so no April 2013 date would help.
  13. HBAI row: fixed.

New

  1. should: merge main and take #2462's treatment of returned salary sacrifice. GitHub shows the PR as conflicting. A local merge of origin/main (68ce6a6fb) conflicts in three files:

    • utils/pensions.py
    • pension_annual_allowance_threshold_income.py
    • pension_contributions_for_annual_allowance.py

    Under #2462, a supplied salary_sacrifice_returned_to_income is actual pay and an actual member payment. It is already inside employment_income and employee_pension_contributions. The NICs-only excess never enters either. So main dropped the - returned subtractions. This branch still has them:

    • utils/pensions.py:79-82: annual_allowance_net_income, with removed_pay=returned.
    • utils/pensions.py:199: workplace_pension_contributions.
    • pension_annual_allowance_threshold_income.py:29-43.
    • pension_contributions_for_annual_allowance.py:49-61: the member contributions and the defined-benefit net_pay.

    If the merge keeps those lines, a supplied return comes off twice in the defined-benefit path. My suggestion: take main's convention, so drop - returned and the removed_pay argument. Keep this PR's defined-benefit share and the relevant_uk_earnings(person, period, hmrc) helper. Then re-run the annual allowance property and taper tests, the pensions YAML and test_salary_sacrifice_ni_only.py.

For context, not a finding: the Aggregate impact comment compares against 5f4b81c47, which is from before #1863 and #2488 merged. So its flagged moves in pensioner poverty after housing costs (up to +116k in 2031-32) mostly reflect water being uprated at all (#1863), plus #2488. They don't come from this PR's country split. The rerun after the merge should show this PR alone.

Overlap

#1863 and #2488 are both on main now, so after the merge the diff will be this PR's changes only, as the body says. I'll close #2527 once this lands.

🤖 Generated with Claude Code

juaristi22 and others added 9 commits October 21, 2026 10:19
… wage

Universal Credit Regulations 2013 reg. 82(1)(a) sets the earnings exception
each year as the pay for 16 hours a week at the national living wage, times 52
and divided by 12, with any fraction of a pound disregarded (reg. 6(1A)(za)).
Before 1 April 2017 (SI 2017/138) it was a fixed £430 a month. The model held
it at the 2025-26 figure of £10,152 a year for every year.

Add uc_benefit_cap_earnings_exception_threshold, read by
is_uc_benefit_cap_exempt_earnings, with parameters for the hours and the
pre-2017 fixed amount. The threshold is now £9,516 in 2024-25 and £10,572 in
2026-27.

Part of #2523; the threshold part of #1986.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mily in the gap

The differential test's reference earnings exception still compared with a
fixed 10,152 in 2026, so a working-age family earning between 10,152 and
10,572 would fail the invariant on the threshold, not the scheme split; the
fixed examples happened to miss that range. The reference now reads
uc_benefit_cap_earnings_exception_threshold, and a single claimant earning
10,400 joins the explicit examples.

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

adjusted_total_income gave contributions relief up to its own earnings
figure (taxable employment income plus trading profits before losses
brought forward), while pension_contributions_relief and the annual
allowance tests used pay before expenses plus trading profit before capital
allowances and the trading allowance. Finance Act 2004 s. 189(2) counts
employment income chargeable to income tax, here pay and statutory pay less
allowable expenses but before the pension deductions the relief itself
gives, and income chargeable under ITTOIA 2005 Part 2, which is after
capital allowances and the trading allowance and before losses.

Move that definition into utils/pensions.py (relevant_uk_earnings and
trading_profits_before_losses) and use it, with
pension_contributions_relief_amount, in all four places. The relief-at-source
limit on the basic amount is unchanged from #2488.

Part of #2523; follows #2488.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ofwat's water bills series is the average household bill in England and
Wales. Scottish Water sets Scotland's household charges within limits from
the Water Industry Commission for Scotland, and they followed a different
path: 8.8% in 2024-25, 9.9% in 2025-26 against Ofwat's 26%, and 8.67% in
2026-27. Northern Ireland has no domestic water charges.

Add gov.economic_assumptions.yoy_growth.scottish_water.water_bills, with
WICS's draft CPI + 2% cap for 2027-28 to 2029-30 until the Final
Determination (29 October 2026), and uprate water_and_sewerage_charges by
country in apply_single_year_uprating, as council tax is: England, Wales and
unknown regions by Ofwat's series, Scotland by Scottish Water's, Northern
Ireland not at all. The column was previously held flat to 2030 and then
grown by the England and Wales index everywhere. It is kept out of the
post-2030 fallback, reset with the other growth-factor inputs, and covered by
the projection fingerprint.

Fixes #2501. Part of #2523. Overlaps #1863, which lists the column under the
Ofwat index: whichever lands second drops that line, and
test_water_charges_are_uprated_once fails until it does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st; document growth after 2032

The fingerprint read-set test now carries the water column, so it runs
uprate_water_and_sewerage_charges; reading the two series by full path keeps
every read inside the listed paths (dropping either path from the read set
now fails the test). After the projection ends in 2032, policyengine-core
grows the column by Ofwat's index in every country, as before; the docs say
so. The Ofwat growth table in water-bills.md now matches the parameter.

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

Survey data records contributions paid this year, but the annual allowance
counts a defined-benefit arrangement's increase in the value of rights
(Finance Act 2004 s. 234), not the cash paid, and adds unused allowance from
the three previous years (s. 228A), which surveys do not record.

- defined_benefit_pension_share (input, default nil) says how much of a
  person's workplace contributions (employer, net pay and salary sacrifice)
  go to defined-benefit arrangements. defined_benefit_pension_input_amount
  replaces them in pension_contributions_for_annual_allowance; where it is
  not supplied it is those contributions times
  gov.simulation.pensions.defined_benefit_input_per_contribution, set at 1:
  in the four largest public service schemes in 2024-25 the statutory input
  of an active member is 0.8 to 1.2 times employer and member contributions
  together. With no share supplied, results are unchanged.
- unused_pension_annual_allowance now defaults, from 2020-21, to an estimate:
  each of the five previous years' input is this year's times
  gov.simulation.pensions.prior_year_input_ratio (1), with input and incomes
  deflated by average earnings growth, against that year's tapered
  allowance, used earliest first (s. 228A(7)). A supplied value overrides it.
- The 2024 charge and payers on the certified dataset are checked against
  HMRC's 2024-25 statistics (30,440 people, £0.3bn) within half to one and a
  half times, as a strict expected failure: the dataset imputes employer
  contributions as three times employee contributions
  (PolicyEngine/policyengine-uk-data#606).

The taper moves into utils/pensions.py (annual_allowance_for_year) so the
carry-forward estimate can apply earlier years' rules.

Part of #2523.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…lied pension inputs apply

The UC earnings deductions case expects the whole excess charged, so it now
fixes unused_pension_annual_allowance at nil. The prior-year ratio applies to
all five years the estimate uses. A supplied unused allowance applies to its
own year, and past the projection horizon the estimate replaces a stored one.
A supplied defined-benefit input amount should come with the share of the
contributions that fund it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1863 lists water_and_sewerage_charges under the Ofwat index in
uprating_indices.yaml. uprate_water_and_sewerage_charges now grows it by
country, so the list entry would grow it a second time: drop it, and record
the column among the code-health test's deliberate exceptions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…assumptions, test against Table 7's excess

- Dataset projection no longer copies a stored unused_pension_annual_allowance
  into later years (YEAR_SPECIFIC_INPUTS): its three-year window moves each
  year, so projected years use the estimate.
- The HMRC check also compares the chargeable amount with Table 7's £672m of
  excess, and names the gap as known data gaps, chiefly
  policyengine-uk-data#606: with employer contributions at a third of their
  stored values, count, charge and excess all fall within the band.
- Parameters and docs say the defined-benefit ratio of 1 is a chosen
  midpoint (ten years' service; valid from 2023-24, when public service
  schemes revalue on 6 April; private schemes would push it below 1), that
  the carry-forward ratio of 1 is a convention which probably understates
  carry forward, and what a supplied share alone changes (only net pay to a
  defined-benefit scheme from age 75). The carry-forward ratio's label now
  matches its five-year use.
- relevant_uk_earnings cites ITEPA 2003 ss. 9(2) and 11 for allowable
  expenses and says why pension deductions stay in; it and the carry-forward
  estimate note the limits left (furnished holiday lettings before 2025-26,
  the five-year window, 2015-16 alignment).
- A carry-forward case where the taper binds only in an earlier year.
- The UC benefit cap threshold notes that the national living wage parameter
  ends at April 2026, so the threshold holds at £10,572 after it.
- Scottish water 2027-29 cite the Draft Determination's core cap (para.
  9.1.3) and CPI forecast (Table 68); the HBAI validation row for water is
  updated, as in #2527.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@juaristi22
juaristi22 force-pushed the fix-2523-survey-pensions-uc-cap-water branch from 25b5c3d to baf2d54 Compare October 21, 2026 09:42

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@juaristi22 thanks. Third and last look, at baf2d54ff. You rebased onto 68ce6a6fb rather than merging, so I compared each commit with its earlier version (git range-diff) and each touched file with origin/main. Only commits 3, 6 and 9 changed, all in the salary-sacrifice handling. Approving.

Item 14: fixed

  • pension_annual_allowance_threshold_income.py is now byte-identical to main.
  • relevant_uk_earnings(person, period, hmrc) has lost its removed_pay argument. annual_allowance_net_income no longer subtracts returned. workplace_pension_contributions and the defined-benefit net_pay in pension_contributions_for_annual_allowance.py:49-58 now take employee_pension_contributions as it is, so a supplied return is counted once as a member payment.
  • No salary_sacrifice_returned_to_income reads are left outside the two input aggregates (employment_income, employee_pension_contributions).
  • The PR's own pieces survived: the defined-benefit share and input amount, trading_profits_before_losses, the new relevant_uk_earnings, annual_allowance_for_year and workplace_pension_contributions.

I checked it on a household, 2026: pay £250k, £20k net pay, £15k employer, £10k sacrifice, with a supplied £5k return. With no defined-benefit share, main and this branch give identical employment income, contributions for the AA, threshold income (£240k), adjusted net income, AA (£50k) and relief. The AA contributions are £50k on both. The code before the rebase gave £45k, because it took the return off. With the share at 1 and a £30k input amount, the AA contributions are £30k, so the defined-benefit path still works.

What I ran (fresh venv, no private data)

  • Pensions YAML: 147 passed.
  • Income tax reliefs YAML, plus the two #2462 salary-sacrifice NI YAMLs: 77 passed.
  • AA properties and taper, test_salary_sacrifice_ni_only.py, test_salary_sacrifice_needs_pay_properties.py, test_unused_annual_allowance_projection.py and tests/code_health: 2,568 passed.
  • CI at baf2d54ff: Lint and Test / Result pass. One Release test shard is still pending. Aggregate impact now compares 68ce6a6fb with this branch merged onto it (111c97477), so it shows this PR alone. It flags no moves.

Nothing new at must or should.

🤖 Generated with Claude Code

@juaristi22
juaristi22 added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 3a03cb4 Oct 21, 2026
31 checks passed
@juaristi22
juaristi22 deleted the fix-2523-survey-pensions-uc-cap-water branch October 21, 2026 12:09
MaxGhenis added a commit that referenced this pull request Oct 23, 2026
Main's version of the page predates #2488 (merged 20 October) and #2536
(merged 21 October). Corrections, each checked against main a45baf5:

- #2488 has merged; the page no longer calls it open.
- unused_pension_annual_allowance is estimated from 2020-21
  (formula_2020) rather than defaulting to nil; nil for the £100k example.
- Defined-benefit accrual counts through defined_benefit_pension_share and
  defined_benefit_pension_input_amount, not only a supplied
  pension_contributions_for_annual_allowance.
- Relevant UK earnings are taxable employment income (less expenses) plus
  trading profit after capital allowances and the trading allowance, before
  losses (utils/pensions.py).
- The annual allowance charge keeps relief-at-source contributions in
  income and raises the rate limits only when s. 192(4)'s condition holds
  (private_pension_contributions_tax.py); new £2,946 example.
- s. 192(4) raises the higher rate limit too; the higher-rate top-up can be
  claimed outside Self Assessment and differs in Scotland.
- The model gives no relief on basic-rate RAS above taxable income.
- Tapered allowance minimum was £4,000 in 2020-21 to 2022-23.
- marginal_tax_rate perturbs the two eldest adults in turn.
- #704 gives no year or age, and its reporter expected £0 and -£1,200, so
  the column is the total relief; examples re-run on 2.148.2.
- Replaced the released .added fragment with a .changed fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 23, 2026
STBM claims checked against ScottishTaxBenefitModel.jl at f534ca1:
- calculate_pension_taxation! raises non_savings_thresholds from the basic
  rate onwards (IncomeTaxCalculations.jl:138), so it widens the basic band
  and moves the higher limits up, not "every band".
- pension_contrib_basic_amount is £10,000 in the 2023-24 to 2026-27 rUK
  files, which the Scottish systems inherit; £3,600 before.
- In its rUK systems from 2023-24, non_savings_basic_rate points at 40%.

PolicyEngine UK claims checked against main a45baf5:
- The relief cap rises to £3,600 for relief-at-source contributions
  (utils/pensions.py).
- employer_pension_contributions is an input: Microcosm UK draws it from
  ONS ASHE Table P10 bands, the Enhanced FRS uses 3x employee contributions.
- unused_pension_annual_allowance is estimated from 2020-21 (#2536).
- Threshold income has been tested at £200,000 since 2020-21
  (taper 240,000 - 40,000), and pre-2015 salary sacrifice is an input.
- Clarified "default chargeable amount" and the Scottish starter-rate case.
- Replaced the released .added fragment with a .changed fragment.

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

2 participants