Skip to content

Calculate the ESA permitted work limit from the national living wage - #2687

Merged
juaristi22 merged 5 commits into
mainfrom
esa-permitted-work-limit-from-nlw
Oct 27, 2026
Merged

juaristi22 merged 5 commits into
mainfrom
esa-permitted-work-limit-from-nlw

Conversation

@anth-volk

@anth-volk anth-volk commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2686

What and why

ESA Regs 2008 reg. 45(4) sets the permitted work higher earnings limit at "16 x National Minimum Wage" from 11 April 2011 (SI 2011/674 reg. 16(5)), rounded up to the next 50p (reg. 45(9A)). Reg. 2(1) points to the rate in reg. 11 of the NMW Regulations 1999. DWP reads that as the adult rate, now the national living wage (Decision Makers' Guide ch. 41, para. 41190).

The model listed the limit year by year and projected it with average earnings. As a result, a minimum wage reform didn't move it, and from 2027 it no longer matched 16 × the model's own national living wage (£208.50 against £203.50).

  • esa_exempt_work_higher_earnings_limit calculates the limit:

    • until 10 April 2011, the fixed amount: £92, £93 from 1 October 2009, and £95 from 1 October 2010 (SI 2010/2126 reg. 5(2));
    • from 11 April 2011, 16 × the designated adult/NLW rate in the highest-age band of gov.hmrc.minimum_wage.non_apprentice, rounded up to 50p.

    esa_income_claimant_remunerative_work reads it.

  • gov.dwp.ESA.exempt_work.fixed_higher_earnings_limit and gov.dwp.ESA.exempt_work.higher_earnings_limit_minimum_wage_hours (16) replace gov.dwp.ESA.exempt_work.higher_earnings_limit. The old path is in REMOVED_PARAMETERS, so saved reforms that set it fail with directions to the new parameters.

  • The minimum wage rates now start at 1 October 2010 (SI 2010/1901 regs. 3 and 5, SI 2011/2345 regs. 3 and 5). Without these rates the limit had no minimum wage rate for April 2011 to September 2012. test_minimum_wage_rates.py has the two new rows.

Results change in two ways:

JSA is unchanged. The JSA Regs 1996 never use the minimum wage. The JSA Regs 2013 use it only in reg. 25(3), which decides when a sanction ends, and the model doesn't include sanctions. ESA Regs 2008 also use 16 × NMW in reg. 76 (councillor's allowance) and in the Sch. 7 permitted work disregards; the model includes neither.

Test plan

  • For policy changes: YAML tests whose expected values come from an external source. The existing esa_income_remunerative_work.yaml cases at DWP's published £195.50 (2025-26) and £203.50 (2026-27) limits still pass. The new Python tests check every year against the rates in DMG ch. 41 Appendix 5 and DWP's published limits for 2024 to 2026.
  • make format equivalent: ruff format --check . and ruff check . are clean.
  • Changelog fragment changelog.d/esa-permitted-work-limit-from-nlw.changed.md

Focused tests run locally, all passing:

  • 190 Python tests: test_legacy_benefit_parameters.py, test_removed_esa_higher_earnings_limit_parameter.py, test_minimum_wage_rates.py, test_parameter_descriptions.py, test_legacy_award_work_properties.py, test_legacy_award_readers_properties.py, test_income_support_eligibility_properties.py and the two existing removed-parameter test files.
  • 505 YAML policy tests: ESA, minimum wage, the UC minimum income floor, the benefit cap, Tax-Free Childcare and extended childcare.

The full YAML and Python suites weren't run locally; CI runs them.

Reproducer

Reproducer: policyengine_uk/tests/test_legacy_benefit_parameters.py::test_esa_exempt_work_higher_limit_follows_a_national_living_wage_reform; policyengine_uk/tests/test_legacy_benefit_parameters.py::test_esa_exempt_work_higher_limit_is_16_x_nmw_rounded_up

axiom: needed — rulespec-uk has no module for ESA Regs 2008 reg. 45 (it has reg. 118 and NMW Regulations 2015 regs. 4 and 4A). Encoding reg. 45 needs a billed run of the signed encoder, which hasn't been approved.

🤖 Generated with Claude Code

@anth-volk
anth-volk marked this pull request as ready for review October 26, 2026 18:17
@anth-volk
anth-volk requested a review from juaristi22 October 26, 2026 18:17
@juaristi22

Copy link
Copy Markdown
Collaborator

Review status: COMPLETE
Review disposition: APPROVE for standalone #2687
Reviewed head: dc54701aa4c047163c7177f12114c273972c8b55

No actionable defects found in this PR's changed behavior or affected dependencies. The wage-derived ESA permitted-work limit, adult-rate selection, rounding and downstream work screen agree with ESA Regulations 2008 reg. 45, the 2011 amendment, and DWP DMG chapter 41, paragraph 41190. The added 2010/2011 minimum-wage rates and the published 2024–2026 ESA limits were corroborated against official sources.

Validation:

  • 727 focused Python and YAML tests passed, covering the changed tests and relevant ESA, minimum-wage, UC income-floor, benefit-cap and childcare regressions.
  • Four final ESA award checks passed using a continuing recipient with established LCW and reported annual ESA of £5,000. With 15 weekly work hours and £10,700 annual pay in 2027, the baseline £203.50 permitted-work cap screens the award to £0; reforming the adult NLW to £13.18 raises the cap to £211 and retains £5,000. Earnings exactly at £211/week retain the award; £211.01/week removes it. These are checks of the model's continuing-award screen, not a fresh full-entitlement calculation.
  • Twelve official source originals were checked; relevant DMG tables/pages were visually inspected. Full local suites and population simulations were not run. Remote full-test and aggregate-impact CI jobs were still running at capture; this review does not certify their eventual outcome.

Relationship to other open PRs

#2684 — concrete historical wage integration issue. At its captured/current head c1e1a06ff1b58a621c07b339dd9716009a7eea35, the new apprentice_age_limit parameter begins on 1 October 2012, matching the former wage-history start. #2687 extends the wage rates to 1 October 2010. A focused in-memory composition using #2684's exact changed/new wage definitions and parameter reproduced this result for a 40-year-old in 2011:

Align #2684's eligibility-parameter history with the newly available October 2010 wage history and cover the intervening 2011/2012 calculations when combining these PRs. The shared test file merges without a textual conflict. This is a demonstrated composition issue, not a standalone #2687 defect; the diagnostic isolates the changed wage components rather than running a full merged-branch suite.

#2679 — complementary ESA/JSA claim screening. #2687 sets the person-level work earnings limit; #2679 determines which separate reported claims survive screening and how readers attribute their awards. Neither supersedes the other. Its work-screen call paths retain #2687's gate, with no shared changed files or stale consumer of the removed parameter found in its changed files. A combined regression should include a couple and an outside reporting adult whose earnings sit between the baseline and reformed work caps. That combined multi-claim behavior was traced, not executed.

#2219 — related Housing Benefit permitted-work disregard. This adds an externally pre-assessed annual HB input rather than an ESA eligibility calculation. #2687 does not automatically populate or reform that input. No direct dependency on #2687 or consumer of its removed parameter was found; #2219's declared dependency is #2225.

#1969 and #2131 — separate ESA capital work. These change the capital arm of screening, while #2687 changes its work arm. No direct changed-file overlap or required order involving #2687 was identified. #2131 is explicitly stacked on #1969. Other downstream receipt/passport readers remain relevant for combined regression coverage, but they do not duplicate this work-limit fix.

Keep #2687 separate, preserve its wage-derived work limit alongside #2679's per-claim screening, and reconcile the historical parameter dates with #2684 before both wage changes are combined.

@github-actions

github-actions Bot commented Oct 26, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 4d7456c7f1 against head e19f4bd399, 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

  • 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,889,156 in total; 2026-27: 76 units below zero, a weighted £-55,420,387 in total; 2027-28: 76 units below zero, a weighted £-56,618,038 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 4d7456c7f1 uk 2.162.7 (files 1e61d138c2b9), core 3.33.2, py 3.13.17 aarch64 82125cf576d0 4f86ac4248d9 1902.98s
head #2687 merged into main e19f4bd399 uk 2.162.7 (files b95759405276), core 3.33.2, py 3.13.17 aarch64 82125cf576d0 4f86ac4248d9 1909.85s

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 £298.70bn £318.31bn £335.60bn £350.52bn £365.79bn £383.53bn £401.03bn
National Insurance (employee and self-employed) £52.37bn £54.71bn £56.48bn £58.15bn £60.22bn £62.11bn £64.44bn
National Insurance (employer) £150.59bn £156.99bn £161.74bn £166.13bn £173.24bn £178.59bn £185.29bn
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.61bn £13.05bn £13.53bn £14.02bn £14.52bn £15.05bn £15.58bn
Student loan repayments £7.91bn £8.21bn £8.43bn £8.63bn £8.85bn £9.10bn £9.42bn
VAT excluding private school fees £249.37bn £255.28bn £261.81bn £267.87bn £274.12bn £280.56bn £286.81bn
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.00bn £2.05bn £2.10bn £2.21bn £2.21bn £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.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Betting and gaming duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.26bn £4.41bn £4.42bn £4.44bn £4.45bn £4.47bn £4.48bn
Council tax £49.21bn £51.88bn £54.97bn £58.29bn £61.55bn £64.92bn £68.49bn
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 £38.04bn £38.88bn £39.76bn £43.07bn £43.13bn £44.57bn
Stamp duty land tax on the household's own purchases £6.90bn £7.39bn £7.81bn £8.21bn £8.62bn £9.02bn £9.42bn
Stamp duty land tax paid by companies £4.81bn £5.98bn £6.73bn £7.46bn £8.21bn £8.87bn £9.16bn
Land transaction tax (Wales) £0.07bn £0.08bn £0.09bn £0.09bn £0.10bn £0.10bn £0.11bn
Land and buildings transaction tax (Scotland) £0.31bn £0.32bn £0.34bn £0.35bn £0.37bn £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.64bn £126.07bn £127.08bn £128.87bn £132.52bn £136.31bn £140.08bn
Pension Credit £6.66bn £7.04bn £7.32bn £7.46bn £7.60bn £7.77bn £7.94bn
Winter Fuel Payment £1.86bn £1.86bn £1.80bn £1.78bn £1.79bn £1.79bn £1.80bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £75.21bn £80.38bn £82.93bn £84.23bn £85.58bn £86.87bn £87.97bn
Housing Benefit £8.55bn £8.89bn £9.17bn £9.31bn £9.58bn £9.84bn £10.10bn
Council Tax Reduction £2.07bn £2.18bn £2.32bn £2.46bn £2.60bn £2.74bn £2.89bn
Employment and Support Allowance (income-related) £0.79bn £0.81bn £0.83bn £0.85bn £0.86bn £0.89bn £0.90bn
Employment and Support Allowance (contribution-based) £5.20bn £5.34bn £5.46bn £5.59bn £5.72bn £5.85bn £5.99bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.32bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £26.94bn £28.06bn £29.13bn £29.83bn £30.54bn £31.26bn £31.96bn
Disability Living Allowance £7.49bn £7.80bn £8.10bn £8.29bn £8.49bn £8.69bn £8.88bn
Attendance Allowance £8.68bn £9.04bn £9.38bn £9.61bn £9.83bn £10.07bn £10.29bn
Carer's Allowance £4.48bn £4.67bn £4.84bn £4.96bn £5.08bn £5.19bn £5.31bn
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.04bn £0.04bn £0.04bn £0.04bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.50bn £0.52bn £0.53bn £0.54bn £0.55bn £0.57bn £0.58bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.68bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.16bn £16.83bn £17.43bn £17.85bn £18.26bn £18.69bn £19.10bn
Scottish Child Payment £0.49bn £0.52bn £0.54bn £0.55bn £0.56bn £0.57bn £0.56bn
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.39bn £3.47bn £3.55bn £3.63bn £3.72bn £3.80bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.12bn £1.15bn £1.18bn £1.21bn £1.24bn £1.27bn £1.29bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.73bn £0.75bn £0.77bn
Widowed Parent's Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.59bn £0.61bn £0.59bn
Extended childcare entitlement £2.99bn £3.50bn £3.60bn £3.67bn £3.77bn £3.85bn £3.94bn
Universal childcare entitlement £2.05bn £2.23bn £2.28bn £2.34bn £2.40bn £2.47bn £2.52bn
Targeted childcare entitlement £0.50bn £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.52bn
Childcare Offer for Wales £0.26bn £0.28bn £0.28bn £0.29bn £0.30bn £0.30bn £0.31bn
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.83bn £204.54bn £205.13bn £205.79bn £206.49bn £207.23bn £207.73bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.05bn £25.13bn £25.21bn £25.29bn £25.37bn £25.46bn £25.53bn
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,261k 11,158k 10,849k 10,746k 10,783k 10,822k 10,848k
Pension Credit 1,485k 1,483k 1,480k 1,461k 1,462k 1,464k 1,460k
Winter Fuel Payment 7,842k 7,793k 7,494k 7,407k 7,432k 7,459k 7,477k
Pension Age Winter Heating Payment (Scotland) 803k 803k 803k 800k 803k 806k 808k
Universal Credit 6,334k 6,341k 6,366k 6,347k 6,345k 6,333k 6,298k
Housing Benefit 1,249k 1,247k 1,250k 1,234k 1,238k 1,240k 1,239k
Council Tax Reduction 3,175k 3,198k 3,209k 3,229k 3,244k 3,257k 3,264k
Employment and Support Allowance (income-related) 71k 71k 71k 71k 71k 72k 72k
Employment and Support Allowance (contribution-based) 719k 721k 723k 726k 728k 731k 732k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 67k 68k 68k 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,566k 3,579k 3,589k 3,601k 3,613k 3,626k 3,635k
Disability Living Allowance 1,291k 1,295k 1,299k 1,303k 1,308k 1,312k 1,316k
Attendance Allowance 1,694k 1,700k 1,705k 1,711k 1,716k 1,723k 1,727k
Carer's Allowance 1,034k 1,038k 1,041k 1,044k 1,048k 1,051k 1,053k
Carer Support Payment (Scotland) 71k 71k 72k 72k 72k 72k 73k
Carer's Allowance Supplement (Scotland) 0k 71k 72k 72k 72k 72k 73k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 137k 138k 138k 139k 139k 140k
Armed Forces Compensation Scheme 93k 93k 94k 94k 94k 95k 95k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,102k 8,128k 8,142k 8,165k 8,191k 8,216k 8,232k
Scottish Child Payment 350k 352k 353k 357k 354k 355k 342k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 199k 200k 201k 201k 202k 203k 203k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 332k 334k 335k 336k 337k 338k 339k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 181k 182k 182k 183k 183k 184k 185k
Sure Start Maternity Grant 26k 26k 26k 26k 26k 27k 27k
Bereavement Support Payment 98k 98k 98k 99k 99k 99k 100k
Widowed Parent's Allowance 0k 0k 0k 0k 0k 0k 0k
Tax-Free Childcare 1,014k 1,024k 1,024k 1,027k 1,027k 1,031k 1,013k
Extended childcare entitlement 796k 801k 806k 809k 815k 819k 820k
Universal childcare entitlement 1,071k 1,074k 1,077k 1,080k 1,086k 1,096k 1,097k
Targeted childcare entitlement 165k 156k 154k 155k 155k 156k 144k
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 99k 99k 99k 100k 100k
Adult Dependants' Grant 18k 18k 12k 12k 12k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £898.82bn £941.86bn £980.11bn £1,013.84bn £1,052.89bn £1,089.01bn £1,129.10bn
Government spending £528.96bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.37bn †
Government balance, each receipt once £369.86bn † £398.03bn † £428.43bn † £455.78bn † £486.32bn † £513.70bn † £545.72bn †
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 £898.82bn £941.86bn £980.11bn £1,013.84bn £1,052.89bn £1,089.01bn £1,129.10bn
household_tax £496.91bn £527.60bn £554.51bn £577.74bn £603.32bn £627.65bn £654.69bn
pre_budget_change_household_tax £489.00bn £519.39bn £546.08bn £568.63bn £593.98bn £618.05bn £644.75bn
gov_spending £528.96bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.37bn †
household_benefits £528.96bn † £543.83bn † £551.68bn † £558.06bn † £566.57bn † £575.31bn † £583.37bn †
gov_balance £369.86bn † £398.03bn † £428.43bn † £455.78bn † £486.32bn † £513.70bn † £545.72bn †
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,651.49bn £1,713.03bn £1,764.05bn £1,812.97bn £1,862.19bn £1,918.39bn £1,985.28bn
Household net income £1,644.43bn † £1,688.69bn † £1,719.55bn † £1,750.61bn † £1,781.67bn † £1,821.07bn † £1,867.39bn †
Household net income (HBAI definition) £1,457.30bn £1,504.48bn £1,537.58bn £1,569.36bn £1,602.66bn £1,640.48bn £1,687.04bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,224k 69,466k 69,668k 69,891k 70,128k 70,381k 70,550k
Benefit units 35,100k 35,223k 35,325k 35,438k 35,558k 35,686k 35,772k
Households 31,037k 31,145k 31,236k 31,336k 31,442k 31,555k 31,631k
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.0% 15.1% 15.4% 15.5% 15.6% 15.7% 15.7%
Absolute poverty, before housing costs: children 24.0% 21.1% 21.4% 21.3% 21.5% 21.8% 21.8%
Absolute poverty, before housing costs: working-age adults 13.8% 13.5% 13.9% 14.1% 14.1% 14.2% 14.2%
Absolute poverty, before housing costs: pensioners 13.7% 13.2% 13.1% 13.4% 13.5% 13.5% 13.5%
Absolute poverty, after housing costs: everyone 21.4% 20.8% 21.3% 21.5% 21.7% 21.9% 22.2%
Absolute poverty, after housing costs: children 33.0% 30.7% 31.1% 31.1% 31.4% 31.7% 32.3%
Absolute poverty, after housing costs: working-age adults 19.8% 19.6% 20.2% 20.5% 20.7% 20.8% 21.1%
Absolute poverty, after housing costs: pensioners 12.7% 12.4% 12.3% 12.5% 12.8% 12.9% 13.0%
Relative poverty, before housing costs: everyone 17.2% 16.4% 16.5% 16.4% 16.2% 16.3% 16.5%
Relative poverty, before housing costs: children 26.2% 23.5% 23.4% 23.1% 22.7% 22.8% 23.1%
Relative poverty, before housing costs: working-age adults 14.6% 14.4% 14.7% 14.7% 14.6% 14.7% 14.8%
Relative poverty, before housing costs: pensioners 15.0% 14.8% 14.1% 14.1% 14.0% 14.0% 14.2%
Relative poverty, after housing costs: everyone 21.6% 21.0% 21.1% 21.2% 21.3% 21.4% 21.8%
Relative poverty, after housing costs: children 33.3% 31.2% 30.8% 30.7% 31.0% 31.0% 31.5%
Relative poverty, after housing costs: working-age adults 19.9% 19.8% 20.1% 20.3% 20.4% 20.5% 20.7%
Relative poverty, after housing costs: pensioners 12.9% 12.5% 12.1% 11.9% 11.8% 11.9% 12.8%
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,049k 10,466k 10,736k 10,860k 10,960k 11,054k 11,081k
Absolute poverty, before housing costs: children 3,580k 3,171k 3,211k 3,220k 3,261k 3,305k 3,317k
Absolute poverty, before housing costs: working-age adults 5,845k 5,746k 6,022k 6,123k 6,169k 6,209k 6,219k
Absolute poverty, before housing costs: pensioners 1,625k 1,550k 1,504k 1,517k 1,530k 1,539k 1,545k
Absolute poverty, after housing costs: everyone 14,847k 14,422k 14,808k 14,994k 15,242k 15,402k 15,638k
Absolute poverty, after housing costs: children 4,937k 4,609k 4,671k 4,685k 4,757k 4,814k 4,912k
Absolute poverty, after housing costs: working-age adults 8,406k 8,359k 8,732k 8,898k 9,024k 9,114k 9,240k
Absolute poverty, after housing costs: pensioners 1,504k 1,454k 1,404k 1,411k 1,460k 1,475k 1,486k
Relative poverty, before housing costs: everyone 11,896k 11,403k 11,468k 11,487k 11,391k 11,468k 11,652k
Relative poverty, before housing costs: children 3,918k 3,523k 3,519k 3,491k 3,435k 3,458k 3,516k
Relative poverty, before housing costs: working-age adults 6,202k 6,136k 6,338k 6,400k 6,368k 6,415k 6,515k
Relative poverty, before housing costs: pensioners 1,776k 1,744k 1,611k 1,597k 1,588k 1,595k 1,621k
Relative poverty, after housing costs: everyone 14,957k 14,597k 14,698k 14,825k 14,951k 15,042k 15,351k
Relative poverty, after housing costs: children 4,976k 4,677k 4,630k 4,634k 4,690k 4,712k 4,794k
Relative poverty, after housing costs: working-age adults 8,443k 8,455k 8,680k 8,847k 8,916k 8,977k 9,092k
Relative poverty, after housing costs: pensioners 1,537k 1,465k 1,388k 1,344k 1,346k 1,354k 1,464k
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.3085 0.3059 0.3065 0.3071 0.3075 0.3081 0.3094
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,781 † £17,906 † £17,832 † £17,905 † £18,142 † £18,339 † £18,482 †
Decile 2: mean household_net_income per household £27,963 † £28,917 † £28,654 † £28,906 † £29,096 † £29,646 † £30,235 †
Decile 3: mean household_net_income per household £34,381 † £35,463 † £36,065 † £36,509 † £36,851 † £37,338 † £38,043 †
Decile 4: mean household_net_income per household £38,785 † £40,713 † £41,873 † £42,413 † £43,144 † £43,906 † £44,167 †
Decile 5: mean household_net_income per household £43,788 † £44,626 † £45,606 † £46,288 † £47,327 † £48,285 † £49,710 †
Decile 6: mean household_net_income per household £48,210 † £49,525 † £50,736 † £51,914 † £52,203 † £53,174 † £54,203 †
Decile 7: mean household_net_income per household £56,219 † £57,224 † £57,764 † £58,010 † £59,040 † £60,061 † £61,765 †
Decile 8: mean household_net_income per household £69,150 † £70,533 † £71,800 † £73,075 † £74,092 † £75,540 † £77,427 †
Decile 9: mean household_net_income per household £79,490 † £81,421 † £82,828 † £84,135 † £85,539 † £87,053 † £89,944 †
Decile 10: mean household_net_income per household £117,581 † £120,296 † £121,933 † £124,163 † £126,045 † £128,342 † £131,110 †
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.47bn £6.76bn £6.67bn £6.86bn £7.06bn £7.35bn £7.55bn
Raise higher rate by 1pp £3.69bn £3.98bn £4.03bn £4.29bn £4.46bn £4.78bn £4.91bn
Raise personal allowance by ~800GBP/year £-3.82bn £-3.94bn £-4.01bn £-4.09bn £-4.18bn £-4.18bn £-2.00bn
Raise child benefit by 25GBP/week per additional child £-1.99bn £-1.75bn £-1.56bn £-1.46bn £-1.35bn £-1.23bn £-1.12bn
Reduce Universal Credit taper rate to 20% £-20.39bn £-20.96bn £-21.38bn £-21.61bn £-21.87bn £-22.17bn £-22.60bn
Raise Class 1 main employee NICs rate to 10% £11.02bn £11.42bn £11.77bn £12.07bn £12.37bn £12.75bn £13.07bn
Raise VAT standard rate by 2pp £24.89bn £25.55bn £26.14bn £26.75bn £27.39bn £28.03bn £28.66bn
Raise additional rate by 3pp £2.96bn £3.21bn £3.26bn £3.46bn £3.65bn suppressed suppressed
Raise the Universal Credit standard allowance by 10% £-3.05bn £-3.18bn £-3.30bn £-3.34bn £-3.38bn £-3.42bn £-3.48bn
Raise the State Pension by 10% £-7.79bn £-8.02bn £-8.01bn £-8.12bn £-8.43bn £-8.54bn £-8.87bn
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.61bn £6.91bn £6.83bn £7.03bn £7.24bn £7.47bn £7.73bn
Raise higher rate by 1pp: change in income_tax £3.69bn £3.99bn £4.04bn £4.25bn £4.47bn £4.74bn £4.93bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.95bn £-4.08bn £-4.17bn £-4.24bn £-4.34bn £-4.41bn £-1.76bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.33bn £2.14bn £1.95bn £1.84bn £1.73bn £1.62bn £1.50bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.39bn £20.95bn £21.37bn £21.62bn £21.87bn £22.22bn £22.61bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.28bn £11.74bn £12.06bn £12.37bn £12.69bn £13.03bn £13.49bn
Raise VAT standard rate by 2pp: change in vat £24.69bn £25.35bn £25.94bn £26.54bn £27.17bn £27.81bn £28.43bn
Raise additional rate by 3pp: change in income_tax £2.96bn £3.21bn £3.26bn £3.46bn £3.66bn suppressed suppressed
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.05bn £3.18bn £3.29bn £3.36bn £3.43bn £3.48bn £3.52bn
Raise the State Pension by 10%: change in state_pension £10.68bn £11.18bn £11.31bn £11.55bn £12.00bn £12.44bn £12.94bn

anth-volk and others added 2 commits October 26, 2026 19:29
ESA Regs 2008 reg 45(4) sets the permitted work higher earnings limit at
16 x National Minimum Wage from 11 April 2011 (SI 2011/674 reg 16(5)),
rounded up to the next 50p (reg 45(9A)). Reg 2(1) points to the rate in
reg 11 of the NMW Regulations 1999, which DWP reads as the highest rate,
now the national living wage (DMG 41190). The model listed the limit year
by year and projected it with average earnings, so it ignored changes to
gov.hmrc.minimum_wage and disagreed with the model's own projection of the
national living wage from 2027.

- esa_exempt_work_higher_earnings_limit calculates the limit: the fixed
  amount (£92, £93 from 1 October 2009) until 10 April 2011, then 16 x the
  top rate of gov.hmrc.minimum_wage.non_apprentice, rounded up to 50p.
  esa_income_claimant_remunerative_work reads it.
- gov.dwp.ESA.exempt_work.fixed_higher_earnings_limit and
  higher_earnings_limit_minimum_wage_hours replace higher_earnings_limit,
  which is registered as removed so saved reforms fail with directions.
- The minimum wage rates now start at 1 October 2010 (SI 2010/1901 and
  SI 2011/2345), so the limit has a rate from April 2011.

JSA is unchanged: the JSA Regs 1996 never use the minimum wage, and the
JSA Regs 2013 use it only to end sanctions (reg 25(3)), which the model
does not include.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@juaristi22
juaristi22 force-pushed the esa-permitted-work-limit-from-nlw branch from dc54701 to 283ea2b Compare October 26, 2026 19:31
@juaristi22

Copy link
Copy Markdown
Collaborator

Should-address fixed

The review follow-ups are addressed in commit 283ea2b:

  • Added gov.hmrc.minimum_wage.apprentice_age_limit, with age 19 effective from 1 October 2010. This supplies the historical prerequisite for Separate apprentice minimum wage eligibility from NI relief #2684 alongside the wage history extended by Calculate the ESA permitted work limit from the national living wage #2687. S.I. 2010/1901, regulations 1 and 5 introduced the under-19 or first-12-month rule from that date.
  • Added 10 regression cases covering the parameter history, public minimum-wage rates and categories in 2011/2012, person ordering, and final Employment and Support Allowance (ESA) awards for separate benefit units. In the 2027 example, an idle couple retains its reported £3,000 award. A separate adult earning £10,700 annually over 15 weekly hours receives £0 under the £203.50 cap and £5,000 when a £13.18 National Living Wage produces a £211 cap. The tests use raw annual inputs and continuing award reports, with established limited capability for work as their premise.

Verification

All 180 targeted tests passed, including the complete ESA YAML directory and affected wage, parameter and migration regressions. The same 180 tests passed again after formatting and rebasing onto main at cc31bd3; Ruff checks also passed. Independent verification found both planned items addressed and no new issues.

Ten additional isolated composition cases passed using exact captured definitions from #2684 and #2679: two historical wage/category cases and eight simultaneous couple/outside-adult claim cases covering work status, member order and the wage reform. These checks cover the focused interactions; the full local suite and full merged sibling suites were not run.

Merge coordination

#2684 adds the same parameter file. The second merge or rebase must resolve any add/add overlap while preserving the 1 October 2010 start date. This work does not modify either sibling PR's remote branch.

@juaristi22

Copy link
Copy Markdown
Collaborator

#2687 now includes the actual commits from #2684 at c1e1a06f through merge commit 8f30410. The branch retains the earlier ESA fixes and main at cc31bd3, along with #2684's apprentice eligibility implementation, tests and documentation.

The shared apprentice_age_limit.yaml was the only merge conflict. Its resolution preserves age 19 from 1 October 2010, so the apprentice helper covers the wage history that #2687 extends. Both sets of historical wage tests and the ESA reform regressions remain present. This completes the overlap resolution on #2687 and supersedes the earlier comment's future-merge caveat for this branch.

281 targeted tests passed against the actual combined worktree, including ESA, historical wages/categories, apprentice eligibility, the Universal Credit income floor and employer National Insurance coverage. Independent verification found the combined tree clean. These results cover the targeted manifest, not the full suite or GitHub CI.

This updates #2687's branch; it does not merge #2684 on GitHub or modify #2684's remote branch.

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Round 1 at 8f3041014.

Verdict: the 16 x NLW calculation is right in law and is independent of #2684's apprentice rules; one should (a missing £95 step in 2010-11), no musts. CI was still pending at this head when I posted.

Scope: this round covers c9f386879, 283ea2b57, 8f3041014 and the apprentice_age_limit.yaml merge resolution. Commits 3688dff60 and c1e1a06ff are #2684's (including the two docs files and changelog.d/2683.fixed.md); I did not re-review them here.

Findings

  1. should: the fixed limit was £95 from 1 October 2010, not £93. policyengine_uk/parameters/gov/dwp/ESA/exempt_work/fixed_higher_earnings_limit.yaml:3-12 stops at £93 from 2009-10-01. SI 2010/2126 reg 5(2) substituted "£95.00" for "£93.00" in reg 45(3) and (4) from 1 October 2010, and SI 2011/674 reg 16(5)(a) then replaces "£95.00" with 16 x NMW. The point-in-time text of reg 45 at 2011-04-10 reads £95.00. The model returns £93 for 2011 (I checked: 2010 £93, 2011 £93, 2012 £97.50), and policyengine_uk/tests/test_legacy_benefit_parameters.py:100 pins limits[2011] == 93. Fix: add 2010-10-01: 95 with the SI 2010/2126 reference, change line 100 to 95, and correct "£92, or £93 from 1 October 2009" in the body and the variable docstring if you mention it. The gap is inherited (main's higher_earnings_limit.yaml went £93 straight to £95 at 2011-04-11), but this PR rewrites that history and adds a test that fixes the wrong value. 2011 is the only affected year, which is why this is a should.

  2. nit: top rate read two ways. esa_exempt_work_higher_earnings_limit.py:42-44 reads the 25+ bracket via calc(200), while legacy_award_work_reference.py:139 takes max(amounts). They agree under current law and any reform that moves all three adult bands together, as yours does. They would differ only for a reform that sets a younger band above the 25+ band. Either is fine; using the same reading in both would make the reference check independent of bracket order.

Checked and fine

  • Law. ESA Regs 2008 reg 45(4): less than 16 hours and earnings not above 16 x National Minimum Wage. Reg 45(9A): under 50p rounds up to 50p, over 50p up to £1. esa_exempt_work_higher_earnings_limit.py:45-51 matches, including an exact multiple of 50p staying put. Reg 2(1) defines NMW as the reg 11 rate of the 1999 Regs, read by DWP as the top rate, now the NLW (DMG 41190). That is the 21+ rate since April 2024 (23+ from 2021, 25+ from 2016), and all are the top bracket of non_apprentice. ESA Regs 2013 reg 39(1)(c) and (4) say the same for new style ESA. The model has no new style ESA work test, so nothing else needs to read it.
  • Published values. 16 x £12.21 = £195.36, rounded to £195.50 (2025-26). 16 x £12.71 = £203.36, rounded to £203.50 (2026-27). Both match DWP's 2025-26 and 2026-27 rate tables. The lower limit is still £20 (reg 45(2)). Supervised work (reg 45(3)) uses the same limit and is still not modelled, as the esa_income_claimant_remunerative_work docstring says.
  • Timing. The limit moves when the NLW moves, so no separate uprating date is needed. As a YEAR variable it reads the rate in force at the year's parameter instant, the same as the old parameter.
  • Separate apprentice minimum wage eligibility from NI relief #2684. The formula reads only gov.hmrc.minimum_wage.non_apprentice (lines 42-44), never minimum_wage, is_apprentice or is_in_first_year_of_apprenticeship. A probe with a 40-year-old and a 19-year-old apprentice in 2026 gave both £203.50, while their minimum_wage was £12.71 and £10.85. apprentice_age_limit.yaml keeps 19 from 2010-10-01, which matches SI 2010/1901 reg 5. The October 2010 and 2011 wage rates (£5.93/£4.92/£3.64/£2.50, then £6.08/£4.98/£3.68/£2.60) are right. This branch carries Separate apprentice minimum wage eligibility from NI relief #2684's commits, so Separate apprentice minimum wage eligibility from NI relief #2684 should land first and this one be rebased.
  • Old parameter. higher_earnings_limit.yaml is deleted and listed in REMOVED_PARAMETERS (utils/parameters.py:246), with nothing else reading it.
  • Projections and the aggregate report. From 2027 the limit holds at £203.50, where main grew it to £208.50 and up, because non_apprentice ends at April 2026 (The national living wage parameter ends at April 2026, so every rule that reads it freezes #2537). The body says so. Expect the aggregate report to show a small fall in ESA from 2027 for that reason alone. Whether a frozen limit is better than an earnings-grown one until The national living wage parameter ends at April 2026, so every rule that reads it freezes #2537 lands is a modelling call for you and Max; I am not ruling on it. The "Aggregate impact: FAIL" comment above is from run 40387451647 at 283ea2b, which was cancelled by the later push, not a real failure.

What I ran

In a fresh clone at 8f3041014 with a fresh uv venv:

  • pytest on test_legacy_benefit_parameters.py, test_removed_esa_higher_earnings_limit_parameter.py, test_minimum_wage_rates.py, test_esa_permitted_work_nlw_reforms.py, test_parameter_descriptions.py and the test_legacy_award_*.py files: 117 passed.
  • policyengine-core test on the esa_income YAML directory, in_receipt_of_income_support_jsa_ib_or_esa_ir.yaml, minimum_wage.yaml, minimum_wage_category.yaml, apprentice_minimum_wage.yaml and uc_minimum_income_floor.yaml: 135 passed.
  • The household probe above for 2010-2012 and 2026-2027.
  • Point-in-time text of reg 45 on legislation.gov.uk at six dates from 2009-10-01 to 2011-04-11.

Not run: the full suites or any microsimulation. CI at 8f3041014: lint, changelog, docs and smoke imports pass; Python, YAML and aggregate impact were pending when I posted.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator

Addressed both points from your review in commit bb685f9.

The fixed permitted-work limit now rises from £93 to £95 on 1 October 2010, following S.I. 2010/2126, regulation 5(2). The annual 2011 result now reads £95. Annual 2010 remains £93 because the model reads these pre-2015 annual rules on 1 January. New regressions check the dated boundaries and the subsequent minimum-wage transition.

Production and the independent reference now select the designated adult/National Living Wage band with amounts[-1]. The reference retains its own rounding arithmetic. A youth-only £20 rate reform confirms that both still return the adult-linked £203.50 cap.

209 targeted tests passed, including the reference consumers, final ESA award regressions and complete ESA YAML directory. All 10 tests in the formatted Python file passed again after formatting. The branch retains the actual #2684 commits and the previous ESA fixes. The PR description also includes the corrected £92/£93/£95 history and adult-band wording. These results cover local targeted validation; the full local suite was not run for this follow-up.

@vahid-ahmadi

Copy link
Copy Markdown
Collaborator

Round 2 at d9942976e.

Verdict: both round 1 points are fixed in bb685f955, and nothing new came up. Good to go once CI is green.

  1. £95 from 1 October 2010 (should): fixed. fixed_higher_earnings_limit.yaml adds 2010-10-01: 95, citing SI 2010/2126 reg 5(2). Two new tests pin it:

    • test_esa_fixed_higher_earnings_limit_2010_amendment_boundaries: £93 on 30 Sep 2010, £95 from 1 Oct 2010 to 10 Apr 2011.
    • test_esa_fixed_higher_earnings_limit_annual_transition: 2010 £93, 2011 £95, 2012 £97.50. The 2012 figure checks out: 16 x £6.08 (the adult rate on 1 January 2012) = £97.28, rounded up to £97.50.

    The old assertion that locked in £93 for 2011 is now £95.

  2. Two readings of the top rate (nit): fixed. The formula (esa_exempt_work_higher_earnings_limit.py) and the test reference (legacy_award_work_reference.py) both read non_apprentice.amounts[-1], the adult band, instead of max(...) and calc(200). The new reform test covers the case where these differed: an under-18 band raised to £20 still gives £203.50.

One note, not a finding: amounts[-1] relies on the adult band staying the last band in the age scale. The code comment says so, which is enough for now.

What I did: read the diff of bb685f955 (5 files) and checked the merge of main in d9942976e touches no ESA files. I did not rerun the tests locally this round. CI was still running at this head (11 pass, 6 pending).

🤖 Generated with Claude Code

@juaristi22
juaristi22 enabled auto-merge October 26, 2026 21:22
@juaristi22
juaristi22 disabled auto-merge October 26, 2026 21:36
@juaristi22
juaristi22 added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit c611425 Oct 27, 2026
30 of 34 checks passed
@juaristi22
juaristi22 deleted the esa-permitted-work-limit-from-nlw branch October 27, 2026 01:04
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.

ESA permitted work earnings limit doesn't follow the national living wage parameter

3 participants