Skip to content

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

Closed

Description

@juaristi22

Summary

Microcosm UK's open work needs five changes in policyengine-uk that no issue tracks yet. Each section below is one change and can land as its own PR:

  1. A bonus-sacrifice input, summed with salary sacrifice.
  2. A spousal-maintenance input that the means tests count.
  3. A Widowed Parent's Allowance input, apart from Bereavement Support Payment.
  4. Fixes to uprate_student_loan_plans.
  5. Spending on liquid and solid heating fuels (lower priority).

The last section lists filed issues and PRs that Microcosm also waits on. Everything below was checked against main at 2.146.5.

1. Bonus-sacrificed pension contributions: a second input

Why.

  • The £2,000 cap from 6 April 2029 covers salary-sacrificed and bonus-sacrificed contributions together, and no rule treats the two routes apart. The engine can already score both through pension_contributions_via_salary_sacrifice: pension_contributions_via_salary_sacrifice_from_pay lets someone sacrifice "a whole bonus".

  • But datasets cannot put bonus sacrifice in that input. These HMRC figures come from ASHE, which does not cover bonus sacrifice (HMRC private pension statistics, background and methodology, section 5.2; OBR costing note, paragraphs 1.4 and 1.5):

    • the salary-sacrifice users, 7.7m, of whom 3.3m sacrifice more than £2,000;
    • the reliefs on salary-sacrificed contributions in Tables 6.1 and 6.2.

    A dataset calibrated to those figures must keep the two routes apart.

  • The bonus route is about half the measure. OBR Table 1.1 (5 February 2026) gives, for 2029-30:

    • salary sacrifice: a £14.3bn base above £2,000 and a £2.5bn static yield;
    • bonus sacrifice: a £13.8bn base and a £2.3bn static yield, all from people above the upper earnings limit (paragraph 1.9).
  • On Microcosm UK's 19 October national release, the engine scores £2.41bn of NICs for the cap on salary sacrifice alone (UK: bonus-sacrificed pension contributions are missing, so the salary-sacrifice cap scores about half the OBR's yield microcosm#1340).

Proposal.

  • Add pension_contributions_via_bonus_sacrifice:
    • person, annual, GBP, default 0;
    • uprated by gov.economic_assumptions.indices.obr.average_earnings (the OBR projects the base with employment and wages, paragraph 1.8);
    • listed under that index in data/uprating_indices.yaml.
  • pension_contributions_via_salary_sacrifice_from_pay reads the sum of the two inputs, under the same pay condition. Everything downstream reads _from_pay, so it follows:
    • the cap (_adjusted);
    • salary_sacrifice_pension_ni_excess;
    • pension_annual_allowance_threshold_income;
    • pension_contributions_for_annual_allowance.
  • No other formula reads the salary input on main, so nothing else changes.

Tests.

  • Pay of £80,000 and a £10,000 bonus sacrifice in 2029-30: the excess is £8,000. Employee NICs rise by £160 (2%) and employer NICs by £1,200 (15%).
  • £1,500 of salary sacrifice and £1,500 of bonus sacrifice: the excess is £1,000, since the threshold applies to the sum.
  • The bonus sacrifice counts in threshold income.
  • With the input at its default of 0, every existing result is unchanged.

Microcosm side: PolicyEngine/microcosm#1340.

2. Spousal maintenance: an input the means tests count

Why.

Proposal.

  • Add spousal_maintenance_income: person, annual, GBP, default 0. Uprate it by GDP per head, as maintenance_income and private_transfer_income are.
  • Count it:
    • in UC unearned income;
    • in Pension Credit income, adding it to savings_credit/excluded_income.yaml;
    • in pension-age Housing Benefit income;
    • in HBAI and market income, as now.
  • Datasets that do not supply it keep today's results.

Tests.

  • A single UC claimant with £100 a month of spousal maintenance: the award falls by £100 a month.
  • A single pensioner with £50 a week: guarantee credit falls by £50 a week, and savings credit's qualifying income excludes it.
  • maintenance_income still changes none of the three.

3. Widowed Parent's Allowance: its own input

Why.

  • FRS benefit code 6 is "Bereavement Support Payment / Widowed Parent's Allowance", and datasets put it in bsp_reported. The two are treated differently:
    • Bereavement Support Payment is tax-free (GOV.UK, taxable and tax-free state benefits). It is not UC unearned income: reg. 66(1) does not list it. Its rates have not changed since April 2017 (SI 2026/148, art. 19).
    • Widowed Parent's Allowance is taxable (the same GOV.UK page). It is UC unearned income (reg. 66(1)(b)(vi)). It rises with CPI (SI 2026/148, art. 18).
  • In the engine, bsp reaches household benefits and HBAI only. So Widowed Parent's Allowance in bsp_reported is untaxed and does not reduce UC.
  • The freeze that bsp_reported is CPI-uprated but BSP rates are frozen, and the variable is mostly War Widow's Pension #2381 plans for bsp_reported would also freeze it.
  • Widowed Parent's Allowance has been closed to new claims since April 2017, so its caseload is small and falling. Its treatment still differs from Bereavement Support Payment's on every line above.

Proposal.

Tests.

  • £156.65 a week of Widowed Parent's Allowance in 2026-27 raises taxable income by the annual amount and lowers a UC award by the monthly amount.
  • The same amount of Bereavement Support Payment changes neither.

4. uprate_student_loan_plans: Step 3 never fires

The function is at policyengine_uk/data/economic_assumptions.py:508.

  • Step 3 can never fire.
    • base_year_age = age - (year - _FRS_BASE_YEAR) and uni_start_year = year - age + 18 give base_year_age = 2041 - uni_start_year in every year.
    • So uni_start_year >= 2012 implies base_year_age <= 29, and Step 3's test base_year_age > 29 is never true.
    • So no new Plan 2 holders are added above the base year's oldest Plan 2 age.
  • Two models are mixed.
    • Step 1 assigns plans by the projection year's cohort (year - age + 18). That suits datasets whose ages stay fixed, as the enhanced FRS and Microcosm UK do.
    • Steps 2 and 3 test base_year_age. That is a person's age in the base year only if ages advance.
    • On static-age data, the extended-age-band tests should compare age with the base year's oldest holder.
  • The base year is a constant. _FRS_BASE_YEAR = 2023, but datasets built on FRS 2024-25 start in 2024. Take the base year from the dataset's first year.
  • Draws change every year. The generator is seeded by the year and draws by position. So a person can be a new Plan 1 or Plan 5 holder in one year and not the next. Key the draws on person_id.

#1764 hides part of this. Datasets supply student_loan_repayments, which overrides the formula:

  • a re-labelled holder keeps their base-year repayment;
  • a new holder repays nothing, because Steps 2 and 4 set their stored repayment to 0.

Tests. On a static-age dataset based on 2024:

  • In 2029, Step 3 adds Plan 2 holders aged 31 to 35 at the take-up rate.
  • A person's draw is the same in 2028 and 2029.
  • A dataset based on 2023 keeps today's results, apart from Step 3.

5. Spending on liquid and solid heating fuels (lower priority)

Why.

  • The engine's energy inputs are electricity_consumption, gas_consumption and their sum, domestic_energy_consumption.
  • Homes off the gas grid heat with oil, LPG, coal or wood. ONS household spending records these as liquid fuels (COICOP 04.5.3) and solid fuels (04.5.4).
  • Without an input for them, an energy reform cannot reach those homes, which cluster in rural areas and Northern Ireland. Examples are a payment for alternative fuels or a VAT change on all domestic fuel.
  • Microcosm UK carries its LCFS donor's other fuels beside the ONS totals, but has no engine variable to write them to (UK local surface, consumption and high-value homes: remaining items (consolidation) microcosm#1278).

Proposal.

Tests. The defaults change no result.

Filed elsewhere: changes Microcosm UK also waits on

Issue or PR What Microcosm needs State on 22 October
#1864 Statutory council tax discounts, for Microcosm's single-adult discount family and its council tax measurement conditions PR open, approved
#1929 The pension-age projection. On static-age data, state_pension_type types pre-2016 pensioners as new State Pension in later years, which overstates protected payments from about 2028 Open
#1954 Pension Credit's countable income (section 2 covers its spousal-maintenance row) Open
#2381 The bsp_reported freeze, after section 3 Open
#2459 The Employment Allowance, so that ni_employer is net of it. Microcosm holds its employer NICs row out until then Open
#2492 The High Value Council Tax Surcharge deferral scheme Open
#2526 Energy spending projected from the dataset's price year Open
#2166, #2189 The temporary 0% VAT on GB domestic electricity Issue and PR open
#1764 Stored student loan repayments override the formula (section 4) Open

🤖 Generated with Claude Code

Activity

  1. self-assigned this
    on Oct 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions