Skip to content

Charge income tax on statutory paternity pay - #2368

Draft
MaxGhenis wants to merge 2 commits into
mainfrom
fix-spp-income-tax
Draft

MaxGhenis wants to merge 2 commits into
mainfrom
fix-spp-income-tax

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2367

What and why

ITEPA 2003 s. 660(1) Table A lists statutory paternity pay (SSCBA 1992 s. 171ZA or 171ZB) as a taxable UK benefit, with statutory sick pay and statutory maternity pay. employment_benefits added only SSP and SMP, so taxable_employment_income charged no income tax on statutory_paternity_pay. National Insurance already fell on it: ni_class_1_income adds all three.

Housing Benefit and Council Tax Reduction deduct all of a person's income tax and NI. They counted SSP and SMP as income, but not SPP. Every earnings definition in those schemes includes SPP:

So NI on SPP already raised those awards, and taxing SPP without counting it would raise them further. This PR:

  1. adds statutory_paternity_pay to employment_benefits, so income tax falls on it as on SSP and SMP;
  2. adds it to the income lists in housing_benefit_applicable_income and council_tax_reduction_applicable_income;
  3. updates the documentation and comments in housing_benefit_net_earnings and the specified-accommodation disregard. Both read employment_benefits, so they pick SPP up with no formula change. The CTR pensioner earnings disregard reads housing_benefit_net_earnings, so it does too.

The regulations leave no second reading: each scheme lists SPP in its earnings definition in terms.

Merge order

Merge after #2365. On main, uc_individual_earned_income_before_mif leaves out SSP, SMP and SPP. But uc_income_tax_on_earnings (which reads taxable_employment_income) and uc_national_insurance_on_earnings deduct the tax on them. So this PR alone would raise UC by 0.55 × 20p for each pound of SPP above the personal allowance (it already rises 0.55 × 8p through NI). #2365 counts the three payments as UC earned income (UC Regs 2013 reg 55(4)). Once #2365 is on main, add statutory_paternity_pay to TAXED_AS_WAGES in its test_uc_statutory_pay_properties.py, because the model now taxes SPP as wages.

Invariants

These hold for every input and are tested with Hypothesis in policyengine_uk/tests/test_statutory_paternity_pay_income_tax_properties.py. The generated families are singles and couples, with 0 to 3 children, in the four nations, with wages, profit, pensions, savings, dividends, pension contributions, Plan 2 loans and Marriage Allowance claims.

  1. Monotonic: raising a person's SPP never lowers their income tax or the family's. Exception: a Child Benefit opt-out can lower tax as income rises, for wages too, so generated families don't opt out.
  2. Bounds: without Marriage Allowance, each extra pound of SPP adds at most a pound to the family's income tax. ITA 2007 s. 55B(2)(b) withdraws the whole reduction above the basic rate, for wages too.
  3. Same as SSP: SPP of s gives every member the same income tax, NI, adjusted net income and student loan repayment as SSP of s. It also gives the family the same HB net earnings, HB and CTR applicable income, UC earned income and UC.
  4. Same as wages: SPP of s on top of wages e gives every member the same income tax, NI and adjusted net income as wages of e + s. This holds where wages and profit cover pension contributions: pension_contributions_relief caps relief at employment and self-employment income.
  5. Accounting: employment_benefits is SSP + SMP + SPP, and taxable_employment_income is max(0, wages + statutory pay − employment deductions).

Against main's variables, invariants 3, 4 and 5 fail, and so does the 20% example test. The monotonic property holds there trivially, because main doesn't tax SPP. All five pass on this branch.

Tests

YAML expected values are worked by hand from the published 2026-27 rates:

  • SPP £194.32 a week (SI 2002/2818 reg 2(a), as substituted by SI 2026/148 art 10(1)(a)), so two weeks is £388.64;
  • personal allowance £12,570, basic rate 20% to £50,270, higher rate 40% (gov.uk/income-tax-rates);
  • primary threshold £12,570 at 8% (gov.uk employer rates 2026-27).

New and extended files:

  • gov/hmrc/income_tax/bases/employment_benefits.yaml (new):
    • SSP, SMP and SPP sum to employment_benefits;
    • wages 30,000 + SPP 388.64 → tax 3,563.73;
    • wages 60,000 + SPP 388.64 → 11,587.46;
    • SPP alone → 0;
    • the same amount as SSP → 3,563.73.
  • housing_benefit_net_earnings.yaml:
    • SPP is earnings with the tax on it deducted (18,199.42);
    • SPP is earnings at pension age.
  • housing_benefit_applicable_income.yaml: SPP counts, less tax, NI and the £5 Sch 4 para 10 disregard (17,939.42).
  • housing_benefit_specified_or_temporary_accommodation_disregard.yaml: SPP alone makes the claimant an employed earner, and the disregard is capped at 388.64.
  • council_tax_reduction/council_tax_reduction_statutory_pay.yaml (new): SPP counts (18,199.42), the same as SSP.

9 of the 11 new YAML cases fail on main. The other 2 use SSP only and pass on both.

Commands run on this branch:

  • uvx ruff@latest format --check . (ruff 0.17.0) and ruff check .: clean.
  • The YAML suites for gov/hmrc, housing_benefit, local_authorities, universal_credit and employer_ni: 1,510 passed.
  • The full YAML suite: 3,019 passed. The 74 Python test files that touch statutory pay, HB, CTR or income tax (microsimulation tests excluded): 2,460 passed, 66 skipped, 1 xpassed. The xpass is the 2023 lower profits limit case in test_threshold_indexation.py (Class 4 lower profits limit is £11,908 in 2023-24; NICA 2022 s.2 sets £12,570 from 6 April 2023 #1968), which is unrelated.
  • The property file: 5 passed.

Impact

The certified enhanced FRS (uk-data 1.58.0) has no statutory_paternity_pay column, and uk-data's frs.py sets only SSP (sspadj) and SMP (smpadj). So survey aggregates are not expected to move, and the real run confirms it.

Two 2026 Microsimulations ran on the certified enhanced FRS (enhanced_frs_2024_25.h5, sha256 5ba399ea5ab9, 52,846 households): main 3f174d0 against this branch's model commit 626f020. Both ran from clean worktrees, through the machine-wide heavy lock. Every aggregate is identical:

2026, £bn Main Branch
statutory paternity pay 0.000 0.000
statutory sick + maternity pay 4.639 4.639
income tax 320.545 320.545
National Insurance 55.500 55.500
Universal Credit 83.589 83.589
Housing Benefit 8.482 8.482
Council Tax Reduction 2.160 2.160
household net income 1,710.908 1,710.908

No sample household's income tax, UC, HB, CTR or net income changes by more than 1p. Later commits change only tests and documentation. Scripts and outputs: ~/reviews/uk-spp-income-tax-2026-10-12/ (impact.py, run_all.zsh, compare.py, runs/).

Review

GPT-6.1 Sol reviewed b9922f5 and requested changes. Its one blocking finding: nothing enforced merging after #2365. It confirmed every legal citation and recomputed every YAML value.

Response (~/reviews/uk-spp-income-tax-2026-10-12/review/response_2368.md): this PR stays a draft until #2365 is on main. Then this branch merges main, adds SPP to #2365's TAXED_AS_WAGES, and adds a property that UC never rises with SPP. That property fails on a main without #2365. The non-blocking findings (citations and docstrings) are fixed in 9b97d3c.

Known gaps (follow-ups, not in this PR)

Reproducer: policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/bases/employment_benefits.yaml::Two weeks of statutory paternity pay are taxed with wages; policyengine_uk/tests/test_statutory_paternity_pay_income_tax_properties.py::test_statutory_paternity_pay_on_the_basic_rate_bears_20_percent

axiom: TheAxiomFoundation/rulespec-uk#460 queued (ITEPA 2003 s. 660, the HB reg 35 and CTR earnings provisions are not in the corpus; each returns 404)

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 11, 2026 21:33
ITEPA 2003 s. 660(1) Table A lists statutory paternity pay as a taxable
UK benefit with statutory sick and maternity pay, but employment_benefits
added only the latter two, so taxable_employment_income left SPP out.

Housing Benefit and Council Tax Reduction deduct all of a person's income
tax and NI but counted only SSP and SMP as income, although every scheme's
earnings definition includes SPP (HB Regs 2006 reg 35(1)(i), SPC reg
35(1)(i), NI equivalents; CTR SI 2012/2885 Sch 1 para 18(1)(j), SI
2012/2886, WSI 2013/3029, SSI 2012/319, SSI 2021/249). Count SPP there too,
so the tax on it does not raise those awards.

Fixes #2367

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hypothesis properties over generated singles and couples across the four
nations: income tax never falls as statutory paternity pay rises, and rises
by at most a pound per pound without Marriage Allowance; statutory paternity
pay is taxed and means-tested as the same amount of statutory sick pay, and
taxed as wages where wages and profit cover pension contributions; and
employment_benefits and taxable_employment_income add up. Four of the five
fail against main's variables.

Refs #2367

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

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Statutory paternity pay is not charged income tax

1 participant