Skip to content

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

Merged
MaxGhenis merged 16 commits into
mainfrom
tax-credits-pension-credit-passport
Oct 13, 2026
Merged

MaxGhenis merged 16 commits into
mainfrom
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.

The passport makes the tested income nil, and the two-year-old childcare criteria read that tested income. So this PR also splits out tax_credits_current_year_income, the income before the passport, and the childcare criteria now test that gross figure.

This PR was stacked on #2027, which switched the other passports to the claimant's and partner's awards. #2027 and the PRs beneath it (#2013, #2001, #1896) have merged. This branch has since merged main six times, at e89b8abcf, 4857dc75f, 97ef6e1af, 6d89338ab, ed7b42f95 and 1d3abecef. Only the first had a conflict, and it was mechanical: main (#2172) renamed the step-one component property_income to property_income_after_finance_costs, and the rename now sits in tax_credits_current_year_income, where this PR moved that calculation. #2061 and #2057 are stacked on this PR.

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): "In this Act “income” means income of any of the following descriptions—", with para (b) "working tax credit".

    • Child tax credit is named nowhere in s.15(1), nor among the descriptions SPC Regs 2002 reg 15(5) prescribes for para (j).
    • That working tax credit needs its own paragraph implies tax credits are not "prescribed social security benefits" under para (e). This is an inference, not a quote.
    • So CTC is not Pension Credit income, and in the model Pension Credit reads tax credits only through working_tax_credit.
  • 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 (art. 4(2)). From 8 June 2024 (SI 2024/604) there is one qualification (art. 4(3)-(4)). A member of such a couple who was issued a migration notice and became entitled to Universal Credit by claiming before the final deadline keeps the saving if they claim Housing Benefit or Pension Credit "within three months beginning with ... the day after their award of universal credit terminates": their days on Universal Credit are then disregarded.

  • SI 2014/2147 reg 1(2), "eligible child", as at 1 September 2024. The two-year-old offer covers a child whose parent is entitled to:

    • "child tax credit where that parent is not also entitled to working tax credit ... and has an annual gross income not exceeding £16,190", or
    • working tax credit "by virtue of an award which is based on an annual income not exceeding £16,190".

    SI 2025/1261 omitted these limbs from 1 January 2026.

  • WTC Regs 2002 reg 4(1), Second condition, second variation (a joint claim with no child). "The person" who works must be:

    • "aged at least 25 and undertakes work for not less than 30 hours per week"; or
    • "aged at least 60 and undertakes work for not less than 16 hours per week"; or
    • "aged at least 16 and undertakes work for not less than 16 hours per week and has a physical or mental disability which puts that person at a disadvantage in getting a job and satisfies regulation 9(1)(c)".
  • 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 whole joint award: CTC for their children, and WTC on either partner's work.

  • WTC's own conditions still apply to the person who works. With no child, that person must be at least 60 and work 16 hours, or be at least 25 and work 30 hours, or be at least 16, work 16 hours and have a disability that puts them at a disadvantage in getting a job and satisfies reg 9(1)(c).
  • With a child, the third variation adds the couple's 24-hour limb (one partner works 16 hours), and a 16-hour limb where the other partner is incapacitated, in hospital, in prison, or entitled to Carer's Allowance or to Scotland's carer's assistance.
  • The model pools those conditions across the couple: WTC eligibility pools the age, disability and hours conditions across a couple (WTC Regs 2002 reg 4(1)) #2042, found in review.
  • 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, on a day when they are entitled to neither Pension Credit nor Housing Benefit, cannot reclaim, so the passport ends and the income test returns. Art. 4(3)-(4), above, keeps the saving through a managed move to Universal Credit if they claim back within three months of that award ending.
  • Date the mixed-age couple Pension Credit exclusion and model the SI 2019/37 saving #1940, now on main and merged into this branch, dates s.4(1A) from 15 May 2019 and models the art. 4 saving (has_mixed_age_couple_pension_credit_saving). Because this PR reads pension_credit, a couple who keep Pension Credit under the saving get the passport with no further change. Two YAML cases cover the same couple without the saving (no Pension Credit, so the income test applies) and with it (Guarantee Credit and the maximum WTC).
  • 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 table assumes Pension Credit never rises with WTC. That holds in law: the guarantee credit falls by the whole of it (s.2(2)), and WTC is not qualifying income for the savings credit (SPC Regs reg 9(a)).

The model's savings credit counts WTC as qualifying income (#1954), so in the model it can rise 20p per £1 of WTC. That adds a fourth, model-only case: PC(Wt) = 0 < PC(Wmax), where both states are consistent and the model takes the passport. In law Pension Credit is nil either way. Reaching it needs income the model excludes from qualifying income (contributory ESA or JSA) alongside WTC above State Pension age. No 2024 Enhanced FRS family has both Pension Credit and tax credits, so none is affected.

"Entitled" is read as payable. At income exactly equal to the minimum guarantee, where no savings credit is payable, a nil guarantee credit gives no passport; this boundary has measure zero.

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, suffixed if that name is taken) in which tax_credits_applicable_income is set to 0, and removes the branch afterwards. It reads the branch's Pension Credit through its population, so a microsimulation returns an unweighted array. Main's uc_non_dep_receives_pension_credit (#2119) calculates Pension Credit in a branch of its own, uc_non_dep_pension_credit. The two nest in either order, at most two deep: a nested branch reads its parent branch's input, so it creates no further branch. Review r9 checked this with a probe that logged every branch created. 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.

Side effects of the rule:

  • Guarantee-credit-only claimants with WTC. Pension Credit withdraws £1 for each £1 of WTC, so the passport moves money from Pension Credit to WTC without changing the total. Pension Credit can't fall below nil, and the rule only passports where it stays payable. A claimant who also gets the savings credit can gain, because the model's savings credit can rise with WTC (below); review r2 found one gaining £158.67.
  • Savings credit claimants. The model's savings credit can rise with WTC (above), so their total can rise.
  • CTC. It is not Pension Credit income, so lifting the test raises CTC with no offset.
  • freeze_pension_credit. With Pension Credit frozen at its baseline, it no longer responds to WTC. A third-row family can then be passported under the reform, so WTC rises although Pension Credit is held fixed. This is consistent with the freeze, but it is a change to tax credits.

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 (2024-25 and earlier), so runs for 2025-26 onward pay nothing.

In 2024, measured on a copy of the Enhanced FRS (/usr/bin/time -l, separate processes):

2024 run core base → branch Time, base → branch Peak RSS, base → branch
household_net_income, then marginal_tax_rate 3.32.9 200a1cdc4 → f2eb82445 1.4 → 1.8 s, then 2.4 → 2.7 s 3.35 → 4.15 GB
labour-supply reform (elasticities 0.25 / -0.05, personal allowance £13,070) 3.32.9 200a1cdc4 → f2eb82445 10.7 → 10.0 s 5.13 → 7.67 GB
the same reform 3.32.12 200a1cdc4 → f2eb82445 7.5 → 8.0 s 5.10 → 5.15 GB
household_net_income, then marginal_tax_rate 3.32.13 e89b8abcf (main) → 12c38b592 5.9 → 5.2 s, then 11.1 → 9.6 s 2.94 → 2.98 GB
the labour-supply reform 3.32.13 e89b8abcf (main) → 12c38b592 26.7 → 29.7 s 5.23 → 5.26 GB

The extra memory on core 3.32.9 came from deep-copying every cached array into each branch. The labour-supply and marginal-tax-rate branches each create a passport branch of their own. policyengine-core 3.32.12 includes PolicyEngine/policyengine-core#556 (branches share arrays and copy on first read). #2054 has since raised PE-UK's floor to 3.32.12; on 3.32.13 the passport adds 0.03 to 0.04 GB. #2262 has since raised the floor and the lock to 3.32.27. A repeat there (4857dc75f → 7e68de22b) ran with the host's one-minute load average at 74 to 248 and is not comparable with these rows, so it is not reported. The lock is now 3.33.2, and the cost has not been measured again there.

  • The 3.32.13 rows ran while the host was heavily loaded (load average 23 to 33 on 18 cores), so their times are slower and noisier than the earlier rows and are not comparable with them; the memory figures are.
  • The labour-supply rows measure the cost of running the branches, not labour-supply results. This PR's impact numbers use no labour-supply responses.

Changes

  • tax_credits_current_year_income (new): the tax credit income before the passport (TCA 2002 s.7(4); SI 2002/2006 reg 3), moved out of tax_credits_applicable_income unchanged (with main's property_income_after_finance_costs).
  • tax_credits_applicable_income: that income, or nil while a prescribed benefit lifts the test. It now includes the Pension Credit passport (reg 4(1)(d)), with the reasoning above in a docstring. Comments record why the reg 4(1)(a)-(b) exceptions and reg 4(2) are not modelled.
  • meets_child_tax_credit_criteria_for_targeted_childcare_entitlement and meets_working_tax_credit_criteria_for_targeted_childcare_entitlement test tax_credits_current_year_income against £16,190.
    • Before this PR they read the tested income. That was already nil for IS, JSA and ESA families, but harmlessly so, since those benefits qualify for the offer in their own right.
    • The Pension Credit passport would have let a savings-credit-only family through. The regulation names only "the guaranteed element of state pension credit", so that family has no other route.
  • 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, with or without the SI 2019/37 saving) 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, the income test or household net income is requested first. No passport branch is left, at any depth.
  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.
  7. Childcare. A met tax credit criterion for the two-year-old offer implies gross income within £16,190.

Property 1 checks the branch against the same rule computed outside the formula. So it catches stale or leaked caches, but not a wrong rule; the YAML cases check the rule against the law.

Unit tests:

  • the passport under tracing, and nested inside the marginal tax rate's own branches;
  • in a Microsimulation, results match a Simulation, and the helper returns an unweighted array.

Income-related ESA is drawn only below State Pension age.

Tests

YAML: 11 cases in tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml, each computed by hand from the law and that year's rates, with the arithmetic in comments:

  1. guarantee credit with WTC: passported, with the maximum WTC counted;
  2. 2018-19: guarantee credit with WTC, passported;
  3. the third row;
  4. a pensioner with no Pension Credit;
  5. unclaimed Pension Credit;
  6. the savings credit alone, with CTC;
  7. the same couple with a grandchild aged 2: not eligible for the two-year-old offer, because gross income is £20,200. Their CTC is £3,455, with no family element: that needs a child born before 6 April 2017 (CTC Regs reg 7(2)(a));
  8. a mixed-age couple without the SI 2019/37 saving (the older partner, born on 6 January 1954, works the WTC hours): no Pension Credit, so the income test applies;
  9. the same couple with the saving: Guarantee Credit £4,298.40, and the maximum WTC, £4,935;
  10. 2025-26 with no awards, using the statutory £227.10 standard minimum guarantee (SI 2025/295 art. 29(2)(b));
  11. the parameter switched off.

Four intermediate values are entered at their statutory amounts, with comments. The model still gets three wrong for reasons unrelated to this PR:

The fourth, the 2025-26 standard minimum guarantee of £227.10 a week (case 10), was entered when the model had £221.85 (#1937). #1925, now on main, gives the model £227.10, and holds the family element at £545, so case 6's £545 entry also equals the model's value. Both entries stay, and their comments say so.

In each case the claimants have at least £300 of savings interest between them. That makes the model's tax credit income equal the law's: the law puts State Pension in step one (SI 2002/2006 regs 3, 5(1)(a)), where the interest uses up the £300 disregard, and the model counts State Pension in step two.

On main 1d3abecef, 7 cases fail and 4 pass:

  • cases 1, 2, 6, 7 and 10 fail on tax_credits_applicable_income (no passport);
  • case 9 fails because tax_credits_current_year_income is new;
  • case 11 fails because the parameter is new;
  • the four no-passport cases (3, 4, 5 and 8) pass on both.

On the first version of this PR (28eb7d2d4), the reviewer's probe of case 7's household was eligible, which was wrong.

Hypothesis: test_tax_credits_pension_credit_passport_properties.py has 6 tests: 3 properties (20 derandomized examples each), 2 unit tests (tracing and nesting; Microsimulation) and a coverage test.

  • In a derandomized draw of 60 examples of this head's strategy (217 families), 67 are passported through Pension Credit (11 with WTC raised, 6 with CTC raised) and 10 are third-row cases. Of the 56 couples with one partner aged at least 66 and one under 66, 11 are passported, all under the SI 2019/37 saving (9 with WTC raised).
  • Five of the YAML households (cases 1, 3, 6, 8 and 9) also run as explicit @examples of every property, and test_yaml_families_reach_every_case checks they hit each case, including the mixed-age couple with and without the saving.
  • All 6 pass at this head (9b36445d0), in CI and locally.

At this head (9b36445d0), CI passes the whole YAML suite (3,169 cases) and the three property files in this area: the passport (6), legacy award readers (12) and means-test income (1). Locally, ruff format --check is clean (ruff 0.17.0), the targeted YAML for gov/dwp, gov/dfe and finance/benefit passes (1,811 tests), and so do the three property files (19 tests).

Enhanced FRS impact

Real Microsimulation runs on a private copy of the Enhanced FRS 2024-25 (sha256 e433e532…), years 2024-2030:

Both trees were clean, each in its own environment on the locked policyengine-core 3.33.2. The earlier pairs also gave £0 in every year: base 200a1cdc4 against 284434ffc and f2eb82445; base fc1ff55d1 against 49e6a51aa; base e89b8abcf against 12c38b592; base 4857dc75f against 7e68de22b; base 97ef6e1af against 5bec0bb17; base 6d89338ab against bac104ba8; and base ed7b42f95 against 890470285. Main has changed since each of them, so their record counts can differ from those below. Tax credits are paid only in 2024 in the model; from 2025 the scheme is inactive.

Money: £0 in every year. All 105 arrays were compared: benefits, household totals including gov_spending and hbai_household_net_income, and poverty rates. The only arrays that change are:

  • tax_credits_applicable_income, now nil for Pension Credit recipients: 2,178 benefit-unit records in 2024, about 1.71 million weighted, 462 of them on the savings credit alone. It changes in every year, but tax credits are nil from 2025, so no amount moves.
  • In 2024, the two childcare tax credit criteria, which now test gross income instead of the tested income (see Changes). Each changes for fewer than 10 records; cells that small are not described further. targeted_childcare_entitlement_eligible changes for nobody.

Why no amount changes in 2024.

  • 306 benefit units would take up tax credits if eligible. 142 of them are eligible, and 83 are paid working or child tax credit.
  • None of the 142 is eligible for, entitled to or paid Pension Credit in the model, in the base or on the branch.
  • So no family has both Pension Credit and tax credits. No case on the third row or the model-only fourth row arises.

The H5 inputs and per-record arrays stay private; the summaries above are aggregates.

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. Tests 1-6 come from this PR's YAML; tests 7-8 (commencement dates and the reg 4(2) run-on) are law-only. It is linked from #416, whose tax credit item now defers to it.

The childcare change reads SI 2014/2147 reg 1(2)'s tax credit limbs on gross, pre-passport income. TheAxiomFoundation/rulespec-uk#400, which queues that regulation's Universal Credit route, is extended in a comment with:

  • the two tax credit limbs, verbatim;
  • their dates (WTC limb from 8 September 2014, CTC limb from 1 April 2018, both omitted from 1 January 2026);
  • the pre-passport reading;
  • three companion tests.

Related and follow-ups

Reproducer

Both cases fail on main 1d3abecef, where Pension Credit does not lift the income test, and pass at this head:

Reproducer: policyengine_uk/tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml::Guarantee Credit lifts the income test, with the maximum WTC counted as its income, policyengine_uk/tests/policy/baseline/gov/dwp/tax_credits_pension_credit_passport.yaml::Savings Credit alone lifts the income test for Child Tax Credit

🤖 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

MaxGhenis and others added 2 commits October 3, 2026 07:58
- The childcare case's grandchild, aged 2, was born after 6 April 2017, so
  there is no CTC family element (CTC Regs 2002 reg 7(2)(a)): CTC is £3,455.
- The 2025-26 case enters the statutory standard minimum guarantee, £227.10
  a week (SPC Regs reg 6(1)(b), SI 2025/295 art. 29(2)(b)); the model's
  value differs (#1937). Guarantee Credit is £3,469.20.
- Docstring: the nil-guarantee boundary applies where no savings credit
  is payable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rtner' into tax-credits-pension-credit-passport
@MaxGhenis
MaxGhenis changed the base branch from legacy-award-readers-claimant-partner to main October 9, 2026 22:23
MaxGhenis and others added 4 commits October 10, 2026 12:22
#2027 has merged, so this brings the branch up to main.

One conflict, resolved mechanically: main (#2172) renamed the step-one
component property_income to property_income_after_finance_costs in
tax_credits_applicable_income. This branch had moved that income
calculation, unchanged, into tax_credits_current_year_income, so the
rename now lands there and tax_credits_applicable_income keeps the
passport.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1940, now merged in from main, models the SI 2019/37 art. 4 saving, so a
mixed-age couple can get Pension Credit and with it the passport.

- YAML: the mixed-age case is now the couple without the saving (and
  asserts there is none); a new case gives the same couple the saving:
  Guarantee Credit £4,298.40 and the maximum WTC, £4,935, worked from the
  law in the comments.
- Properties: the pinned YAML households include that couple, and the
  strategy draws the saving, so mixed-age couples reach the passport in
  the random examples too.

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

At age 70 the default six months since the last birthday puts the older
partner's birth on 6 April 1954, too late to have reached the qualifying
age by 14 May 2019, which the SI 2019/37 saving's history needs. Nine
months puts it on 6 January 1954. The paired YAML cases and their pinned
Hypothesis families now say so; no expected amount changes.

The YAML header now describes the savings interest as it is: at least
£300 in each case, between the claimants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 10, 2026 18:16
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Status at c7dc585c4 (2026-10-10):

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 10, 2026 17:30
…redit-passport

Brings in #2259 (Pension Credit income losses), #2285 (a claimant is not
their own child or qualifying young person), #2248 and #2021. No conflicts.

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

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

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

Copy link
Copy Markdown
Collaborator Author

CI run cancelled to free runners (UK hub, 2026-10-11 23:30Z). The PolicyEngine org is at GitHub's limit of 60 concurrent jobs, with about 360 queued. Fleet ops asked the hub to let the Budget-critical #2305 take runners first. This PR's queued run had not started, so I cancelled it. Nothing is wrong with the PR.

Please don't re-run it or push just to retrigger CI. The hub re-runs this run itself once #2305 has runners. The record is ~/reviews/uk-hub/ci-yield-2026-10-11.json; see notice 17 in ~/reviews/uk-hub/notices.md.

MaxGhenis and others added 2 commits October 11, 2026 20:32
#1925 holds the CTC family element at £545 and sets the 2025-26 standard
minimum guarantee to £227.10, so case 6's family element and case 10's
minimum guarantee now equal the model's own values. The inputs stay; the
comments no longer say the model differs. Case 7's nil family element is
still needed (the model pays it for a child born on or after 6 April 2017).

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 13, 2026
Merged via the queue into main with commit 7d202ab Oct 13, 2026
15 of 16 checks passed
@MaxGhenis
MaxGhenis deleted the tax-credits-pension-credit-passport branch October 13, 2026 07:35
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.

Tax credit income test omits the State Pension Credit passport (SI 2002/2008 reg 4(1)(d))

1 participant