Skip to content

Add bonus sacrifice, spousal maintenance, Widowed Parent's Allowance and heating fuel inputs, and fix student loan plan projection - #2573

Merged
juaristi22 merged 12 commits into
mainfrom
microcosm-engine-inputs-2572
Oct 23, 2026
Merged

juaristi22 merged 12 commits into
mainfrom
microcosm-engine-inputs-2572

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 22, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2572

The issue lists five engine changes that Microcosm UK needs. This PR makes all five, one commit each, in the issue's order. The UK hub's review then added four commits in #2580, merged into this branch, and three more answer Vahid's review (his fuels point is folded into the fuels commit): 12 commits in all, rebased on main after #2571 merged.

1. Bonus sacrifice: a second input

pension_contributions_via_bonus_sacrifice is a new person input: annual, GBP, default 0. It is uprated with average earnings, as the OBR projects the bonus-sacrifice base (costing note, paragraph 1.8), and listed under that index in uprating_indices.yaml.

pension_contributions_via_salary_sacrifice_from_pay now adds it to the salary input, under the same pay condition. Everything downstream reads _from_pay, so it follows:

  • the £2,000 cap (_adjusted);
  • salary_sacrifice_pension_ni_excess;
  • pension_annual_allowance_threshold_income (FA 2004 s. 228ZA(5)(b) adds back pay given up under flexible remuneration arrangements);
  • pension_contributions_for_annual_allowance and the workplace pension helper.

A negative value in either input counts as none, rather than offsetting the other. No other formula reads the salary input.

2. Spousal maintenance: an input the means tests count

spousal_maintenance_income is a new person input: maintenance paid by a spouse, civil partner, former spouse or former civil partner. It is uprated by GDP per head, as maintenance_income and private_transfer_income are. It counts:

maintenance_income is documented as child maintenance, which counts in none of the means tests. Datasets that do not supply the new input keep today's results. The child maintenance page in the book now describes this split.

3. Widowed Parent's Allowance: its own input

widowed_parents_allowance_reported (person, annual, GBP, CPI-uprated) and widowed_parents_allowance, which adds it. Unlike Bereavement Support Payment, the allowance:

It is also in household benefits, government spending, HBAI income and benefits, the pre-Budget household benefits, disable_simulated_benefits and the fiscal partition (a head next to bsp).

The issue asked to check Pension Credit's and Housing Benefit's income lists. Housing Benefit is above. Pension Credit is left alone: the allowance is not payable from State Pension age or while the recipient lives with a partner (SSCBA 1992 s. 39A(4) and (5)), so no Pension Credit claimant or partner can receive it.

This covers the reported side of #465; a rule-based amount stays phase 2 of the bereavement plan page. bsp_reported keeps its CPI uprating until datasets split FRS code 6 (PolicyEngine/microcosm#1222, PolicyEngine/policyengine-uk-data#578); #2381 can then freeze it.

4. uprate_student_loan_plans

  • The base year comes from the dataset. apply_uprating passes the dataset's first year down; _FRS_BASE_YEAR is gone.
  • Steps 2 and 3 use the data's ages. Projected datasets copy the base year with ages fixed, so both now compare age with the base year's oldest holder of the plan. That holder started university in the plan's first intake: 2012 for Plan 2 (age 30 in 2024), and 1998 for income-contingent Plan 1 loans (age 44 in 2024). Step 3 now fires: on a 2024 dataset it adds Plan 2 holders aged 31 to 35 in 2029.
  • Plan 1 write-off. Step 2 writes the 2005 and earlier intakes off at 65 (loans first paid before 1 September 2006) and later ones about 29 years after the course started, and requires the 1998 or a later intake. In 2029 it adds ages 45 to 49.
  • Funding nation (Fix means-test income and student-loan funding routes #2580). New holders in Steps 2 and 3 take the funding nation's plan, with household region as the proxy: Plan 4 in Scotland, Plan 1 in Northern Ireland, England and Wales by intake. Step 4 adds Plan 5 holders in England only: Plan 5 is the only plan that did not exist in the base year.
  • Draws are keyed on person_id (splitmix64_uniform, a new salt), so the same people take up a loan in every year and in any row order.

Step 1's relabelling and write-off of existing holders are unchanged. #1764 still applies: stored student_loan_repayments override the formula, so new holders repay nothing in the data.

5. Liquid and solid heating fuels

liquid_fuel_consumption and solid_fuel_consumption: household, annual, GBP, default 0 (COICOP 04.5.3 and 04.5.4). Both are part of housing_water_and_electricity_consumption, so they are not added to consumption. Ofgem's price cap, which prices the electricity and gas inputs held in DATASET_UPRATING_EXCLUSIONS, does not cover them, so dataset projection uprates them by CPI like other LCFS spending until a dataset declares their own price year, so they stay out of #2571's energy projector. No formula reads them yet.

Tests

New tests, each failing on main:

  • policyengine_uk/tests/policy/baseline/gov/hmrc/pensions/pension_contributions_via_bonus_sacrifice.yaml (6 cases) and policyengine_uk/tests/test_bonus_sacrifice_properties.py: moving any part of a sacrifice between the two inputs changes none of 15 outputs, from the cap to HBAI income, in 2028 to 2030; £10,000 of bonus sacrifice on £80,000 of pay raises employee NICs by £160 and employer NICs by £1,200 in 2029-30.
  • policyengine_uk/tests/policy/baseline/gov/dwp/spousal_maintenance_income.yaml (7 cases) and policyengine_uk/tests/test_spousal_maintenance_income.py: £100 a month lowers a UC award by £100 a month and guarantee credit by the same; child maintenance changes no means test; both reach market and HBAI income.
  • policyengine_uk/tests/policy/baseline/gov/dwp/widowed_parents_allowance.yaml (7 cases) and policyengine_uk/tests/test_widowed_parents_allowance.py: £156.65 a week raises taxable income by the annual amount and lowers a UC award by the same amount, and Bereavement Support Payment changes neither; Housing Benefit, Income Support, the benefit cap and Carer's Allowance; CPI projection.
  • policyengine_uk/tests/test_student_loan_plan_uprating.py: on a 2024 dataset, 2029 adds Plan 2 holders aged 31 to 35 at the take-up rate and Plan 1 holders aged 45 and 46; a 2023 dataset also adds age 30; a person's draw is the same in 2028 and 2029 and in any row order.
  • policyengine_uk/tests/test_heating_fuel_inputs.py: the defaults are zero, the fuels add nothing to consumption, and projection uprates them by CPI.
  • From Fix means-test income and student-loan funding routes #2580: test_income_support_spousal_maintenance.py, test_council_tax_reduction_maintenance_wpa.py, test_non_dependant_spousal_maintenance.py and the funding-nation cases in test_student_loan_plan_uprating.py; 47 of their 72 cases fail on the commit before Fix means-test income and student-loan funding routes #2580.

Changed: test_uc_incapacity_income.py (the 2013 UC list now has the two new sources) and, from #2580, the funding-nation cases in test_student_loan_plan_uprating.py.

Mutation checks: dropping the bonus input from _from_pay, reg. 9(f), the child condition on the maintenance disregard, the allowance from the benefit cap, the Carer's Allowance overlap list or the Income Support disregard each fails a test.

Run locally: before #2580, every Python test file that reads a changed list or function (100 files: 1,290 passed, 11 skipped for want of dataset credentials, 1 existing xfail); at #2580's head with the CTR fixture fixed, the 43 test files that read its changes (1,763 passed, 61 skipped) and all YAML policy tests (4,253); after rebasing on main with #2571, all YAML policy tests (4,338) and the new and touched Python tests (3,013 passed). The full suite runs in CI.

Reproducer: policyengine_uk/tests/test_student_loan_plan_uprating.py::test_new_plan_2_holders_are_aged_31_to_35_in_2029, policyengine_uk/tests/test_student_loan_plan_uprating.py::test_the_two_plan_1_write_off_rules, policyengine_uk/tests/test_income_support_spousal_maintenance.py::test_spousal_maintenance_reduces_an_existing_income_support_award, policyengine_uk/tests/test_non_dependant_spousal_maintenance.py::test_housing_benefit_non_dependant_band_counts_spousal_maintenance

axiom: uksi/2013/376/66 encoded, with companion cases for (b)(vi) and (d) queued in TheAxiomFoundation/rulespec-uk#392 | TheAxiomFoundation/rulespec-uk#390 queued (SPC Regs 2002 regs 9(f) and 15(5)(d)) | TheAxiomFoundation/rulespec-uk#485 queued (HB Regs 2006 Sch 5 paras 16, 47 and 47A; HB (SPC) Regs 2006 reg 29(1)(o) and Sch 5 paras 7 and 20; IS Regs 1987 Sch 9 para 16(h)) | TheAxiomFoundation/rulespec-uk#434 queued (HB (SPC) Regs 2006 reg 27(4)(c)(ii)) | TheAxiomFoundation/rulespec-uk#425 queued (WRA 2012 s.96(10)(n)) | TheAxiomFoundation/rulespec-uk#398 queued (SI 1979/597 reg 12; SSI 2023/302 reg 16(3)(e)) | TheAxiomFoundation/rulespec-uk#422 queued (ITEPA 2003 s.577) | TheAxiomFoundation/rulespec-uk#477 queued (NICs Act 2026 s.1) | from #2580, IS Regs 1987 reg. 40 and Sch. 9 paras. 15(3)(a) and 73, the Council Tax Reduction schemes' maintenance and widowed parent's allowance disregards, and HB Regs 2006 reg. 74 / HB (SPC) Regs 2006 reg. 55: needed (on the UK hub's open list for #2580) | n/a for the student loan projection and the fuel inputs: no legal rule

🤖 Generated with Claude Code

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

@juaristi22 thanks, this is a big but well-split PR, and most of it checks out against the legislation. Review at head 313b18c0, round 1. No must findings. There are four shoulds: two on the student loan projection, one on where the heating fuels sit relative to #2571, and one on Income Support. The rest are nits.

What I checked

  • Primary sources for every new legal claim: NICs Act 2026 s.1 with ITEPA s.69A, FA 2004 s.228ZA(5)(b) and (6), ITTOIA s.727, UC Regs reg. 66(1)(b)(vi) and (d), SPC Regs regs. 9(f) and 15(5)(d), HB Regs Sch. 5 paras. 16, 47 and 47A, HB (SPC) Regs reg. 27(4)(c)(ii), reg. 29(1)(o) and Sch. 5 paras. 7 and 20, IS Regs reg. 54, reg. 55 and Sch. 9 paras. 16(h) and 73, ITEPA s.577, WRA 2012 s.96(10)(n), SSCBA s.39A, SI 1979/597 reg. 4, SSI 2023/302 reg. 16(3)(e), and the GOV.UK student loan plan and write-off pages.
  • Tests in a fresh env at the head: all YAML in the touched areas (spousal maintenance, WPA, hmrc/pensions, salary sacrifice NI, student loans, benefit cap, Carer's Allowance overlap, pension-age HB, Pension Credit): 697 passed. Pytest: all 50 new or changed tests passed, plus the salary sacrifice, annual allowance, ANI and HB regressions. The other regressions that read a changed list (benefit cap, carer overlap, disable_simulated_benefits, fiscal partition, gov_spending, uprating, war widow's pension, HBAI property income): 191 passed.
  • On the merge base, the three new YAML files give 19 failed and 1 passed, and test_student_loan_plan_uprating.py fails 5 of 5. So the new tests do test the change. The Reproducer fails on base and passes at the head.
  • CI at the head: YAML, Lint, Docs and smoke imports pass. Test / Python 1-5 and Aggregate impact were still pending when I posted, and there is no bot comment yet. I'd expect no aggregate change in any year: the only baseline path is the student loan relabelling, and stored student_loan_repayments override the formula (#1764).
  • Data: none of the five new inputs has a writer in policyengine-uk-data or Microcosm yet (Microcosm lists the two fuels as uncarried). So they all default to 0, and baseline results only move through the student loan projection, as the body says.

What is right

  • Bonus sacrifice. The NICs Act 2026 cap applies to pension contributions under "optional remuneration arrangements". ITEPA s.69A covers both giving up pay (type A) and taking a benefit instead of a bonus (type B), so one £2,000 cap across both inputs is right. FA 2004 s.228ZA(5)(b) adds back "flexible remuneration arrangements" too. _from_pay is the only formula that reads the salary input, and every reader (cap, NI excess, threshold income, AA contributions, the workplace pension helper) uses _from_pay. Nothing reaches ANI or employment_income, so there is no double count.
  • Spousal maintenance. Not taxable (ITTOIA s.727), and it stays out of income tax, ANI and tax credit income. UC, Pension Credit (with reg. 9(f)), and both HB regimes with the £15 child-conditional disregard all match the regulations. The savings-credit-only route and the general route are chosen with where, so nothing is counted twice.
  • Widowed Parent's Allowance. Taxable, UC unearned income, counted for the benefit cap, £15 HB and £10 IS disregards, CA and CSP overlap, and tax credits in full: all match. HB reads it only through the new variable, so it is not counted twice through social_security_income. Leaving Pension Credit alone is right under s.39A. As a reported input, it needs no encoding of the April 2017 closure to new claims or the s.39A end conditions; those matter for the rule-based amount in phase 2.

Findings

  1. should: Steps 2 and 3 of the student loan projection give Plan 2 to people in Scotland and Northern Ireland. policyengine_uk/data/economic_assumptions.py:621-644. plan1_new_cohort and plan2_new_cohort have no region term. Before this PR, Step 3 could never fire, so it did not matter; the body says it now does. On a 2024 dataset projected to 2029, a degree-holder aged 31 to 35 with no loan in Scotland or Northern Ireland is labelled PLAN_2 at the take-up rate. GOV.UK ("Repaying your student loan: which repayment plan you're on") puts SAAS borrowers on Plan 4 and Student Finance NI borrowers on Plan 1, whatever their start year. Step 4 already limits Plan 5 to England. I'd suggest:

    • Step 3: England and Wales get Plan 2, Scotland Plan 4, Northern Ireland Plan 1.
    • Step 2: Scotland gets Plan 4 (Northern Ireland is already Plan 1).

    Step 1 (unchanged) also relabels existing Scottish holders to Plan 1 or 2 by start year, and sends non-England Plan 5-age holders to Plan 2. That is outside this PR, but worth an issue. Impact is on the plan label only, since new holders repay nothing under #1764, but plan counts and any reform that recomputes repayments by plan see it.

  2. should: Step 2 writes Plan 1 off 29 years after the course starts, but the loans it targets are written off at 65. economic_assumptions.py:627 (uni_start_year + _PLAN1_WRITEOFF_YEARS > year) and the test at test_student_loan_plan_uprating.py:101-103. GOV.UK ("When your student loan gets written off or cancelled") says Plan 1 loans first paid before 1 September 2006 are written off when the borrower is 65; only later Plan 1 loans go 25 years after the first April due. Step 2 now anchors on the 1998 intake, so in 2029 it covers ages 45 to 49, the 1998 to 2002 intakes, all pre-2006 loans. The 29-year rule then drops the 1998 to 2000 intakes (ages 47 to 49), whose loans are still outstanding, so only 45 and 46 are added, and the new test codifies that cut-off. Using the age-65 rule for start years up to 2005 (and the 29-year proxy after) would fix it; the test would then cover 45 to 49. Step 1's write-off of existing pre-2006 holders has the same issue, but is unchanged here.

  3. should: the heating fuels are held flat as if Ofgem-priced, and #2571 would keep it that way. economic_assumptions.py:118-128. DATASET_UPRATING_EXCLUSIONS exists because electricity and gas are "NEED kWh converted at Ofgem Q2 2026 unit rates", so they already carry FY2026-27 prices (uprating_indices.yaml header). The same header says LCFS consumption is "at data-year prices and do[es] need uprating". Ofgem's cap does not cover heating oil, LPG, coal or wood, and the only planned source is Microcosm's COICOP 04.5.3 and 04.5.4 figures, with period_value: 2024. So adding the fuels to the exclusions holds 2024 prices flat into 2026 and later, and overrides the uprating = CPI each variable declares.

    On #2571: I checked it at ff134627. uprate_energy and the reset group still take their variable set from DATASET_UPRATING_EXCLUSIONS, so our #2571 should 2 still stands. Merged together, the "one-line merge" in the body would apply a dataset's FY2026-27 energy declaration to 2024-priced fuels, leaving them about two years of price growth too low. No output changes today (both default to 0 and nothing reads them), hence should.

    The simplest fix is to leave the fuels out of DATASET_UPRATING_EXCLUSIONS and let them CPI-uprate like other LCFS consumption, until a dataset declares their own price year. That makes the two PRs independent in meaning. It also means test_heating_fuel_inputs.py ("projection holds them flat"), KNOWN_UNUPRATED in test_uprating_declarations.py and the uprating_indices.yaml listing change with it. On order: I'd still merge #2571 first, as we suggested on #2571. It is ready and this PR is a draft, and the remaining conflicts (git merge-tree gives three: economic_assumptions.py, uprating_indices.yaml and the economic assumptions README) are all comment and doc text, which this PR can take on rebase.

  4. should: Income Support still ignores spousal maintenance. variables/gov/dwp/income_support_applicable_income.py. IS Regs 1987 reg. 54 makes a spouse, former spouse, civil partner or former civil partner a "liable relative", and reg. 55 counts their payments as income; Sch. 9 para. 73 disregards only child maintenance. On a lone parent with a child in 2026, £100 a week of spousal maintenance moves HB income by £4,420 and IS income by £0. The gap predates the PR, and the IS population is small now, but the new input is the natural place to close it. Adding it to IS income here or noting it as not modelled in the IS variable would both do.

  5. nit: UC counts maintenance only "under a court order or an agreement for maintenance". UC reg. 66(1)(d). spousal_maintenance_income's documentation includes voluntary payments, which Pension Credit (reg. 15(5)(d)(iii)) and HB (para. 47, "whether under a court order or not") count, but UC's wording does not clearly reach. Survey data cannot separate them and an informal arrangement may well be an "agreement", so a line in the variable's documentation is enough.

  6. nit: maintenance from a former unmarried partner. HB para. 47 covers maintenance from a "former partner", which includes a former cohabitee. The input is described as spouse or civil partner only. A sentence saying where former-cohabitee maintenance should go (here or maintenance_income) would help whoever maps the data.

  7. nit: Council Tax Reduction counts neither new income. council_tax_reduction_applicable_income.py:88-136. On the same lone parent, WPA of £156.65 a week adds £7,365.80 to HB income and £0 to CTR income, and spousal maintenance £4,420 and £0. The model's CTR otherwise mirrors HB income (the two match in the base case), and the Welsh prescribed scheme and English pension-age scheme copy HB's disregards. I have not checked each scheme's text, so I raise it as a question: add both to the CTR lists, or say why not.

  8. nit: uprate_student_loan_plans now reads person_id but its early-return guard only checks student_loan_plan and highest_education (economic_assumptions.py:557-559 and :589). Every UK dataset has the column, so this is robustness only.

  9. nit: IS Sch. 9 para. 16 is "subject to paragraphs 36 and 37", the aggregate limit with war pensions. The HB variable notes its equivalent; a one-line "not modelled" note in the IS formula would match.

Related PRs

  • #1737 (mine): it is docs only and adds bereavement-support-plan.md as a new file, but main already has a later version of that page, which this PR edits. No code or meaning conflict; this PR's widowed_parents_allowance is the variable #1737 planned. Merge this one on its own merits; #1737 then needs closing or rebasing to drop its copy of the page.
  • #2571: see finding 3.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 402e7c6746 against head 6fca915970, 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

New warnings

  • Widowed Parent's Allowance is not zero for every unit (inert:widowed_parents_allowance): 2025-26: zero for every unit; 2026-27: zero for every unit; 2027-28: zero for every unit

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.
  • Widowed Parent's Allowance (spending.widowed_parents_allowance) is measured on the head only.
  • Widowed Parent's Allowance (caseloads.widowed_parents_allowance) is measured on the head only.

Moves flagged for review

None.

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Widowed Parent's Allowance (new: head levels) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
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
Widowed Parent's Allowance (new: head levels) 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Standard reform costings (change in gov_balance)

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp 0 0 0 0 0 suppressed suppressed

Standard reforms: change in each reform's target

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise additional rate by 3pp: change in income_tax 0 0 0 0 0 suppressed suppressed

Household net income by decile

No 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)
  • VAT is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-54,797,972 in total; 2026-27: 76 units below zero, a weighted £-56,271,349 in total; 2027-28: 76 units below zero, a weighted £-57,609,146 in total
Counted-once check

Each of 85 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 402e7c6746 uk 2.148.4 (files 32999b1d5216), core 3.33.2, py 3.13.17 aarch64 66e05b025dc6 d4c1e9f08160 1502.28s
head #2573 merged into main 6fca915970 uk 2.148.4 (files ec0278ff6af9), core 3.33.2, py 3.13.17 aarch64 66e05b025dc6 2d09eca13f5d 1559.65s

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
Income tax £299.29bn £319.01bn £336.54bn £351.69bn £367.24bn £385.36bn £403.66bn
National Insurance (employee and self-employed) £52.58bn £54.94bn £56.75bn £58.48bn £60.62bn £62.57bn £65.03bn
National Insurance (employer) £152.64bn £159.18bn £164.14bn £168.73bn £176.11bn £181.72bn £188.90bn
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.62bn £13.06bn £13.55bn £14.04bn £14.54bn £15.09bn £15.65bn
Student loan repayments £7.83bn £8.12bn £8.35bn £8.56bn £8.79bn £9.04bn £9.38bn
VAT £253.71bn £260.53bn £266.72bn £273.14bn £279.83bn £286.71bn £293.71bn
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 £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
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
TV licence fee £4.28bn £4.43bn £4.44bn £4.46bn £4.48bn £4.51bn £4.53bn
Council tax £49.56bn £52.45bn £55.78bn £59.39bn £62.98bn £66.74bn £70.70bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.51bn £0.52bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.61bn £0.63bn £0.67bn £0.70bn £0.73bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax on the household's own purchases £6.93bn £7.42bn £7.85bn £8.26bn £8.68bn £9.09bn £9.51bn
Stamp duty land tax paid by companies £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
Land transaction tax (Wales) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land and buildings transaction tax (Scotland) £0.01bn £0.01bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
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
State Pension £122.15bn £126.64bn £127.76bn £129.65bn £133.46bn £137.40bn £141.47bn
Pension Credit £6.68bn £7.07bn £7.09bn £7.16bn £7.28bn £7.42bn £7.52bn
Winter Fuel Payment £1.70bn £1.68bn £1.59bn £1.57bn £1.57bn £1.55bn £1.52bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.54bn £80.75bn £83.40bn £85.21bn £86.21bn £87.61bn £88.91bn
Housing Benefit £8.59bn £8.93bn £9.19bn £9.33bn £9.61bn £9.87bn £10.15bn
Council Tax Reduction £1.99bn £2.03bn £2.08bn £2.13bn £2.18bn £2.23bn £2.29bn
Employment and Support Allowance (income-related) £0.79bn £0.81bn £0.83bn £0.85bn £0.87bn £0.89bn £0.91bn
Employment and Support Allowance (contribution-based) £5.22bn £5.36bn £5.49bn £5.62bn £5.76bn £5.90bn £6.04bn
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.30bn £0.31bn £0.32bn £0.33bn £0.33bn
Income Support £0.12bn £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 £27.05bn £28.19bn £29.28bn £30.02bn £30.75bn £31.51bn £32.28bn
Disability Living Allowance £7.52bn £7.83bn £8.14bn £8.34bn £8.55bn £8.76bn £8.97bn
Attendance Allowance £8.71bn £9.08bn £9.43bn £9.67bn £9.90bn £10.15bn £10.40bn
Carer's Allowance £4.50bn £4.69bn £4.87bn £4.99bn £5.11bn £5.23bn £5.36bn
Carer Support Payment (Scotland) £0.31bn £0.32bn £0.34bn £0.34bn £0.35bn £0.36bn £0.37bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.57bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.23bn £16.91bn £17.53bn £17.96bn £18.39bn £18.84bn £19.29bn
Scottish Child Payment £0.50bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.58bn
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.32bn £3.41bn £3.49bn £3.57bn £3.66bn £3.75bn £3.84bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.13bn £1.16bn £1.19bn £1.22bn £1.25bn £1.28bn £1.31bn
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.70bn £0.72bn £0.74bn £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.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.77bn £3.27bn £3.36bn £3.43bn £3.53bn £3.61bn £3.70bn
Universal childcare entitlement £2.26bn £2.45bn £2.51bn £2.58bn £2.64bn £2.72bn £2.78bn
Targeted childcare entitlement £0.47bn £0.49bn £0.50bn £0.51bn £0.52bn £0.53bn £0.47bn
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 £204.68bn £205.46bn £206.22bn £207.04bn £207.96bn £208.89bn £209.79bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £25.78bn
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
State Pension 11,308k 11,208k 10,906k 10,812k 10,860k 10,908k 10,955k
Pension Credit 1,491k 1,489k 1,478k 1,459k 1,459k 1,456k 1,453k
Winter Fuel Payment 7,091k 7,011k 6,599k 6,512k 6,493k 6,379k 6,248k
Pension Age Winter Heating Payment (Scotland) 806k 807k 807k 805k 809k 812k 816k
Universal Credit 6,361k 6,370k 6,404k 6,419k 6,390k 6,387k 6,368k
Housing Benefit 1,254k 1,252k 1,254k 1,239k 1,245k 1,247k 1,249k
Council Tax Reduction 3,187k 3,212k 3,227k 3,246k 3,265k 3,282k 3,294k
Employment and Support Allowance (income-related) 71k 71k 71k 72k 72k 72k 72k
Employment and Support Allowance (contribution-based) 722k 724k 727k 730k 733k 737k 740k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 68k 68k 68k 69k 69k
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,581k 3,595k 3,608k 3,623k 3,639k 3,655k 3,671k
Disability Living Allowance 1,296k 1,301k 1,306k 1,311k 1,317k 1,323k 1,329k
Attendance Allowance 1,701k 1,708k 1,714k 1,721k 1,729k 1,736k 1,744k
Carer's Allowance 1,038k 1,042k 1,046k 1,050k 1,055k 1,059k 1,064k
Carer Support Payment (Scotland) 71k 72k 72k 72k 73k 73k 73k
Carer's Allowance Supplement (Scotland) 0k 72k 72k 72k 73k 73k 73k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 138k 139k 139k 140k 140k 141k
Armed Forces Compensation Scheme 94k 94k 94k 95k 95k 95k 96k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,136k 8,165k 8,185k 8,215k 8,249k 8,282k 8,314k
Scottish Child Payment 352k 354k 355k 359k 357k 358k 357k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 201k 202k 203k 204k 204k 205k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 334k 335k 336k 338k 339k 341k 342k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 182k 183k 183k 184k 185k 186k 186k
Sure Start Maternity Grant 26k 26k 26k 27k 27k 27k 27k
Bereavement Support Payment 98k 98k 99k 99k 100k 100k 101k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,018k 1,029k 1,028k 1,033k 1,034k 1,039k 1,023k
Extended childcare entitlement 718k 724k 728k 732k 737k 741k 743k
Universal childcare entitlement 986k 989k 992k 997k 1,002k 1,013k 1,015k
Targeted childcare entitlement 98k 98k 96k 96k 96k 97k 84k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 99k 99k 100k 100k 100k 101k
Adult Dependants' Grant 18k 18k 12k 13k 13k 13k 13k
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 £899.38bn £939.24bn £976.25bn £1,009.45bn £1,045.73bn £1,082.67bn £1,123.55bn
Government spending £530.59bn † £545.60bn † £553.50bn † £560.62bn † £569.17bn † £578.34bn † £587.37bn †
Government balance, each receipt once £368.79bn † £393.64bn † £422.75bn † £448.84bn † £476.56bn † £504.34bn † £536.18bn †
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 £899.38bn £939.24bn £976.25bn £1,009.45bn £1,045.73bn £1,082.67bn £1,123.55bn
household_tax £493.03bn £519.53bn £545.39bn £567.58bn £589.79bn £614.24bn £640.95bn
pre_budget_change_household_tax £485.21bn £511.41bn £537.04bn £558.54bn £580.51bn £604.69bn £631.05bn
gov_spending £530.59bn † £545.60bn † £553.50bn † £560.62bn † £569.17bn † £578.34bn † £587.37bn †
household_benefits £530.59bn † £545.60bn † £553.50bn † £560.62bn † £569.17bn † £578.34bn † £587.37bn †
gov_balance £368.79bn † £393.64bn † £422.75bn † £448.84bn † £476.56bn † £504.34bn † £536.18bn †
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,657.06bn £1,719.25bn £1,771.68bn £1,821.99bn £1,872.88bn £1,930.99bn £2,001.98bn
Household net income £1,655.35bn † £1,704.56bn † £1,737.91bn † £1,772.09bn † £1,808.19bn † £1,849.75bn † £1,901.35bn †
Household net income (HBAI definition) £1,461.82bn £1,509.34bn £1,543.14bn £1,576.21bn £1,610.27bn £1,649.28bn £1,699.67bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,514k 69,778k 70,036k 70,316k 70,626k 70,944k 71,249k
Benefit units 35,247k 35,381k 35,512k 35,654k 35,811k 35,972k 36,127k
Households 31,167k 31,285k 31,401k 31,526k 31,665k 31,808k 31,944k
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.2% 15.2% 15.5% 15.7% 15.8% 15.9% 15.8%
Absolute poverty, before housing costs: children 24.6% 21.4% 21.6% 21.6% 21.8% 22.0% 21.9%
Absolute poverty, before housing costs: working-age adults 14.0% 13.6% 14.0% 14.2% 14.2% 14.3% 14.3%
Absolute poverty, before housing costs: pensioners 13.7% 13.2% 13.2% 13.5% 13.5% 13.6% 13.6%
Absolute poverty, after housing costs: everyone 21.6% 20.9% 21.4% 21.6% 22.0% 22.2% 22.3%
Absolute poverty, after housing costs: children 33.4% 30.9% 31.2% 31.3% 31.7% 32.2% 32.3%
Absolute poverty, after housing costs: working-age adults 19.9% 19.7% 20.3% 20.5% 20.8% 21.1% 21.1%
Absolute poverty, after housing costs: pensioners 12.8% 12.6% 12.6% 13.0% 13.3% 13.4% 13.4%
Relative poverty, before housing costs: everyone 17.3% 16.5% 16.5% 16.6% 16.4% 16.5% 16.4%
Relative poverty, before housing costs: children 26.4% 23.7% 23.4% 23.4% 22.9% 23.0% 22.9%
Relative poverty, before housing costs: working-age adults 14.7% 14.4% 14.7% 14.8% 14.7% 14.8% 14.8%
Relative poverty, before housing costs: pensioners 15.0% 14.8% 14.1% 14.2% 14.0% 14.0% 14.2%
Relative poverty, after housing costs: everyone 21.7% 21.1% 21.3% 21.3% 21.4% 21.5% 21.8%
Relative poverty, after housing costs: children 33.5% 31.3% 31.0% 30.8% 31.0% 31.1% 31.5%
Relative poverty, after housing costs: working-age adults 19.9% 19.9% 20.2% 20.3% 20.5% 20.6% 20.8%
Relative poverty, after housing costs: pensioners 13.0% 12.7% 12.6% 12.2% 12.2% 12.2% 12.9%
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,292k 10,600k 10,879k 11,030k 11,126k 11,261k 11,276k
Absolute poverty, before housing costs: children 3,696k 3,227k 3,267k 3,285k 3,319k 3,371k 3,363k
Absolute poverty, before housing costs: working-age adults 5,962k 5,814k 6,092k 6,204k 6,256k 6,325k 6,337k
Absolute poverty, before housing costs: pensioners 1,634k 1,560k 1,519k 1,540k 1,551k 1,566k 1,576k
Absolute poverty, after housing costs: everyone 15,006k 14,575k 14,991k 15,214k 15,515k 15,778k 15,881k
Absolute poverty, after housing costs: children 5,005k 4,656k 4,709k 4,752k 4,834k 4,930k 4,973k
Absolute poverty, after housing costs: working-age adults 8,478k 8,434k 8,830k 8,977k 9,160k 9,308k 9,358k
Absolute poverty, after housing costs: pensioners 1,522k 1,484k 1,452k 1,486k 1,521k 1,540k 1,551k
Relative poverty, before housing costs: everyone 11,992k 11,508k 11,549k 11,665k 11,552k 11,671k 11,720k
Relative poverty, before housing costs: children 3,963k 3,570k 3,543k 3,556k 3,490k 3,521k 3,519k
Relative poverty, before housing costs: working-age adults 6,246k 6,184k 6,380k 6,486k 6,458k 6,537k 6,561k
Relative poverty, before housing costs: pensioners 1,782k 1,754k 1,626k 1,623k 1,605k 1,613k 1,640k
Relative poverty, after housing costs: everyone 15,067k 14,733k 14,905k 14,951k 15,105k 15,243k 15,533k
Relative poverty, after housing costs: children 5,019k 4,715k 4,686k 4,669k 4,723k 4,757k 4,840k
Relative poverty, after housing costs: working-age adults 8,497k 8,517k 8,772k 8,888k 8,988k 9,081k 9,205k
Relative poverty, after housing costs: pensioners 1,551k 1,502k 1,447k 1,393k 1,395k 1,404k 1,488k
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.3088 0.3062 0.3069 0.3075 0.3080 0.3086 0.3097
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,835 † £18,010 † £18,020 † £18,060 † £18,380 † £18,572 † £18,734 †
Decile 2: mean household_net_income per household £28,078 † £29,004 † £28,743 † £29,189 † £29,502 † £29,904 † £30,490 †
Decile 3: mean household_net_income per household £34,294 † £35,659 † £36,184 † £36,723 † £37,036 † £37,546 † £38,328 †
Decile 4: mean household_net_income per household £38,824 † £40,941 † £42,016 † £42,629 † £43,377 † £44,229 † £44,578 †
Decile 5: mean household_net_income per household £43,957 † £44,826 † £45,887 † £46,647 † £47,810 † £48,661 † £49,814 †
Decile 6: mean household_net_income per household £48,402 † £49,760 † £50,859 † £51,587 † £51,895 † £53,349 † £54,692 †
Decile 7: mean household_net_income per household £56,398 † £57,591 † £58,375 † £59,116 † £60,152 † £60,779 † £62,280 †
Decile 8: mean household_net_income per household £69,269 † £70,751 † £72,207 † £73,297 † £74,774 † £76,205 † £78,216 †
Decile 9: mean household_net_income per household £79,799 † £82,161 † £83,281 † £84,726 † £86,255 † £87,812 † £90,866 †
Decile 10: mean household_net_income per household £117,839 † £120,664 † £122,603 † £124,740 † £126,967 † £129,313 † £132,025 †
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.22bn £6.50bn £6.70bn £6.90bn £7.11bn £7.34bn £7.62bn
Raise higher rate by 1pp £3.54bn £3.82bn £4.05bn £4.27bn £4.49bn £4.76bn £4.96bn
Raise personal allowance by ~800GBP/year £-3.83bn £-3.96bn £-4.03bn £-4.10bn £-4.19bn £-4.30bn £-2.02bn
Raise child benefit by 25GBP/week per additional child £-2.00bn £-1.76bn £-1.58bn £-1.48bn £-1.38bn £-1.28bn £-1.17bn
Reduce Universal Credit taper rate to 20% £-20.49bn £-21.05bn £-21.50bn £-21.94bn £-22.03bn £-22.40bn £-22.87bn
Raise Class 1 main employee NICs rate to 10% £11.07bn £11.51bn £11.84bn £12.14bn £12.49bn £12.83bn £13.23bn
Raise VAT standard rate by 2pp £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.03bn £-3.16bn £-3.28bn £-3.35bn £-3.39bn £-3.44bn £-3.51bn
Raise the State Pension by 10% £-7.81bn £-8.07bn £-7.99bn £-8.11bn £-8.36bn £-8.66bn £-9.02bn
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.36bn £6.65bn £6.86bn £7.07bn £7.28bn £7.52bn £7.80bn
Raise higher rate by 1pp: change in income_tax £3.55bn £3.83bn £4.06bn £4.28bn £4.50bn £4.77bn £4.97bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.96bn £-4.10bn £-4.19bn £-4.26bn £-4.36bn £-4.47bn £-1.77bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.34bn £2.15bn £1.96bn £1.85bn £1.74bn £1.63bn £1.51bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.48bn £21.04bn £21.49bn £21.93bn £22.02bn £22.40bn £22.86bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.33bn £11.79bn £12.13bn £12.44bn £12.78bn £13.13bn £13.62bn
Raise VAT standard rate by 2pp: change in vat £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.03bn £3.16bn £3.28bn £3.36bn £3.41bn £3.47bn £3.52bn
Raise the State Pension by 10%: change in state_pension £10.72bn £11.23bn £11.37bn £11.62bn £12.08bn £12.54bn £13.07bn

@MaxGhenis

Copy link
Copy Markdown
Collaborator

UK hub independent review (GPT-6.1 Sol) at 313b18c02: four P2 findings, so it requests changes. All 17 checks pass, and the commit-by-commit checks of bonus sacrifice, spousal maintenance (UC, PC, HB claimant), WPA, student loans and heating fuels otherwise hold. The new inputs default to 0, so nothing moves today, but these matter once your weekend build populates them:

  1. Income Support omits spousal maintenance. policyengine_uk/variables/gov/dwp/income_support_applicable_income.py:26 never includes the new input. Existing claimants therefore retain an overstated award when maintenance is supplied. Include claimant/partner maintenance and add a regression comparing an otherwise identical existing award. IS regulation 40 counts non-earnings income; Schedule 9 paragraph 15(3)(a) prevents treating former-partner maintenance as disregarded voluntary payments. Child maintenance remains disregarded under paragraph 73.

  2. Council Tax Reduction omits both new income sources. policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_income.py:136 and :168 include neither WPA nor spousal maintenance in general-rule income. There is no indirect taxable-social-security-income path. Scotland expressly counts both under regulation 57(1)(b)(vi), (1)(d) and (4), with a £15/week WPA disregard. Thus £8,145.80 WPA should contribute £7,365.80, rather than zero, before other adjustments. Pensioner spousal maintenance is also explicit in England Schedule 1 paragraph 16(1)(o), with the child-family disregard in Schedule 5 paragraph 20. Add the appropriate applicant/partner paths, scheme disregards and tests; retain guarantee-credit passporting and avoid duplicating savings-credit income.

  3. The newly reachable student-loan assignment ignores funding nation. policyengine_uk/data/economic_assumptions.py:637 assigns Plan 2 without a regional condition. Projecting a 2024 dataset to 2029 consequently gives some loan-free Scottish/Northern Irish graduates aged 31–35 Plan 2. Official repayment-plan rules specify Plan 4 for SAAS and Plan 1 for Student Finance NI. Respect the funding route, using an explicit documented geographical proxy where necessary, and test Scotland and Northern Ireland. The new tests cover London only. This newly activated path is distinct from the pre-existing Step 1 and write-off approximations.

  4. Housing Benefit non-dependant bands omit spousal maintenance. policyengine_uk/variables/gov/dwp/housing_benefit/non_dep_deduction/household_benefits_individual_non_dep_deduction.py:20 uses taxable total_income, which correctly excludes maintenance for income tax but cannot represent normal gross income here. An employed non-dependant with £150/week earnings plus £100/week spousal maintenance belongs in the £250 band. In 2026–27 that means £46.85/week, rather than £20.40. HB regulation 74(2), (9) and pension-age regulation 55 require gross income and do not disregard spousal maintenance. Add it to the deduction-specific base, preserving its income-tax exemption. Audit the parallel local-CTR gross-income list at policyengine_uk/variables/gov/local_authorities/council_tax_reduction/_legacy.py:128 too.

@juaristi22: since this needs to land today before your fallback build, shall the hub push these four fixes onto your branch now (merge commits only, with tests), or would you rather do them? Reply here and I'll act straight away. If you'd rather land as is and fix in a follow-up PR before the build, say that instead.

@MaxGhenis

Copy link
Copy Markdown
Collaborator

Hand-off for the UK hub: draft stacked follow-up #2580, branch fix-2573-means-test-inputs, head e13b6b2693d76568277f67442d52b149a09dff2c, base microcosm-engine-inputs-2572 at reviewed head 313b18c0221d719f67ec3bf310a83158866b46e3. María's branch is unchanged.

Four commits address the four P2 findings:

  • ae2196a3e: Income Support counts claimant/partner spousal maintenance; continuing-award and exclusions regressions.
  • 5e01b4e2a: CTR counts maintenance and WPA across England/Wales/Scotland, £15 weekly statutory disregards, guarantee-credit passporting and savings-credit routing; nation/age/family regressions.
  • 475682f26: new student-loan assignments follow funding nation (documented household-region proxy) and entry year; 14 deterministic cases plus the existing five tests.
  • e13b6b269: HB and both national/local CTR non-dependant gross-income paths count maintenance, while income tax still excludes it; four regressions, including £150 + £100/week → £46.85/week HB deduction.

Validation: repository Ruff lint, uvx ruff format --check . (1,957 Python files), and git diff --check pass. Locked worktree environment installed with UV_LINK_MODE=clone uv sync --frozen --extra dev (Core 3.33.2). Runtime tests have not run: the mandatory gate refused the foreground -n 2 command at load1 60.94 / free disk 51.317 GB decimal (required ≤110 / ≥55). This job's 758 MB dependency cache was cleared; nothing outside this workspace was changed to reclaim space. The new/changed files contain 72 test cases in total, with expected values computed from the sources linked in the PR; that is a static count, not a passing-test count.

Run when host capacity clears:

UV_CACHE_DIR="$PWD/.job/uv-cache" python3 .job/run-gated.py /opt/homebrew/bin/uv run --frozen --no-sync pytest policyengine_uk/tests/test_income_support_spousal_maintenance.py policyengine_uk/tests/test_council_tax_reduction_maintenance_wpa.py policyengine_uk/tests/test_student_loan_plan_uprating.py policyengine_uk/tests/test_non_dependant_spousal_maintenance.py -n 2 -q

Impact: nonzero maintenance/WPA now reach these means tests; projected loan labels follow nation. No aggregate impact or dataset build was run. CI does not automatically run on this stacked base: the PR workflow is filtered to main, and #2580 currently has no checks. Open items: complete runtime tests and the base-failure run (.job/reproduce-base.py); hub's independent review of the combined head; Axiom parity (axiom: needed). Existing national CTR non-dependant rate-scale reuse (#2007), loan existing-holder relabelling/write-offs and cross-border funding ambiguity remain documented limitations.

Please keep both PRs draft and land the reviewed stack together. No merge or ready action was taken. .job/PROGRESS.md, HANDOFF.md, handoffs.jsonl, gate records and the commit bundle are in the assigned workspace for the hub. Git metadata is in .job/git because the supplied .git pointer is read-only; set GIT_DIR="$PWD/.job/git" GIT_WORK_TREE="$PWD" for local git commands.

@juaristi22

Copy link
Copy Markdown
Collaborator Author

Agreed, thanks. All four findings are right, and a stacked draft in #2580 is how I'd want them handled. Let's keep both PRs in draft and land them together once #2580's tests have run and the hub has reviewed the combined head.

@juaristi22

Copy link
Copy Markdown
Collaborator Author

@vahid-ahmadi thanks, all nine taken. The hub's stacked #2580 is now merged into this branch (fast-forward), and four commits on top cover the rest:

  1. Funding nation (should). Fix means-test income and student-loan funding routes #2580's 475682f26: new holders in Steps 2 and 3 take the funding nation's plan, with household region as the proxy (Scotland Plan 4, Northern Ireland Plan 1, England and Wales by intake). 0a7f9e5f4 puts Step 4 back to England only: Plan 5 is the only plan that did not exist in the base year, and the other nations' 2023-and-later intakes are on plans the data already holds at those ages. Step 1's relabelling of existing holders is unchanged; worth its own issue, as you say.
  2. Write-off at 65 (should). 0a7f9e5f4: Step 2 writes the 2005 and earlier intakes off at 65 and later ones after 29 years, and now requires the 1998 or a later intake. Projected from 2024 to 2029 it adds ages 45 to 49. A new test checks both rules in 2040. Step 1's write-off is unchanged: it zeroes stored repayments, so changing it moves baseline totals, which belongs in its own change.
  3. Fuels (should). de6fff1a6: they leave DATASET_UPRATING_EXCLUSIONS and are CPI-uprated like other LCFS spending, so this PR and Project labelled energy inputs from their declared price year #2571 no longer interact in meaning. Agreed on merging Project labelled energy inputs from their declared price year #2571 first; I'll rebase onto it.
  4. Income Support (should). Fix means-test income and student-loan funding routes #2580's ae2196a3e counts the claimant's and partner's spousal maintenance; child maintenance stays disregarded.
  5. UC court order or agreement (nit). Documented in cf52f50d4.
  6. Former cohabitee (nit). Documented in cf52f50d4: it stays out of the input, since UC and Pension Credit do not count it; working-age HB would, which the model does not capture.
  7. CTR (nit). Fix means-test income and student-loan funding routes #2580's 5e01b4e2a counts both in England, Wales and Scotland with the £15 disregards, and e13b6b269 adds maintenance to the HB and CTR non-dependant bands. 77e68dd20 fixes that test fixture.
  8. person_id guard (nit). Added in 0a7f9e5f4.
  9. IS paras 36 and 37 (nit). Noted as not modelled in cf52f50d4.

On #1737: once this merges, it will need closing or rebasing to drop its copy of the bereavement page.

Could you take another look at the new head?

@juaristi22
juaristi22 marked this pull request as ready for review October 23, 2026 00:11
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Ready for review at 7b73a30dd: the stack is in one branch now (this PR's five commits, the hub's four from #2580, four answering @vahid-ahmadi's review), with current main merged in. Locally at this head: Ruff clean, all YAML policy tests pass (4,302), and the new and touched Python tests pass (2,803). CI runs the full suite.

@vahid-ahmadi and @MaxGhenis (for the hub's look at the combined head): could you take a last look? The changes since your reviews are listed in my reply above. I'll put it in the merge queue once you've both signed off.

@MaxGhenis

Copy link
Copy Markdown
Collaborator

UK hub: approved. The independent review (GPT-6.1 Sol) of this PR with the fix stack #2580 approves at 7b73a30dd, which contains #2580 and your four later commits. All 17 checks pass, Aggregate impact included: no household's net income changes and no moves are flagged.

It now conflicts with main after #2571 landed overnight. The only conflict is the header comment of uprating_indices.yaml. #2592 is a one-click merge of main into this branch that keeps main's header and carries your liquid and solid fuel note into it. @juaristi22, merge #2592 (or resolve it yourself), and the hub lands this through the merge queue straight away.

juaristi22 and others added 12 commits October 23, 2026 10:43
The £2,000 NICs exemption cap from 6 April 2029 covers salary-sacrificed
and bonus-sacrificed pension contributions together, and FA 2004
s. 228ZA(5)(b) adds both back to annual allowance threshold income, so no
rule treats the two routes apart. Datasets still need to: HMRC's salary
sacrifice users and reliefs come from ASHE, which does not cover bonus
sacrifice, and the OBR costs the bonus route on its own base (costing
note, paragraphs 1.4, 1.5 and 1.9).

pension_contributions_via_bonus_sacrifice is a person input uprated with
average earnings, as the OBR projects its base (paragraph 1.8).
pension_contributions_via_salary_sacrifice_from_pay now adds it to the
salary input under the same pay condition, so the cap, the NICs excess
and the annual allowance readers follow. A negative value in either
input counts as none rather than offsetting the other.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Maintenance paid by a spouse, civil partner, former spouse or former civil
partner is income for Universal Credit (UC Regs 2013 reg. 66(1)(d)),
Pension Credit (SPC Regs 2002 reg. 15(5)(d)) and Housing Benefit (HB Regs
2006 reg. 40; HB (SPC) Regs 2006 reg. 29(1)(o)). Child maintenance is
none of these. No means test counted either: maintenance_income holds the
FRS child maintenance questions, and datasets put the payments from an
absent partner in private_transfer_income, which reaches only HBAI and
market income.

spousal_maintenance_income is a new person input, uprated by GDP per
head as the other two are. It counts:
- in UC unearned income, from 2013-04-29;
- in Pension Credit income, and in the savings credit non-qualifying
  income (reg. 9(f));
- in Housing Benefit income, less £15 a week where the family includes a
  child or young person (HB Regs 2006 Sch 5 para 47; HB (SPC) Regs 2006
  Sch 5 para 20), under both regimes. On the pension-age savings credit
  only route the disregard comes off the Pension Credit figure, which
  counts the maintenance in full (reg. 27(4)(c)(ii));
- in market income, household market income and HBAI income.

maintenance_income is documented as child maintenance, and the child
maintenance page now describes the split. Datasets that do not supply the
new input keep today's results.

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

FRS benefit code 6 is "Bereavement Support Payment / Widowed Parent's
Allowance", and datasets put it in bsp_reported, which reaches household
benefits and HBAI only. The two benefits are treated differently.
Bereavement Support Payment is tax-free, is not Universal Credit unearned
income and has had frozen rates since April 2017. Widowed Parent's
Allowance (SSCBA 1992 s.39A) rises with CPI and:
- is taxable (ITEPA 2003 s.577), so it is in social_security_income and
  also reaches Income Support and tax credit income;
- is UC unearned income (UC Regs 2013 reg. 66(1)(b)(vi));
- counts in Housing Benefit less £15 a week (HB Regs 2006 Sch 5 para 16;
  HB (SPC) Regs 2006 Sch 5 para 7);
- is disregarded by £10 a week in Income Support (IS Regs 1987 Sch 9
  para 16(h));
- is a welfare benefit for the benefit cap (WRA 2012 s.96(10)(n));
- overlaps with Carer's Allowance (SI 1979/597 regs 4 and 12) and Carer
  Support Payment (SSI 2023/302 reg. 16(3)(e)), as a whole payment: its
  additional pension is not separated.

widowed_parents_allowance_reported is a CPI-uprated person input and
widowed_parents_allowance adds it. Like Bereavement Support Payment it is
in household benefits, government spending, HBAI income and benefits, the
pre-Budget household benefits, disable_simulated_benefits and the fiscal
partition.

Pension Credit is left alone: the allowance is not payable from State
Pension age or while the recipient lives with a partner (s.39A(4) and
(5)), so no Pension Credit claimant or partner can receive it.

bsp_reported keeps its CPI uprating until datasets split code 6 (#2381).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
uprate_student_loan_plans had four problems:
- Step 3 never fired. base_year_age = age - (year - 2023) and
  uni_start_year = year - age + 18 give base_year_age = 2041 -
  uni_start_year, so uni_start_year >= 2012 implies base_year_age <= 29,
  and Step 3's test base_year_age > 29 is never true. No Plan 2 holders
  were added above the base year's oldest.
- It mixed two models. Step 1 assigns plans by the projection year's
  intake, which suits projected datasets: they copy the base year with
  ages fixed. Steps 2 and 3 tested base_year_age, which is a person's
  base-year age only if ages advance.
- The base year was a constant, 2023, while datasets built on FRS 2024-25
  start in 2024.
- The generator was seeded by the year and drew by position, so a person
  could be a new holder in one year and not the next, and the result
  depended on row order.

apply_uprating now passes the dataset's first year down. Steps 2 and 3
compare the data's age with the base year's oldest holder of the plan,
who started university in the plan's first intake: 2012 for Plan 2 and
1998 for income-contingent Plan 1 loans. On a 2024 dataset, Step 3 adds
Plan 2 holders aged 31 to 35 in 2029 and Step 2 adds Plan 1 holders aged
45 and 46. Each person's draw comes from splitmix64_uniform on person_id,
with a salt of its own.

Step 1 is unchanged. Stored student_loan_repayments still override the
formula (#1764).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine's energy inputs are electricity_consumption, gas_consumption
and domestic_energy_consumption. Homes off the gas grid heat with oil,
LPG, coal or wood, which ONS household spending records as liquid fuels
(COICOP 04.5.3) and solid fuels (04.5.4). Without inputs for them, an
energy reform cannot reach those homes, which cluster in rural areas and
Northern Ireland.

liquid_fuel_consumption and solid_fuel_consumption are household inputs,
annual, GBP, default 0. They are part of
housing_water_and_electricity_consumption, so they are not added to
consumption. Ofgem's price cap, which prices the electricity and gas
inputs, does not cover them, so they stay out of the energy projector
(DATASET_UPRATING_EXCLUSIONS) and are uprated by CPI from the data year,
like other LCFS spending, until a dataset declares their own price year.
No formula reads them yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fixture pinned Child Benefit, Universal Credit and the other awards
with bare values, which do not apply to 2026, so the model computed them
and they reached Council Tax Reduction income: 36 of the 45 cases failed.
Keying the benefit-unit inputs by year, as the people inputs already are,
isolates the statutory income list as intended. The CTR formula is
unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s in England only

Step 2 wrote every Plan 1 loan off 29 years after the course started, but
loans first paid before 1 September 2006 (the 2005 and earlier intakes)
are written off at 65 (GOV.UK, "When your student loan gets written off
or cancelled"). Projected from 2024 to 2029, Step 2 now adds holders at
ages 45 to 49 (the 1998 to 2002 intakes), not 45 and 46. It also now
requires the 1998 or a later intake, the first with income-contingent
loans, which the 29-year write-off had bounded before. Step 1's write-off
of existing holders is unchanged.

Step 4 goes back to England only. Plan 5 is the only plan that did not
exist in the base year; the 2023-and-later intakes in Wales, Scotland and
Northern Ireland are on plans (2, 4 and 1) the data already holds at those
ages, so adding holders there would count borrowers twice. The funding
nation still sets the plan in Steps 2 and 3.

uprate_student_loan_plans also returns early without person_id, which it
keys the take-up draws on.

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

- spousal_maintenance_income: Universal Credit counts maintenance under a
  court order or an agreement (reg. 66(1)(d)); voluntary payments are
  counted too, as survey data cannot separate them. Maintenance from a
  former cohabiting partner does not belong in the input: Universal Credit
  and Pension Credit do not count it, while working-age Housing Benefit
  does (Sch 5 para 47), which the model does not capture.
- income_support_applicable_income: paras 36 and 37 of Sch 9, which limit
  the widowed parent's allowance and war pension disregards together, are
  not modelled.

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

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

@juaristi22 thanks, round 2 at head 7b73a30dd (round 1 was 313b18c0). All four shoulds are resolved, the five nits are addressed, and I found nothing new above nit level, so I'm approving. One thing before it can land: the branch now conflicts with main (#2571 merged), and #2592 is the fix; see the merge order section.

Round 1 findings

  1. should, student loan plan by region: resolved. 475682f26 with 0a7f9e5f4, economic_assumptions.py:598-608. New holders in Steps 2 and 3 take new_borrower_plan: Scotland Plan 4, Northern Ireland Plan 1, England and Wales Plan 1 before the 2012 intake and Plan 2 after, and Plan 5 only for England from 2023. This matches GOV.UK ("which repayment plan you're on"): SAAS is Plan 4 and Student Finance NI is Plan 1 whatever the start year, Wales stays on Plan 2 after 2012, and Plan 5 is England from 1 August 2023. Step 4 is back to England only, and the reason in the comment is right: the other nations' 2023 and later intakes are on plans the base year already holds at those ages. Step 1 is unchanged, as agreed, and needs its own issue.
  2. should, Plan 1 pre-2006 write-off at 65: resolved. 0a7f9e5f4, economic_assumptions.py:649-662. Intakes up to 2005 are written off at 65 and later ones after 29 years, and Step 2 now requires the 1998 or a later intake. GOV.UK ("When your student loan gets written off or cancelled"): Plan 1 loans first paid before 1 September 2006 go at 65, later ones 25 years after the first April due, so the 2005 cut-off and the 29-year proxy are right. test_the_two_plan_1_write_off_rules checks both rules in 2040.
  3. should, heating fuels held flat: resolved. de6fff1a6. Both fuels have left DATASET_UPRATING_EXCLUSIONS, are listed under CPI in uprating_indices.yaml, and have left KNOWN_UNUPRATED. On the merged state (#2592 at 84b6488b4, which includes #2571), the exclusions are still only the three Ofgem-priced energy inputs and the fuels are CPI-uprated, so the two PRs no longer interact in meaning.
  4. should, Income Support and spousal maintenance: resolved. ae2196a3e, income_support_applicable_income.py. The claimant's and partner's maintenance now counts under reg. 40, with Sch. 9 para. 15(3)(a) keeping it out of the voluntary-payment disregard; child maintenance stays out under para. 73.
  5. to 9. nits: all addressed. UC's court order or agreement wording and the former cohabitee case are in spousal_maintenance_income's documentation (cf52f50d4); CTR counts both incomes (5e01b4e2a, see below); the person_id guard is in (0a7f9e5f4); IS paras. 36 and 37 are noted as not modelled.

What I checked at the new head

  • Primary sources for the new CTR rules: England SI 2012/2885 Sch. 5 paras. 7 and 20 and SI 2012/2886 Sch. 8 para. 49; Wales WSI 2013/3029 Sch. 4 para. 20 and Sch. 9 paras. 21 and 49; Scotland SSI 2012/319 Sch. 3 para. 19 and SSI 2021/249 reg. 57(1)(b)(vi), (1)(d), (4) and (6). Each gives £15, the maintenance disregard is one per family with a child (or family premium), aggregated across payments, and the WPA disregard is per recipient. The code matches. For the non-dependant bands, HB Regs reg. 74(9) and HB (SPC) Regs reg. 55(10) disregard no maintenance, so counting it in gross income is right.
  • Tests in a fresh env at the head: the new and changed Python tests (student loans, heating fuels, IS maintenance, CTR maintenance and WPA, non-dependant bands, uprating declarations), 84 passed; YAML for CTR, spousal maintenance, WPA, pension-age HB, means-test income members, benefit cap and Pension Credit, 727 passed; pytest regressions that read CTR, IS, student loan plans, non-dependant deductions or the energy exclusions (63 files), 2,008 passed and 61 skipped.
  • The new tests test the change: copied onto 313b18c0, 49 fail and 27 pass, including every funding nation, write-off, IS, CTR and non-dependant case.
  • CI at 7b73a30dd: all 17 checks pass, including Test / Python 1-5, YAML and Aggregate impact (no moves flagged).

New findings

  1. nit: Scottish new holders in Step 2 get the Plan 1 write-off, but Plan 4 has its own. economic_assumptions.py:649-653. GOV.UK: Plan 4 loans first paid before 1 August 2007 are written off at 65 or 30 years after the first April due, whichever comes first; later ones 30 years after the first April due. So the Scottish 1998 to 2005 intakes are held too long (to 65, not about age 52) and the 2006 to 2011 intakes dropped about five years early. Within the 2032 projection horizon this reaches at most the 1998 intake in 2032, and new holders repay nothing under #1764, so it is a label issue only. A comment, or a PLAN_4 branch in plan1_written_off, would do.
  2. nit: the PR body's "Changed:" line still says the fuels "join the energy inputs in KNOWN_UNUPRATED". After de6fff1a6 they leave it.
  3. nit: the axiom: line marks the #2580 rules as "needed". The other entries name a queued rulespec-uk issue. Queuing the IS reg. 40 and Sch. 9 paras. 15(3)(a) and 73, CTR disregard and HB reg. 74 / reg. 55 cases, and citing the issue, would bring them in line. Fix evidence passes, so this is wording only.

Merge order

  • #2571 is merged. GitHub now marks this PR as conflicting. The only conflict is the header comment of uprating_indices.yaml. I checked #2592 against a plain merge of the same main into this branch: it differs only in that header, keeping main's text and adding the fuel sentence. #2592 also merges cleanly into current main. So merge #2592 (or resolve the same way), then this.
  • #1737 (mine): as before, once this merges I'll close or rebase it to drop its copy of the bereavement page.

🤖 Generated with Claude Code

@juaristi22
juaristi22 force-pushed the microcosm-engine-inputs-2572 branch from 7b73a30 to 112056f Compare October 23, 2026 10:15
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Rebased on main after #2571 merged, so the hashes in the replies above have changed. The fuels CPI change (de6fff1a6) is folded into the fuels commit, since #2571 rewrote the lines it had reverted. The rest is unchanged:

Was Now Commit
8bee8439e 4b9a7ca66 Bonus sacrifice input
629863ed1 f26c8b7d1 Spousal maintenance
b67eecbd5 a1ff54241 Widowed Parent's Allowance
683a4d5de aed91f037 Student loan projection
313b18c02 + de6fff1a6 67d9619d1 Heating fuels, CPI-uprated
ae2196a3e ac00be7da Income Support (hub)
5e01b4e2a d835d383b Council Tax Reduction (hub)
475682f26 494b2e094 Funding nation (hub)
e13b6b269 e83ff9f12 Non-dependant bands (hub)
77e68dd20 a4b040bd6 CTR test fixture
0a7f9e5f4 a26c33eee Plan 1 write-off, Step 4 England only
cf52f50d4 112056f14 Documentation notes

Locally at 112056f14: Ruff clean, all YAML policy tests pass (4,338) and the new and touched Python tests pass (3,013).

@juaristi22
juaristi22 enabled auto-merge October 23, 2026 10:32
@juaristi22
juaristi22 added this pull request to the merge queue Oct 23, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 23, 2026
@juaristi22
juaristi22 added this pull request to the merge queue Oct 23, 2026
Merged via the queue into main with commit be63e36 Oct 23, 2026
17 of 19 checks passed
@juaristi22
juaristi22 deleted the microcosm-engine-inputs-2572 branch October 23, 2026 17:24
@MaxGhenis

Copy link
Copy Markdown
Collaborator

Merged by the UK hub (Claude session 8e19f9d5) at head 112056f14, through the merge queue with the head pinned.

  • What it adds: bonus sacrifice, spousal maintenance (counted in the means tests through its own input), Widowed Parent's Allowance as its own input, and liquid and solid heating fuel inputs (uprated by CPI). It also fixes the student-loan plan projection: base year, fixed ages, stable draws, England-only new 2023-intake holders, and pre-2006 Plan 1 write-off at 65. These are the engine inputs Microcosm needs for the Budget (Inputs and fixes Microcosm UK needs: bonus sacrifice, spousal maintenance, Widowed Parent's Allowance, student loan plans, other heating fuels #2572).
  • Reviews:
    • Independent review (GPT-6.1 Sol), with the hub's fix stack Fix means-test income and student-loan funding routes #2580, which @juaristi22 merged: APPROVE at 7b73a30dd. All 17 checks passed there, and the aggregate impact run showed no household's net income changing in any year (the new inputs default to zero).
    • Nonblocking: national CTR gives UC claimants the new £15 disregards, which the law doesn't. That narrows an earlier understatement, so it is not a regression; the review recorded it as a follow-up.
    • @vahid-ahmadi approved at 7b73a30dd.
  • Rebase: @juaristi22 rebased onto main at 10:16Z, giving 112056f14. The hub checked it against the reviewed content:
    • git range-diff: 11 of 12 commits are identical.
    • The separately reviewed CPI commit for heating fuels (de6fff1a6) is folded into the fuels commit, because Project labelled energy inputs from their declared price year #2571 rewrote the lines it touched.
    • The reviewed head merged with current main gives a tree that differs from 112056f14 only in a reordered comment block in policyengine_uk/data/uprating_indices.yaml.
  • CI: every check passes at this head. The merge queue re-runs the full suite against current main.
  • Impact: none on household net income at current law; the new inputs default to zero until Microcosm supplies them.
  • Why now: Microcosm's Budget build needs these inputs, and the Budget coordinator asked for María's two critical PRs to land first.

MaxGhenis added a commit that referenced this pull request Oct 23, 2026
Resolves the conflict with #2573's spousal maintenance in
income_support_applicable_income.py by keeping both: statutory sick,
maternity and paternity pay as other income (IS Regs 1987 reg 40(4)(a),
Sch 9 paras 1 and 4) and spousal maintenance (reg 40, Sch 9 para 15(3)(a)),
with child maintenance still disregarded (para 73). The Widowed Parent's
Allowance disregard (para 16) is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Oct 23, 2026
Keeps #2573's account of what is now modelled (spousal_maintenance_income
feeding UC, Pension Credit and Housing Benefit; Phases 1 and 2 done) and
re-applies the corrections that still hold: the £39 default rate, the
shared-care rules, and the CSJ paragraph. Drops the "gap is spousal
maintenance" text, which #2573 made false, and narrows the changelog
fragment to match.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Oct 23, 2026
Keeps #2573's account of the new Widowed Parent's Allowance variables
(widowed_parents_allowance_reported and widowed_parents_allowance) and
re-applies the corrections that still hold. Drops "the legacy WPA has no
variable of its own", proposes replacing the adds of
widowed_parents_allowance rather than adding it, notes that bsp_reported
keeps CPI uprating until WPA also moves out, and cites GOV.UK for WPA
being closed to deaths from 6 April 2017 while still taking new claims for
earlier deaths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 23, 2026
#2573 added spousal maintenance (less the £15 disregard) and Widowed
Parent's Allowance (less £15) to the Housing Benefit means test, in the
formula this PR moved into hb_income_before_deductions. Add both to the
helper, keeping this PR's claimant-or-partner mask, Child Benefit and
Social Fund disregards and statutory pay as earnings. Both variables are
already limited to the claimant and partner.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 23, 2026
#2573 (merged) implemented the spousal maintenance and Widowed Parent's
Allowance inputs that two pages here still called pending:

- Child maintenance: take main's description of the split inputs and the
  done Phases 1 and 2, and keep this batch's corrections: the £39 one-child
  default, shared care, and the CSJ point that the model reproduces UC's
  side of the asymmetry but not the combined marginal rates.
- Bereavement support: take main's status for WPA's own variables, keep
  the batch's statutory WPA eligibility conditions, make Phase 2 replace
  the existing adds with a formula, and state both conditions for freezing
  bsp_reported's CPI uprating: code 9 out, and WPA out of code 6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 23, 2026
…e limit

#2573 split maintenance into maintenance_income (child maintenance) and
spousal_maintenance_income. The £100,000 gross income test counts all
maintenance (income guidance questions 8 and 9), so add the spousal
input, with regressions above the limit and at exactly £100,000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

Inputs and fixes Microcosm UK needs: bonus sacrifice, spousal maintenance, Widowed Parent's Allowance, student loan plans, other heating fuels

3 participants