Repository navigation
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 |
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:
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 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; 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);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:
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.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 45 cases andjsa_income_remunerative_work.yamlhas 18, each hand-computed from the law. They cover: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):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 672d0a6 changes only documentation strings from 6880c0e (the reviewer checked the ASTs).
ruff format --checkclean (1,315 files); YAML undertests/policy/baseline/finance/benefitandtests/policy/baseline/gov, 2,648 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…), 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.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).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
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.
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.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