Repository navigation
Conversation
Budget 2026 (OOTLAR para 1.50) moves machines with a maximum charge to play above £1 or a maximum prize above £100 from the standard rate of Machine Games Duty to the higher rate. Add the input for that part of the standard-rate base, a dated parameter for the reclassification, and let fiscal_year_segments segment leaves from several nodes jointly so the switch and the rates share one set of fiscal-year segments. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases for the years before, the FY2026 split (5 of 365 days at 25%) and after, the cap at the standard-rate base, and the totals. Hypothesis property tests check the closed form against para 9's rates and an independent day count, monotonicity, bounds and the counterfactual switch; annual and dated reforms of the switch; and the mapping path of fiscal_year_segments. Document why the input is a subset of the standard-rate input, the period split and the costing's behavioural netting the model leaves out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles. Checks failing on both base and head (1)
Counted-once checkEach of 91 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
|
|
Thanks for this. One thing the costing depends on that this PR doesn't cover yet is growth.
Could the gambling inputs be projected with the OBR's receipts forecasts for the gambling duties, as #2717 does for the receipts series it imports? It could go here or in a follow-up, ideally in the same release. Microcosm writes |
State that a machine stays at the standard rate only when both its maximum charge is at most £1 and its maximum prize at most £100. Limit the "needs no change" claim to HMRC standard-rate liabilities before 1 April 2027, and say how to rebuild the inclusive base from later ones. Use sentence case for the switch's label. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@juaristi22 Agreed: none of the seven gambling bases is uprated, so a 2024-25 dataset holds its cash takings flat in every later year. Your £114m checks out: 75.7% × £3.02bn × 5 points = £114.4m. I'd keep the projection out of this PR and do it as a follow-up stacked on #2717, aiming for the same release:
I've proposed that follow-up as a separate task. Meanwhile, this PR changes nothing until Microcosm supplies the new column: CI's aggregate-impact check shows no change in any year. |
Budget 2026 Table 6.1 line 56: Machine Games Duty on higher-stake machines from 1 April 2027. María asked for it on #2719 (comment) so Microcosm can score it (PolicyEngine/microcosm#1418). It stays separate from #2719, which carries the dashboard's other Table 6.1 items.
What and why
OOTLAR paragraph 1.50: "Under the revised thresholds, gaming machines with a maximum charge to play of more than £1 or a maximum prize of more than £100 will become subject to the higher rate of MGD at 25%, instead of the standard rate of 20%." It takes effect from 1 April 2027, through Finance Bill 2026-27. The policy costing (p. 67) uses the same thresholds and scores +£135m in 2027-28, then +£130m a year to 2031-32.
Today, FA 2012 Sch 24 para 5(3) makes every machine outside the lower-rate class with a highest charge of at most £5 a type 2 (standard-rate) machine. The old formula had no way to say that part of that base moves to 25%.
Changes:
machine_games_standard_rate_higher_stake_net_takings: the part ofmachine_games_standard_rate_net_takingsfrom machines with a maximum charge to play above £1 or a maximum prize above £100. The class corresponds closely to the Gambling Commission's Category B (B1 £5; B2, B3 and B3A £2 and £500; B4 £2 and £400). Category C (£1 and £100) and D stay within the thresholds.gov.hmrc.gambling_duty.machine_games.higher_stake_machines_at_higher_rate: false, then true from 2027-04-01, withpreserve_calendar_dates. It references OOTLAR 1.50, the costing page and Sch 24 paras 5 and 6. Set it to false for the counterfactual, or date it later to delay the change.machine_games_dutycharges the higher-stake part at the standard rate while the switch is off and at the higher rate while it is on. The rest of the standard-rate base stays at 20%.fiscal_year_segmentsaccepts a mapping of names to leaves as well as a node, so the switch and the three rates share one set of fiscal-year segments. Existing callers pass nodes and need no change.docs/engineering/gambling-duties.md, and the standard rate's description.Subset, not a separate amount
The new input is a subset of the standard-rate input:
machine_games_standard_rate_net_takingsfrom HMRC's standard-rate MGD liabilities and the 20% rate (hmrc.machine_games_duty_liabilitiesinpackages/microcosm-build/src/microcosm/build/uk/spec/sources.yaml; £3.02bn of takings in itsuk-excise-quantities-1359reconciliation). For periods before 1 April 2027 those liabilities include Category B, so the column keeps its meaning and its target, and Microcosm only adds the Category B share from the Gambling Commission's machine yield by category. A standard-rate input built from liabilities after that date must add the moved takings back. The docs show the arithmetic: £25 instead of £45 for £100 of each.Periods
The model year runs from 6 April to 5 April (
fiscal_year_segments). Model year 2026 therefore holds 1 to 5 April 2027 and charges the higher-stake part at 25% for 5 of its 365 days. Model year 2027 and later charge all of it at 25%. Paras 6(6) and 9(4) split a machine's takings the same way when its type or rate changes within an accounting period. The government's 2026-27 runs April to March, which is why the costing shows £0 for it.Impact
Expected zero on current datasets: the input defaults to 0, and no released dataset supplies it yet. CI's aggregate-impact job will confirm. Microcosm will write the input (microcosm#1418), and the measure scores once that data lands.
The costing nets off behaviour: an elasticity of −0.95, a quarter of lost stakes moving to Remote Gaming Duty, attrition and lower Corporation Tax. This model applies the rates statically and reproduces none of those responses.
Invariants
These hold for every input and every model year 2024 to 2030. S is the standard-rate input, H the higher-stake input and f the share of the model year on or after 1 April 2027 (0 to FY2025, 5/365 in FY2026, 1 after).
fiscal_year_segments. This is a differential test against the code path.Property tests cover all six with Hypothesis (
derandomize=True, 25 examples each, within the engine's float32 rounding). One simulation per scenario serves every example, and a module fixture releases it.Mutation check. Six formula mutants each fail both the property tests and the YAML: no cap, no floor, switch ignored, switch always on, takings added instead of moved, and the switch read once per fiscal year (30 April) instead of by day.
Test plan
machine_games_duty.yaml: before (FY2025), the FY2026 split (£36,500 of standard-rate takings, £7,300 of them higher-stake: £7,305), after (FY2027, FY2029), the cap, no standard-rate base, a negative input, and all four bases throughgambling_duty. The expected values come from Sch 24 para 9's rates and OOTLAR 1.50's date.test_machine_games_higher_stake.py: the six invariants; the statutory rates and the switch date; an annual reform covering the whole of FY2026 (£9,125); a dated delay to 1 April 2028 leaving 5 of FY2027's 366 days (£7,345); and the mapping path offiscal_year_segments, which splits at every leaf's dates and rejects nodes.-n 4: 3,175 passed, 1 skipped (at e860bf1).ruff formatandruff check.changelog.d/mgd-higher-stake-2027.added.md.Review
20261028-181411-pe-uk-2731-r1, at e860bf1): APPROVE, with two minor findings and one nit. All three are fixed in 9292e25:20261028-192612-pe-uk-2731-r2, at 9292e25): pending.Not for merge while Budget week's merge rules apply (until after 29 October).
Reproducer: policyengine_uk/tests/policy/baseline/gov/hmrc/gambling_duty/machine_games_duty.yaml; policyengine_uk/tests/test_machine_games_higher_stake.py::test_duty_matches_the_closed_form
axiom: rulespec-uk#488 queued (Budget 2026 extension in this comment; blocked on the Finance Bill 2026-27 text and on ingesting FA 2012 Sch 24 into the corpus)
🤖 Generated with Claude Code