Skip to content

Project savings interest by interest received per person - #2638

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

vahid-ahmadi wants to merge 5 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 96315db49f against head fb9e88f958, 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: 159 (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,539 £82,984 -£2,555
Decile 9: mean household_net_income per household 2027-28 £82,828 £80,898 -£1,930
Decile 9: mean household_net_income per household 2028-29 £84,135 £82,335 -£1,801
Decile 9: mean household_net_income per household 2026-27 £81,421 £79,742 -£1,678
Decile 10: mean household_net_income per household 2029-30 £126,045 £128,635 +£2,590
Decile 10: mean household_net_income per household 2028-29 £124,163 £126,233 +£2,070
Income tax 2026-27 £318.31bn £313.25bn -£5.06bn
Decile 9: mean household_net_income per household 2025-26 £79,490 £78,306 -£1,184
Decile 10: mean household_net_income per household 2027-28 £121,933 £123,738 +£1,805
Income tax 2027-28 £335.60bn £330.71bn -£4.89bn
Decile 10: mean household_net_income per household 2025-26 £117,581 £119,211 +£1,630
Government balance, each receipt once 2026-27 £398.03bn £392.97bn -£5.06bn
gov_balance 2026-27 £398.03bn £392.97bn -£5.06bn
Government balance, each receipt once 2027-28 £428.43bn £423.54bn -£4.89bn
gov_balance 2027-28 £428.43bn £423.54bn -£4.89bn
Decile 8: mean household_net_income per household 2027-28 £71,800 £71,046 -£754
Decile 8: mean household_net_income per household 2025-26 £69,150 £68,427 -£723
pre_budget_change_household_tax 2026-27 £519.39bn £514.33bn -£5.07bn
household_tax 2026-27 £527.60bn £522.53bn -£5.07bn
Income tax 2028-29 £350.52bn £347.25bn -£3.26bn
Household market income 2026-27 £1,713.03bn £1,697.52bn -£15.51bn
pre_budget_change_household_tax 2027-28 £546.08bn £541.19bn -£4.89bn
household_tax 2027-28 £554.51bn £549.62bn -£4.89bn
Household market income 2027-28 £1,764.05bn £1,749.97bn -£14.07bn
Decile 8: mean household_net_income per household 2026-27 £70,533 £70,009 -£524
Government balance, each receipt once 2028-29 £455.78bn £452.52bn -£3.26bn
gov_balance 2028-29 £455.78bn £452.52bn -£3.26bn
Household net income (HBAI definition) 2026-27 £1,504.48bn £1,494.05bn -£10.43bn
Income tax 2025-26 £298.70bn £296.72bn -£1.97bn
Decile 5: mean household_net_income per household 2028-29 £46,288 £46,579 +£290
Household net income 2026-27 £1,688.69bn £1,678.25bn -£10.45bn
Decile 10: mean household_net_income per household 2026-27 £120,296 £121,025 +£729
Household net income (HBAI definition) 2027-28 £1,537.58bn £1,528.41bn -£9.17bn
Decile 5: mean household_net_income per household 2026-27 £44,626 £44,884 +£258
Decile 7: mean household_net_income per household 2028-29 £58,010 £57,676 -£334
Decile 7: mean household_net_income per household 2026-27 £57,224 £56,896 -£329
pre_budget_change_household_tax 2028-29 £568.63bn £565.37bn -£3.26bn
Decile 6: mean household_net_income per household 2028-29 £51,914 £51,617 -£297
household_tax 2028-29 £577.74bn £574.48bn -£3.26bn
Decile 6: mean household_net_income per household 2027-28 £50,736 £50,455 -£281

119 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.97bn -£5.06bn -£4.89bn -£3.26bn -£1.75bn -£206.7m +£1.48bn
Capital gains tax -£93,580 -£0.2m -£0.2m -£0.2m -£76,938 -£9,311 +£69,788
VAT on private school fees +£0.9m +£3.7m +£3.7m +£1.2m +£0.2m 0 -£0.6m

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Pension Credit -£497 -£2,827 -£2,543 -£1,424 -£712 -£62,011 +£0.5m
Universal Credit -£121 -£13,810 -£13,646 -£9,113 -£4,550 -£2,344 +£4,596
Housing Benefit -£479 -£1,237 -£1,235 -£794 -£408 -£49 +£355
Council Tax Reduction -£18,184 -£44,093 -£65,812 -£88,221 -£53,536 -£6,508 +£61,574
Tax-Free Childcare 0 +£39,451 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 -961 0 0 0 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.97bn -£5.06bn -£4.89bn -£3.26bn -£1.75bn -£206.7m +£1.48bn
Government spending -£19,280 † -£22,516 † -£83,236 † -£99,552 † -£59,206 † -£70,911 † +£0.5m †
Government balance, each receipt once -£1.97bn † -£5.06bn † -£4.89bn † -£3.26bn † -£1.75bn † -£206.6m † +£1.48bn †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax -£1.97bn -£5.06bn -£4.89bn -£3.26bn -£1.75bn -£206.7m +£1.48bn
household_tax -£1.97bn -£5.07bn -£4.89bn -£3.26bn -£1.75bn -£206.7m +£1.48bn
pre_budget_change_household_tax -£1.97bn -£5.07bn -£4.89bn -£3.26bn -£1.75bn -£206.7m +£1.48bn
gov_spending -£19,280 † -£22,516 † -£83,236 † -£99,552 † -£59,206 † -£70,911 † +£0.5m †
household_benefits -£19,280 † -£22,516 † -£83,236 † -£99,552 † -£59,206 † -£70,911 † +£0.5m †
gov_balance -£1.97bn † -£5.06bn † -£4.89bn † -£3.26bn † -£1.75bn † -£206.6m † +£1.48bn †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income -£5.94bn -£15.51bn -£14.07bn -£9.04bn -£4.65bn -£553.7m +£4.04bn
Household net income -£3.97bn † -£10.45bn † -£9.18bn † -£5.78bn † -£2.90bn † -£347.1m † +£2.57bn †
Household net income (HBAI definition) -£3.96bn -£10.43bn -£9.17bn -£5.78bn -£2.90bn -£346.7m +£2.56bn

Poverty rates

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone +0.02pp +0.03pp +0.02pp +0.02pp +0.01pp +0.00pp -0.04pp
Absolute poverty, before housing costs: children 0 +0.01pp +0.01pp +0.00pp +0.01pp 0 -0.01pp
Absolute poverty, before housing costs: working-age adults +0.02pp +0.02pp +0.01pp +0.01pp +0.01pp 0 -0.06pp
Absolute poverty, before housing costs: pensioners +0.04pp +0.09pp +0.09pp +0.06pp +0.02pp +0.01pp -0.01pp
Absolute poverty, after housing costs: everyone +0.06pp +0.08pp +0.03pp +0.01pp +0.00pp 0 -0.04pp
Absolute poverty, after housing costs: children 0 +0.00pp +0.00pp 0 0 0 -0.00pp
Absolute poverty, after housing costs: working-age adults +0.06pp +0.08pp +0.02pp +0.00pp +0.00pp 0 -0.06pp
Absolute poverty, after housing costs: pensioners +0.16pp +0.20pp +0.14pp +0.02pp +0.02pp 0 -0.00pp
Relative poverty, before housing costs: everyone -0.02pp +0.01pp +0.01pp +0.02pp -0.03pp +0.00pp +0.10pp
Relative poverty, before housing costs: children -0.07pp +0.00pp -0.00pp +0.01pp -0.11pp 0 +0.30pp
Relative poverty, before housing costs: working-age adults -0.01pp +0.01pp +0.01pp +0.02pp -0.02pp 0 +0.06pp
Relative poverty, before housing costs: pensioners -0.00pp +0.04pp +0.03pp +0.05pp +0.02pp +0.01pp -0.02pp
Relative poverty, after housing costs: everyone -0.01pp +0.00pp +0.00pp -0.02pp +0.00pp 0 -0.04pp
Relative poverty, after housing costs: children -0.13pp -0.21pp -0.03pp -0.04pp 0 0 -0.02pp
Relative poverty, after housing costs: working-age adults +0.00pp +0.03pp -0.01pp -0.02pp +0.01pp 0 -0.06pp
Relative poverty, after housing costs: pensioners +0.10pp +0.17pp +0.08pp +0.02pp 0 0 -0.00pp

People in poverty

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone +11.3k +17.9k +15.3k +10.7k +7.5k +1.4k -27.5k
Absolute poverty, before housing costs: children 0 +797 +1.6k +482 +1.6k 0 -1.0k
Absolute poverty, before housing costs: working-age adults +6.6k +7.0k +3.6k +3.8k +3.5k 0 -25.7k
Absolute poverty, before housing costs: pensioners +4.7k +10.1k +10.1k +6.4k +2.4k +1.4k -705
Absolute poverty, after housing costs: everyone +42.0k +56.4k +23.7k +3.8k +2.5k 0 -26.8k
Absolute poverty, after housing costs: children 0 +243 +634 0 0 0 -601
Absolute poverty, after housing costs: working-age adults +23.4k +33.1k +7.1k +1.2k +806 0 -25.7k
Absolute poverty, after housing costs: pensioners +18.6k +23.1k +15.9k +2.6k +1.7k 0 -422
Relative poverty, before housing costs: everyone -15.2k +7.4k +5.6k +15.7k -24.1k +701 +72.4k
Relative poverty, before housing costs: children -11.1k +583 -50 +1.1k -17.3k 0 +46.1k
Relative poverty, before housing costs: working-age adults -4.0k +2.5k +2.8k +8.5k -8.6k 0 +28.5k
Relative poverty, before housing costs: pensioners -60 +4.3k +2.9k +6.1k +1.7k +701 -2.2k
Relative poverty, after housing costs: everyone -6.8k +1.3k +1.7k -13.9k +2.8k 0 -29.5k
Relative poverty, after housing costs: children -19.0k -32.1k -4.2k -5.5k 0 0 -3.1k
Relative poverty, after housing costs: working-age adults +856 +13.3k -2.8k -10.6k +2.8k 0 -25.9k
Relative poverty, after housing costs: pensioners +11.4k +20.1k +8.7k +2.2k 0 0 -406

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.0021 -0.0018 -0.0011 -0.0006 -0.0001 +0.0005

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 -£36 † -£73 † -£74 † -£50 † -£21 † -£2.46 † -£46 †
Decile 2: mean household_net_income per household -£1.60 † -£87 † -£137 † -£23 † +£62 † -£1.92 † -£10 †
Decile 3: mean household_net_income per household -£23 † -£135 † -£86 † -£43 † -£49 † +£0.23 † +£12 †
Decile 4: mean household_net_income per household -£32 † -£31 † +£9.46 † -£107 † -£115 † +£38 † +£7.09 †
Decile 5: mean household_net_income per household -£12 † +£258 † +£207 † +£290 † +£143 † -£45 † +£53 †
Decile 6: mean household_net_income per household -£50 † -£232 † -£281 † -£297 † -£25 † -£1.86 † +£28 †
Decile 7: mean household_net_income per household -£45 † -£329 † -£237 † -£334 † -£67 † +£6.13 † +£11 †
Decile 8: mean household_net_income per household -£723 † -£524 † -£754 † -£300 † -£20 † -£19 † +£0.79 †
Decile 9: mean household_net_income per household -£1,184 † -£1,678 † -£1,930 † -£1,801 † -£2,555 † -£0.86 † +£125 †
Decile 10: mean household_net_income per household +£1,630 † +£729 † +£1,805 † +£2,070 † +£2,590 † -£72 † +£460 †

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.3m +£50.0m +£52.4m +£2.3m +£0.4m +£0.5m -£1.1m
Raise higher rate by 1pp +£0.9m +£55.4m +£59.6m +£5.6m +£0.6m +£0.2m +£0.6m
Raise personal allowance by ~800GBP/year +£3.0m +£2.0m -£8.6m -£4.1m +£21.2m -£16.8m -£8.5m
Raise child benefit by 25GBP/week per additional child +£0.5m -£0.6m -£86,512 +£2.0m -£0.1m +£23,289 -£2.2m
Reduce Universal Credit taper rate to 20% -£0.4m +£0.3m +£0.8m +£5.2m -£1.6m -£1,321 -£0.4m
Raise Class 1 main employee NICs rate to 10% -£0.5m +£48.7m +£5.0m +£9.6m +£0.8m +£18,159 +£0.2m
Raise VAT standard rate by 2pp +£89,865 +£0.4m +£0.4m +£0.1m +£17,982 -£1,270 -£52,401
Raise additional rate by 3pp -£5.1m -£9.3m -£5.3m -£3.7m +£2.9m suppressed suppressed
Raise the Universal Credit standard allowance by 10% -£43,592 +£1.2m +£1.7m +£4.6m -£0.1m -£11 +£0.1m
Raise the State Pension by 10% -£11.0m -£12.3m +£16.8m +£15.5m -£4.4m -£2.0m +£5.3m

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.2m -£2.1m -£0.9m -£66,286 +£8,478 +£21,975
Raise higher rate by 1pp: change in income_tax +£1.1m +£1.1m +£2.9m +£3.2m +£1.6m +£0.2m -£1.5m
Raise personal allowance by ~800GBP/year: change in income_tax +£3.1m -£1.8m -£6.8m -£4.0m +£21.1m -£16.7m -£10.4m
Reduce Universal Credit taper rate to 20%: change in universal_credit -£1,207 +£3,626 -£30,567 -£20,489 -£2,967 +£1,296 +£1,981
Raise additional rate by 3pp: change in income_tax -£5.5m -£10.9m -£7.6m -£6.5m -£3.3m suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit -£0 -£133 +£0 +£1 0 +£1 -£18

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 -£27 (-0.1%) -£68 (-0.4%) -£67 (-0.4%) -£42 (-0.2%) -£21 (-0.1%) -£2 (-0.0%) +£18 (+0.1%)
Decile 2 -£19 (-0.1%) -£50 (-0.2%) -£37 (-0.1%) -£23 (-0.1%) -£12 (-0.0%) -£1 (-0.0%) +£10 (+0.0%)
Decile 3 -£13 (-0.0%) -£35 (-0.1%) -£32 (-0.1%) -£20 (-0.1%) -£9 (-0.0%) -£1 (-0.0%) +£8 (+0.0%)
Decile 4 -£33 (-0.1%) -£84 (-0.2%) -£45 (-0.1%) -£29 (-0.1%) -£16 (-0.0%) -£2 (-0.0%) +£12 (+0.0%)
Decile 5 -£26 (-0.1%) -£68 (-0.2%) -£89 (-0.2%) -£59 (-0.1%) -£29 (-0.1%) -£4 (-0.0%) +£27 (+0.1%)
Decile 6 -£36 (-0.1%) -£94 (-0.2%) -£87 (-0.2%) -£47 (-0.1%) -£25 (-0.0%) -£3 (-0.0%) +£20 (+0.0%)
Decile 7 -£39 (-0.1%) -£103 (-0.2%) -£88 (-0.2%) -£61 (-0.1%) -£31 (-0.1%) -£4 (-0.0%) +£27 (+0.0%)
Decile 8 -£87 (-0.1%) -£224 (-0.3%) -£198 (-0.3%) -£127 (-0.2%) -£64 (-0.1%) -£7 (-0.0%) +£50 (+0.1%)
Decile 9 -£263 (-0.3%) -£683 (-0.8%) -£602 (-0.7%) -£374 (-0.4%) -£192 (-0.2%) -£23 (-0.0%) +£170 (+0.2%)
Decile 10 -£715 (-0.6%) -£1,892 (-1.6%) -£1,638 (-1.3%) -£1,028 (-0.8%) -£509 (-0.4%) -£61 (-0.0%) +£453 (+0.3%)
all -£128 (-0.2%) -£335 (-0.6%) -£294 (-0.5%) -£185 (-0.3%) -£92 (-0.2%) -£11 (-0.0%) +£81 (+0.1%)
Year People gaining over £1 People losing over £1
2025-26 0.1% 46.6%
2026-27 0.0% 53.6%
2027-28 0.0% 50.4%
2028-29 0.1% 49.9%
2029-30 0.2% 45.1%
2030-31 0.0% 29.3%
2031-32 44.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,889,156 in total; 2026-27: 76 units below zero, a weighted £-55,420,387 in total; 2027-28: 76 units below zero, a weighted £-56,618,038 in total
Counted-once check

Each of 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 96315db49f uk 2.162.9 (files 471ff4c944b5), core 3.33.12, py 3.13.17 aarch64 8a99037d2b8f 4f86ac4248d9 2020.08s
head #2638 merged into main fb9e88f958 uk 2.162.9 (files db50fdb4ac31), core 3.33.12, py 3.13.17 aarch64 8a99037d2b8f 4f86ac4248d9 2035.35s

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 £296.72bn £313.25bn £330.71bn £347.25bn £364.04bn £383.32bn £402.51bn
National Insurance (employee and self-employed) £52.37bn £54.71bn £56.48bn £58.15bn £60.22bn £62.11bn £64.44bn
National Insurance (employer) £150.59bn £156.99bn £161.74bn £166.13bn £173.24bn £178.59bn £185.29bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.61bn £13.05bn £13.53bn £14.02bn £14.52bn £15.05bn £15.58bn
Student loan repayments £7.91bn £8.21bn £8.43bn £8.63bn £8.85bn £9.10bn £9.42bn
VAT excluding private school fees £249.37bn £255.28bn £261.81bn £267.87bn £274.12bn £280.56bn £286.81bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £1.95bn £2.00bn £2.05bn £2.10bn £2.21bn £2.21bn £2.31bn
Change in private school VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.41bn £4.42bn £4.44bn £4.45bn £4.47bn £4.48bn
Council tax £49.21bn £51.88bn £54.97bn £58.29bn £61.55bn £64.92bn £68.49bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.50bn £0.51bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.60bn £0.63bn £0.66bn £0.69bn £0.72bn
Business rates £34.68bn £38.04bn £38.88bn £39.76bn £43.07bn £43.13bn £44.57bn
Stamp duty land tax on the household's own purchases £6.90bn £7.39bn £7.81bn £8.21bn £8.62bn £9.02bn £9.42bn
Stamp duty land tax paid by companies £4.81bn £5.98bn £6.73bn £7.46bn £8.21bn £8.87bn £9.16bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.09bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.34bn £0.35bn £0.37bn £0.38bn £0.40bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
State Pension £121.64bn £126.07bn £127.08bn £128.87bn £132.52bn £136.31bn £140.08bn
Pension Credit £6.66bn £7.04bn £7.32bn £7.46bn £7.60bn £7.77bn £7.94bn
Winter Fuel Payment £1.86bn £1.86bn £1.80bn £1.78bn £1.79bn £1.79bn £1.80bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.21bn £80.38bn £82.93bn £84.23bn £85.58bn £86.87bn £87.97bn
Housing Benefit £8.55bn £8.89bn £9.17bn £9.31bn £9.58bn £9.84bn £10.10bn
Council Tax Reduction £2.07bn £2.18bn £2.32bn £2.46bn £2.60bn £2.74bn £2.89bn
Employment and Support Allowance (income-related) £0.79bn £0.81bn £0.83bn £0.85bn £0.86bn £0.89bn £0.90bn
Employment and Support Allowance (contribution-based) £5.20bn £5.34bn £5.46bn £5.59bn £5.72bn £5.85bn £5.99bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.32bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £26.94bn £28.06bn £29.13bn £29.83bn £30.54bn £31.26bn £31.96bn
Disability Living Allowance £7.49bn £7.80bn £8.10bn £8.29bn £8.49bn £8.69bn £8.88bn
Attendance Allowance £8.68bn £9.04bn £9.38bn £9.61bn £9.83bn £10.07bn £10.29bn
Carer's Allowance £4.48bn £4.67bn £4.84bn £4.96bn £5.08bn £5.19bn £5.31bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.33bn £0.34bn £0.35bn £0.36bn £0.37bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.50bn £0.52bn £0.53bn £0.54bn £0.55bn £0.57bn £0.58bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.68bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.16bn £16.83bn £17.43bn £17.85bn £18.26bn £18.69bn £19.10bn
Scottish Child Payment £0.49bn £0.52bn £0.54bn £0.55bn £0.56bn £0.57bn £0.56bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.30bn £3.39bn £3.47bn £3.55bn £3.63bn £3.72bn £3.80bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.15bn £1.18bn £1.21bn £1.24bn £1.27bn £1.29bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.73bn £0.75bn £0.77bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.59bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.60bn £3.67bn £3.77bn £3.85bn £3.94bn
Universal childcare entitlement £2.05bn £2.23bn £2.28bn £2.34bn £2.40bn £2.47bn £2.52bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.52bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.30bn £0.31bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £203.83bn £204.54bn £205.13bn £205.79bn £206.49bn £207.23bn £207.73bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.13bn £25.21bn £25.29bn £25.37bn £25.46bn £25.53bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus 0k 0k 0k 0k 0k 0k 0k
State Pension 11,261k 11,158k 10,849k 10,746k 10,783k 10,822k 10,848k
Pension Credit 1,485k 1,483k 1,480k 1,461k 1,462k 1,464k 1,460k
Winter Fuel Payment 7,842k 7,793k 7,494k 7,407k 7,432k 7,459k 7,477k
Pension Age Winter Heating Payment (Scotland) 803k 803k 803k 800k 803k 806k 808k
Universal Credit 6,334k 6,341k 6,366k 6,347k 6,345k 6,333k 6,298k
Housing Benefit 1,249k 1,247k 1,250k 1,234k 1,238k 1,240k 1,239k
Council Tax Reduction 3,174k 3,198k 3,209k 3,229k 3,244k 3,257k 3,264k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 72k 72k
Employment and Support Allowance (contribution-based) 719k 721k 723k 726k 728k 731k 732k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 68k 68k 68k 68k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,566k 3,579k 3,589k 3,601k 3,613k 3,626k 3,635k
Disability Living Allowance 1,291k 1,295k 1,299k 1,303k 1,308k 1,312k 1,316k
Attendance Allowance 1,694k 1,700k 1,705k 1,711k 1,716k 1,723k 1,727k
Carer's Allowance 1,034k 1,038k 1,041k 1,044k 1,048k 1,051k 1,053k
Carer Support Payment (Scotland) 71k 71k 72k 72k 72k 72k 73k
Carer's Allowance Supplement (Scotland) 0k 71k 72k 72k 72k 72k 73k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 138k 138k 139k 139k 140k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 95k 95k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,102k 8,128k 8,142k 8,165k 8,191k 8,216k 8,232k
Scottish Child Payment 350k 352k 353k 357k 354k 355k 342k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 199k 200k 201k 201k 202k 203k 203k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 332k 334k 335k 336k 337k 338k 339k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 183k 183k 184k 185k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 27k 27k
Bereavement Support Payment 98k 98k 98k 99k 99k 99k 100k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,014k 1,024k 1,024k 1,027k 1,027k 1,031k 1,013k
Extended childcare entitlement 796k 801k 806k 809k 815k 819k 820k
Universal childcare entitlement 1,071k 1,074k 1,077k 1,080k 1,086k 1,096k 1,097k
Targeted childcare entitlement 165k 156k 154k 155k 155k 156k 144k
Childcare Offer for Wales 39k 39k 39k 39k 39k 39k 39k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 98k 99k 99k 99k 100k 100k
Adult Dependants' Grant 18k 18k 12k 12k 12k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £896.85bn £936.80bn £975.22bn £1,010.58bn £1,051.14bn £1,088.80bn £1,130.57bn
Government spending £528.96bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.37bn †
Government balance, each receipt once £367.89bn † £392.97bn † £423.54bn † £452.52bn † £484.57bn † £513.49bn † £547.20bn †
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 £896.85bn £936.80bn £975.22bn £1,010.58bn £1,051.14bn £1,088.80bn £1,130.57bn
household_tax £494.94bn £522.53bn £549.62bn £574.48bn £601.57bn £627.44bn £656.16bn
pre_budget_change_household_tax £487.03bn £514.33bn £541.19bn £565.37bn £592.23bn £617.84bn £646.23bn
gov_spending £528.96bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.37bn †
household_benefits £528.96bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.37bn †
gov_balance £367.89bn † £392.97bn † £423.54bn † £452.52bn † £484.57bn † £513.49bn † £547.20bn †
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,645.54bn £1,697.52bn £1,749.97bn £1,803.93bn £1,857.54bn £1,917.83bn £1,989.32bn
Household net income £1,640.47bn † £1,678.25bn † £1,710.37bn † £1,744.83bn † £1,778.77bn † £1,820.72bn † £1,869.95bn †
Household net income (HBAI definition) £1,453.33bn £1,494.05bn £1,528.41bn £1,563.58bn £1,599.77bn £1,640.14bn £1,689.60bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,224k 69,466k 69,668k 69,891k 70,128k 70,381k 70,550k
Benefit units 35,100k 35,223k 35,325k 35,438k 35,558k 35,686k 35,772k
Households 31,037k 31,145k 31,236k 31,336k 31,442k 31,555k 31,631k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 16.0% 15.1% 15.4% 15.6% 15.6% 15.7% 15.7%
Absolute poverty, before housing costs: children 24.0% 21.2% 21.4% 21.4% 21.6% 21.8% 21.8%
Absolute poverty, before housing costs: working-age adults 13.8% 13.5% 14.0% 14.1% 14.1% 14.2% 14.1%
Absolute poverty, before housing costs: pensioners 13.7% 13.3% 13.2% 13.4% 13.5% 13.5% 13.5%
Absolute poverty, after housing costs: everyone 21.5% 20.8% 21.3% 21.5% 21.7% 21.9% 22.1%
Absolute poverty, after housing costs: children 33.0% 30.7% 31.1% 31.1% 31.4% 31.7% 32.3%
Absolute poverty, after housing costs: working-age adults 19.9% 19.7% 20.2% 20.5% 20.7% 20.8% 21.0%
Absolute poverty, after housing costs: pensioners 12.8% 12.6% 12.4% 12.5% 12.9% 12.9% 13.0%
Relative poverty, before housing costs: everyone 17.2% 16.4% 16.5% 16.5% 16.2% 16.3% 16.6%
Relative poverty, before housing costs: children 26.2% 23.5% 23.4% 23.2% 22.6% 22.8% 23.4%
Relative poverty, before housing costs: working-age adults 14.6% 14.4% 14.7% 14.7% 14.6% 14.7% 14.9%
Relative poverty, before housing costs: pensioners 15.0% 14.9% 14.1% 14.1% 14.0% 14.0% 14.2%
Relative poverty, after housing costs: everyone 21.6% 21.0% 21.1% 21.2% 21.3% 21.4% 21.7%
Relative poverty, after housing costs: children 33.2% 31.0% 30.8% 30.7% 31.0% 31.0% 31.5%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.1% 20.3% 20.4% 20.5% 20.7%
Relative poverty, after housing costs: pensioners 13.0% 12.6% 12.2% 11.9% 11.8% 11.9% 12.8%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,061k 10,484k 10,752k 10,870k 10,968k 11,055k 11,054k
Absolute poverty, before housing costs: children 3,580k 3,171k 3,212k 3,221k 3,263k 3,305k 3,316k
Absolute poverty, before housing costs: working-age adults 5,851k 5,753k 6,026k 6,127k 6,173k 6,209k 6,193k
Absolute poverty, before housing costs: pensioners 1,630k 1,560k 1,514k 1,523k 1,532k 1,540k 1,545k
Absolute poverty, after housing costs: everyone 14,889k 14,478k 14,831k 14,998k 15,244k 15,402k 15,611k
Absolute poverty, after housing costs: children 4,937k 4,609k 4,672k 4,685k 4,757k 4,814k 4,911k
Absolute poverty, after housing costs: working-age adults 8,429k 8,393k 8,739k 8,899k 9,025k 9,114k 9,214k
Absolute poverty, after housing costs: pensioners 1,522k 1,477k 1,420k 1,414k 1,462k 1,475k 1,486k
Relative poverty, before housing costs: everyone 11,881k 11,410k 11,474k 11,503k 11,367k 11,469k 11,724k
Relative poverty, before housing costs: children 3,907k 3,524k 3,519k 3,492k 3,417k 3,458k 3,562k
Relative poverty, before housing costs: working-age adults 6,198k 6,138k 6,341k 6,408k 6,360k 6,415k 6,543k
Relative poverty, before housing costs: pensioners 1,776k 1,748k 1,614k 1,603k 1,590k 1,596k 1,619k
Relative poverty, after housing costs: everyone 14,950k 14,598k 14,699k 14,811k 14,954k 15,042k 15,321k
Relative poverty, after housing costs: children 4,957k 4,645k 4,626k 4,629k 4,690k 4,712k 4,791k
Relative poverty, after housing costs: working-age adults 8,444k 8,468k 8,677k 8,836k 8,919k 8,977k 9,067k
Relative poverty, after housing costs: pensioners 1,548k 1,485k 1,396k 1,346k 1,346k 1,354k 1,464k
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.3077 0.3037 0.3047 0.3059 0.3070 0.3080 0.3099
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,745 † £17,833 † £17,758 † £17,855 † £18,121 † £18,336 † £18,436 †
Decile 2: mean household_net_income per household £27,961 † £28,830 † £28,517 † £28,883 † £29,158 † £29,644 † £30,224 †
Decile 3: mean household_net_income per household £34,358 † £35,328 † £35,979 † £36,466 † £36,802 † £37,338 † £38,055 †
Decile 4: mean household_net_income per household £38,753 † £40,682 † £41,883 † £42,306 † £43,029 † £43,945 † £44,174 †
Decile 5: mean household_net_income per household £43,776 † £44,884 † £45,813 † £46,579 † £47,470 † £48,241 † £49,763 †
Decile 6: mean household_net_income per household £48,160 † £49,294 † £50,455 † £51,617 † £52,178 † £53,172 † £54,231 †
Decile 7: mean household_net_income per household £56,174 † £56,896 † £57,527 † £57,676 † £58,973 † £60,068 † £61,777 †
Decile 8: mean household_net_income per household £68,427 † £70,009 † £71,046 † £72,775 † £74,073 † £75,522 † £77,428 †
Decile 9: mean household_net_income per household £78,306 † £79,742 † £80,898 † £82,335 † £82,984 † £87,052 † £90,070 †
Decile 10: mean household_net_income per household £119,211 † £121,025 † £123,738 † £126,233 † £128,635 † £128,270 † £131,570 †
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.47bn £6.81bn £6.72bn £6.86bn £7.06bn £7.35bn £7.55bn
Raise higher rate by 1pp £3.69bn £4.04bn £4.09bn £4.30bn £4.46bn £4.78bn £4.91bn
Raise personal allowance by ~800GBP/year £-3.81bn £-3.94bn £-4.02bn £-4.09bn £-4.16bn £-4.20bn £-2.01bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.56bn £-1.45bn £-1.35bn £-1.23bn £-1.13bn
Reduce Universal Credit taper rate to 20% £-20.39bn £-20.96bn £-21.38bn £-21.61bn £-21.87bn £-22.17bn £-22.60bn
Raise Class 1 main employee NICs rate to 10% £11.02bn £11.47bn £11.78bn £12.08bn £12.37bn £12.75bn £13.07bn
Raise VAT standard rate by 2pp £24.89bn £25.55bn £26.14bn £26.75bn £27.39bn £28.03bn £28.66bn
Raise additional rate by 3pp £2.96bn £3.20bn £3.26bn £3.45bn £3.65bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.05bn £-3.18bn £-3.29bn £-3.33bn £-3.38bn £-3.42bn £-3.48bn
Raise the State Pension by 10% £-7.80bn £-8.03bn £-7.99bn £-8.11bn £-8.43bn £-8.54bn £-8.86bn
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.61bn £6.91bn £6.83bn £7.03bn £7.24bn £7.47bn £7.73bn
Raise higher rate by 1pp: change in income_tax £3.69bn £3.99bn £4.04bn £4.26bn £4.47bn £4.74bn £4.93bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.94bn £-4.09bn £-4.18bn £-4.25bn £-4.32bn £-4.42bn £-1.77bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.95bn £1.84bn £1.73bn £1.62bn £1.50bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.39bn £20.95bn £21.37bn £21.62bn £21.87bn £22.22bn £22.61bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.28bn £11.74bn £12.06bn £12.37bn £12.69bn £13.03bn £13.49bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.35bn £25.94bn £26.54bn £27.17bn £27.81bn £28.43bn
Raise additional rate by 3pp: change in income_tax £2.96bn £3.20bn £3.25bn £3.45bn £3.65bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.05bn £3.18bn £3.29bn £3.36bn £3.43bn £3.48bn £3.52bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.18bn £11.31bn £11.55bn £12.00bn £12.44bn £12.94bn

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

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.

2 participants