Skip to content

Project savings interest by interest received per person - #2638

Open
vahid-ahmadi wants to merge 6 commits into
mainfrom
savings-interest-per-capita-uprating
Open

vahid-ahmadi wants to merge 6 commits into
mainfrom
savings-interest-per-capita-uprating

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Oct 24, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Part of #1862 (the savings_interest_income item). savings_interest_income was projected by obr.per_capita.gdp, while it declared ons.household_interest_income, whose 2025 to 2030 values were OBR non-labour income growth. This PR projects it by households' interest received per person:

  • Outturn to 2025: ONS HAXV, households' (S.14) interest received, D.41 resources, release of 30 September 2026. 2025 is 95,477 / 98,189 - 1 = -2.76%, against +3.49% in the parameter and +4.38% from per_capita.gdp. 2020 to 2024 are restated from the exact £m levels (2020 was 0.000; it is -30.25%).
  • 2026 to 2030: interest = stock x rate, so (1 + growth in household financial assets) x (deposit rate this year / last year) - 1, from the OBR March 2026 EFO economy tables, calendar-year rows (HAXV is calendar). For example 2026: (7,109.48 / 6,858.72) x (1.9997 / 2.2870) - 1 = -9.37%.
  • Per person: household weights already grow by ons.population, so each person's interest grows by (1 + aggregate) / (1 + population) - 1 (2025: 0.9724 / 1.0030 - 1 = -3.05%). Growing it by the aggregate would count population growth twice, the defect Council tax projection may double-count tax base growth #2067 fixed for council tax. The new series is yoy_growth.ons.per_capita.household_interest_income; the variable now declares its indices twin, so Core's post-2032 projection uses the same path, and the KNOWN_INDEX_OVERRIDES entry goes. The series starts in 2021 because ons.population does, so its index sets index_base_year: 2020: the index is 1 on 1 January 2020 and its first step is the 2021 growth, so direct index uprating from 2020 to 2021 gives the same 121.94 per 100 as dataset projection. No 2020 per-person growth is invented.
  • Label: the series said D.41g. HAXV is D.41, after the FISIM adjustment. The description and references now say so.

Evidence

Source Values used
ONS HAXV (UKEA, 30 Sep 2026), £m 2019 22,923; 2020 15,988; 2021 19,566; 2022 43,282; 2023 86,092; 2024 98,189; 2025 95,477
OBR March 2026 EFO, Table 1.11, household financial assets (NNML), £bn 2025 6,858.72; 2026 7,109.48; 2027 7,287.74; 2028 7,460.84; 2029 7,619.20; 2030 7,768.51
OBR March 2026 EFO, Table 1.9, deposit rate, % 2024 2.539; 2025 2.287; 2026 2.000; 2027 2.078; 2028 2.258; 2029 2.417; 2030 2.571

Each value's arithmetic is in a comment on the parameter.

Assumptions

  • The OBR does not forecast household interest received or deposits. Financial assets (Table 1.11) are the only household asset stock it forecasts, so they stand in for the deposit stock. They include pensions and equities, so they are a proxy. Table 1.9's deposit rate is the closest OBR interest rate series.

Aggregate effect

Enhanced FRS 2024-25 (cached release, sha256 5ba399ea...b960b6), base year 2024, so 2024 is unchanged:

Year Savings interest, main This PR Change Income tax Household net income
2025 £80.1bn £74.1bn -7.5% -£2.0bn -£4.0bn
2026 £82.8bn £67.2bn -18.9% -£5.1bn -£10.5bn
2027 £85.8bn £71.6bn -16.6% -£4.9bn -£9.3bn
2028 £88.8bn £79.6bn -10.4% -£3.4bn -£5.8bn
2029 £91.8bn £87.0bn -5.2% -£1.8bn -£3.0bn
2030 £95.1bn £94.4bn -0.8% -£0.3bn -£0.5bn

The fall to 2026 follows the deposit rate (2.29% to 2.00%); the recovery after it follows the rate rising back to 2.57% by 2030.

Not in this PR

Tests

policyengine_uk/tests/test_savings_interest_uprating.py: the outturn against the HAXV levels, the forecast against the OBR stock and rate, the per-person series against the aggregate and ons.population, and a projected two-person dataset whose weighted total grows by 95,477 / 98,189 into 2025, and a 2020 to 2021 check that the direct index route and dataset projection agree (both 121.94 from 100). All 24 fail on main and pass here; the 2020 to 2021 check also failed at caba141 (100 against 121.94). tests/code_health/test_uprating_declarations.py passes with the override removed.

Reproducer: policyengine_uk/tests/test_savings_interest_uprating.py::test_outturn_is_haxv_growth, policyengine_uk/tests/test_savings_interest_uprating.py::test_forecast_is_financial_assets_growth_times_the_deposit_rate_ratio, policyengine_uk/tests/test_savings_interest_uprating.py::test_per_person_growth_is_the_aggregate_net_of_population_growth, policyengine_uk/tests/test_savings_interest_uprating.py::test_projected_total_interest_tracks_haxv_in_2025, policyengine_uk/tests/test_savings_interest_uprating.py::test_direct_index_route_matches_dataset_projection_from_2020_to_2021

axiom: n/a: dataset uprating and economic-assumption data, no policy rule changes

🤖 Generated with Claude Code

ONS HAXV outturn to 2025, then OBR household financial assets growth
times the Table 1.9 deposit rate ratio, net of ons.population growth.

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

github-actions Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 2c7bf5a775 against head 0b0e6bd0e5, 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: 165 (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

Measure Year Base Head Change
Decile 9: mean household_net_income per household 2029-30 £85,584 £83,661 -£1,923
Decile 9: mean household_net_income per household 2026-27 £80,992 £79,253 -£1,739
Decile 9: mean household_net_income per household 2028-29 £84,246 £82,470 -£1,777
Decile 10: mean household_net_income per household 2029-30 £126,775 £129,098 +£2,323
Decile 9: mean household_net_income per household 2027-28 £82,907 £81,473 -£1,434
Income tax 2026-27 £315.23bn £309.92bn -£5.30bn
Decile 10: mean household_net_income per household 2025-26 £117,005 £118,780 +£1,776
Income tax 2027-28 £334.00bn £328.95bn -£5.05bn
Decile 7: mean household_net_income per household 2027-28 £57,443 £56,604 -£839
Government balance, each receipt once 2026-27 £391.59bn £386.29bn -£5.30bn
gov_balance 2026-27 £391.59bn £386.29bn -£5.30bn
Decile 10: mean household_net_income per household 2028-29 £124,681 £126,291 +£1,609
Decile 9: mean household_net_income per household 2025-26 £78,890 £77,923 -£967
Government balance, each receipt once 2027-28 £428.62bn £423.57bn -£5.05bn
gov_balance 2027-28 £428.62bn £423.57bn -£5.05bn
Decile 10: mean household_net_income per household 2026-27 £120,262 £121,511 +£1,248
pre_budget_change_household_tax 2026-27 £512.74bn £507.43bn -£5.30bn
household_tax 2026-27 £520.87bn £515.57bn -£5.30bn
Income tax 2028-29 £349.45bn £345.99bn -£3.46bn
Absolute poverty, before housing costs: pensioners 2026-27 1,584k 1,662k +77.9k
Household market income 2026-27 £1,702.77bn £1,686.60bn -£16.16bn
Decile 8: mean household_net_income per household 2025-26 £68,789 £68,145 -£644
pre_budget_change_household_tax 2027-28 £541.54bn £536.49bn -£5.05bn
household_tax 2027-28 £549.93bn £544.88bn -£5.05bn
Decile 8: mean household_net_income per household 2026-27 £70,704 £70,065 -£639
Decile 10: mean household_net_income per household 2027-28 £122,221 £123,306 +£1,084
Decile 8: mean household_net_income per household 2027-28 £71,779 £71,147 -£631
Household market income 2027-28 £1,757.35bn £1,742.87bn -£14.48bn
Decile 5: mean household_net_income per household 2026-27 £45,443 £45,074 -£368
Government balance, each receipt once 2028-29 £454.08bn £450.62bn -£3.46bn
gov_balance 2028-29 £454.08bn £450.62bn -£3.46bn
Household net income (HBAI definition) 2026-27 £1,497.73bn £1,486.88bn -£10.85bn
Decile 3: mean household_net_income per household 2026-27 £35,455 £35,202 -£253
Decile 7: mean household_net_income per household 2026-27 £56,509 £56,106 -£404
Absolute poverty, before housing costs: pensioners 2026-27 13.5% 14.1% +0.66pp
Income tax 2025-26 £294.46bn £292.51bn -£1.95bn
Household net income 2026-27 £1,685.25bn £1,674.39bn -£10.86bn
Decile 6: mean household_net_income per household 2026-27 £49,126 £49,431 +£305
Household net income (HBAI definition) 2027-28 £1,532.81bn £1,523.40bn -£9.41bn
pre_budget_change_household_tax 2028-29 £564.86bn £561.40bn -£3.46bn

125 more flags are in the report artifact.

Receipts by tax head

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax -£1.95bn -£5.30bn -£5.05bn -£3.46bn -£2.08bn -£599.6m +£1.05bn
Capital gains tax -£90,670 -£0.2m -£0.2m -£0.2m -£93,414 -£27,775 +£48,252
VAT on private school fees +£0.7m +£3.2m +£2.9m +£3.6m +£7.2m -£1.9m +£1.5m

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Pension Credit -£861 -£2,997 -£2,214 -£1,935 -£1,007 -£0.2m +£0.3m
Universal Credit -£86 -£13,734 -£13,619 -£9,146 -£6,794 -£2,310 +£2,290
Housing Benefit -£473 -£1,289 -£1,270 -£839 -£487 -£144 +£252
Council Tax Reduction -£17,499 -£49,460 -£70,151 -£77,586 -£64,180 -£19,294 +£55,956
Tax-Free Childcare 0 +£39,704 0 0 0 0 0
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
Pension Credit 0 -16 0 0 0 0 0
Council Tax Reduction -962 0 0 -903 0 0 0
Tax-Free Childcare 0 +30 0 0 0 0 0
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 -£1.95bn -£5.30bn -£5.05bn -£3.46bn -£2.08bn -£601.5m +£1.05bn
Government spending -£18,919 † -£27,776 † -£87,254 † -£89,506 † -£72,468 † -£0.2m † +£0.4m †
Government balance, each receipt once -£1.95bn † -£5.30bn † -£5.05bn † -£3.46bn † -£2.08bn † -£601.3m † +£1.05bn †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax -£1.95bn -£5.30bn -£5.05bn -£3.46bn -£2.08bn -£601.5m +£1.05bn
household_tax -£1.95bn -£5.30bn -£5.05bn -£3.46bn -£2.09bn -£599.7m +£1.05bn
pre_budget_change_household_tax -£1.95bn -£5.30bn -£5.05bn -£3.46bn -£2.09bn -£599.7m +£1.05bn
gov_spending -£18,919 † -£27,776 † -£87,254 † -£89,506 † -£72,468 † -£0.2m † +£0.4m †
household_benefits -£18,919 † -£27,776 † -£87,254 † -£89,506 † -£72,468 † -£0.2m † +£0.4m †
gov_balance -£1.95bn † -£5.30bn † -£5.05bn † -£3.46bn † -£2.08bn † -£601.3m † +£1.05bn †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income -£5.88bn -£16.16bn -£14.48bn -£9.57bn -£5.55bn -£1.64bn +£2.87bn
Household net income -£3.93bn † -£10.86bn † -£9.42bn † -£6.10bn † -£3.47bn † -£1.04bn † +£1.82bn †
Household net income (HBAI definition) -£3.92bn -£10.85bn -£9.41bn -£6.09bn -£3.46bn -£1.04bn +£1.82bn

Poverty rates

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone +0.01pp +0.32pp +0.01pp +0.02pp +0.01pp +0.00pp -0.02pp
Absolute poverty, before housing costs: children +0.00pp +0.46pp 0 0 0 0 -0.04pp
Absolute poverty, before housing costs: working-age adults +0.00pp +0.18pp +0.01pp +0.01pp +0.00pp +0.00pp -0.01pp
Absolute poverty, before housing costs: pensioners +0.03pp +0.66pp +0.05pp +0.09pp +0.03pp +0.02pp -0.02pp
Absolute poverty, after housing costs: everyone +0.07pp +0.09pp +0.05pp +0.03pp +0.02pp +0.00pp -0.03pp
Absolute poverty, after housing costs: children +0.02pp +0.01pp +0.02pp +0.01pp +0.04pp 0 0
Absolute poverty, after housing costs: working-age adults +0.07pp +0.08pp +0.01pp +0.01pp +0.01pp +0.00pp -0.05pp
Absolute poverty, after housing costs: pensioners +0.15pp +0.20pp +0.20pp +0.15pp +0.03pp +0.00pp -0.01pp
Relative poverty, before housing costs: everyone +0.01pp -0.02pp +0.02pp -0.03pp -0.08pp +0.00pp -0.00pp
Relative poverty, before housing costs: children 0 -0.11pp 0 -0.06pp -0.20pp -0.00pp +0.00pp
Relative poverty, before housing costs: working-age adults +0.00pp -0.01pp +0.01pp -0.03pp -0.06pp -0.00pp +0.00pp
Relative poverty, before housing costs: pensioners +0.04pp +0.04pp +0.10pp -0.03pp -0.00pp +0.02pp -0.04pp
Relative poverty, after housing costs: everyone +0.02pp +0.02pp +0.03pp +0.03pp +0.03pp +0.03pp +0.00pp
Relative poverty, after housing costs: children -0.08pp -0.06pp -0.07pp -0.02pp -0.02pp -0.01pp 0
Relative poverty, after housing costs: working-age adults +0.04pp +0.01pp +0.04pp +0.06pp +0.05pp +0.05pp +0.00pp
Relative poverty, after housing costs: pensioners +0.08pp +0.16pp +0.12pp +0.02pp 0 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 +4.9k +223.5k +7.6k +12.6k +5.3k +3.2k -15.0k
Absolute poverty, before housing costs: children +39 +68.5k 0 0 0 0 -6.3k
Absolute poverty, before housing costs: working-age adults +1.4k +77.1k +2.4k +2.8k +2.0k +920 -6.3k
Absolute poverty, before housing costs: pensioners +3.5k +77.9k +5.2k +9.8k +3.3k +2.3k -2.5k
Absolute poverty, after housing costs: everyone +51.5k +59.7k +31.8k +23.5k +13.8k +713 -23.7k
Absolute poverty, after housing costs: children +3.2k +2.2k +3.1k +2.2k +5.3k 0 0
Absolute poverty, after housing costs: working-age adults +30.4k +33.7k +5.4k +4.7k +5.0k +453 -22.3k
Absolute poverty, after housing costs: pensioners +17.9k +23.8k +23.3k +16.7k +3.5k +260 -1.4k
Relative poverty, before housing costs: everyone +5.5k -16.3k +14.5k -23.9k -57.1k +52 -3.2k
Relative poverty, before housing costs: children 0 -16.3k 0 -9.0k -30.3k -593 +322
Relative poverty, before housing costs: working-age adults +1.2k -5.1k +3.4k -11.7k -26.5k -1.5k +807
Relative poverty, before housing costs: pensioners +4.4k +5.1k +11.1k -3.2k -200 +2.2k -4.3k
Relative poverty, after housing costs: everyone +13.0k +16.9k +18.6k +22.7k +19.0k +19.7k +107
Relative poverty, after housing costs: children -12.5k -8.2k -11.2k -3.5k -2.4k -1.3k 0
Relative poverty, after housing costs: working-age adults +16.5k +5.8k +16.4k +24.4k +21.4k +21.0k +107
Relative poverty, after housing costs: pensioners +9.1k +19.3k +13.4k +1.9k 0 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.0008 -0.0022 -0.0019 -0.0012 -0.0007 -0.0002 +0.0004

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 -£21 † -£74 † -£68 † -£46 † -£66 † -£9.87 † +£35 †
Decile 2: mean household_net_income per household -£9.55 † -£14 † -£106 † +£33 † +£69 † +£5.90 † -£7.46 †
Decile 3: mean household_net_income per household -£31 † -£253 † -£53 † -£85 † +£2.47 † -£7.95 † +£14 †
Decile 4: mean household_net_income per household -£24 † +£11 † -£9.82 † -£170 † -£176 † -£0.79 † -£4.53 †
Decile 5: mean household_net_income per household +£4.17 † -£368 † +£259 † +£258 † +£272 † +£2.84 † +£18 †
Decile 6: mean household_net_income per household -£41 † +£305 † +£57 † -£243 † -£221 † -£20 † +£74 †
Decile 7: mean household_net_income per household -£100 † -£404 † -£839 † -£298 † -£211 † -£1.30 † -£65 †
Decile 8: mean household_net_income per household -£644 † -£639 † -£631 † -£376 † +£325 † -£9.51 † +£16 †
Decile 9: mean household_net_income per household -£967 † -£1,739 † -£1,434 † -£1,777 † -£1,923 † -£74 † +£131 †
Decile 10: mean household_net_income per household +£1,776 † +£1,248 † +£1,084 † +£1,609 † +£2,323 † -£206 † +£302 †

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp -£0.9m +£45.1m +£3.2m +£0.8m +£0.6m +£1.9m +£56,949
Raise higher rate by 1pp -£0.1m +£50.3m +£10.4m +£3.1m +£0.8m +£0.6m -£2.6m
Raise personal allowance by ~800GBP/year +£1.7m -£1.1m -£3.5m +£10.7m -£6.4m +£1.0m +£1.4m
Raise child benefit by 25GBP/week per additional child +£0.4m -£1.5m -£1.9m +£0.3m -£0.1m +£1.8m -£1.5m
Reduce Universal Credit taper rate to 20% +£42.1m +£0.1m +£1.0m -£10.1m -£4.7m +£3.4m -£4.1m
Raise Class 1 main employee NICs rate to 10% -£0.3m +£42.9m +£4.4m -£1.8m -£5.2m +£2.0m +£86,198
Raise VAT standard rate by 2pp +£74,180 +£0.3m +£0.3m +£0.4m +£0.7m -£0.2m +£0.2m
Raise additional rate by 3pp -£2.3m -£8.7m -£2.3m -£9.1m -£10.2m suppressed suppressed
Raise the Universal Credit standard allowance by 10% -£0.7m +£3.6m +£1.1m +£0.7m +£0.1m +£2.0m -£1.6m
Raise the State Pension by 10% -£10.3m -£9.8m +£29.8m +£6.2m -£4.5m +£10.3m +£10.8m

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 -£0.2m -£3.4m -£2.0m -£0.8m -£39,762 -£0.1m -£22,564
Raise higher rate by 1pp: change in income_tax -£0.7m +£1.4m +£3.2m +£3.4m +£2.0m +£0.6m -£1.0m
Raise personal allowance by ~800GBP/year: change in income_tax +£2.4m -£1.6m -£3.5m +£8.1m +£0.3m +£0.7m +£1.3m
Reduce Universal Credit taper rate to 20%: change in universal_credit -£1,030 +£3,574 -£31,896 +£1,595 -£1,911 -£1,231 +£2,995
Raise additional rate by 3pp: change in income_tax -£2.7m -£12.4m -£8.3m -£6.8m -£3.9m suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit +£0 -£155 0 +£23 +£13 -£0 -£7

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 -£26 (-0.1%) -£71 (-0.4%) -£68 (-0.4%) -£45 (-0.2%) -£25 (-0.1%) -£7 (-0.0%) +£13 (+0.1%)
Decile 2 -£19 (-0.1%) -£49 (-0.2%) -£39 (-0.1%) -£22 (-0.1%) -£14 (-0.0%) -£4 (-0.0%) +£7 (+0.0%)
Decile 3 -£13 (-0.0%) -£39 (-0.1%) -£33 (-0.1%) -£20 (-0.1%) -£11 (-0.0%) -£3 (-0.0%) +£5 (+0.0%)
Decile 4 -£31 (-0.1%) -£49 (-0.1%) -£46 (-0.1%) -£33 (-0.1%) -£18 (-0.0%) -£5 (-0.0%) +£9 (+0.0%)
Decile 5 -£26 (-0.1%) -£107 (-0.2%) -£94 (-0.2%) -£60 (-0.1%) -£35 (-0.1%) -£10 (-0.0%) +£18 (+0.0%)
Decile 6 -£35 (-0.1%) -£102 (-0.2%) -£75 (-0.1%) -£53 (-0.1%) -£30 (-0.1%) -£8 (-0.0%) +£13 (+0.0%)
Decile 7 -£39 (-0.1%) -£104 (-0.2%) -£102 (-0.2%) -£64 (-0.1%) -£33 (-0.1%) -£11 (-0.0%) +£19 (+0.0%)
Decile 8 -£87 (-0.1%) -£236 (-0.3%) -£203 (-0.3%) -£132 (-0.2%) -£79 (-0.1%) -£22 (-0.0%) +£37 (+0.0%)
Decile 9 -£260 (-0.3%) -£709 (-0.9%) -£617 (-0.7%) -£397 (-0.5%) -£231 (-0.3%) -£64 (-0.1%) +£123 (+0.1%)
Decile 10 -£706 (-0.6%) -£1,966 (-1.6%) -£1,694 (-1.4%) -£1,096 (-0.9%) -£613 (-0.5%) -£188 (-0.1%) +£320 (+0.2%)
all -£126 (-0.2%) -£349 (-0.6%) -£303 (-0.5%) -£196 (-0.3%) -£111 (-0.2%) -£33 (-0.1%) +£58 (+0.1%)
Year People gaining over £1 People losing over £1
2025-26 0.0% 46.6%
2026-27 0.0% 53.5%
2027-28 0.0% 50.4%
2028-29 0.0% 50.0%
2029-30 0.0% 46.2%
2030-31 0.0% 38.2%
2031-32 41.7% 0.0%

No change in any year: population.

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 2c7bf5a775 uk 2.164.1 (files 6e0aa193e191), core 3.33.12, py 3.13.18 aarch64 baf287432de7 1eac2ca06b91 1922.49s
head #2638 merged into main 0b0e6bd0e5 uk 2.164.1 (files 84d2b90a38c3), core 3.33.12, py 3.13.18 aarch64 baf287432de7 1eac2ca06b91 1868.47s

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 £292.51bn £309.92bn £328.95bn £345.99bn £363.01bn £382.56bn £398.75bn
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.02bn £2.09bn £2.14bn £2.21bn £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 £83.04bn £85.11bn £86.31bn £87.90bn £88.58bn
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.23bn £5.35bn
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.56bn £0.57bn £0.57bn £0.57bn
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.55bn £0.56bn £0.58bn £0.59bn £0.59bn £0.59bn £0.57bn
Extended childcare entitlement £2.99bn £3.50bn £3.62bn £3.75bn £3.83bn £3.92bn £4.01bn
Universal childcare entitlement £2.06bn £2.22bn £2.29bn £2.38bn £2.44bn £2.51bn £2.56bn
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,357k 6,349k 6,350k 6,318k 6,307k 6,299k 6,253k
Housing Benefit 1,249k 1,245k 1,246k 1,229k 1,229k 1,229k 1,232k
Council Tax Reduction 3,175k 3,195k 3,200k 3,214k 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,046k
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 355k 353k 351k 340k
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,014k 1,025k 1,021k 1,022k 1,008k 1,005k 991k
Extended childcare entitlement 795k 800k 804k 806k 809k 814k 814k
Universal childcare entitlement 1,071k 1,072k 1,074k 1,076k 1,079k 1,089k 1,090k
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 £890.05bn £929.84bn £974.50bn £1,010.39bn £1,050.06bn £1,088.53bn £1,123.42bn
Government spending £529.37bn † £543.55bn † £550.93bn † £559.76bn † £567.52bn † £576.28bn † £584.02bn †
Government balance, each receipt once £360.68bn † £386.29bn † £423.57bn † £450.62bn † £482.53bn † £512.25bn † £539.39bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £890.05bn £929.84bn £974.50bn £1,010.39bn £1,050.06bn £1,088.53bn £1,123.42bn
household_tax £490.02bn £515.57bn £544.88bn £570.46bn £596.81bn £623.66bn £646.94bn
pre_budget_change_household_tax £482.20bn £507.43bn £536.49bn £561.40bn £587.53bn £614.13bn £637.14bn
gov_spending £529.37bn † £543.55bn † £550.93bn † £559.76bn † £567.52bn † £576.28bn † £584.02bn †
household_benefits £529.37bn † £543.55bn † £550.93bn † £559.76bn † £567.52bn † £576.28bn † £584.02bn †
gov_balance £360.68bn † £386.29bn † £423.57bn † £450.62bn † £482.53bn † £512.25bn † £539.39bn †
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,632.08bn £1,686.60bn £1,742.87bn £1,796.84bn £1,850.41bn £1,910.79bn £1,973.31bn
Household net income £1,632.76bn † £1,674.39bn † £1,707.47bn † £1,743.73bn † £1,777.65bn † £1,818.74bn † £1,864.45bn †
Household net income (HBAI definition) £1,445.64bn £1,486.88bn £1,523.40bn £1,561.12bn £1,596.54bn £1,637.00bn £1,681.03bn
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.9% 16.4% 16.3% 16.5% 16.5% 16.6%
Absolute poverty, before housing costs: children 24.7% 22.7% 23.3% 22.9% 23.1% 23.2% 23.4%
Absolute poverty, before housing costs: working-age adults 14.1% 14.1% 14.7% 14.7% 14.8% 14.8% 14.9%
Absolute poverty, before housing costs: pensioners 13.7% 14.1% 14.0% 14.0% 14.0% 14.0% 13.9%
Absolute poverty, after housing costs: everyone 21.7% 21.2% 22.1% 22.6% 22.8% 23.0% 23.3%
Absolute poverty, after housing costs: children 33.3% 31.3% 32.2% 32.4% 32.6% 33.0% 33.9%
Absolute poverty, after housing costs: working-age adults 20.0% 20.0% 20.8% 21.6% 21.8% 22.0% 22.1%
Absolute poverty, after housing costs: pensioners 12.8% 12.8% 13.3% 13.4% 13.3% 13.4% 13.5%
Relative poverty, before housing costs: everyone 17.0% 16.3% 16.4% 16.3% 16.2% 16.3% 16.7%
Relative poverty, before housing costs: children 25.9% 23.3% 23.3% 22.8% 22.6% 22.9% 23.7%
Relative poverty, before housing costs: working-age adults 14.5% 14.3% 14.6% 14.6% 14.6% 14.7% 15.0%
Relative poverty, before housing costs: pensioners 14.5% 14.7% 14.0% 13.8% 13.8% 13.9% 13.9%
Relative poverty, after housing costs: everyone 21.5% 21.0% 21.2% 21.3% 21.4% 21.5% 21.7%
Relative poverty, after housing costs: children 33.0% 31.1% 31.0% 31.0% 31.1% 31.2% 31.7%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.2% 20.4% 20.5% 20.7% 20.8%
Relative poverty, after housing costs: pensioners 12.6% 12.6% 12.3% 11.8% 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,283k 11,061k 11,411k 11,371k 11,483k 11,509k 11,628k
Absolute poverty, before housing costs: children 3,688k 3,401k 3,496k 3,437k 3,477k 3,499k 3,539k
Absolute poverty, before housing costs: working-age adults 5,967k 5,998k 6,311k 6,357k 6,419k 6,427k 6,511k
Absolute poverty, before housing costs: pensioners 1,628k 1,662k 1,604k 1,578k 1,586k 1,583k 1,578k
Absolute poverty, after housing costs: everyone 14,996k 14,722k 15,328k 15,703k 15,876k 16,048k 16,307k
Absolute poverty, after housing costs: children 4,979k 4,691k 4,835k 4,865k 4,903k 4,986k 5,125k
Absolute poverty, after housing costs: working-age adults 8,493k 8,525k 8,970k 9,330k 9,469k 9,549k 9,647k
Absolute poverty, after housing costs: pensioners 1,524k 1,506k 1,524k 1,508k 1,504k 1,513k 1,536k
Relative poverty, before housing costs: everyone 11,756k 11,315k 11,404k 11,324k 11,301k 11,410k 11,699k
Relative poverty, before housing costs: children 3,872k 3,488k 3,496k 3,425k 3,401k 3,451k 3,577k
Relative poverty, before housing costs: working-age adults 6,160k 6,098k 6,305k 6,337k 6,337k 6,386k 6,541k
Relative poverty, before housing costs: pensioners 1,724k 1,729k 1,603k 1,562k 1,563k 1,573k 1,581k
Relative poverty, after housing costs: everyone 14,862k 14,600k 14,747k 14,832k 14,904k 15,025k 15,219k
Relative poverty, after housing costs: children 4,929k 4,656k 4,649k 4,660k 4,678k 4,700k 4,798k
Relative poverty, after housing costs: working-age adults 8,442k 8,466k 8,695k 8,845k 8,898k 8,985k 9,056k
Relative poverty, after housing costs: pensioners 1,491k 1,478k 1,402k 1,326k 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.3072 0.3035 0.3045 0.3050 0.3061 0.3071 0.3092
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,660 † £17,821 † £17,837 † £18,099 † £18,243 † £18,571 † £18,774 †
Decile 2: mean household_net_income per household £27,929 † £28,860 † £28,577 † £29,116 † £29,424 † £29,685 † £30,158 †
Decile 3: mean household_net_income per household £34,289 † £35,202 † £36,055 † £36,541 † £37,220 † £37,714 † £38,233 †
Decile 4: mean household_net_income per household £38,910 † £40,614 † £41,863 † £42,614 † £43,246 † £43,928 † £44,543 †
Decile 5: mean household_net_income per household £43,244 † £45,074 † £46,046 † £47,253 † £48,001 † £48,924 † £50,246 †
Decile 6: mean household_net_income per household £47,859 † £49,431 † £50,943 † £51,485 † £52,379 † £54,182 † £55,269 †
Decile 7: mean household_net_income per household £55,583 † £56,106 † £56,604 † £57,668 † £58,872 † £59,210 † £60,602 †
Decile 8: mean household_net_income per household £68,145 † £70,065 † £71,147 † £72,980 † £74,270 † £75,346 † £77,257 †
Decile 9: mean household_net_income per household £77,923 † £79,253 † £81,473 † £82,470 † £83,661 † £87,095 † £89,728 †
Decile 10: mean household_net_income per household £118,780 † £121,511 † £123,306 † £126,291 † £129,098 † £128,902 † £131,788 †
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.70bn £6.64bn £6.88bn £7.04bn £7.26bn £7.48bn
Raise higher rate by 1pp £3.61bn £3.92bn £4.01bn £4.24bn £4.43bn £4.71bn £4.83bn
Raise personal allowance by ~800GBP/year £-3.80bn £-3.92bn £-3.99bn £-4.08bn £-4.18bn £-4.21bn £-1.96bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.55bn £-1.39bn £-1.30bn £-1.17bn £-1.06bn
Reduce Universal Credit taper rate to 20% £-20.33bn £-20.88bn £-21.32bn £-21.53bn £-21.86bn £-22.24bn £-22.43bn
Raise Class 1 main employee NICs rate to 10% £10.89bn £11.35bn £11.74bn £12.03bn £12.30bn £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.89bn £3.15bn £3.22bn £3.41bn £3.60bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.06bn £-3.18bn £-3.25bn £-3.33bn £-3.44bn £-3.48bn £-3.51bn
Raise the State Pension by 10% £-7.79bn £-8.02bn £-7.96bn £-8.13bn £-8.43bn £-8.54bn £-8.88bn
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.85bn £6.80bn £7.01bn £7.21bn £7.44bn £7.66bn
Raise higher rate by 1pp: change in income_tax £3.61bn £3.93bn £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.24bn £-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.34bn £20.87bn £21.30bn £21.52bn £21.81bn £22.20bn £22.41bn
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.89bn £3.14bn £3.22bn £3.41bn £3.61bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.06bn £3.18bn £3.28bn £3.38bn £3.44bn £3.50bn £3.53bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.17bn £11.28bn £11.60bn £12.04bn £12.47bn £12.97bn

@vahid-ahmadi
vahid-ahmadi marked this pull request as ready for review October 24, 2026 14:07
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@MaxGhenis this fixes two real errors in savings interest uprating, so I think it should go in. Two calls for you:

  1. Timing. It moves the baseline a lot. On the certified enhanced_frs_2024_25 (bot and local run agree):
Year Savings interest Income tax Household net income
2025 -7.5% -£2.0bn -£4.0bn
2026 -18.9% -£5.1bn -£10.5bn
2027 -16.6% -£4.9bn -£9.3bn
2030 -0.8% -£0.3bn -£0.5bn

Merge now, or hold until after the Budget on 28 Oct so Budget scores don't shift under people?

  1. Savings stock proxy for 2026-30. OBR doesn't forecast household deposits, so I used household financial assets (EFO Table 1.11), which include pensions and equities, times the deposit rate ratio (Table 1.9). That gives -9.4% in 2026 as the rate falls from 2.29% to 2.00%. The alternative is household disposable income (Table 1.12). Happy to switch.

The two errors it fixes: 2025 used OBR's +3.5% forecast where ONS outturn (HAXV, 30 Sep 2026) is -2.8%, and the aggregate series was applied on top of population growth, so population was counted twice (as #2067 fixed for council tax).

🤖 Generated with Claude Code

Resolve the conflict in yoy_growth.yaml: keep main's March 2026
population references (#2611) and this branch's household interest block.

Main's population vintage changed ons.population, so re-derive
ons.per_capita.household_interest_income from it as
(1 + aggregate) / (1 + population) - 1, which the branch's own test
requires, and update the 2025 test case to match (per-person factor
0.9695, was 0.9654). The aggregate HAXV series is unchanged.

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

Copy link
Copy Markdown
Collaborator Author

Merged main into this branch (16dededef) to clear a conflict in yoy_growth.yaml. Main's references for ons.population (#2611) are kept, as is this branch's interest block.

One knock-on: #2611 changed ons.population (for example 2025 is now 0.30%, was 0.72%), so I re-derived ons.per_capita.household_interest_income as (1 + aggregate) / (1 + population) - 1, which this PR's own test requires. The per-person series moves by up to 0.4pp (2025: -3.05%, was -3.46%); the HAXV aggregate is unchanged. The 2025 projection test now expects a per-person factor of 0.9695 (was 0.9654). The impact table above was computed on the old population series, so treat it as approximate until the bot reruns.

Locally: test_savings_interest_uprating.py, test_uprating_declarations.py and test_population_vintage.py pass (116), and so does tests/code_health (2,903). CI is running at the new head.

@MaxGhenis the two questions above (merge before or after the 28 Oct Budget, and the financial assets proxy) are still open.

🤖 Generated with Claude Code

vahid-ahmadi and others added 2 commits October 25, 2026 22:59
Brings in #2589 (ISA inputs), #2639 (rail per person) and #2650.
uprating_indices.yaml keeps both per-person blocks (interest and rail
journeys). non_cash_isa_cash_interest moves with savings_interest_income
to the per-person interest index, so KNOWN_INDEX_OVERRIDES stays empty.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All savings interest now uses ons.per_capita.household_interest_income:
non_cash_isa_cash_interest (declaration and dataset YAML), the additive
ISA-interest total (dataset projection and Core fallback), and gross
interest under the legacy contract. #2589 had left these on GDP per
capita or the aggregate ONS index pending this PR. Tests that controlled
interest through GDP growth now set the interest index; the column test
uses different GDP and interest rates so a wrong index fails.

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

Copy link
Copy Markdown
Collaborator Author

Merged main into this branch (19494e84e) after #2589, #2639 and #2650, and aligned ISA interest in caba141b5. Head is now caba141b5.

Conflicts. uprating_indices.yaml keeps both per-person blocks (interest, and #2639's rail journeys). KNOWN_INDEX_OVERRIDES stays empty.

ISA alignment (the follow-up owed after #2589). All savings interest now grows by ons.per_capita.household_interest_income:

  • non_cash_isa_cash_interest: its declared uprating and its dataset YAML entry (was the aggregate ONS index and GDP per capita).
  • The additive ISA-interest total: dataset projection (economic_assumptions.py) and the Core fallback (isa_income.py).
  • Gross interest under the legacy contract (economic_assumptions.py).

The last one matters most. #2589 grew legacy-contract gross interest by GDP per capita in code, which overrode this PR's YAML entry. The certified enhanced_frs_2024_25 uses the legacy contract, so after the merge this PR would have done almost nothing on it (test_projected_total_interest_tracks_haxv_in_2025 caught it: +4.7% in 2025, not -3.05%). Tests that controlled interest through GDP growth now set the interest index. The ISA column test now uses different GDP and interest rates, so a column on the wrong index fails. Docs (growthfactors.md, isa-inputs-and-capital-flows.md) and the changelog fragment are updated.

Tests run locally: test_savings_interest_uprating.py, test_uprating_declarations.py, test_isa_accounting.py, test_isa_income_contract.py, test_population_vintage.py, test_projection_horizon.py (195 passed); test_isa_income_consumers.py, test_dated_reform_routes.py, test_savings_allowance_properties.py, test_savings_starting_rate_indexation.py, test_capital_gains_projection.py (260 passed); the ISA YAML tests (18 passed). I did not run the full suite locally; CI did.

CI: all green at caba141b5, including aggregate impact. The earlier FAIL was a cancellation at the 60-minute limit, not a test failure. The new bot report shows income tax -£5.06bn in 2026-27 and -£4.89bn in 2027-28, close to the table in the description.

Not approved yet, so not queued. The two questions for @MaxGhenis above (timing against the 28 Oct Budget, and the financial assets proxy) are unchanged.

🤖 Generated with Claude Code

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Program review

Base repository: PolicyEngine/policyengine-uk
PR number: 2638
Reviewed head SHA: caba141
Merge base SHA: 49a7590
Mode: full
Scope: 13changedpaths: savings-interest per-person projection/index generation, affected ISA/direct/dataset paths, source values and tests/docs. Changed behavior+affecteddependencies; no privatepopulation/numerical or combined-main audit.
Source manifest: /private/tmp/policyengine-command-runs/881387a1b745/pr2638-external-review-20261026-review-sources.json
Review status: PARTIAL

Source Documents

Critical

C1 — P2: give the cumulative interest index an anchor before its first growth year (OPEN)

Location: policyengine_uk/parameters/gov/economic_assumptions/yoy_growth.yaml:1155 (new first per-person observation); affected declaration policyengine_uk/variables/input/savings_interest_income.py:20.

The new YoY series starts in2021 with21.94% growth, but create_economic_assumption_indices.py:40–45 initializes the first listed year to1.0 and only multiplies growth starting the following year. Its cumulative twin therefore has I[2021]=1, and the2021 growth is never incorporated. Parameter processing generates that index before backdating (tax_benefit_system.py:207,228); backdate_parameters extends its earliest value1 back to2015 (utils/parameters.py:31–46, with utils/dated_reforms.py:208). Thus I[2020]=I[2021]=1.

A concrete affected route is a legacy-origin single-observation multi-year dataset with annual2020 gross savings interest100 and zero exempt interest, queried for2021 without materializing intermediate projection years. UK Simulation._run_formula reconstructs gross, reads variable.uprating, and multiplies by the target/source index ratio (simulation.py:639–687). With this new declaration, that source path gives100×1/1=100. The same2020→2021 transition in ordinary dataset projection reads the new YoY0.2194 and gives121.94 (data/economic_assumptions.py:358–386). The new index is intended to align these two surfaces, but they diverge at the first supported growth interval. This is a static source trace, not an executed model result.

Provide a2020 cumulative anchor so the first2021 YoY change is represented, or explicitly handle/reject that boundary if it is intentionally unsupported. Add a2020→2021 regression comparing direct/fallback index carry with the YoY dataset route; do not fabricate an unqualified2020 population-growth observation to make the generator start earlier. The new tests inspect the2021 YoY scalar, but their weighted example starts2024 and the direct-input tests start2026, so neither detects the dropped first interval.

Coordinator assessment: Named CODE clarification confirmed a supported UKMultiYearDataset single2020observation route, with no autoextension and no2020exclusion. The diff moves savings from the old2020-anchored aggregate index (122.50) to the new2021-anchored per-person index (100), instead of the intended121.94. With zero exemptions/dividends capital_income is100 rather than121.94, and the error feeds household_market_income. This is a confirmed source-traced material income defect, classified CRITICAL under the workflow; conventional priorityP2 identifies the historical boundary. The original should-address category is superseded by the preserved named reachability/severity addendum. No exact tax/net total or executed reproduction is claimed. POLICY independently corroborates the2020/2021ONSlevels supporting the intended2021step.

Should Address

None.

Suggestions

S1 — refresh the stale population example and vintage text in the PR description (OPEN)

The captured body line7 still uses0.72% population growth and−3.46% per-person interest in2025, while the changed parameter and test use0.30% and−3.05% (yoy_growth.yaml:1051,1159). Body line42 calls the population series a March2025 vintage; the current parameter describes the March2026 OBR/ONS2024-based source. Updating these paragraphs would make the prose match the committed inputs. The author has disclosed older population figures in feedback, so this is a prose consistency suggestion, not a separate model-defect inference.

S2 — update the agent-facing dataset guide's old ISA growth rule (OPEN)

docs/engineering/skills/dataset-sources.md:71–74 still says additive ISA interest follows the dataset GDP-per-capita rule. The changed implementation and book now use the per-person interest series. Update that sentence so future maintenance does not restore the old mapping. The legacy/additive representation distinction remains valid.

Evidence Gaps

  • Full primary March2026 OBR economy tables1.9/1.11 were unavailable to corroborate exact2025–2030 deposit-rate/financial-assets cells, calendar headers, units and series scope. The literal distinct economy download returned NoAccess HTML, not an XLSX; arithmetic over quoted constants is conditional, not cell/source proof.
  • Role checks incomplete: /private/tmp/policyengine-command-runs/881387a1b745/pr2638-external-review-20261026-review-policy.md; see recovered report.

Notes

  • One confirmed implementation finding is counted once; POLICY source evidence complements CODE C1. Its source-traced supported2020→2021 case changes capital income. OriginalCODE P2should classification and the named69.856s correction are both retained; P2priority is distinct from the canonical CRITICAL category. No general second review or runtime was performed.
  • Two minor consistency suggestions concern stale PR-body population/vintage prose and the agent-facing dataset guide. Existing author comments acknowledge the changed population inputs; no current-model old-population defect is inferred.
  • ONS HAXV full official original independently supports S.14/D.41/current-price£m/NSA and2019–2025levels. Per-person conversion and ISA alignment were traced. The broad-financial-assets-as-deposits proxy and Budget landing timing remain Max decisions; this review selects neither.
  • Two usable originals: a previously qualified historical OBR landing page reused only for literal link discovery and a fresh ONS HAXV original. NewGETs2/native0; failed24654NoAccessHTML preserved separately, no bypass/retry/receipts24665/LPS/archive/cachehunt. Originalsourcewindow124.218/180s closed21:18:28.425157Z, checker2valid0rejected0discarded. No PDF/render.
  • Local PolicyEngine/Core/country imports, model execution, collection, tests, documentation build, installation and private numerical validation were NOT RUN. Matching-head standardPR CI has19observedSUCCESS, allCheckSuite.commitjoins exactcaba. This is not standalone-head/currentmain/private/wheel-numerical or merge certification. Oldheadfec971botimpact/privatecounts and author cancellation-cause/test reports were not transferred.
  • Initial metadata STOP conflated implementation ownership with independent-review ownership; it was explicitly corrected using the same acquired fullfeedback before code/source review, with no newcandidate/retry/workaround. Four completecomments show no ownreview/activeindependentreviewclaim/requestreviewerswait. OriginalSTOP and clarification retained.
  • Timing: canonicalstart21:10:07.385186 includes metadata qualification and all later work. Scope71.682s missed60aim. SeparateRootdispatchmarker was not saved: parallel_review_seconds conservatively uses capturecompletion→lastoriginalsubstantiverolefinish as a rolewindow upperbound, not a measured exactdispatch interval. Named adjudication69.856s overlapped the lastPOLICY role and is not added to elapsed; original clocks unchanged. CODE initialcapture/body/diff read preceded its current retained-skill hashseal; priorownfullloads were retained and focusedanalysis followed currentSKILLS_READY.
  • All substantive reviewers and named C1 clarification completed with currentcommandsclosed; exact head/tree/index and snapshotclean rechecked, then exact snapshot removed normally with noforce. This is the sole final timing assembler rerun; hub landing repository and alloriginals retained.

Validation Summary

Confirmed first-index2020→2021boundary defect by static supported input/loader/generator/backdating/fallback and capital-income trace; intendedONSstep independently corroborated. Remaining mapping/ISA paths and discriminating testsource inspected; modeltestsNOTRUN. Raw19exact-headCI SUCCESS. One materialOBRforecast-cell/source gap; no private or currentmain/numerical certificate.

Timing

setup seconds: 239.71s; scope seconds: 71.68s; parallel review seconds: 504.22s; policy role seconds: 441.53s; code role seconds: 359.44s; adjudication seconds: 69.86s; consolidation cleanup seconds: 144.06s; elapsed seconds: 887.99s

Review Severity

REQUEST_CHANGES. Open findings: 1 critical, 0 should address, 2 suggestions.

The per-person series starts in 2021, so the index generator set
I[2021] = 1 and dropped the 2021 growth. A legacy 2020 observation
queried for 2021 then gave 100 on the direct index route against 121.94
from dataset projection. An opt-in `index_base_year` metadata key now
anchors the index a year earlier without inventing a 2020 growth value.
Adds a 2020 to 2021 regression test comparing both routes, and updates
the dataset guide's ISA growth rule.

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

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Program review

Base repository: PolicyEngine/policyengine-uk
PR number: 2638
Reviewed head SHA: b1ee29e
Merge base SHA: 49a7590
Mode: follow-up
Scope: Incremental five-file caba141→b1ee29e fix and affected index-generator/direct/dataset contracts; C1/S1/S2 resolution. Original fullreview and OBR sourcegap retained.
Source manifest: /private/tmp/policyengine-command-runs/881387a1b745/pr2638-followup-b1ee-20261026-review-sources.json
Review status: PARTIAL

Source Documents

Critical

C1 — source mechanism resolved; validation pending (RESOLVED)

yoy_growth.yaml:1172 now opts the per-person interest leaf into index_base_year: 2020. The series still starts with its actual2021 growth0.2194; there is no new2020 population or per-person growth observation. In the changed generator (create_economic_assumption_indices.py:40–59), the configured base becomes the initial level1 year, and the loop begins at base+1. Consequently the current configured source path gives I2020=1 and I2021=round(1×1.2194,5)=1.2194. This includes the first growth interval that the previous start-at2021 convention omitted.

The direct/fallback and dataset implementations themselves are byte-identical to the parent. UK legacy fallback still reads the variable's cumulative index dynamically, so its2020→2021 ratio is now1.2194/1. The ordinary dataset path still multiplies by1+the2021 YoY value. For the prior gross100/zero-exemption scenario both source paths therefore express121.94. That is a source trace and literal arithmetic, not a newly executed model result.

The two added tests are relevant and discriminate the original defect:

  • test_index_includes_the_first_growth_year asserts the independent2020 anchor1 and the first ratio at2021.
  • test_direct_index_route_matches_dataset_projection_from_2020_to_2021 builds a legacy2020 observation, wraps it in a single-observation UKMultiYearDataset so it reaches fallback rather than automatic single-year extension, and compares the direct result with an independently projected dataset. The projected amount also has a fixed expected121.94, so two identically wrong paths cannot satisfy the intended oracle merely by agreeing.

The _dataset helper retains its2024 default and its existing fields; the new explicit fiscal year and ISA contract keyword make the regression target the actual boundary. Existing22 static cases remain, with two new functions giving24 static cases. Neither function was collected or run by this reviewer. The author's body says it passed locally and failed on caba; that remains author-reported evidence, not this reviewer's execution.

Coordinator assessment: POLICY independently corroborates the level-anchor arithmetic using the same qualified ONS2020/2021 original. C1 is resolved in current source; no executed121.94 model result is claimed. Original5659275685/caba review and its critical-severity history remain preserved.

Should Address

None.

Suggestions

S1 — refresh the stale population example and vintage text in the PR description (RESOLVED)

The captured body line7 still uses0.72% population growth and−3.46% per-person interest in2025, while the changed parameter and test use0.30% and−3.05% (yoy_growth.yaml:1051,1159). Body line42 calls the population series a March2025 vintage; the current parameter describes the March2026 OBR/ONS2024-based source. Updating these paragraphs would make the prose match the committed inputs. The author has disclosed older population figures in feedback, so this is a prose consistency suggestion, not a separate model-defect inference.

Coordinator assessment: Both current CODE and POLICY reports confirm the b1ee body now uses population0.0030/−3.05% and March2026/ONS2024-based vintage. The preceding text is the preserved prior finding, now resolved.

S2 — update the agent-facing dataset guide's old ISA growth rule (RESOLVED)

docs/engineering/skills/dataset-sources.md:71–74 still says additive ISA interest follows the dataset GDP-per-capita rule. The changed implementation and book now use the per-person interest series. Update that sentence so future maintenance does not restore the old mapping. The legacy/additive representation distinction remains valid.

Coordinator assessment: Both current CODE and POLICY reports confirm dataset-sources.md now names yoy_growth.ons.per_capita.household_interest_income for additive ISA-interest projection. The preceding text is the preserved prior finding, now resolved.

Evidence Gaps

  • Inherited policy-gap-1: full original March2026 OBR economy tables1.9/1.11 cells, calendar headers, units and scope remain unavailable. The retained landing original is link provenance only; no blocked24654 retry/newGET/cache/archive hunt occurred. This is unchanged missing evidence, not a wrong-value finding.
  • New-head execution completion remains pending: the captured Python/YAML/Aggregate jobs are in progress, final Test/Result not observed. Local model/import/collection/tests were NOT RUN. Author-reported24passes/oldheadRED are not independent execution evidence.
  • Role checks incomplete: pr2638-followup-b1ee-20261026-review-code.md; see recovered report.
  • Role checks incomplete: pr2638-followup-b1ee-20261026-review-policy.md; see recovered report.

Notes

  • This is an actual-newhead incremental review, not an unchanged duplicate or implementation takeover. The prior own review5659275685 at caba is retained exactly; only its named C1/S1/S2 findings are updated.
  • No new critical/should/suggestion finding was found in the five-file delta. The eight affected source blobs are byteequalcaba; the opt-in2020anchor includes2021growth without fabricating2020population/growth and leaves other indices default initialization unchanged.
  • Two old qualified originals/one full-text derivative reused and hashverified, preserving original acquisition/vintage limits. New sourceGETs0/copies0; no new sourcewindow or promotion of the old124.218/180s acquisition.
  • Fresh public baseline at 2026-10-26T23:53:24.458542+00:00 has raw19 observed contexts: {"CANCELLED": 1, "IN_PROGRESS": 7, "SUCCESS": 11}. AllCheckSuite.commit joins are b1ee; cancelledFix and later successfulFix rows both retained. No cancellation cause/attempt/private/currentmain or merge certificate.
  • Max timing and broad-financial-assets proxy choices remain open; no queue/merge authority is implied. All local model/tests/private/logs/artifacts/runtime work NOT RUN.
  • Scope sealed60.182s after capture missed60s aim; exactfirstdispatchmarker not saved, after-both-dispatch marker and role readiness times retained. No clock reset. After both roles DONE the exact head/tree/index remained unchanged and the clean snapshot was normally removed withoutforce; all5cleanupchildren closed.

Validation Summary

Scoped static CODE+POLICY follow-up: C1 source mechanism resolved, S1/S2 corrected,0newfindings. Two reused originals pass integrity checks. Matching-head hosted tests are pending; local model/tests NOT RUN. Inherited OBR primary-workbook gap retained. PARTIAL / COMMENT; no approval or executed numerical/private impact certificate.

Timing

setup seconds: 242.41s; scope seconds: 60.18s; parallel seconds: 203.77s; code seconds: 166.56s; policy seconds: 180.07s; adjudication seconds: 0.00s; consolidation cleanup seconds: 73.23s; elapsed seconds: 548.18s

Review Severity

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

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Thanks María. All three addressed in b1ee29e.

C1: confirmed and fixed. At caba141 a legacy 2020 observation of 100 queried for 2021 gave 100 on the direct index route against 121.94 from dataset projection. The generator now reads an opt-in index_base_year metadata key (create_economic_assumption_indices.py), and the per-person series sets index_base_year: 2020 (yoy_growth.yaml). The index is 1 on 1 January 2020 and its first step is the 2021 growth (1.2194). No 2020 growth value is added; 2020 per-person growth stays undefined because ons.population starts in 2021. The generator refuses a base year at or after the first growth year. New tests in test_savings_interest_uprating.py: test_index_includes_the_first_growth_year, and test_direct_index_route_matches_dataset_projection_from_2020_to_2021, which compares the two routes. Both failed at caba141 (100 against 121.94) and pass now. Index steps from 2021 on are unchanged, so the aggregate table in the body (base year 2024) still holds.

On the pattern: #2639's rail per-person series has no anchor either. It and the other declared indices that start late (obr.per_capita.gdp, ons.population, house prices and others) drop their first growth year in the same way. I have left them out of this PR and will raise it as a separate issue.

S1: body updated: 2025 is now 0.9724 / 1.0030 - 1 = -3.05%, and the population source is now the March 2026 OBR / ONS 2024-based vintage.

S2: docs/engineering/skills/dataset-sources.md now names the per-person interest series for additive ISA interest.

Ran locally, one file at a time: test_savings_interest_uprating.py (24), test_isa_income_contract.py (53), test_isa_accounting.py (12), test_rail_usage_uprating.py (65), code_health/test_uprating_declarations.py (8) and the index tests in test_process_time_reforms.py (4), all passed. Not run locally: the full suite. CI is green at b1ee29e.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

As promised, the general first-year drop in the other growth indices is now #2692.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 your follow-up review at b1ee29ebe marked C1, S1 and S2 resolved with nothing open, but it was a comment, so the earlier changes-requested review still blocks the queue. Could you approve at b1ee29ebe when you have a minute? Draft #2693 (fixes #2692) is stacked on this one.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator

C1, S1 and S2 are resolved at b1ee29ebe. The follow-up review is still PARTIAL because I have not verified the forecast values, calendar-year headers, units and scope against the original March 2026 OBR economy Tables 1.9 and 1.11. That evidence gap remains separate from the resolved findings, so the existing review does not yet support approval.

Please attach the original workbook or the relevant original tables with their headers and units. The matching-head Python, YAML, Result and Aggregate checks now show success; I have not rerun tests locally.

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 here are the original OBR tables you asked for.

Source: OBR, Economic and fiscal outlook, March 2026, detailed forecast tables: economy (3 March 2026), download. The workbook I read has sha256 fde1de4bc5424dcf16c7b5c42eb75a35198e347f54db47690e95ede7541db510. The OBR site blocks scripted downloads (Cloudflare 403), so a browser is needed to fetch it.

Table 1.9, "Market-derived assumptions", column "Deposit rate". The sheet has no units row; the values are per cent. Calendar-year rows (labelled 2024, 2025, ...; the fiscal-year rows are labelled 2024-25 etc. and were not used):

2024 2025 2026 2027 2028 2029 2030
2.5391 2.2870 1.9997 2.0782 2.2579 2.4172 2.5706

Table 1.11, "Household balance sheet, PNFC balance sheet, and bank lending", Households block, column "Financial assets (£bn)". The definitions note gives it as "Household financial assets (ONS Economic Accounts, identifier: NNML)". Calendar-year rows:

2024 2025 2026 2027 2028 2029 2030
6,567.92 6,858.72 7,109.48 7,287.74 7,460.84 7,619.20 7,768.51

These match the PR body and the parameter comments for every year used.

One thing I found while checking, which is ours to answer. In 1.11 the calendar-year stock equals the Q4 level (2025 = 2025Q4 = 6,858.72), while in 1.9 the calendar-year deposit rate is the average of the four quarters (2025: mean of 2.426, 2.326, 2.213, 2.183 = 2.287). So the PR multiplies an end-of-year stock by an annual-average rate. Interest received over a year is closer to the average stock times the average rate. On an average-of-quarters stock, 2026 would be -7.80% rather than -9.37%; 2027 to 2030 move by 0.1pp or less. The 2026 gap comes from the step between 2025Q3 (6,655.83) and 2025Q4 (6,858.72). I have not changed the PR for this; Vahid will decide whether to switch the basis, and if he does it will come as a new commit for you to review.

What I ran: read Tables 1.9 and 1.11 from the workbook above with openpyxl, and recomputed the growth on both stock bases. I did not rerun the test suite; CI is green at b1ee29ebe.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator

@vahid-ahmadi thanks for the tables. I checked them against the workbook (sha256 fde1de4b…b510): Table 1.9's deposit rate and Table 1.11's household financial assets match the PR body, the parameter comments and the test constants for every year, so my evidence point is closed, and C1, S1 and S2 stay resolved. Two leftovers in the body: the first bullet still gives per_capita.gdp as +4.38% (now 0.0474), and the aggregate table uses the old population vintage.

Before I approve:

  1. Stock basis. Your 23:27 note leaves it open. Your numbers check out: on the average-of-quarters stock, 2026 is −7.80% instead of −9.37%, and 2027 to 2030 move by 0.1pp or less. On today's October tables the 2026 gap is 1.25pp and 2027 moves by 0.39pp. Please decide first, so the queue doesn't take b1ee29ebe before a basis commit.
  2. After 2030. The per-person series ends at 8.04% in 2030, and a parameter keeps its last value, so 2031 and 2032 grow 8.04% a year per person (main: about 3.2%). The bot run at this head shows it: income tax −£0.21bn in 2030-31, then +£1.48bn in 2031-32. The README's list of series held at their 2030 rate doesn't include this one. It needs an end-of-forecast rule (per-person GDP growth, or assets with the rate held flat), or at least that disclosure.
  3. Pass-through. On outturn, stock × rate overshoots interest received: 2023 +375% against HAXV's +99%, 2024 +39% against +14%, 2025 −5.9% against −2.8%. Interest has moved about 0.3 to 0.5 times as much as stock × rate. That bears on @MaxGhenis's proxy question, which is still open here.

On the October 2026 EFO: Table 1.9's deposit rate is higher from 2027 (2.41 against 2.08), so on October's tables the 2027 growth is +18.7% rather than +6.5%. If this merges on March values, #2711 should re-derive the series from October's Tables 1.9 and 1.11, adding 2031.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Cross-reference: #2723 grows savings income over the same years by a different series. It uses the OBR's savings income forecast per person from 2022-23 to 2025-26, then GDP per head as now, and needs a matching microcosm change and rebuild. The choice between the two is queued for Max as one ruling, next to his answer to your two calls here.

Real runs on the 28 Oct microcosm build, October 2026 forecast, savings rates +2pp from 2027-28 (change in gov_balance):

2027-28 2029-30
main (df239bc) £408m £462m
this PR (b1ee29e) £319m £426m
#2723 with an emulated microcosm rebuild £459m £518m

#2723's body has the method, the caveats (the rebuild is emulated by scaling interest, weights unchanged) and the factors from 2023-24 to 2025-26.

Resolves the conflicts with the October 2026 EFO update (#2717) by keeping
this branch's household interest series (HAXV outturn, then March 2026
Tables 1.9 x 1.11) in place of main's non-labour income proxy, and keeps
savings_interest_income on the per-person interest index in the docs.

Main's October population growth changes the per-person series, so it is
re-derived with the same formula, (1 + aggregate) / (1 + population) - 1,
and the 2025 test example follows (0.9692 rather than 0.9695).

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

Copy link
Copy Markdown
Collaborator Author

Merged main (with #2717, the October 2026 EFO update) at 00a7cfd32. Two conflicts, resolved by hand:

  • yoy_growth.yaml, household_interest_income: kept this branch's series (HAXV outturn, then March 2026 Tables 1.11 x 1.9). Main's October block used non-labour income growth (Table 1.12) as a proxy; that is dropped here.
  • growthfactors.md: main's per-capita GDP list (now with cash_isa_balance and stocks_and_shares_isa_balance), less savings_interest_income, which stays on the per-person interest index.

Main's October population growth differs from March (2026: 0.20% against 0.35%), so I re-derived per_capita.household_interest_income with the same formula, (1 + aggregate) / (1 + population) - 1. 2026 is now -9.55% (was -9.69%) and 2030 +8.16% (was +8.04%). The 2025 example in test_projected_total_interest_tracks_haxv_in_2025 follows (969.2 against 969.5).

Ran locally at the merge: test_savings_interest_uprating.py, code_health/test_uprating_declarations.py, test_isa_income_contract.py, test_isa_accounting.py (97 passed), and main's test_long_run_joins.py, test_import_obr_forecasts.py, test_projection_horizon.py, test_population_vintage.py, test_uprating_inputs_reach_data.py (241 passed). Full suites not run locally; CI is on it.

Not done here, still open from @juaristi22's 15:04 comment: the stock basis (end-year against average stock), the rule after 2030, and the pass-through point. The aggregate still uses March 2026 Tables 1.9 and 1.11, not October's. The PR body's numbers predate this merge. Not for the queue yet.

🤖 Generated with Claude Code

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.

3 participants