Skip to content

Move families onto Universal Credit when a legacy benefit they receive closes - #2119

Draft
MaxGhenis wants to merge 5 commits into
mainfrom
uc-claim-at-legacy-closure
Draft

MaxGhenis wants to merge 5 commits into
mainfrom
uc-claim-at-legacy-closure

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 3, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2118

Summary

Tax credits closed on 6 April 2025, and Income Support and income-based JSA on 1 April 2026. DWP moved each working-age family off its legacy benefits with one migration notice covering all of them. The awards ended when the family claimed Universal Credit, or at the notice's deadline if it did not claim. The model had no such step:

  • Universal Credit came only through would_claim_uc, which datasets draw without regard to legacy receipt. A legacy family that drew it false lost its tax credits from 2025-26 and got nothing in their place.
  • The family's other legacy awards carried on after the closure.

This PR adds the closure-time claim. It is the model half of PolicyEngine/policyengine-uk-data#492, which draws the new input at DWP's Move to Universal Credit claim rates.

Law

Read on legislation.gov.uk on 3 October 2026.

  • SI 2014/1230 reg 8: on a Universal Credit claim, tax credit awards terminate (8(2)), and Income Support and Housing Benefit awards terminate after a two-week run-on (8(2A)). It "does not apply in the case of a single claimant who has reached the qualifying age for state pension credit or in the case of joint claimants who have both reached" it (8(2B)). Housing Benefit for specified or temporary accommodation does not terminate (8(3)).
  • Reg 46: where a notified person has not claimed by the deadline day, "all awards of any existing benefits to which the person is entitled terminate". This covers Housing Benefit, Income Support, income-based JSA, income-related ESA and tax credits, with the same accommodation saving (46(2)).
  • Income-related ESA and income-based JSA end on a Universal Credit claim because the claim brings their abolition (Welfare Reform Act 2012 s.33(1)) into force for the claimant. SI 2025/1148 art 3A(3) states it most recently: the appointee saving "does not prevent the amending provisions from coming into force as a consequence of a claim for universal credit".

Change

  • would_claim_uc_at_legacy_closure (BenUnit, YEAR, bool input, default True like would_claim_uc): whether the family claims Universal Credit once its legacy benefits close. uk-data#492 draws it by legacy benefit combination at the Stat-Xplore claim rates; datasets without it get the default.
  • legacy_benefits_closed (BenUnit, YEAR, bool): DWP moved the family off its legacy benefits towards Universal Credit. It holds when:
    • the family reports tax credits and gov.dwp.tax_credits.active is false (from 2025), unless DWP sent it to Pension Credit instead. Pension Credit took families on Pension Credit, and families on Child Tax Credit but not Working Tax Credit that meet the Pension Credit age conditions: single or both pension age, or a protected mixed-age couple (SI 2019/167 art 3A(1)). Every other tax credit family got a Universal Credit migration notice, including pension-age and protected mixed-age families on Working Tax Credit (reg 44, reg 60A, DWP HB circular A9/2024 paras 5–14);
    • or the family reports Income Support or income-based JSA and that benefit's active parameter is false (from 2026), unless it is on Pension Credit or wholly pension age (reg 8(2B)).
  • claims_uc_at_legacy_closure = legacy_benefits_closed & would_claim_uc_at_legacy_closure.
  • claims_universal_credit (BenUnit, YEAR, bool) = would_claim_uc | claims_uc_at_legacy_closure. It replaces would_claim_uc in the five places that read it as "claims Universal Credit":
    • universal_credit and universal_credit_pre_benefit_cap (defined_for);
    • uc_has_deduction;
    • is_CTC_eligible. The rewrite also drops the old ~add(...) > 0 precedence trick; add returns a bool there, so the result is the same;
    • housing_benefit_eligible's continuing-award route.
  • is_uc_eligible admits a closure claimant on the Pension Credit route. A protected mixed-age couple claims jointly and gives up its saving (UC Regs reg 3(2)(a)). A pension-age Working Tax Credit recipient not on Pension Credit has the upper age condition waived (reg 60A).
  • left_pension_route_at_legacy_closure (BenUnit, YEAR, bool): a family on the Pension Credit route that DWP moved off legacy benefits leaves that route if it claims Universal Credit. A protected mixed-age couple also leaves it if it does not claim, because its Housing Benefit ends at the deadline and the saving with it (A9/2024 para 11). Housing Benefit's pension-age route and is_pension_credit_eligible honour it. A wholly pension-age family that does not claim keeps the route and can claim Pension Credit and Housing Benefit afresh.
  • All legacy awards end at the closure, whether or not the family claims (regs 8 and 46). The Housing Benefit continuing award, Income Support, income-related ESA and income-based JSA are zero once legacy_benefits_closed holds; tax credits (CTC and WTC) are masked too, so a reform that keeps tax credits open does not pay them alongside Universal Credit. A family on Child Tax Credit and Income Support therefore loses its Income Support in 2025-26, not at the Income Support closure.

Unchanged:

Not modelled:

Impact

These are real runs on the released Enhanced FRS 2024-25 (uk-data 1.57.4, sha256 03fe15e4…), comparing PE-UK main 325d585 (this branch's merge base) with this branch at 4313fbd. The dataset has no would_claim_uc_at_legacy_closure, so it takes the default (true). The figures are therefore the effect of this PR alone, before uk-data#492 (PolicyEngine/policyengine-uk-data#534).

£bn (thousand benefit units) 2024 2025 2026 2027
Universal Credit 0 +0.071 (+4.3k) +0.093 (+6.2k) +0.095 (+6.2k)
Housing Benefit 0 −0.013 (−2.0k) −0.019 (−2.9k) −0.020 (−3.0k)
Income Support 0 −0.063 (−9.1k) 0 (closed on main too) 0
Income-related ESA 0 −0.036 (−3.9k) −0.037 (−3.9k) −0.038 (−3.9k)
Pension Credit 0 0 0 0
Household net income 0 −0.041 +0.037 +0.038
People in AHC poverty 0 −6.7k −7.9k −7.9k
  • legacy_benefits_closed covers 191k benefit units in 2025 and 246k from 2026.
  • On round 1's head (e34b753, against main 6fa14dc), 63k of the 2025 units did not draw would_claim_uc. 54k of those have Universal Credit capital above £16,000 (tax credits had no capital test), so only 4.3k gain Universal Credit; see the reg 51 limitation above. That split was not re-run on this head.
  • Income Support and ESA fall for families that also reported tax credits; their awards now end with the tax credit closure.

Aggregates come from aggregates.py in the session's review folder, two full runs per head. The combined effect with uk-data#492's draw comes from seeded builds and is reported on PolicyEngine/policyengine-uk-data#534.

Invariants

Property-tested in policyengine_uk/tests/test_uc_legacy_closure_properties.py (Hypothesis, years 2024–2027). The generated families include working-age, pension-age and mixed-age families, with and without the SI 2019/37 saving, and every subset of reported legacy benefits and Pension Credit.

  1. Closure. legacy_benefits_closed holds exactly per the destination rule above.
  2. Claim. claims_universal_credit = would_claim_uc or (closure and flag), and no Universal Credit is paid without a claim.
  3. Migration ends legacy awards. Once closed: no tax credits, Income Support, income-related ESA or income-based JSA. No Housing Benefit either, unless the family is wholly pension age and does not claim. A family that leaves the pension-age route gets no Pension Credit.
  4. Exclusive. No family gets Universal Credit together with Pension Credit or Housing Benefit.
  5. Metamorphic. Negating the closure flag changes no benefit unless the family was moved and either does not claim anyway or is on the pension-age route. So 2024 never changes.
  6. Differential. A working-age family claiming at the closure gets exactly the benefits it would get with would_claim_uc true.
  7. Targeted. Families on tax credits and one other legacy award paid in 2024 lose that award in 2025.

Also 20 hand-checked YAML cases (tests/policy/baseline/finance/benefit/family/universal_credit/claims_universal_credit.yaml). They cover protected mixed-age couples on Working Tax Credit (claiming and not), a mixed-age couple on Child Tax Credit only, pension-age Working Tax Credit recipients (reg 60A, claiming and not), one on Pension Credit, and a reform that keeps tax credits open.

Mutation checks on round 1's head: each of these mutants failed at least one test file:

  • dropping the Housing Benefit, ESA, JSA or Income Support end;
  • ignoring the closure in claims_universal_credit;
  • dropping the pension-route exclusion;
  • reverting universal_credit's defined_for;
  • ignoring the tax credit closure.

The Income Support mutant was caught only by YAML at first; a targeted property test now covers it. On this head, removing the Working Tax Credit mask fails the reform YAML case.

All 2,020 policy YAML tests pass locally. One existing Childcare Grant case now pins legacy_benefits_closed: false, because tax credits closed in its year (2025) and it tests the Working Tax Credit overlap.

Review

  • Round 1 (GPT-6.1 Sol, e34b753): REQUEST_CHANGES. Protected mixed-age and pension-age Working Tax Credit families were wrongly kept off Universal Credit. Non-blocking: the tax credit reform mask, claims_universal_credit's wording, the Universal Credit notebook, and the reg 51 disclosure. All are addressed in 4313fbd.
  • Round 2: running on 4313fbd.

Interactions

axiom: SI 2014/1230 regs 8, 46 and 60A; SI 2019/167 art 3A: TheAxiomFoundation/rulespec-uk#433 queued

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 3, 2026 10:33
…e closes

Tax credits closed on 6 April 2025 and Income Support and income-based JSA
on 1 April 2026, but the model kept paying a family's other legacy awards
and paid Universal Credit only through would_claim_uc, which datasets draw
without regard to legacy receipt. A family that drew it false was left
with nothing once its tax credits stopped.

- would_claim_uc_at_legacy_closure: dataset input (default true) saying
  whether the family claims Universal Credit when its legacy benefits close.
- legacy_benefits_closed: a working-age family reports a legacy benefit that
  has closed (tax credits from 2025, IS and income-based JSA from 2026).
- claims_universal_credit: would_claim_uc, or the closure and the flag. It
  replaces would_claim_uc in universal_credit, universal_credit_pre_benefit_cap,
  uc_has_deduction, is_CTC_eligible and housing_benefit_eligible.
- Once a family's legacy benefits have closed, its Housing Benefit continuing
  award, Income Support, income-related ESA and income-based JSA end,
  whether or not it claims (SI 2014/1230 regs 8 and 46).

Years before any closure are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ge WTC migrants

Review r1 found that excluding every family on the Pension Credit route
left out families DWP moved to Universal Credit: protected mixed-age
couples and pension-age claimants on Working Tax Credit without Pension
Credit (SI 2019/167 art. 3A; SI 2014/1230 reg 60A; DWP HB circular A9/2024).

- legacy_benefits_closed now sends to Pension Credit only families on it,
  and families on Child Tax Credit but not Working Tax Credit that meet
  the Pension Credit age conditions (art. 3A(1)). IS and income-based JSA
  closures do not move wholly pension-age families (reg 8(2B)).
- claims_uc_at_legacy_closure: the closure claim.
- is_uc_eligible admits a closure claimant on the pension-age route: a
  protected mixed-age couple claims jointly, and a pension-age WTC
  recipient has the upper age condition waived (reg 60A).
- left_pension_route_at_legacy_closure: such a family leaves the route if
  it claims, or as a protected mixed-age couple loses its Housing Benefit
  and saving at the deadline; Housing Benefit's pension-age route and
  Pension Credit eligibility honour it.
- Tax credits (CTC and WTC) are masked for families moved off legacy
  benefits, so a reform keeping tax credits open does not pay them with UC.
- Documentation: claims_universal_credit's scope, the UC notebook's two
  claim routes and how to decline both.
- Tests: seven YAML cases for these routes and the reform; property tests
  now generate mixed-age couples, pension-age families and Pension Credit
  reporters, and check UC/PC and UC/HB exclusivity. The childcare grant
  overlap test pins legacy_benefits_closed false to keep testing the overlap.

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

Copy link
Copy Markdown
Collaborator Author

Status 02:45Z: head cf40b02 = 4313fbd (round-1 review fixes) + main merge, which brings main's read-only cache fixture fix for policyengine-core 3.32.16 (the earlier CI Test failure). The 2,109 policy YAML tests pass locally on core 3.32.16. Delta review r2 (Opus, 20261003-224153-mtuc-pe2119-review-r2c) is running; the hard-tier lanes had no capacity for 9 hours. After CI and an approving review, this merges on gates; PolicyEngine/policyengine-uk-data#534 and #1910 follow.

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.

Move families onto Universal Credit when a legacy benefit they receive closes

1 participant