Skip to content

Model the company car and car fuel benefits, with Class 1A NICs - #2750

Merged
juaristi22 merged 4 commits into
mainfrom
company-car-benefit-2749
Oct 29, 2026
Merged

juaristi22 merged 4 commits into
mainfrom
company-car-benefit-2749

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2749

What and why

Budget 2026 raises company car tax for 2030-31: every appropriate percentage goes up one point, to a maximum of 40% (Table 6.1 row 86: +£310m in 2030-31, +£345m in 2031-32). The model could not score it, because nothing in it computed a company car benefit (PolicyEngine/uk-autumn-budget-dashboard-2026#316). This PR adds the company car and car fuel benefits in kind from 2020-21, the Class 1A NICs employers pay on them, and a scenario that applies the Budget 2026 rise.

Inputs (on the person). They default to no car, so existing simulations don't change. The car_* vehicle excise duty inputs describe the person's own car and are untouched.

Input Meaning
company_car_list_price List price with accessories (ITEPA 2003 s. 121 steps 1-2); 0 means no company car
company_car_capital_contributions Capital sums contributed, this year and earlier (s. 132)
company_car_co2_emissions CO2 emissions figure, g/km; set it with the list price, since 0 means a car that cannot emit CO2
company_car_electric_range Electric range figure, miles
company_car_fuel_type Reuses CarFuelType; DIESEL_NON_RDE2 takes the supplement (s. 141); ELECTRIC gives a CO2 figure of 0
company_car_registered_from_6_april_2020 Selects the s. 139A rates in 2020-21 and 2021-22
company_car_availability Share of the year available, default 1 (s. 143)
company_car_private_use_payments Payments for private use (s. 144)
company_car_private_fuel_provided Private fuel provided and not made good in full (ss. 149, 151)

The list price, capital contributions and payments for private use are uprated by CPI when a dataset is projected.

Variables

  • has_company_car (a positive list price).
  • company_car_appropriate_percentage (s. 139, s. 139A, s. 141); zero without a company car.
  • company_car_benefit, following s. 121's steps: price less capital contributions up to £5,000, times the appropriate percentage, reduced for days unavailable, less payments for private use, never below zero.
  • car_fuel_benefit: the appropriate percentage of the s. 150 multiplier, reduced for days unavailable. It is nil for a car that cannot emit CO2 (s. 149(4)), and capital contributions and private-use payments don't reduce it.
  • benefits_in_kind, the sum of the two.
  • ni_class_1a: the Class 1A percentage of benefits_in_kind (SSCBA 1992 s. 10).

Where the benefits go

  • Income tax: taxable_employment_income adds benefits_in_kind as its own term. The benefits therefore reach income tax (at Scottish rates for Scottish taxpayers) and adjusted net income: the personal allowance taper, HICBC, and the £100,000 limits of Tax-Free Childcare and the extended childcare entitlement. They also count as relevant UK earnings for the pension relief limit (HMRC PTM044100).
  • Not student loan income: student_loan_repayment and plan_2_interest_rate take net income less the benefits in kind it holds. Self Assessment excludes Chapter 6 car benefits (SI 2009/470 reg. 29(4)(e)), PAYE deducts from Class 1 earnings (reg. 41), and Plan 2 interest income is the repayment income (reg. 21A(11)). Net income holds all of the benefits unless allowable deductions exceed pay, so the helper (utils/student_loans.py) subtracts the smaller of taxable_employment_income and benefits_in_kind.
  • Not earnings: they stay out of employment_income and employment_benefits. Employee Class 1 NICs are unchanged, and so are the gross earnings of UC (UC Regs 2013 reg. 55(2)(a)), HB (HB Regs 2006 reg. 35(2)(a)) and CTR.
  • Tax on the benefit is still deducted, as tax "in respect of the employment" (reg. 55(5)(b)), which PAYE collects from pay:
    • UC takes earnings as the lowest slice of income, so uc_income_tax_on_earnings deducts all of it.
    • HB and CTR (person_net_earnings) deduct earnings' share of the person's tax, and now count the benefits with pay in that share and in the base, though not in the earnings.
    • For an employee with no other income, a £3,000 benefit at the basic rate lowers UC, HB and CTR net earnings by £600, the tax on it. With a £20,000 pension alongside £20,000 of pay, UC still deducts £600 and HB and CTR deduct £512.30, because the proportional split puts part of the tax against the pension.
  • Employer NI: ni_employer and total_national_insurance add ni_class_1a, so Class 1A reaches gov_tax. The fiscal partition lists ni_class_1a as a component of employer NICs.

Employer NI incidence (contrib/policyengine/employer_ni/). baseline_employer_cost and adjusted_employer_cost recompute secondary Class 1 only. employer_cost read ni_employer, so with Class 1A in ni_employer it would have stopped agreeing with them for company car holders. It now reads ni_class_1_employer. That leaves every current value unchanged, and it leaves out the Class 1A as well as the benefit it is charged on. Consequences:

  • No household bears Class 1A or a change in it. The fixed-employer-cost pay response moves only with Class 1 parameters, and the capital and consumer channels spread a cost change that leaves Class 1A out. This is deliberate: the 2030-31 rise is scored statically, as income tax plus Class 1A, comparable with the OBR's costing. It is documented in docs/book/assumptions/employer-ni-incidence.md and on the company car page, and Pass Class 1A NICs through the employer NI incidence #2752 covers passing Class 1A through.
  • An employer rate reform moves Class 1A with it (s. 10(5)), and that part also stays with employers.

2030-31. The repository's future-date convention (docs/book/policy/future-date-announcements.md) would put Budget 2026's announced 2030-31 rates in the baseline, as #2712 did for Budget 2026's cash ISA limit. This PR keeps current law in the baseline instead, because the Autumn Budget dashboard needs a pre-Budget 2030-31 baseline with the rise as its reform; see point 1 below. Current law: Finance Act 2025 s. 6 sets 2029-30's rates "for the tax year 2029-30 and subsequent tax years", so 2030-31 has 9% for 0 g/km, 19% for 1-50 g/km and a 39% maximum. The rise is the company_car_tax_rise_2030 scenario (policyengine_uk/scenarios/company_car_tax_rise_2030.py). Its COMPANY_CAR_TAX_RISE_2030 dict gives the same changes as parameter_changes keyed 2030-04-06.2100-12-31, for the dashboard. Moving the rise into the baseline instead would mean adding a 2030-04-06 row to five parameter files with the scenario's values.

Parameter sources

Every value was read verbatim from legislation.gov.uk and checked against HMRC's published tables.

Parameter Values Source
0 g/km, 1-50 g/km by electric range, 51-74 g/km bands, base rate at 75 g/km, maximum 2020-21 to 2024-25 F(No. 2)A 2017 s. 2(2); FA 2020 ss. 9(2)(a) and 10(2)(a) (0 g/km: 0%, 1%)
s. 139A rates for cars first registered from 6 April 2020 2020-21, 2021-22 FA 2020 ss. 9(3), 10(3)
Same 2025-26, 2026-27, 2027-28 FA 2023 s. 11
Same, with one rate for 1-50 g/km and a 65-74 g/km band 2028-29; 2029-30 onwards FA 2025 ss. 5, 6
Diesel supplement, 4 points from 2018-19 ITEPA s. 141; FA 2018 s. 9(3)(b)
Capital contribution cap, £5,000 ITEPA s. 132(3)(b)
Car fuel multiplier: £24,500, £24,600, £25,300, £27,800 (2023-24 and 2024-25), £28,200, £29,200 2020-21 to 2026-27 SIs 2020/199, 2021/248, 2021/1422, 2022/1288, 2024/1349, 2025/1254, art. 2
Car fuel multiplier £30,200 (announced; order not yet made), then a CPI projection 2027-28 on Budget 2026 OOTLAR para 2.6
Class 1A percentage: the secondary percentage, except 14.53% in 2022-23 SSCBA s. 10(5); HSCL (Repeal) Act 2022 Sch. para 1(2)
Budget 2026 rise (scenario only) 2030-31 OOTLAR para 1.25; HMRC policy paper of 28 October 2026

HMRC checks: 480 Appendix 2 (2020-21 to 2026-27, NEDC and WLTP columns), HMRC's "CO2 emissions tables of rates" (2027-28), and the 2025-28 and 2028-30 policy papers.

Points for review

  1. 2030-31 baseline. Above: current law in the baseline and the rise as a scenario, against the repository's future-date convention.
  2. Diesel cap. legislation.gov.uk prints 35% in s. 141(2) step 3(b). Finance Act 2015 s. 9 substituted 37% "for the tax year 2015-16" only, and FA 2016 s. 10 then kept s. 141 without restating the cap. FA 2025 s. 5(6) amends "37%" to "38%", and HMRC 480 para 12.29 note 2 applies the 37% maximum to diesel cars. The model uses one maximum for s. 139(3)(b) and s. 141, 37% to 2027-28.
  3. s. 139A. In 2020-21 and 2021-22, cars first registered on or after 6 April 2020 had lower rates. These are modelled with a boolean input (default false, so the s. 139 rates apply) and a registered_from_6_april_2020 parameter node with an in_effect flag. HMRC 480 Appendix 1 Examples 6 and 7 test both schedules.
  4. Class 1A in 2022-23. Model the company car and car fuel benefits, with Class 1A NICs #2749 gives 13.8% to 2024-25. The Health and Social Care Levy (Repeal) Act 2022 fixes 14.53% for 2022-23, while the secondary rate the model reads at 30 April 2022 is 15.05%. ni_class_1a reads the secondary percentage in other years, so reforms to it carry through, as s. 10(5) requires.
  5. Data. The CO2 figure must be filled with the list price, because the model can't tell a missing figure from 0 g/km. The benefits must not also be in employment_income: policyengine-uk-data's SPI records add EPB (expenses payments and benefits in kind) to pay, so filling these inputs there means taking the car benefits out of EPB. Both are documented on the inputs and on the docs page, for the Microcosm work in Company car tax +1 point (2030-31): needs a company car benefit in policyengine-uk and company cars in Microcosm uk-autumn-budget-dashboard-2026#316. The money inputs are uprated by CPI, standing in for a new-car price index.
  6. The £30,200 multiplier against the 2030-31 rates. Both come from Budget 2026, but the multiplier is the annual CPI uprating, which the Budget lists among its other announcements and does not score, so a pre-Budget baseline has it too. The 2030-31 rates are a scored policy decision (Table 6.1, row 86).
  7. Childcare Offer for Wales. Its gross income lists sources one by one, and benefits in kind are not among them. Its guidance aligns the £100,000 limit with Tax-Free Childcare's, whose test is adjusted net income, so whether they should count is open.
  8. Not modelled: vans and van fuel, optional remuneration arrangements (s. 120A), shared and pool cars, classic cars (s. 147), cars without a CO2 figure (s. 140) or registered before 1998 (s. 142), fuel provided for part of the year (s. 152(2)), and other benefits in kind (Plan: model benefits-in-kind (BiK) — scope, implementation, and data needs #1654). The Employment Allowance (Model the Employment Allowance so ni_employer is net of it (split from #1918) #2459) is not modelled; when it is, it must not reduce Class 1A.

CI

This PR raises the Test / YAML job's limit in .github/workflows/test-suite.yaml from 45 to 75 minutes, the Python shards' limit. Here it was cancelled at 45 minutes twice after every test had passed: pytest's summary came at 34.5 and 27.5 minutes, and the process stayed alive until the limit. The memory cause is #2741, and #2742 releases each YAML case's simulation; the higher limit holds until then.

Test plan

  • YAML tests with expected values from HMRC and legislation (53 cases):
    • policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/benefits_in_kind/company_car_benefit.yaml:
      • HMRC 480 Appendix 1 Examples 6 and 7 (2020-21), HMRC's worked results;
      • the cars of Examples 3-5 at HMRC's 2026-27 rates, which test the transcribed tables;
      • petrol, diesel with and without RDE2, every electric range band, zero emission;
      • capital contributions above £5,000, part-year availability, private-use payments;
      • the 2029-30 and 2030-31 rates;
      • out-of-range inputs, an electric car with a CO2 figure, a diesel at 0 g/km, a figure that rounds down to 0.
    • car_fuel_benefit.yaml: HMRC 480 para 13.6 (£24,600 x 36% = £8,856), made good, zero emission, unavailability, 2027-28, a 1-50 g/km hybrid, the s. 139A rates.
    • benefits_in_kind_interactions.yaml:
      • income tax and ANI rise; employee NICs and UC, HB and CTR gross earnings exclude the benefit; Class 1A in ni_employer;
      • personal allowance taper, HICBC, and the Tax-Free Childcare and extended entitlement limits;
      • student loan repayments, including allowable expenses above pay; the pension relief limit; a Scottish taxpayer;
      • UC, HB and CTR with other income.
    • national_insurance/class_1a/ni_class_1a.yaml: 13.8%, 14.53%, 15%; an under-21 earner's Class 1A; total_national_insurance.
  • policyengine_uk/tests/test_company_car_benefit.py:
    • every band's ends against HMRC's published tables for each year 2020-21 to 2029-30, and the diesel supplement;
    • the 2030-31 scenario changes only holders' income tax and Class 1A, their student loan repayment and Plan 2 interest rate included (2029-30 unchanged, 2031-32 still raised);
    • COMPANY_CAR_TAX_RISE_2030 as reform= matches the scenario in 2030, 2031 and 2035;
    • gov_tax rises by the income tax plus Class 1A for a student loan borrower;
    • Class 1A follows an employer rate reform, the holder's pay and cost changes equal a non-holder's, and baseline_employer_cost and adjusted_employer_cost still equal employer_cost for a company car holder;
    • under the 2030-31 rise with employee incidence 0.5, no pay response and no cost change for the capital and consumer channels.
  • Existing tests re-run locally:
    • YAML (1,512 cases): the Housing Benefit, Income Support, Council Tax Reduction, student loan, pension, national insurance and income tax bases directories, and adjusted_net_income.yaml.
    • Python: test_fiscal_partition.py, test_employer_ni_fixed_cost_properties.py, test_employer_ni_zero_rate_consumers.py, test_housing_benefit_earnings_disregard_properties.py, test_income_support_earnings_disregard_properties.py, test_student_loan_existing_holder_projection.py, test_student_loan_plan_uprating.py, test_projection_horizon.py, test_parameter_descriptions.py, test_program_registry.py, code_health/test_uprating_declarations.py.
  • make format
  • Changelog fragment changelog.d/2749.added.md
  • Not run locally: the full suite, which CI runs. No microsimulation figure is given: no dataset fills the company car inputs yet.

axiom: needed: rulespec-uk has no module for ITEPA 2003 ss. 121-152 or SSCBA 1992 s. 10; a dispatch-ready pe-parity issue still has to be opened.

🤖 Generated with Claude Code

Add person inputs for a company car, the ITEPA 2003 s. 139 appropriate
percentages from 2020-21 (with the s. 139A rates for cars first
registered from 6 April 2020 in 2020-21 and 2021-22), the s. 141 diesel
supplement, the s. 132 contribution cap and the s. 150 car fuel
multiplier, and calculate the company car and car fuel benefits.

Tax them through taxable_employment_income, outside employment_income
and employment_benefits, so Class 1 NICs and the UC, HB and CTR
earnings tests leave them out. Charge Class 1A NICs on them in
ni_employer. employer_cost now reads secondary Class 1 directly, as the
employer NI incidence variables do.

The 2030-31 baseline keeps 2029-30's rates; the company_car_tax_rise_2030
scenario applies Budget 2026's one-point rise.

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

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base daec84d5b6 against head 7887ab1241, 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.

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

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 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 daec84d5b6 uk 2.164.4 (files db016dc3f222), core 3.33.12, py 3.13.18 aarch64 aa8e73e3b48d 1eac2ca06b91 1894.45s
head #2750 merged into main 7887ab1241 uk 2.164.4 (files 8c1197397e80), core 3.33.12, py 3.13.18 aarch64 aa8e73e3b48d 22e0ebaf0971 1881.26s

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

@anth-volk

Copy link
Copy Markdown
Collaborator

Review of #2750 at 46bbcfd4e

This is an adversarial review of the PR's head. It covered three things: correctness against the legislation and HMRC's tables, how the new values flow into other variables, and what stops implausible values. The main findings were re-checked in the code. Figures marked as estimates come from the reviewer's own runs. Paths are relative to policyengine_uk/ unless stated.

Bugs

  1. Student loan repayments and the Plan 2 interest rate now count the benefits in kind.

    • student_loan_repayment and plan_2_interest_rate both read net_income, which now includes benefits_in_kind through variables/gov/hmrc/income_tax/bases/taxable_employment_income.py:22-23.
    • Example: in 2026, pay of £40,000, a Plan 2 loan and a £9,000 car benefit raise student_loan_repayment from £955.35 to £1,765.35, which is 9% of the benefit (estimate).
    • Why it's wrong: under PAYE, student loan deductions are worked out on earnings liable to Class 1 NICs, and payrolled benefits in kind are excluded from them. Company car benefits carry Class 1A, not Class 1.
    • The new docs page presents this as intended (docs/book/programs/gov/hmrc/company-car-benefit.md:55, "such as student loan repayments").
    • The 2030-31 scenario test's claim that the rise changes nothing beyond income tax and Class 1A holds only because its holder has no student loan.
  2. Housing Benefit and CTR deduct only part of the tax on the benefit when the person has other income.

    • variables/gov/dwp/housing_benefit/applicable_income/_net_earnings.py:62-85 deducts income tax × earnings ÷ income_before_losses.
    • That denominator lists the raw income components and leaves out benefits_in_kind, while the tax includes the tax on the benefit.
    • Example: pay of £20,000, a £20,000 private pension and a £3,000 benefit. Income tax rises £600 and UC net earnings fall £600, but housing_benefit_net_earnings falls only £300.
    • So "HB and CTR net earnings deduct it too" holds only when all of a person's income is earnings.

Design points

  1. No household bears the Class 1A NICs.

    • employer_cost, baseline_employer_cost and adjusted_employer_cost cover secondary Class 1 only.
    • The consumer and capital incidence variables (variables/contrib/policyengine/employer_ni/employer_ni_response_consumer_incidence.py:22-25, and the capital equivalent) spread adjusted_employer_cost − baseline_employer_cost, so they never pass Class 1A on either. The description covers this for the pay response only.
    • Example: an employer rate rise of 1 point in 2026, for a holder with a £12,000 benefit. Class 1A rises £120 and gov_balance rises £276.90, but household_net_income falls only £156.90. The £120 is revenue that no household pays (estimate).
    • The Class 1A part of the 2030-31 rise has the same property.
  2. Benefits in kind will probably be counted twice once a dataset fills these inputs.

    • policyengine-uk-data sets employment_income = PAY + EPB from the SPI (policyengine_uk_data/datasets/spi.py:193). EPB is expenses payments and benefits in kind.
    • So SPI-based records already carry these benefits as pay, where they also attract employee Class 1 NICs and count as UC earnings.
    • Filling the company_car_* inputs without taking the car benefit out of EPB would tax it twice. Worth noting for the data work.
  3. A list price without a CO2 figure is taxed as a zero-emission car.

    • company_car_co2_emissions defaults to 0 and the fuel type to petrol. A £30,000 list price with nothing else set gives 4% (£1,200) in 2026-27; at 120 g/km it would be 30% (£9,000).
    • A dataset that imputes prices but not emissions would understate the benefit about 7.5 times.
    • Consider making a missing CO2 figure impossible to confuse with 0 g/km, or documenting that the two must be imputed together.
  4. Uprating indices.

    • The monetary inputs have no uprating index, so a dataset projected to later years holds them at the data year's values: company_car_list_price, company_car_capital_contributions and company_car_private_use_payments.
    • That matters directly for scoring 2030-31 from a 2023-24 or 2024-25 base.
    • We'll need indices on these where relevant, for example CPI, or a new-car price index if a suitable one is available. CO2, electric range and availability don't need one.
    • The description defers the choice to Company car tax +1 point (2030-31): needs a company car benefit in policyengine-uk and company cars in Microcosm uk-autumn-budget-dashboard-2026#316. Declaring an index on the variables, even CPI as a placeholder, would make projected datasets move with prices from the start.
    • The car fuel multiplier already follows obr.consumer_price_index from 2028-29, which is right.
  5. The two Budget 2026 announcements are treated differently. The announced £30,200 car fuel multiplier for 2027-28 (OOTLAR para 2.6, order not yet made) is in the baseline. The 2030-31 percentages from the same document (para 1.25) are kept out. So the pre-Budget 2030-31 baseline already contains one Budget 2026 figure. The effect on the 2030-31 score is small, since only the fuel part of the rise depends on it, but the treatment could be stated.

  6. Population runs will score the rise at £0 until a dataset fills the inputs. By rough arithmetic, one point on a £45,000 list price at a 40% marginal rate, plus 15% Class 1A, is about £250 a car. The OBR's +£310m therefore implies roughly 1.2 million cars. A dataset needs holders, list prices, CO2 and electric split, the private-fuel flag and tax bands, projected to 2030-31.

Checks against bad values

  • Handled:
    • Price, contributions and payments are floored at 0.
    • Availability is clamped to 0–1.
    • CO2 and electric range are floored at 0.
    • policyengine-core rejects NaN inputs.
  • No upper bounds. A £1bn list price gives a £300m benefit.
  • No consistency checks between fields:
    • A DIESEL_NON_RDE2 car at 0 g/km gets 8%, and at 10 g/km 14%.
    • An ELECTRIC car at 150 g/km gets 36%.
  • The CO2 test and the CO2 rounding disagree. variables/gov/hmrc/income_tax/benefits_in_kind/car_fuel_benefit.py:44 tests the raw CO2 figure (> 0), while company_car_appropriate_percentage.py:45 rounds it down first. A car at 0.5 g/km with private fuel therefore takes the zero-emission rate but still gets a fuel benefit of about £1,168. Testing the rounded figure in both places would fix it.
  • Nothing compares population totals with HMRC's benefits-in-kind statistics. That would catch implausible imputed values once data arrives.

Smaller points

  • company_car_appropriate_percentage returns a non-zero rate (4% in 2026-27) for people with no car, because it never reads the list price. That's harmless, since the benefit multiplies by the price, but it's confusing in outputs.
  • The YAML cases labelled as HMRC 480 Examples 3–5 use 2026-27 rates, so they re-test the transcribed tables rather than HMRC's worked results, which are for 2018-19.
  • recent stands for the 6 April 2020 schedule; a fuller name would read better. The availability clamp is written out twice.
  • p.co2_band.thresholds[0] doubles as the upper end of the 1–50 g/km band, which ties the two schedules together.
  • graduated_base_rate.yaml has references on each value but none at file level.

Test gaps

Nothing tests:

  • student loans or pension relief limits;
  • Scottish taxpayers;
  • the £100,000 limits for Tax-Free Childcare and the extended childcare entitlement (the description claims them; only the personal allowance taper and HICBC are tested);
  • out-of-range inputs;
  • the car fuel benefit at 1–50 g/km, or under the s. 139A rates;
  • UC and Housing Benefit for people with mixed income;
  • the consumer and capital incidence channels;
  • COMPANY_CAR_TAX_RISE_2030 passed as reform=. It matched the scenario in 2030, 2031 and 2035 when run.

CI

  • Test / YAML was cancelled at its 45-minute job limit, during the YAML tests. Main's own YAML step took 35.7 and 39.3 minutes today, and the new cases take under a second, so this looks like runner time rather than a failing test.
  • It will still fail the overall result until it completes. The other jobs were still running when checked.

Checked and found true

  • Appropriate percentages: every value from 2020-21 to 2029-30 matches HMRC 480 Appendix 2, FA 2023 s. 11 and FA 2025 ss. 5–6. That includes the 65–74 g/km band from 2028-29 and the 38% and 39% maximums.
  • Statutory steps:
    • The order of the steps in s. 121 is right.
    • s. 132(3)'s £5,000 cap applies to cumulative contributions.
    • s. 149(4) excludes cars that cannot emit CO2.
  • Car fuel multiplier: £29,200 is right (SI 2025/1254 art. 2), and so is OOTLAR para 2.6's £30,200.
  • Class 1A: 13.8%, then 14.53% in 2022-23 (£8,700 × 14.53% = £1,264.11), then 15% from 2025-26.
  • The 2030-31 scenario: its values and bracket indices match OOTLAR para 1.25 and HMRC's policy paper, including both 65–69 and 70–74 at 24%.
  • HMRC worked examples: Appendix 1 Examples 6 and 7 match.
  • Earnings tests: UC reg. 55(2)(a) and (5)(b) are applied as described.
  • No unintended side effects:
    • Switching employer_cost to ni_class_1_employer changes no existing value.
    • In this repository, only gov_tax reads ni_employer. Readers in policyengine.py and the Public API were not checked.

Optional follow-up issues (low priority)

None of these is needed for this PR or for scoring the Budget 2026 measure. If you think they're worth tracking, separate issues could cover:

  • vans and van fuel;
  • salary sacrifice (optional remuneration) arrangements for cars;
  • pool and shared cars;
  • classic cars;
  • cars with no CO2 figure, or first registered before 1998;
  • fuel provided for only part of the year;
  • other benefits in kind.

Tests run

On Python 3.14, all of these pass:

  • the 40 new YAML cases;
  • the 33 tests in test_company_car_benefit.py;
  • 301 YAML cases in the touched directories (household income, income tax bases, national insurance, adjusted net income);
  • 315 tests in 15 existing Python modules, including the fiscal partition, employer NI incidence, programme registry, parameter metadata and uprating declarations, with 1 skipped.

The full suite was not run.

🤖 Generated with Claude Code

Leave benefits in kind out of student loan repayment income and the
Plan 2 interest rate (SI 2009/470 regs. 29(4)(e), 41 and 21A(11)).
Count them with pay in the HB, CTR and IS share of income tax, though
not in the earnings. Take an ELECTRIC car as 0 g/km, and give a car that
rounds down to 0 g/km neither the diesel supplement nor a fuel benefit.
Make the appropriate percentage and both benefits zero without a company
car, give the 1-50 g/km limit its own parameter, and uprate the money
inputs by CPI.

Document that no household bears Class 1A, so the 2030-31 rise stays
static (#2752 covers passing it through), what data must fill the
inputs, and why the 2027-28 fuel multiplier is in the baseline. Add the
tests the review listed.

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

Copy link
Copy Markdown
Collaborator Author

Thanks, Anthony. A point-by-point reply follows; the changes are in the commit after 46bbcfd4e.

Bugs

  1. Student loans: fixed. Both routes leave the benefits out:

    • Self Assessment total income excludes Chapter 6 car benefits (SI 2009/470 reg. 29(4)(e)).
    • PAYE deducts repayments from Class 1 earnings (reg. 41).
    • Plan 2 interest income is the same repayment income (reg. 21A(11)).

    student_loan_repayment and plan_2_interest_rate now take net income less benefits_in_kind, and the docs page is corrected. Your example now gives £955.35 with or without the £9,000 benefit; that case is a YAML test. The 2030-31 scenario test's holder now has a Plan 2 loan, and the gov_tax test compares the same borrower with and without the car.

  2. HB and CTR with other income: fixed, within the proportional split. person_net_earnings now counts the benefits with pay in earnings' share of the tax, and in the base, but not in the earnings.

    • In your example (pay £20,000, pension £20,000, benefit £3,000), HB and CTR net earnings now fall by £512.30, against £300 before. That is £6,086 × 23/43 − £5,486 × 20/40.
    • UC's lowest-slice rule deducts all £600. The rest of the gap comes from the proportional split itself, which also puts part of the tax on pay against the pension.
    • YAML tests cover the case with and without the car.

Design points

  1. Class 1A incidence: kept static on purpose, so that the 2030-31 rise is scored as income tax plus Class 1A, comparable with the OBR's costing.
    • It is now documented in docs/book/assumptions/employer-ni-incidence.md (a new "Secondary Class 1 only" section), on the company car page, in ni_class_1a's documentation and in the PR body.
    • Pass Class 1A NICs through the employer NI incidence #2752 covers passing Class 1A through like secondary Class 1.
    • Two tests now pin this. Under the 2030-31 rise with employee incidence 0.5, there is no pay response and no employer cost change for the capital and consumer channels. Under an employer rate reform, the holder's cost change equals a non-holder's.
  2. SPI EPB: confirmed (spi.py:193). It is documented on company_car_list_price and in a new data section of the docs page, for the Microcosm work in Company car tax +1 point (2030-31): needs a company car benefit in policyengine-uk and company cars in Microcosm uk-autumn-budget-dashboard-2026#316.
  3. Missing CO2. There is no statutory rate for an unknown figure, so the model still can't tell missing from 0 g/km. Both inputs now say they must be filled together. Two consistency changes:
    • The ELECTRIC fuel type now gives a CO2 figure of 0, as vehicle excise duty does.
    • A car whose figure rounds down to 0 takes neither the diesel supplement nor a fuel benefit.
  4. Uprating: done. CPI is now declared on the list price, capital contributions and payments for private use, and the three are listed in uprating_indices.yaml. CPI stands in for a new-car price index, which the OBR doesn't forecast.
  5. £30,200 against the 2030-31 rates: now stated, in the multiplier file and on the docs page. The multiplier is the annual CPI uprating, which Budget 2026 lists among its other announcements and doesn't score, so pre- and post-Budget baselines both have it. The 2030-31 rates are a scored decision (Table 6.1, row 86).
  6. £0 until a dataset fills the inputs: agreed. The docs page says so; nothing to change in this PR.

Checks against bad values

  • Upper bounds: there has been no price cap since 2011-12 (HMRC 480 para 12.21), so the formula has none. Plausibility checks belong with the data validation.
  • Consistency between fields: see 5. A DIESEL_NON_RDE2 car at 10 g/km keeps the supplement, because s. 141 keys on the fuel type, which says the car is propelled solely by diesel. A diesel hybrid is ALTERNATIVE_FUEL.
  • CO2 rounding: both benefits now use one figure, co2_emissions_figure in utils/company_car.py. It is tested at 0.5 g/km.
  • Totals against HMRC's statistics: that goes with the data work, once a dataset fills the inputs.

Smaller points

All done:

  • has_company_car makes the appropriate percentage and both benefits zero without a car.
  • The Example 3–5 cases are relabelled as tests of the transcribed 2026-27 rates.
  • recent is now from_april_2020.
  • The availability clamp is in one helper, share_of_year_available.
  • The 1–50 g/km limit is its own parameter, electric_range_co2_limit.
  • graduated_base_rate.yaml has file-level references.

Test gaps

Added tests for:

  • student loans and the Plan 2 interest rate;
  • the pension relief limit (relevant UK earnings, HMRC PTM044100);
  • a Scottish taxpayer (21% on the benefit);
  • the £100,000 limits of Tax-Free Childcare and the extended entitlement;
  • out-of-range inputs;
  • the car fuel benefit at 1–50 g/km and under s. 139A;
  • UC, HB and CTR with other income;
  • the incidence channels;
  • COMPANY_CAR_TAX_RISE_2030 as reform=, against the scenario in 2030, 2031 and 2035.

CI

The YAML job's tests passed (5,277 in 18 minutes). The process then stayed alive for 11 minutes after the summary, until the 45-minute limit. Main's release YAML job shows the same tail of about 12 minutes, and fix-hb-accommodation-dates was cancelled at the limit today too, so this looks like runner time. The new push re-runs it.

Optional follow-ups

I haven't opened these. Vans, optional remuneration arrangements, pool and shared cars, classic cars, cars without a CO2 figure or registered before 1998, part-year fuel and other benefits in kind are listed under "Not modelled" on the docs page.

🤖 Generated with Claude Code

@anth-volk

Copy link
Copy Markdown
Collaborator

Second pass on #2750 at e1f7f70f6

Thanks, María. This pass reads e1f7f70f6 against the first review and your reply. It is a code reading only: no tests were run locally for this pass. Paths are relative to policyengine_uk/.

The earlier points

Point Status What was checked
Student loans count the benefits in kind Fixed student_loan_repayment and plan_2_interest_rate use max_(net_income − benefits_in_kind, 0). SI 2009/470 reg. 29(4)(e) excludes "amounts chargeable to tax under Chapters 5, 6, 7 or 10 of Part 3 of the 2003 Act (benefits in kind)", so the basis holds.
HB and CTR deduct only part of the tax Fixed within the proportional split variables/gov/dwp/housing_benefit/applicable_income/_net_earnings.py adds benefits_in_kind to both the earnings side of the tax share and the base, but not to the earnings. The remaining gap to UC's figure comes from the proportional method, as you say.
Class 1A incidence Kept static on purpose; documented This is consistent with scoring the rise as the OBR does. It is documented in docs/book/assumptions/employer-ni-incidence.md, on the company car page and in ni_class_1a, and it is pinned by tests. Passing Class 1A through is tracked in #2752.
SPI EPB double count Documented Noted on company_car_list_price and in the docs page's data section.
A list price without a CO2 figure Partly addressed, reasonably There is no statutory rate for an unknown figure, so documenting that the two inputs must be filled together is the right call. utils/company_car.py now gives ELECTRIC cars a figure of 0. A car whose figure rounds to 0 takes neither the diesel supplement nor a fuel benefit.
Uprating indices Done obr.consumer_price_index is declared on company_car_list_price, company_car_capital_contributions and company_car_private_use_payments, and the three are listed in data/uprating_indices.yaml.
The £30,200 multiplier against the 2030-31 rates Explained The multiplier is the routine CPI uprating, which the Budget lists but doesn't score. The 2030-31 rates are the scored measure. That distinction holds up.
CO2 rounding mismatch Fixed Both benefits read the one co2_emissions_figure.
Upper bounds Reasonably declined There has been no statutory price cap since 2011-12, so plausibility checks belong with data validation.
Smaller points Done has_company_car is used as defined_for on the appropriate percentage and both benefits. Also: from_april_2020, the share_of_year_available helper, the electric_range_co2_limit parameter, and file-level references in graduated_base_rate.yaml.
Test gaps Tests added Per your reply. They were not run for this pass.
Optional follow-ups Listed under "Not modelled" Fine as they're optional and low priority.

Other readers of net_income and adjusted_net_income were also re-checked for any that now pick up the benefit wrongly. Tax-Free Childcare and the extended childcare entitlement use adjusted net income only for the £100,000 upper limit, where the benefit belongs. Their minimum-income tests read separate earnings variables.

New in this pass

  1. The student loan fix can over-subtract when allowable employment deductions exceed pay (low priority, rare).

    • taxable_employment_income is max_(0, taxable_earnings + benefits + benefits_in_kind − deductions). When deductions exceed pay, part of the benefit is absorbed by the floor and never reaches net_income. Subtracting the whole benefits_in_kind then takes off more than was added.
    • Example: pay of £10,000, £15,000 of allowable deductions, a £9,000 benefit and a £30,000 private pension. taxable_employment_income is £4,000 with the car and £0 without. So net_income − benefits_in_kind is £25,000, where repayment income excluding the benefit is £30,000.
    • Fix: subtract only the part of the benefit that reached net income, for example taxable_employment_income minus the same sum computed without benefits_in_kind.
  2. Test / YAML was cancelled at the 45-minute limit again on this head.

    • It ran from 17:01:33 to 17:47:03 UTC, and the step "Run the YAML tests" was cancelled. The other test jobs and "Aggregate impact" were still running when checked.
    • Your diagnosis (the tests finish, then the process stays alive) and the other branch hitting the same limit point to the workflow rather than this PR. Still, the PR's overall result will fail until that job completes, so it may be worth a separate look at what keeps the process alive after the summary.

🤖 Generated with Claude Code

juaristi22 and others added 2 commits October 29, 2026 19:29
Where allowable deductions exceed pay, taxable employment income holds
only part of the benefits in kind, so subtracting all of them took other
income out of repayment income. Subtract the smaller of taxable
employment income and the benefits, in one helper for the repayment and
the Plan 2 interest rate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On 29 October the job was cancelled at 45 minutes after every test had
passed, with the process still alive 11 and 18 minutes after pytest's
summary. The runner most likely runs short of memory (#2741). 75 minutes
matches the Python shards, which Result waits for anyway.

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

Copy link
Copy Markdown
Collaborator Author

Thanks, Anthony. Both points are now in.

  1. Student loans with allowable deductions above pay: fixed in 3940406d7.
    • Both variables now subtract the smaller of taxable_employment_income and benefits_in_kind. Taxable employment income is pay and benefits less deductions, floored at zero, so that is exactly the part of the benefits net income holds.
    • One helper, utils/student_loans.py, serves the repayment and the Plan 2 interest rate.
    • Your example is now a YAML case: taxable employment income is £4,000, net income £34,000, repayment income £30,000, and the repayment £55.35.
  2. Test / YAML: the limit is raised from 45 to 75 minutes in 4cda1b963, matching the Python shards, which Result waits for anyway.

🤖 Generated with Claude Code

@juaristi22
juaristi22 marked this pull request as ready for review October 29, 2026 20:48
@juaristi22
juaristi22 added this pull request to the merge queue Oct 29, 2026
Merged via the queue into main with commit 7cc6c8e Oct 29, 2026
39 checks passed
@juaristi22
juaristi22 deleted the company-car-benefit-2749 branch October 29, 2026 21:57
juaristi22 added a commit to PolicyEngine/chronicle that referenced this pull request Oct 30, 2026
For PolicyEngine/uk-autumn-budget-dashboard-2026#316: Budget 2026 raises company car
tax by one percentage point in every band from 2030-31, and policyengine-uk 2.165.0
(PolicyEngine/policyengine-uk#2750) models the company car and car fuel benefits.

hmrc-benefits-in-kind-july-2026 carries 544 facts from HMRC's Tables 1 to 4 workbook
(15 July 2026): Table 1's recipients, taxable value, average taxable value, and
Income Tax and Class 1A NIC liabilities, 2011-12 to 2024-25; Tables 2A, 2C and 2E's
car benefit recipients by CO2 band and by fuel type and the average CO2 emissions of
company cars over the same years; and Tables 3A, 3B and 4's 2024-25 recipients,
taxable value and average taxable value by range of total income and by region.

Markers emit no fact, never a zero; each sheet's rounding is quoted; 2024-25 is
provisional and payrolled cars are under-reported from 2016-17, on every record
set's notes. HMRC's averages are ported as printed, since the rounded cells do not
reproduce them. Tables 3A, 3B and 4 are grossed from the SPI cases matched to the
P11D and RTI records (survey_aggregate); their 'All' rows print Table 1's totals and
are not ported again.

Re-pin the merged bundle: +544 facts, one source table and one geography (HMRC's
unknown recipient region). The merged-bundle test needs `chronicle publish-raw` for
the new artifact first.

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.

Model the company car and car fuel benefits, with Class 1A NICs

2 participants