Skip to content

Certify the Microcosm UK national from microcosm#1428 on policyengine-uk 2.165.1 (f6e33b93; local area 6528c865 or c9df4b86) - #731

Open
juaristi22 wants to merge 8 commits into
mainfrom
uk-certify-microcosm-national-1428
Open

juaristi22 wants to merge 8 commits into
mainfrom
uk-certify-microcosm-national-1428

Conversation

@juaristi22

@juaristi22 juaristi22 commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

@MaxGhenis, for the UK hub: this certifies the national from PolicyEngine/microcosm#1428 on policyengine-uk 2.165.1 and supersedes #728. Re-pinned on 2 Nov from 0a4c8e2c (2.164.2) to f6e33b93 (2.165.1): see the national below. Local area changed on 3 Nov from (a) 6528c865 to dbacb023, a local cut built from the national's own commit and spine, so both certify on their own build: see the local area below.

The national

microcosm-uk-2024-25-national-20261102T103421Z-f6e33b93 (microcosm_uk_2024_25):

  • Build: microcosm 329a99e71 with policyengine-uk 2.165.1, so it certifies on its own build (built_with_model_package). The core stays 3.33.3, with core_binding: bundle_pin as on main.

  • Source: the head of SPI donor savings rebased to SPI's 2023-24 bands (savings follow-up to #1418) microcosm#1428 when it was built, still a draft:

    Vahid's later fixes to #1428 (2dbf7cf56, how SPI donors are banded) aren't in this cut; the next national picks them up.

  • H5 sha256: a59456800f3dcc9b6b1c8c6e0271c3d1a0a599b929e0a6dd3fcd5112830af194.

  • Certification: in Microcosm it passed all 55 spine gates, 7 calibration-seam gates and 19 release-cut gates, and no target row ends outside its tolerance.

  • Publication: uploaded to the inspect lane (--no-latest, tag only) on 2 Nov at 12:46 UTC; not promoted.

  • Previous cut: 0a4c8e2c (microcosm a8e25870c, 2.164.2) carried findings 1 and 2 of #1428's independent review, so it's replaced.

The local area

microcosm-uk-2024-25-dense-20261103T092045Z-dbacb023 (microcosm_uk_2024_25_dense), which constituency and local-authority regions route to (regional_release_kind: local_area).

  • Build: SPI donor savings rebased to SPI's 2023-24 bands (savings follow-up to #1418) microcosm#1428 at 329a99e71, the national's commit and spine, with the gate-only sign-off Sign off the #1428 local cut's target-fit rows (dbacb023), and the company car base microcosm#1491 (1affbc127) on top, on policyengine-uk 2.165.1. The doctrine is the last local cuts': K=15, 150,000 households, seed 42.

  • Certified on its own build, like the national, with no accepted model mismatch and no input-surface audit. Area runs read every input the engine takes, company cars and ISA payments included, and carry the UK: data fixes for the Budget 2026 household measures microcosm#1418 and SPI donor savings rebased to SPI's 2023-24 bands (savings follow-up to #1418) microcosm#1428 fixes.

  • Gates:

  • Published on 3 Nov to the inspect lane, tag only.

  • Trade-off against 6528c865. Overall fit is the same: 98.7% of targets within 10%, against 98.9%. But the local solve fits the SPI's HMRC income-band families less tightly. Median errors, with 6528c865 in brackets:

    • dividend income by band, 8.8% (5.4%);
    • property income counts by band, 5.3% (2.2%);
    • private pension income by band, 3.2% (1.8%).

    The national file fits these families to about 0.1% on both pairs, so national figures don't move; area runs inherit the misses. The cause is how little the local solve's loss weighs these families. Property income counts by band take 0.04% of the loss on both cuts, and dividends by band 0.06% (0.08% before). This build's new constraints pull on the same households: about 2,000 pension-income cells by constituency, and new SPI families. At those weights the solve lets the band rows slip.

    • On the map: unscaled, the local file's national total for the property rates rise is +£0.441bn in 2029-30, against the national file's +£0.413bn, 7% above. 6528c865 was 4% above.
    • The fix: a floor share for these families in the local weighting. Setting it takes several local builds, so it isn't scheduled.
  • It replaces (a) microcosm-uk-2024-25-dense-20261027T154955Z-6528c865, Max's choice of 2 Nov. That cut was built from b71ce793 (labelled 2.162.12) and routed on an accepted mismatch, with fourteen inputs defaulted.

Before the dashboard moves to this bundle

  • How every published figure moves, and what the dashboard has to change first: the comparison, on 2.165.1.
  • The Pension Tax Allowance modifier has to wrap income_tax_before_winter_fuel_payment_charge: policyengine-uk 2.162.14 and later build income_tax as a sum, which the dashboard's template refuses.
  • Distributional results. policyengine-uk 2.165.1 includes Count other investment income in market and HBAI income policyengine-uk#2736, so market and HBAI income now count other_investment_income, which 2.164.2 left out.

Budget measures on this national

Rescored on f6e33b93 (2 Nov). Scored with #728's method: the PolicyEngine/uk-autumn-budget-dashboard-2026 measures (57095fd) and their October 2026 forecast. Each figure is the weighted change in gov_balance, in £bn. They were scored on policyengine-uk 2.162.14, as #728's table was; the bundle pins 2.165.1, and the rescore there, against every published figure, is in the comparison. On 2.162.14 the company car benefits that f6e33b93 carves out of the SPI rows' pay go untaxed, which these measures feel only through marginal rates.

Columns:

Measure Year This cut 0a4c8e2c #728 (4374e0bf) Published OBR line Table 6.1
Household Energy Payment 2026-27 −1.967 −1.969 −1.969 −1.969 — −2.625
Zero VAT on domestic electricity 2026-27 −0.788 −0.788 −0.841 −0.840 — −0.755
2027-28 −0.331 −0.332 −0.353 −0.353 — −0.305
Fuel duty rises deferred 2026-27 −0.290 −0.290 −0.290 −0.301 — −0.575
2027-28 −0.501 −0.501 −0.501 −0.521 — −0.780
State Pension income tax protection 2027-28 to 2029-30 not scored (1) not scored (1) not scored (1) −0.030 / −0.083 / −0.144 — −0.045 / −0.090 / −0.150
Trading allowance raised to £3,000 2028-29 −0.151 −0.148 −0.112 −0.118 −0.221 −0.225
2029-30 −0.153 −0.149 −0.116 −0.119 −0.165 −0.165
2030-31 −0.152 −0.148 −0.116 −0.120 −0.171 −0.175
2031-32 −0.151 −0.147 −0.119 −0.130 −0.178 −0.180
Property income rates +2pp 2029-30 +0.416 +0.402 +0.416 +0.429 +0.394 +0.435
2030-31 +0.431 +0.417 +0.432 +0.446 +0.403 +0.445
2031-32 +0.443 +0.429 +0.445 +0.459 +0.412 +0.455
Savings income rates +2pp 2029-30 +0.588 +0.582 +0.603 held back +0.443 +0.520
2030-31 +0.616 +0.611 +0.636 held back +0.475 +0.555
2031-32 +0.641 +0.636 +0.666 held back +0.510 +0.590
Carer's Allowance earnings taper 2030-31 −0.034 −0.037 −0.017 −0.024 — −0.040
2031-32 −0.069 −0.073 −0.032 −0.048 — −0.080

(1) The dashboard's State Pension template wraps income_tax, which on policyengine-uk 2.162.x adds the Winter Fuel Payment charge, so the template refuses. The port is the dashboard's to do; the data play no part (#728, note 1).

What moved against #728's national:

Savings against the OBR's income tax line

Edited after Max's review, which compares the savings rates with the OBR's income tax line rather than the Table 6.1 total. That total adds £78m of onshore corporation tax in 2029-30, which the model doesn't cover. The earlier reading here is withdrawn: a difference of base level, with ISA shifting small.

  • The gap is 33%, 30% and 26% above the income tax line in 2029-30 to 2031-32. That compares this cut's static figure with a line after behaviour.
  • What sets this cut's figure.
    • The national pins the 2025 tax on savings to HMRC's Income Tax Liabilities Table 2.6 projection, by rate: 1.00, 0.99 and 1.00.
    • On that base, +2 points gives £0.59bn in 2029-30.
    • No data change moves it without departing from HMRC's projected tax. SPI donor savings rebased to SPI's 2023-24 bands (savings follow-up to #1418) microcosm#1428 tried binding those rows at £7.51bn, the 2023-24 outturn grown on the OBR's savings path. The calibration couldn't meet them beside SPI Table 3.7's savings income, and the change was reverted.
  • What the OBR's figures imply.
    • EFO paragraph 3.17 gives the measure about £0.6bn a year after behaviour and puts the savers' response at around £0.2bn a year, mainly extra use of ISAs.
    • That puts the static yield at roughly £0.75bn across all taxes.
    • This cut's static income tax averages about £0.62bn over 2029-30 to 2031-32: below that, not above it.
  • Not verified:
    • the size of the response;
    • its split between income tax and corporation tax;
    • whether the costing's base grows like HMRC's projection or in proportion to income, which would make it up to 13% lower.
  • The OBR estimates that savers cut the yield by around £0.2bn a year across taxes. It publishes no split by tax or year, so we can't yet say how much of the gap that response explains.
  • Behaviour belongs in the microsimulation, not the dataset. A savings response would be an opt-in policyengine-uk behaviour. The national already carries what it would read: ISA subscriptions, and so unused allowance, and taxable interest.
  • Dashboard: it shows static figures, and savings stays held back there until the comparison is settled.
  • Payment timing: the costing's +£125m and +£555m in 2027-28 and 2028-29 carry the Self Assessment catch-up.

Impact

  • The UK model pin moves from 2.151.0 to 2.165.1. The data moves from the 2.151.0 pair (a6299504 and c9df4b86) to f6e33b93 and dbacb023. UK results change with both.

Commits

  • 59662673: the national and the local area, certified by one certify-data run. It also has the lock, the release lock, the TROs, the certified test constants and the changelog fragment.
  • 6b2d0b9f: the household calculator snapshots, regenerated on 2.164.2 (PE_UPDATE_SNAPSHOTS=1). The UK households and the model surface move with the model; the US snapshots don't change.
  • 50c997be: the policyengine-uk pin moves to 2.165.1.
  • b150082e: the re-pin to f6e33b93, with the local area re-audited for 2.165.1, the lock, the release lock, the TROs, the snapshots and the changelog fragment (which replaces 0a4c8e2c's).
  • 19a2f004: the certified test constants, rewritten by uk_qualification.rewrite_certified_constants.
  • 5f6a914d: main merged in (6.12.0); 2882bb2c: the test jobs get 150 minutes, since the UK tests on 2.165.1 ran past 90.
  • 7bcb276d: the local area moves to dbacb023. It has certify-data on both cuts' own build, the release lock, the TROs, the changelog fragment and the certified local-area test constants. The lock and the household snapshots don't change.

How it was made

uv sync --frozen --extra uk --extra dev --python 3.13
uv pip install policyengine-uk==2.165.1
python scripts/bundle.py certify-data --country uk --data-producer populace \
  --manifest-uri "hf://dataset/policyengine/populace-uk-private@microcosm-uk-2024-25-national-20261102T103421Z-f6e33b93/releases/microcosm-uk-2024-25-national/release_manifest.json" \
  --regional-manifest-uri "hf://dataset/policyengine/populace-uk-private@microcosm-uk-2024-25-dense-20261103T092045Z-dbacb023/releases/microcosm-uk-2024-25-dense/release_manifest.json" \
  --model-version 2.165.1
uvx --from uv==0.13.4 uv lock --no-config --no-sources --default-index https://pypi.org/simple --python 3.13
uv sync --frozen --extra uk --extra dev --python 3.13
python scripts/release_lock.py
python scripts/bundle.py generate --include-tros
PE_UPDATE_SNAPSHOTS=1 python -m pytest tests/test_household_calculator_snapshot.py -q
python scripts/bundle.py check
python scripts/bundle.py check --include-tros --strict-tros
python scripts/check_uk_uc_floor.py --dataset microcosm_uk_2024_25 --year 2025 --output uc_floor.json

uk_qualification.rewrite_certified_constants rewrote the certified constants in tests/test_models.py, tests/test_release_manifests.py and tests/test_uk_regions.py; the local-area constants moved to dbacb023 by hand in 7bcb276d.

Evidence run on this head

  • The UC floor passed on f6e33b93 (check_uk_uc_floor.py, Great Britain, 2025, within 10%, policyengine-uk 2.165.1). The receipt holds weighted national totals only:
    • benefit units at 0.923 of DWP's figure;
    • spend at 0.950 of the OBR's.
  • Both bundle.py check runs pass, the second with --include-tros --strict-tros.
  • Locally, 1,333 tests pass on the release manifests, UK regions, models, household snapshots, UC floor, bundle, TRO, certification, qualification, regional-evidence, pin and release-lock paths. After 7bcb276d, 1,281 pass on the release manifests, UK regions, receipts, regional evidence, certification and qualification paths. The full suite runs in CI.

Disclosure

Aggregates only: weighted national totals over many records, and published HMRC, ONS, DWP, OBR and Treasury figures.

🤖 Generated with Claude Code

juaristi22 and others added 2 commits November 1, 2026 11:18
…e2c national, 6528c865 local area)

One certify-data run: the national microcosm-uk-2024-25-national-20261031T181401Z-0a4c8e2c
certifies on its own build (policyengine-uk 2.164.2); the local-area cut
microcosm-uk-2024-25-dense-20261027T154955Z-6528c865 routes on the accepted
model mismatch, with its input surface re-audited for 2.164.2 (no dropped
column; five inputs added after 2.162.12 take their defaults). Also the
relock, the release lock, the TROs, the certified test constants and the
changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PE_UPDATE_SNAPSHOTS=1. The UK households and the model surface move with
the model; the US snapshots are unchanged.

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

juaristi22 commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor Author

Property income rates +2pp: what moved, and how it compares with the OBR's income tax line

Edited 1 Nov after Max's review: compared with the OBR's income tax line rather than the Table 6.1 total, and the partnership rescale is withdrawn.

The table splits the measure's 2029-30 yield into its two parts:

  • The rate part: 2 points more tax on property profit outside Scotland.
  • The relief part: 2 points more finance-cost relief. Relief follows the property basic rate UK-wide, so it covers Scottish landlords too.

Measures and setup are as in the body's table: the dashboard's measure, policyengine-uk 2.162.14, change in income tax in £bn.

National Yield Rate part Relief part Landlords' finance costs, 2024-25
Published (a6299504) +0.429 +0.659 −0.231 £9.65bn
#728 (4374e0bf) +0.416 +0.653 −0.237 £10.07bn
This cut (0a4c8e2c) +0.402 +0.653 −0.251 £10.59bn
Official +0.435

What moved: the relief part.

Against the OBR's income tax line.

  • The OBR's income tax line for the measure is +£394m, +£403m and +£412m in 2029-30 to 2031-32. The Table 6.1 total (+£435m in 2029-30) adds onshore corporation tax and two Scottish lines, which the model doesn't cover.
  • This cut is 2–4% above the income tax line, so there's no shortfall to explain. EFO paragraph 3.17 puts landlords' response (incorporation and non-compliance) at about £0.1bn a year.
  • Withdrawn: "the model reproduces the costing once partnerships are in". The rescale to PRIS's base for individuals and partnerships lands about 10% above the income tax line and quantifies no omission.

Partnership property income: a lead, not a quantified gap.

  • The costing's base (policy costings, p.74) "consists of all individuals and partnerships that receive property income".
  • HMRC's documentation doesn't say whether SPI's property income includes partners' shares. The totals bound it:
    • The SPI public use tape documentation defines it as net income from UK and overseas property. PRIS's individuals report UK property only.
    • This cut carries £32.8bn of property profit before finance costs and 2.82m landlords. PRIS 2024-25 gives individuals about £30.9bn and 2.85m landlords; partnerships add about £6.2bn of profit and £1.7bn of finance costs.
    • So this cut is £1.9bn above PRIS's individuals and £4.3bn below individuals and partnerships. At most £1.9bn of the partnerships' £6.2bn could be in it, and less to the extent overseas property fills that excess.
    • Partners are taxed on their shares as property income: the SA800 partnership statement allocates UK property income to each partner. So the engine would tax them if the data carried them.
  • PRIS doesn't split finance costs by entity, so any individuals' share of them is pro rata.

Bringing it in.

  • The only published source is PRIS by tax entity: Tables 1, 2 and 6 give partnerships' landlord count, receipts and expenses for 2020-21 to 2024-25. It is already in the pinned Chronicle feed.
  • No public microdata names partners. The SPI tape has one property variable, so carrying partnership property income in the national means assigning it to landlords by an imputation, controlled to the PRIS totals.
  • Finance costs together with it. Nothing binds landlords' finance costs today, and they moved the yield between builds. Binding them belongs in the same change.
  • That is a candidate follow-up for PolicyEngine/microcosm.

🤖 Generated with Claude Code

@MaxGhenis MaxGhenis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks María. You've added gross receipts to the national data, and we now estimate a £148m trading allowance cost in 2028-29.

Could we compare the savings and property estimates with the OBR's income tax lines before publishing them? Since 28 October, we've compared each estimate with the OBR line that covers what we model. We keep Table 6.1 totals as context, as we do in Tables 6 and 7 of the briefing. You use Table 6.1 totals in the Official column.

Measure Year This cut OBR line This cut against that line Table 6.1 total
Savings income rates 2029-30 +582 +443 exceeds by 31% +520
2030-31 +611 +475 exceeds by 29% +555
2031-32 +636 +510 exceeds by 25% +590
Property income rates 2029-30 +402 +394 exceeds by 2% +435
2030-31 +417 +403 exceeds by 3% +445
2031-32 +429 +412 exceeds by 4% +455
Trading allowance 2028-29 −148 −221 trails by 33% −225
2029-30 −149 −165 trails by 10% −165
2030-31 −148 −171 trails by 14% −175
2031-32 −147 −178 trails by 17% −180

Figures in £ million. We compare savings and property with income tax (measures 62 and 61), and the trading allowance with income tax plus NICs (measure 15).

For savings in 2029-30, the OBR reports £443m of income tax and £78m of onshore corporation tax, £521m in all, and the Treasury rounds that to £520m. You report a scaled £521m, which matches that total and exceeds the income tax line by £78m, or 18%.

In EFO paragraph 3.17, the OBR estimates that savers reduce the yield by around £0.2bn a year, mainly by using tax-advantaged assets such as ISAs. Could you drop "leaves little room for the costing's ISA shifting" and "ISA shifting then looks small"? If we add all £0.2bn to 2029-30 income tax, our £582m would trail the roughly £640m static estimate by about 10%. But the OBR gives no split of the reduction by tax or year, so we can't derive a static income tax line.

We need a verified reason for the 2029-30 and 2030-31 savings gaps before publishing, since both exceed our 25% bar. Our 2031-32 estimate exceeds the income tax line by 24.7%. Could you revise "Why savings sits above the costing" and #1428's savings lines against the income tax lines?

For property in 2029-30, the OBR reports £394m of income tax and £39m across onshore corporation tax and two Scottish lines. The Treasury rounds the £433m total to £435m. You report a rescaled £434m, which exceeds the income tax line by 10%; our published £429m exceeds it by 9%. The OBR estimates that landlords reduce the yield by £0.1bn a year through incorporation and non-compliance. We can use your PRIS bounds to investigate missing partnership income, but we can't quantify any omission from the rescale.

@juaristi22

Copy link
Copy Markdown
Contributor Author

Thanks @MaxGhenis, agreed on all four points. The model covers income tax, and income tax plus NICs for the trading allowance, so those are the right lines to compare with.

Could you verify the savings reading? I'd like your check on whether the savers' response really drives most of the gap, before we rely on it. The evidence is below. What I can't verify is how the OBR's response splits by tax.

Savings. Against the income tax line we sit 31%, 29% and 25% above. That compares our static figure with a line after behaviour.

  • What sets our figure.
  • What the OBR's own figures imply.
    • EFO paragraph 3.17 gives the measure about £0.6bn a year after behaviour and puts the savers' response at around £0.2bn a year, mainly ISAs.
    • That puts the static yield at roughly £0.75bn across all taxes.
    • Our static income tax averages about £0.61bn over 2029-30 to 2031-32: below that, not above it.
  • What isn't verified:
    • the size of the response;
    • its split between income tax and the £78m of corporation tax;
    • whether the costing's base grows like HMRC's projection or in proportion to income, which would make it up to 13% lower.
  • So the gap reads as at least half behaviour, probably most of it. That reading is what I'm asking you to verify: from the OBR's static costing by tax if you can get it, or from your own reading of the costing.
  • Withdrawn: both ISA phrases and my base-level explanation. My scaled £521m had matched the Table 6.1 total, which includes the corporation tax we don't model.
  • Behaviour belongs in the microsimulation, not the dataset, and the dashboard shows static figures. If the reading holds, should the bar compare our static figure with the OBR's implied static range? Until then savings stays held back from the dashboard.

Property.

Trading allowance.

Revised:

🤖 Generated with Claude Code

@MaxGhenis MaxGhenis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks María. The OBR and the government publish no static costing by tax in the policy table, the EFO or the costing note, so we can't settle "at least half" from published figures. The OBR estimates that savers cut the yield by around £0.2bn a year across taxes, while we hold savers' choices fixed.

The government leaves ISA returns out of the costing's tax base (costing, p.75), so savers moving into ISAs cut the income tax line. The OBR also scores keeping the cash ISA limit at £20,000 on income tax alone, about −£35m in 2029-30 (policy table, measure 11), and the government gives that measure "no static impact" (costing, p.19). Neither of them sizes the income tax loss from ISA shifting under the savings rise, or splits its effects across taxes. Neither the OBR nor the government explains the £78m of corporation tax, which starts at +£13m in 2026-27, before the rates rise.

Your £0.75bn includes that corporation tax, so we can compare our estimates with the OBR's income tax line plus an assumed response on income tax:

Assumed response on income tax, each year Implied static income tax, 2029-30 to 2031-32 Our estimates
£75m £518m, £550m, £585m exceed it by 12%, 11% and 9%
£150m £593m, £625m, £660m trail it by 2%, 2% and 4%
£200m £643m, £675m, £710m trail it by 9%, 9% and 10%
£250m £693m, £725m, £760m trail it by 16%, 16% and 16%

About £70m a year on income tax would cover half of the gap, and about £140m all of it. At least £23m a year would bring our excess under 25% in all three years. Your review of PolicyEngine/microcosm#1428 also finds that our model includes annuity and trust income in the savings measure's base (finding 1). Our estimates and these amounts can move with the rebuild.

The government grows the 2023-24 SPI base "using the OBR's forecast for growth in savings income" (costing, p.75), but it doesn't say whether that growth applies before the frozen allowances. If the static income tax line trailed ours by 13%, the income tax response would come to about £63m, £57m and £43m, under a third of the OBR's £0.2bn. Neither the OBR nor the government publishes enough detail to rule out those amounts.

The OBR counts Self Assessment receipts in its line, and we count liabilities. Taxpayers who make payments on account normally base them on an earlier bill and settle the balance later, so growing savings liabilities can widen the gap from 2029-30 too.

Could you replace "So the gap reads as at least half behaviour, and probably most of it" in the PR with "The OBR estimates that savers cut the yield by around £0.2bn a year across taxes. It publishes no split by tax or year, so we can't yet say how much of the gap that response explains"? Could you also drop "matters only before 2029-30"?

For the trading allowance, could you replace the sentence beginning "The rest is" with "The government includes traders switching to the allowance in its costing but doesn't quantify that response. This scoring engine also doesn't relieve miscellaneous income (PolicyEngine/policyengine-uk#2726)"?

I'll come back on the bar and on whether we can get the split from the OBR, and we'll keep savings off the dashboard until then.

@vahid-ahmadi

Copy link
Copy Markdown
Contributor

Review of 6b2d0b9

Max's three requested edits are all in the body: his savings sentence replaces "at least half behaviour", "matters only before 2029-30" is gone, and the trading allowance sentence is his. The two ISA phrases from his first review are gone too. I don't repeat his points below, and I leave the (a)/(b) local-area choice to him.

Must

  1. The bundled national carries two findings marked "fix before the national is used". The review of microcosm#1428 at a8e25870c lists findings 1 (annuity and trust income) and 2 (non-claimants' receipts above £3,000) under that heading and says this cut carries both. The follow-up says Certify the Microcosm UK national from microcosm#1428 on policyengine-uk 2.165.1 (f6e33b93; local area 6528c865 or c9df4b86) #731 "still bundles a8e25870c's cut" and that a national from 9f70c71e7 is certified and staged. The body doesn't mention either. Finding 1 is separate from #2736: it moves baseline means-tested benefits and household income, so distributional results on this cut are affected by both. Could the body say which national this PR is meant to carry, and list findings 1 and 2 under "Before the dashboard moves to this bundle" if it stays on 0a4c8e2c?

Should

  1. Which engine for the next national? The pin follows the build engine (built_with_model_package), so 2.164.2 is right for 0a4c8e2c. But microcosm#1422 (merged 1 Nov) moved Microcosm's lock to policyengine-uk 2.165.1, microcosm#1430 (company cars) merged today, and policyengine-uk#2736 landed after 2.164.2. If the staged 9f70c71e7 national, or a later one, is built on 2.165.x, this PR's pin and lock change with it (pyproject.toml:45). One line in the body on which engine the carried national uses would settle it.
  2. Rescore on the pinned engine before the table is relied on. Every column is scored on 2.162.14, so nothing in the table is a number this bundle produces. The rescore concerns the national table only; it doesn't bear on (a) versus (b), which affects area runs.
  3. Savings, £0.75bn. £0.6bn plus £0.2bn is £0.8bn; the £0.75bn looks like Table 6.1's three-year average (£0.555bn) plus £0.2bn. Worth saying which.

Nits

  1. Snapshots: uk_couple_two_kids.json:16-22 gains £870.20 in benefits and net income with HBAI net income unchanged; uk_single_adult_no_income.json:13-15 and uk_single_parent_one_child.json:13-15 gain £150 in HBAI net income with net income unchanged. Naming the policyengine-uk changes behind each would show they're intended.
  2. Property comment: 86% of £12.82bn is £11.0bn, not £11.1bn, unless the share is nearer 87%. The decomposition says every row uses 2.162.14, while the body's Published column is "on a6299504 with 2.151.0"; both show +0.429, so it would help to say which.

Arithmetic checked, no slips: savings 31/29/25% (2031-32 is 24.7%), property 2/3/4%, trading allowance 10-17% from 2029-30 (33% in 2028-29), #728's 30-33% and 31-36% and 6-8%, Carer's Allowance 92.5% and 91.3% of Table 6.1 (#728 about 40%), electricity 4% and 9% (#728 11% and 16%), and the relief decomposition (rate plus relief equals yield within £1m rounding; £14m and £20m of £27m).

CI: Test (3.12) was cancelled at the Test job's 90-minute timeout (.github/workflows/pr_code_changes.yaml:179), at 94% with 4,161 passed and none failed. 3.11, 3.13 and 3.14 passed in 84, 77 and 59 minutes. It needs a rerun of that job for a green check; nothing points to a code failure. 3.11 at 84 minutes is close to the same limit.

Verdict: pins and certified constants are consistent; the open question is item 1, which the body should state before this leaves draft.

What I checked: the body against both of Max's reviews; the diff: H5 sha256 f8543876…c38444c9e in both manifest places; release ids and manifest URIs for national and local area; policyengine-uk 2.164.2 in pyproject.toml, uv.lock and the manifest, with the wheel sha256 matching PyPI; core 3.33.3 with core_binding: bundle_pin; the regional record (reason updated off the 2.162.14 wording, five defaulted inputs, 89 never-modelled columns, no dropped column); the certified test constants (no 2.151.0, a6299504 or c9df4b86 left in tests); the table arithmetic; CI logs.

Not verified: the H5 contents and HF manifests (private data, not downloaded); the scores themselves; the snapshot values; the UC floor receipt. No local build or test run.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Contributor Author

The cash ISA limit and the Machine Games Duty rise on this national (Budget 2026, Table 6.1 rows 11 and 56)

Measured on 0a4c8e2c with policyengine-uk 2.164.2, this PR's pin. Figures are in £ million and static unless stated.

Cash ISA limit kept at £20,000 (row 11)

2027-28 2028-29 2029-30 2030-31 2031-32
This cut, interest at Bank Rate (EFO Table A.3, as the modifier) −36 −146 −324 −578 −861
This cut, interest at the OBR's deposit rate (EFO Table 1.9) −18 −66 −138 −266 −433
OBR income tax line (Table 1.1, measure 11) −4 −20 −35 −52 −72
Table 6.1 −5 −20 −35 −50 −70
  • The data look right. In 2024-25 there are 8.2m cash ISA payers under 65, and 33% of them pay in more than £12,000. That is about £18.5bn a year above £12,000. HMRC's impact note gives 22% for 2022-23, before cash ISA payments more than doubled.
  • The gap is the assumption about where the excess goes.
    • The costing has "no static impact on taxpayer liabilities", so its whole cost is the savers' response.
    • Pre-Budget law kept the £20,000 ISA limit, so the excess could have gone into a stocks-and-shares ISA, tax-free. The OBR's line implies most of it would have. The modifier's rule taxes all of it.
    • Neither HMRC nor the OBR publishes that split, so a population figure on the modifier's rule shouldn't be shown.
  • Not scorable on this cut:
    • the Lifetime ISA withdrawal charge cut (row 39) needs withdrawals, which the data don't carry;
    • the First Time Buyer ISA (row 38) isn't in policyengine-uk.

Machine Games Duty: 20% to 25% on machines with a stake above £1 or a prize above £100 (row 56)

2027-28 2028-29 2029-30 2030-31 2031-32
This cut, higher-stake share 75.7% +118 +119 +119 +119 +119
This cut, all standard-rate machines (bound) +156 +157 +157 +157 +158
OBR betting and gaming line (Table 1.1, measure 56) +144 +162 +158 +156 +156
Costing note, rate rise only (after behaviour, net of corporation tax) +135 +130 +130 +130 +130

Measure 56 also carries the supplier-liability change from 2028-29: +20, +15, +15 and +10 in the costing note. Table 6.1 combines the two in one row: +135, +150, +145, +145, +145.

The higher-stake share.

  • Where 75.7% comes from. It is the Gambling Commission's Category B machine GGY in licensed premises in Great Britain over HMRC's standard-rate base. Every Category B machine passes the new test.
    • The Commission's figure is £2,289.8m in 2024-25 (Industry Statistics, September 2026, sheet 4).
    • HMRC's base is £3,023.7m (UK Betting and Gaming Statistics, Table 2a: £604.7m of liabilities at 20%).
  • It is stable: 75.4% in 2023-24 and 76.4% in 2025-26.
  • It is a floor.
    • Members' clubs' B3A and B4 machines are in HMRC's base but not in the Commission's data. They run under council permits, and no national statistics exist. Northern Ireland is missing too.
    • Pubs have only Category C and D machines, which stay at 20%. So applying the licensed-premises mix to every machine (88.6%) overstates.
  • No official share exists. HMRC's policy paper and the costing note publish no base or share. Backing one out of the OBR's figures under the costing's behaviour gives roughly 75–90%, about 80% in the middle. That is an inference. It uses measure 56 net of the supplier-liability part (Table 1.1) and the duty forecast (Table 4.10).
  • Growth matters more than the share. The OBR's duty forecast grows 10.6% from 2024-25 to 2026-27, while policyengine-uk holds gambling takings flat. With that growth, 75.7% gives about £133m in 2027-28, against the OBR's ~£144m.

Disclosure

Weighted national totals and shares only. Every figure rests on well over 10 source households.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Contributor

Follow-up on 6b2d0b9

The head, title and body are as they were at my review this morning (the body was last edited on 1 Nov at 16:52), so all of its items are still open:

  1. Which national the PR carries, given microcosm#1428's findings 1 and 2 on a8e25870c: still open, and still the one to settle before this leaves draft.
  2. Engine for the next national: open. See new item 7 below, which adds a reason.
  3. Rescore on 2.164.2: open. The table still says "a rescore there can follow".
  4. Savings, £0.75bn against £0.6bn plus £0.2bn: open.
  5. and 6. The snapshot and property nits: open.

On the cash ISA and Machine Games Duty comment (11:03)

The sourced figures check out:

  • Table 6.1 row 11 (−5, −20, −35, −50, −70) and row 56 (+135, +150, +145, +145, +145) match the Budget document.
  • OBR Table 1.1 (policy detailed forecast tables): measure 11 income tax −3.7, −19.8, −34.9, −51.7, −71.9; measure 56 betting +144.2, +162.3, +157.6, +155.9, +156.4. All round to your figures.
  • The costing notes say what you quote: the cash ISA costing has "no static impact on taxpayer liabilities", with the whole cost from savers using cash ISAs up to £20,000; the rate rise is +135 then +130 a year after behaviour and corporation tax; the supplier change is +20, +15, +15, +10 from 2028-29.
  • Arithmetic: £3.11bn × 20% = £0.62bn, 2.9% above HMRC's £604.7m; £604.7m / 20% = £3,024m; £2,289.8m / £3,023.7m = 75.7%; 5% × 75.7% × £3.11bn = £118m; 5% × £3.11bn = £156m.
  • The engine point holds. On policyengine-uk main (2.170.0), cash_isa_subscriptions_above_limit and isa_subscriptions_above_limit are still read only by the ISA variables and their tests, not by any tax variable. Your note that the measure scores £0 on the engine alone, and the choice not to show a population figure on the modifier's rule, both follow from that.

Should

  1. From policyengine-uk 2.167.0, the rate rise would score £0 on a national without the split. Charge higher-stake machines at the Machine Games Duty higher rate from April 2027 policyengine-uk#2731 shipped in 2.167.0. Its machine_games_standard_rate_higher_stake_net_takings defaults to 0, and machine_games_duty charges the higher rate only on that input. Your comment says the split is held in PR C, so this national doesn't store it; on 2.167 or later the engine would score the rate rise at £0 without warning, as the cash ISA measure does today. If the next national is built on 2.167 or later without the split, a line under "Before the dashboard moves to this bundle" would cover it.

Nit

  1. "With that growth, 75.7% gives about £133m in 2027-28": £118m × 1.106 is £130m. £133m fits growth on to 2027-28 instead (for example HMRC's 2024-25 liabilities to the OBR's 2027-28 forecast less measure 56). Saying which path it uses would help.

Verdict: the 11:03 figures are sound and the method is stated honestly. Nothing in it changes the PR; item 1 is still the one to settle before this leaves draft.

CI: Test (3.12) has not been rerun. Run 41301516796 is still on attempt 1, with that job cancelled at the timeout; 3.11, 3.13 and 3.14 passed.

What I checked: the PR body, title, edit history and timeline since my review; the 11:03 comment against Table 6.1 and the policy costing note (both in uk-autumn-budget-dashboard-2026 data_inputs), OBR October 2026 EFO detailed forecast tables 1.1 and 4.10, and EFO paragraph 4.45; policyengine-uk main for the ISA and Machine Games Duty variables and the CHANGELOG entry for #2731; the check runs on the head.

Not verified: the cut's own figures (8.2m payers, 33%, £18.5bn, the £3.11bn base, the ISA scores); the Gambling Commission and HMRC statistics behind 75.7%, 75.4%, 76.4% and 88.6%; HMRC's 22%; SI 2026/1018; the 10.6% growth (Table 4.10 has no 2024-25 column); the Bank Rate and deposit rate paths; the 75–90% back-out.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Contributor Author

Cash ISA limit kept at £20,000 (row 11): what decides the taxed share, and how to treat the excess

cc @vahid-ahmadi. This follows up the measurements above. No official source gives the share of the excess that would have been taxed. The survey evidence and the OBR's own figures narrow it enough to choose a treatment, and the interest rate matters as much as the share.

The evidence

  • The costing of the cut (Budget 2025 policy costings, p. 79).
    • The base was the returns of under-65s "who had planned to subscribe more than £12,000" into cash ISAs, from ISA providers' data matched to the SPI.
    • It allowed only "a number of small behaviours", including switching between savings products.
    • It was bundled with Help to Save.
  • The OBR's November 2025 policy table (Table 2.1, measure 79) splits that bundle. Its income tax line is −6, −9, +3, +14 and +29 (£m, 2026-27 to 2030-31). The early losses are savers filling £20,000 before the cut.
  • The reversal (Budget 2026 policy costings, p. 19).
    • It has "no static impact on taxpayer liabilities", so the whole cost is savers moving cash back into ISAs.
    • The base grows with the OBR's forecast of "returns on savings deposits".
    • The OBR's income tax line is −4, −20, −35, −52 and −72 (2027-28 to 2031-32).
  • HMRC's impact note (September 2026).
    • 22% of cash ISA savers under 65 paid in more than £12,000 in 2022-23.
    • Under the old law, transfers from stocks-and-shares to cash ISAs were to be blocked, and interest on cash held in stocks-and-shares ISAs charged. So holding cash in a stocks-and-shares ISA was not a tax-free route.
  • Paragon Bank's survey of over 1,100 active cash ISA savers under 65, who could pick more than one option:
    • 46% would put the excess in a non-ISA account;
    • 29% in a stocks-and-shares ISA;
    • 16% in Premium Bonds;
    • 15% in pensions;
    • 62% said they would be unlikely to invest instead.

What each treatment gives on this national

Income tax, Budget against pre-Budget law, £m. The engine (policyengine-uk 2.164.2) runs on the households holding an under-65 cash ISA saver above £12,000, which is exact for income tax.

  • Rate: the OBR's deposit rate (EFO Table 1.9) or Bank Rate (Table A.3).
  • Taxed share: applied to each saver's excess.
  • Build-up: each earlier year's excess is held all year, or only this year's excess counts.
Treatment 2027-28 2028-29 2029-30 2030-31 2031-32
All taxed, Bank Rate, build-up (the dashboard modifier's rule) −36 −146 −324 −578 −861
All taxed, deposit rate, build-up −18 −66 −138 −266 −433
46% taxed (survey), Bank Rate, build-up −16 −55 −98 −172 −270
46% taxed (survey), deposit rate, build-up −8 −29 −53 −85 −128
All taxed, deposit rate, this year's excess only −18 −21 −22 −25 −27
46% taxed (survey), deposit rate, this year's excess only −8 −9 −10 −11 −12
OBR income tax line −4 −20 −35 −52 −72

The proposed treatment

  • Rate: the OBR's deposit rate, as the costing grows its base on deposit returns. This alone halves the figure.
  • Build-up: keep it. The OBR's line rises steadily each year, as a build-up does. Counting only this year's excess gives a flat line.
  • Taxed share: a stated parameter, defaulting to the survey's ~45%. That lands at about 1.5 times the OBR's line. Reproducing the OBR's line exactly needs about a third. I'd show the survey-based figure beside the OBR's, with the share's source.
  • The gap left:
    • The data's 2024-25 payments come from a year when cash ISA payments had more than doubled since 2022-23.
    • Repeating them every year probably overstates the excess somewhat. Counting only each year's own excess gives the floor.

Weighted national totals only. Every figure rests on well over 10 source households.

🤖 Generated with Claude Code

@MaxGhenis MaxGhenis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks María and Vahid. Let's keep (a), 6528c865, as the local area. María, we'll pair it with whichever national #731 carries in place of a8e25870c's cut, unless that build brings its own local-area cut. If we move #731's pin to policyengine-uk 2.165.1 with that national, could you rerun (a)'s input-surface audit against that version?

On savings, we'll keep the OBR's income tax line as the comparator and accept savers' response as the reason for our gap. On the national from 9f70c71e7, our estimates exceed that line by £144m, £140m and £130m in 2029-30 to 2031-32. The OBR puts savers' response at around £0.2bn a year, and if at least £27m a year of it falls on income tax, our excess drops under 25% in all three years. I'll check the gaps again on the national #731 carries before we regenerate the dashboard on it. If no year's gap there exceeds £200m, we'll put savings back on the dashboard; if one does, I'll revisit the bar.

Vahid, could you ask the OBR how that response splits between income tax and corporation tax by year, and copy me? Please add the growth-line question you raised on PolicyEngine/microcosm#1428 too. The government grows the 2023-24 SPI base on "the OBR's forecast for growth in savings income" (costing, p.75) but doesn't name the forecast or say whether it grows savings income before taking off the frozen allowances. We won't hold #731 or the dashboard for the reply.

juaristi22 and others added 3 commits November 2, 2026 12:49
…99e71

The national cut f6e33b93 is built and certified on policyengine-uk
2.165.1, so the bundle certifies it on its own build (Vahid's review of
this PR, item 2).

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

The bundle moves from the national cut 0a4c8e2c (a8e25870c, 2.164.2) to
f6e33b93, built from PolicyEngine/microcosm#1428 at 329a99e71: the
independent review's fixes, recalibrated trading allowance claimant
rates, and main with PolicyEngine/microcosm#1422 and
PolicyEngine/microcosm#1430 merged. It is certified on its own build,
policyengine-uk 2.165.1.

The local-area cut stays 6528c865 (Max's call between it and c9df4b86),
re-audited for 2.165.1: no dropped column, and fourteen inputs added
after 2.162.12 take their defaults, now including the nine company car
inputs, so local-area results carry no company cars.

The lock, release lock, TROs and the household calculator snapshots are
regenerated on 2.165.1, and the bundle checks pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
uk_qualification.rewrite_certified_constants, from the bundle's previous
and new UK records: the national build id and the model version in
tests/test_models.py, tests/test_release_manifests.py and
tests/test_uk_regions.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@juaristi22 juaristi22 changed the title Certify the Microcosm UK national from microcosm#1428 on policyengine-uk 2.164.2 (0a4c8e2c; local area 6528c865 or c9df4b86) Certify the Microcosm UK national from microcosm#1428 on policyengine-uk 2.165.1 (f6e33b93; local area 6528c865 or c9df4b86) Nov 2, 2026
@juaristi22

Copy link
Copy Markdown
Contributor Author

Rescored on f6e33b93

The description's table now scores this PR's cut, f6e33b93 (PolicyEngine/microcosm#1428 at 329a99e71, policyengine-uk 2.165.1), beside 0a4c8e2c, the cut it bundled until today. The method and engine are as before: the dashboard's measures (57095fd) on policyengine-uk 2.162.14.

In Microcosm the cut passed all 55 spine gates, 7 calibration-seam gates and 19 release-cut gates. Its comparisons against 4374e0bf and a6299504 ran clean.

What moved against 0a4c8e2c:

  • Trading allowance: within 3%, at −0.151 to −0.153.
    • The claimant rates were recalibrated on the engine for this build, to 0.72 and 0.14.
    • On this cut, 418,000 taxpayers gain in 2028-29, by £369 on average. That is about 2% above HMRC's static total (400,000 at £380).
    • From 2029-30 it trails the OBR's income tax plus NICs line by 7–15%.
  • Property rates: up about 3%, to 6–8% above the OBR's income tax line. Landlords' finance costs, which nothing binds, are lower (£10.19bn for 2024-25, against £10.59bn), and the SPI rows carry more property income.
  • Savings rates: about 1% higher, 26–33% above the income tax line.
    • The 2025 tax on savings sits at 1.00, 0.99 and 1.00 of HMRC's Table 2.6 projection by rate.
    • Max's check on how much of the gap is behaviour still stands.
  • Carer's Allowance taper: −0.034 and −0.069, about 86% of Table 6.1, with about 55,000 gainers in England and Wales.
  • Unchanged: electricity, fuel duty and the Household Energy Payment.

The local area stays 6528c865 on its re-audited mismatch, pending your call, @MaxGhenis. It defaults fourteen inputs, including the nine company car inputs, so area runs carry no company cars.

Not in this cut: Vahid's later fixes to the SPI donors' banding in PolicyEngine/microcosm#1428 (2dbf7cf56). The next national picks them up.

🤖 Generated with Claude Code

juaristi22 and others added 2 commits November 2, 2026 14:35
Main brings #701 (model metadata for the Public API) and the 6.12.0
version bump. The bundle manifest keeps this PR's certified UK release
(f6e33b93 on policyengine-uk 2.165.1, the 6528c865 local area on its
re-audited mismatch) with the version bump's ten fields at 6.12.0, as
the release commit set them; the TROs are regenerated on it. Both
bundle checks pass, the second with --include-tros --strict-tros.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the UK pin on policyengine-uk 2.164.2 and 2.165.1 the Test jobs
took 59 to over 90 minutes per Python version: 3.12 was cancelled at the
90-minute limit on 6b2d0b9, and 3.11 and 3.13 on 19a2f00, with no
test failing. The pull-request and push workflows move together, as
the push one's comment asks, so a release run isn't cancelled before
Versioning either. A hung job still fails well short of the 6-hour
default.

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

juaristi22 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor Author

How the dashboard's numbers move if it pins this bundle

@MaxGhenis, two answers first:

  • (a) stays. This PR pairs f6e33b93 with 6528c865. Its input-surface audit was rerun against 2.165.1 in b150082e. No column is dropped, and 14 inputs take their defaults on area runs: the cash and stocks and shares ISA balances and subscriptions, the nine company car inputs and the Housing Benefit permitted work disregard. So area results carry no company cars and no ISA payments.
  • Savings against your bar. On the bundle's own engine, 2.165.1, the static yield is £141m, £136m and £125m above the OBR's income tax line in 2029-30 to 2031-32. On 2.162.14 the gaps were £145m, £141m and £131m. No year's gap exceeds £200m.

What the comparison is

Pinning this bundle changes three things at once:

  • the national: a6299504 → f6e33b93;
  • the engine: policyengine-uk 2.151.0 → 2.165.1;
  • the local-area file: c9df4b86 → 6528c865.

The columns:

  • Published is what the dashboard shows today, from the artifacts on its main (a6299504 on 2.151.0).
  • Bundle is the dashboard's own code, at the head of Add the Machine Games Duty rise and a cash ISA survey path, both held back from the national results uk-autumn-budget-dashboard-2026#377, run locally on f6e33b93 with 2.165.1. For the budget lines that is its BudgetaryImpactCalculator. For the distribution it is its ReformProcessor and publication tables, held to 10 survey households.
  • The split also runs f6e33b93 on the dashboard's published stack: policyengine 6.11.1 and policyengine-uk 2.151.0.
    • Data is the move from Published to that run. It includes any change to the measure code since publication.
    • Engine is the move from that run to Bundle.
  • Table 6.1 is the Budget's costing, after behaviour, on a cash basis.

Budget lines

£bn, with the exchequer positive. The percentage is the change in size.

Measure Year Published Bundle Change of which data of which engine Table 6.1
Household Energy Payment 2026-27 −1.969 −1.964 +0.004 (0%) −0.007 +0.011 −2.625
Zero VAT on domestic electricity 2026-27 −0.840 −0.787 +0.053 (−6%) +0.048 +0.005 −0.755
2027-28 −0.353 −0.330 +0.023 (−7%) +0.020 +0.003 −0.305
Fuel duty cut extended 2026-27 −0.301 −0.289 +0.012 (−4%) +0.012 +0.001 −0.575
2027-28 −0.521 −0.496 +0.024 (−5%) +0.020 +0.004 −0.780
Bus fares capped at £2 2026-27 −0.064 −0.065 −0.001 (+1%) −0.007 +0.006 −0.050
2027-28 −0.190 −0.191 −0.001 (+1%) −0.020 +0.019 −0.180
Pension Tax Allowance 2027-28 −0.030 −0.032 −0.002 (+8%) −0.003 0 −0.045
2028-29 −0.083 −0.085 −0.002 (+3%) −0.008 +0.006 −0.090
2029-30 −0.144 −0.155 −0.012 (+8%) −0.014 +0.002 −0.150
Trading allowance to £3,000 2027-28 −0.110 −0.150 −0.041 (+37%) −0.038 −0.003 0
2028-29 −0.118 −0.153 −0.035 (+30%) −0.033 −0.002 −0.225
2029-30 −0.119 −0.155 −0.036 (+31%) −0.035 −0.001 −0.165
2030-31 −0.120 −0.154 −0.034 (+28%) −0.033 −0.001 −0.175
2031-32 −0.130 −0.153 −0.023 (+18%) −0.022 −0.001 −0.180
Property income rates +2pp 2027-28 +0.399 +0.385 −0.014 (−4%) −0.012 −0.002 +0.035
2028-29 +0.412 +0.397 −0.015 (−4%) −0.013 −0.003 +0.575
2029-30 +0.429 +0.413 −0.017 (−4%) −0.013 −0.004 +0.435
2030-31 +0.446 +0.427 −0.019 (−4%) −0.014 −0.005 +0.445
2031-32 +0.459 +0.440 −0.020 (−4%) −0.014 −0.006 +0.455
Carer's Allowance earnings taper 2030-31 −0.024 −0.036 −0.012 (+50%) −0.011 −0.001 −0.040
2031-32 −0.048 −0.072 −0.024 (+51%) −0.022 −0.002 −0.080
Savings income rates +2pp 2027-28 held back +0.531 — — +0.101 +0.125
2028-29 held back +0.556 — — +0.102 +0.555
2029-30 held back +0.584 — — +0.103 +0.520
2030-31 held back +0.611 — — +0.105 +0.555
2031-32 held back +0.635 — — +0.105 +0.590
The package (eight measures) 2026-27 −3.174 −3.105 +0.068 (−2%) — — —
2027-28 −0.805 −0.816 −0.011 (+1%) — — —
2028-29 +0.210 +0.158 −0.052 (−25%) — — —
2029-30 +0.166 +0.102 −0.065 (−39%) — — —
2030-31 +0.301 +0.237 −0.064 (−21%) — — —
2031-32 +0.281 +0.214 −0.067 (−24%) — — —

What moves:

  • The trading allowance costs 18–37% more, all from the data.
  • The Carer's Allowance taper costs about 50% more, from the data, mainly Budget 2026 slower data fixes, PR C of #1418: electricity at the ONS level, pension income by area microcosm#1420's balanced draw of claimants. It is about 90% of Table 6.1, against about 60% published.
  • Zero VAT on electricity costs 6–7% less, and the fuel duty cut 4–5% less, almost all from the data.
    • Electricity goes from 11–16% above Table 6.1 to 4–8% above.
    • Fuel stays at 50–64% of Table 6.1, since the model covers households' fuel only.
  • The property rates yield 4% less, mostly from the data; the engine's part is about 1%. From 2029-30 the yield is 95–97% of Table 6.1 and 5–7% above the OBR's income tax line.
  • The Pension Tax Allowance costs 3–8% more, mostly from the data. 2029-30 goes from 4% below Table 6.1 to 3.5% above.
  • The Household Energy Payment and the bus cap move by under 1%. For the bus cap the data adds about 10% and the engine takes about as much back.
  • The package is £68m cheaper in 2026-27 and about £11m dearer in 2027-28.
    • From 2028-29 its net yield is £52m–£67m a year lower (21–39%). That is the trading allowance and property, plus the Pension Tax Allowance to 2029-30 and the Carer's Allowance taper from 2030-31.
    • The package isn't split, but its move is close to the sum of its members'.

Distribution

Each cell reads Published → Bundle. "People whose income changes" is the dashboard's share of people affected.

Measure Year People whose income changes Average change, £ per household Gini change Poverty change (pp)
Household Energy Payment 2026-27 66.6% → 66.5% £67 → £67 −0.00122 → −0.00123 0 → 0
Zero VAT on domestic electricity 2026-27 93.8% → 93.8% £29 → £27 −0.00036 → −0.00034 0 → 0
Fuel duty cut extended 2027-28 73.0% → 72.5% £18 → £17 −0.00019 → −0.00018 0 → 0
Bus fares capped at £2 2027-28 23.4% → 23.9% £6 → £7 −0.00013 → −0.00014 0 → 0
Pension Tax Allowance 2029-30 2.9% → 3.2% £5 → £5 −0.00012 → −0.00014 −0.02 → −0.02
Trading allowance to £3,000 2029-30 0.9% → 1.5% £4 → £5 0 → −0.00003 0 → 0
Property income rates +2pp 2029-30 6.0% → 6.3% −£15 → −£14 −0.00012 → −0.00010 0 → 0
Carer's Allowance earnings taper 2030-31 0.4% → 0.4% — → — −0.00001 → −0.00002 0 → 0
Savings income rates +2pp 2029-30 held back → 9.5% held back → −£20 held back → −0.00041 held back → 0
The package (eight measures) 2026-27 98.6% → 98.5% £109 → £107 −0.00174 → −0.00173 0 → 0
The package (eight measures) 2027-28 96.8% → 96.7% £27 → — −0.00063 → −0.00063 −0.01 → 0
The package (eight measures) 2029-30 9.5% → 10.6% −£6 → −£3 −0.00025 → −0.00027 −0.02 → −0.02
  • The patterns hold. Decile averages move by £7 a household or less, and every measure keeps its shape across deciles.
    • The trading allowance's figures are small (£0–£10 a household), so its deciles reshuffle. More people gain on the bundle: 1.5% against 0.9%.
    • Property's bottom decile goes from −£1 to −£5 a household. Its top decile stays at about −£60.
    • The package keeps its 2029-30 shape, with gains at the bottom and losses at the top. Decile 7 moves from −£3 to +£2.
  • Poverty and inequality barely move. In the years shown, no poverty change moves by more than 0.01 points, and no Gini change by more than 0.00003.
  • Withheld here, as the dashboard would withhold them:
    • the Carer's Allowance taper's deciles, because on the bundle each decile's change rests on fewer than 10 survey households;
    • the package's deciles in 2027-28, which inherit a thin trading allowance decile, and in 2030-31 and 2031-32, which inherit the taper's;
    • the "all" averages in those years, as the dashboard does.
Deciles, £ per household a year
Measure 1 2 3 4 5 6 7 8 9 10 All
Household Energy Payment 2026-27 Published 72 73 72 73 70 69 69 68 62 47 67
Bundle 72 74 72 72 71 71 67 64 63 49 67
Zero VAT on domestic electricity 2026-27 Published 26 26 26 27 28 28 29 30 31 37 29
Bundle 24 25 24 26 26 26 27 28 31 34 27
Fuel duty cut extended 2027-28 Published 12 13 14 15 17 19 19 22 24 23 18
Bundle 11 12 13 15 15 18 19 22 23 22 17
Bus fares capped at £2 2027-28 Published 8 9 8 7 7 5 6 6 6 4 6
Bundle 8 9 7 7 7 6 6 6 6 4 7
Pension Tax Allowance 2029-30 Published 6 8 10 7 6 4 5 1 1 1 5
Bundle 8 7 10 7 7 6 3 2 1 1 5
Trading allowance to £3,000 2029-30 Published 1 4 1 0 1 4 5 10 4 10 4
Bundle 3 1 5 6 3 6 7 3 10 10 5
Property income rates +2pp 2029-30 Published −1 −6 −6 −5 −6 −4 −12 −17 −26 −62 −15
Bundle −5 −4 −4 −4 −6 −6 −8 −16 −27 −60 −14
Carer's Allowance earnings taper 2030-31 not shown: a decile rests on fewer than 10 survey households
Savings income rates +2pp 2029-30 Published held back held back held back held back held back held back held back held back held back held back held back
Bundle −2 −1 −2 −5 −4 −7 −7 −12 −24 −133 −20
The package (eight measures) 2026-27 Published 107 110 109 111 110 110 111 112 108 99 109
Bundle 105 109 107 109 108 109 107 107 109 98 107
The package (eight measures) 2027-28 not shown: a decile rests on fewer than 10 survey households
The package (eight measures) 2029-30 Published 6 6 6 2 1 4 −3 −6 −21 −51 −6
Bundle 6 5 11 9 3 6 2 −11 −16 −49 −3

Measures not on the dashboard yet

£bn 2027-28 2028-29 2029-30 2030-31 2031-32
Savings income rates +2pp (row 62) Bundle +0.531 +0.556 +0.584 +0.611 +0.635
OBR income tax line +0.443 +0.475 +0.510
Table 6.1 +0.125 +0.555 +0.520 +0.555 +0.590
Cash ISA limit kept at £20,000 (row 11) Bundle, survey rule (46% taxed, deposit rate) −0.008 −0.026 −0.050 −0.080 −0.120
Table 6.1 −0.005 −0.020 −0.035 −0.050 −0.070
Machine Games Duty rise (row 56) Bundle, upper bound (standard rate on every machine) +0.156 +0.156 +0.157 +0.157 +0.157
Bundle × 75.7% (Category B share) +0.118 +0.118 +0.119 +0.119 +0.119
Table 6.1 +0.135 +0.150 +0.145 +0.145 +0.145
Company car tax +1pp (row 86) Bundle +0.125 +0.129
Table 6.1 +0.310 +0.345
  • Savings. On the bundle the gaps to the OBR's income tax line are £141m, £136m and £125m in 2029-30 to 2031-32.
  • Cash ISA and Machine Games Duty are Vahid's runs on Add the Machine Games Duty rise and a cash ISA survey path, both held back from the national results uk-autumn-budget-dashboard-2026#377, on this cut and engine, and both stay held back there.
    • The cash ISA costing has no static impact, so the figure rests on the 46% taxed share.
    • 2.165.1 can't single out higher-stake machines, so the duty's engine figure taxes every standard-rate machine. The Category B row scales it down. Row 56's move to machine suppliers (+£10m to +£20m a year from 2028-29) isn't modelled.
  • Company cars aren't a dashboard measure yet.
    • Scored here with every appropriate percentage one point higher from 2030-31, the zero-emission rate and the maximum included (PolicyEngine/microcosm docs/uk-company-cars-316.md).
    • Of the +£125m in 2030-31, income tax is £92m and Class 1A NICs £33m.
    • The OBR's Class 1A line for 2030-31 is £92.4m. So the taxable value the rise adds here is about a third of the OBR's, and the score is 40% of Table 6.1, short for the reason docs/uk-company-cars-316.md expected: the size of the base.

What else moves, not measured here

  • The map. Area runs would read 6528c865 on 2.165.1 in place of c9df4b86 on 2.151.0, so area results move with both the data and the engine. Company cars, the cash ISA limit and the duty's higher-stake split would read £0 by area (the 14 defaulted inputs above).
  • The Household calculator, its example households and the income curves are example households, which the data don't move. They move with the engine only.
  • The living standards outlook isn't rerun here.

What the dashboard has to change to adopt it

  • The Pension Tax Allowance. Its modifier wraps income_tax. policyengine-uk 2.162.14 and 2.165.1 build income_tax as a sum (the liability plus the Winter Fuel Payment charge), so the template refuses it.
    • Pointed at income_tax_before_winter_fuel_payment_charge instead, it runs. The reduction comes before the charge, at step 6 of Income Tax Act 2007 s. 23, so it is the same measure.
    • The change reproduces HM Treasury's three explainer cases for 2027-28: £13,036.40 pays nothing, £13,186.40 gets £44, and £13,400 gets nothing.
    • The Bundle column uses it. The dashboard needs the same change before it can generate on this bundle.
  • Its pins: the policyengine release that carries this PR (the next after 6.12.0, which shipped today without it) and policyengine-uk 2.165.1.
  • data_limits.py needs a record for f6e33b93.
  • A full regeneration: every published measure, the package, the map and the living standards outlook, in one bundle-adoption PR, as Vahid set out on Add the Machine Games Duty rise and a cash ISA survey path, both held back from the national results uk-autumn-budget-dashboard-2026#377.

Also: main is merged into this branch (6.12.0), and the test jobs now get 150 minutes, since the UK tests on 2.165.1 ran past 90. On 2882bb2c, Test (3.14) passed in 68 minutes and the other three test jobs are still running.

🤖 Generated with Claude Code

@juaristi22
juaristi22 marked this pull request as ready for review November 2, 2026 16:02
@juaristi22

Copy link
Copy Markdown
Contributor Author

@MaxGhenis, this is ready for your review. Could you review it and, if you're happy, give the go-ahead to merge it and release the bundle?

What merging does. The next policyengine release after 6.12.0 carries two UK files:

The dashboard changes only when it adopts that release. The comparison shows how each published figure would move then. It also lists what the dashboard has to change first: the Pension Tax Allowance modifier, its pins and data limits, and a full regeneration.

Where it stands:

  • certify-data passes for the national, and so do the bundle checks and the UC floor (0.923 of benefit units, 0.950 of spend).
  • CI on 2882bb2c:
    • passed: lint, mypy, the release-inputs check, the docs and Test (3.14), in 68 minutes;
    • still running: Test (3.11), (3.12) and (3.13), inside the new 150-minute limit.
  • Limits of this cut:

A separate question: savings on the dashboard

On this bundle the savings rates rise meets your bar: £141m, £136m and £125m above the OBR's income tax line in 2029-30 to 2031-32, none over £200m. Should the dashboard publish it, with the gap explained, when it adopts the bundle? Or should it stay held back until the OBR says how savers' response splits between income tax and corporation tax (Vahid's question)?

  • For publishing:
    • It meets your bar.
    • The national pins 2025 tax on savings to HMRC's Table 2.6 projection.
    • The figure is 8–12% above Table 6.1.
    • The gap to the income tax line is smaller than the OBR's estimate of savers' response, about £0.2bn a year across taxes (EFO paragraph 3.17).
  • For holding back: the figure is 25–32% above the income tax line, and how much of that is behaviour isn't verified until the OBR replies.
  • Either way, only on this bundle's engine. policyengine-uk 2.151.0, the dashboard's engine today, nets savers' ISA interest off their taxable interest, which Fix ISA income and capital treatment; model bonuses and charges policyengine-uk#2589 stopped. On that engine savings scores about £0.10bn a year less, for the wrong reason.
  • If published:
    • It joins the package, whose net yield rises by £0.53bn to £0.64bn a year from 2027-28.
    • A note it could carry: "Our figure is static: it holds savings fixed. The Treasury's costing includes savers moving money into ISAs, which the OBR puts at about £0.2bn a year across taxes. Our figure is £0.13bn to £0.14bn a year above the OBR's income tax line, less than that response."

cc @vahid-ahmadi for the dashboard side.

🤖 Generated with Claude Code

@juaristi22

juaristi22 commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor Author

Savings: HMRC's behavioural assumption for the 2025 rise

@MaxGhenis, a published source for the savers' response.

The OBR's supplementary release of 2 April 2026 sets out HMRC's costing of Budget 2025's 2-point rise in the savings rates, to 22, 42 and 47% from April 2027. That is the same kind of measure as row 62.

  • The response: savers take "greater advantage of tax advantaged assets". That covers ISAs, "including utilising family members' allowances", and higher pension contributions, plus some non-compliance. "These responses reduce the static yield by 20 per cent" (paragraph 1.10), "around 20 per cent in each year" (paragraph 1.15).
  • The planned £12,000 cash ISA limit "was considered in" that 20% (paragraph 1.12). Budget 2026 has since kept £20,000 (row 11), which leaves savers more room.
  • Taxes: the note describes the base and the response in income tax only (paragraphs 1.7 and 1.10). It doesn't mention corporation tax.

Taking 20% off this cut's static income tax gives £470m, £493m and £513m in 2029-30 to 2031-32. Against the OBR's income tax line of £443m, £475m and £510m, that is +6.2%, +3.8% and +0.5%. At the roughly 25% that EFO paragraph 3.17 implies for this rise (around £0.2bn of about £0.8bn), it would be −0.5%, −2.7% and −5.7%.

So HMRC's own assumption for the earlier rise covers the gap.

Your £200m rule: on this cut the static gaps are £145m, £141m and £131m.

What the note doesn't give: this rise's own share, its split by tax or year, or the £78m of corporation tax. @vahid-ahmadi, that may help frame the question to the OBR.

A design for modelling the response, in policyengine-uk and the dashboard, is in PolicyEngine/uk-autumn-budget-dashboard-2026#388.

🤖 Generated with Claude Code

The local area moves from 6528c865 to microcosm-uk-2024-25-dense-20261103T092045Z-dbacb023,
built from PolicyEngine/microcosm#1428 at 329a99e71 (the national's commit and
spine) with its gate-only sign-off (PolicyEngine/microcosm#1491), on
policyengine-uk 2.165.1. Both cuts now certify on their own build, so the
regional accepted-mismatch record and its input-surface audit drop out: area
runs read every input the engine takes, company cars and ISA payments
included. certify-data, the release lock, the TROs and the bundle checks are
rerun; the lock and the household snapshots are unchanged. The certified
local-area constants in the tests follow.

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

juaristi22 commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

@MaxGhenis @vahid-ahmadi, the local area this PR bundles has changed. It now carries microcosm-uk-2024-25-dense-20261103T092045Z-dbacb023 in place of 6528c865, which was your choice (a) on 2 Nov, Max. The description is updated.

What changed:

One trade-off. Overall fit matches 6528c865: 98.7% of targets within 10%, against 98.9%. But the local solve fits the SPI's HMRC income-band families less tightly. Median errors, with 6528c865 in brackets:

  • dividend income by band, 8.8% (5.4%);
  • property income counts by band, 5.3% (2.2%);
  • private pension income by band, 3.2% (1.8%).

The national file fits these families to about 0.1% on both pairs, so national figures don't move. Area runs inherit the misses: dividend and property income by constituency, and the property-rates map.

Corrected 3 Nov: the cause is how little the local solve's loss weighs these families, not more families sharing it. Property income counts by band take 0.04% of the loss on both cuts, and dividends by band 0.06% (0.08% before). This build adds about 2,000 pension-income cells by constituency, and new SPI families on the same households. At those weights the solve lets the band rows slip, while the national fits all of them together.

  • On the map: unscaled, the local file's national total for the property rates rise is +£0.441bn in 2029-30, against the national file's +£0.413bn. That's 7% above; 6528c865 was 4% above.
  • The fix: a floor share for these families in the local weighting. Setting it takes several local builds, so it isn't scheduled.

For the dashboard: the map reads the local area, so adopting this bundle moves area results with the new cut as well as the engine. The comparison covers national figures only.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Contributor

Round 3 at 7bcb276

I checked the diff against the merge base (42288e7c6), the national and local-area release manifests on the private staging repo (read-only, metadata only), the commit ancestry in microcosm, and the body and comments since my follow-up.

Earlier items

  1. Which national: fixed. The body names f6e33b93 from 329a99e71 and says 0a4c8e2c's findings 1 and 2 are why it was replaced.
  2. Engine: fixed. Pin, lock and manifest are all on 2.165.1, the build engine of both cuts.
  3. Rescore on the pinned engine: fixed through the comparison on 2.165.1. The body's table stays on 2.162.14 and says so.
  4. Savings, £0.75bn: partly. "Across all taxes" now says what the figure covers, but £0.6bn plus £0.2bn is still £0.8bn. Either use £0.8bn or say the £0.75bn starts from Table 6.1's average.
  5. Snapshot nit: open, unchanged at this head (the snapshots don't move in 7bcb276d).
  6. Property nit (86% of £12.82bn): open; that comment hasn't been edited.
  7. Machine Games Duty input: doesn't bite on this pin. 2.165.1 predates policyengine-uk#2731, and your 16:05 comment lists the missing higher-stake split as a limit. It applies again to the next re-pin to 2.167 or later.
  8. £133m against £130m: open; the 11:03 comment hasn't been edited.

Should

  1. Both cuts predate the banding fix, and the body says so for the national only.

  2. The local cut's sign-off is on an unmerged branch. microcosm#1491 is still open, so 1affbc127, the commit dbacb023 was built from, isn't on microcosm main yet. Worth a line in the body that #1491 should merge with a merge commit before this does, so the cut's build commit stays reachable (#1491 review, item 2).

Nit

  1. The title still says "local area 6528c865 or c9df4b86". Both are gone from the diff; it should name dbacb023.

On the local-area choice

Max's 2 Nov choice of (a) 6528c865 was made "unless that build brings its own local-area cut", and dbacb023 is that cut, so the 6528c865 / c9df4b86 question is superseded. The body states the trade-off openly (band families fit less tightly, the property map +7% against +4%). Accepting that is Max's call, not settled here.

Checked and fine

  • manifest.json: every national artifact sha256 (H5 a5945680…, calibration, diagnostics, certification, terminal, release-cut and spine gates, score vs Enhanced FRS) matches f6e33b93's release manifest. The dense H5 sha256 ef16a1d7… matches dbacb023's, and regional_source_manifest_sha256 05af6567… matches the sha256 of the regional release manifest as published. Both release manifests record policyengine-uk 2.165.1 and core 3.33.3, and compatible_model_packages is ==2.165.1 on both.
  • The regional accepted-mismatch record and the input-surface audit are gone from the manifest, consistent with both cuts certifying on their own build.
  • policyengine-uk 2.165.1 in pyproject.toml (three extras), uv.lock (wheel sha256 e8327ffe…, matching the manifest's model_package) and the manifest's package list. Core stays 3.33.3 with core_binding: bundle_pin.
  • Test constants: test_models.py, test_release_manifests.py:76-82 and test_uk_regions.py:25-31 pin f6e33b93, dbacb023 and 2.165.1. No a6299504, c9df4b86, 6528c865 or 2.151.0 left in src/, tests/ or scripts/ outside the TROs.
  • 7bcb276d touches no lock or snapshot, as the body says.
  • The changelog fragment names both cuts, the commit and the pin move.

Not verified: H5 contents; build 1's gate report; the local fit figures (8.8%, 5.3%, 3.2%, 98.7%) and the +£0.441bn map total. I couldn't run the PR's tests locally this round, so I'm relying on CI.

CI at 7bcb276: lint, mypy, changelog, docs, release inputs, smoke imports, Test (3.12) and Test (3.14) passed. Test (3.11) and (3.13) were still running when I posted.

Verdict: the pins and digests are consistent with the pair the body describes. Item 9 should go in the body before this merges, and the decision on shipping this pair or waiting is still open.

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Contributor

@juaristi22 @MaxGhenis, agreed on all three of María's points from Slack. For the record:

  1. Stay on policyengine-uk 2.165.1 and port the Machine Games Duty into the dashboard. From 2.170, the Budget is in current law, so moving the pin would need a pre-Budget baseline on the dashboard and a rebuild or re-audit of both cuts. The dashboard will carry:

    • policyengine-uk#2731's rule, as a modifier on machine_games_duty. It charges the higher-stake share of standard-rate takings at 25% instead of 20% from April 2027. The share is a sourced parameter: the Gambling Commission's Category B share, 75.7%, labelled as a floor.
    • policyengine-uk#2761's projection, in the dashboard's forecast layer.

    That PR is in progress, held back until the bundle is adopted. The household calculator side (dashboard [codex] Add opt-in cliff impact outputs #377 and Refresh UK release bundle to policyengine-uk 2.88.40 #387) has been live since this morning. The engine move goes with the next pair.

  2. Ship dbacb023 as it is. National figures don't move. The dashboard's Methodology will say that the property and dividend income maps rest on a looser fit by income band. On the property rates rise, the unscaled local total is 7% above the national.

  3. Company cars stay off the dashboard until the base is fixed (473,000 holders against HMRC's 920,000).

Once this PR is certified and released, the dashboard adopts it in one PR, with:

  • the Pension Tax Allowance port;
  • the new pins and a data_limits record;
  • the Machine Games Duty port;
  • savings on the page, static;
  • a full regeneration and a before/after map check;
  • a note on the page.

The cash ISA stays calculator-only. We've closed dashboard #386 (6.12.0) in favour of that single adoption.

Max, over to you for certification.

@juaristi22

Copy link
Copy Markdown
Contributor Author

@vahid-ahmadi, on the cash ISA (Table 6.1 row 11): what puts the survey rule at about 1.6 times Table 6.1 on f6e33b93.

It's the taxed share. Taxing about a third of the excess above £12,000, instead of the survey's 46%, reproduces Table 6.1 in every year. The rest of the method matches the costing note:

  • the same population: under-65s who'd save more than £12,000 a year in cash ISAs;
  • the same interest path: the OBR's forecast returns on savings deposits;
  • no static effect;
  • the same savings rates: 22%, 42% and 47% from April 2027.

The costing doesn't publish its behavioural share, and its note names the behavioural response as the main uncertainty.

Income tax, £m, on f6e33b93 with policyengine-uk 2.165.1, on the survey path of PolicyEngine/uk-autumn-budget-dashboard-2026#377 (deposit rate, build-up). The 46% row matches your table to within £3m.

Taxed share 2027-28 2028-29 2029-30 2030-31 2031-32
46%, the survey −7.4 −26.4 −49.7 −80.5 −122.4
40% −6.5 −22.8 −43.0 −68.8 −102.8
35% −5.7 −19.9 −37.4 −59.5 −88.1
30% −4.9 −17.0 −31.9 −50.5 −73.9
25% −4.1 −14.1 −26.4 −41.7 −58.9
Table 6.1 row 11 −5 −20 −35 −50 −70
Share Table 6.1 implies 31% 35% 33% 30% 29%

Why the ratio rises from 1.3 in 2028-29 to 1.75 in 2031-32: the Personal Savings Allowance.

  • At 46%, the new interest is taxed at 7% on average in 2027-28 and 10% by 2031-32. As the stock builds, more savers go past their £1,000 or £500 allowance.
  • With the allowance set to zero in both arms, it's taxed at 26–28% throughout. The cost is then exactly proportional to the share: taxing all of the excess costs 2.2 times the 46% case in every year.
  • With the allowance, taxing all of it costs 2.3 times the 46% case in 2027-28 and 3.4 times in 2031-32. A higher share pushes savers past their allowance sooner. So a share 1.4 times the costing's gives 1.3–1.5 times its cost early and 1.6–1.75 times later.

What's left.

  • The implied share slips from 35% to 29% in the last two years, so at a fixed share our path is still a little steeper than the costing's. One possible reason, which we can't test: HMRC's affected savers may use more of their allowance on other interest than ours do, so their extra interest is taxed from the first pound.
  • The base can't be checked either. We have about 2.8m under-65 payers putting about £18.8bn a year above £12,000. The costing's base comes from HMRC administrative data and isn't published.

For the dashboard. The survey's 46% is the share of Paragon Bank's respondents who named a non-ISA account, in a question that allowed several answers. It isn't a share of the money. If the measure is ever published nationally, a share calibrated to Table 6.1, about a third, would match the official line by construction and keep our distribution of who pays. Until then it stays calculator-only, as agreed.

Method.

  • The runs are on the households with an under-65 cash ISA payer above £12,000. Income tax is household-local, so the totals are exact.
  • Under pre-Budget law, the excess an under-65 couldn't put in a cash ISA builds up from April 2027 and earns the OBR's deposit rate (EFO October 2026).
  • The taxed share of that interest is added to taxable savings income.
  • Every figure is a weighted total.

🤖 Generated with Claude Code

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants