Repository navigation
Count statutory pay in Income Support income - #2595
juaristi22 wants to merge 2 commits into
Conversation
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles. Checks failing on both base and head (1)
Counted-once checkEach of 85 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.
Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
|
UK hub (Claude session, for Max): independent review (GPT-6.1 Sol) at
Nonblocking, so the PR doesn't read as complete statutory-pay support:
@juaristi22, can you merge main? The hub reviews the resolved head and lands it. |
Resolves the conflict with #2573's spousal maintenance in income_support_applicable_income.py by keeping both: statutory sick, maternity and paternity pay as other income (IS Regs 1987 reg 40(4)(a), Sch 9 paras 1 and 4) and spousal maintenance (reg 40, Sch 9 para 15(3)(a)), with child maintenance still disregarded (para 73). The Widowed Parent's Allowance disregard (para 16) is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
UK hub (Claude session, for Max): merged main into this branch at |
vahid-ahmadi
left a comment
There was a problem hiding this comment.
@juaristi22 thanks, first-round review at 5c557635d. The legal treatment is right and the tests pin it. Two shoulds, neither in the formula you added.
What I checked
- Law, against legislation.gov.uk (current text of SI 1987/1967). Reg 35(1) does not list statutory sick, maternity or paternity pay as earnings, and reg 35(2)(b) excludes employer pay during sickness and statutory leave from earnings. Reg 40(4)(a) then counts any payment under reg 35(2) as income other than earnings, at its gross amount (reg 40(1)). Sch 9 para 1 (tax) and para 4 (primary Class 1 NI and half of pension contributions on these payments) give the deductions. Nothing in Sch 9 disregards GB statutory pay. So adding
statutory_sick_pay,statutory_maternity_payandstatutory_paternity_payto the claimant/partner income list atincome_support_applicable_income.py:43-45matches the regulations, and the README is accurate. - The model has no variables for statutory adoption, shared parental, parental bereavement or neonatal care pay, so the three you added are all it can carry. HB already uses the same three (
housing_benefit_applicable_income.py:75-77). - Tests in a fresh venv:
policyengine-core test .../income_support -c policyengine_uk120 passed. Withincome_support_applicable_income.pyreset to the merge base368ce73dc, 8 of the 10 new cases fail and the 2 negative controls pass, so the tests pin the change. - CI at head: all 16 checks pass.
Reproducer:andchangelog.d/2370.fixed.mdare present.
Findings
-
should: Schedule 8 earnings disregard is now taken off statutory pay.
income_support_applicable_income.py:77-90subtracts the £5 / £10 / £20 a week disregard from total income, not from earnings. Sch 8 applies to earnings only, and reg 40 statutory pay gets no disregard of that kind. Before this PR statutory pay was missing altogether, so this is still an improvement. But the main group this PR is for, lone parents on maternity pay with no other earnings, now has £1,040 a year knocked off their SMP. Repro at this head: lone parent, child aged 1,statutory_maternity_pay£3,000 in 2025, no earnings:income_support_applicable_incomeis £1,960. Under the regulations it is £3,000 (no NI is due at that level). The README says this, and the new tests avoid it by using up the disregard with earnings first, which is fair. The fix looks small: cap the disregard at net earnings (min_(income_disregard, earnings)with employment and self-employment income), plus one test with SMP only. If you'd rather leave it for a separate PR, please open a linked follow-up issue before merge so it doesn't get lost. The same over-disregard already applies to pensions and benefits in this pool, so the issue could cover all of it. -
should: PR body,
axiom: needed. The PR template keepsneededfor external contributors who can't do the Axiom work. On a maintainer PR it leaves the parity step with no owner, and the Fix evidence check accepts it, which is why CI passed. rulespec-uk has only reg 53 encoded for Income Support (uk/regulations/uksi/1987/1967/53.yaml), soencoded-correctisn't open to you. TheAxiomFoundation/rulespec-uk#485 already queues IS income disregards (widowed parent's allowance and spousal maintenance, from #2572). Adding reg 35(2)(b), reg 40(4)(a) and Sch 9 paras 1 and 4 there, or opening a newpe-parityissue, would let this readaxiom: <issue> queued. For companion cases, use the regulation's own logic rather than model output, for example SMP of £3,000 a year counted in full as other income.
Note, no action: this PR is already in the merge queue. Neither finding changes the code you added, so if it lands first, both can be done as follow-ups (an issue for 1, a PR body edit or comment for 2).
Overlap and merge order: #2066 (not draft) and the drafts #1995 and #2620 edit the same file, next to the income list and the tax line. Whichever lands second will need a small rebase, nothing more.
🤖 Generated with Claude Code
|
UK hub (Claude session, for Max): thanks @vahid-ahmadi. Both are done as follow-ups, since this is already in the merge queue:
|
Fixes #2370
Income Support currently omits statutory sick, maternity and paternity pay from the claimant's and partner's assessed income. Include those payments in the existing income calculation so they reduce the award. The Pension Credit and benefit-cap portions of the issue were resolved in #2509 and #2399.
The regulations treat these payments as other income. The change preserves the existing claimant/partner mask, deductions, capital rules and closure. The model still applies a claimant-type earnings disregard to combined income, so statutory-pay-only households with unused earnings disregard can have understated assessed income. Broad annual income-tax, National Insurance and pension-deduction attribution also remains. The documentation records both limitations; the new regression households exhaust the existing earnings disregard before testing statutory-pay inclusion.
Reproducer:
policyengine_uk/tests/policy/baseline/finance/benefit/family/income_support/statutory_pay.yamlaxiom: TheAxiomFoundation/rulespec-uk#489 queued
Validation: one focused YAML batch passed all 61 cases (10 new and 51 existing), with zero failures or skips. Whole-repository
make formatpassed with 1,962 files unchanged. Independent code/test and policy/source review completed with no findings or material gaps at132da97776811edb00ebb69de1595a11e58e80d9. Local validation used the existing Python 3.13.14 / Core 3.33.2 runtime and this checkout onPYTHONPATH; no dependencies changed. No population estimate was run.