Skip to content

Limit Income Tax reductions to the Step 5 tax so they don't offset Step 7 charges - #2545

Merged
juaristi22 merged 6 commits into
mainfrom
income-tax-step6-step7
Oct 30, 2026
Merged

juaristi22 merged 6 commits into
mainfrom
income-tax-step6-step7

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2544

Reproducer: policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/step_6_step_7.yaml, policyengine_uk/tests/test_income_tax_step_6_step_7_properties.py::test_the_fix_restores_exactly_the_charges_the_old_netting_offset

axiom: uk:statutes/ukpga/2007/3/23#income_tax_liability encoded-correct (companion case no_personal_allowance_and_reductions_cannot_make_tax_left_negative in uk/statutes/ukpga/2007/3/23.test.yaml: reductions of £800 against £500 of tax leave the £20 of s. 30 tax)

This update merges origin/main at daec84d5b into income-tax-step6-step7 with merge commit 280e7dc4d. It incorporates the winter fuel payment charge from #2066 and applies the Step 6 cap to the liability before that charge.

Previously, the income-tax calculation netted tax reductions against the Step 5 tax and the High Income Child Benefit Charge and annual allowance charge together. Excess reductions could therefore remove a Step 7 charge. The married couple's allowance cap also included the High Income Child Benefit Charge.

ITA 2007 s. 23 deducts tax reductions from Step 5 tax at Step 6, then adds the additional tax listed in s. 30 at Step 7. Section 29(2) and (3) limits reductions to the Step 5 tax left after reductions already deducted. The resulting calculation preserves the Step 7 charges when credits exceed the Step 5 tax.

The code now uses explicit parameter lists:

  • step_5_tax_components supplies the rate taxes that income_tax_pre_charges adds.
  • step_6_tax_reductions supplies the reductions that income_tax_reductions limits in total to Step 5 tax.
  • step_7_additional_tax supplies CB_HITC and personal_pension_contributions_tax to income_tax_charges.

income_tax_before_winter_fuel_payment_charge subtracts the capped Step 6 reductions from Step 5 tax, then adds those other Step 7 charges. income_tax adds winter_fuel_payment_charge to that result. Finance Act 2026 Sch. 10 para. 1 creates the charge in ITEPA Part 10 Chapter 9. Sch. 10 para. 4(3) places the winter fuel payment charge in ITA 2007 s. 30(1), so the charge belongs at Step 7 alongside the other charges. #2066's placement agrees with the law. Adding it separately remains part of Step 7: the means tests deduct the pre-charge aggregate, and the charge depends on Pension Credit and Universal Credit receipt, so including it in that aggregate would create a benefit calculation cycle.

The merge preserves main's winter fuel payment rules, means-test readers and property allowance election, including its charge-ceiling optimization. The new YAML regression combines excess tax credits with a winter fuel payment charge and an annual allowance charge. The generated tests check the capped reductions, the accounting before the charge, the separately added winter fuel payment charge, monotonicity and the difference from the old netting rules. They check monotonicity of tax before the charge on each property allowance route, and of total tax on the route the election takes. A hand-computed case shows why: the election weighs the charge, so more credits can move a taxpayer to the route with more tax before it. The winter fuel means-test tests cover changes in benefit entitlement.

capped_mcad now uses only Step 5 tax left after other_tax_credits. property_finance_cost_relief and utils/uc_income_tax.py read the renamed Step 6 list. The UC calculation retains its allocation of finance-cost relief against property tax first. The fiscal partition retains main's metadata and records the new reductions and charges aggregates. The changelog documents the removed income_tax_additions and income_tax_subtractions names.

The history audit searched main since 76cfc9e79 for every reader or writer of the old lists, the new aggregates, capped_mcad, property_finance_cost_relief, other_tax_credits and utils/uc_income_tax.py. The merge carries those changes forward and migrates the affected list readers. Main added no further charge or reduction to the old lists that needs a new entry here.

The existing aggregate-credit limitations remain documented: other_tax_credits combines reliefs whose statutory order differs, including foreign tax relief after the married couple's allowance, and prevents the model from applying the separate Gift Aid limit in s. 29(4A)–(4C).

Open #2719 adds pension_tax_allowance and utils/income_tax_reductions.py::earlier_tax_reductions. Whichever PR lands second must carry pension_tax_allowance into step_6_tax_reductions and keep it last, adapt earlier_tax_reductions to read that list, and preserve the ordered caps against the remaining Step 5 tax. It must retain the helper's use by property_finance_cost_relief without a dependency cycle and preserve UC's use of the list and its separate allocation of finance-cost relief. This merge does not copy #2719's unmerged implementation. The combined head must rerun the pension-tax-allowance YAML, properties and UC tests.

The existing coordination with open #1963 (Marriage Allowance) also applies: whichever PR lands second must carry marriage_allowance_tax_reduction into step_6_tax_reductions.

Impact

The CI aggregate-impact job ran base daec84d5b6 (main) against head cd742f7f52 (the merge commit for 280e7dc4d) on certified policyengine-uk-data 1.58.1 (enhanced_frs_2024_25.h5, sha256 056e80fd8e91…), fiscal years 2025-26 to 2031-32. It reported 0 checks broken and 0 moves flagged. Income tax receipts moved by £0 to £36 a year in either direction, out of £294bn to £398bn a year, and household net income by at most £71 in total. Those moves are float32 rounding. In a local run on this branch before the merge, for 2025-26 and 2026-27, the Step 6 reductions (other_tax_credits, the married couple's allowance and the finance-cost reduction) summed to £0 on 1.58.1, so the cap never binds in the survey data. Commit b5fd880c9 changes only tests.

The fix changes tax for households, not survey aggregates: anyone whose reductions exceed their Step 5 tax keeps paying their Step 7 charges. The YAML cases show £1,406 of High Income Child Benefit Charge and £4,000 of annual allowance charge that the old netting cancelled. Main already adds the winter fuel payment charge after the netting, so credits never cancelled it; the new winter fuel YAML case checks that it still survives.

Invariants

The property tests (policyengine_uk/tests/test_income_tax_step_6_step_7_properties.py) check these for every drawn case, in English and Scottish single-person households, at ages 45 and 70:

  1. Bounds: 0 ≤ Step 6 deduction ≤ Step 5 tax.
  2. Accounting: the Step 6 deduction equals the listed reductions limited to the Step 5 tax. Tax before the winter fuel payment charge equals Step 5 tax less the Step 6 deduction plus the other Step 7 charges. Total income tax equals that plus the winter fuel payment charge.
  3. Charges survive: tax before the winter fuel payment charge ≥ the other Step 7 charges, and total tax ≥ all the charges together.
  4. No added tax: tax before the winter fuel payment charge ≤ Step 5 tax plus the other Step 7 charges.
  5. Order: the married couple's allowance reduction is at most the Step 5 tax left after other_tax_credits, and the finance-cost reduction at most the tax left after both.
  6. Monotonic: on each fixed property allowance route, more other_tax_credits leave the Step 5 tax and every charge unchanged and never raise tax before the winter fuel payment charge. On the route the election takes, total tax never rises. Tax before the charge can rise there: in the hand-computed case, £500 more credits move a 70-year-old landlord from actual expenses (total income £35,500, so a £200 charge) to partial relief (£34,500, no charge). Their tax before the charge rises from £0 to £86, while total tax falls from £200 to £86.
  7. Differential: a structural reform reproduces main's pre-fix rules exactly. Total income tax under the fix is never lower. Where both simulations take the same property allowance route, tax before the charge rises by exactly the Step 7 charges the old netting let excess reductions offset.

Validation

Validation at 280e7dc4d0791f472659fdce3c24c7e3b7401dea used household inputs and unit fixtures, with no survey dataset:

  • Income-tax YAML directory: 406 passed, including the new winter-fuel case.
  • Selected YAML files, including the changed cases and Charge the winter fuel payment back through income tax, person by person #2066's winter-fuel and means-test regressions: 194 passed. This selection also reruns the changed income-tax files covered by the directory command.
  • Python files/cases: 127 passed. This includes the Step 6/7 property file (8 passed), winter-fuel means tests, winter heating, charge ceiling, total income/net pay, statutory paternity pay, code sharing, property income, trading losses, UC earnings/company-owner/capital/statutory pay, fiscal partition, and the added Council Tax Reduction regression. Consumer runs use the repository's existing cloned_uk_tax_benefit_system fixture where appropriate; the code-sharing run uses its original setup.
  • Tests ran sequentially under the supplied capped runner; pytest used -n 0. Each run unset HUGGING_FACE_TOKEN and POLICYENGINE_UK_DEFAULT_DATASET.
  • Ruff 0.17.2 format --check and check passed on every changed Python file; check --select F811,F821 policyengine_uk passed. Both working-tree and PR-diff git diff --check passed.
  • The scratch mutation put the winter fuel charge before Step 6 reductions. The new case killed it: income tax fell from the expected £4,200 to £4,000, with 1 failed and 7 passed. The working model passed that case.

At b5fd880c962b9217713022f808cab6a08d15f3f9 (review r2 fixes, tests only):

  • The Step 6/7 property file: 10 passed, adding the fixed-route monotonicity test and the election case. The Step 6/7 YAML file: 8 passed. Ruff format and check, and git diff --check, passed.
  • Main's simulation reset now keeps inputs set through set_input, so a fixed route would leak into later runs on the shared simulation. run() deletes any fixed route before it sets its own. Without that deletion, the election case failed after a fixed-route run.
  • A mutant that compares property allowance routes on tax before the charge alone failed the election case.

The PR remains a draft under the policyengine-uk merge hold. María's approval predates the merge.

🤖 Generated with Claude Code

ITA 2007 s. 23 deducts tax reductions at Step 6 from the Step 5 tax and
adds the s. 30 charges at Step 7. s. 29(2) allows a reduction only so far
as there is Step 5 tax to deduct it from. income_tax netted the reductions
against the Step 5 tax and the Step 7 charges together, so other_tax_credits
above the Step 5 tax offset the High Income Child Benefit Charge and the
annual allowance charge, and capped_mcad was capped at the Step 5 tax plus
the HICBC.

Split income_tax_additions and income_tax_subtractions into explicit Step 5,
Step 6 and Step 7 lists, add income_tax_reductions (Step 6, limited to the
Step 5 tax) and income_tax_charges (Step 7), and cap capped_mcad at the
Step 5 tax left after other_tax_credits (s. 27(5)).

Fixes #2544

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases for an HICBC payer whose other_tax_credits exceed their Step 5
tax, a married couple's allowance claimant who pays HICBC after VCT relief,
the annual allowance charge, and reductions exactly at the Step 5 tax.
Hypothesis properties: the Step 6 deduction is within [0, Step 5]; income
tax is Step 5 - Step 6 + Step 7, at least the Step 7 charges and at most
Step 5 + Step 7; each reduction is limited to the tax left before it; more
other_tax_credits never raise income tax; and a differential against the
pre-fix formula, which the fix raises by exactly the charges it offset.

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

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 64cf5828ee against head 3951620433, both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1, sha256 056e80fd8e91), fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • This change edits the fiscal partition; review the partition diff alongside the moves it explains.
  • In the years a figure from fewer than 10 records is suppressed (spending.disabled_students_allowance), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

None.

Receipts by tax head

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax 0 -£0 +£2 +£2 +£1 -£2 -£36

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Government balance, each component counted once

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once 0 -£0 +£2 +£2 +£1 -£2 -£36
Government balance, each receipt once 0 † -£0 † +£2 † +£2 † +£1 † -£2 † -£36 †

Model totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax 0 +£1 -£1 -£1 +£1 -£3 -£58
household_tax 0 +£1 +£2 +£2 +£1 -£2 -£42
pre_budget_change_household_tax 0 +£1 +£2 +£2 +£1 -£2 -£44
gov_balance 0 † -£0 † +£2 † +£2 † +£1 † -£2 † -£36 †

Household income totals

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household net income 0 † +£0 † -£2 † -£2 † -£1 † +£2 † +£36 †
Household net income (HBAI definition) 0 -£1 -£2 -£2 -£1 +£2 +£71

Inequality

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0 +0.0000 -0.0000 -0.0000 0 +0.0000 +0.0000

Mean household net income in each side's own deciles

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 8: mean household_net_income per household 0 † 0 † 0 † 0 † 0 † 0 † +£0.00 †
Decile 9: mean household_net_income per household 0 † 0 † 0 † 0 † -£0.00 † 0 † +£0.00 †
Decile 10: mean household_net_income per household 0 † +£0.00 † -£0.00 † -£0.00 † 0 † +£0.00 † +£0.00 †

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp 0 +£2 +£0 +£1 +£1 +£0 +£49
Raise higher rate by 1pp -£3 -£1 +£1 +£1 -£1 -£490 +£68
Raise personal allowance by ~800GBP/year 0 0 -£0 +£0 -£0 0 +£50
Raise child benefit by 25GBP/week per additional child 0 -£0 0 0 -£1 -£1 -£10
Reduce Universal Credit taper rate to 20% 0 -£0 0 0 -£0 0 -£0
Raise Class 1 main employee NICs rate to 10% 0 0 +£0 +£1 +£1 +£0 +£0
Raise VAT standard rate by 2pp 0 -£4 +£5 +£5 +£1 +£2 +£43
Raise additional rate by 3pp -£0 -£12 -£510 -£26 -£18 suppressed suppressed
Raise the Universal Credit standard allowance by 10% 0 -£0 0 0 -£0 0 -£0
Raise the State Pension by 10% 0 -£0 0 +£0 -£0 -£0 0

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax 0 +£2 -£0 -£0 -£0 -£0 -£10
Raise higher rate by 1pp: change in income_tax -£3 +£0 -£2 -£2 +£7 -£245 +£41
Raise personal allowance by ~800GBP/year: change in income_tax 0 -£0 0 0 -£0 0 -£217
Raise additional rate by 3pp: change in income_tax -£2 -£123 -£257 -£14 -£10 suppressed suppressed

Household net income by decile

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

Base decile 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1 0 0 0 0 0 0 0
Decile 2 0 0 0 0 0 0 0
Decile 3 0 0 0 0 0 0 0
Decile 4 0 0 0 0 0 0 0
Decile 5 0 0 0 0 0 0 0
Decile 6 0 0 0 0 0 0 0
Decile 7 0 0 0 0 0 0 0
Decile 8 0 0 0 0 0 0 0
Decile 9 0 0 0 0 fewer than 10 households change 0 0
Decile 10 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change 0 fewer than 10 households change 0
all 0 fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change fewer than 10 households change 0
Year People gaining over £1 People losing over £1
2025-26 0.0% 0.0%
2026-27 fewer than 10 households change fewer than 10 households change
2027-28 fewer than 10 households change fewer than 10 households change
2028-29 fewer than 10 households change fewer than 10 households change
2029-30 fewer than 10 households change fewer than 10 households change
2030-31 fewer than 10 households change fewer than 10 households change
2031-32 0.0% 0.0%

No change in any year: population; poverty rates; people in poverty.

Checks failing on both base and head (1)
  • VAT excluding private school fees is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-53,888,684 in total; 2026-27: 76 units below zero, a weighted £-55,774,885 in total; 2027-28: 76 units below zero, a weighted £-57,687,092 in total
Counted-once check

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

  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; gov_spending; not a failure)
  • widowed_parents_allowance: pension_credit responds only through other heads in fewer than 10 households (other heads that moved there: carers_allowance; household_benefits; not a failure)
Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 64cf5828ee uk 2.165.0 (files 8c1197397e80), core 3.33.12, py 3.13.18 aarch64 26f24baae8a9 22e0ebaf0971 1996.27s
head #2545 merged into main 3951620433 uk 2.165.0 (files 224714c82012), core 3.33.12, py 3.13.18 aarch64 26f24baae8a9 e90ddaeead60 2018.8s

Dataset: hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@2526edbbb687a3b54dbb11272e5389e4b62d2ac2, sha256 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784 (verified on both sides), policyengine-uk-data 1.58.1.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Final charge on cash interest in non-cash ISAs £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Lifetime ISA withdrawal charge £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Income tax £294.46bn £315.23bn £334.00bn £349.45bn £365.10bn £383.16bn £397.71bn
National Insurance (employee and self-employed) £51.70bn £54.14bn £56.13bn £57.73bn £59.76bn £61.64bn £63.51bn
National Insurance (employer) £148.71bn £155.37bn £160.88bn £165.09bn £172.06bn £177.36bn £182.57bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.60bn £13.15bn £13.60bn £14.11bn £14.67bn £15.24bn £15.80bn
Student loan repayments £7.82bn £8.13bn £8.39bn £8.58bn £8.79bn £9.04bn £9.29bn
VAT excluding private school fees £249.37bn £256.88bn £266.66bn £272.70bn £278.97bn £285.24bn £291.59bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £1.95bn £2.01bn £2.09bn £2.14bn £2.21bn £2.27bn £2.31bn
Change in private school VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.71bn £24.59bn £26.54bn £26.58bn £26.26bn £25.53bn £24.40bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.40bn £4.41bn £4.42bn £4.43bn £4.44bn £4.45bn
Council tax £49.21bn £52.16bn £54.89bn £57.95bn £61.16bn £64.47bn £67.91bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.50bn £0.51bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.60bn £0.63bn £0.66bn £0.69bn £0.72bn
Business rates £34.68bn £36.20bn £38.00bn £39.46bn £42.27bn £43.25bn £44.29bn
Stamp duty land tax on the household's own purchases £6.88bn £7.32bn £7.66bn £8.06bn £8.47bn £8.91bn £9.35bn
Stamp duty land tax paid by companies £4.72bn £4.57bn £5.29bn £6.03bn £6.37bn £6.92bn £7.45bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.08bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.33bn £0.35bn £0.36bn £0.38bn £0.40bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
State Pension £121.68bn £125.92bn £126.73bn £129.50bn £132.99bn £136.66bn £140.43bn
Pension Credit £6.66bn £7.03bn £7.30bn £7.51bn £7.65bn £7.84bn £8.03bn
Winter Fuel Payment £1.86bn £1.85bn £1.79bn £1.77bn £1.78bn £1.78bn £1.78bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.48bn £80.52bn £83.04bn £85.11bn £86.31bn £87.90bn £88.58bn
Housing Benefit £8.56bn £8.89bn £9.24bn £9.48bn £9.72bn £9.99bn £10.27bn
Council Tax Reduction £2.07bn £2.20bn £2.31bn £2.45bn £2.58bn £2.72bn £2.86bn
Employment and Support Allowance (income-related) £0.79bn £0.82bn £0.84bn £0.86bn £0.88bn £0.90bn £0.92bn
Employment and Support Allowance (contribution-based) £5.20bn £5.37bn £5.56bn £5.69bn £5.82bn £5.95bn £6.09bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.31bn £0.31bn £0.32bn £0.33bn £0.34bn
Income Support £0.11bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £26.95bn £28.03bn £29.05bn £30.09bn £30.75bn £31.51bn £32.21bn
Disability Living Allowance £7.49bn £7.79bn £8.07bn £8.36bn £8.55bn £8.76bn £8.95bn
Attendance Allowance £8.68bn £9.03bn £9.36bn £9.69bn £9.90bn £10.15bn £10.38bn
Carer's Allowance £4.48bn £4.66bn £4.83bn £5.00bn £5.11bn £5.23bn £5.35bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.33bn £0.34bn £0.35bn £0.36bn £0.37bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.50bn £0.52bn £0.54bn £0.55bn £0.56bn £0.58bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.63bn £0.65bn £0.66bn £0.68bn £0.69bn £0.71bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.19bn £16.82bn £17.39bn £18.00bn £18.39bn £18.84bn £19.25bn
Scottish Child Payment £0.49bn £0.52bn £0.53bn £0.56bn £0.57bn £0.57bn £0.57bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.30bn £3.41bn £3.54bn £3.62bn £3.70bn £3.78bn £3.87bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.16bn £1.20bn £1.23bn £1.26bn £1.29bn £1.32bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.71bn £0.73bn £0.75bn £0.76bn £0.78bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.55bn £0.56bn £0.58bn £0.59bn £0.59bn £0.59bn £0.57bn
Extended childcare entitlement £2.99bn £3.50bn £3.62bn £3.75bn £3.83bn £3.92bn £4.01bn
Universal childcare entitlement £2.06bn £2.22bn £2.29bn £2.38bn £2.44bn £2.51bn £2.56bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.54bn £0.55bn £0.57bn £0.56bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.31bn £0.32bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £203.89bn £204.30bn £204.56bn £204.91bn £205.34bn £205.85bn £206.35bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.10bn £25.14bn £25.18bn £25.23bn £25.30bn £25.36bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Lifetime ISA bonus 0k 0k 0k 0k 0k 0k 0k
State Pension 11,264k 11,145k 10,819k 10,700k 10,723k 10,750k 10,776k
Pension Credit 1,486k 1,480k 1,474k 1,455k 1,453k 1,455k 1,464k
Winter Fuel Payment 7,844k 7,783k 7,473k 7,375k 7,391k 7,409k 7,427k
Pension Age Winter Heating Payment (Scotland) 803k 802k 800k 797k 799k 801k 802k
Universal Credit 6,357k 6,349k 6,350k 6,318k 6,307k 6,299k 6,253k
Housing Benefit 1,249k 1,245k 1,246k 1,229k 1,229k 1,229k 1,232k
Council Tax Reduction 3,176k 3,195k 3,200k 3,215k 3,224k 3,235k 3,242k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 71k 71k
Employment and Support Allowance (contribution-based) 719k 720k 721k 722k 724k 726k 728k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 67k 67k 68k 68k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,567k 3,575k 3,579k 3,585k 3,593k 3,602k 3,611k
Disability Living Allowance 1,291k 1,294k 1,296k 1,298k 1,300k 1,304k 1,307k
Attendance Allowance 1,695k 1,698k 1,700k 1,703k 1,707k 1,711k 1,715k
Carer's Allowance 1,034k 1,037k 1,038k 1,040k 1,042k 1,044k 1,046k
Carer Support Payment (Scotland) 71k 71k 71k 72k 72k 72k 72k
Carer's Allowance Supplement (Scotland) 0k 71k 71k 72k 72k 72k 72k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 137k 138k 138k 138k 139k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 94k 94k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,123k 8,120k 8,120k 8,130k 8,145k 8,161k 8,178k
Scottish Child Payment 351k 352k 352k 355k 353k 351k 340k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 200k 200k 201k 201k 201k 202k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 333k 333k 334k 334k 335k 336k 337k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 182k 182k 183k 183k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 26k 26k
Bereavement Support Payment 98k 98k 98k 98k 98k 99k 99k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,014k 1,025k 1,021k 1,022k 1,008k 1,005k 991k
Extended childcare entitlement 795k 800k 804k 806k 809k 814k 814k
Universal childcare entitlement 1,071k 1,072k 1,074k 1,076k 1,079k 1,089k 1,090k
Targeted childcare entitlement 165k 156k 154k 154k 155k 155k 150k
Childcare Offer for Wales 39k 39k 39k 39k 39k 39k 39k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 98k 98k 99k 99k 99k 99k
Adult Dependants' Grant 18k 18k 12k 12k 12k 12k 12k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £892.00bn £935.14bn £979.55bn £1,013.85bn £1,052.14bn £1,089.13bn £1,122.37bn
Government spending £529.37bn † £543.55bn † £550.93bn † £559.76bn † £567.52bn † £576.28bn † £584.02bn †
Government balance, each receipt once £362.63bn † £391.59bn † £428.62bn † £454.08bn † £484.61bn † £512.85bn † £538.35bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £892.00bn £935.14bn £979.55bn £1,013.85bn £1,052.14bn £1,089.13bn £1,122.37bn
household_tax £491.97bn £520.87bn £549.93bn £573.92bn £598.90bn £624.26bn £645.90bn
pre_budget_change_household_tax £484.15bn £512.74bn £541.54bn £564.86bn £589.61bn £614.72bn £636.09bn
gov_spending £529.37bn † £543.55bn † £550.93bn † £559.76bn † £567.52bn † £576.28bn † £584.02bn †
household_benefits £529.37bn † £543.55bn † £550.93bn † £559.76bn † £567.52bn † £576.28bn † £584.02bn †
gov_balance £362.63bn † £391.59bn † £428.62bn † £454.08bn † £484.61bn † £512.85bn † £538.35bn †
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,637.96bn £1,702.77bn £1,757.35bn £1,806.41bn £1,855.97bn £1,912.43bn £1,970.44bn
Household net income £1,636.68bn † £1,685.25bn † £1,716.89bn † £1,749.83bn † £1,781.12bn † £1,819.78bn † £1,862.63bn †
Household net income (HBAI definition) £1,449.57bn £1,497.73bn £1,532.81bn £1,567.21bn £1,600.01bn £1,638.04bn £1,679.21bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,245k 69,383k 69,473k 69,592k 69,738k 69,912k 70,080k
Benefit units 35,110k 35,181k 35,226k 35,286k 35,360k 35,449k 35,534k
Households 31,046k 31,108k 31,149k 31,201k 31,267k 31,345k 31,420k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 16.3% 15.6% 16.4% 16.3% 16.5% 16.5% 16.6%
Absolute poverty, before housing costs: children 24.7% 22.3% 23.3% 22.9% 23.1% 23.2% 23.4%
Absolute poverty, before housing costs: working-age adults 14.1% 13.9% 14.7% 14.7% 14.8% 14.8% 14.9%
Absolute poverty, before housing costs: pensioners 13.7% 13.5% 14.0% 13.9% 14.0% 13.9% 13.9%
Absolute poverty, after housing costs: everyone 21.6% 21.1% 22.0% 22.5% 22.7% 23.0% 23.3%
Absolute poverty, after housing costs: children 33.3% 31.3% 32.2% 32.4% 32.5% 33.0% 33.9%
Absolute poverty, after housing costs: working-age adults 19.9% 19.9% 20.8% 21.5% 21.8% 22.0% 22.2%
Absolute poverty, after housing costs: pensioners 12.7% 12.6% 13.1% 13.2% 13.3% 13.4% 13.5%
Relative poverty, before housing costs: everyone 17.0% 16.3% 16.4% 16.3% 16.3% 16.3% 16.7%
Relative poverty, before housing costs: children 25.9% 23.4% 23.3% 22.9% 22.8% 22.9% 23.7%
Relative poverty, before housing costs: working-age adults 14.5% 14.3% 14.6% 14.7% 14.7% 14.7% 15.0%
Relative poverty, before housing costs: pensioners 14.5% 14.7% 13.9% 13.9% 13.8% 13.9% 14.0%
Relative poverty, after housing costs: everyone 21.4% 21.0% 21.2% 21.3% 21.3% 21.5% 21.7%
Relative poverty, after housing costs: children 33.1% 31.1% 31.1% 31.0% 31.1% 31.2% 31.7%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.2% 20.4% 20.5% 20.6% 20.8%
Relative poverty, after housing costs: pensioners 12.5% 12.4% 12.2% 11.7% 11.7% 11.8% 12.0%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,278k 10,837k 11,403k 11,358k 11,478k 11,506k 11,643k
Absolute poverty, before housing costs: children 3,688k 3,332k 3,496k 3,437k 3,477k 3,499k 3,545k
Absolute poverty, before housing costs: working-age adults 5,965k 5,921k 6,308k 6,354k 6,417k 6,426k 6,517k
Absolute poverty, before housing costs: pensioners 1,624k 1,584k 1,599k 1,568k 1,583k 1,580k 1,581k
Absolute poverty, after housing costs: everyone 14,944k 14,662k 15,296k 15,679k 15,862k 16,047k 16,331k
Absolute poverty, after housing costs: children 4,975k 4,689k 4,832k 4,863k 4,898k 4,986k 5,125k
Absolute poverty, after housing costs: working-age adults 8,463k 8,491k 8,965k 9,325k 9,464k 9,549k 9,669k
Absolute poverty, after housing costs: pensioners 1,506k 1,482k 1,500k 1,491k 1,500k 1,513k 1,537k
Relative poverty, before housing costs: everyone 11,750k 11,332k 11,389k 11,348k 11,358k 11,410k 11,702k
Relative poverty, before housing costs: children 3,872k 3,504k 3,496k 3,434k 3,431k 3,451k 3,577k
Relative poverty, before housing costs: working-age adults 6,159k 6,103k 6,301k 6,349k 6,363k 6,388k 6,540k
Relative poverty, before housing costs: pensioners 1,720k 1,724k 1,592k 1,565k 1,563k 1,571k 1,585k
Relative poverty, after housing costs: everyone 14,849k 14,583k 14,728k 14,809k 14,885k 15,005k 15,219k
Relative poverty, after housing costs: children 4,942k 4,664k 4,660k 4,663k 4,681k 4,702k 4,798k
Relative poverty, after housing costs: working-age adults 8,426k 8,460k 8,679k 8,821k 8,877k 8,964k 9,056k
Relative poverty, after housing costs: pensioners 1,482k 1,459k 1,389k 1,325k 1,327k 1,340k 1,366k
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0.3080 0.3057 0.3063 0.3062 0.3068 0.3073 0.3089
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household £17,681 † £17,895 † £17,904 † £18,146 † £18,308 † £18,581 † £18,739 †
Decile 2: mean household_net_income per household £27,939 † £28,874 † £28,683 † £29,083 † £29,354 † £29,679 † £30,165 †
Decile 3: mean household_net_income per household £34,320 † £35,455 † £36,108 † £36,626 † £37,218 † £37,722 † £38,220 †
Decile 4: mean household_net_income per household £38,933 † £40,603 † £41,873 † £42,783 † £43,423 † £43,928 † £44,548 †
Decile 5: mean household_net_income per household £43,240 † £45,443 † £45,787 † £46,995 † £47,729 † £48,921 † £50,229 †
Decile 6: mean household_net_income per household £47,900 † £49,126 † £50,887 † £51,727 † £52,600 † £54,202 † £55,195 †
Decile 7: mean household_net_income per household £55,684 † £56,509 † £57,443 † £57,966 † £59,083 † £59,211 † £60,667 †
Decile 8: mean household_net_income per household £68,789 † £70,704 † £71,779 † £73,356 † £73,945 † £75,356 † £77,241 †
Decile 9: mean household_net_income per household £78,890 † £80,992 † £82,907 † £84,246 † £85,584 † £87,169 † £89,597 †
Decile 10: mean household_net_income per household £117,005 † £120,262 † £122,221 † £124,681 † £126,775 † £129,108 † £131,486 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.41bn £6.66bn £6.64bn £6.88bn £7.04bn £7.26bn £7.48bn
Raise higher rate by 1pp £3.61bn £3.87bn £4.00bn £4.23bn £4.43bn £4.70bn £4.83bn
Raise personal allowance by ~800GBP/year £-3.80bn £-3.92bn £-3.98bn £-4.10bn £-4.17bn £-4.21bn £-1.96bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.55bn £-1.39bn £-1.30bn £-1.17bn £-1.06bn
Reduce Universal Credit taper rate to 20% £-20.37bn £-20.88bn £-21.32bn £-21.52bn £-21.86bn £-22.25bn £-22.42bn
Raise Class 1 main employee NICs rate to 10% £10.89bn £11.30bn £11.73bn £12.03bn £12.30bn £12.61bn £13.00bn
Raise VAT standard rate by 2pp £24.89bn £25.71bn £26.63bn £27.24bn £27.87bn £28.50bn £29.14bn
Raise additional rate by 3pp £2.90bn £3.15bn £3.22bn £3.42bn £3.61bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.06bn £-3.18bn £-3.25bn £-3.34bn £-3.44bn £-3.48bn £-3.50bn
Raise the State Pension by 10% £-7.78bn £-8.01bn £-7.99bn £-8.14bn £-8.42bn £-8.55bn £-8.89bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.55bn £6.86bn £6.80bn £7.01bn £7.21bn £7.44bn £7.66bn
Raise higher rate by 1pp: change in income_tax £3.61bn £3.92bn £4.01bn £4.23bn £4.45bn £4.72bn £4.84bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.93bn £-4.07bn £-4.16bn £-4.25bn £-4.32bn £-4.38bn £-1.75bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.94bn £1.76bn £1.65bn £1.52bn £1.40bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.34bn £20.87bn £21.30bn £21.52bn £21.81bn £22.20bn £22.41bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.15bn £11.63bn £12.00bn £12.29bn £12.61bn £12.94bn £13.31bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.51bn £26.42bn £27.03bn £27.65bn £28.28bn £28.91bn
Raise additional rate by 3pp: change in income_tax £2.90bn £3.15bn £3.22bn £3.42bn £3.62bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.06bn £3.18bn £3.28bn £3.38bn £3.44bn £3.50bn £3.53bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.17bn £11.28bn £11.60bn £12.04bn £12.47bn £12.97bn

The case expected a £700 cap on an £800 reduction against £500 of Step 5
tax and a £200 HICBC. Under ITA 2007 s. 29(2) the reduction is limited to
the £500 of Step 5 tax, and the HICBC is added at Step 7, so income tax
is £200.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Reset the reusable simulation before setting inputs: reset_calculations()
  cleared employment income and Child Benefit, which the simulation was not
  built with, so the HICBC cases never ran. The tests now assert that every
  drawn input reaches the calculation, and draw pension-age people too.
- Compare against a simulation of the pre-fix rules (a structural reform of
  income_tax and capped_mcad), not a reconstruction from the fixed run's
  values. The property allowance election weighs income tax on each route,
  so it can differ under the old rules. Income tax is never lower on either
  route, so never lower; where both take the same route, Step 5, the charges
  and the finance-cost reduction are unchanged and the restored charge is
  exact.
- Drop the assumption that more other_tax_credits leave Step 5 unchanged,
  which an election change breaks.
- Add the YAML case of a landlord whose election let the old netting offset
  £168 of HICBC, and qualify the s. 27(5) ordering in the docstring.

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

@juaristi22 juaristi22 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed at f903b28a75b9ef223c45547be6b3e4b40cd5c3c3. No actionable findings from independent code and statutory-source reviews.

The change correctly caps Step 6 reductions against Step 5 tax before adding Step 7 charges. Final-tax cases confirm that excess credits cannot remove the £1,406 HICBC or £4,000 annual-allowance charge. All 45 focused tests passed, including generated invariants, MCA, property elections and downstream consumers.

This approval covers the present head. The declared #2066 Winter Fuel Payment charge prerequisite still requires integration and retesting before landing; the documented aggregate foreign-relief and Gift Aid limitations remain.

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Heads-up from #2719 (Budget 2026 measures, draft until Budget week ends): it adds pension_tax_allowance as the last entry in gov.hmrc.income_tax.income_tax_subtractions. Each Step 6 reduction there is capped at the Step 5 tax left by the entries before it, through a new helper, utils/income_tax_reductions.py::earlier_tax_reductions, which property_finance_cost_relief now uses too (d6b3611). That overlaps this PR's move to step_6_tax_reductions.yaml and its change to property_finance_cost_relief.py. Whichever lands second needs to carry the allowance into the new list and keep it last.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Updated head: 280e7dc4d0791f472659fdce3c24c7e3b7401dea, merging main daec84d5b69c1a5f8beb47a623046de2287d1718 into this branch.

At that head, I ran the income-tax YAML directory (406 passed), the selected changed/winter-fuel/means-test YAML files (194 passed), and the targeted Python files/cases (127 passed, including 8 Step 6/7 property tests). The PR body lists the covered areas. I ran tests sequentially under the requested caps with no survey dataset and with the two specified environment variables unset. Ruff 0.17.2 format/check on changed Python files, the package-wide F811/F821 check, and git diff --check all passed.

The scratch Step 5 placement mutation died: the winter-fuel regression returned £4,000 instead of £4,200 (1 failed, 7 passed). The code keeps the winter fuel charge at statutory Step 7, separately from the tax aggregate used by benefit means tests.

María's approval covers the preceding head f903b28a75b9ef223c45547be6b3e4b40cd5c3c3 and predates this merge. The PR remains a draft under the merge hold; I have not merged, enqueued, marked it ready, or requested reviews.

The election weighs the winter fuel payment charge, so more credits can move
a person to the route with more tax before the charge. Check that tax on each
fixed route instead, and add a hand-computed case where £500 more credits
raise it from £0 to £86 while total tax falls from £200 to £86.

The simulation reset now keeps inputs set through set_input, so run()
deletes any route a previous run fixed before setting its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 30, 2026 03:20
@MaxGhenis
MaxGhenis requested a review from juaristi22 October 30, 2026 03:20
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Hand-off to the UK hub at head b5fd880c962b9217713022f808cab6a08d15f3f9.

Review: GPT-6.1 Sol (subfleet run --task review --tier hard), r3 APPROVE at b5fd880c9. The report is at ~/reviews/uk-hub/reviews/pr2545/review_r3.md, and r1 and r2 sit beside it.

  • r3 found both r2 findings resolved.
  • It found sound the merge resolution in 280e7dc4d, which was its first independent review: the Step 6 cap applies before every Step 7 charge, the winter fuel payment charge included, and the means tests keep the pre-charge aggregate.
  • It raised one P3: the PR body's receipts range. I fixed it to £294bn to £398bn, the report's base levels.
  • r3 killed three mutants: ignoring the charge in the election, leaking a fixed route, and putting the charge before Step 6.

What b5fd880c9 changed (tests only, review r2):

  • Monotonicity is now checked on each fixed property allowance route.
  • A hand-computed regression case covers the election weighing the winter fuel payment charge: £500 more credits raise tax before the charge from £0 to £86, while total tax falls from £200 to £86.
  • run() now deletes any fixed route before it sets its own, because main's reset_calculations() keeps inputs set through set_input.

Checks at b5fd880c9, at 03:2xZ 10/30:

  • Passed: Lint, Changes, Changelog fragments, Documentation build, Release build, the four smoke imports, and Python 6/6.
  • Pending: Python 1/6 to 5/6, YAML, Aggregate impact, and Fix evidence (rerun after the body edit; it passed earlier at this head, run 40991261659).
  • At the previous head, 280e7dc4d, every check passed. b5fd880c9 differs from it only in the property test file.

Aggregate impact: at 280e7dc4d, on certified uk-data 1.58.1 for 2025-26 to 2031-32:

  • 0 checks broken and 0 moves flagged.
  • Income tax moved by at most £36 a year, and household net income (HBAI) by at most £71: float32 rounding.
  • b5fd880c9 changes no model code, so the rerun at this head should match. The bot comment on this PR updates when the job finishes.

Locally at b5fd880c9: the property file passed 10/10 and step_6_step_7.yaml 8/8, with ruff and git diff --check clean.

Still open:

  • Merge hold: d2161 is in force, so no policyengine-uk merge or enqueue until it's lifted. Then enqueue with enqueuePullRequest(expectedHeadOid: "b5fd880c962b9217713022f808cab6a08d15f3f9"), never --admin.
  • María's re-review: her approval was given at f903b28a7, before both merges. I've marked the PR ready and re-requested her review.
  • Autumn Budget 2026 measures in current law #2719: whichever PR lands second carries pension_tax_allowance into step_6_tax_reductions, last. The PR body has the details.
  • Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963: whichever PR lands second carries marriage_allowance_tax_reduction into step_6_tax_reductions.
  • Main has moved since daec84d5b by 6 commits, including company car benefits. git merge-tree shows no conflict, and no reader of the deleted income_tax_additions or income_tax_subtractions remains on main beyond the three files this PR migrates.

🤖 Generated with Claude Code

@juaristi22
juaristi22 added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 2091a35 Oct 30, 2026
22 checks passed
@juaristi22
juaristi22 deleted the income-tax-step6-step7 branch October 30, 2026 20:35
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.

Income tax reductions offset the Step 7 charges (HICBC, annual allowance charge)

2 participants