Skip to content

Key the Housing Benefit Guarantee Credit passport on receipt - #1927

Open
MaxGhenis wants to merge 7 commits into
mainfrom
hb-gc-passport-receipt
Open

MaxGhenis wants to merge 7 commits into
mainfrom
hb-gc-passport-receipt

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Sep 30, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

housing_benefit_assessable_capital, housing_benefit_applicable_income and housing_benefit_tariff_income disregarded all capital and income whenever guarantee_credit > 0 for a family with someone over State Pension age. But guarantee_credit is computed whether or not the family claims Pension Credit (would_claim_pc, the dataset take-up draw or a household input), and whether or not PolicyEngine treats it as eligible (is_pension_credit_eligible, which is False for every mixed-age couple). So two groups were passported although PolicyEngine pays them no guarantee credit: pensioners who do not take up Pension Credit, and mixed-age couples with a continuing award. Their capital was ignored, and they kept Housing Benefit above the £16,000 capital limit.

For non-claimants this PR follows the law: with no claim there is no award, so no guarantee credit is received. For mixed-age couples it follows the model, not the law. PolicyEngine gives a mixed-age couple Housing Benefit only on a continuing award, which housing_benefit_eligible treats as standing in for the SI 2019/37 art 4 saving. A saved couple is not excluded by SPCA 2002 s.4(1A), so it may be entitled to a guarantee credit in law, and if it receives one, reg 26 passports it. But PolicyEngine's is_pension_credit_eligible omits that saving, so saved couples may be entitled in law although PolicyEngine pays them nothing. Until the saving is modelled (Not in this PR, follow-up 1), removing their passport is a known move away from the law.

2026, council tenant main this PR
Single aged 70, State Pension £10,000, savings £20,000, claims Pension Credit (Guarantee Credit £1,336 paid) capital £0, HB £6,240 unchanged
The same, does not claim Pension Credit (Guarantee Credit £1,336 computed, £0 paid) capital £0, HB £6,240 capital £20,000, over the limit: HB £0
Mixed-age couple 70 and 60 with a continuing award, claims Pension Credit, savings £20,000 (Guarantee Credit £7,849 computed; is_pension_credit_eligible False, because PolicyEngine omits the SI 2019/37 art 4 saving) capital £0, HB £6,240 capital £20,000: HB £0. This follows the model. In law, a couple saved by art 4 that is awarded the guarantee credit keeps the passport and HB £6,240.
Pensioner couple, State Pensions £9,800 each, savings £15,000, rent £7,800, a Guarantee Credit set to £500 but not claimed applicable income £0, HB £7,800 applicable income £20,120 against £19,934.20: HB £7,679.23
Single aged 90 on Savings Credit only (£892.22), savings £20,000 HB £0 (no passport) unchanged

The first three rows were rerun on origin/main 1c5b4d0 and on this branch on 2026-09-30.

Law

  • SI 2006/214 reg 26 (legislation.gov.uk), "Claimant in receipt of guarantee credit": "In the case of a claimant who is in receipt, or whose partner is in receipt, of a guarantee credit, the whole of his capital and income shall be disregarded." In force from 6 March 2006 and unamended. The Northern Ireland text is SR 2006/406 reg 24 (legislation.gov.uk), in the same words.
  • SI 2006/214 reg 2(1): "“guarantee credit” is to be construed in accordance with sections 1 and 2 of the State Pension Credit Act". Reg 2(5): "In these Regulations references to any person in receipt of a guarantee credit, a savings credit or state pension credit includes a reference to a person who would be in receipt thereof but for regulation 13 of the State Pension Credit Regulations 2002 (small amounts of state pension credit)." NI reg 2(5) is the same, citing the NI 2003 Regulations.
  • SPCA 2002 s.1(2)-(3) (legislation.gov.uk):
    • 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); or (ii) the conditions in section 3(1) and (2) (savings credit)".
    • s.1(3): "A claimant who is entitled to state pension credit is entitled— (a) to a guarantee credit, calculated in accordance with section 2 ...".
    • s.4(1A) (legislation.gov.uk): "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(1)-(2) (legislation.gov.uk):
    • art 4(1): "Subject to paragraph (2), the 2002 Act shall have effect as though section 4(1A) (exclusion of mixed-age couples from state pension credit) had not come into force in relation to a member of a mixed-age couple who, on the day before the appointed day and as part of that couple, is entitled to— (a) state pension credit; (b) housing benefit; or (c) state pension credit and housing benefit."
    • art 4(2): "The savings in the sub-paragraphs of paragraph (1) shall cease to have effect in relation to the member of the mixed-age couple referred to on any day after the appointed day when that person is not entitled to either state pension credit or housing benefit as part of the same mixed-age couple."
    • Art 3: "15th May 2019 is the appointed day". By art 2(3), references to entitlement to housing benefit are "to claims or entitlement under the Housing Benefit SPC Regulations only" (SI 2006/214).
  • UC (Transitional Provisions) Regs 2014 reg 6A(5) (legislation.gov.uk): the reg 6A(1) bar on Housing Benefit claims "does not apply to a claim for housing benefit where— (a) the claim is made by a member of a State Pension Credit Act couple who has reached the qualifying age for state pension credit and the other member has not reached that age; and (b) one of the savings in the sub-paragraphs of article 4(1) of [SI 2019/37] applies and the saving has not ceased to have effect under article 4(2) of that Order." housing_benefit_eligible lets a mixed-age couple have Housing Benefit only on a continuing award, and its comment says "For mixed-age couples the reported award stands in for the SI 2019/37 art. 4 saving (reg 6A(5))".
  • SSAA 1992 s.1(1) (legislation.gov.uk): "no person shall be entitled to any benefit unless, in addition to any other conditions relating to that benefit being satisfied— (a) he makes a claim for it ... or (b) he is treated by virtue of such regulations as making a claim for it". By s.1(4)(ab), "benefit" includes "state pension credit".
  • SPC Regs 2002 reg 13 (legislation.gov.uk): "Where the amount of state pension credit payable is less than 10 pence per week, the credit shall not be payable unless the claimant is in receipt of another benefit payable with the credit."
  • SI 2006/214 reg 43 (legislation.gov.uk): "the prescribed amount is £16,000". This is for SSCBA 1992 s.134(1) (legislation.gov.uk): "No person shall be entitled to an income-related benefit if his capital or a prescribed part of it exceeds the prescribed amount."

Reg 26 keys on receipt, not on a guarantee credit the family would get if it claimed. A guarantee credit is received only as part of an award of state pension credit, which needs entitlement under s.1 and a claim under SSAA s.1. PolicyEngine does not model the reg 13 minimum payment, so it pays every positive guarantee credit in an award, and reg 2(5) needs nothing more.

SPCA s.4(1A) excludes a mixed-age couple from state pension credit. Art 4 disapplies it for a member who was entitled to Pension Credit or Housing Benefit as that couple on 14 May 2019, until the saving ceases under art 4(2). is_pension_credit_eligible requires every adult to be over State Pension age and has no such saving. So for saved couples, PolicyEngine's receipt is narrower than the law's. All texts were read from legislation.gov.uk CLML on 2026-09-30.

Change

  • New variable. in_receipt_of_guarantee_credit (BenUnit, bool, in variables/gov/dwp/pension_credit/guarantee_credit/) is is_pension_credit_eligible & would_claim_pc & (guarantee_credit > 0).
    • Disregard guarantee credit recipients' income and capital in pensioner council tax reduction #1909 (pensioner Council Tax Reduction) added the same file, byte-identical (sha256 de434752…), and merged on 2026-10-01. This branch has merged main, so the file is no longer in this PR's diff; the HB call sites here read it from main.
    • Its documentation says that the model's Pension Credit eligibility omits the SI 2019/37 art 4 saving, so a saved mixed-age couple is not treated as in receipt.
    • Its references are SPCA 2002 ss.1-2, SSAA 1992 s.1 and SI 2019/37 art 4. The Housing Benefit provisions (reg 26, NI reg 24, reg 2(5)) are cited at the three HB call sites.
    • pension_credit is (guarantee_credit + savings_credit) × is_pension_credit_eligible × would_claim_pc (pension_credit_entitlement is defined_for is_pension_credit_eligible), and savings_credit is never negative. So the variable holds exactly when pension_credit > 0 and guarantee_credit > 0: the Pension Credit paid includes a guarantee credit. A property test checks this.
    • The two forms can differ only where pension_credit is supplied as an input rather than computed. The Enhanced FRS stores neither pension_credit nor guarantee_credit.
  • Pension Credit freeze (gov.contrib.freeze_pension_credit). pension_credit then returns the baseline simulation's value. The variable likewise returns the baseline receipt, because the frozen award is the baseline award, guarantee credit included.
  • The three HB formulas. housing_benefit_assessable_capital, housing_benefit_applicable_income and housing_benefit_tariff_income now test any_over_SP_age & in_receipt_of_guarantee_credit, not any_over_SP_age & (guarantee_credit > 0).
    • Receipt already implies every adult is over State Pension age (is_pension_credit_eligible). The any_over_SP_age guard is kept, so an input that sets receipt for a working-age family cannot passport it.
    • Each call site's comment quotes reg 26 (NI reg 24). It also notes that by reg 2(5), "in receipt" includes a person who would be in receipt but for SPC Regs 2002 reg 13 (the small-amounts rule), which PolicyEngine does not model.
    • In housing_benefit_tariff_income the passport is redundant: tariff income is computed from housing_benefit_assessable_capital, which is already 0 for a passported family. It is kept for parallelism with reg 26's "capital and income", and a comment says so.
  • No cycle. Nothing Pension Credit reads depends on Housing Benefit. The full YAML suite and the Enhanced FRS run complete, and pc_total_bn is unchanged.
  • One existing test gets an extra input. The passport case in housing_benefit_capital.yaml set guarantee_credit: 1 for a pensioner whose Pension Credit income is £14,160 (£10,000 plus £4,160 deemed from £50,000 of capital). That is above PolicyEngine's 2025 parameter for the minimum guarantee (£221.85 × 52 = £11,536.20), so no Pension Credit is paid and the case failed. It now also sets is_pension_credit_eligible: true, and its expected values are unchanged.
  • Docs. A paragraph on the passport in the Eligibility section of the Housing Benefit page, including the SI 2019/37 art 4 omission.

Invariants

These are property-tested in test_housing_benefit_guarantee_credit_passport_properties.py:

  1. in_receipt_of_guarantee_credit holds exactly when pension_credit > 0 and guarantee_credit > 0. So it implies is_pension_credit_eligible and would_claim_pc, and every adult in a receiving family is over State Pension age.
  2. For a receiving family, HB applicable income, tariff income and assessable capital are all 0.
  3. Differential against the old formula. The test swaps the old passport test in for in_receipt_of_guarantee_credit.
    • Where the family claims and is eligible for Pension Credit, every HB output is identical.
    • The passports differ exactly for families with someone over State Pension age and a computed guarantee credit that is not paid. There the old formula passports and this one does not (intended).
    • For a mixed-age couple saved by SI 2019/37 art 4, which is_pension_credit_eligible omits, that difference is a known departure from the law until the saving is modelled.
    • The new passport never holds where the old one did not.
  4. Metamorphic. Switching would_claim_pc from True to False never raises HB.
  5. Pension Credit freeze. Receipt is the baseline receipt. A reform that sets the single minimum guarantee to 0 keeps the £1,336 frozen award, the passport and HB £6,240. Without the freeze, the same reform ends the passport and HB is £0.

Setup: four family shapes (single pensioner, pensioner couple, mixed-age couple, single working-age) across council, housing association, private and owner-occupier tenures. Hypothesis runs with derandomize=True and 10 examples of up to 30 families each. Each Simulation builds its own tax-benefit system, so the old-formula swap in (3) cannot leak into the other tests.

Tests

  • New housing_benefit_guarantee_credit_passport.yaml, 10 cases. Values are hand-computed from the 2026 parameters: minimum guarantee £12,376 single and £18,889 couple; £1 a week per £500 (or part) over £10,000; aged allowance £13,312 single and £19,934.20 couple; taper 65%.

    1. The Bug 1 pensioner not claiming Pension Credit: capital £20,000 and tariff income £1,040 are counted; not eligible; HB £0.
    2. The same pensioner claiming: guarantee credit £1,336 paid, passported, HB £6,240.
    3. Pensioner couple, guarantee credit £500, not claimed. Tariff income £520 makes applicable income £20,120, so HB is £7,800 − 0.65 × £185.80 = £7,679.23. Without the tariff income, £19,600 is below the applicable amount.
    4. The same couple claiming: HB £7,800.
    5. Mixed-age couple 70/60 with a continuing award, claiming Pension Credit. is_pension_credit_eligible is False because PolicyEngine omits the SI 2019/37 art 4 saving, so no Pension Credit is paid; capital £20,000; HB £0.
    6. Savings Credit only (aged 90, £892.22): no passport; capital £20,000; HB £0.
    7. Guarantee credit couple with £30,000 capital (guarantee credit £6,809): passported; HB £7,800.
    8. Case 1 in Northern Ireland.
    9. Not claiming, capital exactly £16,000: counted, but not over the limit ("exceeds"); HB £6,240.
    10. Not claiming, capital £16,000.01: not eligible; HB £0.

    I ran the file on origin/main 1c5b4d0, minus the new variable's lines. Cases 1, 3, 5, 8, 9 and 10 fail there and 2, 4, 6 and 7 pass. Case 9 fails on main only on its capital and tariff outputs; its HB is £6,240 either way.

  • New pension_credit/guarantee_credit/in_receipt_of_guarantee_credit.yaml, 6 unit cases:

    • claiming;
    • not claiming;
    • mixed-age: no Pension Credit is paid, because of the art 4 omission, and the computed guarantee credit is not asserted;
    • Savings Credit only (£892.22);
    • couple;
    • income above the minimum guarantee.
  • Robust to the other two HB means-test fixes, in either order. Every tenant rents from the council, so the LHA cap order cannot matter. The two cases whose HB depends on applicable income set housing_benefit_applicable_income_disregard to 0, the value the earnings-disregard fix gives a family with no earnings. Cases 9 and 10 do not depend on it.

  • Mutation checks. Each mutated formula was run and the file restored. These ran at 2a507af, before cases 9 and 10 were added and before d8c24d9 removed the two mixed-age guarantee_credit assertions, so the counts are for the tests at that commit.

    • The old test guarantee_credit > 0 fails 4 of 4 properties and 6 YAML cases.
    • guarantee_credit > 0 & would_claim_pc fails 3 properties and 2 cases.
    • pension_credit > 0 fails 2 cases (Savings Credit only).
    • guarantee_credit > 0 & is_pension_credit_eligible fails 4 cases.
    • The independent review re-ran three mutants at 58ee875:
      • would_claim_pc & (guarantee_credit > 0) fails the 2 mixed-age cases and 2 of 4 properties.
      • Dropping the freeze branch fails the freeze property.
      • Dropping the tariff-income passport passes everything. It is an equivalent mutant (see Change).
  • Runs on this branch.

    • All HB and Pension Credit YAML, plus uc_legacy_mutual_exclusion.yaml, at d8c24d9: 129 passed, 0 failed.
    • Property tests at d8c24d9: 4 passed, in 152 s on a shared machine at load average ~80.
    • Full YAML suite, policyengine-core test policyengine_uk/tests/policy -c policyengine_uk, at 58ee875: 1,292 passed, 0 failed. d8c24d9 removes two assertions and changes comments, documentation, docs and the changelog; it adds or removes no case. CI's Test job runs the full suites on the head.
    • Non-microsimulation pytest, pytest policyengine_uk/tests -m "not microsimulation", at 8bad05c: 322 passed, 15 skipped, 30 deselected, 0 failed. Later commits change YAML files, comments, documentation, docs, the changelog and the property test file's docstring. That file was rerun above.
    • ruff format --check on the five changed Python files is clean.

Dataset impact (Enhanced FRS 2024-25, current weights, real runs of main vs this branch)

2026 main this PR change
Housing Benefit £14.227bn £13.804bn −£0.423bn
HB caseload (benefit units) 1,711.7k 1,631.3k −80.4k
wholly pension-age units £13.843bn / 1,664.4k £13.428bn / 1,584.7k −£0.415bn / −79.7k
mixed-age units £0.200bn / 19.3k £0.192bn / 18.6k −£0.008bn / −0.7k, a known move away from the law (see the caveats)
working-age units £0.184bn / 28.0k unchanged 0
Pension Credit / UC / Council Tax Reduction / benefit cap £6.989bn / £79.32bn / £2.35bn / £1.18bn unchanged 0
Household net income −£0.423bn (= HB change)
Poverty AHC, all / pensioners 18.66% / 10.81% 18.78% / 11.47% +0.11 pp / +0.65 pp
Poverty BHC, all / pensioners; AHC children 14.36% / 11.93%; 23.73% unchanged 0

Read the headline as a range: −£0.0014bn to −£0.423bn. Almost all of the −£0.423bn comes from one pension-age profile whose counted capital is mostly imputed corporate_wealth. Without corporate_wealth as HB capital, the fix moves HB by −£0.0014bn (see the caveats; #1837 raises the same question for UC). The change is a means-test correction. It is not progress on the gap between PolicyEngine's pension-age HB and DWP's outturn, which #1901 traced to the weights.

I re-ran the branch after switching to the shared formula form. All 39 per-benefit-unit output arrays are identical to the earlier run. The formulas have not changed since: d8c24d9 changed comments, documentation and references only. The independent review re-ran it and got identical arrays.

There are no gainers. HB recipients with a passport fall from 1,538.9k to 1,433.4k (−105.5k):

  • 86.2k are pension-age units that do not claim Pension Credit. 19.3k are mixed-age couples, whom is_pension_credit_eligible treats as not eligible.
  • 80.4k of them (79.7k pension-age, 0.7k mixed-age) lose all HB because their capital is over £16,000.
  • 0.6k (one mixed-age profile) lose part of it. The younger partner's income-related ESA counts as HB income and takes applicable income above the applicable amount. In law that income is disregarded (SI 2006/213 Sch 5 para 4; see Not in this PR).
  • 24.5k keep the same HB: their capital is at most £16,000 and their income at most the applicable amount.

Why the capital limit matters and the income side rarely does:

  • On PolicyEngine's 2026 parameters, the HB personal allowance without additions or premiums is at least the Pension Credit minimum guarantee: £256.00 against £238.00 a week single, and £383.35 against £363.25 for a couple.
    • Those HB rates are SI 2006/214 Sch 3 para 1(1)(b) and (2)(b) (legislation.gov.uk), for a single claimant "who has attained pensionable age before 1st April 2021" and a couple with "one member or both members who have attained pensionable age before 1st April 2021".
    • Para 1(1)(c) and (2)(c), inserted by SI 2021/188, set £238.00 and £363.25 for those who attained it on or after that date. Those rates equal the minimum guarantee.
    • PolicyEngine applies the higher rates to everyone; Split pension-age Housing Benefit allowances by when State Pension age was attained #1913 splits the cohorts. So "at least" holds under either.
  • For a pensioner whose only income is pensions and capital, HB counts no more income than Pension Credit does:
    • both use the same capital sources and the same £1-per-£500 rule over £10,000;
    • HB's household capital share (all adults) is at most Pension Credit's (pension-age adults);
    • both deduct income tax and National Insurance.
  • So a computed guarantee credit usually means income below the HB applicable amount. Losing the passport then changes the award only through the capital limit. In the run, every pension-age loser loses all their HB.

Caveats:

  • Thin sample. 8 records change. They are 4 distinct benefit-unit profiles, each appearing twice with identical values and different weights.
    • One pension-age profile accounts for £0.412bn of the £0.423bn and all of the pensioner-poverty change. It reports HB and no Pension Credit, has would_claim_pc False and a computed guarantee credit, and its counted capital is over £16,000.
  • The capital is mostly corporate_wealth.
    • In three of the four profiles, including the large one, 94% to 100% of the counted capital is corporate_wealth.
    • The HB capital-sources parameter description says datasets built before private pension wealth was split out of corporate_wealth still carry it in that bucket. This dataset has no private_pension_wealth column.
    • I reran main and this branch with corporate_wealth removed from the HB capital sources (one parameter changed, Pension Credit untouched). The fix then moves HB by −£0.0014bn: 2 records, the mixed-age ESA profile, which is itself a move away from the law (next caveat).
    • So almost all of the −£0.423bn depends on counting corporate_wealth as HB capital. What remains without it runs the wrong way until follow-up 2 lands. Exclude corporate_wealth from Universal Credit countable capital pending a pension split #1837 raises the same question for UC.
  • Mixed-age couples: a known move away from the law. PolicyEngine gives HB to a mixed-age couple only on a continuing award, which housing_benefit_eligible treats as standing in for the SI 2019/37 art 4 saving. Art 4(1)(b) saves a couple through Housing Benefit as well as through Pension Credit.
    • is_pension_credit_eligible omits the saving, so it pays these couples no Pension Credit. This PR follows the Pension Credit PolicyEngine pays, so it removes their passport.
    • 17.1k of the 19.3k mixed-age passport losers report receiving Pension Credit.
    • Both changed mixed-age profiles (−£0.008bn in all) move away from the law:
      • First profile (−£0.0068bn). The older partner reports Pension Credit and HB, would_claim_pc is True, and counted capital is over £16,000, mostly corporate_wealth. On main the computed guarantee credit passports its capital; on this branch it loses all its HB. If the couple is saved under art 4, as its reported Pension Credit and continuing award suggest, it can be awarded a guarantee credit, and reg 26 then disregards its capital, so main's award is the law's.
      • Second profile (−£0.0014bn). The FRS records both HB and income-related ESA against the younger partner. On this branch the ESA counts as income and is tapered. SI 2006/213 applies, and its Sch 5 para 4 disregards the whole income of a claimant on income-related ESA, so in law no income is tapered (see "Which HB instrument applies"). Main's untapered figure came from the computed guarantee credit, not from Sch 5 para 4.
    • Follow-up 1 in Not in this PR addresses the first profile, and follow-up 2 the second.
  • Weights and take-up. The weights were calibrated to an HB total under the old code, so a data rebuild will move these numbers. would_claim_pc is the dataset's take-up draw. None of the pension-age losers reports Pension Credit.

The scripts and outputs are in the research folder, not in this repo: dataset_impact.py and compare_impact.py (shared), diag_gc.py, diag_gc_reported.py, trace_gc_records.py and sensitivity_gc_corporate_wealth.py.

Not in this PR

axiom: SI 2006/214 reg 26 — TheAxiomFoundation/rulespec-uk#380 queued

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits September 30, 2026 08:46
housing_benefit_assessable_capital, housing_benefit_applicable_income and
housing_benefit_tariff_income disregarded all income and capital whenever
guarantee_credit was positive for a family with someone over State Pension
age. guarantee_credit is computed whether or not the family claims Pension
Credit (would_claim_pc) or can get it (is_pension_credit_eligible, false for
mixed-age couples). So pensioners who do not take up Pension Credit, and
mixed-age couples with a continuing Housing Benefit award, had their capital
ignored and kept Housing Benefit above the £16,000 capital limit.

SI 2006/214 reg 26 (NI SR 2006/406 reg 24) disregards the whole of the
capital and income of "a claimant who is in receipt, or whose partner is in
receipt, of a guarantee credit". The new in_receipt_of_guarantee_credit is
true when the Pension Credit paid to the benefit unit includes a guarantee
credit (pension_credit > 0 and guarantee_credit > 0). Under the Pension
Credit freeze it keeps the baseline receipt, because the frozen award is the
baseline award. The three Housing Benefit formulas now use it.

The existing passport case in housing_benefit_capital.yaml set
guarantee_credit 1 for a pensioner whose Pension Credit income exceeds the
minimum guarantee, so no Pension Credit was paid; it now also sets
is_pension_credit_eligible. Also documents the passport on the Housing
Benefit docs page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Local Housing Allowance fix rewrites the means-test line of the docs page,
so a note appended there would conflict.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1909 (pensioner Council Tax Reduction) adds the
same in_receipt_of_guarantee_credit file. Both branches now carry it
byte-identical, so either can merge first without a conflict.

Its formula, is_pension_credit_eligible & would_claim_pc &
(guarantee_credit > 0), equals the previous (pension_credit > 0) &
(guarantee_credit > 0) whenever pension_credit is computed: pension_credit is
(guarantee_credit + savings_credit) x is_pension_credit_eligible x
would_claim_pc, and savings_credit is never negative. The Enhanced FRS
stores neither pension_credit nor guarantee_credit, and a re-run gives
arrays identical to the previous run. The Housing Benefit formulas keep
their SI 2006/214 reg 26 comments.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pensioner not claiming Pension Credit with capital of exactly £16,000 keeps
Housing Benefit, since SI 2006/214 reg 43 and SSCBA 1992 s.134(1) bar
entitlement only where capital "exceeds" the prescribed amount; at
£16,000.01 there is no entitlement. Both fail on main, where the computed
guarantee credit passports the capital. The rulespec-uk companion tests use
the same two cases.

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

Copy link
Copy Markdown
Collaborator

Reviewed, and it looks right to me: approve with nits. I checked the law on legislation.gov.uk: SI 2006/214 regs 26, 2(5), 5(2) and 43; SR 2006/406 reg 24; SPCA 2002 s.4(1A); SSAA 1992 s.1(1); SPC Regs 2002 reg 13. I also hand-checked cases 1, 3, 6, 7 and 9. Locally, the HB and Pension Credit YAML tests pass (127), and so do the property tests (4). Merged together with #1926 there are no conflicts, and 136 pass.

  1. Please remove the survey record details from the description (licence). The "Dataset impact" section names a specific FRS benefit unit and its weight. FRS record-level data are licensed, so only aggregates should appear. The edit history keeps the old text, so it may be worth asking for that revision to be cleared too.
  2. Should fix (description): the aggregate headline is fragile. Almost all of the −£0.423bn comes from one record whose counted capital is mostly imputed corporate_wealth. Your own sensitivity without that source gives −£0.0014bn. I'd headline the range, link Exclude corporate_wealth from Universal Credit countable capital pending a pension split #1837, and not present it as progress on the pension-age HB calibration gap.
  3. Should fix (description): one legal claim is too strong. "Right on either reading" for the mixed-age couple where one partner gets ESA(IR) doesn't hold if reg 5(2) sends them to SI 2006/213. Under Sch 5 para 4 and Sch 6 para 5 of that SI, a claimant on UC, IS, JSA(IB) or ESA(IR) keeps the whole-income-and-capital disregard. I'd soften the wording and open a follow-up. The same gap exists already in housing_benefit_applicable_income.py:13-18.
  4. Follow-up: mixed-age couples who report Pension Credit. 17.1k of the 19.3k mixed-age units that lose the passport report receiving PC, which fits the SI 2019/37 art 4 saving. Modelling that saving in is_pension_credit_eligible (with pension_credit_reported as a proxy, as housing_benefit_eligible does with reported HB) would fix it properly.
  5. Nit: add SSAA 1992 s.1 and SI 2006/214 reg 26 to the references in in_receipt_of_guarantee_credit.py.
  6. Nit: in housing_benefit_guarantee_credit_passport.yaml, cases 3 and 4 set guarantee_credit: 500 as an input. The model would compute 0 there, so these cases test the receipt check only; a comment saying so would help.
  7. Nit: any_over_SP_age & is redundant at the three call sites, since receipt already implies it. It's harmless as a guard. targeted_childcare_entitlement/qualifying_benefits.yaml:14 still treats a computed Guarantee Credit as receipt (already noted as a follow-up).

The CI Test job was still pending when I looked.

MaxGhenis added a commit that referenced this pull request Sep 30, 2026
…4 saving)

Doc-only; the formula is unchanged. Keeps the file byte-identical with #1927.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SI 2019/37 art 4 disapplies SPCA 2002 s.4(1A) for a mixed-age couple
entitled to Pension Credit or Housing Benefit as that couple on 14 May 2019,
and PolicyEngine gives Housing Benefit to a mixed-age couple only on a
continuing award, which housing_benefit_eligible treats as standing in for
that saving. is_pension_credit_eligible omits the saving, so it pays those
couples no Pension Credit and the passport now drops for them, although in
law they may be entitled to a guarantee credit. The mixed-age test cases,
docs paragraph and changelog now say so instead of calling the change a
legal correction.

The two mixed-age cases no longer assert the computed guarantee credit,
which #1896 makes 0 for a family not eligible
for Pension Credit; their passport and Housing Benefit assertions stay.

in_receipt_of_guarantee_credit takes the shared v2 text also carried by
#1909: documentation and references only (SSAA 1992 s.1, SI 2019/37 art 4).
The three Housing Benefit call sites now cite reg 26, NI reg 24 and reg 2(5),
under which "in receipt" includes a person who would be but for SPC Regs 2002
reg 13, which PolicyEngine does not model. The tariff-income passport,
redundant with the zero assessable capital, is kept for parallelism with
reg 26's "capital and income" and says so. The capital test's comment calls
11,536.20 PolicyEngine's 2025 parameter, not the minimum guarantee.

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

Copy link
Copy Markdown
Collaborator Author

Overlap note from #1896: that PR also edits housing_benefit_assessable_capital.py. It allocates household capital among is_claimant_or_partner members rather than is_adult ones. It also makes Guarantee Credit zero outside Pension Credit eligibility (guarantee_credit gets defined_for = "is_pension_credit_eligible"), which removes a phantom Guarantee Credit capital passport for working-age and mixed-age families. Whichever merges second should keep the claimant-and-partner allocation and key the passport on receipt, as this PR does.

MaxGhenis and others added 2 commits October 1, 2026 09:52
Resolve the conflict in housing_benefit_assessable_capital: keep main's
person-level capital for the claimant and partner (Lifetime ISA), and
apply the Guarantee Credit receipt passport to the combined capital.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1909 added in_receipt_of_guarantee_credit.py with the same contents, so
the file drops out of this PR's diff.

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

Copy link
Copy Markdown
Collaborator Author

Thanks, Vahid. All seven points are handled:

  1. Record details: removed from the description. It now gives profiles and aggregates only. Deleting the old revisions from the edit history is queued for Max.
  2. Headline: now stated as a range, −£0.0014bn to −£0.423bn, depending on whether imputed corporate_wealth counts as HB capital, with Exclude corporate_wealth from Universal Credit countable capital pending a pension split #1837 linked. It no longer reads as progress on the calibration gap.
  3. "Either reading": replaced. For the ESA(IR) couple, the description now applies SI 2006/214 reg 5(2) → SI 2006/213, under which Sch 5 para 4 and Sch 6 para 5 disregard everything, and labels the change a move away from the law. Follow-up: Disregard the whole income and capital of HB claimants on IS, income-based JSA or income-related ESA (HB Regs Sch 5 para 4, Sch 6 para 5) #1993.
  4. Art 4 saving: documented as a model limitation in the description, the shared variable's docs and the test names. Modelling it is a separate follow-up, because it moves Pension Credit totals.
  5. References: SSAA 1992 s.1 and SI 2019/37 art 4 are in the shared file (now on main via Disregard guarantee credit recipients' income and capital in pensioner council tax reduction #1909). Reg 26, NI reg 24 and reg 2(5) are cited at the three HB call sites.
  6. Cases 3 and 4: commented that guarantee_credit and eligibility are inputs, so the cases test receipt only.
  7. any_over_SP_age: kept as a guard, as you suggest. It is redundant with receipt now, but Use the State Pension Credit qualifying age, and start-of-year status for Class 4 NI #1907 will turn it into the qualifying-age test. The childcare reader is listed as a follow-up.

The branch has merged main (no force-push), and #1909's identical file has dropped out of the diff. An independent round-2 review is running.

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Cross-reference from #2000 (fixes #1993, the SI 2006/213 Sch 5 para 4 / Sch 6 para 5 passport for Income Support, income-based JSA and income-related ESA).

  • Conflict. Both PRs edit the same two passport lines in housing_benefit_applicable_income.py and housing_benefit_assessable_capital.py. To resolve, whichever lands second keeps this PR's passported = any_over_SP_age & benunit("in_receipt_of_guarantee_credit", period) block, then Disregard the whole income and capital of Housing Benefit claimants on IS, income-based JSA or income-related ESA #2000's block, and returns where(passported | on_income_related_benefit, 0, ...) in both files. A scratch merge resolved that way passes the HB tests and was run on the Enhanced FRS.
  • Mixed-age couples on income-related ESA. Results are for 2026, Enhanced FRS, real runs.
    • On main, all 2.16k mixed-age HB recipients on ESA(IR) have nil applicable income. That is only because main's any_over_SP_age & guarantee_credit > 0 reads a guarantee credit computed for couples who cannot get Pension Credit.
    • This PR alone removes that, and cuts 0.60k of them by £1.42m in total (none to zero). This comes from two survey records, so the size is uncertain.
    • In law they keep maximum HB through SI 2006/213 reg 5(1)(b) and Sch 5 para 4 / Sch 6 para 5. With both PRs merged, every one of them has the same HB as on main (0 records differ).
    • The other mixed-age losers here (0.69k units, −£6.82m) are not on those benefits, so that is this PR's intended effect.

🤖 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.

2 participants