Skip to content

Uprate three more columns, and guard the gap that hid them - #1863

Merged
juaristi22 merged 10 commits into
mainfrom
uprate-four-remaining-columns
Oct 20, 2026
Merged

juaristi22 merged 10 commits into
mainfrom
uprate-four-remaining-columns

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

Follow-up to #1860, closing most of #1862. Thanks @juaristi22 for finding these and for suggesting the guard.

The three fixes

Each declared an uprating index but was absent from uprating_indices.yaml, so was never uprated (on main since #2376's projection fallback, it stays flat through 2030 and grows only after). On enhanced_frs_2024_25, 2024 → 2027:

variable 2024 2027 index compounded
water_and_sewerage_charges 375.51 525.77 (+40.0%) ofwat water bills +40.0%
housing_service_charges 91.81 105.06 (+14.4%) OBR lagged avg earnings +14.4%
pension_contributions_via_salary_sacrifice 418.69 466.81 (+11.5%) OBR avg earnings +11.5%

The water row uses the published 2025-26 and 2026-27 bill increases (see Provenance below); it was 522.12 (+39.0%) with the old 26% and 5.5%. Each matches its own index exactly, which is the check that they are now uprated by the right thing rather than merely uprated.

All three indices already had the yoy_growth twin the YAML needs — your caution about missing parameters turned out not to apply to these — so this is a YAML-only change.

rail_usage is deliberately excluded

Its declared index is a cumulative level, not a year-on-year rate:

gov.dft.rail.ridership_index — "Cumulative index of rail ridership (passenger journeys). Base year 2020 = 1.0."

Values run 0.95 (2024) → 1.005 (2027). Putting it in a yoy_growth block compounds the level and uprates the variable by ~684% over 2024–27. I had it in the YAML at first and caught it on the before/after check. Uprating it properly needs a year-on-year series, which is more than a YAML entry.

The guard

policyengine_uk/tests/code_health/test_uprating_declarations.py asserts every variable declaring uprating appears in the YAML under the matching index — the durable fix you suggested, which would have caught #1859 at the point it was introduced.

I verified it fails when an entry is removed, rather than only passing today. (That check matters: a guard I wrote on the dashboard side turned out to pass regardless of the thing it claimed to prevent, so I no longer trust one I have not seen fail.)

Three exceptions are listed with reasons rather than silently tolerated:

  • rail_usage — cumulative index, as above
  • employee_pension_contributions_reported — reported counterpart feeding imputation
  • savings_interest_income — the index mismatch you flagged; declares ons.household_interest_income while the YAML applies per_capita.gdp. Left as-is for someone with the context to say which is intended — I did not want to change an uprating basis on a guess.

A third test keeps those lists honest: each entry must still exist and still declare uprating, so a stale exception fails rather than lingering.

Since review (rebased onto main, 7 Oct)

  • ruff format on the guard test; the changelog fragment is typed .fixed.md, so it renders under "Fixed".
  • After the rebase the guard found 10 more variables added to main since this PR opened:
    • 7 real gaps, now uprated by the index each declares. Per-capita GDP: cash_isa, stocks_and_shares_isa, mortgage_debt, consumer_debt, rent_paid_as_boarder, rent_paid_as_lodger. Per-capita mixed income: self_employment_gross_receipts.
    • 3 deliberate: electricity_consumption, gas_consumption and domestic_energy_consumption are listed in KNOWN_UNUPRATED, because the data build prices energy spend (Stop CPI-uprating energy, which the data build already prices #1868).
  • This goes slightly beyond the formatting and fragment fixes. Without it, the guard test fails on today's main.
  • Checks at 8300b0a96: guard tests 3 passed (and fail with cash_isa removed); tests/code_health 1,953 passed; the YAML suite 2,605 passed; ruff format --check . and ruff check . clean.

Verification

265 passed, 45 skipped (262 before, plus the three new tests). Changelog fragment included.

Checks at 7ab0afa33: guard tests 8 passed; tests/code_health, the water test and the top-level uprating test files 2,314 passed; the YAML suite 3,058 passed; ruff format --check . and ruff check . clean; .github/check_fix_pr.py PASS against this description. The new water test fails with the old 0.26 and 0.055.

#1862 stays open for rail_usage and the savings_interest_income basis question.

Merge with main (14 Oct)

Merged origin/main (232 commits behind). Three things changed beyond the conflict:

  • uprating_indices.yaml conflicted on obr.per_capita.mixed_income: main added trading_loss, this PR self_employment_gross_receipts. Both kept.
  • The guard caught four inputs main added for UC reg 77 (owned_company_capital, owned_company_holding_value, owned_company_trade_assets under per-capita GDP, owned_company_income_share under per-capita mixed income). Listed under the index each declares.
  • Main's projection now reads the uprating attribute to grow unlisted columns after 2030 (_unmapped_uprating_indices). The guard docstring no longer calls that attribute dead metadata, and test_unmapped_inputs_preserve_legacy_years_and_grow_after_2030 now asserts only the columns still unlisted (rail_usage, employee_pension_contributions_reported) are fallbacks, since the columns this PR lists grow every year instead.

Merge with main (18 Oct)

Merged origin/main (295 commits behind, no conflicts). The guard then failed on one input main added for the annual allowance taper (e28e3b6): pension_contributions_via_salary_sacrifice_pre_2015 declares obr.average_earnings but was not in the YAML. It is the pre-9 July 2015 share of pension_contributions_via_salary_sacrifice, so it is now listed beside it under average earnings. It defaults to zero in survey data, so no current output moves.

Provenance of the series these columns now use (since review, 12 Oct)

Water bills (ofwat.water_bills). Values are charging years from April, stored at 1 January (2025 holds 2025-26).

  • 2025-26: 27%, from Ofwat's statement of 29 January 2026. It replaces the 26% forecast in Ofwat's 30 January 2025 statement.
  • 2026-27: 5.4%, from Water UK, 28 January 2026: national average £639, up £33. It replaces a 5.5% projection.
  • 2027-2029 (4.6%, 4.5%, 4.5%): kept. They come from utils/water/forecast_water_bills.py (Improve water forecasts #1239). The script takes the customer-weighted mean of the CCW per-company table and adds a hardcoded CPIH path. The CCW page says that table shows Ofwat's PR24 draft determinations. The weights were in ofwat_increases.csv, which is gitignored and was never committed, so these values cannot be reproduced. Filed as Water bill projections for 2027-29 cannot be reproduced from the repo #2384.
  • The update is two values in one parameter. It is in this PR because its only runtime consumer is water_and_sewerage_charges, which this PR starts uprating. create_ahc_deflator.py reads it offline and was not rerun. Effect: the 2026 and later water factors rise by 0.70% (1.27 × 1.054 against 1.26 × 1.055), about £3.50 a household a year on the mean above.

Population (ons.population), the denominator for per_capita.gdp and per_capita.mixed_income.

  • 2022-2073 is the "Population growth" row of the OBR's Long-term economic determinants, March 2025 EFO (published 19 June 2025, brought in by Add OBR long-term economic determinants #1305). Fiscal year t/t+1 is stored at t-01-01, rounded to four decimals, and every year matches. Per the OBR's footnote, the row is the OBR's March 2025 forecast to 2029-30 and the ONS 2022-based migration category variant after that. The 2021 value has no recorded source.
  • So the gap with the March 2026 workbook comes from vintage. The per-capita series are March 2026 nominal growth minus this March 2025 population. Calendar-year growth implied by the March 2026 economy tables (Table 1.1 real GDP over Table 1.5 real GDP per person) is 0.37% for 2025 against 0.72% stored, and 0.30-0.36% against 0.37-0.45% for 2026-2030. The ONS has since published 2024-based projections (28 April 2026).
  • Bound. Re-deriving with the March 2026 implied population would raise the per-capita GDP and mixed income factors from 2024 by about 0.35% by 2025, 0.46% by 2027 and 0.73% by 2030. That is the most the seven newly uprated per-capita columns could move. household_weight is uprated by the same population series, so in the uprating step aggregates still grow with nominal GDP or mixed income. The vintage mainly shifts the split between amounts per household and household counts.
  • Not changed here. ons.population drives household_weight and every per_capita.* series, so a refresh has to re-derive them together. Filed as Refresh ons.population and re-derive the per-capita series from one vintage #2383. The YAML now cites the dated release, the mapping and the vintage instead of the ONS homepage.

Reproducer: policyengine_uk/tests/code_health/test_uprating_declarations.py::test_declared_uprating_variables_are_in_the_yaml, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_yaml_uprates_by_the_declared_index, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_every_known_exception_still_holds, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_passes_exceptions_that_still_hold, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_flags_an_unuprated_exception_added_to_the_yaml, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_flags_an_override_that_now_matches, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_flags_an_override_dropped_from_the_yaml, policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_flags_missing_or_undeclared_exceptions, policyengine_uk/tests/test_water_bills_growth.py::test_published_water_bill_growth, policyengine_uk/tests/test_water_bills_growth.py::test_water_index_compounds_the_published_years

axiom: n/a: uprating of survey input columns and economic-assumption provenance; no tax or benefit rule changes

@juaristi22

Copy link
Copy Markdown
Collaborator

Changes requested: clear the formatting failure and register the changelog fragment. Reviewed head: 747a1d1381cb4ac6c742fdd486f9233ec124ee79.

The uprating additions remain useful. Main 3c48247eb92b221312565bff3a1dbf0b87306e22 still omits pension_contributions_via_salary_sacrifice, housing_service_charges and water_and_sewerage_charges from its uprating map. This PR wires those columns to their already-declared indices. The three new guard tests pass, so the two concrete blockers below should be repairable without changing policy values or test expectations.

  1. Format the new test file. The UPRATING_INDICES assignment fails the configured formatter. The executed check returned Would reformat: policyengine_uk/tests/code_health/test_uprating_declarations.py and 1 file would be reformatted, matching the failing Lint job. Apply uv run ruff format policyengine_uk/tests/code_health/test_uprating_declarations.py; retain all three tests, declared-index checks and documented exception sets.
  2. Give the fragment a recognised type. uprate-four-remaining-columns.md omits the type required by Towncrier's configuration. The executed draft rendered “No significant changes.” Rename it to uprate-four-remaining-columns.fixed.md, preserving the repair description. The draft must then show that text in its Fixed section. Leave the generated CHANGELOG.md to the release workflow.

Acceptance commands from the repaired checkout:

uv run pytest policyengine_uk/tests/code_health/test_uprating_declarations.py -q
uv run ruff format --check policyengine_uk/tests/code_health/test_uprating_declarations.py
uv run ruff check policyengine_uk/tests/code_health/test_uprating_declarations.py
uv run towncrier build --draft --version 0.0.0

Require all three tests and both Ruff checks to pass, verify that Towncrier includes the fragment, and obtain green CI on the updated head. Keep this repair scoped to formatting and the fragment filename; changing the economic indices or removing exceptions requires separate evidence.

Validation performed: exact-snapshot guard tests 3 passed in 0.91s; formatter failure and ignored fragment independently reproduced. Execution used the existing Python 3.13.14/core 3.32.9 environment. The map was compared with current main and existing variable declarations. The guard confirms consistency with those declarations; it does not independently establish the economic choice of indices. No private-data projection or rebased integration run was performed, and the proposed repair has not been applied or tested.

Live posting check (2026-10-02T15:11:38.782329+00:00): same reviewed commit; GitHub reports MERGEABLE. Failing checks: Lint. These checks do not replace the remaining validation listed above.

@vahid-ahmadi
vahid-ahmadi force-pushed the uprate-four-remaining-columns branch from 747a1d1 to 8300b0a Compare October 7, 2026 09:37

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

Re-review of 8300b0a: the two requested blockers are addressed in the diff. The guard test is formatted, the changelog fragment now has the .fixed.md type, and the added mappings are placed under the variables’ declared indices. Lint and the four install/smoke jobs pass; the current Test job is still running, so this is a comment rather than an approval.

Should address: test_every_known_exception_still_declares_uprating checks only that an exception variable exists and still declares uprating. It does not check that a KNOWN_UNUPRATED entry remains absent from the YAML or that a KNOWN_INDEX_OVERRIDES entry still has an index mismatch. If an exception becomes stale, it can mask a later gap. Please check that each exception’s reason still holds, or remove it when resolved. This is a guard-coverage concern; I found no demonstrated current mapping error.

I could not independently run the guard, Towncrier draft, or private-dataset projections in this workspace. Please wait for the Test job before treating this re-review as complete.

@juaristi22

juaristi22 commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Review of #1863 — Uprate three more columns, and guard the gap that hid them

Base repository: PolicyEngine/policyengine-uk
PR number: 1863
Reviewed head SHA: 155f50b
Merge base SHA: e146253
Mode: incremental from 155f50b
Scope: changed behavior and affected dependencies
Source evidence: Official sources are linked below; local source copies and validation artifacts were retained.
Review status: PARTIAL

Source Documents

No source documents registered; see scope and validation.

Critical

None.

Should Address

None.

Suggestions

None.

Evidence Gaps

  • The numerical provenance of the newly activated OBR earnings, lagged earnings, per-capita GDP/mixed-income series and Ofwat bill-growth series could not be independently checked against the original tables: OBR and Ofwat source routes returned HTTP403 within the acquisition budget. The mapping/declaration consistency is established, but that does not certify the economic index choice or baseline series.
  • Role checks incomplete: current-pr-1863-review-policy.md; see recovered report.

Notes

  • All ten newly listed variables agree with their declared index and entity. A focused dataset diagnostic actually extends each £1,000 input from2025 to2026 and verifies the exact declared YoY factor (water1055, servicecharges1053, salarysacrifice1034, six GDP inputs1029.2, grossreceipts1030.6); reset_growthfactor_uprating returns all ten to£1,000. The new guard detects missing, wrong-index and stale exception declarations. No duplicate new YAML memberships were found.
  • Optional Hypothesis regression test_rent_uprating.py NOT RUN: Hypothesis absent. Runnable changed/regression batch passed after excluding that path.
  • Evidence reused after confirming identical reviewed head and merge base. The fetched main branch has advanced; the review remains scoped to this unchanged head. Current CI was captured separately. Local tests were not rerun.
  • Captured base branch: main. Actual fetched base SHA: f1a9a3c. Incremental scope contains no code changes.

Validation Summary

Reused exact-head validation (not rerun in this batch): 12 passed, 1 warning in 6.35s; snapshot import confirmed; raw command/paths in pr-1863-code-tests-config.json and pr-1863-code-tests.log; Diagnostic: ten-column uprating script (pr-1863-code-uprating-diagnostic.py; retained locally), output (pr-1863-code-uprating-diagnostic.log; retained locally), PASS; bounded elapsed2.88s.

Reused exact-head validation (not rerun in this batch): 0 official originals; static source/policy review; no duplicate model execution. Manifest: pr-1863-review-sources.json; bundled check_source_manifest.py passed under existing Python3.13; cache result pr-1863-review-source-cache-check.json

CI at 155f50b: Install + smoke-import (py3.11)=SUCCESS, Install + smoke-import (py3.12)=SUCCESS, Install + smoke-import (py3.13)=SUCCESS, Install + smoke-import (py3.14)=SUCCESS, Lint=SUCCESS, Test=SUCCESS.

Detailed code, policy, source and reproduction artifacts were retained locally.

Timing

elapsed seconds: 1151.70s; setup seconds: 271.12s

Review Severity

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

vahid-ahmadi and others added 3 commits October 12, 2026 10:59
Follow-up to #1860, closing most of #1862.

Three variables declared an uprating index but were missing from
uprating_indices.yaml, so they were never uprated. On enhanced_frs_2024_25,
2024 -> 2027:

  water_and_sewerage_charges                  375.51 -> 522.12  (+39.0%)
  housing_service_charges                      91.81 -> 105.06  (+14.4%)
  pension_contributions_via_salary_sacrifice  418.69 -> 466.81  (+11.5%)

Each matches its index compounded over the same years exactly: ofwat water
bills +39.0%, OBR lagged average earnings +14.4%, OBR average earnings +11.5%.
All three indices already had the yoy_growth twin the YAML needs, so this is
a YAML-only change.

rail_usage is deliberately NOT included. Its declared index,
gov.dft.rail.ridership_index, is a CUMULATIVE index with 2020 = 1.0 —
"Used for uprating the quantity component of rail subsidy spending" — not a
year-on-year rate. Adding it to a yoy_growth block compounds the level and
uprates the variable by about 684% over 2024-27. Uprating it properly needs a
year-on-year series, which is more than a YAML entry.

The durable fix is the code-health test suggested in review of #1860:
policyengine_uk/tests/code_health/test_uprating_declarations.py asserts that
every variable declaring `uprating` appears in the YAML under the matching
index. Verified it fails when an entry is removed, rather than only passing
today.

Three exceptions are listed with reasons rather than silently tolerated:
rail_usage and employee_pension_contributions_reported as not uprated, and
savings_interest_income as uprated by a different index from the one it
declares — the mismatch noted in #1862, left for someone with the context to
say which is intended. A third test keeps those lists honest by asserting each
entry still exists and still declares uprating.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…lose the gaps it now finds

- ruff format test_uprating_declarations.py (the Lint failure).
- Rename the fragment to uprate-four-remaining-columns.fixed.md so towncrier
  renders it under Fixed rather than dropping it.
- After rebasing onto main, the guard flags ten variables declared since:
  seven are genuine gaps and now uprate by the index they declare
  (cash_isa, stocks_and_shares_isa, mortgage_debt, consumer_debt,
  rent_paid_as_boarder, rent_paid_as_lodger by per-capita GDP;
  self_employment_gross_receipts by per-capita mixed income); the three
  energy columns are listed as deliberately unuprated, per #1868.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The exception check only confirmed each entry still existed and declared
`uprating`. It now also fails when a KNOWN_UNUPRATED variable has been added
to uprating_indices.yaml, or when a KNOWN_INDEX_OVERRIDES variable is now
uprated by its declared index (or has left the YAML), naming the list to edit.
Unit tests feed the guard stale entries to prove each case is caught.

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

Copy link
Copy Markdown
Collaborator

Suggested Reproducer: line for the new Fix evidence check; add it to the description, or narrow it to the test that reproduces the bug. It lists the tests this PR adds or changes, and the check (.github/check_fix_pr.py) accepts it against this PR's diff.

Reproducer: `policyengine_uk/tests/code_health/test_uprating_declarations.py::test_declared_uprating_variables_are_in_the_yaml`, `policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_yaml_uprates_by_the_declared_index`, `policyengine_uk/tests/code_health/test_uprating_declarations.py::test_every_known_exception_still_holds`, `policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_passes_exceptions_that_still_hold`, `policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_flags_an_unuprated_exception_added_to_the_yaml`, `policyengine_uk/tests/code_health/test_uprating_declarations.py::test_the_guard_flags_an_override_that_now_matches`

The check isn't required yet (decision d1368); it fails fix PRs whose description names no reproducer.

🤖 Generated with Claude Code

@vahid-ahmadi
vahid-ahmadi force-pushed the uprate-four-remaining-columns branch from 155f50b to d150116 Compare October 12, 2026 09:26
@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

Rebased onto main (d150116). The one conflict was in uprating_indices.yaml, where main had added uc_reported_capital next to the six new per-capita GDP entries, so I kept both; the guard finds no new gaps.
At the new head, ruff check and format are clean, the guard tests pass (8), as do the code health tests (2,277), 21 related uprating test files (1,731 passed, 66 skipped) and the full YAML policy suite (3,058), with the same counts on main.

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

Re-reviewed d150116d0d08c9b9db2234f348dd38c84ea816e1. The rebase retains both main’s uc_reported_capital entry and this PR’s uprating entries. The stale-exception guard now fails as intended; all eight focused current-head guard tests pass. I found no new YAML membership defect.

I checked the official OBR March 2026 economy workbook: its earnings, nominal-GDP and mixed-income figures support the PR’s 11.5% and 14.4% earnings examples and the numerator series. The remaining source gap is the dated ONS population projection/vintage used to turn GDP and mixed income into per-capita factors. The YAML points only to the ONS homepage, and its 2025 population growth differs from the rate implicit in the OBR workbook.

For water bills, Ofwat’s published 2025–26 26% figure was a forecast; its later release reports 27% for that year and 5.4% for 2026–27, versus the model’s 26% and 5.5%. The 2027–29 factors are custom projections, and the local build expects an untracked ofwat_increases.csv, so I could not reproduce their company-weighted derivation. Please document the inputs, vintage and projection calculation, or bound the effect of using these existing series for the newly uprated columns. I can revisit approval with that provenance and completed current-head CI.

…series' provenance

Water bill growth for 2025-26 becomes 27%, the figure in Ofwat's
29 January 2026 statement, replacing its 30 January 2025 forecast of 26%.
2026-27 becomes 5.4%, Water UK's 28 January 2026 national average, replacing
a 5.5% projection. The 2027-2029 projections are kept and their method is
recorded, including that their inputs were never committed.

ons.population is documented as the OBR long-term economic determinants for
the March 2025 EFO (19 June 2025), with the ONS 2022-based migration category
variant from 2030-31, and the per-capita series note that they use it.

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

Copy link
Copy Markdown
Collaborator Author

Thanks. Both points are addressed in 7ab0afa, with details under "Provenance" in the description.

  1. Population. ons.population for 2022 to 2073 is the population growth row of the OBR's long-term economic determinants for the March 2025 EFO (published 19 June 2025). Each fiscal year is stored at 1 January of the year it starts, and every value matches. It is the OBR forecast to 2029-30 and the ONS 2022-based migration category variant after that. The 2025 gap you found comes from vintage: the per-capita series are March 2026 nominal growth minus this March 2025 population, and the March 2026 tables imply 0.37% for 2025 against 0.72% stored. Re-deriving would raise the per-capita GDP and mixed income factors by about 0.35% by 2025, 0.46% by 2027 and 0.73% by 2030. That is the bound for the seven new per-capita columns. I have not changed it here, because household_weight and every per_capita.* series depend on it and need refreshing together. The YAML now cites the dated release instead of the ONS homepage, and the refresh is Refresh ons.population and re-derive the per-capita series from one vintage #2383.
  2. Water bills. 2025-26 is now 27% (Ofwat, 29 January 2026) and 2026-27 is 5.4% (Water UK, 28 January 2026, £639 up £33), with a test that fails on the old 26% and 5.5%. The only runtime user of this series is the water column this PR starts uprating, so the change raises it by 0.7% from 2026 and moves nothing else. I kept the 2027-29 values. They are documented in the YAML and the water bills docs page as a customer-weighted mean of the CCW table, which shows Ofwat's draft determinations, plus a hardcoded CPIH path. The weights were in the untracked CSV, so those three years cannot be reproduced. The rebuild is Water bill projections for 2027-29 cannot be reproduced from the repo #2384.

Following Max's comment, the description now has the Reproducer: and axiom: lines, and .github/check_fix_pr.py passes locally. Guard tests (8), code health and the YAML suite (3,058) pass, and ruff is clean.

@juaristi22 could you re-review?

vahid-ahmadi and others added 3 commits October 14, 2026 16:04
Resolve uprating_indices.yaml: keep main's trading_loss and this branch's
self_employment_gross_receipts under obr.per_capita.mixed_income.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
List main's four owned_company inputs under the indices they declare, which
the guard caught after the merge. Narrow main's fallback assertion in
test_projection_horizon.py to the columns that are still unlisted, and
correct the guard docstring now that the uprating attribute drives the
post-2030 fallback.

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

Copy link
Copy Markdown
Collaborator Author

Merged main into this branch (6c3f5d6). Beyond the conflict, which kept both trading_loss and self_employment_gross_receipts, two things changed that reviewers should know about:

  1. The guard caught four inputs main added for UC reg 77. They are now listed under the index each declares: owned_company_capital, owned_company_holding_value and owned_company_trade_assets under per-capita GDP, and owned_company_income_share under per-capita mixed income.
  2. Main (Project single-year datasets to 2032, past the OBR horizon #2376) now reads the uprating attribute to grow unlisted columns after 2030. test_unmapped_inputs_preserve_legacy_years_and_grow_after_2030 listed the columns this PR maps as fallbacks, so it now asserts only rail_usage and employee_pension_contributions_reported. The guard docstring no longer calls the attribute dead metadata.

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

Re-reviewed 6c3f5d60e4947512e1bc9a77b2ff40a252dbcd40 after the provenance updates and main merge. The code checks are clear: all 24 changed guard, water-growth and projection tests pass, including the Hypothesis checks. The new company columns use their declared indices, and the post-2030 fallback does not double-uprate them. Captured current-head CI passes.

The dated OBR release attribution is now documented, and I verified Water UK’s 2026–27 increase of 5.4% (£33 to £639). Two numerical source checks remain incomplete in this run:

  • The official OBR workbook downloads returned “No Access” HTML or403, so I could not independently check the population row and the newly supplied per-capita vintage bounds.
  • Both permitted routes to the cited Ofwat statement were blocked, so I could not newly corroborate the changed 2025–26 value of27%. I have not established that the value is wrong.

The explicitly disclosed 2027–2029 forecast/weights limitation remains tracked by #2384. I am leaving this review PARTIAL with no confirmed code defect. Accessible copies of the exact official workbook/table and Ofwat statement would let me close the remaining source checks without repeating the model tests.

vahid-ahmadi and others added 2 commits October 18, 2026 19:16
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… earnings

Main added this input (e28e3b6) declaring obr.average_earnings without
a YAML entry, so the guard fails once main is merged. It is the pre-9 July
2015 share of pension_contributions_via_salary_sacrifice, which the YAML
already uprates by the same index.

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

Copy link
Copy Markdown
Collaborator Author

@juaristi22 thanks for the 15 Oct re-review. Two updates.

  1. Merge with main (f34503a). I merged origin/main (295 commits, no conflicts). The guard then failed on pension_contributions_via_salary_sacrifice_pre_2015, which main added in e28e3b6 for the annual allowance taper. It declares obr.average_earnings but had no YAML entry. It is the pre-9 July 2015 share of pension_contributions_via_salary_sacrifice, so I listed it beside that column under average earnings. It defaults to zero in survey data, so no current output moves. At the new head: the guard, water-growth and projection tests pass (24), tests/code_health passes (2,402), the pension YAML tests pass (115), and ruff check and ruff format --check are clean. The changelog fragment and the description now include it.
  2. Source copies. I tried the Ofwat 29 January 2026 statement and the OBR long-term determinants page from here as well, and both returned 403, as did the archive route. So I cannot give you an accessible copy from this side. The citations in the description and YAML are unchanged.

🤖 Generated with Claude Code

Keep this PR's new columns under obr.per_capita savings growth and main's
comment for uc_reported_capital.

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

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 8b12bce949 against head 38b03bd343, 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: 134 (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
Absolute poverty, after housing costs: pensioners 2031-32 1,423k 1,540k +116.5k
Absolute poverty, after housing costs: pensioners 2030-31 1,411k 1,501k +89.6k
Absolute poverty, after housing costs: pensioners 2029-30 1,401k 1,478k +76.5k
Absolute poverty, after housing costs: pensioners 2028-29 1,389k 1,460k +70.3k
Absolute poverty, after housing costs: pensioners 2031-32 12.3% 13.3% +1.01pp
Absolute poverty, after housing costs: pensioners 2027-28 1,382k 1,444k +61.4k
Absolute poverty, after housing costs: pensioners 2030-31 12.3% 13.1% +0.78pp
Decile 9: mean household_net_income per household 2031-32 £90,034 £90,695 +£660
Decile 10: mean household_net_income per household 2031-32 £132,991 £132,025 -£965
Relative poverty, after housing costs: pensioners 2029-30 1,408k 1,458k +49.9k
Absolute poverty, after housing costs: children 2030-31 31.6% 32.2% +0.69pp
Absolute poverty, after housing costs: pensioners 2029-30 12.2% 12.9% +0.67pp
Absolute poverty, after housing costs: children 2031-32 31.8% 32.5% +0.64pp
Absolute poverty, after housing costs: pensioners 2028-29 12.2% 12.8% +0.62pp
Relative poverty, after housing costs: pensioners 2030-31 1,408k 1,450k +42.3k
Relative poverty, after housing costs: pensioners 2031-32 1,423k 1,466k +42.6k
Absolute poverty, after housing costs: pensioners 2027-28 12.0% 12.5% +0.53pp
Relative poverty, after housing costs: pensioners 2026-27 1,507k 1,547k +39.6k
Absolute poverty, after housing costs: children 2029-30 31.2% 31.7% +0.50pp
Decile 10: mean household_net_income per household 2030-31 £129,846 £129,212 -£634
Absolute poverty, after housing costs: everyone 2031-32 21.8% 22.3% +0.48pp
Absolute poverty, after housing costs: everyone 2030-31 21.7% 22.1% +0.46pp
Decile 3: mean household_net_income per household 2030-31 £38,068 £37,900 -£167
Absolute poverty, after housing costs: everyone 2031-32 15,517k 15,857k +340.3k
Absolute poverty, after housing costs: children 2030-31 4,831k 4,937k +105.7k
Relative poverty, after housing costs: pensioners 2029-30 12.3% 12.7% +0.44pp
Absolute poverty, after housing costs: everyone 2030-31 15,380k 15,710k +329.8k
Decile 4: mean household_net_income per household 2030-31 £43,755 £43,942 +£187
Absolute poverty, after housing costs: children 2031-32 4,894k 4,992k +97.9k
Relative poverty, after housing costs: children 2025-26 32.6% 33.0% +0.40pp
Absolute poverty, after housing costs: everyone 2029-30 21.4% 21.8% +0.40pp
Absolute poverty, after housing costs: pensioners 2026-27 1,445k 1,474k +28.2k
Absolute poverty, after housing costs: everyone 2029-30 15,145k 15,425k +280.2k
Relative poverty, after housing costs: pensioners 2031-32 12.3% 12.7% +0.37pp
Relative poverty, after housing costs: pensioners 2030-31 12.2% 12.6% +0.37pp
National Insurance (employer) 2031-32 £188.22bn £188.90bn +£675.2m
National Insurance (employer) 2030-31 £181.08bn £181.72bn +£643.4m
Decile 4: mean household_net_income per household 2031-32 £44,885 £45,040 +£155
Decile 3: mean household_net_income per household 2031-32 £38,716 £38,584 -£131
Relative poverty, after housing costs: pensioners 2026-27 12.8% 13.1% +0.34pp

94 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 +£88.0m +£159.5m +£212.2m +£256.7m +£306.4m +£369.2m +£403.1m
National Insurance (employee and self-employed) 0 0 0 0 +£106.6m +£125.1m +£131.3m
National Insurance (employer) 0 0 0 0 +£544.2m +£643.4m +£675.2m
Capital gains tax 0 0 0 0 -£0 -£0 +£0

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Universal Credit 0 0 0 0 +£1.0m +£1.0m +£1.1m
Council Tax Reduction 0 0 0 0 -£3,640 -£4,281 -£4,442
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
Universal Credit 0 0 0 0 +14 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 +£88.0m +£159.5m +£212.2m +£256.7m +£957.3m +£1.14bn +£1.21bn
Government spending 0 † 0 † 0 † 0 † +£1.0m † +£1.0m † +£1.1m †
Government balance, each receipt once +£88.0m † +£159.5m † +£212.2m † +£256.7m † +£956.2m † +£1.14bn † +£1.21bn †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax +£88.0m +£159.5m +£212.2m +£256.7m +£957.3m +£1.14bn +£1.21bn
household_tax +£88.0m +£159.5m +£212.2m +£256.7m +£413.0m +£494.3m +£534.4m
pre_budget_change_household_tax +£88.0m +£159.5m +£212.2m +£256.7m +£413.0m +£494.3m +£534.4m
gov_spending 0 † 0 † 0 † 0 † +£1.0m † +£1.0m † +£1.1m †
household_benefits 0 † 0 † 0 † 0 † +£1.0m † +£1.0m † +£1.1m †
gov_balance +£88.0m † +£159.5m † +£212.2m † +£256.7m † +£956.2m † +£1.14bn † +£1.21bn †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income 0 0 0 0 +£3.63bn +£4.29bn +£4.50bn
Household net income -£88.0m † -£159.5m † -£212.2m † -£256.7m † -£412.0m † -£493.2m † -£533.3m †
Household net income (HBAI definition) -£88.0m -£159.5m -£212.2m -£256.7m -£412.0m -£493.2m -£533.3m

Poverty rates

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 0 0 0 0 0 0 +0.00pp
Absolute poverty, before housing costs: children 0 0 0 0 0 0 +0.00pp
Absolute poverty, before housing costs: working-age adults 0 0 0 0 0 0 +0.00pp
Absolute poverty, after housing costs: everyone +0.17pp +0.20pp +0.28pp +0.26pp +0.40pp +0.46pp +0.48pp
Absolute poverty, after housing costs: children +0.28pp +0.28pp +0.22pp +0.14pp +0.50pp +0.69pp +0.64pp
Absolute poverty, after housing costs: working-age adults +0.13pp +0.17pp +0.24pp +0.21pp +0.29pp +0.30pp +0.28pp
Absolute poverty, after housing costs: pensioners +0.18pp +0.24pp +0.53pp +0.62pp +0.67pp +0.78pp +1.01pp
Relative poverty, before housing costs: everyone 0 0 0 0 0 0 -0.00pp
Relative poverty, before housing costs: children 0 0 0 0 0 0 -0.00pp
Relative poverty, before housing costs: working-age adults 0 0 0 0 0 0 -0.00pp
Relative poverty, before housing costs: pensioners 0 0 0 0 0 0 -0.01pp
Relative poverty, after housing costs: everyone +0.22pp +0.20pp +0.16pp +0.06pp +0.19pp +0.20pp +0.17pp
Relative poverty, after housing costs: children +0.40pp +0.26pp +0.15pp -0.04pp +0.14pp +0.18pp +0.14pp
Relative poverty, after housing costs: working-age adults +0.17pp +0.14pp +0.17pp +0.09pp +0.14pp +0.16pp +0.13pp
Relative poverty, after housing costs: pensioners +0.13pp +0.34pp +0.15pp +0.07pp +0.44pp +0.37pp +0.37pp

People in poverty

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 0 0 0 0 0 0 +2
Absolute poverty, before housing costs: children 0 0 0 0 0 0 +1
Absolute poverty, before housing costs: working-age adults 0 0 0 0 0 0 +1
Absolute poverty, after housing costs: everyone +119.2k +142.1k +197.1k +183.6k +280.2k +329.8k +340.3k
Absolute poverty, after housing costs: children +41.9k +41.5k +32.9k +20.6k +76.8k +105.7k +97.9k
Absolute poverty, after housing costs: working-age adults +55.6k +72.4k +102.8k +92.7k +127.0k +134.4k +125.9k
Absolute poverty, after housing costs: pensioners +21.8k +28.2k +61.4k +70.3k +76.5k +89.6k +116.5k
Relative poverty, before housing costs: everyone 0 0 0 0 0 0 -2.3k
Relative poverty, before housing costs: children 0 0 0 0 0 0 -665
Relative poverty, before housing costs: working-age adults 0 0 0 0 0 0 -824
Relative poverty, before housing costs: pensioners 0 0 0 0 0 0 -842
Relative poverty, after housing costs: everyone +150.1k +140.0k +112.4k +43.3k +132.1k +139.6k +120.4k
Relative poverty, after housing costs: children +59.8k +39.8k +22.5k -6.0k +21.9k +26.8k +21.7k
Relative poverty, after housing costs: working-age adults +74.5k +60.6k +72.7k +41.1k +60.3k +70.4k +56.0k
Relative poverty, after housing costs: pensioners +15.8k +39.6k +17.2k +8.1k +49.9k +42.3k +42.6k

Inequality

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

Mean household net income in each side's own deciles

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household 0 † 0 † 0 † 0 † -£0.01 † -£0.01 † -£0.01 †
Decile 2: mean household_net_income per household 0 † 0 † 0 † 0 † -£0.41 † -£9.60 † -£0.90 †
Decile 3: mean household_net_income per household 0 † 0 † 0 † 0 † -£9.34 † -£167 † -£131 †
Decile 4: mean household_net_income per household 0 † 0 † -£103 † +£47 † -£9.71 † +£187 † +£155 †
Decile 5: mean household_net_income per household -£2.56 † -£4.43 † +£108 † -£73 † -£6.78 † -£6.46 † +£5.06 †
Decile 6: mean household_net_income per household -£0.25 † +£3.64 † -£0.63 † +£23 † +£23 † +£5.52 † -£21 †
Decile 7: mean household_net_income per household -£1.58 † -£5.86 † -£3.65 † -£19 † -£23 † -£19 † -£4.31 †
Decile 8: mean household_net_income per household -£1.88 † -£3.08 † -£4.07 † -£5.28 † +£51 † +£66 † +£24 †
Decile 9: mean household_net_income per household -£3.66 † -£0.11 † -£4.59 † -£4.86 † -£84 † -£173 † +£660 †
Decile 10: mean household_net_income per household -£18 † -£75 † -£42 † -£49 † -£347 † -£634 † -£965 †

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 -£164 +£264 +£1,096 -£14 -£7,157 +£167 -£834
Raise higher rate by 1pp +£1.1m +£1.8m +£1.8m +£1.7m +£1.7m +£2.2m +£2.0m
Raise personal allowance by ~800GBP/year +£0 -£18 -£0.2m -£78,724 +£1,951 -£8,474 +£0.2m
Raise child benefit by 25GBP/week per additional child +£0 +£6 -£36 -£18 -£242 +£4 +£415
Reduce Universal Credit taper rate to 20% +£0 0 0 +£0 -£50,644 -£0.2m -£0.1m
Raise Class 1 main employee NICs rate to 10% -£603 +£48 +£93 -£172 +£11.2m +£13.0m +£13.7m
Raise VAT standard rate by 2pp -£526 +£204 +£1,021 -£40 -£742 +£585 -£1,458
Raise additional rate by 3pp +£4.3m +£8.2m +£11.7m +£14.8m +£18.1m +£21.6m +£24.0m
Raise the Universal Credit standard allowance by 10% +£0 +£0 -£0 0 -£14,609 -£19,564 -£10,897
Raise the State Pension by 10% -£1 -£0 +£7 -£8 -£124 -£2,770 +£55,540

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 +£34 -£33 -£50 -£2 +£137 -£28 +£38
Raise higher rate by 1pp: change in income_tax +£1.1m +£1.8m +£1.8m +£1.7m +£1.7m +£2.2m +£2.0m
Raise personal allowance by ~800GBP/year: change in income_tax +£7 -£8 -£0.2m -£78,724 -£84 -£8,348 -£4
Reduce Universal Credit taper rate to 20%: change in universal_credit 0 0 0 0 +£50,702 +£0.2m +£0.1m
Raise Class 1 main employee NICs rate to 10%: change in national_insurance 0 0 0 0 +£11.4m +£13.2m +£13.9m
Raise additional rate by 3pp: change in income_tax +£4.3m +£8.2m +£11.7m +£14.8m +£18.1m +£21.6m +£24.0m
Raise the Universal Credit standard allowance by 10%: change in universal_credit 0 0 0 0 +£14,611 +£19,568 +£10,897

Household net income by decile

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

Base decile 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1 0 0 0 0 0 0 0
Decile 2 0 0 0 0 -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%)
Decile 3 0 0 0 0 -£1 (-0.0%) -£1 (-0.0%) -£1 (-0.0%)
Decile 4 0 0 0 0 -£10 (-0.0%) -£11 (-0.0%) -£12 (-0.0%)
Decile 5 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change -£3 (-0.0%) -£4 (-0.0%) -£4 (-0.0%)
Decile 6 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change -£4 (-0.0%) -£5 (-0.0%) -£11 (-0.0%)
Decile 7 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change -£8 (-0.0%) -£9 (-0.0%) -£3 (-0.0%)
Decile 8 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change -£11 (-0.0%) -£13 (-0.0%) -£18 (-0.0%)
Decile 9 -£4 (-0.0%) -£7 (-0.0%) -£10 (-0.0%) -£12 (-0.0%) -£21 (-0.0%) -£26 (-0.0%) -£25 (-0.0%)
Decile 10 -£18 (-0.0%) -£32 (-0.0%) -£42 (-0.0%) -£50 (-0.0%) -£71 (-0.1%) -£84 (-0.1%) -£90 (-0.1%)
all -£3 (-0.0%) -£5 (-0.0%) -£7 (-0.0%) -£8 (-0.0%) -£13 (-0.0%) -£16 (-0.0%) -£17 (-0.0%)
Year People gaining over £1 People losing over £1
2025-26 0.0% 0.8%
2026-27 0.0% 0.9%
2027-28 0.0% 0.9%
2028-29 0.0% 0.9%
2029-30 0.0% 14.3%
2030-31 0.0% 14.6%
2031-32 0.0% 14.9%

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

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

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

  • incapacity_benefit: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; gov_spending; not a failure)
  • incapacity_benefit: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; household_benefits; not a failure)
  • incapacity_benefit: universal_credit responds only through other heads in 72 households (other heads that moved there: carers_allowance, carer_support_payment; gov_spending; not a failure)
  • incapacity_benefit: universal_credit responds only through other heads in 72 households (other heads that moved there: carers_allowance, carer_support_payment; household_benefits; not a failure)
  • maternity_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)
  • maternity_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)
  • declared double count corporate_sdlt is still contained in expected_sdlt (coefficient 1.000; Corporate SDLT is counted twice in household and government tax totals #2159)
Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 8b12bce949 uk 2.137.0 (files 8134bcb438e7), core 3.33.2, py 3.13.16 aarch64 80b46a9e7de0 0d0426ee9e38 924.83s
head #1863 merged into main 38b03bd343 uk 2.137.0 (files 99192021aa01), core 3.33.2, py 3.13.16 aarch64 80b46a9e7de0 0d0426ee9e38 953.4s

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

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax £298.39bn £318.27bn £335.57bn £350.58bn £366.06bn £384.14bn £402.45bn
National Insurance (employee and self-employed) £52.58bn £54.94bn £56.75bn £58.48bn £60.62bn £62.57bn £65.03bn
National Insurance (employer) £152.64bn £159.18bn £164.14bn £168.73bn £176.11bn £181.72bn £188.90bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.62bn £13.06bn £13.55bn £14.04bn £14.54bn £15.09bn £15.65bn
Student loan repayments £7.83bn £8.12bn £8.35bn £8.56bn £8.79bn £9.04bn £9.38bn
VAT £253.71bn £260.53bn £266.72bn £273.14bn £279.83bn £286.71bn £293.71bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.28bn £4.43bn £4.44bn £4.46bn £4.49bn £4.51bn £4.53bn
Council tax £49.56bn £52.45bn £55.78bn £59.39bn £62.98bn £66.74bn £70.70bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.50bn £0.51bn £0.52bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.61bn £0.63bn £0.67bn £0.70bn £0.73bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax (own purchases, and corporate until the £10.26bn £10.84bn £11.32bn £11.80bn £12.29bn £12.83bn £13.42bn
Land transaction tax (Wales) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.01bn £0.01bn
Land and buildings transaction tax (Scotland) £0.01bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension £122.50bn £127.12bn £128.28bn £130.21bn £134.05bn £138.02bn £142.08bn
Pension Credit £6.68bn £7.06bn £7.04bn £7.11bn £7.23bn £7.37bn £7.46bn
Winter Fuel Payment £1.70bn £1.68bn £1.59bn £1.57bn £1.57bn £1.55bn £1.52bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £79.17bn £83.50bn £85.32bn £87.08bn £88.03bn £89.45bn £90.80bn
Housing Benefit £8.60bn £8.93bn £9.20bn £9.34bn £9.62bn £9.88bn £10.17bn
Council Tax Reduction £1.99bn £2.03bn £2.08bn £2.13bn £2.18bn £2.24bn £2.29bn
Employment and Support Allowance (income-related) £2.12bn £2.18bn £2.23bn £2.28bn £2.33bn £2.39bn £2.45bn
Employment and Support Allowance (contribution-based) £5.22bn £5.36bn £5.49bn £5.62bn £5.76bn £5.90bn £6.04bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.33bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £27.05bn £28.19bn £28.94bn £29.64bn £30.37bn £31.11bn £31.87bn
Disability Living Allowance £7.52bn £7.83bn £8.04bn £8.24bn £8.44bn £8.65bn £8.86bn
Attendance Allowance £8.71bn £9.08bn £9.32bn £9.55bn £9.78bn £10.02bn £10.26bn
Carer's Allowance £4.50bn £4.69bn £4.81bn £4.93bn £5.05bn £5.17bn £5.29bn
Carer Support Payment (Scotland) £0.35bn £0.37bn £0.38bn £0.39bn £0.40bn £0.41bn £0.41bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.57bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.23bn £16.91bn £17.32bn £17.73bn £18.16bn £18.60bn £19.04bn
Scottish Child Payment £0.50bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.58bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.32bn £3.41bn £3.49bn £3.57bn £3.66bn £3.75bn £3.84bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.13bn £1.16bn £1.19bn £1.22bn £1.25bn £1.28bn £1.31bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.74bn £0.76bn £0.78bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.65bn £3.09bn £3.17bn £3.24bn £3.33bn £3.41bn £3.49bn
Universal childcare entitlement £3.27bn £3.39bn £3.48bn £3.57bn £3.66bn £3.77bn £3.85bn
Targeted childcare entitlement £0.57bn £0.59bn £0.61bn £0.62bn £0.64bn £0.66bn £0.66bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £204.68bn £205.46bn £206.22bn £207.04bn £207.96bn £208.89bn £209.79bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £25.78bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension 11,308k 11,208k 10,906k 10,812k 10,860k 10,908k 10,955k
Pension Credit 1,491k 1,489k 1,477k 1,455k 1,457k 1,454k 1,451k
Winter Fuel Payment 7,091k 7,008k 6,593k 6,509k 6,491k 6,377k 6,242k
Pension Age Winter Heating Payment (Scotland) 806k 807k 807k 805k 809k 812k 816k
Universal Credit 6,372k 6,379k 6,409k 6,420k 6,395k 6,387k 6,371k
Housing Benefit 1,254k 1,253k 1,254k 1,240k 1,245k 1,247k 1,249k
Council Tax Reduction 3,187k 3,212k 3,225k 3,247k 3,263k 3,282k 3,296k
Employment and Support Allowance (income-related) 187k 188k 188k 189k 190k 190k 191k
Employment and Support Allowance (contribution-based) 722k 724k 727k 730k 733k 737k 740k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 68k 68k 68k 69k 69k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,581k 3,595k 3,608k 3,623k 3,639k 3,655k 3,671k
Disability Living Allowance 1,296k 1,301k 1,306k 1,311k 1,317k 1,323k 1,329k
Attendance Allowance 1,701k 1,708k 1,714k 1,721k 1,729k 1,736k 1,744k
Carer's Allowance 1,038k 1,042k 1,046k 1,050k 1,055k 1,059k 1,064k
Carer Support Payment (Scotland) 81k 82k 82k 82k 83k 83k 83k
Carer's Allowance Supplement (Scotland) 0k 82k 82k 82k 83k 83k 83k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 138k 139k 139k 140k 140k 141k
Armed Forces Compensation Scheme 94k 94k 94k 95k 95k 95k 96k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,136k 8,165k 8,185k 8,215k 8,249k 8,282k 8,314k
Scottish Child Payment 352k 354k 355k 356k 357k 358k 357k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 201k 202k 203k 204k 204k 205k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 334k 335k 336k 338k 339k 341k 342k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 182k 183k 183k 184k 185k 186k 186k
Sure Start Maternity Grant 26k 26k 26k 27k 27k 27k 27k
Bereavement Support Payment 98k 98k 99k 99k 100k 100k 101k
Tax-Free Childcare 1,017k 1,028k 1,028k 1,033k 1,034k 1,038k 1,023k
Extended childcare entitlement 665k 671k 675k 677k 682k 686k 687k
Universal childcare entitlement 986k 989k 992k 997k 1,002k 1,013k 1,015k
Targeted childcare entitlement 119k 120k 120k 121k 121k 122k 121k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 99k 99k 100k 100k 100k 101k
Adult Dependants' Grant 18k 18k 12k 13k 13k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £898.69bn £938.78bn £975.62bn £1,008.75bn £1,045.04bn £1,082.06bn £1,123.13bn
Government spending £536.94bn † £551.10bn † £557.43bn † £564.51bn † £573.07bn † £582.33bn † £591.49bn †
Government balance, each receipt once £361.75bn † £387.68bn † £418.19bn † £444.24bn † £471.97bn † £499.74bn † £531.63bn †
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 £901.82bn £941.91bn £978.75bn £1,011.88bn £1,048.17bn £1,085.19bn £1,126.26bn
household_tax £495.47bn £522.20bn £547.89bn £570.00bn £592.23bn £616.76bn £643.65bn
pre_budget_change_household_tax £487.64bn £514.08bn £539.54bn £560.96bn £582.95bn £607.21bn £633.76bn
gov_spending £536.94bn † £551.10bn † £557.43bn † £564.51bn † £573.07bn † £582.33bn † £591.49bn †
household_benefits £536.94bn † £551.10bn † £557.43bn † £564.51bn † £573.07bn † £582.33bn † £591.49bn †
gov_balance £364.88bn † £390.81bn † £421.32bn † £447.37bn † £475.10bn † £502.87bn † £534.76bn †
Components the model counts twice: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,657.06bn £1,719.25bn £1,771.68bn £1,821.99bn £1,891.04bn £1,949.88bn £2,021.87bn
Household net income £1,659.25bn † £1,707.39bn † £1,739.34bn † £1,773.55bn † £1,809.65bn † £1,851.22bn † £1,902.77bn †
Household net income (HBAI definition) £1,468.08bn £1,514.72bn £1,547.15bn £1,580.30bn £1,614.41bn £1,653.52bn £1,703.96bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,514k 69,778k 70,036k 70,316k 70,626k 70,944k 71,249k
Benefit units 35,247k 35,381k 35,512k 35,654k 35,811k 35,972k 36,127k
Households 31,167k 31,285k 31,401k 31,526k 31,665k 31,808k 31,944k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 15.9% 14.9% 15.5% 15.6% 15.7% 15.8% 15.7%
Absolute poverty, before housing costs: children 23.7% 20.9% 21.6% 21.4% 21.6% 21.8% 21.7%
Absolute poverty, before housing costs: working-age adults 13.8% 13.4% 14.0% 14.1% 14.2% 14.3% 14.3%
Absolute poverty, before housing costs: pensioners 13.6% 13.1% 13.2% 13.4% 13.5% 13.6% 13.5%
Absolute poverty, after housing costs: everyone 21.1% 20.6% 21.3% 21.5% 21.8% 22.1% 22.3%
Absolute poverty, after housing costs: children 32.0% 30.2% 30.9% 31.1% 31.7% 32.2% 32.5%
Absolute poverty, after housing costs: working-age adults 19.6% 19.4% 20.2% 20.4% 20.8% 21.0% 21.0%
Absolute poverty, after housing costs: pensioners 12.7% 12.5% 12.5% 12.8% 12.9% 13.1% 13.3%
Relative poverty, before housing costs: everyone 17.0% 16.4% 16.5% 16.6% 16.8% 16.8% 16.9%
Relative poverty, before housing costs: children 25.7% 23.5% 23.3% 23.2% 23.4% 23.5% 23.7%
Relative poverty, before housing costs: working-age adults 14.5% 14.4% 14.7% 14.8% 15.1% 15.1% 15.2%
Relative poverty, before housing costs: pensioners 14.8% 14.9% 14.4% 14.4% 14.3% 14.4% 14.6%
Relative poverty, after housing costs: everyone 21.7% 21.3% 21.4% 21.5% 21.7% 21.8% 21.9%
Relative poverty, after housing costs: children 33.0% 31.6% 31.2% 31.1% 31.6% 31.6% 32.0%
Relative poverty, after housing costs: working-age adults 20.0% 19.9% 20.3% 20.4% 20.7% 20.8% 20.9%
Relative poverty, after housing costs: pensioners 13.5% 13.1% 12.7% 12.8% 12.7% 12.6% 12.7%
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,050k 10,426k 10,847k 10,945k 11,075k 11,205k 11,215k
Absolute poverty, before housing costs: children 3,559k 3,140k 3,260k 3,252k 3,297k 3,333k 3,333k
Absolute poverty, before housing costs: working-age adults 5,864k 5,737k 6,070k 6,164k 6,236k 6,314k 6,319k
Absolute poverty, before housing costs: pensioners 1,627k 1,549k 1,517k 1,528k 1,542k 1,558k 1,563k
Absolute poverty, after housing costs: everyone 14,655k 14,352k 14,885k 15,106k 15,425k 15,710k 15,857k
Absolute poverty, after housing costs: children 4,807k 4,554k 4,674k 4,717k 4,830k 4,937k 4,992k
Absolute poverty, after housing costs: working-age adults 8,331k 8,324k 8,767k 8,929k 9,118k 9,272k 9,326k
Absolute poverty, after housing costs: pensioners 1,517k 1,474k 1,444k 1,460k 1,478k 1,501k 1,540k
Relative poverty, before housing costs: everyone 11,807k 11,456k 11,570k 11,652k 11,832k 11,919k 12,063k
Relative poverty, before housing costs: children 3,863k 3,538k 3,520k 3,528k 3,567k 3,592k 3,641k
Relative poverty, before housing costs: working-age adults 6,178k 6,160k 6,389k 6,483k 6,623k 6,674k 6,740k
Relative poverty, before housing costs: pensioners 1,767k 1,758k 1,661k 1,642k 1,642k 1,653k 1,682k
Relative poverty, after housing costs: everyone 15,068k 14,857k 15,009k 15,099k 15,347k 15,484k 15,638k
Relative poverty, after housing costs: children 4,946k 4,753k 4,717k 4,715k 4,811k 4,841k 4,916k
Relative poverty, after housing costs: working-age adults 8,516k 8,557k 8,829k 8,925k 9,078k 9,193k 9,257k
Relative poverty, after housing costs: pensioners 1,606k 1,547k 1,463k 1,459k 1,458k 1,450k 1,466k
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.3076 0.3052 0.3066 0.3073 0.3078 0.3084 0.3095
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,701 † £17,986 † £17,930 † £18,005 † £18,312 † £18,507 † £18,668 †
Decile 2: mean household_net_income per household £28,345 † £29,006 † £28,643 † £28,959 † £29,297 † £29,657 † £30,263 †
Decile 3: mean household_net_income per household £34,596 † £35,840 † £36,513 † £36,996 † £37,341 † £37,900 † £38,584 †
Decile 4: mean household_net_income per household £39,340 † £40,981 † £41,772 † £42,654 † £43,151 † £43,942 † £45,040 †
Decile 5: mean household_net_income per household £44,538 † £46,014 † £47,056 † £47,505 † £48,327 † £49,276 † £49,912 †
Decile 6: mean household_net_income per household £48,356 † £49,455 † £50,381 † £51,232 † £52,353 † £53,139 † £54,570 †
Decile 7: mean household_net_income per household £56,412 † £57,566 † £58,471 † £59,421 † £60,040 † £61,445 † £63,065 †
Decile 8: mean household_net_income per household £69,290 † £70,482 † £71,698 † £73,022 † £74,399 † £75,886 † £77,626 †
Decile 9: mean household_net_income per household £79,704 † £82,058 † £83,302 † £84,451 † £86,171 † £87,635 † £90,695 †
Decile 10: mean household_net_income per household £117,817 † £120,575 † £122,531 † £124,675 † £126,863 † £129,212 † £132,025 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.22bn £6.50bn £6.71bn £6.90bn £7.11bn £7.35bn £7.62bn
Raise higher rate by 1pp £3.54bn £3.82bn £4.05bn £4.27bn £4.49bn £4.76bn £4.96bn
Raise personal allowance by ~800GBP/year £-3.84bn £-3.98bn £-4.06bn £-4.11bn £-4.20bn £-4.32bn £-2.04bn
Raise child benefit by 25GBP/week per additional child £-2.00bn £-1.76bn £-1.64bn £-1.54bn £-1.44bn £-1.34bn £-1.24bn
Reduce Universal Credit taper rate to 20% £-20.54bn £-21.10bn £-21.45bn £-21.88bn £-21.96bn £-22.33bn £-22.81bn
Raise Class 1 main employee NICs rate to 10% £11.06bn £11.51bn £11.83bn £12.14bn £12.47bn £12.81bn £13.29bn
Raise VAT standard rate by 2pp £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10% £-3.04bn £-3.17bn £-3.25bn £-3.32bn £-3.37bn £-3.43bn £-3.47bn
Raise the State Pension by 10% £-8.93bn £-9.14bn £-9.06bn £-9.12bn £-9.31bn £-9.55bn £-9.82bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.36bn £6.65bn £6.87bn £7.07bn £7.29bn £7.53bn £7.81bn
Raise higher rate by 1pp: change in income_tax £3.55bn £3.83bn £4.06bn £4.28bn £4.50bn £4.78bn £4.97bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.97bn £-4.12bn £-4.22bn £-4.27bn £-4.36bn £-4.48bn £-1.79bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.34bn £2.15bn £2.03bn £1.92bn £1.82bn £1.71bn £1.59bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.53bn £21.09bn £21.44bn £21.87bn £21.95bn £22.32bn £22.80bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.33bn £11.79bn £12.13bn £12.44bn £12.78bn £13.13bn £13.62bn
Raise VAT standard rate by 2pp: change in vat £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.04bn £3.17bn £3.25bn £3.32bn £3.38bn £3.43bn £3.48bn
Raise the State Pension by 10%: change in state_pension £12.25bn £12.71bn £12.83bn £13.02bn £13.41bn £13.80bn £14.21bn

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator Author

@juaristi22 here are readable copies of the two sources you could not download. The live sites block scripted requests, so these are Wayback Machine captures. GitHub does not let me attach files from the command line, so the archive links and quoted values below stand in for attachments.

Ofwat, 27% for 2025-26

Ofwat, "Ofwat responds to water sector average bill figures", 29 January 2026:

This is significantly smaller than the 27% increase seen in 2025-26, reflecting the front-loaded nature of the PR24 settlement.

The sentence before it gives the 2026-27 figure the PR uses: "an increase of 5.4% or £33". Both match ofwat.water_bills in the PR (0.27 at 2025-01-01, 0.054 at 2026-01-01).

The earlier statement does not contain 27%. It has the 26% forecast that the PR replaces ("the average increase forecasted for 2025/26 will be 26% or £123", Ofwat, 30 January 2025):

OBR long-term economic determinants, March 2025 EFO (19 June 2025)

The archived workbook is dated 19 June 2025 in cell B2 (SHA-256 3c37a645a910758f77771b5ddcd29aa9827f1997d39c87ad2b7b6e5df8e227aa). Every Wayback capture of the file, from 19 June to 14 July 2025, has the same content digest as the copy I read. The population growth row is row 10, "Population growth", in per cent. Footnote 2 says readings are at the start of the fiscal year (Q2) or mid-year, and that from 2030-31 the row follows the migration category variant of the ONS 2022-based projections.

The PR stores each fiscal year at 1 January of its first year (2025-26 at 2025-01-01), as a fraction rounded to four decimals. All 52 years from 2022-23 to 2073-74 match. There are no mismatches. The 2021 value (0.004) is not in the workbook, as the YAML comment already says.

Fiscal year OBR workbook OBR as fraction, 4 dp PR ons.population Result
2022-23 0.9256% 0.0093 0.0093 Match
2023-24 1.3135% 0.0131 0.0131 Match
2024-25 1.0717% 0.0107 0.0107 Match
2025-26 0.7230% 0.0072 0.0072 Match
2026-27 0.3822% 0.0038 0.0038 Match
2027-28 0.3667% 0.0037 0.0037 Match
2028-29 0.4002% 0.0040 0.0040 Match
2029-30 0.4397% 0.0044 0.0044 Match
2030-31 0.4455% 0.0045 0.0045 Match
Remaining years, 2031-32 to 2073-74 (all match)
Fiscal year OBR workbook OBR as fraction, 4 dp PR ons.population Result
2031-32 0.4324% 0.0043 0.0043 Match
2032-33 0.4194% 0.0042 0.0042 Match
2033-34 0.4070% 0.0041 0.0041 Match
2034-35 0.3958% 0.0040 0.0040 Match
2035-36 0.3853% 0.0039 0.0039 Match
2036-37 0.3757% 0.0038 0.0038 Match
2037-38 0.3671% 0.0037 0.0037 Match
2038-39 0.3596% 0.0036 0.0036 Match
2039-40 0.3529% 0.0035 0.0035 Match
2040-41 0.3468% 0.0035 0.0035 Match
2041-42 0.3410% 0.0034 0.0034 Match
2042-43 0.3355% 0.0034 0.0034 Match
2043-44 0.3297% 0.0033 0.0033 Match
2044-45 0.3232% 0.0032 0.0032 Match
2045-46 0.3161% 0.0032 0.0032 Match
2046-47 0.3085% 0.0031 0.0031 Match
2047-48 0.3004% 0.0030 0.0030 Match
2048-49 0.2903% 0.0029 0.0029 Match
2049-50 0.2781% 0.0028 0.0028 Match
2050-51 0.2651% 0.0027 0.0027 Match
2051-52 0.2515% 0.0025 0.0025 Match
2052-53 0.2379% 0.0024 0.0024 Match
2053-54 0.2243% 0.0022 0.0022 Match
2054-55 0.2110% 0.0021 0.0021 Match
2055-56 0.1987% 0.0020 0.0020 Match
2056-57 0.1879% 0.0019 0.0019 Match
2057-58 0.1787% 0.0018 0.0018 Match
2058-59 0.1709% 0.0017 0.0017 Match
2059-60 0.1646% 0.0016 0.0016 Match
2060-61 0.1599% 0.0016 0.0016 Match
2061-62 0.1566% 0.0016 0.0016 Match
2062-63 0.1547% 0.0015 0.0015 Match
2063-64 0.1535% 0.0015 0.0015 Match
2064-65 0.1530% 0.0015 0.0015 Match
2065-66 0.1531% 0.0015 0.0015 Match
2066-67 0.1536% 0.0015 0.0015 Match
2067-68 0.1540% 0.0015 0.0015 Match
2068-69 0.1541% 0.0015 0.0015 Match
2069-70 0.1536% 0.0015 0.0015 Match
2070-71 0.1523% 0.0015 0.0015 Match
2071-72 0.1500% 0.0015 0.0015 Match
2072-73 0.1466% 0.0015 0.0015 Match
2073-74 0.1420% 0.0014 0.0014 Match

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

Re-reviewed 270be00ac8da8235a9ab806345f12ae6251fb238.

The two source gaps are closed. I independently downloaded the archived official OBR workbook, verified the stated SHA-256, and checked the native headers, units and footnote: 52/52 population-growth values for 2022–2073 match the stored fiscal-year mapping after conversion and rounding. The workbook establishes the dated ONS-variant provenance.

The archived Ofwat article is readable original article content and corroborates 27% for 2025–26 and 5.4%/£33 for 2026–27. The independently downloaded March 2026 economy workbook also supports the documented earnings/vintage sensitivity checks.

25 focused code/diagnostic checks pass, covering the guard, mappings, projection and final AHC cost effect. Current-head hosted CI passes. The inherited custom 2027–29 water forecast/weight limitation and population-vintage refresh remain explicitly disclosed follow-ups (#2384/#2383); they are not presented as newly verified forecasts or private population validation.

I am approving this commit. Review status: COMPLETE; no open critical findings.

@juaristi22
juaristi22 added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit 78f480f Oct 20, 2026
16 checks passed
@juaristi22
juaristi22 deleted the uprate-four-remaining-columns branch October 20, 2026 22:12
MaxGhenis added a commit that referenced this pull request Oct 21, 2026
…benefits

No conflicts: none of the ten files main changed since 76cfc9e is
changed by this PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 21, 2026
…arge

adjusted_total_income: main's #2488 relief limit (relevant earnings, raised
towards the basic amount only by relief-at-source contributions) with this
branch's Step 1 from total_income_charged_to_tax and its net pay add-back.
Documentation keeps both. The net pay property test's reference takes
#2488's limit for invariant 3.

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

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

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

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

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