diff --git a/changelog.d/1879.fixed.md b/changelog.d/1879.fixed.md new file mode 100644 index 0000000000..893ac8e490 --- /dev/null +++ b/changelog.d/1879.fixed.md @@ -0,0 +1 @@ +- Hold the NICs primary threshold, upper earnings limit, secondary threshold and Class 4 lower and upper profits limits at their 2026-27 levels through 2030-31, as announced at Budget 2025, with a reference for each year. CPI uprating resumes in 2031-32; before this change the Class 4 limits were uprated from 2027-28 and the primary threshold and upper earnings limit from 2028-29. Also correct the 2025-26 lower earnings limit to £125 a week (SI 2025/288). diff --git a/docs/book/policy/model-baseline.md b/docs/book/policy/model-baseline.md index 53ab48307f..59b1749fc1 100644 --- a/docs/book/policy/model-baseline.md +++ b/docs/book/policy/model-baseline.md @@ -4,6 +4,12 @@ PolicyEngine UK models the UK tax and benefit system as of 2025, incorporating major reforms from 2020-2025. This page documents the key policy changes by year, working backwards from 2025, showing how each reform is implemented in the codebase. ``` +## Announced policy to 2030-31 + +### Budget 2025 threshold freezes + +Budget 2025 keeps the income tax personal allowance and basic rate limit, and the equivalent National Insurance thresholds, at their current levels until April 2031. The model holds the [primary threshold](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/primary_threshold.yaml) and [lower profits limit](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/lower_profits_limit.yaml) at £12,570, the [upper earnings limit](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/upper_earnings_limit.yaml) and [upper profits limit](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/upper_profits_limit.yaml) at £50,270, and the [secondary threshold](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml) at £96 a week through 2030-31, then uprates them with CPI from 2031-32. For Class 1, regulations set only the 2026-27 amounts; the later years are announced policy. The Class 4 limits are standing figures in SSCBA 1992 s.15(3). The model annualises the weekly secondary threshold as 52 × £96 = £4,992; the annual figure in law is £5,000 ([#1967](https://github.com/PolicyEngine/policyengine-uk/issues/1967)). The [lower earnings limit](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/lower_earnings_limit.yaml) is not frozen: it rose with CPI to £129 a week in 2026-27. + ## 2025 reforms ### Autumn Budget 2024 diff --git a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/lower_earnings_limit.yaml b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/lower_earnings_limit.yaml index 31fece94b9..a87fe25819 100644 --- a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/lower_earnings_limit.yaml +++ b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/lower_earnings_limit.yaml @@ -8,6 +8,8 @@ metadata: unit: currency-GBP uprating: gov.economic_assumptions.indices.obr.consumer_price_index label: NI lower earnings limit +# The LEL is not frozen: Budget 2025 para 4.118 raised it by September 2025 CPI +# for 2026-27. Values from 2027-28 are a CPI projection; none is announced. values: 2015-04-06: 112 2016-04-06: 112 @@ -23,9 +25,17 @@ values: title: The Social Security (Contributions) (Rates, Limits and Thresholds Amendments and National Insurance Funds Payments) Regulations 2022(6) value: 123 + 2025-04-06: + value: 125 + metadata: + reference: + - title: SI 2025/288 reg 5(2)(b), amending SI 2001/1004 reg 10(a) + href: https://www.legislation.gov.uk/uksi/2025/288/regulation/5/made 2026-04-06: value: 129 metadata: reference: - - title: "GOV.UK | Rates and allowances: National Insurance contributions" - href: https://www.gov.uk/government/publications/rates-and-allowances-national-insurance-contributions/rates-and-allowances-national-insurance-contributions + - title: SI 2026/231 reg 5(2)(b), amending SI 2001/1004 reg 10(a) + href: https://www.legislation.gov.uk/uksi/2026/231/regulation/5/made + - title: Budget 2025 (HC 1492) para 4.118 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=114 diff --git a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/primary_threshold.yaml b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/primary_threshold.yaml index 6f6ce4b969..e9c01f55ae 100644 --- a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/primary_threshold.yaml +++ b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/primary_threshold.yaml @@ -1,4 +1,12 @@ description: The Primary Threshold is the lower bound for the main rate of Class 1 National Insurance. +# From 6 July 2022 the model stores the annual earnings period threshold +# divided by 52 (12,570 / 52, rounded to 241.73), as SI 2001/1004 reg 11(3)(c) +# does for periods of whole weeks; 52 weeks give £12,569.96. The weekly amount +# in reg 10(c) is £242. +# Legal status: SI 2001/1004 reg 10 sets the amounts for 2026-27 only. The +# 2027-28 to 2030-31 values are announced policy (Autumn Statement 2022 and +# Budget 2025), to be set in each year's rates, limits and thresholds +# regulations. CPI uprating from 2031-32 is a modelling assumption. values: 2015-04-06: 155 2016-04-06: 155 @@ -13,18 +21,56 @@ values: reference: - title: The Social Security (Contributions) (Rates, Limits and Thresholds Amendments and National Insurance Funds Payments) Regulations 2022(6) href: https://www.legislation.gov.uk/uksi/2022/232/regulation/6/made#regulation-6-2-a - 2022-07-01: + 2022-07-01: value: 241.73 metadata: reference: - title: Spring Statement 2022 href: https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/1062486/Spring_Statement_2022_Web_Accessible.pdf - 2027-04-01: + 2026-04-06: value: 241.73 metadata: reference: - - title: Spring Statement 2022 - href: https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/1062486/Spring_Statement_2022_Web_Accessible.pdf + - title: The Social Security (Contributions) Regulations 2001 reg 10(c) and reg 11(3), for 2026-27 (reg 10's tax year set by SI 2026/231 reg 5(2)(a)) + href: https://www.legislation.gov.uk/uksi/2001/1004/regulation/11/2026-04-06 + - title: SI 2026/231 reg 5 + href: https://www.legislation.gov.uk/uksi/2026/231/regulation/5/made + 2027-04-06: + value: 241.73 + metadata: + reference: + - title: "HMRC: Income Tax Personal Allowance and the basic rate limit, and certain National Insurance contributions thresholds from 6 April 2026 to 5 April 2028 (Autumn Statement 2022)" + href: https://www.gov.uk/government/publications/the-personal-allowance-and-basic-rate-limit-for-income-tax-and-certain-national-insurance-contributions-nics-thresholds-from-6-april-2026-to-5-apr/income-tax-personal-allowance-and-the-basic-rate-limit-and-certain-national-insurance-contributions-thresholds-from-6-april-2026-to-5-april-2028 + 2028-04-06: + value: 241.73 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2029-04-06: + value: 241.73 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2030-04-06: + value: 241.73 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf metadata: label: NI primary threshold unit: currency-GBP diff --git a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml index 0d29c4dcbe..85dc6e9eb3 100644 --- a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml +++ b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/secondary_threshold.yaml @@ -7,6 +7,12 @@ metadata: - https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/882271/Table-a4.pdf - https://www.gov.uk/government/publications/rates-and-allowances-national-insurance-contributions/rates-and-allowances-national-insurance-contributions unit: currency-GBP +# The model stores the weekly £96 in reg 10(d) and annualises it as 52 weeks +# (£4,992); reg 11(3A)(b) gives £5,000 a year (#1967). +# Legal status: SI 2001/1004 reg 10 sets the amounts for 2026-27 only. The +# 2027-28 to 2030-31 values are announced policy (Autumn Budget 2024 and +# Budget 2025), to be set in each year's rates, limits and thresholds +# regulations. CPI uprating from 2031-32 is a modelling assumption. values: 2015-04-06: 155 2016-04-06: 155 @@ -23,19 +29,47 @@ values: and National Insurance Funds Payments) Regulations 2022(6) value: 175 2024-01-01: 175 - 2025-01-01: + 2025-04-06: value: 96 - reference: - - title: National Insurance Contributions (Secondary Class 1 Contributions) Act 2025(2) - href: https://www.legislation.gov.uk/ukpga/2025/11/section/2 - 2027-01-01: + metadata: + reference: + - title: National Insurance Contributions (Secondary Class 1 Contributions) Act 2025 s.2 + href: https://www.legislation.gov.uk/ukpga/2025/11/section/2 + 2026-04-06: value: 96 - reference: - - title: National Insurance Contributions (Secondary Class 1 Contributions) Act 2025(2) - href: https://www.legislation.gov.uk/ukpga/2025/11/section/2 + metadata: + reference: + - title: The Social Security (Contributions) Regulations 2001 reg 10(d) and reg 11(3A), for 2026-27 (reg 10's tax year set by SI 2026/231 reg 5(2)(a)) + href: https://www.legislation.gov.uk/uksi/2001/1004/regulation/11/2026-04-06 + - title: SI 2026/231 reg 5 + href: https://www.legislation.gov.uk/uksi/2026/231/regulation/5/made + 2027-04-06: + value: 96 + metadata: + reference: + - title: "HMRC: Changes to the Class 1 National Insurance Contributions Secondary Threshold, the Secondary Class 1 National Insurance contributions rate, and the Employment Allowance from 6 April 2025 (Autumn Budget 2024)" + href: https://www.gov.uk/government/publications/changes-to-the-class-1-national-insurance-contributions-secondary-threshold-the-secondary-class-1-national-insurance-contributions-rate-and-the-empl/changes-to-the-class-1-national-insurance-contributions-secondary-threshold-the-secondary-class-1-national-insurance-contributions-rate-and-the-empl + 2028-04-06: + value: 96 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.112 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: Explanatory Memorandum to SI 2026/231 para 5.26 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2029-04-06: + value: 96 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.112 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: Explanatory Memorandum to SI 2026/231 para 5.26 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf 2030-04-06: value: 96 metadata: reference: - - title: OBR Economic and Fiscal Outlook November 2025 - href: https://obr.uk/efo/economic-and-fiscal-outlook-november-2025/ + - title: Budget 2025 (HC 1492) para 4.112 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: Explanatory Memorandum to SI 2026/231 para 5.26 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf diff --git a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/upper_earnings_limit.yaml b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/upper_earnings_limit.yaml index 370eceff7a..ffd2796a4f 100644 --- a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/upper_earnings_limit.yaml +++ b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_1/thresholds/upper_earnings_limit.yaml @@ -1,4 +1,12 @@ description: The Upper Earnings Limit is the upper bound for the main rate of Class 1 National Insurance. +# From 2021-22 the model stores the annual earnings period limit divided by 52 +# (50,270 / 52, rounded to 966.73), as SI 2001/1004 reg 11(2A)(c) does for +# periods of whole weeks; 52 weeks give £50,269.96. The weekly amount in +# reg 10(b) is £967. +# Legal status: SI 2001/1004 reg 10 sets the amounts for 2026-27 only. The +# 2027-28 to 2030-31 values are announced policy (Autumn Statement 2022 and +# Budget 2025), to be set in each year's rates, limits and thresholds +# regulations. CPI uprating from 2031-32 is a modelling assumption. values: 2015-04-06: 815 2016-04-06: 827 @@ -7,7 +15,50 @@ values: 2019-04-06: 962 2020-04-06: 962 2021-04-06: 966.73 - 2027-04-06: 966.73 + 2026-04-06: + value: 966.73 + metadata: + reference: + - title: The Social Security (Contributions) Regulations 2001 reg 10(b) and reg 11(2A), for 2026-27 (reg 10's tax year set by SI 2026/231 reg 5(2)(a)) + href: https://www.legislation.gov.uk/uksi/2001/1004/regulation/11/2026-04-06 + - title: SI 2026/231 reg 5 + href: https://www.legislation.gov.uk/uksi/2026/231/regulation/5/made + 2027-04-06: + value: 966.73 + metadata: + reference: + - title: "HMRC: Income Tax Personal Allowance and the basic rate limit, and certain National Insurance contributions thresholds from 6 April 2026 to 5 April 2028 (Autumn Statement 2022)" + href: https://www.gov.uk/government/publications/the-personal-allowance-and-basic-rate-limit-for-income-tax-and-certain-national-insurance-contributions-nics-thresholds-from-6-april-2026-to-5-apr/income-tax-personal-allowance-and-the-basic-rate-limit-and-certain-national-insurance-contributions-thresholds-from-6-april-2026-to-5-april-2028 + 2028-04-06: + value: 966.73 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2029-04-06: + value: 966.73 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2030-04-06: + value: 966.73 + metadata: + reference: + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf metadata: label: NI upper earnings limit unit: currency-GBP diff --git a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/lower_profits_limit.yaml b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/lower_profits_limit.yaml index 9aa9dae5a9..b36a83b7ba 100644 --- a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/lower_profits_limit.yaml +++ b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/lower_profits_limit.yaml @@ -1,4 +1,8 @@ description: The Lower Profits Limit is the threshold at which self-employed earners pay the main Class 4 National Insurance rate. +# Legal status: £12,570 is the standing figure in SSCBA 1992 s.15(3)(a), which +# stays until altered by order under SSAA 1992 s.141. Budget 2025 commits to +# keeping it until April 2031. CPI uprating from 2031-32 is a modelling +# assumption. values: 2015-04-06: 8_060 2017-04-06: 8_164 @@ -22,8 +26,52 @@ values: value: 12_570 metadata: reference: - - title: "GOV.UK | Rates and allowances: National Insurance contributions" - href: https://www.gov.uk/government/publications/rates-and-allowances-national-insurance-contributions/rates-and-allowances-national-insurance-contributions + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(a) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + 2027-04-06: + value: 12_570 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(a) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: "HMRC: Income Tax Personal Allowance and the basic rate limit, and certain National Insurance contributions thresholds from 6 April 2026 to 5 April 2028 (Autumn Statement 2022)" + href: https://www.gov.uk/government/publications/the-personal-allowance-and-basic-rate-limit-for-income-tax-and-certain-national-insurance-contributions-nics-thresholds-from-6-april-2026-to-5-apr/income-tax-personal-allowance-and-the-basic-rate-limit-and-certain-national-insurance-contributions-thresholds-from-6-april-2026-to-5-april-2028 + 2028-04-06: + value: 12_570 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(a) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2029-04-06: + value: 12_570 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(a) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2030-04-06: + value: 12_570 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(a) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf metadata: label: NI lower profits limit unit: currency-GBP diff --git a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/upper_profits_limit.yaml b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/upper_profits_limit.yaml index 7182b8ebec..37fa1a7b67 100644 --- a/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/upper_profits_limit.yaml +++ b/policyengine_uk/parameters/gov/hmrc/national_insurance/class_4/thresholds/upper_profits_limit.yaml @@ -1,4 +1,8 @@ description: The Upper Profits Limit is the threshold at which self-employed earners pay the additional Class 4 National Insurance rate. +# Legal status: £50,270 is the standing figure in SSCBA 1992 s.15(3)(b), which +# stays until altered by order under SSAA 1992 s.141. Budget 2025 commits to +# keeping it until April 2031. CPI uprating from 2031-32 is a modelling +# assumption. values: 2015-04-06: 42_386 2015-06-05: 43_000 @@ -7,7 +11,56 @@ values: 2019-04-06: 50_000 2020-04-06: 50_000 2021-04-06: 50_270 - 2026-04-06: 50_270 + 2026-04-06: + value: 50_270 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(b) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + 2027-04-06: + value: 50_270 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(b) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: "HMRC: Income Tax Personal Allowance and the basic rate limit, and certain National Insurance contributions thresholds from 6 April 2026 to 5 April 2028 (Autumn Statement 2022)" + href: https://www.gov.uk/government/publications/the-personal-allowance-and-basic-rate-limit-for-income-tax-and-certain-national-insurance-contributions-nics-thresholds-from-6-april-2026-to-5-apr/income-tax-personal-allowance-and-the-basic-rate-limit-and-certain-national-insurance-contributions-thresholds-from-6-april-2026-to-5-april-2028 + 2028-04-06: + value: 50_270 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(b) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2029-04-06: + value: 50_270 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(b) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf + 2030-04-06: + value: 50_270 + metadata: + reference: + - title: Social Security Contributions and Benefits Act 1992 s.15(3)(b) + href: https://www.legislation.gov.uk/ukpga/1992/4/section/15 + - title: Budget 2025 (HC 1492) para 4.111 + href: https://assets.publishing.service.gov.uk/media/6929b353345e31ab14ecf735/E03444720_Budget_2025_Web_Accessible.pdf#page=113 + - title: "HMRC: Maintaining Income Tax and equivalent National Insurance contributions thresholds until 5 April 2031" + href: https://www.gov.uk/government/publications/maintaining-income-tax-and-equivalent-national-insurance-contributions-thresholds-until-5-april-2031/income-tax-maintaining-the-personal-allowance-and-the-basic-rate-limit-for-income-tax-and-equivalent-national-insurance-contributions-thresholds-unt + - title: Explanatory Memorandum to SI 2026/231 para 5.25 + href: https://www.legislation.gov.uk/uksi/2026/231/pdfs/uksiem_20260231_en_001.pdf metadata: label: NI upper profits limit unit: currency-GBP diff --git a/policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/ni_threshold_freeze.yaml b/policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/ni_threshold_freeze.yaml new file mode 100644 index 0000000000..9876a80dca --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance/ni_threshold_freeze.yaml @@ -0,0 +1,120 @@ +# Budget 2025 holds the NICs thresholds at their 2026-27 levels until +# 5 April 2031 (Budget 2025 paras 4.111-4.112): PT and LPL £12,570, UEL and +# UPL £50,270, ST £5,000 (£96 a week). 2027-28 was already frozen by +# Autumn Statement 2022 (PT, UEL, LPL, UPL) and Autumn Budget 2024 (ST). +# Rates: Class 1 8% / 2%, employer 15%, Class 4 6% / 2%. +# The model annualises the weekly ST as 52 x £96 = £4,992. + +- name: 2027-28 employee Class 1 at the primary threshold + period: 2027 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 12_570 + output: + ni_class_1_employee: 0 + +- name: 2027-28 employee Class 1 between the primary threshold and the UEL + period: 2027 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 30_000 + output: + ni_class_1_employee: (30_000 - 12_570) * 0.08 # 1,394.40 + ni_class_1_employer: (30_000 - 4_992) * 0.15 # 3,751.20 + +- name: 2027-28 employee Class 1 above the UEL + period: 2027 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 60_000 + output: + ni_class_1_employee_primary: (50_270 - 12_570) * 0.08 # 3,016 + ni_class_1_employee_additional: (60_000 - 50_270) * 0.02 # 194.60 + ni_class_1_employer: (60_000 - 4_992) * 0.15 # 8,251.20 + +- name: 2027-28 Class 4 at the lower profits limit + period: 2027 + absolute_error_margin: 0.01 + input: + age: 40 + self_employment_income: 12_570 + output: + ni_class_4: 0 + +- name: 2027-28 Class 4 between the profits limits + period: 2027 + absolute_error_margin: 0.01 + input: + age: 40 + self_employment_income: 30_000 + output: + ni_class_4: (30_000 - 12_570) * 0.06 # 1,045.80 + +- name: 2027-28 Class 4 above the upper profits limit + period: 2027 + absolute_error_margin: 0.01 + input: + age: 40 + self_employment_income: 60_000 + output: + ni_class_4: (50_270 - 12_570) * 0.06 + (60_000 - 50_270) * 0.02 # 2,456.60 + +- name: 2030-31 employee Class 1 at the primary threshold + period: 2030 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 12_570 + output: + ni_class_1_employee: 0 + +- name: 2030-31 employee Class 1 between the primary threshold and the UEL + period: 2030 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 30_000 + output: + ni_class_1_employee: (30_000 - 12_570) * 0.08 # 1,394.40 + ni_class_1_employer: (30_000 - 4_992) * 0.15 # 3,751.20 + +- name: 2030-31 employee Class 1 above the UEL + period: 2030 + absolute_error_margin: 0.01 + input: + age: 40 + employment_income: 60_000 + output: + ni_class_1_employee_primary: (50_270 - 12_570) * 0.08 # 3,016 + ni_class_1_employee_additional: (60_000 - 50_270) * 0.02 # 194.60 + ni_class_1_employer: (60_000 - 4_992) * 0.15 # 8,251.20 + +- name: 2030-31 Class 4 at the lower profits limit + period: 2030 + absolute_error_margin: 0.01 + input: + age: 40 + self_employment_income: 12_570 + output: + ni_class_4: 0 + +- name: 2030-31 Class 4 between the profits limits + period: 2030 + absolute_error_margin: 0.01 + input: + age: 40 + self_employment_income: 30_000 + output: + ni_class_4: (30_000 - 12_570) * 0.06 # 1,045.80 + +- name: 2030-31 Class 4 above the upper profits limit + period: 2030 + absolute_error_margin: 0.01 + input: + age: 40 + self_employment_income: 60_000 + output: + ni_class_4: (50_270 - 12_570) * 0.06 + (60_000 - 50_270) * 0.02 # 2,456.60 diff --git a/policyengine_uk/tests/test_ni_threshold_freeze.py b/policyengine_uk/tests/test_ni_threshold_freeze.py new file mode 100644 index 0000000000..d67317edc2 --- /dev/null +++ b/policyengine_uk/tests/test_ni_threshold_freeze.py @@ -0,0 +1,364 @@ +"""Tests for the National Insurance threshold freeze to April 2031 (#1879). + +Budget 2025 maintains the Class 1 primary threshold (PT), upper earnings limit +(UEL) and secondary threshold (ST), and the Class 4 lower and upper profits +limits (LPL, UPL), at their 2026-27 levels until 5 April 2031. The Lower +Earnings Limit is not frozen: it rose with CPI to £129 a week in 2026-27. + +Model year Y is the fiscal year starting 6 April Y. The model stores PT and UEL +as the annual amounts over 52 (12,570 / 52 and 50,270 / 52, as SI 2001/1004 +reg 11(3)(c) and 11(2A)(c) do for periods of whole weeks) and ST as the reg +10(d) weekly amount (£96), and annualises weekly thresholds as 52 weeks. So the +model's annual ST is £4,992, where reg 11(3A)(b) gives £5,000 (#1967); the +statute table follows the model here, and a strict xfail marks the gap. + +Invariants: + +1. Statute table: in every year 2026-2030, each threshold equals the figure in + STATUTORY_2026_27, which is taken from SI 2001/1004 regs 10-11 as they + stand for 2026-27 and SSCBA 1992 s.15(3), not from the parameter files. +2. Cash freeze: PT, UEL, ST, LPL and UPL are identical in every year + 2026-2030. +3. Indexation resumes from the frozen level: from 2031, each threshold is its + 2030 value times CPI(Y) / CPI(2030). There is no catch-up to the path the + threshold would have followed without the freeze. +4. Alignment: 52 x PT = LPL = personal allowance in every year 2024-2040; + 52 x UEL = UPL in every year 2021-2040; and UPL = personal allowance + + basic rate limit in every year 2021-2030. +5. No cash cuts: no threshold falls from one year to the next, 2026-2040. +6. Differential: for any earnings or profits >= 0 in 2026-2030, primary and + additional Class 1, secondary Class 1 and Class 4 equal an exact-rational + computation from the statute table. +7. Frozen liabilities: rates do not change over 2026-2030, so the NI due on + a given cash income is the same in every one of those years. + +Comparisons allow float32 rounding: the model stores values as float32. +""" + +from fractions import Fraction +from pathlib import Path + +import numpy as np +import pytest +import yaml +from hypothesis import HealthCheck, example, given, settings +from hypothesis import strategies as st + +import policyengine_uk +from policyengine_uk import CountryTaxBenefitSystem, Simulation + +NI = "gov.hmrc.national_insurance" +FROZEN_YEARS = [2026, 2027, 2028, 2029, 2030] +PROJECTION_YEARS = list(range(2026, 2041)) +PARAMETER_DIR = Path(policyengine_uk.__file__).parent / "parameters" + +# Figures for 2026-27 from the Social Security (Contributions) Regulations +# 2001 regs 10-11, whose tax year SI 2026/231 reg 5 set to 2026-27, and SSCBA +# 1992 s.15(3). Budget 2025 holds all but the LEL at these levels until April +# 2031. +STATUTORY_2026_27 = { + "lower_earnings_limit": Fraction(129), # weekly, CPI-uprated + "primary_threshold": Fraction(12_570, 52), # annual / 52 + # reg 10(d) weekly, as the model stores it; see #1967 for the annual £5,000. + "secondary_threshold": Fraction(96), + "upper_earnings_limit": Fraction(50_270, 52), # annual / 52 + "lower_profits_limit": Fraction(12_570), # annual + "upper_profits_limit": Fraction(50_270), # annual +} +PATHS = { + "lower_earnings_limit": "class_1.thresholds.lower_earnings_limit", + "primary_threshold": "class_1.thresholds.primary_threshold", + "secondary_threshold": "class_1.thresholds.secondary_threshold", + "upper_earnings_limit": "class_1.thresholds.upper_earnings_limit", + "lower_profits_limit": "class_4.thresholds.lower_profits_limit", + "upper_profits_limit": "class_4.thresholds.upper_profits_limit", +} +FROZEN = [name for name in PATHS if name != "lower_earnings_limit"] +# 2026-27 rates, unchanged over the freeze. +RATES = { + "class_1_main": Fraction(8, 100), + "class_1_additional": Fraction(2, 100), + "class_1_employer": Fraction(15, 100), + "class_4_main": Fraction(6, 100), + "class_4_additional": Fraction(2, 100), +} + + +@pytest.fixture(scope="module") +def system(): + return CountryTaxBenefitSystem() + + +def get_node(parameters, path): + node = parameters + for part in path.split("."): + node = getattr(node, part) + return node + + +def threshold(system, name, year): + ni = system.get_parameters_at_instant(str(year)).gov.hmrc.national_insurance + return float(get_node(ni, PATHS[name])) + + +def cpi(system, year): + return float( + system.get_parameters_at_instant( + str(year) + ).gov.economic_assumptions.indices.obr.consumer_price_index + ) + + +def tolerance(*amounts): + # float32 has a 24-bit significand: a few ulps of the largest amount + # involved, plus a penny. + return 0.01 + 4e-7 * max(abs(float(a)) for a in amounts) + + +# Invariant 1: statute table. +@pytest.mark.parametrize("year", FROZEN_YEARS) +@pytest.mark.parametrize("name", FROZEN) +def test_frozen_thresholds_match_statute(system, name, year): + expected = float(STATUTORY_2026_27[name]) + assert threshold(system, name, year) == pytest.approx(expected, abs=0.005) + + +def test_lower_earnings_limit_2025_26_and_2026_27(system): + # SI 2025/288 reg 5(2)(b) and SI 2026/231 reg 5(2)(b). + assert threshold(system, "lower_earnings_limit", 2025) == 125 + assert threshold(system, "lower_earnings_limit", 2026) == 129 + + +@pytest.mark.xfail( + strict=True, + reason="#1967: the model annualises the weekly ST as 52 x £96 = £4,992; " + "SI 2001/1004 reg 11(3A)(b) gives £5,000 a year.", +) +@pytest.mark.parametrize("year", FROZEN_YEARS) +def test_annual_secondary_threshold_is_statutory(system, year): + annual = 52 * threshold(system, "secondary_threshold", year) + assert annual == pytest.approx(5_000, abs=0.5) + + +# Invariant 2: cash freeze. +@pytest.mark.parametrize("name", FROZEN) +def test_frozen_thresholds_hold_in_cash_terms(system, name): + values = {year: threshold(system, name, year) for year in FROZEN_YEARS} + assert len(set(values.values())) == 1, values + + +# Invariant 3: indexation resumes from the frozen level. +@pytest.mark.parametrize("name", FROZEN) +def test_indexation_resumes_from_frozen_level(system, name): + base = threshold(system, name, 2030) + for year in range(2031, 2041): + expected = base * cpi(system, year) / cpi(system, 2030) + assert threshold(system, name, year) == pytest.approx(expected, rel=1e-9), ( + name, + year, + ) + # One year of CPI in 2031, not the cumulative rise since 2026. + first_step = threshold(system, name, 2031) / base + assert first_step == pytest.approx(cpi(system, 2031) / cpi(system, 2030)) + + +def test_lower_earnings_limit_is_cpi_uprated_from_2026_27(system): + base = threshold(system, "lower_earnings_limit", 2026) + for year in range(2027, 2041): + expected = base * cpi(system, year) / cpi(system, 2026) + assert threshold(system, "lower_earnings_limit", year) == pytest.approx( + expected, rel=1e-9 + ) + + +# Invariant 4: alignment with the income tax thresholds. +def test_primary_threshold_and_lpl_align_with_personal_allowance(system): + for year in range(2024, 2041): + income_tax = system.get_parameters_at_instant(str(year)).gov.hmrc.income_tax + personal_allowance = float(income_tax.allowances.personal_allowance.amount) + pt_annual = 52 * threshold(system, "primary_threshold", year) + lpl = threshold(system, "lower_profits_limit", year) + assert pt_annual == pytest.approx(personal_allowance, rel=1e-5), year + assert lpl == pytest.approx(personal_allowance, rel=1e-9), year + + +def test_uel_and_upl_align(system): + for year in range(2021, 2041): + uel_annual = 52 * threshold(system, "upper_earnings_limit", year) + upl = threshold(system, "upper_profits_limit", year) + assert uel_annual == pytest.approx(upl, rel=1e-5), year + + +def test_upl_equals_higher_rate_threshold_through_the_freeze(system): + for year in range(2021, 2031): + income_tax = system.get_parameters_at_instant(str(year)).gov.hmrc.income_tax + personal_allowance = float(income_tax.allowances.personal_allowance.amount) + basic_rate_limit = float(income_tax.rates.uk.thresholds[1]) + upl = threshold(system, "upper_profits_limit", year) + assert upl == personal_allowance + basic_rate_limit, year + + +# Invariant 5: no cash cuts. +@pytest.mark.parametrize("name", list(PATHS)) +def test_no_threshold_falls_in_cash_terms(system, name): + values = [threshold(system, name, year) for year in PROJECTION_YEARS] + assert all(b >= a for a, b in zip(values, values[1:])), values + + +def test_frozen_year_values_cite_a_source(): + """Every value dated in 2026-27 to 2030-31 carries a titled reference.""" + for name, path in PATHS.items(): + file = ( + PARAMETER_DIR + / "gov/hmrc/national_insurance" + / (path.replace(".", "/") + ".yaml") + ) + values = yaml.safe_load(file.read_text())["values"] + dated = {str(instant): entry for instant, entry in values.items()} + years = [2025, 2026] if name == "lower_earnings_limit" else FROZEN_YEARS + for year in years: + entry = dated.get(f"{year}-04-06") + assert isinstance(entry, dict), (name, year) + references = entry.get("metadata", {}).get("reference", []) + assert references, (name, year) + for reference in references: + assert reference.get("title") and reference.get("href"), ( + name, + year, + ) + + +# Invariants 6 and 7: liabilities. + + +def simulate(earnings, profits, year): + """One simulation: employees on `earnings`, then sole traders on `profits`.""" + people = {} + for i, amount in enumerate(earnings): + # Class 1 earnings are set directly: from 2029 the salary sacrifice + # broad-base haircut trims employment income before NI. + people[f"e{i}"] = { + "age": {year: 40}, + "ni_class_1_income": {year: float(amount)}, + "employer_pension_contributions": {year: 0}, + } + for i, amount in enumerate(profits): + people[f"s{i}"] = { + "age": {year: 40}, + "self_employment_income": {year: float(amount)}, + } + names = list(people) + situation = { + "people": people, + "benunits": {f"b_{n}": {"members": [n]} for n in names}, + "households": {f"h_{n}": {"members": [n]} for n in names}, + } + sim = Simulation(situation=situation) + n_employees = len(earnings) + out = { + variable: np.asarray(sim.calculate(variable, year), dtype=float) + for variable in [ + "ni_class_1_employee_primary", + "ni_class_1_employee_additional", + "ni_class_1_employer", + "ni_class_4", + ] + } + return { + "employees": {k: v[:n_employees] for k, v in out.items()}, + "sole_traders": {k: v[n_employees:] for k, v in out.items()}, + } + + +def statutory_class_1(earnings): + e = Fraction(float(earnings)) + pt = 52 * STATUTORY_2026_27["primary_threshold"] + uel = 52 * STATUTORY_2026_27["upper_earnings_limit"] + st_ = 52 * STATUTORY_2026_27["secondary_threshold"] + return { + "ni_class_1_employee_primary": RATES["class_1_main"] + * min(max(e - pt, 0), uel - pt), + "ni_class_1_employee_additional": RATES["class_1_additional"] * max(e - uel, 0), + "ni_class_1_employer": RATES["class_1_employer"] * max(e - st_, 0), + } + + +def statutory_class_4(profits): + """SSCBA 1992 s.15(3) for a sole trader with no Class 1.""" + p = Fraction(float(profits)) + lpl = STATUTORY_2026_27["lower_profits_limit"] + upl = STATUTORY_2026_27["upper_profits_limit"] + return RATES["class_4_main"] * min(max(p - lpl, 0), upl - lpl) + RATES[ + "class_4_additional" + ] * max(p - upl, 0) + + +def check_liabilities(earnings, profits, years): + results = {year: simulate(earnings, profits, year) for year in years} + for year, result in results.items(): + for i, amount in enumerate(earnings): + for variable, expected in statutory_class_1(amount).items(): + model = result["employees"][variable][i] + assert abs(model - float(expected)) <= tolerance(expected, amount), ( + year, + variable, + amount, + model, + float(expected), + ) + for i, amount in enumerate(profits): + expected = statutory_class_4(amount) + model = result["sole_traders"]["ni_class_4"][i] + assert abs(model - float(expected)) <= tolerance(expected, amount), ( + year, + amount, + model, + float(expected), + ) + # Invariant 7: identical liabilities in every frozen year. + first = results[years[0]] + for year in years[1:]: + for group in ("employees", "sole_traders"): + for variable, values in results[year][group].items(): + np.testing.assert_array_equal( + values, first[group][variable], err_msg=f"{year} {variable}" + ) + + +# Every threshold, a penny and a pound either side, plus seeded random levels. +EDGES = [ + edge + offset + for edge in [4_992, 12_570, 50_270] + for offset in (-1, -0.01, 0, 0.01, 1) +] + + +def test_liabilities_at_threshold_edges_and_random_levels(): + rng = np.random.default_rng(1879) + levels = [0.0, *EDGES, *rng.uniform(0, 250_000, 60).round(2).tolist()] + check_liabilities(levels, levels, FROZEN_YEARS) + + +@settings( + max_examples=10, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +@given( + earnings=st.lists( + st.floats(0, 500_000, allow_nan=False, allow_infinity=False), + min_size=1, + max_size=12, + ), + profits=st.lists( + st.floats(0, 500_000, allow_nan=False, allow_infinity=False), + min_size=1, + max_size=12, + ), +) +# #1879: a £60,000 employee and a £60,000 sole trader. Before the fix, 2028 +# used CPI-uprated PT/UEL and 2027 CPI-uprated LPL/UPL. +@example(earnings=[60_000.0], profits=[60_000.0]) +def test_liabilities_follow_the_frozen_statute(earnings, profits): + check_liabilities(earnings, profits, FROZEN_YEARS)