Repository navigation
Count statutory sick, maternity and paternity pay as Pension Credit earnings - #2509
Conversation
…arnings SPC Regs 2002 reg 17A(2)(h) and (i) make statutory sick, maternity and paternity pay earnings of an employed earner, and reg 15(1)(o) to (q) take them out of the social security benefits counted as income. Pension Credit earnings counted only employment and self-employment income, so it ignored them. Add the three existing variables to the earnings sources, so the Schedule VI earnings disregard applies to them, and fix the parameter's reference titles. The parameter description names the reg 17A(2) payments that have no variable (adoption, shared parental, parental bereavement and neonatal care pay). Housing Benefit counted statutory sick and maternity pay but not statutory paternity pay, which HB Regs 2006 reg 35(1)(i) and HB (SPC) Regs 2006 reg 35(1)(i) both make earnings. Add it to the Housing Benefit personal income list. YAML cases at the 2026-27 statutory rates (SI 2026/148). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2368 adds statutory paternity pay to the Housing Benefit and Council Tax Reduction income lists, with income tax on it. Drop the same Housing Benefit line and its two YAML cases here so the two PRs do not overlap; this PR now changes Pension Credit earnings only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2019 now measures net employed earnings from employment_income alone, and takes the income tax payable on them as the top-slice tax without anyone's employment income. Statutory sick, maternity and paternity pay are earnings of an employed earner (SPC Regs 2002 reg. 17A(2)(h) and (i)), so list them once, in gov.dwp.pension_credit.guarantee_credit.statutory_payments, and read the list in all three places that need employed earnings: pension_credit_earnings, the Sch VI disregard's net earnings, and the top-slice tax (whose branch now zeroes the statutory payments with employment income). earnings_sources is back to employment and self-employment income. Property tests: - drop the temporary point-count prints; - the Housing Benefit differential draws only SSP and SMP until #2368 counts statutory paternity pay in HB, and excludes savings-credit-only awards, whose HB income is the Pension Credit assessment plus the savings credit (HB (SPC) Regs 2006 reg 27); - the move-between-wages-and-pay property checks Pension Credit quantities only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the independent review of #2509: - Cases 8 to 11 pin how statutory pay runs through #2019's top-slice tax on earnings: tax wholly on the pay (8), only the tax the pay causes (9), self-employed profit taxed beneath the pay (10), and a couple whose partner's pay costs the claimant the marriage allowance (11). With the tax module as #2019 has it, Cases 8 to 10 fail. - Case 12: statutory sick pay is Savings Credit qualifying income (reg 9 does not exclude it). - The disregard and the top-slice tax read one helper, policyengine_uk/utils/pension_credit.employed_earnings_sources, so the list of employed earnings cannot drift between them. - Labels and documentation in pension_credit_earnings_income_tax now say employed earnings, not employment income; the parameter reference cites reg 15(1)(o) to (q), matching its description. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Hand-off to the UK hub (session local_87c93ea5, 2026-10-20).
|
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
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; components the model counts twice; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles; standard reform costings (change in gov_balance); standard reforms: change in each reform's target. Checks failing on both base and head (1)
Counted-once checkEach of 84 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
Components the model counts twice: 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
|
SPC Regs 2002 reg. 17A(2)(h) and (i) make statutory sick, maternity and paternity pay earnings of an employed earner, and reg. 17(10) deducts the tax payable on them as it is (not the notional tax reg. 17(11) gives self-employed earners). Under #2019's top-slice split (d1424), both counterfactual branches therefore zero the pay with employment income. Update #2019's branch-reuse expectation, in both parametrizations, to the employed-earnings keys this PR introduces, and give one non-dependant pensioner statutory sick pay so the shared-branch and calculation-order tests run with it present. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
UK hub build job: merged
|
|
Merged by the UK hub (session local_8e19f9d5, Opus 5.5) as
🤖 Generated with Claude Code |
Based on
main, now that #2019 has merged (1fac3a5);mainis merged in. Part of #1954; fixes the Pension Credit part of #2370.What was wrong
Statutory sick, maternity and paternity pay are earnings for Pension Credit, but
pension_credit_earningscounted only employment and self-employment income.pension_credit_incomestill deducted the income tax and National Insurance the model charges on those payments. So a claimant's Pension Credit rose with the tax on pay that the means test never counted.The law
Read from legislation.gov.uk (revised text,
/data.xml).Changes
gov.dwp.pension_credit.guarantee_credit.statutory_payments:statutory_sick_pay,statutory_maternity_pay,statutory_paternity_pay. The other reg 17A(2) payments have no variables; the description lists them.pension_credit_earningscounts the list with employment and self-employment income, each floored at nil as Count a loss on one source as nil in Pension Credit income and earnings #2259 does.pension_credit_income_tax_without_employment_incomeandpension_credit_income_tax_without_earnings) zeroes them together with employment income. The tax on statutory pay is therefore treated as tax payable on earnings (reg 17(10); d1424's reading). Both read one list,policyengine_uk.utils.pension_credit.employed_earnings_sources, and the labels now say employed earnings.earnings_sourcesis back to employment and self-employment income, with correct reference titles.employment_incomefrom FRSINEARNSand the statutory pay fromSSPADJandSMPADJ. The FRS 2024-25 methodology defines income from wages and salaries as gross pay "less ... any Statutory Sick Pay or Statutory Maternity Pay". This readsINEARNSas following that definition; the parameter tells users to leave statutory pay out of employment income.After #2019 merged: the earnings-tax counterfactual
#2019's final rounds added
test_pension_credit_tax_branch_reuse.py. It pins the two earnings-tax counterfactual branches to("employment_income",)and("employment_income", "self_employment_income"). With this PR, each branch also zeroes the three statutory payments. So both parametrizations failed CI on the merge withmain(run 39567653308: shard 2[pension_credit], shard 4[household_net_income]). The keys follow the law, so the expectation is updated, not the code. Read from legislation.gov.uk:Under #2019's top-slice reading (d1424 (a)), the tax on employed earnings is the fall in income tax when nobody has employed earnings. Statutory pay is employed earnings, so both branches must zero it:
Statutory pay is taxable (ITEPA 2003 s.660 Table A). The model taxes SSP and SMP; #2368 adds SPP.
test_pension_credit_tax_branch_reuse.pynow expects the employed-earnings keys in both parametrizations. Its fixture gives one non-dependant pensioner £500 of statutory sick pay, so the shared-branch and calculation-order tests run with the pay present.pension_credit_earnings_disregard.yaml,child_amount_tax_credit_award.yamlandtax_credits_pension_credit_passport.yaml, and its late-input, notional Class 2, passport and trading-loss modules. They pass unchanged (below).Tests
pension_credit_statutory_pay_earnings.yaml: 12 cases for 2026. Case 5, a dependant's pay not counting, passes on Apply the Pension Credit earnings disregards (SPC Regs 2002 Sch VI) #2019's head (d91b322); the others fail there.test_pension_credit_statutory_pay_properties.py(Hypothesis, derandomized): 3 properties, 36 s locally.pension_credit_income + pension_credit_earnings_disregard == housing_benefit_applicable_income + housing_benefit_applicable_income_disregard. Each side adds back its own earnings disregard, since SPC Sch VI and HB (SPC) Sch 4 differ. Statutory paternity pay is not drawn until #2368 counts it in HB.At 74b9d4a, stacked on Apply the Pension Credit earnings disregards (SPC Regs 2002 Sch VI) #2019 at d91b322: Apply the Pension Credit earnings disregards (SPC Regs 2002 Sch VI) #2019's own properties and loss tests (9) and its YAML files (
pension_credit_earnings_disregard.yaml33,pension_credit_earnings.yaml8,pension_credit_income.yaml10) passed.At 2cbd493, merged with
mainat 9d81a5d, run locally in the locked environment (uv sync --frozen --extra dev):gov/dwp/pension_credit/: 299 passed;pension_credit, includingtax_credits_pension_credit_passport.yamlandhousing_benefit_savings_credit_only.yaml: 460 passed;-n 4: 58 passed. They are this PR'stest_pension_credit_statutory_pay_properties.py, plus every module Apply the Pension Credit earnings disregards (SPC Regs 2002 Sch VI) #2019 added or changed:test_pension_credit_tax_branch_reuse.py,_earnings_disregard_properties,_late_inputs,_notional_class2,_child_amount_tax_credit_properties,_income_losses,test_tax_credits_pension_credit_passport_properties.py,test_trading_loss_properties.py,test_uc_non_dep_pension_credit.py,_prescribed_benefits_propertiesand_war_pension_properties;ruff format --check .: clean.PR CI runs the full suites at this head.
Impact
On the earlier merge with
main(base 1fac3a5, head 8379cd5), CI's aggregate-impact check on the Enhanced FRS 2024-25 found that no household's net income changes in any year from 2025-26 to 2031-32, and it flagged no moves. Since then, this push has merged latermain(9d81a5d) and changed one test. This PR's own model changes are the same as in that run. The check re-runs against the new base and posts here.Axiom
axiom: rulespec-uk#390 queued (Extension 5: reg 17A(2)(h)-(j) with reg 15(1)(o)-(r); reg 17A needs ingesting first)
Reproducer:
policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_statutory_pay_earnings.yaml::Case 1, a single pensioner's statutory sick pay is Pension Credit earnings.Reproducer:
policyengine_uk/tests/policy/baseline/gov/dwp/pension_credit/pension_credit_statutory_pay_earnings.yaml::Case 3, the earnings disregard applies once to employment income and statutory sick pay together.Reproducer:
policyengine_uk/tests/test_pension_credit_statutory_pay_properties.py::test_pension_credit_and_housing_benefit_assess_the_same_statutory_pay🤖 Generated with Claude Code