Repository navigation
Certify the Microcosm UK pair from microcosm#1491 on policyengine-uk 2.165.1 (national 0639b9c7, local area 83802786) - #731
juaristi22 wants to merge 10 commits into
Conversation
…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>
|
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:
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.
What moved: the relief part.
Against the OBR's income tax line.
Partnership property income: a lead, not a quantified gap.
Bringing it in.
🤖 Generated with Claude Code |
MaxGhenis
left a comment
There was a problem hiding this comment.
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.
|
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.
Property.
Trading allowance.
Revised:
🤖 Generated with Claude Code |
MaxGhenis
left a comment
There was a problem hiding this comment.
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.
|
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
Should
Nits
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: 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 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 |
|
The cash ISA limit and the Machine Games Duty rise on this national (Budget 2026, Table 6.1 rows 11 and 56) Measured on Cash ISA limit kept at £20,000 (row 11)
Machine Games Duty: 20% to 25% on machines with a stake above £1 or a prize above £100 (row 56)
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.
DisclosureWeighted national totals and shares only. Every figure rests on well over 10 source households. 🤖 Generated with Claude Code |
|
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:
On the cash ISA and Machine Games Duty comment (11:03) The sourced figures check out:
Should
Nit
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: 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 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 |
|
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
What each treatment gives on this nationalIncome 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.
The proposed treatment
Weighted national totals only. Every figure rests on well over 10 source households. 🤖 Generated with Claude Code |
MaxGhenis
left a comment
There was a problem hiding this comment.
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.
…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>
Rescored on
|
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>
How the dashboard's numbers move if it pins this bundle@MaxGhenis, two answers first:
What the comparison isPinning this bundle changes three things at once:
The columns:
Budget lines£bn, with the exchequer positive. The percentage is the change in size.
What moves:
DistributionEach cell reads Published → Bundle. "People whose income changes" is the dashboard's share of people affected.
Deciles, £ per household a year
Measures not on the dashboard yet
What else moves, not measured here
What the dashboard has to change to adopt it
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 🤖 Generated with Claude Code |
|
@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:
A separate question: savings on the dashboardOn 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)?
cc @vahid-ahmadi for the dashboard side. 🤖 Generated with Claude Code |
|
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.
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>
|
@MaxGhenis @vahid-ahmadi, the local area this PR bundles has changed. It now carries What changed:
One trade-off. Overall fit matches
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.
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 |
|
Round 3 at 7bcb276 I checked the diff against the merge base ( Earlier items
Should
Nit
On the local-area choice Max's 2 Nov choice of (a) Checked and fine
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 |
|
@juaristi22 @MaxGhenis, agreed on all three of María's points from Slack. For the record:
Once this PR is certified and released, the dashboard adopts it in one PR, with:
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. |
|
@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 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 costing doesn't publish its behavioural share, and its note names the behavioural response as the main uncertainty. Income tax, £m, on
Why the ratio rises from 1.3 in 2028-29 to 1.75 in 2031-32: the Personal Savings Allowance.
What's left.
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.
🤖 Generated with Claude Code |
|
Thanks @juaristi22, that settles the cash ISA gap. The survey's 46% is a share of respondents, not of money, and a taxed share of about a third (29–35%) reproduces Table 6.1 in every year. Agreed:
|
The Test jobs keep 150 minutes: main's 105 (#737) still cancels runs on policyengine-uk 2.165.1, which took 59 to over 90 minutes here; the comments keep both notes. The bundle manifest and TROs keep this branch's records, to be regenerated by the certification that follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The national moves from f6e33b93 to microcosm-uk-2024-25-national-20261103T154302Z-0639b9c7, built from PolicyEngine/microcosm#1491 at dd99a1dcd on policyengine-uk 2.165.1, and the local area from dbacb023 to microcosm-uk-2024-25-dense-20261104T093024Z-83802786, built from the same commit and spine with its gate-only sign-off (5293966d4). Both certify on their own build. certify-data, the release lock, the TROs and the bundle checks are rerun; the household snapshots are unchanged. The bundle versions follow main's 6.13.0 (bump_version.sync_bundle_versions), the certified constants in the tests follow uk_qualification.rewrite_certified_constants plus the local-area id, and one changelog fragment describes the new pair. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Costings on the PolicyEngine/microcosm#1491 pair, and what explains each gapThis PR now bundles the pair built from PolicyEngine/microcosm#1491, both on policyengine-uk 2.165.1 and published today to the inspect lane, tag only:
The national differs from
How it was scoredEvery measure is scored on the national as the dashboard scores it. The code is the head of PolicyEngine/uk-autumn-budget-dashboard-2026#377, with its October 2026 forecast, on policyengine-uk 2.165.1. Each figure is the weighted change in
The columns:
The cash ISA and Machine Games Duty figures for What moved from
|
| £m | Local 83802786 |
National 0639b9c7 |
Local / national |
|---|---|---|---|
| Property income rates, 2029-30 | +438 | +411 | +6.6% |
| Property income rates, 2030-31 | +454 | +426 | +6.4% |
| Company car tax, 2030-31 | +237 | +228 | +4.0% |
| Company car tax, 2031-32 | +244 | +234 | +4.0% |
- On
dbacb023the property figure was 6.9% abovef6e33b93. - Why: the local solve fits the SPI's income-band families less tightly than the national, which fits them to about 0.1%.
- Median errors on this cut, with
dbacb023's in brackets: dividend income by band 12.2% (8.8%), property income counts by band 4.0% (5.3%), private pension income by band 6.6% (3.2%). - Area runs inherit those misses; national figures don't.
- Median errors on this cut, with
- The local cut's car base matches HMRC as the national's does: 916,000 holders, £3.08bn of taxable value and a 50.7% electric share.
- Its fit overall: 98.65% of 28,543 target rows within 10%, against 98.66% on
dbacb023. - Its gates: every release-blocking gate passes. The diagnostic high-value-homes support check fails, as it did on
dbacb023.
What the dashboard needs to adopt it
The same as in the comparison:
- the Pension Tax Allowance modifier on
income_tax_before_winter_fuel_payment_charge; - pins on the policyengine release that carries this PR, and on policyengine-uk 2.165.1;
- a
data_limits.pyrecord for0639b9c7; - one full regeneration.
The distribution tables and the map aren't rerun here.
Disclosure
Aggregates only: weighted totals over many households, and published HMRC, OBR and Treasury figures.
🤖 Generated with Claude Code
@MaxGhenis, for the UK hub: this certifies the Microcosm UK pair from PolicyEngine/microcosm#1491 on policyengine-uk 2.165.1 and supersedes #728. Re-pinned on 4 Nov from
f6e33b93anddbacb023to the national0639b9c7and the local area83802786, built from one commit and spine, so both certify on their own build. Earlier pins:0a4c8e2c(2.164.2) until 2 Nov, thenf6e33b93with6528c865and, from 3 Nov,dbacb023.The national
microcosm-uk-2024-25-national-20261103T154302Z-0639b9c7(microcosm_uk_2024_25):Build: microcosm
dd99a1dcdwith policyengine-uk 2.165.1, so it certifies on its own build (built_with_model_package). The core stays 3.33.3, withcore_binding: bundle_pinas on main.Source: the head of Sign off the local cuts' target-fit rows (dbacb023, 83802786), and the company car base microcosm#1491 when it was built. That is everything in
f6e33b93(SPI donor savings rebased to SPI's 2023-24 bands (savings follow-up to #1418) microcosm#1428, since merged), plus:2dbf7cf56: SPI records banded on total income net of expenses, without gifts (from Vahid's review of SPI donor savings rebased to SPI's 2023-24 bands (savings follow-up to #1418) microcosm#1428);d0e87370e: company cars kept on SPI rows whose drawn EPB is zero, their benefits moved from PAY into EPB;dd99a1dcd: HMRC's 2024-25 company car holders, taxable value and holders by fuel, bound in the national calibration.Vahid's later cap on Sign off the local cuts' target-fit rows (dbacb023, 83802786), and the company car base microcosm#1491 (
6ef5983e9: every tape row's car within its EPB + PAY) isn't in this cut; the next national picks it up.H5 sha256:
b35b336242caef97892efdc475d35a55160ef22388f42ebf2a610b410dd60837.Certification: in Microcosm it passed all 55 spine gates, 7 calibration-seam gates and 19 release-cut gates. 98.6% of target rows end within 10%, and the five company car rows within 0.5% of HMRC.
Publication: uploaded to the inspect lane (
--no-latest, tag only) on 4 Nov at 13:06 UTC; not promoted. The build machine had no emitter, so its staging files never reached the collector, and it was published with--allow-missing-staging.Previous cut:
f6e33b93(microcosm329a99e71) carried about half of HMRC's company car holders and lacked2dbf7cf56, so it's replaced.The local area
microcosm-uk-2024-25-dense-20261104T093024Z-83802786(microcosm_uk_2024_25_dense), which constituency and local-authority regions route to (regional_release_kind: local_area).Build: Sign off the local cuts' target-fit rows (dbacb023, 83802786), and the company car base microcosm#1491 at
dd99a1dcd, the national's commit and spine, with its gate-only sign-off (5293966d4) on top, on policyengine-uk 2.165.1. The doctrine is the last local cuts': K=15, 150,000 households, seed 42 anddbacb023's warm start.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.
Gates:
5293966d4, merged into Sign off the local cuts' target-fit rows (dbacb023, 83802786), and the company car base microcosm#1491).dbacb023.Published on 4 Nov to the inspect lane, tag only.
Fit: 98.65% of 28,543 target rows within 10%, against 98.66% on
dbacb023. The five company car rows sit within 2% of HMRC.The trade-off of the last cut remains. The local solve fits the SPI's HMRC income-band families less tightly than the national, which fits them to about 0.1%. Median errors, with
dbacb023in brackets:Area runs inherit those misses; national figures don't. On the map: unscaled, the local file's national total for the property rates rise is +£438m in 2029-30, against the national file's +£411m, 6.6% above (
dbacb023: 6.9%). The fix, a floor share for these families in the local weighting, takes several local builds, so it isn't scheduled.It replaces
dbacb023, built from329a99e71.Before the dashboard moves to this bundle
f6e33b93, the published figures and Table 6.1, with what explains each gap: the costings comment.f6e33b93. Its changes still apply, with adata_limits.pyrecord for0639b9c7.income_tax_before_winter_fuel_payment_charge: policyengine-uk 2.162.14 and later buildincome_taxas a sum, which the dashboard's template refuses.other_investment_income, which 2.164.2 left out.Budget measures on this pair
Scored on the national with the dashboard's code (the head of PolicyEngine/uk-autumn-budget-dashboard-2026#377 and its October 2026 forecast) on policyengine-uk 2.165.1: the costings comment. Against
f6e33b93: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.
f6e33b93, 33%, 30% and 26%). That compares this cut's static figure with a line after behaviour.Impact
a6299504andc9df4b86) to0639b9c7and83802786. UK results change with both.Commits
59662673: the national and the local area, certified by onecertify-datarun. 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 tof6e33b93, with the local area re-audited for 2.165.1, the lock, the release lock, the TROs, the snapshots and the changelog fragment (which replaces0a4c8e2c's).19a2f004: the certified test constants, rewritten byuk_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 todbacb023.315be842: main merged in (6.13.0). The test jobs keep 150 minutes, where main has 105 (Let the Test jobs run for 105 minutes #737).a0f2221c: the re-pin to the Sign off the local cuts' target-fit rows (dbacb023, 83802786), and the company car base microcosm#1491 pair. It hascertify-dataon both cuts' own build, the release lock, the TROs, the bundle versions at 6.13.0, the certified test constants and the changelog fragment (which replacesf6e33b93's). The lock and the household snapshots don't change.How it was made
uk_qualification.rewrite_certified_constantsrewrote the certified national constants intests/test_models.py,tests/test_release_manifests.pyandtests/test_uk_regions.py; the local-area constants moved to83802786with the same rewrite.Evidence run on this head
0639b9c7(check_uk_uc_floor.py, Great Britain, 2025, within 10%, policyengine-uk 2.165.1). The receipt holds weighted national totals only:f6e33b93);bundle.py checkruns pass, the second with--include-tros --strict-tros. The household snapshots pass unchanged on 2.165.1.a0f2221c, 124 tests pass on the release manifests, UK regions and models. 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