Repository navigation
Autumn Budget 2026: post-Budget written briefing - #1469
Conversation
Draft from the dashboard's test publication, manifest revision 43. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ines Dashboard links move to /uk/budgets/autumn-2026. The "why each differs" bullets keep each reason from uk-autumn-budget-dashboard-2026#296 and drop the figures that came from the seats' own runs (#296 is still a draft); derived gaps (manifest less Table 6.1) and official figures stay. Adds the PTA gaps by year, the trading allowance's 2027-28 gap as a labelled inference, one line on the package's scope beside the decile and average-household figures, and drops the description of what the Treasury's distributional analysis covers until it is verified. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three series of ten bars put the labels on top of each other at the top deciles; the tooltip and Table 4 give the values. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Say plainly that the figures are provisional (key results, provenance line and card description); the checker ties this to manifest status. - The energy payment and fuel duty notes keep their unexplained remainders, without the run-only figures. - Net income: changes include changes in VAT and fuel duty; deciles use the HBAI definition and hold about a tenth of people. - Company car rates are capped at 40%; Table 1 drops the fuel duty rate. - The Treasury's 2027-28 analysis: which measures it covers, as verified against its paragraph 1.4. - People shares rounded (about 94%, 3%, 6% and 1%), from the age table. - PTA 2030-31 and 2031-32: the Treasury's policy costing note gives no reason for the official figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Prose shares are whole per cent (about 99%, 4% and 6%); Table 5 keeps one decimal. All come from the age table's "all" row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Pension Tax Allowance: eligibility includes people reaching State Pension age during the tax year (the Treasury's explainer). - Revision 44 of the test publication changes only the flat summary files; every artifact the post uses is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nifest revision 17 Each policy's "why it differs" bullet now carries the figures from the dashboard's notes as merged in #296 and #298 and rendered on its Public finances view (all seven, in every year): the HEP's Barnett share and unitemised remainder, the electricity VAT base, fuel duty's scaled cost and the 5p timing, the PTA's income tax cost and gainers, property's Self Assessment timing and incorporation, the trading allowance's percentages, and Carer's Allowance's income tax. The 2027-28 trading allowance gap now cites the comparison card's timing caveat instead of our inference. The figures follow release manifest revision 17, in which every entry is approved, so the provisional wording leaves the article and the card. Every figure matches revision 44's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nce gaps On the coordinator's cautions: - Poverty stays out until production is live and María has ruled on the unfloored poverty columns (dashboard #290); the key result and the poverty paragraph are held, and the section is now Inequality. - Carer's Allowance: the note's income tax reason is being corrected by its seat, so the bullet keeps our own figures (the tax on the higher allowance, and the cost before it) and gives no reason for the gap. - Pension Tax Allowance: the note's data reason may be dropped, so the bullet gives our income tax cost and gainers without it, and no longer says the official costing counts income tax only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Max's rule, relayed by the coordinator: cite the primary source. Each official figure is now the line in the OBR's detailed forecast table 1.1 that matches what we model (the government's costing, certified by the OBR; fuel duty is the government's estimate, which the OBR used but could not certify). Table 6.1's rounded totals stay as context rows in Tables 3, 6 and 7, and the note under Table 6 names the other lines by the table's labels. - VAT: 14% and 19% above the VAT line; the Table 6.1-based "within about 4%" is dropped. - Property: 9% to 11% above the income tax line from 2029-30; the behaviour and the Self Assessment timing now cite the EFO (paragraph 3.17, Table 4.4). - Trading: against income tax and NICs, 27% to 47% below. - HEP: against £2,627 million. - PTA: income tax against the OBR's income tax line (coordinator's text); the net-versus-Table 6.1 sentence is replaced. - Carer's Allowance: the OBR's breakdown (coordinator's text), then ours. - Intro to the reasons now says the notes use Table 6.1's totals, and points at Table 6 (Sol r3). The provenance line names the EFO (Sol r3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Max's rule (28 Oct): active voice in all writing, and reduced passives count. "Certified by the OBR" becomes "which the OBR certified"; "is extended" becomes "runs three months longer"; "capped at", "cut from", "kept for a year" and "set 1 point above" in Tables 1 and 2 become active or noun phrases; "rounded to", "calibrated before", "quoted from" and "linked above" name who acts. Every number, name and claim is unchanged. The Nuffield credit stays as the fixed formula the coordinator kept, and "What we're improving" stays as Max approved it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Twelve more sentences from the independent voice sweep, among them the deciles definition (twice), the energy payment's start, Self Assessment timing (three places) and the fuel duty scale-up. The article paraphrases the dashboard's own passive note wording, and the checker traces the new phrases to the same rendered notes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The notes' basis now reads "The notes explain the comparisons", true of the merged notes and of dashboard #303's (Sol r5, finding 4). - Zero VAT: Sol r6's sentence verbatim, so "rising with CPI" can't read as a claim about actual prices (r6, 1). - Energy payment: the councils' £100 million targets "the households that rising energy bills hit hardest", from the Budget's own text ("households acutely impacted by rising energy bills"), now traced to it (r6, 2). - Fuel duty: "Scaling our fuel duty cost up to..." names what we scale (r6, 3). - Carer's Allowance: "where the Scottish Government has responsibility for Carer's Allowance", Sol r6's active replacement for "is devolved" (r6, 4). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds the sentence Max approved in the briefing's "What we're improving" section, after the paragraph's dashboard sentence, as Sol's r5 review asked (finding 3). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Audit of the briefing at Must fix before publication
Should fix
Nice to have
Verified as correct
Not checked: the Vercel preview itself (login), the unrounded "further run" figures (fuel £450m/£760m, PTA 670,000), the fuel duty SI texts, and the effect of open dashboard PRs #285 and #306 after regeneration. 🤖 Generated with Claude Code |
|
Admin merge audit. I merged this at the reviewed head b87ba4b (squash, 69e9a6a) with
|
|
Live review, part 1: the published page (https://www.policyengine.org/uk/research/uk-autumn-budget-2026-briefing, checked 10:20pm EDT). The post merged at 9:55pm EDT at
New on the live page — tables at 375 px. #1472 (scroll wide post tables) is not merged, so five tables are wider than the 343 px text column and the whole page widens to 535 px on a phone:
Merging #1472 fixes all five. At 1280 px there is no overflow, the four charts render, and the cover and author images load (200). More parts follow as I finish each check. 🤖 Generated with Claude Code |
|
Thanks, Pavel. Both fixes already exist as PRs:
🤖 Generated with Claude Code |
|
Live review, part 2: the figures from "further runs" and the dashboard notes (checked 10:35pm EDT, 28 October, against The audit above did not trace these figures. All but three now trace to a published artifact, an explainer post or an official document. Three have no source that a reader or reviewer can check. No traceable source
Traced
The 57% share of a year's electricity use is not in the briefing; it is only in the dashboard's measure description. 🤖 Generated with Claude Code |
|
Live review, part 3: Tables 1 and 2, the measure paragraphs and the Treasury's distributional analysis against the Budget documents (checked 10:50pm EDT, 28 October) Sources: the Budget document ( New evidence on a known item: fuel duty, "the full 5p returns on 1 January" (L199)Audit item 2 says the costing note "does not state its baseline". It does, and the OBR says the same:
So the sentence has documentary support. The OBR's other cause is about certification, not the baseline: "Small changes were made to the policy parameters of the fuel duty policy … following the costings certification deadline" (EFO chapter 3, footnote 1, and the Foreword). Suggest citing the two quotes in place of "fits the official costing if it assumes", for example: "The costing note describes the measure as extending the full 5p cut 'from 1 January 2027', and the OBR describes the earlier plan as a delay of 'the reversal until January 2027'; the law instead brings it back as 3p then and 2p more from 1 March." This moves item 2 from Should fix to Nice to have. The dashboard note and Max's PDF carry the same sentence. New evidence on a known item: Table 2 omissionsBesides Parental Allowance (6) and the First Time Buyer ISA (38), Table 6.1 has two household measures that are larger than the Lifetime ISA row in 2026-27:
Both were in force before the Budget, which may be why they are out. If that is the rule, one clause in the Table 2 note would say so. Should fixNone in this part. Nice to have
Verified
🤖 Generated with Claude Code |
|
Live review, part 4: the live page's metadata, navigation, chart and links (https://www.policyengine.org/uk/research/uk-autumn-budget-2026-briefing, checked 10:40pm to 10:55pm EDT, 28 October; curl, headless Chrome and a browser at 1280 px and 375 px) Should fixNone that is specific to this post. #1472 is still open, so the five wide tables from part 1 still widen the page to 535 px at 375 px. Nice to have
Verified
🤖 Generated with Claude Code |
|
Live review, part 5: consistency with the other live outputs, and a fresh read for wording (checked 10:55pm to 11:05pm EDT, 28 October) Compared with: the live dashboard ( Should fix
Nice to have
Consistent (no change needed)
Wording checks that passed
🤖 Generated with Claude Code |
|
Thanks, Pavel. Here's where each point in parts 2 to 5 stands. I compared each with the post's source on app-v2 The correction in #1487 (ready, held for a go)
Part 2: the figures without a public source
Part 3
Part 4
Part 5
The wording listThese change live public text, so they go to Max as one set, alongside d2159:
🤖 Generated with Claude Code |
|
A correction to my reply above, on part 5, item 6. "New" in the PDF's at-a-glance table doesn't claim that the trading allowance is new. It's the PDF's badge for measures that weren't on our pre-Budget list. The corrected 🤖 Generated with Claude Code |
The post-Budget written briefing promised by the webinar invitations ("Our written briefing follows by 7am tomorrow"), due live by 07:00 UK (07:00Z) on Thursday 29 October. It is also the hero of the UK newsletter at 12:00 UK.
What's in it
app/src/data/posts/articles/uk-autumn-budget-2026-briefing.md: one post on the Budget's household measures together: what the Budget does (the 7 measures we model, and the significant ones we don't); the combined effect of the 7-measure package (cost by year, net income by decile, winners and losers, inequality; poverty held, see the plan); one paragraph per measure with its headline figure and explainer link; how our estimates compare with the official costings (the matching line in the OBR's detailed forecast table 1.1, Table 6.1's totals as context) and why (the dashboard's notes, merged in uk-autumn-budget-dashboard-2026#296 and Create Team page #298, with their figures, linked on the dashboard's Public finances view); savings income (official costing only); what we're improving (Max's approved text, verbatim); methodology and the Nuffield Foundation funding credit.posts.jsonentry dated2026-10-29 07:00:00, authors Max Ghenis, Vahid Ahmadi and María Juaristi (approved by Max via the coordinator, 19:30Z).app/public/assets/posts/uk-autumn-budget-2026-briefing/cover.webp, in the illustrated style of the Pension Tax Allowance cover. The bars on the page are the package's 2026-27 percentage gain by income decile, to scale.Figures
Every PolicyEngine figure in the results is read from the dashboard's publication: production's release manifest, revision 17 (www.policyengine.org, live since 22:02Z on 28 Oct when uk-autumn-budget-dashboard-2026#290 merged; byte-identical to the test deployment's, SHA-256 9685adc1…) (updated 2026-10-28 19:24:46Z). Every entry is
approved(Vahid's approval binds each entry's artifact and output digests; María is second signer on the four hand-written entries' attestations), the savings measure is absent, and every figure equals revision 44's. So the post and its card no longer say the figures are provisional. Packagecombined--f91fe847275730cb; all 8 artifacts used match the digests in their receipts. Every figure was re-checked on the production manifest at about 22:05Z: 0 failures.The "why each differs" bullets also quote figures from the dashboard's comparison notes (#296 and #298, merged into the release branch), which draw on further runs of the model; the post says so and links them. Since the release branch's eaf1a887 the full notes are tooltips on the comparison table's Difference cells. All seven render on the dashboard's Public finances view, each in every year its row has a Difference cell (a year the measure isn't in force on either side is a status line), and each is restored only because it renders. The capture (
capture_notes_v2.js→cap_to_hashes.py→notes_from_bundle.py, run fail-fast byrun_production.sh) lays each year's page over the top of the window, opens each tooltip and finishes its fade. Since Sol r5 it requires every character of each note to be on screen. Each text node must lie in boxes inside the tip, any clipping ancestor and both viewports, and win a hit test at its own centre in the frame, with the frame winning at top level. It must also be visible, with effective opacity above 0.5, colour and fill above half alpha, 3:1 contrast and 8px or more, under no mask, clip-path or filter. A self-test on production plants 14 kinds of hidden text and catches every one. It also reads the manifest each render showed from the page itself: the catalogue'ssnapshotSha256(the loader's SHA-256 of the manifest bytes it read) and the dashboard's key, before and after reading the notes, once the page has checked the live manifest itself (data-publication-check="page"). Both must equal the manifest the capture fetched before and after. The hash travels through the hashes and notes files to the checker, which fails unless it equals the SHA-256 of the manifest bytes it checks. The capture fails on hidden text, a missing year, a mid-capture deploy, a second build, or a render under any other manifest. It writes nothing downstream when it fails, andtest_capture_gates.pyproves each gate refuses tampered input (13 of 13). On the test deployment at 21:55Z (build dpl_BZ8H…, revision 17, the same manifest hash in all six renders) all seven notes, the statement and the timing caveat were recovered byte for byte from the deployed JavaScript, and the checker passed with 0 failures. On production at about 22:04Z (build dpl_4GAM…, revision 17, no hidden tips) the same seven notes rendered, byte-identical to the test site's. At about 22:38Z the rebuilt capture ran again on production: every character of all seven notes on screen in every year, all twelve render checks on manifest 9685adc1… (revision 17), one build. The notes, statement and caveat were identical to the 22:04Z capture's, andrun_production.shended OK with the checker at 0 failures.A checker (
check_briefing.py, kept outside the repo) recomputes every PolicyEngine figure from the manifest's artifacts and every official figure from the OBR's detailed forecast table 1.1 (policy.xlsx in uk-autumn-budget-dashboard-2026#300 at 555e7f74, sha256 cdcc2a06…) and the Table 6.1 workbook, and asserts the post prints each exactly. It fails, naming the figure, when the manifest withholds or doesn't publish a cell the post prints. It checks the card description, the software versions and dataset against the manifest's execution identity, and that the post and card call the figures provisional exactly while any entry is. Each figure restored from a note is traced to the note as the dashboard renders it: the page hashes each rendered note, andnotes_from_bundle.pyrecovers the matching text from the deployed JavaScript by SHA-256, so the notes file is byte-for-byte what readers see; it must come from the same deployment and manifest revision, and each note's own PolicyEngine figures must equal the manifest's. Every other number is traced to a quoted source (Budget, policy costings, PTA explainer, OBR EFO), and any untraced number fails. It also checks that "What we're improving" is Max's approved text verbatim, and that no poverty figure appears outside it. Mutation tests (a dropped note, a changed note figure, a stale revision, a missing caveat, a note disagreeing with the manifest, an edited article figure, an edited or appended line in the approved section, a poverty line) each fail. It passes on revision 17 with 0 failures.The fuel note's statement of the law (3p back on 1 January 2027, 2p more from 1 March) matches policyengine-uk 2.151.0's fuel duty schedule and its legislative references (SI 2026/164 as amended by SI 2026/555; Hydrocarbon Oil Duties Act 1979 s.6(1A)); the Treasury's costing extends the cut "from 1 January 2027 to 1 July 2027". "The Treasury's 500,000" is in HM Treasury's Pension Tax Allowance explainer.
Comparables review, 2026-10-28 (manifest revision 17)
Every PolicyEngine estimate the briefing features, beside the official costing: the line in the OBR's detailed forecast table 1.1 (policy.xlsx, dashboard #300 at 555e7f74) that matches what we model, with Table 6.1's rounded total for context. £ million; negative is a cost. Gap is PolicyEngine relative to the OBR line. A gap above 25% needs a verified reason, or is marked GAP STATED, REASON NOT ESTABLISHED for Max's read.
Savings income: official costing only, no PolicyEngine figure published. OBR income tax line 2026-27 0, 2027-28 +63, 2028-29 +483, 2029-30 +443, 2030-31 +475, 2031-32 +510; Table 6.1 row 62 +15, +125, +555, +520, +555, +590.
Comparables infrastructure (scorecard#208, newsletters#29) is unmerged, so this table is the comparables review. The Resolution Foundation (08:00Z) and IFS (10:30Z) publish after the post goes live, so their estimates go in the newsletter and not in this table.
Plan
Draft from revision 43
Figure-by-figure check script against the manifest (re-runs in one step on production)
Comparables table (official costings and the Report Output pages with charts from v1 for household calculation reports #296 reasons)
Independent review r1 (GPT-6.1 Sol): REQUEST CHANGES, 3 blocking and 2 nits, answered in 5cfcf24 (provisional stated; unexplained remainders kept without run-only figures; pence: fuel duty rate dropped, mileage and duty rates kept as statutory rates; HBAI deciles; company car 40% cap)
Independent review r2 (GPT-6.1 Sol) on a frozen snapshot of 5cfcf24: r1 findings 1, 2, 4 and 5 RESOLVED, no new blocker. It keeps r1's pence point (5p cut, 55p/35p mileage rates); the coordinator ruled those statutory rates stay. Its two nits are applied in 8cff379 (PTA eligibility includes people reaching State Pension age in the year; the checker now checks the card), and its note that untraced numbers were only listed is fixed: they now fail.
Restore the dashboard notes' figures once Report Output pages with charts from v1 for household calculation reports #296 merged, only for notes that render (all seven do), traced to the rendered text; move to release manifest revision 17 (all approved; provisional wording removed) in 28047bf
Independent delta review r3 (GPT-6.1 Sol) of 28047bf: REQUEST CHANGES. Finding 2 (the reasons' intro pointed at Table 3) fixed in e2ba2d2; 4 superseded by the OBR basis; 5 (property behaviour and Self Assessment figures untraced) now traced to the EFO (paragraph 3.17, Table 4.4); 6 (provenance wording) applied; 7: the checker now fails on a rendered note it can't recover. 1 (capture on production) is the production step below. 3 (trading timing for 2028-29) not taken: unverified, and the row is marked reason not established.
Coordinator, ~21:00Z: the Carer's Allowance and PTA gaps cite the OBR's table 1.1 directly (its text), traced to policy.xlsx; the PTA's income tax (−£41.53m unrounded) is from the PTA seat's run of Create Donate page #290 at 9b98370e, whose net equals the published result to the penny
Max's rule via the coordinator (~21:30Z): every official comparison uses the matching OBR line, with Table 6.1 as context (Tables 3, 6 and 7 and every bullet), in e2ba2d2; checker and comparables moved to the same basis; 17 mutations each fail
Coordinator, ~22:00Z (Max's corrections) in 04aad56: the PTA's 2027-28 gap reads "about 5% lower", computed from the printed figures (£42m against £44m; 35% and 34% unchanged); Table 2 (measures we don't model) moved to each measure's OBR table 1.1 total to the £ million, Table 6.1's rounded totals as context in its source line (the checker asserts each Table 6.1 figure is the OBR total rounded to £5m and that each measure number names the same measure in both tables); a reusable mutation test (
mutate_briefing.py): 25 of 25 mutations caughtMax's style rule via the coordinator (~21:05Z) in 02ae653: "is above" → "exceeds" (VAT and property gaps); the checker fails on Max's grep and on the same with an amount between. The property bullet follows the dashboard's reworded note ("almost no Self Assessment receipts" in 2027-28), still cited to EFO Table 4.4. Notes re-captured on the test deployment's current build with the tooltip route: checker 0 failures, 28 of 28 mutations caught
main merged in (d20a79e; posts.json conflict with the property explainer Autumn Budget 2026 property income tax explainer #1460, both entries kept); the property paragraph links that explainer (04f2afd), whose figures match ours
Coordinator's cautions in c2713f8: poverty held until production is live and María has ruled on the unfloored poverty columns (Create Donate page #290); no reason given for the Carer's Allowance gap (its note's tax reason is being corrected) or the PTA gap (its data reason may be dropped); "official counts income tax only" cut
Max's voice sweep (via the voice-sweep session) in 4be0729: seven sentences to the active voice ("We leave out the savings income rate rise…", "We rank households into deciles…", "We hold our estimate back from this release…; it follows with that update")
Independent review r4 (GPT-6.1 Sol) of 02ae653, the whole comparison section on the OBR basis: REQUEST CHANGES. It found Tables 2, 3, 6 and 7, the labels, the certification wording, the PTA and Carer's Allowance figures and all seven notes correct. Dispositions:
8b913fc also: the energy payment's remainder ("about £2,100 million remains for the payment in England, and ours is 94% of that. At £100 each, the up to 20 million households the Budget names take up to £2,000 million of it; neither the OBR nor the Budget itemises the rest"), traced to the Budget and the OBR's single line for measure 1. The checker accepts both the release branch's note wording and dashboard Browser back button doesn't move backward through frames #303's (notes moved onto the OBR lines): 32 of 32 mutations caught with each
Coordinator, ~22:00Z: "What we're improving" (Max: "Use the widened text"), verbatim, before the methodology, in b800ea4; the checker traces it; poverty stays held (Max: the dashboard publishes tonight on the current model, poverty and people-affected columns out, one consolidated update later this week)
main merged in again (031898f; posts.json kept the briefing, the Carer's Allowance taper post Add blog post: the Carer's Allowance earnings taper in the Autumn Budget 2026 #1464 and the trading allowance explainer Autumn Budget 2026 trading allowance explainer #1463); in 6a14eb1 the trading allowance and Carer's Allowance paragraphs link those explainers (both live; their official figures and ours match the briefing's). Dashboard Browser back button doesn't move backward through frames #303 now prints the trading gap as £46 million, as the post does
Production (uk-autumn-budget-dashboard-2026#290 merged 22:01:45Z, live 22:02Z, revision 17): notes captured on www.policyengine.org,
run_production.shOK, checker 0 failures, comparables from production (Sol r4 finding 1)Delta review r5 (GPT-6.1 Sol) of 6a14eb1 on production: REQUEST CHANGES. It found every figure, the new section and both linked explainers correct, and r4's findings 4, 5 and 6 resolved. Dispositions:
fetchbefore navigation was tried first, but Chrome gives the navigated frame a fresh global, so it can't see the bytes;Max's rule, active voice in all writing, reduced passives included (28 Oct): 36 more rewrites in 819aa7f and 9e475c3, all in the wording, with no change to any figure, source or claim. Examples: "which Table 1 lists", "The 5p cut continues", "the government's costing, which the OBR certified", "with payments from January 2027", "Self Assessment payments can fall in a later year", "If we scale our estimate up to the OBR's fuel duty receipts". Where the article paraphrases a dashboard note's own passive wording, the checker traces the new phrase to the same rendered note. The checker now fails on be + participle and on reduced passives (for example "certified by" or "rounded to") outside the approved "What we're improving" text and the Nuffield credit. On production revision 17 it gives 0 failures
Delta review r6 (GPT-6.1 Sol) of the voice changes: REQUEST CHANGES. 32 of 36 pairs faithful. In a65a182:
CI green on a65a182 (10 of 10); 48 of 48 mutations caught
Delta review r7 (GPT-6.1 Sol) of a65a182 and the rebuilt capture: REQUEST CHANGES. It found r5 finding 2 (the manifest each render used), r5 finding 4 and all four r6 findings resolved, every changed sentence matching its source, and the checker at 0 failures. Dispositions:
Function.prototype.toString), andcap_to_hashes.pyrefuses a capture whose hash differs fromcapture_notes_v2.js(51b3185c… on both production runs)hiddenempty, note hashes identical to 22:38Z;run_production.shOK, checker 0 failures; gate tests 15 of 15, each now requiring its own PROBLEM linemain merged in again (0a8a96c: Carer's Allowance taper post: split the official-comparison paragraph #1484 split the Carer's Allowance taper post's official-comparison paragraph, docs: point the property post's dashboard links at main #1485 repointed the property post's links); posts.json keeps the briefing's card, and the briefing article is byte-identical to a65a182. Checker on the merged head: 0 failures
r5 finding 3, on the coordinator's call (a): b87ba4b adds one sentence to the Carer's Allowance taper post, after "This is the run behind the figures for this measure on PolicyEngine's Autumn Budget dashboard, split here into its parts.": "We will update the 2030-31 population estimates after correcting how the taper interacts with overlapping benefits, such as the State Pension." It turns the "What we're improving" bullet Max approved into a sentence, in the coordinator's exact wording
Delta review r8 (GPT-6.1 Sol) of the merge and the new sentence: APPROVE, no findings. The sentence resolves r5 finding 3 and reads cleanly where it sits; the merge brought in only Carer's Allowance taper post: split the official-comparison paragraph #1484 and docs: point the property post's dashboard links at main #1485; the briefing and its card are unchanged; the explainer's figures (£24m/£48m net, £39m/£79m before tax, £33m/£69m and £38m/£79m official) agree with the briefing's
Delta review r9 (GPT-6.1 Sol) of the capture and test fixes: REQUEST CHANGES, three blocking findings, all in the capture, which it found by modelling the code rather than on production: an inset shadow on the text's own
::aftercould hide it; the check compared text with a translucent background before compositing it; and the capture read its source hash from a shared global at the end, so an overlapping run could carry another run's hash. A separate completeness audit (GPT-6.1 Sol, 20261028-192833-briefing-audit) found eight more ways text could pass unseen: translucent backgrounds, lines laid over each other, pseudo-element paint, pointer events kept off with!important, inert covers, shadows beyond their hit bounds, text security, stroke, shadow or line-through, and covers between the sample points. The capture now fixes all eleven (source sha256 41e230fd…):::beforeand::afterbox in the frame from its style and grows it by its paint reach (shadows, outlines, filters, decoration);__capSuperseded(notes/race-prod-rev17-r10.json);Production, revision 17 (manifest 9685adc1), on deployment dpl_Ejrz4MQY at 00:15Z, and again on dpl_5kAvQud9 at 00:30Z after dashboard Move the text from the params setter to the middle of the screen #306 deployed:
hiddenempty and note hashes identical to round 7's;run_production.shOK with 0 checker failures; gate tests 16 of 16 (now including the race variant's hash); mutations 48 of 48.One self-test that I started 4 s after a reload stopped with an error when the tip closed. It failed closed, and the reruns ran clean.
Delta review r10 (GPT-6.1 Sol, 20261028-202928-briefing-r10) of all eleven fixes: REQUEST CHANGES. It found the three r9 findings resolved and every plant catching its mechanism, and four more blocking findings, all in the capture, by modelling the code rather than on production:
!important.Completeness audit r2 (GPT-6.1 Sol, 20261028-202928-briefing-audit-r10): thirteen more cases, none established on production, among them a backdrop filter, a translucent rounded background, border paint, fragmented backgrounds,
display: contentscontaining blocks, zero-height pseudo-elements, a hidden filtering wrapper, SVG text, overlapping-character identity and nested ordering.The capture now fixes all seventeen (source sha256 30cf3af8…):
::beforeand::afterboxes take pointer events too, and one that is positioned or forms a stacking context is placed by a hit test on its own box;Production, revision 17 (manifest 9685adc1), on deployment dpl_2zfd93yx at about 01:31Z, after dashboard One report creation button is called Create report, one is called Build report #310 deployed (Switch to sentence case throughout the repo #312 and Create report button on navbar doesn't work #311 before it):
hiddenempty and note hashes identical to rounds 7 and 10;run_production.shOK with 0 checker failures, and its output identical to round 10's; gate tests 16 of 16; mutations 48 of 48.The same code passed on dpl_At5xt27y, and the code one change before passed on dpl_46dvpJhY and dpl_At5x. One report creation button is called Create report, one is called Build report #310 deployed during one capture, splitting its years between two builds, and
cap_to_hashes.pyrefused it as designed.Delta review r11 (GPT-6.1 Sol, 20261028-214518-briefing-r11) of the capture fixes: running. It covers the capture tooling only, not the post, so it doesn't gate the merge (coordinator, with Max's go)
Completeness audit r3 (GPT-6.1 Sol, 20261028-214518-briefing-audit-r11): running, on the same terms
Max's go, relayed by the coordinator at about 01:50Z 29 Oct: "Briefing Autumn Budget 2026: post-Budget written briefing #1469 now", covering the briefing and the three wording changes beyond it (the Carer's Allowance explainer sentence, "where the Scottish Government has responsibility for Carer's Allowance", and the energy payment's "rising energy bills" clause). Head b87ba4b,
gh pr checksexit 0, MERGEABLE.Resume steps (steps 1–5 done again at 23:07Z on production revision 17 with the r7 capture; if production's revision changes before merge, repeat them)
https://www.policyengine.org/uk/autumn-budget-2026/data/manifest.jsonreturns 200 (it 404s until uk-autumn-budget-dashboard-2026#290 merges). Note itsrevision(N).https://www.policyengine.org/uk/autumn-budget-2026?tab=dashboard&sub=financesin the built-in browser and set its viewport to 1440x1000 (the capture lays a 1280-wide frame over the window and refuses a smaller one). Optionally run the self-test first:window.__capSelfTest = true;then the script; all 34caughtmust be true, andcontrolandafterempty.window.__capSelfTest = false, then paste~/reviews/budget-briefing-2026/scripts/capture_notes_v2.jsfromwindow.__cap = { status: "running" };to the end into the browser's JavaScript tool, unchanged (it returns "started").window.__capSourceSha256must equaluv run python scripts/capture_source_sha.py;cap_to_hashes.pyrefuses the capture otherwise. Pollwindow.__cap.statusuntil "done", about a minute. SaveJSON.stringify(window.__cap)to~/reviews/budget-briefing-2026/notes/cap-prod-revN.json. The full JSON includes thescriptslist, so read it in two calls if needed.~/reviews/budget-briefing-2026/scripts/run_production.sh notes/cap-prod-revN.json prod-revNfrom~/reviews/budget-briefing-2026. It must end "OK". It stops at the first failure: any note text not on screen, a missing note, a second build, a render under another manifest, text it can't recover, or any checker failure. Then runscripts/test_capture_gates.py --cap notes/cap-prod-revN.json --notes notes/notes-prod-revN.json(all ok).comparables-prod-revN.md, and rerunscripts/mutate_briefing.py(all caught).subfleet run --task review --tier hard. Arm asubfleet wait.gh pr checks 1469exits 0 andmergeableis MERGEABLE. Then report to the coordinator. Merge only on Max's yes relayed by the coordinator, or by Vahid or María at 07:00 UK. Never use--admin.🤖 Generated with Claude Code