Repository navigation
Apply the income-related ESA and income-based JSA remunerative work conditions - #2031
Conversation
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>
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>
…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>
- 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>
|
The NI parameter corrections this PR carries (review r4 finding 1) now have their own PR off The hunks are not byte-identical. #1888 already held the Class 2 fix in a different form (every value cited, new Every value in this branch's NI hunks is in #2058 with the same number:
The four 2023 test expectations match too (179.40; 1,568.70; 3,393; 1,748.60). #2058 also has:
When #2058 lands, merge 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_insuranceChecked against this branch. I overlaid #2058's NI parameter, variable and test files onto head e38ea0c in a probe worktree.
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>
|
Cross-PR note from #2075 (stacked on #2027 + #2025): #2075 switches #2075 does not edit Because the gate now reads a calculated variable, a test that changes |
vahid-ahmadi
left a comment
There was a problem hiding this comment.
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.
- 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_incomeputs £28,000 intoemployment_income.esa_exempt_work_earningsbecomes £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 countsalary_sacrifice_returned_to_incomefor a person with no employment income before the cap. Add the 2029 zero-hours case.
- 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. - 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.
- Should fix (inherited): this needs the same #2013 rebase as #2025 (
is_SP_ageagainst 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.
#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>
|
Status at head
|
|
UK hub, for this PR's owner: the 2029-30 impact here should be re-run on current #2063 merged on 10 October ( To pick the change up, merge |
Brings in #2258 (120-minute Test job), #2180 (NICs thresholds indexed by September CPI after 2030-31), #2063 (salary sacrifice needs pay), #2038 (winter payments to the member a benefit is paid to), #2259, #2248, #2251, #2262, #2266, #2270, #2285, #2288, #2294 and #2021. Conflict: test_legacy_award_readers_properties.py imports. Kept both hypothesis.event (this branch's screened-out events) and hypothesis.example (#2294's found families). The rest of the file merged cleanly: #2294's without/silent/with-other comparison, the severe disability premium bound and the held benefit cap sit alongside this branch's work generators, screened reference and outside-member tests. Two comments now say the ESA and JSA readers also read the members' work. _legacy_award_payee.py merged cleanly: #2038's can_claim (Pension Credit) and this branch's own_report_is_paid are independent. The shared NI parameters already match main (#2058); #2180 changes only 2031-32 onward. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
CI run cancelled to free runners (UK hub, 2026-10-11 23:30Z). The PolicyEngine org is at GitHub's limit of 60 concurrent jobs, with about 360 queued. Fleet ops asked the hub to let the Budget-critical #2305 take runners first. This PR's queued run had not started, so I cancelled it. Nothing is wrong with the PR. Please don't re-run it or push just to retrigger CI. The hub re-runs this run itself once #2305 has runners. The record is |
Conflicts in esa_income_eligible.py and jsa_income_eligible.py: #2119 ended a reported award once one of the family's legacy benefits has closed (legacy_benefits_closed). Both screens keep this PR's remunerative work conditions and candidate rule unchanged and AND in main's closure term with main's comment verbatim; the documentation now names the closure. The closure is a benefit-unit condition separate from who claims, so the claimant, partner and candidate rules are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2119 (merged from main in 864eef6) ends every legacy award in a family once one of its legacy benefits has closed, through esa_income_eligible and jsa_income_eligible. own_report_is_paid read a failing benefit-unit screen as the couple's claim failing the work tests, which leaves a member outside the couple on their own claim; after the merge a closed family's screen fails too, so a non-working outside member stayed on ESA or JSA after the closure ended it. Main's own_report_is_paid required the screen to pass and so ended it. The outside member's own claim now also requires legacy_benefits_closed to be false. Two YAML cases (2025, a Child Tax Credit report closes the family's legacy benefits; a non-working lodger reports ESA or JSA) fail on 864eef6 and pass here. Documentation and the changelog say so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…a simplification Answers the review of e743d8e (subfleet/review_final_e743d8ee7.md): 1. legacy_award_work_reference gains legacy_benefits_closed, #2119's closure as the model applies it (a report of Income Support or income-based JSA once closed, by any member, unless someone reports Pension Credit or the claimant and partner have all reached its qualifying age), and esa_screen and jsa_screen apply it. The work properties draw JSA reports in 2026, when income-based JSA is closed, so test_screens_match_a_family_by_family_reading failed there. 2. Invariant 4 is qualified: an outside member changes a screen only through the closure, which reads every member's reports. The property now asserts exactly that (the screen with them equals the screen without them while their report has not closed the family's legacy benefits). 3. The outside member's status following the closure (e743d8e) matches main and the money calculation, but is a model simplification: SI 2014/1230 regs 44(1), (4) and 46(1) reach only the claimant and partner. The docstring, the status variables' documentation, the YAML comments and the changelog now say so. Nits: the readers properties' docstring names the closure, and the status variables' documentation is reflowed (text otherwise unchanged). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review of 3fa0cd5 (subfleet/review_final_3fa0cd590.md) noted that the Income Support properties draw ages 65 to 69; they never reach the age branch, since Income Support and income-based JSA are open in 2025. The docstring now says the ages must keep clear of 65 to 69 only when the result depends on them. Docstring only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Merged by the UK hub (audit). Merged with a merge commit at the tested head
|
…e reform #2031 (merged into this branch from main in 6f0148a) has an adult outside the couple on income-based JSA, on their own claim, only while the scheme is open (gov.dwp.JSA.income.active, false from 2026). Under disable_simulated_benefits the reform still pays the JSA they report in every year, and the claimant and partner stay on the award the reform holds for them, but the outside member's own status now ends from 2026, so test_each_person_is_on_their_own_award[2026] and [2027] failed on the merge. The reform holds only the move off legacy benefits (NOT_MOVED), and the model's other rules apply (review r7's qualification). Overriding the scheme's closure for the reform would need a parameter change, which a branch would share with its parent, or statuses calculated during construction. So the test now expects the outside member on the JSA they report only in the years the model has the scheme open, and checks that 2025 is open and 2026 and 2027 are not. The NOT_MOVED comment, the changelog and test_no_family_is_moved's comment say so. No change to the model. £0 on the Enhanced FRS either way: no member outside the couple reports ESA, JSA or Income Support there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e reform #2031 (merged into this branch from main in 6f0148a) has an adult outside the couple on income-based JSA, on their own claim, only while the scheme is open (gov.dwp.JSA.income.active, false from 2026). Under disable_simulated_benefits the reform still pays the JSA they report in every year, and the claimant and partner stay on the award the reform holds for them, but the outside member's own status now ends from 2026. A probe of the merge (a couple with an adult outside it who reports JSA) gives that adult is_on_income_based_jsa true in 2025 and false in 2026 and 2027, where test_each_person_is_on_their_own_award expected true in every year. The reform holds only the move off legacy benefits (NOT_MOVED), and the model's other rules apply (review r7's qualification). Overriding the scheme's closure for the reform would need a parameter change, which a branch would share with its parent, or statuses calculated during construction. So the test now expects the outside member on the JSA they report only in the years the model has the scheme open, and checks that 2025 is open and 2026 and 2027 are not. The NOT_MOVED comment, the changelog and test_no_family_is_moved's comment say so. No change to the model. £0 on the Enhanced FRS either way: no member outside the couple reports ESA, JSA or Income Support there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2043
Based on
main, last merged at 1d3abec. The PRs this one built on have all merged:Main's #2119 (merged 12 October) ends a reported legacy award once one of the family's legacy benefits has closed (
legacy_benefits_closed). Both screens keep that closure beside the work conditions; see "Legacy closure" under Design points.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:
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".
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_eligibleandjsa_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:
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:
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 sharedni_class_4_profitsis 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;gov.dwp.ESA.income.self_employment_class_2) rather thanni_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, unlessis_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 never changes the couple's work and capital tests. Without this rule a non-dependant's award could flip the benefit-unit screen, and with it the Income Support gate. The legacy closure is the exception: it reads every member's reports (below).
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; helperown_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:esa_income_claimant_remunerative_work, or 16 hours for JSA);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:
gov.dwp.JSA.income.active) or the family's legacy benefits closing (legacy_benefits_closed);The closure ends the status because the model ends every member's award once the family's legacy benefits close, as
maindid for this status. That is a model simplification: in law the migration notice goes to the claimant and partner (SI 2014/1230 reg 44(1), (4)) and ends only their awards (reg 46(1)). Read and apply the legacy closure for the claimant and partner only #2395 tracks it.Before this PR, 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:
gov.dwp.ESA.exempt_work.lower_earnings_limitgov.dwp.ESA.exempt_work.hours_limitgov.dwp.ESA.exempt_work.higher_earnings_limitgov.dwp.ESA.income.remunerative_work.partner_hoursgov.dwp.ESA.income.self_employment_class_2.deductedgov.dwp.ESA.income.self_employment_class_2.above_lower_profits_thresholdgov.dwp.JSA.remunerative_work.claimant_hoursgov.dwp.JSA.remunerative_work.partner_hoursThe existing
gov.dwp.JSA.hours.singleandcoupleare 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):
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:
esa_income,jsa_income);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_awardand theesa_income/jsa_incomeformulas 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 calculatedesa_incomeis 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_incomeandjsa_incomestay 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.Legacy closure (#2119). Main ends a reported legacy award once one of the family's legacy benefits has closed. That covers tax credits from 6 April 2025, except for families DWP sent to Pension Credit instead. It covers Income Support and income-based JSA from 1 April 2026, except for families on Pension Credit or whose claimant and partner are all over its qualifying age. The merge kept this PR's screens and added main's closure term to both, so an award now needs the capital test, the work conditions and an open family. The closure is a benefit-unit condition separate from who claims, so the claimant, partner and candidate rules are unchanged.
legacy_benefits_closedreads every member's reports, so an outside member's report of a closed benefit (for example income-based JSA in 2026) closes the couple's awards too, and the model's closure ends every member's award. Both differ from the law, which reaches only the notified claimant and partner (SI 2014/1230 regs 44(1), (4) and 46(1)). This PR keeps main's behaviour and #2395 tracks the change. No outside member reports ESA or JSA, so the own-status change does not affect the impact below. A separate check of every closure-report input confirms that restricting those reports to the claimant and partner would leave the closure unchanged in every ESA/JSA-reporting unit in 2025–2030.Income Support property tests (
test_income_support_eligibility_properties.py). The reference's award on the claimant's and partner's reports, andexplained_by_reports' award on everyone's reports, now pass the same work screens (new sharedtests/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 calculatedesa_incomeorjsa_incomeaward actually ended.Not every receipt signal is screened.
bursary_fund_16_to_19_receives_uc_or_esa_in_own_rightreadsesa_income_reportedandesa_contrib_reporteddirectly, 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.yamlhas 46 cases andjsa_income_remunerative_work.yamlhas 19, each hand-computed from the law. They cover:At 6880c0e, with main's two capital-only screens and everything else from the branch, 32 of the then 63 cases failed. 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):legacy_benefits_closedintests/legacy_award_work_reference.py; in 2026 a JSA report closes the family unless the claimant and partner are all over Pension Credit age). 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;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 appliesesa_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:Three deterministic tests keep this coverage independent of the examples drawn:
With ffd7525's status code (
_legacy_award_payee.pyand 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.
Suites. The head 40c35b8 changes one test docstring from 3fa0cd5. Run locally at 3fa0cd5:
ruff format --checkandruff check: clean;test_legacy_award_work_properties.py: 4 passed;tests/policy/baseline/finance/benefitandtests/policy/baseline/gov: 2,906 passed.Invariants
Each holds for every input in the stated scope:
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 ofenhanced_frs_2024_25.h5(sha256e433e532…), basemain1d3abec against this branch at 3fa0cd5, each from its own worktree venv with a clean tree. The head 40c35b8 changes one test docstring. A run of the branch at e743d8e, whose formulas are the same, gave identical results in all 612 saved arrays. Benefit units and households are weighted thousands; "records" are dataset records. Figures resting on fewer than 10 records are not shown.mained7b42f (head 2e6fafe) gave −£88.33m in 2025 from 40 records. No benefit unit newly loses ESA in this run. Every unit that drops out of the set already has nil income-related ESA onmain1d3abec's base. The only change to the ESA award's inputs onmainsince ed7b42f is Move families onto Universal Credit when a legacy benefit they receive closes #2119's closure inesa_income_eligible. Somainnow ends those awards before this PR's work conditions are reached.What the 32 records are. They are survey reports of income-related ESA alongside work the regulations say ends it: 16 records with a claimant over the exempt-work limits and 16 with a partner working 24+ hours (2025). 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
r1-r4 (Subfleet, GPT-6.1 Sol): each requested changes, all addressed:
r5: APPROVE WITH NITS at e38ea0c; the nits were fixed in 232358d.
Final review of b9816e4 (after merging main with Apply the Income Support remunerative work and JSA conditions (s.124(1)(c), (f)) #2025): APPROVE WITH NITS. The source nits were fixed in a359287; the rest are in this description.
Final review of ffd7525 (after merging Count only the claimant's and partner's legacy awards in means tests and passports #2027 and Fix Class 2 and Class 4 NICs against SSCBA 1992 for 2015-16 to 2026-27 #2058): REQUEST CHANGES, with two should-fix findings and a nit, all fixed in 6880c0e and this description:
Final review of 6880c0e (Subfleet, GPT-6.1 Sol): APPROVE WITH NITS. It re-ran:
It also recomputed the impact aggregates. Its two nits, a record count here and the wording on when a nil award removes an outside member's status, are fixed in 672d0a6 and this description.
Final review of 672d0a6 (Subfleet, GPT-6.1 Sol): APPROVE, no findings. Both nits resolved, and no executable line changed.
Reviews of 2e6fafe (merges of
main6d89338 and ed7b42f; Subfleet, Opus 5.5 and GPT-6.1 Sol): APPROVE, no findings.Review of e743d8e (Subfleet, Opus 5.5). This head merges
main1d3abec in 864eef6 and adds the outside-member closure fix. The verdict was REQUEST CHANGES, all addressed in 3fa0cd5:It confirmed the conflict resolution, that no other reader mistook the closure for the couple's work failing, Apply the Carer's Allowance earnings limit #2312's carer status for reg 43(2)(c), and that Count statutory sick, maternity and paternity pay as Universal Credit earned income #2365, Band savings and dividends above property income #2352, Set the Personal Savings Allowance on rest-of-UK bands for Scottish taxpayers #2348, Relieve a miscellaneous loss only against miscellaneous income #2327 and Give Gift Aid relief by raising the rate limits, not by deducting the donation #2271 change nothing
esa_exempt_work_earningsreads.Review of 3fa0cd5 (Subfleet, GPT-6.1 Sol): APPROVE WITH NITS. It re-ran the work properties (4 passed) and the YAML (65 passed), and showed the reference's closure equals the model's for every family the three property files generate. Its one docstring nit was fixed in 40c35b8.
Final review of 40c35b8 (Subfleet, GPT-6.1 Sol): APPROVE WITH NITS, no code findings. The head changes only a test docstring (the executable AST is unchanged). It re-checked the screens, candidate selection, the outside-member status helper and the net diff against
main1d3abec. Its two description nits are applied here: invariant 4 now says an outside member's report can close or reopen the legacy closure (an outside Pension Credit report can reopen it), and the no-impact explanation now rests on a check of every closure-report input, not only on the absence of outside ESA/JSA reporters.Axiom
axiom: TheAxiomFoundation/rulespec-uk#417 queued. rulespec-uk has no module for:
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, areview_findingand 12 groups of companion tests from the same ground truth as the YAML.Follow-ups
salary_sacrifice_returned_to_income. It no longer shows in this PR's impact.pension_contributions_reliefgoes negative when losses exceed income.bursary_fund_16_to_19_receives_uc_or_esa_in_own_rightreads reported ESA, not the screened status.🤖 Generated with Claude Code
Reproducer:
policyengine_uk/tests/policy/baseline/finance/benefit/family/esa_income/esa_income_remunerative_work.yaml,policyengine_uk/tests/policy/baseline/finance/benefit/family/jsa_income/jsa_income_remunerative_work.yaml,policyengine_uk/tests/test_legacy_award_work_properties.py::test_screens_match_a_family_by_family_reading