Skip to content

Qualify targeted childcare through Pension Credit only on receipt of a guarantee credit - #1987

Draft
MaxGhenis wants to merge 7 commits into
mainfrom
targeted-childcare-gc-entitlement
Draft

MaxGhenis wants to merge 7 commits into
mainfrom
targeted-childcare-gc-entitlement

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #1956

Summary

Targeted (2-year-old) childcare listed the guarantee_credit amount as a qualifying benefit. This PR lists in_receipt_of_guarantee_credit instead, so the Pension Credit route needs a claim and a payment, as SI 2014/2147 reg 1(2) "eligible child" (a)(ii) needs entitlement.

Main has moved since #1956 was filed. #1896 (merged 2026-10-02) gave guarantee_credit defined_for = is_pension_credit_eligible, so working-age families no longer get a computed guarantee credit. That was the half of #1956 that moved money. What this PR still fixes: a Pension Credit eligible pensioner who does not claim Pension Credit qualifies through the computed amount on main.

in_receipt_of_guarantee_credit (on main from #1909, also read by the pensioner CTR rules) now also requires pension_credit > 0, with or without the Pension Credit freeze. A reform that stops Pension Credit being paid (for example by neutralising pension_credit) left receipt true. In the unreformed model this changes nothing (see impact).

The law

  • SI 2014/2147 reg 1(2), "eligible child" (text valid from 1 January 2026): a young child "whose parent is entitled to any one or more of the following— ... the guaranteed element of state pension credit under the State Pension Credit Act 2002;" (item (ii)).
  • SPCA 2002 s.1(2): "A claimant is entitled to state pension credit if— (a) he is in Great Britain; (b) he has attained the qualifying age; and (c) he satisfies— (i) the condition in section 2(1) (guarantee credit); ...". s.4(1A): "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" (from 15 May 2019, subject to the SI 2019/37 art 4 saving).
  • SSAA 1992 s.1(1): no person "shall be entitled to any benefit unless ... he makes a claim for it ... or ... he is treated ... as making a claim for it"; s.1(4)(ab) covers state pension credit, and SPCA s.17(1) construes "entitled" through it.

Household example (2026, North East)

Parent aged 68 with a State Pension of £10,000 and a 2-year-old, not claiming Universal Credit:

main (2efc8d8) this PR
Minimum guarantee (£12,376 + £3,638.96) £16,014.96 £16,014.96
Computed guarantee_credit £6,014.96 £6,014.96
Not claiming PC: pension_credit £0 £0
Not claiming PC: eligible / entitlement (child) true / £5,002.07 false / £0
Not claiming PC: household_net_income £16,428.62 £11,426.55
Claiming PC: eligible / entitlement (child) true / £5,002.07 true / £5,002.07

Enhanced FRS impact

Real runs of origin/main 2efc8d8 and this branch at ad8e55d on enhanced_frs_2024_25.h5 (sha256 e433e532…), one microsimulation per package covering 2025–2030. Weighted totals, float64 sums, exact array comparisons.

Scripts and outputs, kept in the author's evidence folder and not in the repo: impact/tce_impact.py (the runs), impact/tce_compare.py → impact/compare.json, impact/eligibility_flag_changes.py → impact/eligibility_flag_changes.txt (the lost-flag breakdown, built from the saved arrays; the script was saved after the first run and re-run with identical output), and out/household.py → out/household_main.json, out/household_branch.json (the household example).

Invariants (Hypothesis, test_targeted_childcare_guarantee_credit_properties.py)

Populations mix working-age, pension-age and mixed-age families with a 2-year-old, some with a dependent young person aged 16–19, across the four nations, in 2025, 2026 and 2029.

  1. Qualifying age: no benefit unit whose adults are all below the qualifying age qualifies through the Guarantee Credit route. Fails for the route as filed; holds on main since Replace generic child and adult flags with each programme's legal definitions #1896 and here.
  2. Route identity: eligibility = claims, England, not extended-entitlement eligible, and one route open.
  3. Receipt (unreformed): route open exactly when pension_credit and guarantee_credit are both positive; implies a claim and, for the generated families (none reports Pension Credit or pension-age Housing Benefit, so none has the SI 2019/37 saving), that the claimant and any partner are over State Pension age. A dependant aged 18 does not block it (one known family, and YAML Cases 12–13).
  4. Differential vs main: never adds eligibility; removes it exactly for eligible non-claimants with no other route.
  5. Not claiming Pension Credit closes the route and never makes a family eligible. Fails for the filed route and for main; holds here.
  6. Not claiming targeted childcare never leaves a family eligible.
  7. A reform that stops Pension Credit payments closes the route, with or without the freeze (fixed examples, not generated).
  8. Under the Pension Credit freeze the route follows the baseline receipt (fixed example, not generated).

A mutation test runs the filed and main routes through the same eligibility formula and checks that each breaks the invariant it was written against.

Tests

  • targeted_childcare_entitlement_guarantee_credit.yaml: 14 cases. Case 9 is a mixed-age couple without the SI 2019/37 art 4 saving (does not qualify); Case 14 is the same couple with the saving (qualifies: couple minimum guarantee £18,889 + £3,638.96 − State Pension £10,000 = £12,527.96 paid).
  • Adds in_receipt_of_guarantee_credit.yaml (not on main): Key the Housing Benefit Guarantee Credit passport on receipt #1927's six cases. Case 3's name and comment now describe main's inferred saving (Date the mixed-age couple Pension Credit exclusion and model the SI 2019/37 saving #1940), so the file is no longer byte-identical to Key the Housing Benefit Guarantee Credit passport on receipt #1927's; whichever merges second keeps this wording.
  • Local at ad8e55d: full YAML suite 2,109 passed; the property file 7 passed (234 s).
  • Mutants of in_receipt_of_guarantee_credit and the parameter: reverting the parameter entry, dropping the payment term, and making the freeze branch use the current formula each fail a test. Dropping would_claim_pc or is_pension_credit_eligible fails none: under the model's formulas a payment already implies both (pension_credit = entitlement × claim; entitlement and guarantee_credit are defined only for eligible units). They differ only when pension_credit or guarantee_credit is supplied as an input, so the terms stay as a guard.

Known departures (unchanged by this PR)

  • The SI 2019/37 art 4 saving is inferred from reported Pension Credit or pension-age Housing Benefit (has_mixed_age_couple_pension_credit_saving, from Date the mixed-age couple Pension Credit exclusion and model the SI 2019/37 saving #1940) unless set directly. A saved couple qualifies (Case 14).
  • The model does not distinguish entitlement from payment. In law they can differ, for example where SI 2002/1792 reg 13 makes a credit under 10p a week unpayable.
  • The model tests the benefit unit's claimant and partner, not "the child's parent".
  • would_claim_pc is the claim (a take-up draw in the Enhanced FRS).
  • Annual eligibility does not apply the statutory guidance A1.4 continuation, so a reform that closes a route overstates first-year losses for children already in a place.

Overlaps

Review

An independent reviewer approved head 314f457, and a second pass approved the follow-up commit c47e283 (the freeze-path payment check). A merge-only delta review of ad8e55d (the two merges of main) is pending. Their should-fix and nit findings are addressed above or listed under known departures; a follow-up for the same payment check on in_receipt_of_savings_credit_only is tracked separately.

Axiom

axiom: TheAxiomFoundation/rulespec-uk#400 queued (extension comment for reg 1(2) "eligible child" (a)(ii): law, required outputs, review_finding and companion cases G1–G6; SI 2014/2147 reg 1 is not yet in the corpus, so the signed encode waits on ingestion)

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 2, 2026 15:21
The 2-year-old entitlement listed the raw guarantee_credit amount as a
qualifying benefit. PolicyEngine computes that amount for every benefit
unit, so low-income working-age families and pensioners who do not claim
Pension Credit qualified through it. SI 2014/2147 reg 1(2) requires the
parent to be entitled to the guaranteed element of state pension credit,
and entitlement needs the qualifying age (SPCA 2002 s.1(2)(b)) and a claim
(SSAA 1992 s.1(1), (4)(ab)).

The entry is now in_receipt_of_guarantee_credit (Pension Credit eligible,
claims it, guarantee credit positive), the variable #1927 and #1909 add;
the file is byte-identical to theirs. Its YAML test is #1927's, also
byte-identical.

Fixes #1956

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tests with main

Main (#1896) now pays Guarantee Credit only within Pension Credit, so the
working-age half of #1956 is already fixed there. The targeted childcare
route still needs a claim: this branch keys it on
in_receipt_of_guarantee_credit, which #1909 put on main.

- in_receipt_of_guarantee_credit also requires pension_credit > 0, so a
  reform that stops Pension Credit being paid ends receipt (review finding:
  neutralising pension_credit left receipt true). No change in the
  unreformed model, where a positive guarantee credit for an eligible
  claimant is always paid.
- YAML: below-age cases now assert the minimum guarantee and a zero
  guarantee credit; add the 17/18-year-old dependant pair.
- Properties: compare the route as filed, main's route and the fix; add
  dependent young people and childcare take-up to the generator, a payment
  test and a mutation check that the earlier routes break the invariants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis force-pushed the targeted-childcare-gc-entitlement branch from 806859d to 2f93939 Compare October 2, 2026 19:36
…; fix saving and Savings Credit wording

Law review: the docs now separate the legal rule (entitlement: qualifying
age, SPCA s.4(1A) with the SI 2019/37 art 4 saving, a claim) from
PolicyEngine's receipt test; the art 4 saving is described as art 4
states it; the Savings Credit comment follows SPCA s.3(1). The receipt
YAML test is restored to #1927's blob (fe4b686) so the two PRs do not
conflict on it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ent departure plainly

Independent review: with gov.contrib.freeze_pension_credit on, the receipt
returned the baseline receipt without checking the payment, so a reform that
also stopped Pension Credit left receipt true. The freeze branch now
requires pension_credit > 0 as well; nothing changes while the frozen award
is paid. The docs say the model does not distinguish entitlement from
payment instead of claiming they differ only at the 10p rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 2 commits October 3, 2026 22:06
Resolve the in_receipt_of_guarantee_credit conflict with #1940: keep this
branch's payment check (also under the freeze) and take main's account of
the SI 2019/37 art 4 saving, which the model now infers. Update the tests
and docs that said the model omits the saving, and add a case for a saved
mixed-age couple with a 2-year-old.

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.

Targeted childcare qualifies working-age families through a computed Guarantee Credit

1 participant