Skip to content

Hold NICs thresholds at 2026-27 levels through 2030-31 - #1959

Merged
MaxGhenis merged 2 commits into
mainfrom
ni-thresholds-freeze-2031
Oct 2, 2026
Merged

MaxGhenis merged 2 commits into
mainfrom
ni-thresholds-freeze-2031

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #1879

What was wrong

Budget 2025 holds the NICs thresholds at their 2026-27 levels until 5 April 2031. On main (44240bd), four of them were CPI-uprated early:

Threshold (model year = fiscal year) 2026 2027 2028 2029 2030 2031
PT, weekly (annual / 52) 241.73 241.73 246.56 251.50 256.53 261.66
UEL, weekly (annual / 52) 966.73 966.73 986.06 1,005.78 1,025.90 1,046.42
LPL 12,570 12,821.38 13,077.80 13,339.32 13,606.11 13,878.24
UPL 50,270 51,275.32 52,300.78 53,346.68 54,413.63 55,501.94
ST, weekly 96 96 96 96 96 97.92

The LPL and UPL rose a year before even the Autumn Statement 2022 freeze ended. The ST and the personal allowance were already held through 2030 (#1381, #1396).

The 2025-26 lower earnings limit was also wrong: it was £123 a week, but the law says £125.

What the law and announced policy say

Everything in this table was read from the primary source this session.

Threshold 2026-27 (law) Frozen through Status of 2027-28 to 2030-31
PT £242/wk, £12,570/yr (SI 2001/1004 regs 10(c), 11(3)) 2030-31 Announced: Autumn Statement 2022 (2027-28); Budget 2025 para 4.111 (2028-31)
UEL £967/wk, £50,270/yr (regs 10(b), 11(2A)) 2030-31 Announced: as for the PT
ST £96/wk, £5,000/yr (regs 10(d), 11(3A)) 2030-31 Announced: Autumn Budget 2024 (£5,000 "until 5 April 2028"); Budget 2025 para 4.112 (2028-31)
UST, AUST £967/wk (regs 10(e)-(f)) 2030-31 Announced: Budget 2025 policy paper ("aligned to the ... UEL at £967 per week up until the 2030 to 2031 tax year"). Not modelled (#1918)
LPL £12,570 (SSCBA 1992 s.15(3)(a)) 2030-31 Standing statutory figure, alterable by a SSAA 1992 s.141 order. Budget 2025 commits to keeping it
UPL £50,270 (s.15(3)(b)) 2030-31 As for the LPL
LEL £129/wk (SI 2026/231 reg 5(2)(b)) Not frozen Budget 2025 para 4.118 raised it by September CPI for 2026-27 only. No later value is announced
SPT £7,105 (s.11(4)(b), SI 2026/231 reg 3(a)) Not frozen As for the LEL. Not touched here; see "Not in this PR"

How the freezes are being legislated:

  • Class 1: reg 10 sets amounts for 2026-27 only ("for the tax year which begins on 6th April 2026"), and SSCBA s.5(1) needs amounts "specified for that year by regulations". Budget 2025 says the 2028-31 freeze will be legislated "in affirmative secondary legislation in early 2028". So the Class 1 values from 2027-28 are announced policy, not law.
  • Class 4: the figures in s.15(3) stand until altered.
  • Income tax: the personal allowance and basic rate limit freeze to 2030-31 is enacted (Finance Act 2026 s.10).

The model's weekly PT and UEL (12,570 / 52 and 50,270 / 52) are the reg 11(3)(c) and 11(2A)(c) equivalents for an earnings period of 52 weeks. The statutory weekly amounts are £242 and £967.

Sources:

Changes

Parameters (gov.hmrc.national_insurance.*):

  • PT, UEL, ST, LPL and UPL: an explicit value dated 6 April for every year from 2026 to 2030, each with references:
    • 2026-27: SI 2001/1004 regs 10-11 as amended by SI 2026/231 (Class 1), or s.15(3) (Class 4).
    • 2027-28: the Autumn Statement 2022 policy paper (the Autumn Budget 2024 paper for the ST).
    • 2028-29 to 2030-31: Budget 2025 para 4.111 (4.112 for the ST), the Budget 2025 policy paper, and EM para 5.25 (5.26 for the ST).
    • CPI uprating resumes from the frozen level in 2031-32, as for the personal allowance. The uprating metadata is unchanged.
    • Each file now has a comment saying which years are law and which are announced policy. That replaces the PT's stray 2027-04-01 entry, which cited Spring Statement 2022, and the ST's OBR EFO citation.
  • LEL: adds £125 from 6 April 2025 (SI 2025/288 reg 5(2)(b)). The 2026-27 £129 now cites SI 2026/231. The LEL is still CPI-projected from 2027-28, with a comment saying no value is announced.
  • ST: moves two reference keys that sat outside metadata (so they were not read as references) into metadata.

Other files:

  • docs/book/policy/model-baseline.md: new "Announced policy to 2030-31" section.
  • changelog.d/1879.fixed.md.

Invariants

These hold for model years Y (the fiscal year starting 6 April Y):

  1. Statute table. In every year from 2026 to 2030, each of PT, UEL, ST, LPL and UPL equals the 2026-27 statutory figure. The test file keeps its own table of those figures, taken from SI 2026/231 and s.15(3), not from the parameter files.
  2. Cash freeze. Each of the five is identical in every year from 2026 to 2030.
  3. Indexation resumes from the frozen level. From 2031, each threshold equals its 2030 value × CPI(Y) / CPI(2030). The first step is one year of CPI, not a catch-up.
  4. Alignment:
    • 52 × PT = LPL = personal allowance in every year from 2024 to 2040.
    • 52 × UEL = UPL in every year from 2021 to 2040.
    • UPL = personal allowance + basic rate limit in every year from 2021 to 2030.
  5. No cash cuts. No threshold (LEL included) falls from one year to the next, 2026 to 2040.
  6. Differential. For any earnings or profits ≥ 0 in 2026-30, four model outputs equal an exact-rational computation from the statute table:
    • ni_class_1_employee_primary
    • ni_class_1_employee_additional
    • ni_class_1_employer
    • ni_class_4 (sole trader)
  7. Frozen liabilities. Rates do not change over 2026-30, so the NI due on a given cash income is bit-identical in each of those years.

Intended exception: after 2030, the UEL/UPL and the higher-rate threshold drift apart. The model uprates the NI limits and the personal allowance by the OBR CPI index, but the basic rate limit by gov.benefit_uprating_cpi. That split is older than this PR.

Tests

  • policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/ni_threshold_freeze.yaml: 12 cases for 2027-28 and 2030-31. They check employee Class 1 at the PT, between the PT and UEL, and above the UEL; employer Class 1; and Class 4 at the LPL, between the limits, and above the UPL.
    • On main, 6 of the 12 fail: 2027-28 Class 4 between and above the limits, and 2030-31 employee Class 1 and Class 4 between and above the thresholds. Checked by running this file against origin/main 44240bd.
  • policyengine_uk/tests/test_ni_threshold_freeze.py: 49 tests covering invariants 1-7, including the 2025-26 LEL (£125) and its reference. Five strict xfails mark the ST annualisation gap (Employer NI annualises the secondary threshold as 52 × £96 = £4,992, not the statutory £5,000 #1967), so the fix for that issue has to remove them.
    • Parameter checks, plus a check that every 2026-2030 value has a titled reference.
    • One simulation per year covering each threshold ±1p/£1 and 60 seeded random levels.
    • A Hypothesis property test: 10 derandomised examples of up to 12 employees and 12 sole traders × 5 years, with the NICs thresholds are uprated before the Budget 2025 freeze ends in April 2031 #1879 £60,000 case as an explicit example.
    • Class 1 earnings are set through ni_class_1_income. From 2029 the salary sacrifice broad-base haircut trims employment_income, which would otherwise break invariant 7 for reasons unrelated to thresholds.
    • On main, 25 of the 49 fail: 23 parameter-level tests and both liability tests.

Enhanced FRS impact (branch minus main)

Each figure below comes from a real Microsimulation per package state, run on a private copy of the Enhanced FRS 2024-25 (sha256 e433e532…). Nothing is scaled or interpolated. Two runs back every figure: main 44240bd, whose only tracked difference was the self-version line in uv.lock, and this branch at 73c0459 with a clean tree. The later commit c23b9a1 changes only comments, citations and the ST's effective date (1 January to 6 April 2025). No processed value changes in any model year: the model samples each fiscal year at 30 April. £m, weighted UK totals for each fiscal year:

Year Employee Class 1 Class 4 Total NI (excl. employer) UC Household net income Households losing Households gaining Avg household change
2026-27 0 0 0 0 0 0 0 £0.00
2027-28 0 +28 +28 +1 −27 2.23m (7%) 0.26m −£0.85
2028-29 +141 +56 +197 +23 −174 12.32m (39%) 5.24m −£5.49
2029-30 +276 +83 +360 +46 −313 12.42m (39%) 5.46m −£9.84
2030-31 +383 +112 +495 +68 −427 12.45m (39%) 5.57m −£13.36
2031-32 +355 +113 +468 +68 −400 12.32m (38%) 5.83m −£12.45

What drives these figures:

  • Unchanged items: employer NI, income tax and Pension Credit do not change in any year. The ST was already frozen, and NI does not feed income tax. Housing Benefit and Council Tax Reduction rise by less than £0.1m a year, because their applicable income subtracts national_insurance.

  • 2031-32 onward: the effect persists, because indexation restarts from the frozen level.

  • Class 1, 2030-31: employees earning between the frozen PT and UEL (£12,570-£50,270) pay +£1,218m. Employees above £50,270 pay −£835m, because a lower UEL moves part of their earnings from the 8% band to the 2% band. People at or below £12,570 see no change.

  • Class 4, 2030-31: +£141m for profits of £12,570-£50,270, and −£29m above £50,270.

  • By decile, 2030-31: the average household change runs from −£12 (decile 1) to −£47 and −£48 (deciles 5 and 6). Decile 9 gains £31 and decile 10 gains £77, because of the UEL and UPL.

  • Poverty, percentage points:

    Measure 2028-29 2029-30 2030-31 2031-32
    AHC, all +0.011 +0.007 +0.060 +0.016
    AHC, children +0.004 +0.009 +0.189 +0.013
    AHC, working age +0.014 +0.008 +0.030 +0.022
    AHC, pensioners +0.011 0.000 0.000 0.000
    BHC, all +0.002 +0.029 +0.041 +0.022

    These are discrete flags, so a few households near the line drive them. The 2030-31 spike comes from one sample household crossing the AHC line. It accounts for +0.181pp of the +0.189pp child change and all of the all-person change. Without it, child AHC poverty rises by 0.008pp, in line with the neighbouring years.

Context only, not a like-for-like check: the OBR scorecard (November 2025 EFO policy tables, sheet 2.1, measure 46) puts the NICs receipts from the Budget 2025 freeze at £156m, £329m and £533m in 2028-29 to 2030-31. Those figures are post-behavioural and include the UST and AUST, which PolicyEngine does not model. The OBR baseline also already froze the LPL and UPL for 2027-28.

Scripts and outputs are in ~/reviews/ni-thresholds-freeze-2031-2026-09-30/impact/ (dataset_impact.py, compare_impact.py, branch_vs_main.json).

Not in this PR

Axiom parity

axiom: uk:statutes/ukpga/1992/4/15#lower_profits_limit, #upper_profits_limit encoded-correct (uk/statutes/ukpga/1992/4/15.test.yaml: profits_limits_unaltered_in_2027_28_non_round_profits_above_upper_limit, profits_limits_unaltered_in_2030_31_*) | TheAxiomFoundation/rulespec-uk#351 queued (SI 2001/1004 reg 10: PT, UEL, ST, LEL, UST, AUST)

What each item covers:

  • Class 4 LPL and UPL: Axiom already holds the s.15(3) figures through 2030-31. It has passing 2027-28 and 2030-31 cases from rulespec-uk#350.
  • Class 1 thresholds: Axiom's reg 10 module carries the 2026-27 amounts forward. That matches this PR's numbers only because the engine repeats the last version. Param uprating #351 is rewritten in dispatch-ready form, labelled pe-parity, and holds the verbatim law and a review_finding. Its companion tests include policy-aligned 2027-28 and 2030-31 employer cases that mirror the YAML tests here. The Class 1 pilot already has passing 2027-28 and 2030-31 cases through the frozen personal allowance and basic rate limit.
  • Class 2 SPT: rulespec-uk#353.

Commands run

  • ruff format and ruff check on the changed Python file: clean.
  • policyengine-core test policyengine_uk/tests/policy -c policyengine_uk: 1,299 passed.
  • pytest on test_ni_threshold_freeze.py, test_ni_class_1_age_properties.py, test_ni_class_4_properties.py, test_ni_class_4_maximum.py, test_parameter_metadata.py, test_parameter_descriptions.py, test_fiscal_year_parameters.py and test_build_metadata.py: 88 passed, 1 skipped at 73c0459. At c23b9a1: test_ni_threshold_freeze.py and the parameter metadata and description tests gave 48 passed and 5 xfailed with the two slow liability tests deselected; the national_insurance YAML suite passed 61 of 61.
  • The new tests run against a checkout of origin/main 44240bd: 25 failed, 24 passed and 5 xfailed. The new YAML file fails 6 of 12 there.
  • Not run locally: the microsimulation test suite and make documentation. CI runs both.

Independent review

Four independent reviewers, one per lens, checked this PR, and a separate adversarial verifier re-checked each finding before it was accepted. Full results: ~/reviews/ni-thresholds-freeze-2031-2026-09-30/review_result.json.

  • Legal sources: every cited primary source was opened and checks out: values, 6 April dates, and 2027-28 references that actually cover 2027-28. The legal-status comments are accurate. No modelled threshold after 2026-27 was missed.
  • Tests: they pass and are deterministic. The runtime is in line with the sibling property tests.
  • Impact: every figure in the tables was recomputed from the saved arrays and matches. Provenance holds.
  • Downstream: no defects. The processed values for 2022-2041 are as intended, and dropping the PT 2027-04-01 and ST 2027-01-01 entries breaks nothing.

Confirmed findings, all fixed in c23b9a1 or in this description:

🤖 Generated with Claude Code

Budget 2025 keeps the Class 1 primary threshold, upper earnings limit
and secondary threshold, and the Class 4 lower and upper profits
limits, at their current levels until 5 April 2031 (Red Book paras
4.111-4.112; HMRC policy paper of 26 November 2025). The model
CPI-uprated LPL and UPL from 2027-28 and PT and UEL from 2028-29,
earlier than even the Autumn Statement 2022 freeze allowed.

Add an explicit value with references for every year 2026-27 to
2030-31: SI 2001/1004 regs 10-11 as amended by SI 2026/231 for
2026-27; the Autumn Statement 2022 and Autumn Budget 2024 policy
papers for 2027-28; Budget 2025 and the SI 2026/231 Explanatory
Memorandum for 2028-29 to 2030-31; SSCBA 1992 s.15(3) for the Class 4
limits. CPI uprating resumes from the frozen level in 2031-32,
matching the personal allowance. Each file records which years are
law and which are announced policy.

Also correct the 2025-26 lower earnings limit from £123 to £125 a
week (SI 2025/288 reg 5(2)(b)), and move the secondary threshold's
misplaced reference keys under metadata.

Tests: YAML cases for 2027-28 and 2030-31, and property and
differential tests for the statute table, the cash freeze, resumed
indexation, alignment with the income tax thresholds, no cash cuts
and frozen liabilities.

Fixes #1879

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Cite SI 2001/1004 reg 10 and the specific reg 11 paragraph for the
  2026-27 Class 1 values, at the 6 April 2026 point-in-time text. SI
  2026/231 reg 5 sets reg 10's tax year; it does not amend reg 11.
- Date the £96 secondary threshold from 6 April 2025, when NICA 2025
  s.2 applies, not 1 January (values unchanged: the model samples each
  fiscal year at 30 April).
- Say exactly what the stored PT and UEL give over 52 weeks
  (£12,569.96 and £50,269.96), and that the model annualises the ST as
  52 x £96 = £4,992 where reg 11(3A)(b) gives £5,000 (#1967). The docs
  now say the same.
- Test the 2025-26 lower earnings limit (£125) and its reference, and
  mark the ST annualisation gap with a strict xfail so the fix for
  #1967 has to remove it.

Refs #1879

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

Copy link
Copy Markdown
Collaborator

Review pass (Claude Code, on Vahid's behalf) at c23b9a1a

Short version: nothing blocking, and I'd approve. The parameter values, dates and legal sources all check out against the primary texts, the CPI restart is one year's CPI from the frozen level, and the new tests pass locally. Three small nits below; none needs to hold the merge.

What I checked

Values, by evaluating the parameters at each model year (the system samples each fiscal year at 30 April, utils/parameters.py:convert_to_fiscal_year_parameters, so the 6 April entries land in the intended model year):

model year PT (wk) UEL (wk) ST (wk) LEL (wk) LPL UPL PA PA + BRL
2025 241.73 966.73 96 125.00 12,570 50,270 12,570 50,270
2026 241.73 966.73 96 129.00 12,570 50,270 12,570 50,270
2027–2030 241.73 966.73 96 131.58 → 139.63 12,570 50,270 12,570 50,270
2031 246.56 986.07 97.92 142.43 12,821.41 51,275.43 12,821.41 51,275.42
  • 2031 / 2030 = CPI(2031) / CPI(2030) = 1.0200 for every threshold, so indexation restarts from the frozen level, with no catch-up.
  • Removing main's PT 2027-04-01 and ST 2027-01-01 entries changes nothing: both carried the same value and both were sampled after they took effect.
  • Moving the ST's £96 from 2025-01-01 to 2025-04-06 doesn't change any processed value (2024 still reads £175 at 30 April 2024).
  • Nothing outside the NI variables reads these thresholds except the employer-NI contrib variables, which read the ST and are unaffected because it was already frozen.

Legal sources, opened this session:

  • SI 2001/1004 reg 10 as in force: tax year from 6 April 2026; LEL £129, UEL £967, PT £242, ST £96, UST and AUST £967. ✔
  • SI 2026/231 reg 5: "2025" → "2026", LEL £125 → £129. SI 2025/288 reg 5: "2024" → "2025", LEL £123 → £125. So the 2025-26 LEL correction to £125 is right. ✔
  • SSCBA 1992 s.15(3): £12,570 and £50,270. ✔
  • Budget 2025 paras 4.111 and 4.112: PT and LPL at £12,570, UEL and UPL at £50,270, ST at £5,000, "from April 2028 until April 2031", to be legislated "in affirmative secondary legislation in early 2028". Para 4.118: LEL and SPT raised by September 2025 CPI (3.8%) for 2026-27 only. ✔
  • EM to SI 2026/231 paras 5.25 and 5.26 say the same, including "the ST will remain fixed at £5,000 up until the 2030-31 tax year". ✔
  • HMRC's policy paper confirms the PT/LPL and UEL/UPL alignment to 5 April 2031 and the UST and AUST alignment with the UEL. ✔

The legal-status comments in each file (law for 2026-27, announced policy after) match these texts.

Tests, run locally on the branch:

Impact, sense check: the signs are right. Freezing the PT and LPL raises NI between the thresholds; freezing the UEL and UPL below their CPI path moves earnings from the main rate to the 2% rate above them, so higher earners pay less; and lower net earnings raise UC. The 2030-31 total of +£495m is in the range of the OBR's £533m for the measure, allowing for the differences you list.

Nits

  1. The UPL and higher-rate threshold drift after 2030 is pennies. The body flags it as an intended exception. On the evaluated values it's £0.01 in 2031-32 and £0.05 by 2040-41, because the OBR CPI index and gov.benefit_uprating_cpi track each other closely. That probably isn't worth an issue of its own. It would be worth one line saying the gap is that small, so nobody goes looking for a bigger problem.
  2. "Equal an exact-rational computation" overstates invariant 6 slightly. The liability tests compare against the Fraction computation within a penny plus a few float32 ulps (tolerance, test_ni_threshold_freeze.py:112). That's the right test, since the weekly PT and UEL are stored to the penny (241.73 and 966.73, so 52 weeks give £12,569.96 and £50,269.96). "Agree to within a penny" would describe it exactly.
  3. The impact scripts and review results live under ~/reviews/..., which reviewers can't open. If they matter for provenance, attaching branch_vs_main.json or committing the two scripts somewhere shared would let someone reproduce the table. Not needed for the merge.

Question (no change needed)

On the OBR comparison: is the Secondary Threshold freeze part of the OBR's £533m (measure 46)? If it is, it's an employer-NI amount that this PR can't reproduce, because the model's ST was already frozen in the baseline. That would make the comparison even less like-for-like than the body says. It doesn't affect anything in the PR.

@MaxGhenis
MaxGhenis merged commit b4c2076 into main Oct 2, 2026
7 checks passed
@MaxGhenis
MaxGhenis deleted the ni-thresholds-freeze-2031 branch October 2, 2026 12:29
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged at c23b9a1a under Max's merge-on-gates rule for PolicyEngine-UK statutory fixes (2 October 2026; decision d744).

  • CI: gh pr checks passed on c23b9a1a.
  • Independent review: the review pass posted above on 2 October at c23b9a1a found nothing blocking; its three nits are text only and can go in a follow-up.
  • Impact: from the real Enhanced FRS runs in the description: NI +£495m in 2030-31, the largest year.
  • Composition: on main 8b2e6e17 merged with this head, the full YAML policy suite (1,421 cases) and test_ni_threshold_freeze.py (49 passed, 5 expected failures for Employer NI annualises the secondary threshold as 52 × £96 = £4,992, not the statutory £5,000 #1967) pass locally.

MaxGhenis added a commit that referenced this pull request Oct 2, 2026
#1959 holds the PT, UEL, LPL and UPL through 2030-31 and corrects the
2025-26 LEL to £125, but left the notebook's saved chart on the old
CPI-uprated values. Only the chart's y values change.

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

Resolve the four means-test income formulas: keep #1896's claimant/partner
member filter and this branch's income-from-capital rules (no property
income, legacy_means_test_income_tax in the tax line, home-letting income).
Keep #1952's Pension Credit references and this branch's Sch IV para 18
reference, and #1926's HB docs with this branch's sentence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 2, 2026
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.

NICs thresholds are uprated before the Budget 2025 freeze ends in April 2031

2 participants