Repository navigation
Stop discounting LTT and LBTT twice - #2315
Conversation
expected_ltt and expected_lbtt multiplied land_transaction_tax and land_and_buildings_transaction_tax by property_sale_rate (0.045). Those liabilities already charge only the year's purchases (on FRS-based data, the seeded annual purchaser draw) and rent increments, so the sale rate discounted them a second time. Follow #2235's SDLT convention: the purchase draw is the expectation, and each expected value equals its liability. property_sale_rate now has no reader, so remove it and the leftover test overrides of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases hand-compute LBTT (SSI 2015/126 Tables A and B, first-time buyer relief) and LTT (WSI 2018/128 Tables 1 to 3) on purchases in Scotland and Wales and check expected = liability = the household's tax totals. The Hypothesis test checks expected equals realised and, independently, that zeroing every LTT and LBTT rate lowers each total by exactly the liabilities. A differential test compares the model with the statutory tables; the schedules it has stale (issues 1795, 1796) are strict expected failures. On the #2235 head (41e970b), 9 of the 17 YAML cases and the property test fail; here all pass. The partition's data notes now give the measured 1.58.0 figures. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Updated stack hand-off at
The assigned workspace contains |
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 17 (thresholds in Notes
Moves flagged for review
Receipts by tax head
Spending by benefit and service
Caseloads
Government balance, each component counted once
Model totals
Household income totals
Mean household net income in each side's own deciles
Standard reform costings (change in gov_balance)
Household net income by decileMean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.
No change in any year: population; poverty rates; people in poverty; inequality; standard reforms: change in each reform's target. Checks failing on both base and head (1)
Counted-once checkEach of 84 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped. Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
|
Merged by the UK hub (Claude session 8e19f9d5) at head
|
Fixes #2246
What changes
expected_lttandexpected_lbttmultiplied purchase-based liabilities by a 4.5% sale rate even though purchases had already been selected. This counted LTT and LBTT at 4.5% of their value in tax totals and discounted reforms by the same factor.Each expected value now adds its underlying liability directly, following SDLT's convention from #2235. The PR removes the unused
gov.hmrc.stamp_duty.property_sale_rateparameter and obsolete test overrides, updates the fiscal-partition notes, and adds regression and property tests. Statutory liabilities are unchanged. External reforms that still set the removed parameter must drop that setting.Updated from #2235 at
8c1b54dd9; #2235 has since merged into main at0def167a1. #2241 has also merged, so both landing prerequisites are satisfied and this PR targets main.Impact and limits
Current Aggregate impact (report, uk-data 1.58.1, main
fe0b99a36bagainst the merge8e268e6d8a): receipts rise by £385.5m in 2026-27, LBTT +£309.1m and LTT +£76.4m. LBTT rises from £297.0m (2025-26) to £386.0m (2031-32), and LTT from £71.8m to £105.5m. Both move towards outturn (Revenue Scotland, p6: LBTT £899m in 2024-25; WRA annual report, note 2.1: LTT £363m in 2025-26), but the model stays well below receipts.Historical measurement, 11 October 2026: real microsimulation runs on uk-data 1.58.0, with #2241 applied to both sides, increase
gov_tax,household_tax,pre_budget_change_household_taxandgov_balanceby £0.435bn in 2026-27. Household net income falls by the same amount. The annual tax increase ranges from £0.413bn in 2025-26 to £0.541bn in 2030-31. Poverty rates and HBAI household net income are unchanged in those runs.In 2026-27, expected LTT rises from £0.003bn to £0.070bn and expected LBTT from £0.017bn to £0.385bn. LTT/LBTT reforms enter totals at their full value rather than 4.5% of it: a factor of
1 / 0.045, about 22.2.These are dated uk-data estimates, not a new estimate for the current Budget Microcosm pair. The evidence is
~/reviews/uk-ltt-lbtt-2246/impact.md, with the scripts, run outputs and exact SHAs alongside it. It used policyengine-core 3.33.0 and policyengine-uk 2.126.8. The earlier £2.273bn estimate excluded #2241 and is superseded for the landed stack.The updated base includes the Welsh residential rate fixes (#1796) and Scottish 8% additional-dwelling supplement (#1795). Their three former strict expected failures are now ordinary differential assertions. The historical impact above predates these rate fixes. Historical purchase-data limitations and ungated component variables remain separate; tax totals use the country-gated liabilities.
Fix evidence
The regression tests check hand-calculated purchase liabilities and prove that expected values equal their liabilities. Property tests check geography, non-negativity and that zeroing every LTT/LBTT rate removes exactly one full liability from each tax total without changing SDLT. Existing evidence on the original #2235 base recorded 9 of 17 new YAML cases failing before the fix and all 17 passing afterward.
Reproducer:
policyengine_uk/tests/policy/baseline/gov/revenue_scotland/expected_lbtt.yamlReproducer:
policyengine_uk/tests/policy/baseline/gov/wra/land_transaction_tax/expected_ltt.yamlValidation at updated head
-n 2, foreground): waiting for the required 60 GB free-disk gate. No local venv installation or test suite has started while below the gate.uvx ruff format --check .: passed (1,940 files). Touched-fileruff checkalso passed. The installed Ruff tool was reused without installing a venv.257b39562f172e404ac54efea253a9f2d90dcd89: pending. CI runs the full suite. The hub supplies the independent final-head review; this job does not merge.axiom: n/a: microsim-only. This changes how model totals count LTT and LBTT; statutory liabilities are unchanged and remain represented in rulespec-uk.