Skip to content

Autumn Budget 2026 property income tax explainer - #1460

Merged
MaxGhenis merged 27 commits into
mainfrom
docs/uk-budget-2026-income-tax
Oct 28, 2026
Merged

MaxGhenis merged 27 commits into
mainfrom
docs/uk-budget-2026-income-tax

Conversation

@hua7450

@hua7450 hua7450 commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

The Budget announces a further two-percentage-point rise in property income tax rates from April 2027. This property-only explainer combines worked landlord examples with national microsimulation, including the increase in finance-cost relief.

PolicyEngine estimates £399 million of net government revenue in 2027–28, rising to £459 million in 2031–32. The post includes the annual Treasury comparison, household-income decile tables and a native bar chart. The opening flags the different collection-timing bases for 2027–28 and 2028–29. Household and decile averages include unaffected households.

Source and methodology: approved property-only artifact property_income_rates_up/7bf77b35e33233e0 from dashboard #290, pinned at 637bb26c. Receipt, approval, execution identity and all eight source CSV hashes were verified. Runtime: policyengine 6.11.1 / UK 2.151.0 / core 3.33.3; certified national dataset a6299504; October forecast on both sides. The supporting folder retains three aggregate CSVs, the unchanged original receipt and a provenance summary. No population H5 or household records are included.

Disclosure and public records: the post and property summary omit reach, poverty and inequality figures pending separate disclosure clearance. The copied metrics.csv and internal REVIEW_NOTES.md have been removed. Disclosure statements identify the tables actually covered by the recorded floor. The withdrawn population-preview/ folder and its verifier are removed entirely; public documentation and provenance point only to the retained approved property record.

Review and publication: ready for review at 5772c917d. Max confirmed that the dashboard-interface condition no longer applies, but publication still waits for #290 to merge. Then verify that the released property artifact matches the post, update results if it differs, and change reader-facing dashboard source links to main. Max's review of the revised head remains pending.

Validation: format, lint, type checks and 6,571 local tests pass (10 existing skips), on Node 26. Independent checks match the three retained CSV hashes, six annual table rows, 22 rounded decile cells and 20 raw chart values; git diff --check passes. Calculation code and retained household, revenue and decile values are unchanged.

Review preview

Related: dashboard PolicyEngine/uk-autumn-budget-dashboard-2026#290 and #292; trading #1463 stays stacked on this PR; savings #1466 remains a separate draft.

@vercel

vercel Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
policyengine-calculator-next Ready Ready Preview Oct 28, 2026 9:11pm UTC
policyengine-website Ready Ready Preview Oct 28, 2026 9:11pm UTC

Request Review

@MaxGhenis

MaxGhenis commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Trading allowance post: review at f581840

I reviewed the trading allowance article only (uk-autumn-budget-2026-trading-allowance.md); the savings and property post has its own seat. The calculations hold up. I reran #290's measure on the same bundle (policyengine 6.11.1 / UK 2.151.0) and got the same national figures: −112.11, −119.78, −112.59, −123.47 and −131.02 £m for 2027-28 to 2031-32. I also reproduced the three £4,000 examples (£400, £100, £0) and both chart series. Five suggestions, most important first, covering the seven checks in the review brief.

1. Show the Universal Credit interaction with a number.

  • The quote from HMRC's guidance is right: "Income for Universal Credit purposes is not affected by the allowances."
  • The tax cut still reaches Universal Credit. The model counts UC earned income after income tax (uc_earned_income, citing UC Regulations 2013 regs 55(5) and 57(2); uc_income_tax_on_trade), so lower tax raises UC earnings and UC falls by 55p per £1.
  • Example from the pinned model: a lone parent aged 40 in the North West on £18,000, with one child aged 6, renting privately at £9,000 a year and claiming UC, with £3,000 or more of side receipts (supplied) and no expenses, in 2027-28. Income tax falls £400, UC falls £220, and net income rises £180.
  • Corrected 15:45Z: at £1,500 of receipts the same household gets tax −£100, UC −£21 and net +£79. I haven't traced why UC falls by less than 55p per £1 there, so I've withdrawn the earlier attribution to the work allowance. With other inputs Ziming gets UC −£55 and net +£45. The £3,000-plus case (+£180), which both runs reproduce, is the one to show.
  • One row or a short paragraph would show where the gain is smaller.

2. Add a full-time sole trader.

  • The Treasury's static base is "taxpayers with income over £1,000 who already claim the maximum allowance" (costings p. 23). That includes full-time sole traders with low expenses, not only side businesses.
  • Example: £20,000 of receipts and £500 of expenses, no other income, 2027-28, receipts supplied. The allowance replaces the £500 of expenses, so taxable profit falls by £2,000. Income tax falls £400 and Class 4 £120 (6% above £12,570), so net income rises £520.
  • This also gives the National Insurance section a case where Class 4 changes.

3. Say which way the population limits push, and size the one that can be sized. The methodology section rightly says "overstate or understate". The national section quotes only the receipt's "can overstate". With no gross receipts in the data, the model:

  • relieves all of a profit up to £3,000. That overstates when expenses were under £1,000: for £1,500 of receipts with no expenses, the model gives £300 and the law £100.
  • gives no relief to a profit above £3,000. That understates, and these are the Treasury's static base. The sole trader in point 2 gets £0 under this approximation, against £520 with receipts.
  • gives no allowance on miscellaneous income, which only understates. As an upper bound on the same bundle, treating every positive miscellaneous_income as eligible with no expenses, the rise from £1,000 to £3,000 on it would add about £71m in 2027-28. The input is "income from any other source", wider than ITTOIA Part 5 Chapter 8, so the true figure is lower.

Together with behaviour, these let the Treasury section say which way each difference runs, even though the net gap isn't attributed.

For the same reason, Class 4 is £0 in every year of the population run: the only profits relieved are £3,000 or less, below the £12,570 lower profits limit. The national figure is therefore income tax alone: −£115m in 2027-28, less about £3m clawed back through means-tested benefits, gives −£112m. The dashboard's expected-effects note says Class 4 falls. That holds in law and for the sole trader above, but not in the population run.

4. Rounding and voice (Max's checks 7 and 4).

  • Whole pounds (rule revised by Max at about 15:55Z): whole pounds everywhere, worked household tables included; pence only where a post spells out a formula. The decile table and the prose around it use pence (+£0.83 … +£8.57, "£3.83", "£8.57"). In whole pounds, deciles 1 to 10 read +£1, +£3, +£1, +£0, +£2, +£3, +£6, +£9, +£6, +£7, and all households +£4.
  • Pipeline terms: "receipt", awaiting_source, "manifest", "source commit 0d9dccb2" and the "Draft status" paragraph are build records, not reader-facing terms. The writing guide asks for finished work introduced fresh, with development history kept in supporting records such as REVIEW_NOTES.md. Suggest "the dashboard's estimate (28 October)" in the text, and the commit and dataset ids in the methodology only.
  • Opening: the first paragraph gives the £400 example but no national figure. One sentence with the model's £112m static cost in 2027-28 next to the Treasury's −£225m in 2028-29 would open with the key result.
  • Loss claim: the linked HMRC page says "you cannot … create a loss" in its property allowance section. A trading-specific source (ITTOIA 2005 Part 6A, or BIM86000 onwards) would support it for trading.
  • Reach: the government publishes no reach figure for this measure (Table 6.1, the costing note and the households annex give none), so there is nothing to compare against. Saying so would close check 2.
  • Already fine: sentence-case headings, a number for every claim, no prescriptions or superlatives, and the model version and assumptions stated.

5. Smaller points.

  • BIM86052: it is HMRC's Business Income Manual, not National Insurance guidance.
  • Sources in the first paragraph: link Table 6.1 (row 15) on the supporting documents page and cite Budget ¶6.254 next to the rule.
  • Preview links: the ab2026-local-preview.vercel.app links point to a preview deployment. Swap them for the published dashboard's artifacts before publishing.
  • Treasury table: consider labelling the columns "by fiscal year (receipts)" and "by tax year (liability)", or adding one factual line. The balancing payment for 2027-28 Self Assessment is due on 31 January 2029 (gov.uk). That explains the difference without asserting the Treasury's reasoning, which the costing note doesn't give.
  • Counts: the exports lack an absolute count. On the same bundle, about 260,000 people pay less income tax in 2027-28, resting on 441 survey records, well above the disclosure floor. Use it if a count helps, labelled as an internal run rather than a dashboard export.

Everything else I checked holds:

  • the worked examples and arithmetic;
  • the 75%-expenses series, including the drop to zero at £4,000;
  • the Class 4 limit statement;
  • the exclusions for partnership, employer and connected-party income (HMRC guidance);
  • Table 6.1 row 15;
  • the decile averages: £3.83 across about 29m households matches the £112m cost.

The worked examples follow the post's own scope and isolate the allowance, so points 1 and 2 are additions, not corrections. I made the runs behind this review on the dashboard branch at ad32af7f. #290's trading allowance code is the same at its current head.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor

Savings and property post: review at f581840f

I reviewed only the savings and property article (uk-autumn-budget-2026-savings-property-income-tax.md) and its analysis files; the trading allowance article has its own review above. The calculations hold up:

  • I recomputed every household table: savers, landlords, and the band-crossing case (£8,582 to £8,732).
  • The national figures (£664m to £793m) match my own run of Create Donate page #290's measure on the same bundle to within £0.1m.
  • The two Scotland points match what I found in the code and a run on Create Donate page #290 (comment): the property rates don't reach Scottish taxpayers, and finance cost relief rises to 24% for everyone, Scottish landlords included.

Nothing here changes a figure. Before publication:

1. Round to the pound (Max's rule from 15:15Z: pence only in a worked calculation).

  • Line 156: "£22.67 across all households" should be £23, and "£107.13" should be £107.
  • The decile table (lines 160-170) is a summary table, so use whole pounds: −£13, −£6, −£7, −£7, −£6, −£9, −£11, −£22, −£37, −£107; all households −£23.
  • The band-crossing table (lines 144-148) is a worked calculation, so its pence can stay.

2. Say "in England" in the opening. Line 3's landlord "pays £120 more" holds in England, Wales and Northern Ireland. The same landlord in Scotland pays £80 less: their property income stays at Scottish rates, and their relief rises by 2 points on £4,000, as line 134 says. Something like: "A landlord in England with £10,000 of property profit and £4,000 of mortgage interest pays £120 more; in Scotland the same landlord pays £80 less."

3. The reconciliation can say where the gap is. Line 185 says reconciliation hasn't established the source of the gap. I split #290's measure into its parts on the same run; it reproduces the preview's totals. All figures are £m:

2027-28 2028-29 2029-30 2030-31 2031-32
PolicyEngine: property, after finance cost relief +396 +410 +425 +441 +455
Treasury: property (Table 6.1 row 61) +35 +575 +435 +445 +455
PolicyEngine: savings +269 +286 +303 +322 +339
Treasury: savings (row 62) +125 +555 +520 +555 +590
  • Property is within £10m of the Treasury from 2029-30.
  • Savings is about 58% of the Treasury's figure from 2029-30, about £220m to £250m a year less. That is nearly all of the gap. The Treasury's savings figure is already net of the move into ISAs, so the static difference is larger still. The model's taxed savings base looks smaller than HMRC's base, which comes from the Survey of Personal Incomes (costing p. 75).
  • The higher finance cost relief takes £209m to £253m a year off the property figure.
  • Scotland: £15m to £18m of that relief goes to about 46,000 Scottish landlords. Their property income stays at Scottish rates, so for them the relief rise is a tax cut. A national sentence beside line 134's £80 example would help.

If you'd rather publish the split from the dashboard itself, ask Vahid for a by-component export; the figures above are from my run, recorded on #290.

4. Line 185's receipts claim has no source. "These government receipts forecasts differ from annual household liabilities" and "Tax-year liabilities and fiscal-year receipts forecasts also differ in timing" describe how the Treasury scores the measure. Neither the costing notes (pp. 74-75) nor Table 6.1 says so, and the costing notes don't explain the 2027-28 to 2028-29 profile. Either cite a primary source or say only that the costing notes don't explain the profile. The 2026-27 savings figure of +15, before the rates start, is unexplained too.

5. Compare reach with the government's own figures. Budget 2026 paragraph 2.50 says "84% of income tax payers will be unaffected" and "Around half of the revenue raised from this change is expected to come from the top 10% of households".

  • The decile table already supports the second: the top decile's average (£107) is 48% of the sum of the ten decile averages.
  • The 10.67% affected-people figure isn't comparable with the first, because it counts people in households, not taxpayers. Say so beside it.

6. Explain decile 1. The lowest decile loses £13 on average, more than deciles 2 to 7. That is −0.050% of income, against −0.011% to −0.017% for deciles 2 to 7. The PolicyEngine writing checklist asks for counterintuitive results to be explained. Find out from the run which households drive it; for example, people with low net income but property or savings income. Don't guess the reason.

7. Cite the paragraphs.

  • Rates, start date and geography: Budget 2026 paragraphs 6.246 (property: "These rates will apply across England, Wales and Northern Ireland") and 6.247 (savings: "across the UK").
  • Line 119's "the relief follows the property basic rate": the policy costing p. 74 ("Finance cost relief will continue to be aligned to the property basic rate") and ITTOIA 2005 s. 274AA(5). Line 134 already links FA 2026 Sch. 1 para. 40.
  • Line 9's Budget 2025 rates (22%, 42%, 47%): link the technical note line 17 already cites.
  • Line 185's link text "#page 74-75" should read "pages 74 and 75".
  • For line 134, it's worth adding that the Budget documents don't say whether Finance Bill 2026-27 changes the Scottish relief.

8. Links and draft labels.

  • Lines 154, 156, 172 and 193 link ab2026-local-preview.vercel.app. Swap these for the public dashboard (line 5 already uses policyengine.org/uk/budgets/autumn-2026) once its artifacts are live.
  • Line 191 links reforms.py at b50787aa. Link the commit the dashboard publishes from.
  • The checklist asks for finished work without development history, so take these out of the published text and keep them in REVIEW_NOTES.md:
    • "generated on 28 October at 14:34 UTC" (line 154);
    • awaiting_source, "preview manifest", "execution receipt" and the dataset and commit ids (lines 193 and 197).

9. PolicyEngine writing checklist, the rest.

  • Open with the national figure. The opening has the household examples but not £664m against the Treasury's £160m (£955m by 2029-30). One sentence would do.
  • Self-reference. Cut "This post examines this provision on its own" (line 5) and "The comparison here therefore measures" (line 9).
  • Superlative. "The largest average cash loss is in the highest income decile" (line 156) could read: "Households in the top decile lose £107 on average."
  • The heading at line 174 picks the Treasury's peak year. "The Treasury's costing: £160 million in 2027-28, £1,045 million by 2031-32" reads more evenly.
  • Already fine:
    • sentence case;
    • tables for the data;
    • the model version and assumptions (lines 189-195);
    • the limitations;
    • no prescriptions;
    • behaviour stated for both Treasury figures and left out of the model's.

Disclosure: the decile cells come from the receipt's passed floor of 3 survey households. The figures above that aren't in the article are aggregates; the smallest, Scottish landlords' relief, rests on 170 survey people.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor

Savings and property post: matching the dashboard's example household

Max asked for the post's households and the dashboard's example households to roughly match. The dashboard's savings and property example is landlord-saver in dashboard #292. I listed this post's households beside it on #292: PolicyEngine/uk-autumn-budget-dashboard-2026#292 (comment)

The match is your band-crossing household ("When property income pushes savings into a higher band": £45,000 salary, £6,000 property profit, £2,000 interest).

  • Entered in the dashboard calculator (Geography page doesn't display properly #292's route at 93021f77, this measure alone, 2027-28), it gives −£150, the same as your +£150 of tax.
  • I've recommended that landlord-saver adopt it. That is María's change, on Geography page doesn't display properly #292. If she does, two things for this post:
    1. Add a link under the table, such as: "Try this household in the Budget dashboard's calculator."
    2. Explain the totals. The calculator takes a salary for 2026-27 and grows it with average earnings, to £46,080 in 2027-28. So its tax totals (£9,014 to £9,164) differ from your table's (£8,582 to £8,732), and less of the property income sits in the basic band. Each band rises 2 points, so the change is the same £150. One sentence saying so would stop a reader who checks it from seeing a mismatch.

The landlords with a mortgage can't be entered in the calculator, because it has no input for finance costs. That covers the opening landlord, the two landlords in the table and the Scottish landlord in line 134. Keep them as the post's own illustrations of finance cost relief. Say beside the first one that the calculator doesn't take finance costs, so its landlord example has none.

Everything in my earlier review (rounding, "in England", the property/savings split and the rest) still stands.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor

Trading allowance post: matching the dashboard's example household

Max wants the posts' households and the dashboard's example households to roughly match. I proposed the post's lead case for the dashboard's trading allowance example in slot 7 of #292 (PolicyEngine/uk-autumn-budget-dashboard-2026#292 (comment)):

  • aged 35, £30,000 salary, £4,000 of side-business receipts and £500 of expenses;
  • on Geography page doesn't display properly #292's household API code it shows +£400 in every year from 2027-28 to 2031-32, the post's own figure.

@hua7450, could you keep that case as the post's lead worked example, and name it so the dashboard can match it? Its inputs are aged 35, £30,000, £4,000 of receipts and £500 of expenses, with no benefits.

  • Keep it as the first row of the three-person table.
  • If you add the Universal Credit or full-time sole trader rows from my earlier comment, add them beside it rather than in its place.
  • The dashboard's version differs only in ways that don't move the £400: it is in the North West, its salary grows with earnings each year, and it includes the other measures through its spending.

🤖 Generated with Claude Code

PavelMakarchuk and others added 2 commits October 28, 2026 11:39
BlogLineChart.tsx draws series against a numeric x axis, with step
series, markers labelled in a strip above the plot, an x axis format, a
y axis fitted to the data on request, and a y axis width that follows
the tick labels. blogChartUtils gains a thousands separator, a niceTicks
option that leaves zero out, and validFormat. Bar charts take
"valueLabels": false when several series make the labels overlap.
chart-standards.md documents both. Used by the Budget 2026 posts
(#1457, #1459).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first x tick label no longer touches the lowest y tick label at the
plot's corner, and the legend sits clear of the x axis title. Checked on
every chart in the PTA post at 1280 and 375 pixels wide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450 hua7450 changed the title Draft Autumn Budget 2026 savings/property and trading allowance explainers Draft: Autumn Budget 2026 savings and property income tax explainer Oct 28, 2026
@MaxGhenis

Copy link
Copy Markdown
Contributor

Savings and property post: checked at 5a70185a

Thanks, Ziming. This revision covers my review:

  • whole pounds;
  • the national figure in the opening;
  • "in England", plus the Scottish landlord's −£80;
  • the receipts claim dropped;
  • the reach figures with their different denominators;
  • decile 1 flagged as open;
  • the calculator note.

The calculator figures match my run on #292's route: £46,080, £9,014 to £9,164, and £150. Footnote 74's description (the Survey of Personal Incomes 2023-24, projected to 2027-28 and mapped onto household deciles with the Treasury's Distributional Analysis model) matches the Budget document.

I withdraw my 48% point. You're right: the deciles hold roughly equal numbers of people and the cash figures are household means, so the top decile's mean over the sum of the means isn't a share of revenue. Leaving it out is correct.

Two small things left:

  • Paragraph citations. The opening's rates, start date and geography still link the whole Budget document. Linking paragraphs 6.246 (property: England, Wales and Northern Ireland) and 6.247 (savings: UK-wide) would pin them.
  • The component split. Your notes want a component CSV with a receipt before the article states it. That's fair. The simplest route is to ask Vahid to export property income tax, finance cost relief and savings income tax for this measure in the final regeneration. My run's split, in my comment on Create Donate page #290, can serve as the cross-check.

The preview links are already on your list.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor

Savings and property post: one correction to my review

Max has revised the rounding rule (about 15:55Z): whole pounds everywhere, worked household tables included. Pence stay only where the post spells out a formula in prose. So my earlier note that the band-crossing table "can keep its pence" no longer holds. Rounded, the table still adds up:

Income tax component, 2027–28 Before After
Salary: £32,430 at 20% £6,486 £6,486
Property: £5,270 at 22% / 24% £1,159 £1,265
Property: £730 at 42% / 44% £307 £321
Savings: £1,500 at 42% / 44% £630 £660
Total income tax £8,582 £8,732

Separately, #290 now splits the measure in two: property_income_rates_up (row 61) and savings_income_rates_up (row 62). That doesn't affect this post, which can keep covering both. Once their figures are published, they should come to about +£396m to +£455m for property and +£269m to +£339m for savings (2027-28 to 2031-32, from my run). That gives the article the property and savings split with a source.

🤖 Generated with Claude Code

hua7450 commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor Author

@MaxGhenis Applied the optional public-wording cleanup from your latest review in 5772c91:

  • The article now says “This post does not report poverty, inequality or people-affected estimates.”
  • Removed the README's temporary new-head review wording.
  • Replaced browser-approval history with the reader-facing limitation that rendered desktop/mobile layout has not been checked.

Only these wording changes are included; calculation records and all article figures are unchanged. Format, lint, typecheck and all 6,571 local tests pass (10 existing skips), plus the source numeric check and git diff --check. Trading is synced at 686bedd, with its own article unchanged. The two source/release checks after dashboard PR #290 merges remain pending.

Max's rule (28 Oct): cite primary sources. Compare PolicyEngine with the
income tax line of measure 61 in the OBR's detailed policy table (Table
1.1, policy.xlsx sha256 cdcc2a06): 0, 0, 539, 394, 403, 412 £m. Table
6.1's total (the lines rounded to the nearest £5m) stays as context, and
the other lines are named by the table's own labels. From 2029-30 the
estimate is 9%, 10% and 11% above that line (unrounded figures).

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

Copy link
Copy Markdown
Contributor

2afba8599: comparison now against the OBR's income tax line

@hua7450 I pushed one commit on top of 5772c917d. It applies a rule Max set tonight: cite primary sources. The comparison is now with the income tax line of the government's costing, certified by the OBR, and Table 6.1's total stays as context.

Source: the OBR's detailed policy table (October 2026 EFO detailed forecast tables, policy.xlsx, sheet 1.1, measure 61, rows 297 to 302, SHA-256 cdcc2a06…).

£ million 2026–27 2027–28 2028–29 2029–30 2030–31 2031–32
Income tax 0 0 539.10 394.29 403.38 412.24
Onshore CT 0.23 2.04 4.09 6.03 8.10 10.25
Scottish BGA (current) 0 26.62 26.98 27.44 27.91 28.75
Scottish self-financed expenditure 0 5.20 5.29 5.41 5.52 5.70
Total 0.23 33.86 575.47 433.16 444.91 456.93

Table 6.1 rounds those totals to the nearest £5 million: 0, 35, 575, 435, 445, 455.

What changed in the article

  • Key figures, line 9: the costing's income tax line (£394 million to £412 million a year from 2029–30, £539 million in 2028–29, none in 2027–28), with the Table 6.1 total after it.
  • The note under the key figures: adds that from 2029–30 our estimate is 9% to 11% above that line.
  • Budgetary impact:
    • It names the line we compare with and the other lines by the table's own labels.
    • The table gains an OBR income tax column, and Table 6.1's total moves to the last column.
    • The later-year labels are now 9%, 10% and 11% higher, computed from unrounded figures (429.40 / 394.29, 445.56 / 403.38, 459.49 / 412.24).
  • Line 73: "£35 million, or about 9%, above the OBR's £394 million income tax line" in 2029–30, replacing "£6 million below the Treasury's £435 million".
  • Line 79: "even where the rounded estimates are close" no longer holds, so the gap is now described as not yet explained, with no attribution to any one cause.

The analysis README (property-population/README.md line 27) records the line, the file hash and the totals.

Unchanged: every PolicyEngine figure, the household examples and the chart.

Checks: the post and chart tests pass (18). The new OBR link is the download page for the detailed forecast tables; obr.uk returns 403 to scripts, as it does for the other posts that link it.

If you'd like different wording, edit freely. An independent review of this commit is running. The merge still waits on #290 and Max's read.

🤖 Generated with Claude Code

…same scope

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

hua7450 commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

Renamed only the opening label to “Key figures” in 91f812f, on top of your comparison clarification at 4796551. No figures or other article wording changed. Format, lint, typecheck and all 6,571 local tests pass (10 existing skips). Trading #1463 is synced at 3cb9b8b, preserving its latest article edits unchanged.

hua7450 commented Oct 28, 2026

Copy link
Copy Markdown
Contributor Author

@MaxGhenis Our property blog's national figures already match the approved results in dashboard PR #290. Could we merge #1460 before the dashboard PR, using that verified snapshot, as we did for the other Budget posts?

I checked blog head 91f812f9a against dashboard head 7157ceaa: all 6 PolicyEngine annual revenue cells, 22 rounded decile-table values, 20 raw chart values and all three retained CSV files match. The receipt, dataset/model identity and approval also match. I then rechecked the dashboard's current head 2d877f903: manifest revision 17 still approves the identical property artifact 7bf77b35e33233e0, with unchanged receipt/output/execution identities. No figure update or microsimulation rerun is needed for the current approved snapshot.

The PTA post #1457 and energy post #1461 were cleared after their figures were checked against the dashboard run, before the dashboard PR merged. Could we use the same approach here, subject to your final review and the required checks?

The existing immutable source links work now. We can switch the reader-facing links to dashboard main and confirm the deployed artifact in a follow-up after the dashboard merges. If the approved property artifact changes before publication, we will reconcile the post again.

MaxGhenis and others added 2 commits October 28, 2026 17:09
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

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

Approving on Max's go, relayed by the Budget coordinator: "Merge after the line-13 fix". The line-13 fix is 0620d73d.

Checked at this head:

  • Figures: property artifact 7bf77b35e33233e0 is approved in dashboard manifest revision 17 (vahid-ahmadi, 18:29:07Z). Its folder is byte-identical from the post's pinned commit 637bb26c to dashboard #290's current head 64b36b8a, and the receipt is 20df7073.
  • Revenue: the figures match that artifact: 0, 399, 412, 429, 446 and 459 £m.
  • No poverty or reach figures: the post has no poverty, inequality or people-affected figures; line 188 says it does not report them.
  • OBR line: the comparison is with the OBR's income tax line (detailed policy table, Table 1.1, measure 61): +8.9%, +10.5% and +11.5% from 2029–30. Table 6.1 is given as context.
  • Line 13 now reads "where we publish estimates for the Budget measures we model", because the live dashboard doesn't show property yet.
  • Review and CI: an independent review of every change since 2afba859 agreed, and CI passes at this head.

Follow-ups after dashboard #290 merges:

  • Move the reader-facing source links from 637bb26c to dashboard main.
  • Confirm the deployed artifact is still 7bf77b35.

The trading allowance link in line 13 resolves once #1463 merges.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis merged commit 018ea75 into main Oct 28, 2026
10 checks passed
@MaxGhenis

MaxGhenis commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

@hua7450 Max said yes to merging before dashboard #290: "Merge after the line-13 fix". I pushed that fix in 0620d73d: line 13 now says "where we publish estimates for the Budget measures we model", because production's dashboard doesn't show property yet.

There's also one style commit, d17842fe, from Max's rule tonight that "is above" becomes "exceeds". It rewords two sentences and changes no figures.

I checked your snapshot claims against #290's newest head 64b36b8a: revision 17 still approves 7bf77b35, and the artifact folder is byte-identical. It merged at 21:19Z as 018ea750, after CI and an independent review passed at 0620d73d.

After #290 merges:

  • Move the reader-facing links from 637bb26c to dashboard main.
  • Confirm the deployed artifact is still 7bf77b35.

I'll do both, or tell me if you'd rather.

🤖 Generated with Claude Code

MaxGhenis added a commit that referenced this pull request Oct 28, 2026
* Draft Autumn Budget 2026 savings/property and trading explainers

* Add provisional dashboard population results to draft explainers

* Clarify income bands and prepare draft review handoff

* Add a line chart type for blog posts, and valueLabels for bar charts

BlogLineChart.tsx draws series against a numeric x axis, with step
series, markers labelled in a strip above the plot, an x axis format, a
y axis fitted to the data on request, and a y axis width that follows
the tick labels. blogChartUtils gains a thousands separator, a niceTicks
option that leaves zero out, and validFormat. Bar charts take
"valueLabels": false when several series make the labels overlap.
chart-standards.md documents both. Used by the Budget 2026 posts
(#1457, #1459).

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

* Keep savings/property post and shared analysis in base draft

* Keep line chart axis labels, axis title and legend apart

The first x tick label no longer touches the lowest y tick label at the
plot's corner, and the legend sits clear of the x axis title. Checked on
every chart in the PTA post at 1280 and 375 pixels wide.

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

* Add standalone trading allowance explainer with UC and sole-trader cases

* Pin Budget paragraph citations and record latest review decisions

* Use agreed UC example and cite the Budget trading paragraph

* Round savings/property worked table to whole pounds

* Round sole-trader worked table to whole pounds

* Flag pending replacement of regenerated national results

* Mark national snapshot as awaiting reconciled replacement

* Align budget explainers with PTA forecast and chart methodology

* Match trading explainer to PTA structure and line charts

* Trading allowance post: cut the model's national figures until the final run

The national figures came from preview run 230c4665427e0bb1, which the
final regeneration replaces, so they are cut (MERGE.md gate 2). The
Treasury costing keeps Table 6.1 row 15 and the timing explanation, and
links the dashboard for PolicyEngine's estimate, whose 2027-28 figure is
marked not comparable (Self Assessment timing, mapping.csv).

Also drops the draft review note and the sentence about a proposed
dashboard example the dashboard does not have, links the dashboard's
canonical URL and the analysis folder on main, and names the lone parent
in the £1,500 limitation case.

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

* Trading allowance post: name PolicyEngine's estimates where the cut left them implicit

After the national figures were cut, say whose estimates the coverage
limits describe, drop the claim that the dashboard already shows the
cost, describe Table 6.1's 2027-28 entry as no receipts effect, and
name the baseline and reform in the methodology.

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

* Clarify trading allowance exclusions and dashboard introduction

* Format merged blog metadata

* Add illustrated trading allowance cover

* Add illustrated savings and property cover

* Clarify cover image provenance

* Split property income tax explainer from savings draft

* Clarify property sources and shared household methodology

* docs: clarify budget household generator scope

* Trading allowance post: remove the unused SVG cover

posts.json uses uk-autumn-budget-2026-trading-allowance/cover.webp, and
nothing in the repository references the SVG. #1460 removed its unused
SVG the same way.

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

* docs: add property microsimulation to Budget explainer

* docs: address property microsimulation review feedback

Clarify the timing comparison and landlord residence. Remove internal review notes and uncleared reach, poverty and inequality outputs while retaining verified national revenue and decile results.

* docs: remove withdrawn microsimulation previews

Drop the old combined savings/property and trading preview aggregates, their verifier and public references. Keep the approved property-only revenue and decile microsimulation unchanged.

* docs: remove internal review-status wording

* docs: compare property estimate with the OBR's income tax line

Max's rule (28 Oct): cite primary sources. Compare PolicyEngine with the
income tax line of measure 61 in the OBR's detailed policy table (Table
1.1, policy.xlsx sha256 cdcc2a06): 0, 0, 539, 394, 403, 412 £m. Table
6.1's total (the lines rounded to the nearest £5m) stays as context, and
the other lines are named by the table's own labels. From 2029-30 the
estimate is 9%, 10% and 11% above that line (unrounded figures).

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

* docs: cite the OBR's policy breakdown for the trading costing

Compare with the government's costing, certified by the OBR, on the
Income tax and NICs lines of the OBR's Table 1.1 (measure 15), which
match the taxes the post's examples cover: 221, 165, 171 and 178 £m from
2028-29. Table 6.1's rounded total stays as context, with the other
lines named by the table's own labels (about £2m a year).

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

* docs: say the OBR income tax line is the closest comparison, not the same scope

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

* docs: define NICs and quote Table 1.1's line labels in the trading costing

Review fixes: the 93% income tax share holds from 2028-29 (the line is
zero before), NICs is spelled out at first use, the other lines carry the
table's own labels in quotes, and the policy costings are noted as showing
Table 6.1's rounded figures.

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

* docs: broaden property explainer key figures heading

* docs: point to the dashboard for the Budget measures we model

Production doesn't show the trading allowance until the dashboard's
next deploy, so the line no longer says the dashboard has "this" measure;
same wording as the property post's fix.

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

---------

Co-authored-by: PavelMakarchuk <pavel.ma99@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Max Ghenis <mghenis@gmail.com>
@PavelMakarchuk

Copy link
Copy Markdown
Contributor

Post-merge audit of the property income tax post (article on main after #1478; live page checked at 1280 and 375 px). I checked the rules against the Budget, the costings, FA 2026 and HMRC, re-derived every household figure by hand, re-ran them on policyengine-uk 2.151.0, and checked the revenue and decile cells against the artifact CSVs and the Treasury/OBR figures. No factual errors.

Must fix

  1. The dashboard and the post now give different verdicts on the same comparison (lines 9–11, 62–79). Since Create Donate page #290 merged (22:01Z), the dashboard's public/data/official_costings.json says "From 2029-30 the two agree within 1.5%", against the Table 6.1 total. The post compares with the income tax line only and says PolicyEngine exceeds it by 9% to 11%, with the later-year gap "not yet explained". Both are correct:

    • against the Table 6.1 total: 429.40/435 = −1.3%, 445.56/445 = +0.1%, 459.49/455 = +1.0%;
    • against the income tax line (OBR Table 1.1): 429.40/394.29 = +8.9%, 445.56/403.38 = +10.5%, 459.49/412.24 = +11.5%.

    Suggest one sentence in the post that gives the Table 6.1 total comparison too, or a dashboard note that names its comparator.

Should fix

  1. Links still pinned to 637bb26c (lines 58 and 199, property-population/README.md). Create Donate page #290 merged as 57095fde; main's manifest (revision 17) still holds property_income_rates_up/7bf77b35e33233e0, so no figure changes. The move to main is now due.
  2. Withheld figures are one click away (line 58). The linked artifact folder contains metrics.csv (people_affected 5.94% in 2027, poverty_change_pp +0.00136) and poverty_inequality.csv. Link the receipt only, or decide that this is acceptable.
  3. Attribution (lines 64, 73). "OBR income tax line" attributes the Treasury's costing to the OBR. Suggest "Costing: income tax line (OBR Table 1.1), £ million" and "the costing's income tax line". Lines 9 and 62 already say this correctly.
  4. Line 79 can name the documented method differences and still leave the gap "not fully explained":
    • base: the Treasury uses "HMRC administrative data from the 2024-25 Self Assessment returns" (costings p. 74); the post uses the Microcosm survey-based dataset;
    • growth: the Treasury uses the OBR's property income forecast; policyengine-uk 2.151.0 uprates property_income with obr.per_capita.gdp. The income tax line grows 2.2–2.3% a year from 2029-30 (394.29 → 403.38 → 412.24) and ours 3.1–3.8% (429.40 → 445.56 → 459.49), which is why the gap widens from 9% to 11%;
    • behaviour: the costing's incorporation response is "expected to be limited" (Onshore CT +£2m to +£10m).
  5. Data description (lines 58, 187, 197). The post does not explain "certified Microcosm UK dataset", whether property income and finance costs are reported, imputed or calibrated, or that the calibration is pre-Budget (receipt calibration.status: "pre_budget"). Suggest one limitation bullet on survey under-recording of property income.
  6. The decile pattern needs one sentence (lines 83–98). Decile 2 (−£5.33) loses more than decile 5 (−£4.48) in 2027-28, and decile 6 falls from −£6.55 to −£2.83 by 2031-32 while deciles 7–10 rise. Suggest naming sampling variation (few landlords per decile) and landlords with low other income in low deciles.
  7. 375 px: the landlord table (369 px) and the budgetary table (371 px) overflow the 343 px column; page scroll width 388 px. Probably the site-wide table renderer (no scroll wrapper); the trading allowance post has the same issue.
  8. The analysis README linked at line 199 is stale: line 25 "Recheck … before merging", lines 39–43 pre-publication checklist, line 51 "The rendered page layout has not been checked".

Nice to have

  • Line 1: the Budget PDF URL now 301-redirects to /media/6ae20b85…/; use the new URL so #page=142 holds.
  • Line 62: link the Table 6.1 xlsx directly; cite the costings document for "National Accounts basis"; expand "BGA" and "Onshore CT".
  • One term each for the cost ("finance costs" vs "mortgage interest") and the relief ("finance-cost relief" vs "mortgage-interest relief").
  • posts.json description: add the national estimate; "two-percentage-point" hyphenation to match line 1.
  • Wales: property rate − 10 + Welsh rate (FA 2026 Sch. 1 para. 3) gives the same 24/44/49.
  • property-population/README.md says manifest revision 14; the approval and main are revision 17 (same artifact).

Verified as correct

  • Rules: 24/44/49% from 6 April 2027 in England, Wales and NI (Budget ¶6.246, p. 142; ¶2.50 "a further two percentage points"); 22/42/47% baseline; ordering other → property → savings → dividends; finance-cost relief at the property basic rate (costings p. 74; FA 2026 Sch. 1 para. 40 amends s.274AA(5), s.274C(2)), with no Scottish exception.
  • Households (2027-28, PA £12,570, band £37,700): £30k landlord 1,320 → 1,440 (+£120); £60k landlord 3,320 → 3,440 (+£120); mortgage-free +£200; Scotland −£80, £0 without finance costs; £6,000 example +£120. policyengine-uk 2.151.0 reproduces each exactly; Wales and NI give +£120.
  • Revenue: budgetary_impact.csv 0 / 399 / 412 / 429 / 446 / 459 ✓. OBR Table 1.1 measure 61 (file hash cdcc2a06…, as Max cited): income tax 0 / 0 / 539.10 / 394.29 / 403.38 / 412.24; totals round to Table 6.1's 0 / 35 / 575 / 435 / 445 / 455 ✓. The payments-on-account timing explanation (lines 75–77) agrees with HMRC and ONS.
  • Method: the reform raises gov.hmrc.income_tax.rates.property.* by 0.02 from 2027, static; the October overlay on both sides; receipt versions and dataset a6299504 match line 197.
  • Deciles: all 20 chart values equal winners_losers.csv; all 22 table cells round correctly.
  • docs: active voice in the property income tax post #1478: voice changes only. Links return 200 except obr.uk.

Not checked: obr.uk (403; checked from a hash-matched local copy instead), the population rerun and the Microcosm landlord coverage (private data), and the Finance Bill 2026-27 text (not published).

🤖 Generated with Claude Code

This branch was successfully deployed

2 active deployments
Preview – policyengine-website — 0620d73d Deployed Oct 28, 2026 by vercel[bot]
Preview – policyengine-calculator-next — 0620d73d Deployed Oct 28, 2026 by vercel[bot]
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.

4 participants