Repository navigation
Fix historical income-tax bands and Marriage Allowance eligibility - #2539
Conversation
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
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; components the model counts twice; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles; standard reform costings (change in gov_balance); 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
Components the model counts twice: 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 (session local_8e19f9d5, Opus 5.5) on Max's explicit instruction to merge the team's ready PRs before the Budget (21 October, about 23:00Z: "go ahead and merge them. none of us has time to wait on each other"). One merge-queue enqueue, pinned to head
🤖 Generated with Claude Code |
Fixes #2356.
The default historical tax-band formula used the last two scale slots, so a higher-rate earner could be classified as BASIC and incorrectly meet the Marriage Allowance income condition. Use the actual basic/higher limits and assign equality to the lower band. Preserve Gift Aid extensions and every later dated formula.
The regression covers real married England households in 2016 and 2017: wages of £60,000/£5,000 yield recipient Marriage Allowance £0 and income tax £13,200/£12,700. Annual charging/rate Acts and Finance Act 2015 threshold/allowance overrides support these amounts. The issue's £1,060 transfer example is stale for 2016; the statutory maximum then is £1,100, subject to the remaining conditions.
Reproducer: policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/bracketized_liability/tax_band_historical.yaml
The unchanged 16-case reproducer first failed 7 cases and passed 9 on captured main 5f4b81c, then passed all 16 after the fix. The affected programme batch passed 359 YAML cases (including those 16); 11 existing Python controls passed. Full-repository format/lint checks, compilation, Towncrier discovery, source-cache and trusted-base Fix checks passed locally.
The undated formula also serves earlier supported years; the 2015 test checks bracket structure rather than certifying historical rates. Annual 2017 dispatch still uses the default method because dated methods are selected at the model's period start. Modern and Scottish controls preserve later dispatch. This is not a full historical/devolved rate, election, residence, take-up or dividend audit. Draft #1963 changes the Marriage Allowance consumer: whichever lands second needs combined consumer tests; no foreign implementation or compatibility certificate is claimed here.
axiom: needed
The underlying Axiom/parity debt remains OPEN and unverified. A nonexecuting supplemental handoff for existing RuleSpec issue59 is prepared from the same official originals and independent companion cases; it is not delivered, dispatch-ready, queued, encoded or a parity certificate. No billed signed-encoder run is approved. Any later free handoff needs fresh duplicate/activity/module/corpus/label checks and independent source/case review; an assignee is not a repository prerequisite.