Skip to content

Lift the tax credit income test for State Pension Credit - #2034

Draft
MaxGhenis wants to merge 4 commits into
legacy-award-readers-claimant-partnerfrom
tax-credits-pension-credit-passport
Draft

MaxGhenis wants to merge 4 commits into
legacy-award-readers-claimant-partnerfrom
tax-credits-pension-credit-passport

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2032

Summary

tax_credits_applicable_income lifted the tax credit income test for Income Support, income-based JSA and income-related ESA, but not for State Pension Credit, which SI 2002/2008 reg 4(1)(d) also prescribes. This PR adds the Pension Credit passport.

Working tax credit is Pension Credit income, so Pension Credit and the passport depend on each other. The passport is decided on the Pension Credit payable with the passported award counted, calculated in a core branch.

Stacked on #2027 (legacy-award-readers-claimant-partner, head 200a1cdc4), which switched the other passports to the claimant's and partner's awards. #2027 is stacked on #2013, #2001 and #1896.

Law (fetched verbatim from legislation.gov.uk /data.xml, 2026-10-02)

  • TCA 2002 s.7(2): "Subsection (1) does not apply in relation to the entitlement of a person or persons to a tax credit for so long as the person, or either of the persons, is entitled to any social security benefit prescribed for the purposes of this subsection in relation to the tax credit."
  • SI 2002/2008 reg 4:
    • (1): "Subject to paragraph (2), the following are social security benefits prescribed for the purposes of section 7(2) of the Act in relation to child tax credit and working tax credit— (a) income support ... other than income support to which a person is entitled only by virtue of regulation 6(2) and (3) of the Income Support (General) Regulations 1987; ... (c) an income-based jobseeker's allowance ...; (d) state pension credit within the meaning of the State Pension Credit Act 2002 or the State Pension Credit Act (Northern Ireland) 2002; (e) an income-related employment and support allowance ..."
    • (2): "Paragraph (1) shall not apply in relation to working tax credit during the four-week period described in regulation 7D of the Working Tax Credit (Entitlement and Maximum Rate) Regulations 2002 (ceasing to undertake work or working for less than 16 or 30 hours per week)."
    • Reg 4(1)(d) was added from 26 November 2003 (SI 2003/2815 reg 18), and reg 4(2) from 6 April 2010 (SI 2010/751 reg 17(2)).
  • SPCA 2002 s.1(3): a claimant entitled to state pension credit is entitled "(a) to a guarantee credit ... or (b) to a savings credit ... (or to both ...)".
  • SPCA 2002 s.15(1)(b): income includes "working tax credit". SPC Regs 2002 reg 15(1) does not prescribe child tax credit, so CTC is not Pension Credit income.
  • SPCA 2002 s.4(1A), from 15 May 2019: "A claimant is not entitled to state pension credit if he is a member of a couple the other member of which has not attained the qualifying age." SI 2019/37 art. 4 saves it for a mixed-age couple entitled to Pension Credit or Housing Benefit on 14 May 2019, until a day on which they are entitled to neither.
  • IS Regs 1987 reg 6. As at 6 April 2003, paras (2) and (3) said a lone parent who started remunerative work after 26 weeks on Income Support or income-based JSA "shall not be treated as engaged in remunerative work for the period of 14 days" (the lone parent run-on). SI 2003/1589 reg 2(a)(i) omitted paras (2) and (3) from 25 October 2004.

The questions

Any Pension Credit, or only the guarantee credit? Any. Reg 4(1)(d) names "state pension credit within the meaning of" the Act, and s.1(3) makes that a guarantee credit, a savings credit or both. The passport reads pension_credit (both credits, after take-up), not guarantee_credit. A test covers a couple on the savings credit alone.

Entitled, so claimed. There is no entitlement to a benefit without a claim (SSAA 1992 s.1(1), (4)(ab)). pension_credit applies would_claim_pc, so unclaimed Pension Credit gives no passport, as income_support does for Income Support.

Mixed-age couples. A couple claims tax credits jointly, and reg 4 lifts the test if "either of the persons" is entitled to Pension Credit. So the older partner's Pension Credit passports the couple's joint award, including CTC for their children and WTC on the younger partner's work.

  • From 15 May 2019, s.4(1A) bars Pension Credit for a mixed-age couple unless the art. 4 saving applies. A couple who lose the saving (a day with neither Pension Credit nor HB) cannot reclaim, so the passport ends and the income test returns.
  • On this base, is_pension_credit_eligible applies s.4(1A) in every year and does not model the art. 4 saving. So the model never gives a mixed-age couple Pension Credit, and so never the passport; a test covers this.
  • Date the mixed-age couple Pension Credit exclusion and model the SI 2019/37 saving #1940 dates s.4(1A) from 15 May 2019 and models the saving. Because this PR reads pension_credit, a couple who get Pension Credit under Date the mixed-age couple Pension Credit exclusion and model the SI 2019/37 saving #1940 get the passport with no further change.
  • Tax credits ended on 5 April 2025, so the interaction is confined to 2024-25 and earlier. The model's tax credit thresholds start in 2016-17.

The reg 4(1)(a) exception (IS Regs 1987 reg 6(2)-(3)). No modelling is needed. It excluded Income Support paid only under the 14-day lone parent run-on. Those paragraphs were omitted from 25 October 2004, so no one has been entitled to Income Support "only by virtue of" them since then. That is long before the model's first tax credit year. The model has no Income Support run-on in any case.

Reg 4(2), the WTC four-week run-on. Not modelled. During the reg 7D run-on, which starts when the claimant stops work or drops below the hours condition, the passport does not apply to WTC (CTC stays passported). The model's WTC is a whole-year award on the year's hours, with no run-on period. working_tax_credit_run_on is a whole-year flag read only by the targeted childcare criteria. Using it to switch the WTC passport off for a whole year would overstate a four-week rule 13-fold. The code comment records this.

The dependency cycle, and which state the model picks

Pension Credit counts working tax credit as income (s.15(1)(b)), and the tax credit income test reads Pension Credit (s.7(2)). The law gives no tie-break. Write Wmax for the passported (maximum) WTC award, Wt for the income-tested one, and PC(W) for Pension Credit computed with WTC W. Then:

Case Consistent states Model
PC(Wmax) > 0 passported, only passport; WTC Wmax, Pension Credit PC(Wmax)
PC(Wt) = 0 income-tested, only no passport
PC(Wmax) = 0 < PC(Wt) none: lifting the test ends Pension Credit, which restores the test no passport; WTC Wt, Pension Credit PC(Wt)

The rule is: the passport holds when Pension Credit stays payable with the passported award counted. pension_credit_with_passported_tax_credits computes this in a core branch (tax_credits_pension_credit_passport) in which tax_credits_applicable_income is set to 0, and removes the branch afterwards. Where the passport holds, the simulation's own WTC, CTC and Pension Credit equal the branch's. So the model never shows a passport alongside nil Pension Credit. The third row is the only case in which Pension Credit is paid without the passport. It needs WTC, since CTC is not Pension Credit income.

Two side effects of the rule:

  • For a guarantee credit claimant with WTC, Pension Credit withdraws £1 for each £1 of WTC. The passport moves money from Pension Credit to WTC without changing the total, until Pension Credit reaches nil.
  • CTC is not Pension Credit income, so lifting the test raises CTC with no offset.

Years with no awards. From 2025-26, gov.dwp.tax_credits.active is false and every tax credit is nil, so the passported and income-tested states coincide. pension_credit is read directly, with no branch. To keep that free of a cycle, wtc_entitlement returns nil before reading the income test when tax credits are inactive. Its value is unchanged: it was already nil through tax_credits. A Pension Credit recipient's tax_credits_applicable_income is therefore 0 in those years too. That keeps the variable's meaning the same in every year; no amount changes.

Cost. The branch is created only in years with awards, so 2025-26 onward runs, which are most runs, pay nothing. See the impact section for the 2024 timing.

Changes

  • tax_credits_applicable_income: the Pension Credit passport (reg 4(1)(d)), with the reasoning above in a docstring. Comments record why the reg 4(1)(a) exception and reg 4(2) are not modelled.
  • wtc_entitlement: returns before the income test when tax credits are inactive (no change in value).
  • New parameter gov.dwp.tax_credits.means_test.pension_credit_passport: false from 6 April 2003, true from 26 November 2003. It records the commencement and lets a reform switch the passport off.

Invariants (property-tested, Hypothesis)

For any family of one or two adults aged 40-90 (mixed-age couples included) and up to two children, with earnings, hours, State Pension, private pension, savings, WTC and CTC claims, Pension Credit take-up and income-related ESA:

  1. Differential. In 2024-25, the passport holds exactly when an independent simulation, with tax_credits_applicable_income entered as 0, pays Pension Credit. Otherwise the applicable income equals the value with the parameter switched off.
  2. Consistency.
    • Where Pension Credit gives the passport, the simulation's own WTC, CTC and Pension Credit equal the passported simulation's.
    • Where it does not, they equal the values with the passport switched off.
  3. No harm. Lifting the test never lowers WTC or CTC.
  4. Third row only. Pension Credit is paid without the passport only where the passported WTC exceeds the income-tested WTC. So a family with no WTC is passported whenever it gets Pension Credit.
  5. Order. Results are the same whether Pension Credit or the income test is requested first, and the branch is removed after each calculation.
  6. No-award years. In 2025-26 tax credits are nil, Pension Credit equals its passport-off value, and the test is lifted exactly when Pension Credit is payable, with no cycle.

A unit test runs the passport under tracing and nested inside the marginal tax rate's own branches.

Tests

YAML: 8 cases in tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml, each computed by hand from the law and the 2024-25 (or 2025-26) rates, with the arithmetic in comments:

  1. guarantee credit with WTC: passported, with the maximum WTC counted;
  2. the third row;
  3. a pensioner with no Pension Credit;
  4. unclaimed Pension Credit;
  5. the savings credit alone, with CTC;
  6. a mixed-age couple;
  7. 2025-26 with no awards;
  8. the parameter switched off.

Three intermediate values the model gets wrong for unrelated reasons are entered at their statutory amounts, with comments:

Each pensioner has £300 of savings interest. That makes the model's tax credit income equal the law's, which puts State Pension in step one with the £300 disregard (SI 2002/2006 regs 3, 5(1)(a)).

On the base 200a1cdc4, the three passport cases fail on value and the switched-off case fails because the parameter is new. The four no-passport cases pass on both.

Hypothesis: test_tax_credits_pension_credit_passport_properties.py has 3 properties (20 derandomized examples each), the unit test and a coverage test.

  • In a derandomized sample of 236 drawn families, 55 are passported through Pension Credit (11 with WTC raised) and 1 is a third-row case. No random family has CTC raised.
  • So the YAML households also run as explicit @examples of every property, and test_yaml_families_reach_every_case checks they hit each case.
  • All passed on 28eb7d2d4; the explicit examples and the coverage test pass on 284434ffc.

Full suites: PENDING.

Enhanced FRS impact

PENDING: real Microsimulation runs on a private copy of the Enhanced FRS 2024-25, base 200a1cdc4 against this branch, 2024-2030.

Axiom

axiom: TheAxiomFoundation/rulespec-uk#419 queued

TCA 2002 s.7 and SI 2002/2008 reg 4 are not in the corpus (checked axiom-corpus origin/main 2c86dc9af: TCA s.8 and SI 2002/2008 regs 7 and 9 are, as discovery entries), so the encoder path is blocked. rulespec-uk encodes SPCA 2002 ss.1-3 and SPC Regs reg 15, but s.1 defers Pension Credit entitlement. #419 holds the verbatim law, the required outputs, a pasteable review_finding and eight companion tests taken from this PR's YAML. It is linked from #416, whose tax credit item now defers to it.

Related and follow-ups

🤖 Generated with Claude Code

TCA 2002 s.7(2) lifts the tax credit income test while the claimant or
either joint claimant is entitled to a prescribed benefit, and SI 2002/2008
reg 4(1)(d) prescribes State Pension Credit (from 26 November 2003). The
model passported Income Support, income-based JSA and income-related ESA
but not Pension Credit.

Pension Credit counts working tax credit as income (SPCA 2002 s.15(1)(b)),
so reading Pension Credit from the income test is circular. The passport is
taken from Pension Credit calculated in a core branch in which the income
test is lifted: it holds when Pension Credit stays payable with the
passported award counted, and the simulation's own award and Pension Credit
then equal the branch's. In years with no tax credit awards Pension Credit
is read directly; wtc_entitlement returns before the income test in those
years, so there is no cycle.

Reg 4(1)(d) covers either credit (SPCA 2002 s.1(3)). The reg 4(1)(a)
exception (IS Regs 1987 reg 6(2)-(3), the lone parent run-on) is spent from
25 October 2004, and reg 4(2) (the WTC four-week run-on) has no period in a
whole-year award; both are documented, not modelled.

Adds gov.dwp.tax_credits.means_test.pension_credit_passport, YAML tests
hand-computed from the law, and Hypothesis properties (differential against
a passported simulation, consistency, no-harm, request-order independence,
and the no-award years).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Random draws passport through Pension Credit often (55 of 236 families in a
derandomized sample) but never raise CTC and hit the third row once. The
YAML households now run as explicit examples of each property, and a test
checks that they reach every case: WTC and CTC raised by the passport, the
third row, and a mixed-age couple.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #2034 (Subfleet job 20261002-020316-tc-pc-passport-review-r1c):

- The two-year-old childcare criteria read tax_credits_applicable_income,
  which the passport zeroes, so a savings-credit-only family with CTC
  passed the £16,190 "annual gross income" limit (SI 2014/2147 reg 1(2))
  whatever its income. Split out tax_credits_current_year_income (TCA 2002
  s.7(4); SI 2002/2006 reg 3); the applicable income is that or nil, and
  both childcare criteria read the gross figure.
- YAML case 6 relied on is_WTC_eligible pooling age and hours across the
  couple (#2042): the older partner now does the work, with the same
  figures.
- Read the branch's Pension Credit through its population, so a
  microsimulation returns an unweighted array, and take a branch name in
  use by no other branch.
- Docstring: the rule's premise (Pension Credit never rises with WTC in
  law), the model-only case its savings credit creates (#1954), and the
  nil-guarantee boundary. Comment covers reg 4(1)(b).
- Tests: a childcare case, a 2018-19 case, a Microsimulation test, a
  household-net-income-first request order, a childcare property, and
  income-related ESA drawn only below State Pension age.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The targeted childcare tax credit criteria now read
tax_credits_current_year_income (the "annual gross income" of SI 2014/2147
reg 1(2)), so their tests enter that instead of the passported
tax_credits_applicable_income. Expectations are unchanged.

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

Copy link
Copy Markdown
Collaborator Author

The case "The passport does not bring a family under the childcare gross income limit" (tax_credits_pension_credit_passport.yaml, line 244 at 29891b0b5) has a grandchild aged 2 in 2024-25, so born after 6 April 2017. CTC Regs 2002 reg 7(2)(a), from 6 April 2017, pays the family element only for a child or qualifying young person born before that date. So in law the CTC is the £3,455 child element alone, not CTC_family_element: 545 and child_tax_credit: 4_000. The passport and childcare outcomes the case tests are unchanged.

#2057 (stacked on this) had copied the same input and now enters CTC_family_element: 0 with child_tax_credit: 3_455. #2051 adds the born-before-2017 rule to the model. The case at line 194 (grandchild aged 10) is right as it is.

🤖 Generated with Claude Code

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.

1 participant