Skip to content

Apply the income-related ESA and income-based JSA remunerative work conditions - #2031

Open
MaxGhenis wants to merge 20 commits into
mainfrom
esa-jsa-remunerative-work
Open

MaxGhenis wants to merge 20 commits into
mainfrom
esa-jsa-remunerative-work

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2043

Based on main, last merged at e89b8ab. The PRs this one built on have all merged:

This PR now changes no National Insurance parameter or test.

What the law says

Income-related ESA. Welfare Reform Act 2007 Sch 1 para 6(1): the claimant "(e) is not engaged in remunerative work; (f) is not a member of a couple the other member of which is engaged in remunerative work".

  • The claimant (reg 41(1)). ESA Regs 2008 reg 41(1) defines the claimant's remunerative work as "any work which a claimant does for which payment is made or which is done in expectation of payment, other than work listed in paragraph (2) of regulation 40". Reg 40(2)(f) includes the exempt work in reg 45:

    • "(2) Work for which the earnings in any week do not exceed £20.00";
    • "(4) Work which is done for less than 16 hours a week, for which earnings in any week do not exceed 16 x National Minimum Wage", rounded up to the next 50p (reg 45(9A)).

    So the claimant's test is not an hours threshold. Earnings of £20 a week or less never bar the award. Above £20, work of 16 hours or more bars it, and work under 16 hours bars it only above the higher limit.

  • The partner (reg 42(1)). Paid work "for not less than 24 hours a week". Under reg 43(2)(c), a partner who would satisfy IS Regs Sch 1B para 4 (a carer) "is not to be treated as engaged in remunerative work".

Income-based JSA. Jobseekers Act 1995 s.1(2)(e): the claimant "is not engaged in remunerative work". S.3(1)(e): the claimant "is not a member of a couple the other member of which is engaged in remunerative work". JSA Regs 1996 reg 51(1) sets 16 hours "in the case of a claimant" and 24 "in the case of any partner of the claimant".

  • Joint claims. A couple without children claim jointly, and each member is then a claimant held to 16 hours (s.1(2B)(b), s.35(1)). But reg 3E(1) lets a member claim alone, under s.3, where the other "is engaged … in remunerative work for 16 hours or more per week but less than 24 hours per week" (reg 3E(2)(g), in force since joint claims began on 19 March 2001). So for every couple, an award ends only when the other member works 24 hours or more.
  • Carers. Reg 53 has no exception for a carer doing unrelated paid work. Its work-specific exceptions (placement care and the others it lists) are not modelled.

Someone outside the couple (a non-dependent adult in the same benefit unit) who has an award of their own claims it in their own right. They are its claimant, so the same claimant conditions apply to them: para 6(1)(e) for ESA, s.1(2)(e) for JSA.

What changes

esa_income_eligible and jsa_income_eligible, the screens applied to reported awards, tested only capital. They now also apply the work conditions:

  • ESA claimant. esa_income_claimant_remunerative_work: earnings over the lower limit, unless the work is under 16 hours and within the higher limit. Being a carer does not take a claimant out of remunerative work.

  • ESA earnings (new esa_exempt_work_earnings, worked out under the ESA(IR) earnings rules per DMG 41189):

    • Pay (reg 96(3)): less the income tax and primary Class 1 deducted from it, and half the occupational or personal pension contributions. The regulation takes the amounts actually deducted, which the inputs don't record. The model approximates them on the pay alone:

      • Income tax: the rates on the pay less employment expenses and employee pension contributions (net pay arrangements), above the personal and blind person's allowances, less the married couple's allowance reduction up to that tax. The allowances are the person's own, assessed on whole income, so other income can still change them through the personal allowance taper, as can anything else that moves adjusted net income (such as a loss from another trade). But the tax on other income never comes off the pay, a self-employment loss is never deducted from the pay itself, and a credit settled through a tax return (such as foreign tax credit relief) is not taken off it.
      • Class 1: the main and additional primary rates on the pay.
      • Statutory sick, maternity and paternity pay are not earnings (reg 95(2)(b)). They add nothing to the pay, nor to the tax and Class 1 taken off it. The shared bases include them, so neither is read: the shared taxable employment income includes statutory sick and maternity pay, and the shared Class 1 base (ni_class_1_income) includes all three.

      A second job taxed at the basic rate through PAYE would leave lower net earnings than this, and the variable can be entered directly.

    • Self-employment (reg 98(3), reg 99): the profit less several notional deductions, and half the personal pension contributions. Personal pension contributions go to self-employment when there is a profit and to pay otherwise. The notional deductions are:

      • basic-rate tax on the profit above the personal and blind person's allowances. A Scottish taxpayer pays the Scottish basic rate: the first band before 2018-19, the second once the starter rate came in;
      • Class 4 at the main rate between the profits limits, on reg 99(4)'s chargeable income: the reg 98 profit itself, under the model's Class 4 age rule (ni_class_4_liable). Since Charge Class 4 NICs on Chapter 2 profits, after capital allowances, the trading allowance and Schedule 2 losses #1919 the shared ni_class_4_profits is after capital allowances, the trading allowance and loss relief, which reg 98(5) and (11) keep out of the ESA profit, so the rule does not read it;
      • Class 2 until 5 April 2024 (reg 99(3)(a)), with its own rule (gov.dwp.ESA.income.self_employment_class_2) rather than ni_class_2. It is due from the small profits threshold. From 6 April 2022 it is due only above the lower profits threshold (gov.hmrc.national_insurance.class_2.lower_profits_threshold, from Fix Class 2 and Class 4 NICs against SSCBA 1992 for 2015-16 to 2026-27 #2058). SI 2022/1329 wrote that threshold into reg 99(3)(a) with effect from 6 April 2022 (reg 1).

      The notional amounts read the Class 2 and Class 4 rates and limits that Fix Class 2 and Class 4 NICs against SSCBA 1992 for 2015-16 to 2026-27 #2058 corrected to the statute.

    • Losses: a self-employment loss is not set against pay (reg 98(11)).

  • ESA partner. 24 hours or more of paid work, from the new esa_income_remunerative_work_hours, unless is_carer_for_benefits (the IS gate's proxy for Sch 1B para 4).

  • JSA. The claimant at 16 hours or more, and the other member of the couple at 24 or more, from the new jsa_remunerative_work_hours. There is no exception for carers doing unrelated paid work.

  • Who is tested. The claimant is a member who reports the award, tested against the other member of the couple. When the claimant or partner reports one, only they are candidates. A member outside the couple who reports an award is tested in the benefit unit's screen only when neither does, so their award can never change the couple's. Without this rule a non-dependant's award could flip the benefit-unit screen, and with it the Income Support gate.

  • Members outside the couple on an award (is_on_income_related_esa, is_on_income_based_jsa, from Count only the claimant's and partner's legacy awards in means tests and passports #2027; helper own_report_is_paid). These statuses feed the council tax reduction non-dependant exemptions and the maintenance-loan benefits signal. Such a member is on the award only when their own claim passes:

    • they are not in remunerative work as its claimant (esa_income_claimant_remunerative_work, or 16 hours for JSA);
    • their report exceeds the tariff income from the benefit unit's capital, within the capital limit.

    The benefit unit's award must also be in payment: positive, or nil while the benefit unit's screen fails and the award is not neutralised. On the formula path, a nil award alongside a passing own claim can only mean the claimant's or partner's own claim failed the screen. A zero cannot say why it is zero, so:

    • neutralising the award always removes the status, and so does JSA closing (gov.dwp.JSA.income.active);
    • a nil award entered directly, or a reform that replaces the award with nil, removes it only while the screen passes. While the claimant's claim fails, the status follows the member's own claim.

    Before this, the status read the benefit unit's screen, which tests only the claimant and partner when either reports. A working outside member was then on the award whenever the claimant's claim passed, and a non-working one lost it whenever the claimant's failed. In a synthetic Merton 2027 household, that took a working non-dependant out of a £551.20-a-year deduction.

New parameters, each dated from the point-in-time legislation:

Parameter Values
gov.dwp.ESA.exempt_work.lower_earnings_limit £20
gov.dwp.ESA.exempt_work.hours_limit 16
gov.dwp.ESA.exempt_work.higher_earnings_limit £92 from 27 Oct 2008; £93 from 1 Oct 2009; 16 x NMW rounded up to 50p from 11 Apr 2011, at each NMW change. That gives £183.50, £195.50 and £203.50 for 2024/25-2026/27, matching DWP's published limits. Later years follow average earnings, rounded up to 50p
gov.dwp.ESA.income.remunerative_work.partner_hours 24 from 27 Oct 2008
gov.dwp.ESA.income.self_employment_class_2.deducted true from 27 Oct 2008; false from 6 Apr 2024 (SI 2024/377)
gov.dwp.ESA.income.self_employment_class_2.above_lower_profits_threshold false from 27 Oct 2008; true from 6 Apr 2022 (SI 2022/1329)
gov.dwp.JSA.remunerative_work.claimant_hours 16 from 7 Oct 1996
gov.dwp.JSA.remunerative_work.partner_hours 24 from 7 Oct 1996

The existing gov.dwp.JSA.hours.single and couple are kept, and a test pins them to the new ones. Their descriptions called 24 hours the "joint claimants'" requirement; it is the partner's.

National Insurance. Earlier heads of this PR corrected the 2015-16, 2022-23 and 2023-24 Class 2 and Class 4 amounts, because reg 99(3) deducts notional Class 2 and Class 4. #2058 landed the same values with references, and the four 2023 NI tests at the same hand-derived results (£179.40, £1,568.70, £3,393 and £1,748.60). The merge of main took main's version of all nine files.

Not modelled (each documented on the variable; enter the variable directly to apply it):

  • ESA: supervised work, test trading, voluntary work, work placements and the other reg 40(2) work.
  • The pre-April 2017 52-week limit on ESA permitted work.
  • The transferable (marriage) allowance and other reliefs in reg 99(1) beyond the personal and blind person's allowances.
  • The reg 43(1) and JSA reg 53 employments, leave, illness and trade disputes.
  • The other reg 3E(2) grounds, which matter for the joint-claim route but not for remunerative work.

Design points

In the screen, beside the capital test. The work conditions are further conditions of entitlement alongside the capital test the screens already apply. For ESA they are para 6(1)(e)-(f) beside (b); for JSA they are ss.1(2)(e) and 3(1)(e) beside s.13. Work ends an award. Within the model's bounded reported-award approach (no new claims can be made, so a reported award is screened rather than computed), applying them in the screen keeps every reader consistent:

The alternative would be household income keeping the reported award while the gate and passports see no entitlement. The household would then both have and not have the benefit. The cost is that household income falls where a survey report conflicts with the rules. The impact section sizes that.

Helpers and award formulas unchanged. income_related_esa_award, income_related_jsa_award and the esa_income/jsa_income formulas are untouched; only the variables' documentation changed. They read the screens. So #2025's and #2027's value rule for direct entries is unaffected: a calculated esa_income is still exactly the award on everyone's reports. #2027's family readers call the same helpers, so they inherit the screens.

One screen for the benefit unit's award. Because esa_income and jsa_income stay that award, the benefit unit's award applies one screen to every report in it. When the claimant or partner reports, a report by someone outside the couple is paid or not with the claimant's claim. That member's own status is tested on their own claim (above), so passports follow the law, but the benefit unit's total can include or omit their award. No Enhanced FRS record has anyone outside the couple reporting either award in 2025-2030 (0 records), so this does not reach the impact below.

Income Support property tests (test_income_support_eligibility_properties.py). The reference's award on the claimant's and partner's reports, and explained_by_reports' award on everyone's reports, now pass the same work screens (new shared tests/legacy_award_work_reference.py). The monotonicity property needed one law-based allowance. A carer is not in remunerative work for Income Support (reg 6(4)(c)) but is for JSA, so more hours can end a carer's own JSA award that barred the claim. The property therefore allows a gain only where a calculated esa_income or jsa_income award actually ended.

Not every receipt signal is screened. bursary_fund_16_to_19_receives_uc_or_esa_in_own_right reads esa_income_reported and esa_contrib_reported directly, as its documented reported-benefit proxy. This PR does not change it, so a student whose income-related ESA report fails these screens keeps that signal (#2263).

Tests

  • YAML. esa_income_remunerative_work.yaml has 45 cases and jsa_income_remunerative_work.yaml has 18, each hand-computed from the law. They cover:

    • £20 a week at 30 hours, which is exempt;
    • £21 at 16 hours, which is remunerative;
    • £195.50 and £196 at 15 hours in 2025-26, and £196 and £204 in 2026-27;
    • half pension contributions;
    • tax on pay as the lowest slice;
    • reg 99's notional tax on a £13,200 profit with a £5,900 pension premium (£193.97);
    • reg 99's Class 4 on the profit before capital allowances, and without another trade's loss (£195.12 within £195.50 in both, where the shared Class 4 profits would give £195.85);
    • a self-employment loss of £1,000 or £20,000 beside £11,000 of pay (£211.54 either way);
    • the blind person's allowance in reg 99's notional tax (£196.39);
    • a 2017-18 Scottish profit with the Scottish basic rate and Class 2 (£122.28 against £120);
    • the married couple's allowance with a loss, and a foreign tax credit on other income, neither changing the tax on pay;
    • statutory sick, maternity or paternity pay beside £10,300 of pay (£198.08 each time), and a control that sets the shared taxable pay and Class 1 base to £13,300 without moving the result;
    • 2023-24 reg 99 cases: £12,500 of profit (£170.19 against £167), a profit equal to the £12,570 lower profits threshold (no Class 2: £168.65), £1 over it (Class 2 brings it to £165.22, the intended cliff), and £13,000 (Class 2 at £3.45: £167.23);
    • 2022-23 reg 99 cases: a profit equal to the £11,908 lower profits threshold (no Class 2: £154.00 against £152) and £1 over it (Class 2 at £3.15 and 9.73% Class 4: £150.87, the same cliff);
    • 2015-16 cases: £5,000 of profit (no Class 2: £96.15 against £104), and a profit equal to the £5,965 small profits threshold (Class 2 due: £102.30);
    • a carer claimant and a carer partner;
    • a partner at 23 and 24 hours;
    • both members reporting;
    • non-dependants: their own award tested on their own work, their award not rescuing the claimant's, and their own status both ways for each benefit. Working, they are not on the award whatever the claimant reports; not working, they stay on it when the claimant's claim fails;
    • couples without children at 15, 16, 20, 23 and 24 hours (reg 3E), and a couple caring for a placed child;
    • the Income Support gate.

    With main's two capital-only screens and everything else at 6880c0e, 32 of the 63 cases fail. They are every case where the work condition bars an award, plus the two where a non-working non-dependant keeps their award while the claimant's claim fails (with the capital-only screen the claimant's claim never fails).

  • Hypothesis, work screens (test_legacy_award_work_properties.py, 4 properties, 20 examples each):

    • the screens, and each adult's weekly earnings, equal a family-by-family reading of the law in 2025 and 2026. Families mix employees, self-employed people, pay with profit, losses beside pay (including losses larger than the pay), pension contributions, statutory sick, maternity and paternity pay, ages either side of state pension age, placed children and non-dependants;
    • more hours or pay never makes a family eligible (in the tested 2025 and 2026, within the generated scope);
    • caring never ends an ESA award and never matters for JSA (no exception for carers doing unrelated paid work);
    • a member outside the family never changes the couple's screen.
  • Hypothesis, Count only the claimant's and partner's legacy awards in means tests and passports #2027's readers (test_legacy_award_readers_properties.py, updated). The claimant-or-partner reference now applies esa_screen/jsa_screen, the same independent reading of the law. The status reference tests a member outside the couple on their own work. The claimant, partner and outside adults now draw hours (0, 15, 16, 24 and 40 a week) and pay (£0, £8,000 or £20,000), so the screens bite for both awards. In the examples drawn:

    • a reported claimant-or-partner award is screened out in 87% (ESA) and 80% (JSA);
    • an outside member's own work bars them in 60% of examples for each award.

    Three deterministic tests keep this coverage independent of the examples drawn:

    • a working claimant's reported ESA and JSA give nil claimant-or-partner awards (the review's £20,000 case, at 40 hours so that JSA's test bites too);
    • an outside adult's status for ESA, JSA and the maintenance-loan signal, both ways;
    • the Merton 2027 non-dependant deduction, which a working outside adult's own report no longer removes.

    With ffd7525's status code (_legacy_award_payee.py and the two status variables) and everything else at 6880c0e, the four new YAML status cases fail (59 pass). Four of the 14 reader tests fail: the invariance and person-status properties, the outside-adult test and the Merton test.

  • Parameters.

    • The higher limit equals 16 x NMW rounded up to 50p at every rate in DMG ch. 41 Appendix 5, and matches DWP's published limits.
    • Projected years are multiples of 50p and never fall.
    • The JSA hours parameters match the older ones.
  • Suites. The head 672d0a6 changes only documentation strings from 6880c0e (the reviewer checked the ASTs).

    • At 6880c0e, run locally: ruff format --check clean (1,315 files); YAML under tests/policy/baseline/finance/benefit and tests/policy/baseline/gov, 2,648 passed.
    • Also at 6880c0e: the targeted pytest files, 121 passed. They are the work, Income Support and reader properties, the direct-input, entered-directly and lifecycle tests, the parameter tests and the NI Class 4 tests.
    • At 672d0a6: the two remunerative-work YAML files, 63 passed.

Invariants

Each holds for every input in the stated scope:

  1. Subset of the old screen. An award that passes the new screen passed the capital-only one: the screen is the old capital test and the work conditions together.
  2. Monotonicity. More hours or pay for anyone never makes an award pass, from 6 April 2024. The property tests 2025 and 2026, for adults with no income other than their pay, profit and statutory payments, within the basic rate band and the Class 4 upper limit. Two exceptions are not claimed:
    • Before 6 April 2024, reg 99(3)(a)'s fixed Class 2 deduction begins once profit reaches its threshold (from 6 April 2022, once it exceeds it), so £1 more profit can lower net earnings. YAML cases pin this intended cliff in 2022-23 and 2023-24.
    • Other income can move the personal allowance through the taper, so the invariant is not claimed outside that scope.
  3. Caring. Caring never ends an ESA award and never changes a JSA award.
  4. Non-dependants and the couple. When the claimant or partner reports the award, adding a non-dependent adult, with any award and any work, never changes either screen.
  5. Non-dependants' own awards. On the formula path of an open scheme, with no award entered or replaced, a member outside the couple is on income-related ESA or income-based JSA exactly when their own claim passes: their own work, their own report above tariff income, and the capital limit. Nobody else's report or work changes this.
  6. Readers. The claimant-or-partner awards equal the award on the claimant's and partner's reports after tariff income and within the capital limit, while the benefit unit passes the work screen.
  7. Placed children. A child placed with a couple never changes the JSA work test.
  8. Parameters. The higher limit equals 16 x NMW rounded up to 50p whenever it is NMW-linked, and projected values are 50p multiples.

Invariants 2-6 are property tests, with deterministic cases for 5 and 6. Invariant 7 is a YAML case and follows from reg 3E. Invariant 1 follows from the screen's form and is checked through the reference test. Invariant 8 is a table and range test.

Enhanced FRS impact

Real Microsimulations on fresh copies of enhanced_frs_2024_25.h5 (sha256 e433e532…), base main e89b8ab against this branch at 6880c0e (the head 672d0a6 changes only documentation strings), each from its own worktree venv with a clean tree. Benefit units and households are weighted thousands; "records" are dataset records. Figures resting on fewer than 10 records are not shown.

Year Income-related ESA Benefit units losing it Household net income Households losing
2025 −£88.3m 7.7k (40 records) −£89.2m 7.9k (48 records)
2026 −£90.7m 7.7k (40) −£90.8m 7.7k (40)
2027 −£92.7m 7.8k (40) −£92.7m 7.8k (40)
2028 −£94.9m 7.8k (40) −£94.9m 7.8k (40)
2029 −£304.2m, of which −£97.1m outside the salary-sacrifice artefact 24.7k (92), of which 7.8k (40) outside it −£305.1m 24.7k (92)
2030 −£311.6m, of which −£99.4m outside it 24.8k (92), of which 7.9k (40) outside it −£312.4m 24.8k (92)
  • By channel in 2025 (first match: the reporting claimant's own work, then the other member's 24 hours):
    • ESA claimant in remunerative work: 3.0k units, 22 records, −£32.4m.
    • ESA partner working 24+ hours: 4.7k units, 18 records, −£55.9m.
  • Other benefits.
    • Income-based JSA changes only in 2025 (the scheme is closed from 2026), and council tax reduction in 2025-2027 and 2029-2030. Each changes for fewer than 10 records a year, so they are in the household totals but not shown.
    • Housing Benefit changes only in 2029 and 2030: −£0.9m in each year, from 10 records, all in benefit units with the salary-sacrifice artefact.
    • Universal Credit, Pension Credit and Income Support do not change in any year (0 records).
  • Poverty. Changes in 2025-2028 rest on fewer than 10 households and are not shown. In 2029-2030 the all-person poverty rates (before and after housing costs) rise by at most 0.012 percentage points, from 18 to 32 households.
  • Against the previous head. Every saved array (101 a year) and every aggregate equals the run at ffd7525. No record has anyone outside the couple reporting either award, so the status fix does not reach these figures. The final review of ffd7525 found that run equal to the earlier runs at b9816e4 against main 88ecf58.

The 2029-30 jump is a data defect, not this rule. From 2029 the £2,000 salary-sacrifice cap moves sacrifice above the cap into employment_income (salary_sacrifice_returned_to_income).

  • In 2029, 1,283 records (874k weighted) with no pay of their own gain employment income from it.
  • Among income-related ESA reporters that is 106 records (27k), 97 of them with zero hours.
  • The claimant earnings test reads that as work above the higher limit. Splitting the same runs, the units whose ESA claimant has no pay or profit of their own account for −£207.1m of the 2029 change and −£212.2m of 2030's (52 records). The rest continues the 2025-2028 trend.
  • Chip task_d73fcf28 restricts the imputation to people with pay and guards the model.

What the 40 records are. They are survey reports of income-related ESA alongside work the regulations say ends it: 22 records with a claimant over the exempt-work limits and 18 with a partner working 24+ hours. The contributory/income-related split is the respondent's own report (FRS BENEFITS VAR2). Some may be contributory ESA, which a partner's work does not affect (DMG 41302) and which this screen does not touch. The rule is the law; whether the survey labels are right is a data question.

Review

Axiom

axiom: TheAxiomFoundation/rulespec-uk#417 queued. rulespec-uk has no module for:

  • WRA 2007 Sch 1 para 6;
  • ESA Regs 2008 regs 40-45, 96, 98 and 99;
  • Jobseekers Act 1995 ss.1, 3 and 35;
  • JSA Regs 1996 regs 3E and 51-53.

The statute provisions are not in the corpus. The regulations are only in the non-release scope 2026-06-01-uk-frs-microsim. The issue carries the verbatim law, the required outputs, a review_finding and 12 groups of companion tests from the same ground truth as the YAML.

Follow-ups

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 2, 2026 01:32
Income-related ESA (WRA 2007 Sch 1 para 6(1)(e), (f); ESA Regs 2008 regs
41-43, 45) and income-based JSA (Jobseekers Act 1995 ss.1(2)(e), 1(2B)(b),
3(1)(e); JSA Regs 1996 regs 3A, 51) are barred when the claimant, or the
other member of the couple, is engaged in remunerative work. The screens
applied only the capital test.

- ESA claimant: paid work other than exempt work (£20 a week, or under 16
  hours within 16 x NMW), on net earnings.
- ESA partner: 24 hours, except a carer (reg 43(2)(c)).
- JSA: 16 hours for a claimant, including each member of a joint-claim
  couple; 24 for a partner otherwise; no carer exception.
- Candidates are the claimant and partner when either reports the award.

The income_related_*_award helpers are unchanged; they read the screens.
The Income Support property reference now applies the same tests, holding
the JSA joint-claim status fixed in the invariance property and allowing
work that ends a barring award in the monotonicity property.

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

The stored higher limit equals 16 x the National Minimum Wage rounded up to
the next 50p (ESA Regs 2008 reg 45(9A)) at every rate in DMG ch. 41
Appendix 5, and DWP's published £183.50, £195.50 and £203.50. The JSA hours
parameters match the older gov.dwp.JSA.hours ones. The new property tests
run 20 examples each.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 3 commits October 2, 2026 02:33
Takes is-remunerative-work-jsa-conditions at bfff081 (with #2013 at
97b7a1c). In test_income_support_eligibility_properties.py, #2025's version
is kept and the work tests are re-applied: the reference's award on the
claimant's and partner's reports, and explained_by_reports' award on
everyone's reports, pass the ESA and JSA work screens; monotonicity allows a
gain only where a calculated award was lost. Excluded members are now adults
only, so the invariance property needs no joint-claim hold.

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

- JSA: a member of a joint-claim couple whose partner works 16 to under 24
  hours can claim alone (JSA Regs 1996 reg 3E(1), (2)(g), since 19 March
  2001), so the other member's limit is 24 hours for every couple. The
  joint-claim switch, is_jsa_joint_claim_couple and its parameters are
  removed.
- ESA earnings: pay under reg 96(3); self-employment under reg 98(3) and
  reg 99 (notional basic-rate tax above the personal allowance, main-rate
  Class 4, half the personal pension premium); a self-employment loss is no
  longer set against pay (reg 98(11)). The documentation calls the PAYE
  attribution an approximation, not the reading most favourable to the
  claimant.
- The projected higher earnings limit rounds up to 50p (reg 45(9A)).
- The Income Support monotonicity property allows a gain only where a
  calculated esa_income or jsa_income award actually ended.
- esa_income and jsa_income documentation names the work tests.
- YAML: two self-employment cases, JSA couples without children at 15, 16,
  20, 23 and 24 hours, and a couple with a placed child.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings #2013's DIFFERENTIAL_SETTINGS (25 examples) for the Income Support
family-by-family property. Clean merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 2, 2026
esa_income_eligible is the screen esa_income applies. It is a capital test
here, but #2031 (on #2025) adds remunerative-work tests to it, so the
comments now name the variable rather than the test. Comment-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 7 commits October 2, 2026 03:05
…pers

Comment-only. In esa_income.py and jsa_income.py the helpers keep #2025's
docstrings ("fails the screen in esa_income_eligible" / "jsa_income_eligible"),
so they stay identical to #2025 and #2013; the variables' documentation names
the capital and remunerative work tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings #2013's 3402629 and #2025's round-4 changes: the IS gate compares
direct awards in the stored dtype, documents the value convention's
boundary, and adds direct-input tests. Clean merge; the property file's
docstring and the work-screen reference sit side by side.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ish rate

- A self-employment loss larger than the pay no longer reaches the tax on
  the pay through the shared allowances (pension_contributions_relief goes
  negative there). The pay side is PAYE on the pay alone: taxable pay less
  employee pension contributions and the personal and blind person's
  allowances, less tax reductions.
- Reg 99(1): the notional tax allows the blind person's allowance.
- Reg 99(3)(a): Class 2 is deducted until 5 April 2024, from the small
  profits threshold and, from 6 April 2022, above the lower profits
  threshold (two dated parameters).
- The Scottish basic rate is the first Scottish band before 2018-19 and the
  second once the starter rate came in.
- YAML: a loss larger than the pay, the blind person's allowance, and a
  2017-18 Scottish profit with Class 2.
- The reference applies National Insurance only below state pension age and
  covers pay with profit and a loss larger than the pay. The differential
  property also compares weekly earnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The pay side takes only the married couple's allowance reduction, up to
  the tax on the pay itself, instead of the shared income_tax_subtractions.
  The shared capped_mcad is capped against the whole liability, which a loss
  moves through negative pension relief, and other_tax_credits holds credits
  settled through a tax return, such as foreign tax credit relief.
- YAML: the married couple's allowance with a £20,000 loss, and a foreign
  tax credit on property income.
- Documentation: the notional National Insurance follows the model's
  Class 2 and Class 4 parameters. Their 2015-16 and 2023-24 values are out
  of date; a separate fix is chip task_21085692.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings #2025's stored-award convention wording, its tolerance tests and
test_direct_awards_match_the_reference_deterministically. In
test_income_support_eligibility_properties.py the monotonicity waiver for a
lost calculated award is kept and the new deterministic test follows it;
reference_eligibility's signature is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings #2013's under-16 limit on Sch 1B para 2 and the zero-award guard on
both income-related bars, with their tests. Clean merge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Correct the dated National Insurance amounts reg 99's notional
  contributions read: the 2015-16/2016-17 Class 2 small profits threshold
  (£5,965), the 2023-24 Class 2 rate (£3.45) and lower profits limit
  (£12,570), the 2022-23 Class 4 rates (9.73%/2.73%, Health and Social
  Care Levy (Repeal) Act 2022 s.2(2)) and the 2023-24 additional rate
  (2%). The four 2023 NI tests now take hand-derived statutory values,
  including the reg 100 annual maximum (£1,748.60).
- Take the ESA pay's tax and primary Class 1 on the pay alone: statutory
  sick, maternity and paternity pay are not earnings (reg 95(2)(b)), so
  the shared taxable pay and Class 1 bases, which include them, are not
  used.
- YAML: SSP/SMP/SPP controls, a shared-base isolation control, the 2023
  regression and threshold-equality cases for 2023-24 and 2015-16.
- Properties draw statutory payments; describe ages on both sides of
  pension age and the JSA carer rule as no exception for carers doing
  unrelated paid work.

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

Copy link
Copy Markdown
Collaborator Author

The NI parameter corrections this PR carries (review r4 finding 1) now have their own PR off main: #2058. Note for whoever next works on this branch.

The hunks are not byte-identical. #1888 already held the Class 2 fix in a different form (every value cited, new class_2/lower_profits_threshold.yaml and lower_profits_threshold_applies.yaml, and ni_class_2 charging only above the lower profits threshold in 2022-23 and 2023-24). #2058 takes that commit and adds the Class 4 fix; #1888 is closed as superseded.

Every value in this branch's NI hunks is in #2058 with the same number:

  • small profits threshold £5,965 from 2015;
  • Class 2 £3.45 from 6 April 2023;
  • lower profits limit £12,570 from 6 April 2023;
  • Class 4 main rate 9.73% for 2022-23 and 9% from 6 April 2023; additional rate 2.73% and 2%.

The four 2023 test expectations match too (179.40; 1,568.70; 3,393; 1,748.60).

#2058 also has:

  • the small profits threshold at £6,725 for 2023-24 and 2024-25, with the uprating anchor removed;
  • the 2015-16 upper profits limit of £42,385;
  • corrected dates for the 2016-17 upper limit, the 6% main rate and the end of compulsory Class 2.

When #2058 lands, merge main and take main's version of these paths whole, without hand-merging hunks:

git checkout origin/main -- policyengine_uk/parameters/gov/hmrc/national_insurance/class_2 policyengine_uk/parameters/gov/hmrc/national_insurance/class_4 policyengine_uk/tests/policy/baseline/gov/hmrc/national_insurance

Checked against this branch. I overlaid #2058's NI parameter, variable and test files onto head e38ea0c in a probe worktree. esa_income_remunerative_work.yaml plus the NI YAML: 108 passed. The 2023-24 case (£12,500 profit, £7,300 personal pension) gives esa_exempt_work_earnings 170.19 and esa_income_eligible false.

esa_exempt_work_earnings reads the Class 4 lower profits limit and this PR's own DWP switch for the Class 2 threshold. That still works. The HMRC-side equivalents after #2058 are gov.hmrc.national_insurance.class_2.lower_profits_threshold and .lower_profits_threshold_applies.

Not covered by #2058: the Class 1 rates and thresholds that changed mid-year in 2022-23 and 2023-24 (#1807).

Axiom: rulespec-uk#353 (s.11) and rulespec-uk#423 (s.15 and regulation 100) are the queued parity issues for the NI history.

- YAML: in 2023-24, £1 of profit over the lower profits threshold brings
  reg 99(3)(a)'s fixed Class 2 in and the work under the £167 limit
  (£165.22 against £168.65). This is the intended statutory cliff,
  labelled as such.
- The monotonicity property's docstring now names its tested years
  (2025-26) and this pre-April-2024 exception.
- Changelog: the shared NI corrections also change historical NI, net
  income and means tests in those years.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 2, 2026 13:39
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Cross-PR note from #2075 (stacked on #2027 + #2025): #2075 switches income_support_eligible's ESA and JSA limbs to read claimant_or_partner_esa_income > 0 / claimant_or_partner_jsa_income > 0. Those variables still go through income_related_esa_award / income_related_jsa_award, so this PR's work conditions in the screens reach the gate unchanged.

#2075 does not edit test_income_support_eligibility_properties.py, esa_income_eligible or jsa_income_eligible. Its new differential test imports FAMILIES, input_settings, situation and DIFFERENTIAL_SETTINGS from that property file, so renaming any of them would need a matching change in #2075.

Because the gate now reads a calculated variable, a test that changes esa_income/jsa_income after calculating the gate must also delete the claimant_or_partner_* arrays.

@vahid-ahmadi vahid-ahmadi left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Max. The law is read correctly:

  • ESA claimant: remunerative work is any paid work other than reg 40(2) work (reg 41(1)). Work is exempt where earnings "do not exceed £20.00" (reg 45(2)), or where it is done for "less than 16 hours a week" with earnings within 16 × NMW, rounded under reg 45(9A).
  • ESA partner: the test is "not less than 24 hours" (reg 42(1)), with the carer exception in reg 43(2)(c).
  • JSA: 16 hours for the claimant and 24 for the partner (reg 51(1)(a)-(b)).
    • Reg 3E(2)(g) ("16 hours or more per week but less than 24 hours per week") makes 24 hours the limit for the other member of any couple.
    • Reg 51(3)(c) only discounts unpaid caring hours, so having no carer exception for paid work is right.

Verified at 232358d:

  • Higher limit: £183.50, £195.50 and £203.50 for 2024-25 to 2026-27 (16 × £11.44, £12.21 and £12.71, rounded up). The projections run from £208.50 to £223.00 in 2030.
  • The NI corrections match the statutory values:
    • 2023-24: Class 2 at £3.45, the lower profits limit at £12,570, and the Class 4 additional rate at 2%;
    • 2022-23: Class 4 at 9.73% and 2.73%;
    • 2015-17: the small profits threshold at £5,965.
  • Tests:
    • YAML: esa_income 52/52, jsa_income 28/28, income_support 86/86, NI 49/49.
    • The new properties pass 4/4, the IS properties 4/4 and parameters 6/6.
  • Merges cleanly with #2027 and #2075.
  1. Blocking: the 2029-30 salary-sacrifice artefact ships with this PR.
    • The probe: a single 45-year-old with no pay and 0 hours, who reports £5,000 of income-related ESA and has £30,000 of imputed salary sacrifice.
    • In 2028 ESA is £5,000.
    • In 2029 salary_sacrifice_returned_to_income puts £28,000 into employment_income. esa_exempt_work_earnings becomes £246.27 a week, above the £217.50 limit, and the award drops to £0.
    • The body puts about £207-212m a year of the 2029-30 change down to this, against about £97-99m that is real. So in the years our fiscal projections cover, this PR roughly triples the cut.
    • Fix: land the guard from task_d73fcf28 first, or add it here. In esa_exempt_work_earnings.py:76, don't count salary_sacrifice_returned_to_income for a person with no employment income before the cap. Add the 2029 zero-hours case.
  2. Should fix: the NI parameter hunks duplicate #2058, and your comment says the values are the same. A trial merge conflicts in all five NI parameter files (class_2/flat_rate.yaml, class_2/small_profits_threshold.yaml, class_4/rates/main.yaml, class_4/rates/additional.yaml, class_4/thresholds/lower_profits_limit.yaml) and all four NI test files. Drop these hunks once #2058 lands, or rebase onto it; the reg 99 cases should then pass unchanged.
  3. Should fix: these parts of the body give unweighted record counts, several below 10: the impact table, "By channel in 2025", the statutory-pay paragraph, the 2029-30 section and "What the 40 records are". Keep the weighted figures and remove or round the record counts.
  4. Should fix (inherited): this needs the same #2013 rebase as #2025 (is_SP_age against main's qualifying-age variable, and the s.124(1)(g) limb). The IS gate reads these screens, so re-run the IS properties after it.

Base automatically changed from is-remunerative-work-jsa-conditions to main October 9, 2026 01:50
MaxGhenis and others added 6 commits October 9, 2026 13:46
#2025 merged as 4ed8713. Conflict: test_income_support_eligibility_properties.py,
whose docstrings now carry both main's s.124(1)(g) Pension Credit reading and
this branch's remunerative work tests and lost-award waiver. The Class 4 lower
profits limit merged cleanly: this branch's 2023-04-06 £12,570 (SSCBA 1992
s.15(3)(a)) plus main's 2026-31 entries, all £12,570.

Main (#1919) now charges ni_class_4_main on ni_class_4_profits: after capital
allowances, the trading allowance and Sch 2 loss relief. ESA reg 99(3)(b)
charges the notional Class 4 on reg 99(4)'s chargeable income, the reg 98
profit, from which reg 98(5)(a), (b), (d) and (11) bar capital expenditure,
depreciation and losses from another trade or an earlier period. So
esa_exempt_work_earnings now computes it on the profit, under the model's
Class 4 age rule (ni_class_4_liable), with two YAML cases (capital allowances,
another trade's loss) where the two differ across the higher limit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #2027 (bbb9576): Housing Benefit, council tax reduction, tax
credits, Income Support, Scottish Child Payment and maintenance loan readers
now read claimant_or_partner_esa_income and claimant_or_partner_jsa_income.
Those call income_related_esa_award and income_related_jsa_award, so they
inherit this branch's work screens. Clean merge, no conflicts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Final review of b9816e4 (nits 1-3):
- esa_exempt_work_earnings: another trade's loss can change the pay's
  personal allowance through the taper; a self-employment loss is never
  deducted from the pay itself.
- Shared bases: taxable employment income includes statutory sick and
  maternity pay; the Class 1 base (ni_class_1_income) includes all three.
  Same fix in the ESA YAML note and the property file's comment.
- Property docstring: the pay monotonicity holds within the generated
  scope, where adults have no other income.

Comments and documentation only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in #2058 (cfee0e6), which fixes Class 2 and Class 4 National
Insurance against SSCBA 1992 for 2015-16 to 2026-27. It conflicted with this
branch's NI corrections in nine files, all resolved to main's version:

- Parameters: class_2/flat_rate, class_2/small_profits_threshold,
  class_4/rates/main, class_4/rates/additional and
  class_4/thresholds/lower_profits_limit. Every value this branch set is the
  same on main (2015-16 and 2016-17 SPT £5,965; 2023-24 Class 2 £3.45;
  2023-24 LPL £12,570; 2022-23 Class 4 9.73% and 2.73%; 2023-24 2%). Main
  also adds the 2023-24 and 2024-25 SPT of £6,725 (s.11(4)(b)) and dates
  each entry from 6 April with its statute. Class 2 ends on 6 April 2024
  (NICs (Reduction in Rates) Act 2023 s.3) where this branch kept the
  model's 1 January 2024 entry. The Class 4 main rate falls to 6% on
  6 April 2024, where this branch kept 4 April.
- Tests: ni_class_2, ni_class_4, ni_class_4_main and ni_class_4_maximum.
  Main has this branch's statutory values (52 x £3.45 = £179.40;
  £1,568.70; £3,393; reg 100 maximum £1,748.60) plus 2015-16, 2016-17
  and 2022-23 cases.

So the PR no longer changes any shared NI parameter or test. The changelog
drops its NI bullet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reg 99(3)(a) as at 6 April 2023 spares chargeable income "equal to or less
than the amount specified in section 11(4)(a) ... (lower profits
threshold)". #2058 added that amount as
gov.hmrc.national_insurance.class_2.lower_profits_threshold (£11,908 in
2022-23, £12,570 in 2023-24). The rule and the test reference now read it
instead of the Class 4 lower profits limit. The values are the same in both
years the deduction applies, so no result changes.

Two 2022-23 YAML cases pin the threshold and its date. At £11,908 of profit
there is no Class 2: (£11,908 - £3,900) / 52 = £154.00, over the £152
higher limit. At £11,909, Class 2 of 52 x £3.15 and Class 4 of 9.73% x £1
come off: (£11,909 - £0.0973 - £163.80 - £3,900) / 52 = £150.87, within
it. ESA YAML: 43 cases.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Final review of ffd7525 (review_final_ffd752576):

1. A member outside the couple claims in their own right, but
   own_report_is_paid read the benefit unit's screen, which tests only the
   claimant and partner when either reports. A working outsider could be
   on the award, and a non-working one lost it when the claimant's claim
   failed. It now tests their own claim: not in remunerative work as its
   claimant (esa_income_claimant_remunerative_work; JSA's 16 hours), the
   capital limit, and their report above tariff income. The benefit unit's
   award must be positive or nil only because its screen fails, and not
   neutralised; JSA must be active.
2. #2027's reader properties compared against capital-only references. The
   claimant-or-partner reference now applies esa_screen/jsa_screen, the
   status reference applies the outside member's own work test, and the
   generators draw hours and pay for the couple and outside adults.
   Deterministic regressions: a working claimant's awards screened out;
   outside adults' status both ways (ESA, JSA, maintenance-loan signal);
   Merton 2027 non-dependant deduction. Four YAML status cases.
3. reg 99(3)(a) comment: SI 2022/1329 has effect from 6 April 2022.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Final review of 6880c0e (APPROVE WITH NITS), nit 2: the status
documentation said the benefit unit's award could be nil "only because"
the claimant's or partner's claim fails the screen. A zero cannot say why it
is zero: a nil entered directly, or a reform that replaces the award with
nil, removes an outside member's status only while the screen passes;
neutralising the award always removes it. Documentation only.

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

Copy link
Copy Markdown
Collaborator Author

Status at head 672d0a62e, from the scheduled lane on 10 October:

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

UK hub, for this PR's owner: the 2029-30 impact here should be re-run on current main.

#2063 merged on 10 October (88d4ff48d). With its guard in main, salary sacrifice attributed to people with no pay is no longer counted as pay, so it no longer reaches the ESA permitted-work test on the published dataset. The session that built #2063 reports 106 ESA-reporter records (27k weighted) had such pay in 2029. I have not re-measured that figure.

To pick the change up, merge main into this branch and re-run the impact for 2029-30. Merging main also gives the Test job its new 120-minute limit (#2258).

This branch has not been deployed

No deployments
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.

Income-related ESA and income-based JSA awards ignore the remunerative work conditions

2 participants