From 1e66b422ab11515923b2f4bdbdaf905f8204cc82 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 30 Sep 2026 11:22:28 -0400 Subject: [PATCH 1/9] Give pension-age HB and CTR the severe disability premium Pension Credit uses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Pension Credit minimum guarantee included the severe disability addition for an Attendance Allowance recipient, but the Housing Benefit and Council Tax Reduction applicable amounts took the legacy severe disability premium, which tests a narrower tax-credit disability flag (DLA care highest rate, PIP daily living enhanced rate). Guarantee Credit passports HB to its maximum, so the gap only showed when GC ended: a single pensioner on AA lost £2,040.52 of net income when private pension rose from £11,900 to £12,000. HB(SPC) Regs 2006 Sch 3 paras 6 and 12(1) and the pensioner CTR schedules give the severe disability premium the same qualifying benefits, conditions and amounts as SPC Regs Sch I para 1 and reg 6(5), and have no adult disability or enhanced disability premium. At pension age benefits_premiums is now the Pension Credit severe disability addition plus the carer premium. Co-Authored-By: Claude Opus 5.5 --- ...ion-age-severe-disability-premium.fixed.md | 1 + .../housing_benefit/pension_age_premiums.yaml | 182 ++++++++++++++ ...ge_severe_disability_premium_properties.py | 222 ++++++++++++++++++ .../pension_age_severe_disability_premium.py | 36 +++ .../household/income/benefits_premiums.py | 46 +++- 5 files changed, 481 insertions(+), 6 deletions(-) create mode 100644 changelog.d/hb-pension-age-severe-disability-premium.fixed.md create mode 100644 policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml create mode 100644 policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py create mode 100644 policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py diff --git a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md new file mode 100644 index 0000000000..25e9cbde97 --- /dev/null +++ b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md @@ -0,0 +1 @@ +- Include the severe disability premium in the pension-age Housing Benefit and Council Tax Reduction applicable amounts on the same qualifying benefits as the Pension Credit severe disability addition (Attendance Allowance, DLA care middle or highest rate, PIP daily living at either rate, Armed Forces Independence Payment), and drop the adult disability and enhanced disability premiums, which the pension-age schedules do not have (HB(SPC) Regs 2006 Sch 3; CTR schemes for pensioners in England, Wales and Scotland). Previously an Attendance Allowance recipient lost up to about £2,000 a year of Housing Benefit when their Guarantee Credit ended. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml new file mode 100644 index 0000000000..046ca31c8f --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml @@ -0,0 +1,182 @@ +# Pension-age Housing Benefit and Council Tax Reduction premiums. +# HB(SPC) Regs 2006 Sch 3 paras 4-12 and CTR (Prescribed Requirements) +# (England) Regs 2012 Sch 2 paras 4-12: the severe disability premium has the +# same conditions and amounts as the Pension Credit severe disability +# additional amount (SPC Regs 2002 Sch I para 1, reg 6(5)); there is no adult +# disability or enhanced disability premium. 2026-27 weekly rates: pension-age +# personal allowance (attained pensionable age before 1 April 2021) 256.00, +# couple 383.35; severe disability premium 86.05 (172.10 for a couple who +# both qualify); carer premium 48.15. + +- name: AA claimant just above the Guarantee Credit boundary keeps the severe disability premium in HB and CTR + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 70} + state_pension: {2026: 6_000} + private_pension_income: {2026: 12_000} + aa_category: {2026: HIGHER} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + council_tax: {2026: 2_000} + output: + guarantee_credit: 0 + severe_disability_minimum_guarantee_addition: 86.05 * 52 + pension_age_severe_disability_premium: 86.05 * 52 + benefits_premiums: 86.05 * 52 + # (256.00 + 86.05) * 52 = 17,786.60 + housing_benefit_applicable_amount: 17_786.60 + council_tax_reduction_applicable_amount: 17_786.60 + # HB income 16,548.80 is below the applicable amount: maximum HB. + housing_benefit: 6_240 + council_tax_benefit: 2_000 + +- name: Same claimant just below the boundary is passported to maximum HB + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 70} + state_pension: {2026: 6_000} + private_pension_income: {2026: 11_900} + aa_category: {2026: HIGHER} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + council_tax: {2026: 2_000} + output: + guarantee_credit: 16.60 + housing_benefit: 6_240 + council_tax_benefit: 2_000 + +- name: Pension-age applicable amount has no adult disability or enhanced disability premium + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 70} + dla_sc_category: {2026: HIGHER} + is_disabled_for_benefits: {2026: true} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + # Only the severe disability premium applies: 86.05 * 52 = 4,474.60. + benefits_premiums: 4_474.60 + housing_benefit_applicable_amount: 13_312 + 4_474.60 + +- name: Pensioner couple who both receive AA get two severe disability rates + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 72} + aa_category: {2026: HIGHER} + partner: + age: {2026: 70} + aa_category: {2026: LOWER} + benunits: + benunit: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + # 172.10 * 52 = 8,949.20; couple allowance 383.35 * 52 = 19,934.20. + benefits_premiums: 8_949.20 + housing_benefit_applicable_amount: 19_934.20 + 8_949.20 + +- name: Pension-age carer premium is kept + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 70} + care_hours: {2026: 40} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + carer_premium: 48.15 * 52 + benefits_premiums: 48.15 * 52 + +- name: Working-age continuing HB award keeps the legacy premiums + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 50} + is_disabled_for_benefits: {2026: true} + housing_benefit_reported: {2026: 1} + benunits: + benunit: + members: [claimant] + would_claim_uc: {2026: false} + households: + household: + members: [claimant] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + pension_age_severe_disability_premium: 0 + # Legacy disability premium (single) 44.85 * 52 = 2,332.20. + benefits_premiums: 44.85 * 52 + +- name: Scottish pension-age CTR applicable amount includes the severe disability premium + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 80} + pip_dl_category: {2026: STANDARD} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: SCOTLAND} + region: {2026: SCOTLAND} + tenure_type: {2026: OWNED_OUTRIGHT} + output: + # SSI 2012/319 Sch 1 para 7: PIP daily living at the standard rate + # qualifies. (256.00 + 86.05) * 52 = 17,786.60. + benefits_premiums: 86.05 * 52 + council_tax_reduction_applicable_amount: 17_786.60 diff --git a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py new file mode 100644 index 0000000000..9bccc4464e --- /dev/null +++ b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py @@ -0,0 +1,222 @@ +"""Pension-age severe disability premium and the Guarantee Credit boundary. + +Pension Credit's minimum guarantee included the severe disability addition +for an Attendance Allowance recipient, but the Housing Benefit and Council +Tax Reduction applicable amounts did not include the severe disability +premium, because the legacy premium tested a narrower, tax-credit style +disability flag. While Guarantee Credit was paid, Housing Benefit was +passported to its maximum and hid the gap; when Guarantee Credit ended, +Housing Benefit fell by 65% of it. A single pensioner on Attendance +Allowance lost £2,040.52 of net income when private pension rose from +£11,900 to £12,000 in 2026. + +Invariants, for single people and couples over State Pension age without +children or carers, who rent from the council in England in 2026: + +1. Structural: where Housing Benefit is available, its applicable amount is + at least the Pension Credit minimum guarantee, and so is the Council Tax + Reduction applicable amount. In law the pension-age personal allowances + (HB(SPC) Regs 2006 Sch 3 para 1; CTR (Prescribed Requirements) (England) + Regs 2012 Sch 2 para 1) are at least the standard minimum guarantee (SPC + Regs 2002 reg 6(1)), and the severe disability premium (Sch 3 paras 6 and + 12(1)) has the same conditions and amounts as the severe disability + addition (SPC Regs Sch I para 1 and reg 6(5)). +2. Boundary: on the private-pension step where Guarantee Credit ends, + household net income, excluding the TV licence fee, does not fall. The + free TV licence for over-75s on Pension Credit is a genuine statutory + cliff, so it is excluded. +3. Differential: over State Pension age the premium equals the Pension + Credit severe disability addition; below it, benefits_premiums is still + the sum of the four legacy premiums. + +Carers are not drawn. Pension Credit income leaves out Carer's Allowance and +two carers get one carer premium, so the invariants do not yet hold for +carers; nor does full monotonicity in income, because Housing Benefit and +Council Tax Reduction income leave out Savings Credit. Those are separate +fixes. +""" + +import numpy as np +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_uk import Simulation + +YEAR = 2026 +PENSIONS = np.arange(0, 20_001, 500) +PROPERTY_SETTINGS = settings( + max_examples=12, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +DISABILITY = st.sampled_from( + [ + {}, + {"aa_category": "LOWER"}, + {"aa_category": "HIGHER"}, + {"dla_sc_category": "LOWER"}, + {"dla_sc_category": "MIDDLE"}, + {"dla_sc_category": "HIGHER"}, + {"pip_dl_category": "STANDARD"}, + {"pip_dl_category": "ENHANCED"}, + ] +) + + +def money(high): + return st.floats(0, high, allow_nan=False, allow_infinity=False) + + +@st.composite +def adult(draw): + return dict( + age=draw(st.integers(67, 95)), + disability=draw(DISABILITY), + blind=draw(st.booleans()), + state_pension=draw(money(15_000)), + ) + + +@st.composite +def family(draw): + return dict( + adults=[draw(adult()) for _ in range(draw(st.integers(1, 2)))], + rent=draw(money(12_000)), + council_tax=draw(money(3_000)), + savings=draw(st.one_of(st.just(0.0), money(15_000))), + ) + + +def situation(families): + """Each family once per private pension on the PENSIONS grid.""" + people, benunits, households = {}, {}, {} + for i, fam in enumerate(families): + for k, pension in enumerate(PENSIONS): + names = [] + for j, a in enumerate(fam["adults"]): + name = f"p{i}_{k}_{j}" + person = { + "age": {YEAR: a["age"]}, + "state_pension": {YEAR: a["state_pension"]}, + # All private pension goes to the first adult. + "private_pension_income": {YEAR: float(pension) * (j == 0)}, + "is_blind": {YEAR: a["blind"]}, + } + for variable, value in a["disability"].items(): + person[variable] = {YEAR: value} + people[name] = person + names.append(name) + benunits[f"b{i}_{k}"] = {"members": names} + households[f"h{i}_{k}"] = { + "members": names, + "country": {YEAR: "ENGLAND"}, + "region": {YEAR: "NORTH_WEST"}, + "tenure_type": {YEAR: "RENT_FROM_COUNCIL"}, + "rent": {YEAR: fam["rent"]}, + "council_tax": {YEAR: fam["council_tax"]}, + "savings": {YEAR: fam["savings"]}, + } + return {"people": people, "benunits": benunits, "households": households} + + +def grid(families): + simulation = Simulation(situation=situation(families)) + shape = (len(families), len(PENSIONS)) + return { + variable: np.asarray(simulation.calculate(variable, YEAR)).reshape(shape) + for variable in [ + "household_net_income", + "tv_licence", + "minimum_guarantee", + "guarantee_credit", + "housing_benefit_eligible", + "housing_benefit_applicable_amount", + "council_tax_reduction_applicable_amount", + "housing_benefit", + "council_tax_benefit", + ] + } + + +@PROPERTY_SETTINGS +@given(st.lists(family(), min_size=1, max_size=4)) +def test_pension_age_applicable_amounts_cover_the_minimum_guarantee(families): + g = grid(families) + for i, fam in enumerate(families): + eligible = g["housing_benefit_eligible"][i].astype(bool) + minimum_guarantee = g["minimum_guarantee"][i] + hb = g["housing_benefit_applicable_amount"][i] + ctr = g["council_tax_reduction_applicable_amount"][i] + assert np.all(hb[eligible] >= minimum_guarantee[eligible] - 0.01), fam + assert np.all(ctr >= minimum_guarantee - 0.01), fam + + +@PROPERTY_SETTINGS +@given(st.lists(family(), min_size=1, max_size=4)) +def test_net_income_does_not_fall_where_guarantee_credit_ends(families): + g = grid(families) + net = g["household_net_income"] + g["tv_licence"] + step = np.diff(net, axis=1) + gc = g["guarantee_credit"] + ends = (gc[:, :-1] > 0) & (gc[:, 1:] <= 0) + for i, fam in enumerate(families): + for k in np.flatnonzero(ends[i]): + assert step[i, k] >= -0.01, ( + fam, + f"private pension {PENSIONS[k]} -> {PENSIONS[k + 1]}", + f"net income change {step[i, k]:.2f}", + f"HB {g['housing_benefit'][i, k]:.2f} -> " + f"{g['housing_benefit'][i, k + 1]:.2f}", + f"CTR {g['council_tax_benefit'][i, k]:.2f} -> " + f"{g['council_tax_benefit'][i, k + 1]:.2f}", + ) + + +@PROPERTY_SETTINGS +@given( + st.lists(adult(), min_size=1, max_size=2), + st.integers(18, 95), +) +def test_premiums_follow_the_pension_age_and_working_age_schedules(adults, age): + people = {} + for j, a in enumerate(adults): + person = { + "age": {YEAR: age if j == 0 else a["age"]}, + "is_blind": {YEAR: a["blind"]}, + } + for variable, value in a["disability"].items(): + person[variable] = {YEAR: value} + people[f"p{j}"] = person + simulation = Simulation( + situation={ + "people": people, + "benunits": {"b": {"members": list(people)}}, + "households": {"h": {"members": list(people)}}, + } + ) + + def get(variable): + return float(simulation.calculate(variable, YEAR)[0]) + + pension_age = bool(simulation.calculate("is_SP_age", YEAR).any()) + if pension_age: + assert ( + abs( + get("pension_age_severe_disability_premium") + - get("severe_disability_minimum_guarantee_addition") + ) + < 0.005 + ) + expected = get("pension_age_severe_disability_premium") + get("carer_premium") + else: + expected = sum( + get(variable) + for variable in [ + "disability_premium", + "enhanced_disability_premium", + "severe_disability_premium", + "carer_premium", + ] + ) + assert abs(get("benefits_premiums") - expected) < 0.005 diff --git a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py new file mode 100644 index 0000000000..33bdecc876 --- /dev/null +++ b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py @@ -0,0 +1,36 @@ +from policyengine_uk.model_api import * + + +class pension_age_severe_disability_premium(Variable): + value_type = float + entity = BenUnit + label = "Severe disability premium for pension-age Housing Benefit and CTR" + documentation = ( + "The severe disability premium in the Housing Benefit and Council Tax " + "Reduction applicable amount of a family over State Pension age. In " + "law its qualifying benefits (Attendance Allowance, the care component " + "of DLA at the middle or highest rate, the daily living component of " + "PIP at either rate, Armed Forces Independence Payment and their " + "Scottish equivalents), its conditions and its amounts (one rate, or " + "two for a couple who both qualify and have no paid carer) are the " + "same as those of the Pension Credit severe disability additional " + "amount. So this premium reads that variable, and Housing Benefit, " + "Council Tax Reduction and Pension Credit share one definition: the " + "premium cannot drop out of the Housing Benefit applicable amount " + "when Guarantee Credit ends. It therefore also shares that variable's " + "modelling simplifications." + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.legislation.gov.uk/uksi/2006/214/schedule/3/paragraph/6", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/3/paragraph/12", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/paragraph/6", + "https://www.legislation.gov.uk/ssi/2012/319/schedule/1/paragraph/7", + "https://www.legislation.gov.uk/wsi/2013/3035/schedule/2/paragraph/6", + "https://www.legislation.gov.uk/uksi/2002/1792/schedule/I/paragraph/1", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/6", + ) + + def formula(benunit, period, parameters): + return benunit("severe_disability_minimum_guarantee_addition", period) diff --git a/policyengine_uk/variables/household/income/benefits_premiums.py b/policyengine_uk/variables/household/income/benefits_premiums.py index 071f8c4fb6..0b3d0b5fa6 100644 --- a/policyengine_uk/variables/household/income/benefits_premiums.py +++ b/policyengine_uk/variables/household/income/benefits_premiums.py @@ -1,16 +1,50 @@ from policyengine_uk.model_api import * +WORKING_AGE_PREMIUMS = [ + "disability_premium", + "enhanced_disability_premium", + "severe_disability_premium", + "carer_premium", +] + +# The pension-age schedules (HB(SPC) Regs 2006 Sch 3 Part 3; CTR (Prescribed +# Requirements) (England) Regs 2012 Sch 2 Part 3; the Scottish and Welsh +# pension-age CTR schedules) have only the severe disability, enhanced +# disability (children only), disabled child and carer premiums. The two +# child premiums are not modelled. +PENSION_AGE_PREMIUMS = [ + "pension_age_severe_disability_premium", + "carer_premium", +] + class benefits_premiums(Variable): value_type = float entity = BenUnit label = "Value of premiums for disability and carer status" + documentation = ( + "Premiums in the Housing Benefit, Council Tax Reduction and Income " + "Support applicable amounts. A family with a member over State " + "Pension age uses the pension-age schedules: the severe disability " + "premium, shared with the Pension Credit severe disability addition, " + "and the carer premium. Those schedules have no adult disability or " + "enhanced disability premium." + ) definition_period = YEAR unit = GBP + reference = ( + "https://www.legislation.gov.uk/uksi/2006/214/schedule/3", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3", + ) - adds = [ - "disability_premium", - "enhanced_disability_premium", - "severe_disability_premium", - "carer_premium", - ] + def formula(benunit, period, parameters): + # Same switch as the aged personal allowance in the Housing Benefit + # and Council Tax Reduction applicable amounts. Income Support is not + # paid to a family with a member over State Pension age. + pension_age = benunit.any(benunit.members("is_SP_age", period)) + return where( + pension_age, + add(benunit, period, PENSION_AGE_PREMIUMS), + add(benunit, period, WORKING_AGE_PREMIUMS), + ) From 2f3548f1698c6a548853f5060363920593cd86e7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 30 Sep 2026 13:06:51 -0400 Subject: [PATCH 2/9] Stop children and a claimant's own carer benefit withholding the addition Review of this PR found that sharing the Pension Credit severe disability addition made pension-age HB and CTR inherit two deviations from SPC Regs Sch I: a child in the benefit unit withheld it, although the residence test counts only people aged 18 or over (para 2(2)(f)), and a claimant's own Carer's Allowance withheld it, although only one paid "in respect of caring for him" does (para 1(1)(a)(iii)). Each qualifying adult is now withheld only when another member of the benefit unit receives a carer benefit. A couple who both qualify, one paid Carer's Allowance for the other, now gets one rate, as reg 6(5)(a) gives. Also: the pension-age premium is zero below State Pension age; YAML cases that assert an applicable amount use claimants who reached State Pension age before April 2021, so they hold with the allowance cohort split; the schedule property checks whole multiples of the weekly rate. Co-Authored-By: Claude Opus 5.5 --- ...ion-age-severe-disability-premium.fixed.md | 3 +- .../housing_benefit/pension_age_premiums.yaml | 110 +++++++++++++++++- .../tests/test_carer_support_payment.py | 16 ++- ...ge_severe_disability_premium_properties.py | 25 ++-- ...e_disability_minimum_guarantee_addition.py | 58 +++++---- .../pension_age_severe_disability_premium.py | 4 +- 6 files changed, 173 insertions(+), 43 deletions(-) diff --git a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md index 25e9cbde97..c7cfc12176 100644 --- a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md +++ b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md @@ -1 +1,2 @@ -- Include the severe disability premium in the pension-age Housing Benefit and Council Tax Reduction applicable amounts on the same qualifying benefits as the Pension Credit severe disability addition (Attendance Allowance, DLA care middle or highest rate, PIP daily living at either rate, Armed Forces Independence Payment), and drop the adult disability and enhanced disability premiums, which the pension-age schedules do not have (HB(SPC) Regs 2006 Sch 3; CTR schemes for pensioners in England, Wales and Scotland). Previously an Attendance Allowance recipient lost up to about £2,000 a year of Housing Benefit when their Guarantee Credit ended. +- Include the severe disability premium in the pension-age Housing Benefit and Council Tax Reduction applicable amounts on the same qualifying benefits as the Pension Credit severe disability addition (Attendance Allowance, DLA care middle or highest rate, PIP daily living at either rate, Armed Forces Independence Payment), and drop the adult disability and enhanced disability premiums, which the pension-age schedules do not have (HB(SPC) Regs 2006 Sch 3; CTR schemes for pensioners in England, Wales and Scotland). Previously Housing Benefit fell sharply when Guarantee Credit ended for an Attendance Allowance recipient: by about £2,100 a year for a single person and £4,700 for a couple. +- The Pension Credit severe disability addition is no longer withheld because the benefit unit includes a child, since the residence test counts only people aged 18 or over (SPC Regs Sch I para 2(2)(f)), or because a claimant receives Carer's Allowance or Carer Support Payment themselves; only another member's carer benefit, standing in for one paid for caring for them, withholds it (Sch I para 1(1)(a)(iii)). diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml index 046ca31c8f..3624aa1c5d 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml @@ -6,7 +6,9 @@ # disability or enhanced disability premium. 2026-27 weekly rates: pension-age # personal allowance (attained pensionable age before 1 April 2021) 256.00, # couple 383.35; severe disability premium 86.05 (172.10 for a couple who -# both qualify); carer premium 48.15. +# both qualify); carer premium 48.15. Cases that assert an applicable amount +# use claimants who reached State Pension age before 1 April 2021, whose +# allowance does not depend on the April 2021 cohort split. - name: AA claimant just above the Guarantee Credit boundary keeps the severe disability premium in HB and CTR period: 2026 @@ -33,10 +35,9 @@ severe_disability_minimum_guarantee_addition: 86.05 * 52 pension_age_severe_disability_premium: 86.05 * 52 benefits_premiums: 86.05 * 52 - # (256.00 + 86.05) * 52 = 17,786.60 - housing_benefit_applicable_amount: 17_786.60 - council_tax_reduction_applicable_amount: 17_786.60 - # HB income 16,548.80 is below the applicable amount: maximum HB. + # HB income 16,548.80 is below the applicable amount, (238.00 or 256.00 + # + 86.05) * 52 = 16,850.60 or 17,786.60 whichever allowance cohort + # applies, so HB and CTR are at their maximum. housing_benefit: 6_240 council_tax_benefit: 2_000 @@ -71,7 +72,7 @@ input: people: claimant: - age: {2026: 70} + age: {2026: 80} dla_sc_category: {2026: HIGHER} is_disabled_for_benefits: {2026: true} benunits: @@ -180,3 +181,100 @@ # qualifies. (256.00 + 86.05) * 52 = 17,786.60. benefits_premiums: 86.05 * 52 council_tax_reduction_applicable_amount: 17_786.60 + +- name: A dependent child does not withhold the pensioner's severe disability premium + # SPC Regs 2002 Sch I para 1(1)(a)(ii) counts only residents aged 18 or + # over, and para 2(2)(f) ignores qualifying young people. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + parent: + age: {2026: 80} + dla_sc_category: {2026: HIGHER} + child: + age: {2026: 12} + benunits: + benunit: + members: [parent, child] + households: + household: + members: [parent, child] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + severe_disability_minimum_guarantee_addition: 86.05 * 52 + pension_age_severe_disability_premium: 86.05 * 52 + +- name: A pensioner's own Carer's Allowance does not withhold their severe disability premium + # The addition is withheld only for a carer benefit paid "in respect of + # caring for him" (Sch I para 1(1)(a)(iii); HB(SPC) Sch 3 para 6(2)(a)(iii)). + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 80} + dla_sc_category: {2026: HIGHER} + care_hours: {2026: 40} + carers_allowance_reported: {2026: 4_000} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + receives_carer_benefit: true + pension_age_severe_disability_premium: 86.05 * 52 + # Severe disability premium plus carer premium. + benefits_premiums: (86.05 + 48.15) * 52 + +- name: Couple who both receive AA, one paid Carer's Allowance for the other, get one rate + # Sch I para 1(1)(b) and reg 6(5)(a): one rate where a carer benefit is + # paid for caring for one only of the partners. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 80} + aa_category: {2026: HIGHER} + partner: + age: {2026: 78} + aa_category: {2026: LOWER} + care_hours: {2026: 40} + carers_allowance_reported: {2026: 4_000} + benunits: + benunit: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + country: {2026: ENGLAND} + tenure_type: {2026: RENT_FROM_COUNCIL} + rent: {2026: 6_240} + output: + severe_disability_minimum_guarantee_addition: 86.05 * 52 + +- name: The pension-age premium is zero below State Pension age + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: {2026: 40} + pip_dl_category: {2026: STANDARD} + benunits: + benunit: + members: [claimant] + households: + household: + members: [claimant] + country: {2026: ENGLAND} + output: + pension_age_severe_disability_premium: 0 diff --git a/policyengine_uk/tests/test_carer_support_payment.py b/policyengine_uk/tests/test_carer_support_payment.py index b812935aa5..c0554335a7 100644 --- a/policyengine_uk/tests/test_carer_support_payment.py +++ b/policyengine_uk/tests/test_carer_support_payment.py @@ -1,3 +1,4 @@ +import pytest from policyengine_uk import Simulation @@ -43,7 +44,7 @@ def test_scottish_carers_move_to_csp_in_2025(): assert sim.calculate("carer_support_payment", YEAR_2025)[0] > 0 -def test_csp_counts_for_pension_credit_carer_additions_and_blocks_severe_disability(): +def test_csp_counts_for_pension_credit_carer_additions_but_not_against_own_severe_disability(): sim = Simulation( situation=_situation( YEAR_2025, @@ -59,9 +60,18 @@ def test_csp_counts_for_pension_credit_carer_additions_and_blocks_severe_disabil assert sim.calculate("carer_minimum_guarantee_addition", YEAR_2025)[0] == ( expected_carer_addition ) - assert ( - sim.calculate("severe_disability_minimum_guarantee_addition", YEAR_2025)[0] == 0 + # Carer Support Payment withholds the severe disability addition only when + # it is paid for caring for the disabled person (SPC Regs 2002 Sch I para + # 1(1)(a)(iii)), so a carer's own payment never withholds theirs. + expected_severe_disability_addition = ( + float( + parameters.gov.dwp.pension_credit.guarantee_credit.severe_disability.addition + ) + * 52 ) + assert sim.calculate("severe_disability_minimum_guarantee_addition", YEAR_2025)[ + 0 + ] == pytest.approx(expected_severe_disability_addition) def test_csp_counts_for_uc_non_dep_exemption_and_housing_benefit_income(): diff --git a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py index 9bccc4464e..a1cb1501af 100644 --- a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py +++ b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py @@ -25,9 +25,11 @@ household net income, excluding the TV licence fee, does not fall. The free TV licence for over-75s on Pension Credit is a genuine statutory cliff, so it is excluded. -3. Differential: over State Pension age the premium equals the Pension - Credit severe disability addition; below it, benefits_premiums is still - the sum of the four legacy premiums. +3. Schedule: over State Pension age the premium is a whole number (0, 1 or + 2) of weekly severe disability rates, equals the Pension Credit severe + disability addition, and is the only premium besides the carer premium; + below State Pension age it is zero and benefits_premiums is the sum of the + four legacy premiums, so working-age applicable amounts are unchanged. Carers are not drawn. Pension Credit income leaves out Carer's Allowance and two carers get one carer premium, so the invariants do not yet hold for @@ -200,16 +202,21 @@ def get(variable): return float(simulation.calculate(variable, YEAR)[0]) pension_age = bool(simulation.calculate("is_SP_age", YEAR).any()) + premium = get("pension_age_severe_disability_premium") if pension_age: + weekly_rate = float( + simulation.tax_benefit_system.parameters( + YEAR + ).gov.dwp.pension_credit.guarantee_credit.severe_disability.addition + ) + rates = premium / (weekly_rate * 52) + assert min(abs(rates - k) for k in (0, 1, 2)) < 1e-6, rates assert ( - abs( - get("pension_age_severe_disability_premium") - - get("severe_disability_minimum_guarantee_addition") - ) - < 0.005 + abs(premium - get("severe_disability_minimum_guarantee_addition")) < 0.005 ) - expected = get("pension_age_severe_disability_premium") + get("carer_premium") + expected = premium + get("carer_premium") else: + assert premium == 0 expected = sum( get(variable) for variable in [ diff --git a/policyengine_uk/variables/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee/additional/severe_disability_minimum_guarantee_addition.py b/policyengine_uk/variables/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee/additional/severe_disability_minimum_guarantee_addition.py index 2a95fd2cae..9a7605cad0 100644 --- a/policyengine_uk/variables/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee/additional/severe_disability_minimum_guarantee_addition.py +++ b/policyengine_uk/variables/gov/dwp/pension_credit/guarantee_credit/minimum_guarantee/additional/severe_disability_minimum_guarantee_addition.py @@ -3,38 +3,50 @@ class severe_disability_minimum_guarantee_addition(Variable): label = "Severe disability-related increase" + documentation = ( + "The Pension Credit severe disability additional amount: one rate for " + "each adult in the benefit unit who receives a qualifying disability " + "benefit and for whom no other member of the benefit unit receives a " + "carer benefit. Pension-age Housing Benefit and Council Tax Reduction " + "use the same amount as their severe disability premium." + ) entity = BenUnit definition_period = YEAR value_type = float unit = GBP - reference = "https://www.legislation.gov.uk/uksi/2002/1792/schedule/I/paragraph/1" + reference = ( + "https://www.legislation.gov.uk/uksi/2002/1792/schedule/I/paragraph/1", + "https://www.legislation.gov.uk/uksi/2002/1792/schedule/I/paragraph/2", + "https://www.legislation.gov.uk/uksi/2002/1792/regulation/6", + ) def formula(benunit, period, parameters): - # 1. At least one adult receives a qualifying benefit - # 2. No children (except children receiving qualifying benefits) - # 3. Nobody receives Carer's Allowance (technically 'for one of the - # claimants', but we assume this is true). This is receipt, not - # entitlement: the addition is withheld only where a carer's - # allowance is "entitled to and in receipt of" for the claimant, so - # a carer with underlying entitlement alone does not block it. + # Sch I para 1(1)(a)(iii) and (b): the addition is withheld where a + # person is entitled to and in receipt of a carer benefit "in respect + # of caring for" the qualifying person. Who is cared for is not + # modelled, so another member of the benefit unit receiving a carer + # benefit stands in for it; a person's own carer benefit never blocks + # their addition, and carers outside the benefit unit are not seen. + # Receipt, not underlying entitlement, is what counts. + # Children and qualifying young people never block the addition: the + # residence test counts only people aged 18 or over, and para 2(2)(f) + # ignores qualifying young people. + # Retained simplifications: one rate for each qualifying adult, + # without para 1(1)(b)-(c)'s both-partners-or-blind-partner condition, + # and no test for other adults living in the household. severe_disability = parameters( period ).gov.dwp.pension_credit.guarantee_credit.severe_disability - relevant_benefits = severe_disability.relevant_benefits person = benunit.members - person_receives_qualifying_benefits = add(person, period, relevant_benefits) > 0 - is_adult = person("is_adult", period) - count_eligible_adults = benunit.sum( - is_adult & person_receives_qualifying_benefits + qualifies = add(person, period, severe_disability.relevant_benefits) > 0 + receives_carer_benefit = person("receives_carer_benefit", period) + carer_benefits_received_by_others = ( + benunit.project(benunit.sum(receives_carer_benefit)) + - receives_carer_benefit ) - any_children_without_benefits = ( - benunit.sum(~is_adult & ~person_receives_qualifying_benefits) > 0 - ) - carer_benefit_received = add(benunit, period, ["receives_carer_benefit"]) > 0 - eligible = ~any_children_without_benefits & ~carer_benefit_received - return ( - eligible - * count_eligible_adults - * severe_disability.addition - * WEEKS_IN_YEAR + counted = ( + person("is_adult", period) + & qualifies + & (carer_benefits_received_by_others == 0) ) + return benunit.sum(counted) * severe_disability.addition * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py index 33bdecc876..8ac841cfc7 100644 --- a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py @@ -33,4 +33,6 @@ class pension_age_severe_disability_premium(Variable): ) def formula(benunit, period, parameters): - return benunit("severe_disability_minimum_guarantee_addition", period) + pension_age = benunit.any(benunit.members("is_SP_age", period)) + addition = benunit("severe_disability_minimum_guarantee_addition", period) + return where(pension_age, addition, 0) From 46b9ff3ef3417633d1dbfe2b749d73d4ca036b57 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 30 Sep 2026 14:08:23 -0400 Subject: [PATCH 3/9] State the carer and savings-credit dependencies without dating them Co-Authored-By: Claude Opus 5.5 --- ...ension_age_severe_disability_premium_properties.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py index a1cb1501af..27f50a9450 100644 --- a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py +++ b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py @@ -31,11 +31,12 @@ below State Pension age it is zero and benefits_premiums is the sum of the four legacy premiums, so working-age applicable amounts are unchanged. -Carers are not drawn. Pension Credit income leaves out Carer's Allowance and -two carers get one carer premium, so the invariants do not yet hold for -carers; nor does full monotonicity in income, because Housing Benefit and -Council Tax Reduction income leave out Savings Credit. Those are separate -fixes. +Carers are not drawn: the invariants for carers also depend on Pension +Credit income counting Carer's Allowance and on the carer premium per carer, +which are separate changes. Full monotonicity in income is not asserted: it +also depends on the savings-credit-only income rules for Housing Benefit and +Council Tax Reduction (HB(SPC) Regs 2006 reg 27 and the CTR equivalents), +which are likewise separate. """ import numpy as np From 5d2c49f45d00897caf5b142490d5ccb6ab3d2181 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 2 Oct 2026 17:00:32 -0400 Subject: [PATCH 4/9] Fix pension-age HB and CTR severe disability premium conditions Apply the HB-specific residence condition to the shared Pension Credit addition, cover statutory couple and cross-family exclusions with final awards, and describe the removal of pension-age adult disability premiums. Co-Authored-By: Claude Opus 5.5 --- ...ion-age-severe-disability-premium.fixed.md | 3 +- .../housing_benefit/pension_age_premiums.yaml | 19 +- ...sion_age_severe_disability_conditions.yaml | 202 ++++++++++++++++++ ...ge_severe_disability_premium_properties.py | 65 +++--- ...dependant_for_severe_disability_premium.py | 6 +- .../pension_age_severe_disability_premium.py | 38 ++-- 6 files changed, 279 insertions(+), 54 deletions(-) create mode 100644 policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml diff --git a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md index c7cfc12176..f4bd3d5f3e 100644 --- a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md +++ b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md @@ -1,2 +1 @@ -- Include the severe disability premium in the pension-age Housing Benefit and Council Tax Reduction applicable amounts on the same qualifying benefits as the Pension Credit severe disability addition (Attendance Allowance, DLA care middle or highest rate, PIP daily living at either rate, Armed Forces Independence Payment), and drop the adult disability and enhanced disability premiums, which the pension-age schedules do not have (HB(SPC) Regs 2006 Sch 3; CTR schemes for pensioners in England, Wales and Scotland). Previously Housing Benefit fell sharply when Guarantee Credit ended for an Attendance Allowance recipient: by about £2,100 a year for a single person and £4,700 for a couple. -- The Pension Credit severe disability addition is no longer withheld because the benefit unit includes a child, since the residence test counts only people aged 18 or over (SPC Regs Sch I para 2(2)(f)), or because a claimant receives Carer's Allowance or Carer Support Payment themselves; only another member's carer benefit, standing in for one paid for caring for them, withholds it (Sch I para 1(1)(a)(iii)). +- Corrected pension-age Housing Benefit and Council Tax Reduction premiums by removing adult disability and adult enhanced disability premiums absent from their statutory schedules and applying the severe disability premium's qualifying-benefit, couple, Housing Benefit non-dependant and shared carer-attribution conditions. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml index 3624aa1c5d..7d7059d142 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml @@ -1,10 +1,9 @@ # Pension-age Housing Benefit and Council Tax Reduction premiums. # HB(SPC) Regs 2006 Sch 3 paras 4-12 and CTR (Prescribed Requirements) -# (England) Regs 2012 Sch 2 paras 4-12: the severe disability premium has the -# same conditions and amounts as the Pension Credit severe disability -# additional amount (SPC Regs 2002 Sch I para 1, reg 6(5)); there is no adult -# disability or enhanced disability premium. 2026-27 weekly rates: pension-age -# personal allowance (attained pensionable age before 1 April 2021) 256.00, +# (England) Regs 2012 Sch 2 paras 4-12: the severe disability premium applies +# HB's qualifying benefit, non-dependant and carer conditions; there is no +# adult disability or enhanced disability premium. 2026-27 weekly rates: +# pension-age personal allowance (attained pensionable age before 1 April 2021) 256.00, # couple 383.35; severe disability premium 86.05 (172.10 for a couple who # both qualify); carer premium 48.15. Cases that assert an applicable amount # use claimants who reached State Pension age before 1 April 2021, whose @@ -16,7 +15,7 @@ input: people: claimant: - age: {2026: 70} + age: {2026: 72} state_pension: {2026: 6_000} private_pension_income: {2026: 12_000} aa_category: {2026: HIGHER} @@ -35,9 +34,9 @@ severe_disability_minimum_guarantee_addition: 86.05 * 52 pension_age_severe_disability_premium: 86.05 * 52 benefits_premiums: 86.05 * 52 - # HB income 16,548.80 is below the applicable amount, (238.00 or 256.00 - # + 86.05) * 52 = 16,850.60 or 17,786.60 whichever allowance cohort - # applies, so HB and CTR are at their maximum. + # The claimant reached pension age before 1 April 2021, so the older + # allowance applies. HB income 16,548.80 is below the applicable amount, + # (256.00 + 86.05) * 52 = 17,786.60, so HB and CTR are at their maximum. housing_benefit: 6_240 council_tax_benefit: 2_000 @@ -47,7 +46,7 @@ input: people: claimant: - age: {2026: 70} + age: {2026: 72} state_pension: {2026: 6_000} private_pension_income: {2026: 11_900} aa_category: {2026: HIGHER} diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml new file mode 100644 index 0000000000..0bfcb2eb18 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml @@ -0,0 +1,202 @@ +# HB(SPC) Regs 2006 Sch 3 para 6, with the non-dependant definition in +# reg 3: these cases assert final awards without a Guarantee Credit passport. + +- name: One qualifying pensioner and a non-blind partner get no HB or CTR severe premium + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 80 + state_pension: 13_000 + aa_category: HIGHER + partner: + age: 78 + state_pension: 13_000 + benunits: + pensioners: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + country: ENGLAND + tenure_type: RENT_FROM_COUNCIL + rent: 6_240 + council_tax: 2_000 + output: + guarantee_credit: 0 + severe_disability_minimum_guarantee_addition: 0 + pension_age_severe_disability_premium: 0 + housing_benefit: 2_883.79 + council_tax_benefit: 821.24 + +- name: Both qualifying pensioners keep two rates in their final HB and CTR awards + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 80 + state_pension: 15_000 + aa_category: HIGHER + partner: + age: 78 + state_pension: 15_000 + aa_category: LOWER + benunits: + pensioners: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + country: ENGLAND + tenure_type: RENT_FROM_COUNCIL + rent: 6_240 + council_tax: 2_000 + output: + guarantee_credit: 0 + pension_age_severe_disability_premium: 172.10 * 52 + housing_benefit: 6_240 + council_tax_benefit: 1_857.22 + +- name: A qualifying pensioner with a blind non-qualifying partner gets one HB and CTR rate + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 80 + state_pension: 13_000 + aa_category: HIGHER + partner: + age: 78 + state_pension: 13_000 + is_blind: true + benunits: + pensioners: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + country: ENGLAND + tenure_type: RENT_FROM_COUNCIL + rent: 6_240 + council_tax: 2_000 + output: + guarantee_credit: 0 + pension_age_severe_disability_premium: 86.05 * 52 + housing_benefit: 5_792.28 + council_tax_benefit: 1_704.27 + +- name: A non-ignored adult resident blocks the pensioner's HB and CTR severe premium + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 80 + state_pension: 6_000 + private_pension_income: 12_000 + aa_category: HIGHER + resident: + age: 40 + benunits: + pensioner: + members: [claimant] + other_family: + members: [resident] + households: + household: + members: [claimant, resident] + country: ENGLAND + tenure_type: RENT_FROM_COUNCIL + rent: 6_240 + council_tax: 2_000 + output: + guarantee_credit: [0, 0] + has_non_dependant_for_severe_disability_premium: [true, false] + pension_age_severe_disability_premium: [0, 0] + housing_benefit: [4_136.08, 0] + council_tax_benefit: [1_279.60, 0] + +- name: An 18-year-old of another family blocks HB and CTR although Pension Credit ignores him + # The daughter is ignored under para 6(6)(a); her son is not part of + # the claimant's family under reg 3(2)(a). SPC Sch I para 2(2)(f) differs. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 80 + state_pension: 6_000 + private_pension_income: 12_000 + aa_category: HIGHER + daughter: + age: 50 + pip_dl_category: STANDARD + grandson: + age: 18 + current_education: UPPER_SECONDARY + benunits: + pensioner: + members: [claimant] + other_family: + members: [daughter, grandson] + households: + household: + members: [claimant, daughter, grandson] + country: ENGLAND + tenure_type: RENT_FROM_COUNCIL + rent: 6_240 + council_tax: 2_000 + output: + guarantee_credit: [0, 0] + # 86.05 * 52 for each family; expected vectors use numeric literals. + severe_disability_minimum_guarantee_addition: [4_474.60, 4_474.60] + has_non_dependant_for_severe_disability_premium: [true, false] + pension_age_severe_disability_premium: [0, 0] + housing_benefit_applicable_amount: [13_312, 0] + housing_benefit: [4_136.08, 0] + council_tax_benefit: [1_097.91, 0] + +- name: A qualifying-benefit resident in another benefit unit can still be the pensioner's paid carer + # The carer's disability benefit exempts her from the residence test; + # withholding is therefore due to attribution, rather than residence. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 80 + state_pension: 6_000 + private_pension_income: 12_000 + aa_category: HIGHER + carer: + age: 50 + pip_dl_category: STANDARD + care_hours: 40 + carers_allowance_reported: 4_000 + benunits: + pensioner: + members: [claimant] + # HB(SPC) reg 55(6) and England CTR Sch 1 para 8(6): AA exempts + # the claimant from deductions. Supply these independently of the + # current generic deduction formulas to isolate the premium rule. + housing_benefit_non_dep_deductions: 0 + council_tax_reduction_non_dep_deductions: 0 + other_family: + members: [carer] + households: + household: + members: [claimant, carer] + country: ENGLAND + tenure_type: RENT_FROM_COUNCIL + rent: 6_240 + council_tax: 2_000 + output: + guarantee_credit: [0, 0] + has_non_dependant_for_severe_disability_premium: [false, false] + is_cared_for_by_carer_benefit_recipient: [true, false] + pension_age_severe_disability_premium: [0, 0] + housing_benefit: [4_136.08, 0] + council_tax_benefit: [1_279.60, 0] diff --git a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py index 27f50a9450..324bea9932 100644 --- a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py +++ b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py @@ -1,26 +1,27 @@ """Pension-age severe disability premium and the Guarantee Credit boundary. -Pension Credit's minimum guarantee included the severe disability addition -for an Attendance Allowance recipient, but the Housing Benefit and Council -Tax Reduction applicable amounts did not include the severe disability -premium, because the legacy premium tested a narrower, tax-credit style -disability flag. While Guarantee Credit was paid, Housing Benefit was -passported to its maximum and hid the gap; when Guarantee Credit ended, -Housing Benefit fell by 65% of it. A single pensioner on Attendance -Allowance lost £2,040.52 of net income when private pension rose from -£11,900 to £12,000 in 2026. - -Invariants, for single people and couples over State Pension age without -children or carers, who rent from the council in England in 2026: +These properties compare the pension-age Housing Benefit and Council Tax +Reduction applicable amounts with the Pension Credit minimum guarantee, +and exercise the income step where Guarantee Credit ends. + +The structural and boundary properties draw single people and couples aged +at least 72 without children, carers or other household residents, who rent +from the council in England in 2026. The schedule property also draws +younger claimants: 1. Structural: where Housing Benefit is available, its applicable amount is at least the Pension Credit minimum guarantee, and so is the Council Tax Reduction applicable amount. In law the pension-age personal allowances (HB(SPC) Regs 2006 Sch 3 para 1; CTR (Prescribed Requirements) (England) Regs 2012 Sch 2 para 1) are at least the standard minimum guarantee (SPC - Regs 2002 reg 6(1)), and the severe disability premium (Sch 3 paras 6 and - 12(1)) has the same conditions and amounts as the severe disability - addition (SPC Regs Sch I para 1 and reg 6(5)). + Regs 2002 reg 6(1)). The severe disability premium (Sch 3 paras 6 and + 12(1)) equals the severe disability addition (SPC Regs Sch I para 1 and + reg 6(5)) for these households. Their residence conditions differ: an + 18-year-old qualifying young person of another family can leave the + Pension Credit addition payable while barring the HB premium. The + property excludes other residents rather than asserting equivalence for + them. Where only one partner qualifies and the other is blind, the model + assumes the qualifying partner makes the HB claim, as reg 63(1) allows. 2. Boundary: on the private-pension step where Guarantee Credit ends, household net income, excluding the TV licence fee, does not fall. The free TV licence for over-75s on Pension Credit is a genuine statutory @@ -31,12 +32,9 @@ below State Pension age it is zero and benefits_premiums is the sum of the four legacy premiums, so working-age applicable amounts are unchanged. -Carers are not drawn: the invariants for carers also depend on Pension -Credit income counting Carer's Allowance and on the carer premium per carer, -which are separate changes. Full monotonicity in income is not asserted: it -also depends on the savings-credit-only income rules for Housing Benefit and -Council Tax Reduction (HB(SPC) Regs 2006 reg 27 and the CTR equivalents), -which are likewise separate. +Carers and other household residents have separate attribution and residence +cases in the YAML tests. The income property checks the Guarantee Credit +boundary rather than asserting monotonicity at every possible income step. """ import numpy as np @@ -72,9 +70,9 @@ def money(high): @st.composite -def adult(draw): +def adult(draw, minimum_age=67): return dict( - age=draw(st.integers(67, 95)), + age=draw(st.integers(minimum_age, 95)), disability=draw(DISABILITY), blind=draw(st.booleans()), state_pension=draw(money(15_000)), @@ -82,9 +80,15 @@ def adult(draw): @st.composite -def family(draw): +def standalone_family(draw): + """Only a claimant and optional partner, in the older allowance cohort. + + No other residents, children or carers are added by situation(). This + keeps the HB and Pension Credit residence conditions aligned, including + the absence of young people belonging to another benefit unit. + """ return dict( - adults=[draw(adult()) for _ in range(draw(st.integers(1, 2)))], + adults=[draw(adult(minimum_age=72)) for _ in range(draw(st.integers(1, 2)))], rent=draw(money(12_000)), council_tax=draw(money(3_000)), savings=draw(st.one_of(st.just(0.0), money(15_000))), @@ -143,8 +147,15 @@ def grid(families): @PROPERTY_SETTINGS -@given(st.lists(family(), min_size=1, max_size=4)) +@given(st.lists(standalone_family(), min_size=1, max_size=4)) def test_pension_age_applicable_amounts_cover_the_minimum_guarantee(families): + """Compare only older-cohort households with no other residents or carers. + + HB and Pension Credit do not have identical residence conditions: a + qualifying young person of another family may bar only HB's premium. + Those households are excluded by the generator. Couples can nominate + the qualifying partner as claimant where the other partner is blind. + """ g = grid(families) for i, fam in enumerate(families): eligible = g["housing_benefit_eligible"][i].astype(bool) @@ -156,7 +167,7 @@ def test_pension_age_applicable_amounts_cover_the_minimum_guarantee(families): @PROPERTY_SETTINGS -@given(st.lists(family(), min_size=1, max_size=4)) +@given(st.lists(standalone_family(), min_size=1, max_size=4)) def test_net_income_does_not_fall_where_guarantee_credit_ends(families): g = grid(families) net = g["household_net_income"] + g["tv_licence"] diff --git a/policyengine_uk/variables/household/demographic/has_non_dependant_for_severe_disability_premium.py b/policyengine_uk/variables/household/demographic/has_non_dependant_for_severe_disability_premium.py index 77653a3c89..46a39ad674 100644 --- a/policyengine_uk/variables/household/demographic/has_non_dependant_for_severe_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/has_non_dependant_for_severe_disability_premium.py @@ -7,7 +7,8 @@ class has_non_dependant_for_severe_disability_premium(Variable): label = "Has a non-dependant who blocks the severe disability premium" documentation = ( "A non-dependant aged 18 or over normally resides with the claimant, " - "which bars the legacy severe disability premium. Non-dependants who " + "which bars the working-age and pension-age Housing Benefit severe " + "disability premiums. Non-dependants who " "receive a severe disability premium qualifying benefit, or who are " "blind, are ignored. Every household member aged 18 or over is " "treated as a non-dependant unless they are in the claimant's family: " @@ -31,6 +32,9 @@ class has_non_dependant_for_severe_disability_premium(Variable): "https://www.legislation.gov.uk/uksi/2006/213/regulation/3", "https://www.legislation.gov.uk/uksi/2006/213/regulation/19", "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/14", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/3", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/19", + "https://www.legislation.gov.uk/uksi/2006/214/schedule/3/paragraph/6", "https://www.legislation.gov.uk/uksi/1987/1967/regulation/3", "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13", ) diff --git a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py index 8ac841cfc7..7e6e524093 100644 --- a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py @@ -7,27 +7,32 @@ class pension_age_severe_disability_premium(Variable): label = "Severe disability premium for pension-age Housing Benefit and CTR" documentation = ( "The severe disability premium in the Housing Benefit and Council Tax " - "Reduction applicable amount of a family over State Pension age. In " - "law its qualifying benefits (Attendance Allowance, the care component " - "of DLA at the middle or highest rate, the daily living component of " - "PIP at either rate, Armed Forces Independence Payment and their " - "Scottish equivalents), its conditions and its amounts (one rate, or " - "two for a couple who both qualify and have no paid carer) are the " - "same as those of the Pension Credit severe disability additional " - "amount. So this premium reads that variable, and Housing Benefit, " - "Council Tax Reduction and Pension Credit share one definition: the " - "premium cannot drop out of the Housing Benefit applicable amount " - "when Guarantee Credit ends. It therefore also shares that variable's " - "modelling simplifications." + "Reduction applicable amount of a family over State Pension age. " + "The Pension Credit severe disability addition supplies the qualifying " + "benefit, couple, carer and rate calculation. Both partners must " + "qualify unless the non-qualifying partner is blind. For that route " + "the model assumes the qualifying partner claims Housing Benefit, " + "as a couple may arrange under regulation 63(1). Housing Benefit's " + "own non-dependant test is applied separately: a qualifying young " + "person aged 18 or over in another family can block this premium " + "although Pension Credit ignores them. Its modelled residence " + "exceptions match the working-age Housing Benefit premium, so both " + "use has_non_dependant_for_severe_disability_premium. Carers are " + "attributed by is_cared_for_by_carer_benefit_recipient, including " + "carers in other benefit units in the household. The premium inherits " + "the documented limitations of those shared helpers, including the " + "omission of Universal Credit carer-element awards." ) definition_period = YEAR unit = GBP reference = ( "https://www.legislation.gov.uk/uksi/2006/214/schedule/3/paragraph/6", "https://www.legislation.gov.uk/uksi/2006/214/schedule/3/paragraph/12", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/3", + "https://www.legislation.gov.uk/uksi/2006/214/regulation/63", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/paragraph/6", "https://www.legislation.gov.uk/ssi/2012/319/schedule/1/paragraph/7", - "https://www.legislation.gov.uk/wsi/2013/3035/schedule/2/paragraph/6", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/paragraph/6", "https://www.legislation.gov.uk/uksi/2002/1792/schedule/I/paragraph/1", "https://www.legislation.gov.uk/uksi/2002/1792/regulation/6", ) @@ -35,4 +40,9 @@ class pension_age_severe_disability_premium(Variable): def formula(benunit, period, parameters): pension_age = benunit.any(benunit.members("is_SP_age", period)) addition = benunit("severe_disability_minimum_guarantee_addition", period) - return where(pension_age, addition, 0) + # HB(SPC) Sch 3 para 6(6) and reg 3 have the same residence + # exceptions as working-age HB Sch 3 para 14(4) and reg 3. + no_non_dependant = ~benunit( + "has_non_dependant_for_severe_disability_premium", period + ) + return where(pension_age & no_non_dependant, addition, 0) From 5ea3a92a4527573e31a292dc9f61796e48ea2b36 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 3 Oct 2026 07:56:43 -0400 Subject: [PATCH 5/9] Take the pension-age premium from the HB premium, not Pension Credit HB(SPC) Sch 3 para 6 has the working-age premium's conditions and para 12 its amounts, so the pension-age premium is severe_disability_premium for a family over State Pension age. A Pension Credit reform no longer moves pension-age HB or CTR. The schedule property keeps the Pension Credit addition as a cross-check. References add the CTR nomination rule and the other premium schedules; the conditions YAML notes the three income-rule defects its awards include (#1908, #2112, #2007). Co-Authored-By: Claude Opus 5.5 --- ...sion_age_severe_disability_conditions.yaml | 6 +++ ...ge_severe_disability_premium_properties.py | 12 ++++-- .../pension_age_severe_disability_premium.py | 39 +++++++++---------- .../household/income/benefits_premiums.py | 7 +++- 4 files changed, 38 insertions(+), 26 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml index 0bfcb2eb18..f1382bb123 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml @@ -1,5 +1,11 @@ # HB(SPC) Regs 2006 Sch 3 para 6, with the non-dependant definition in # reg 3: these cases assert final awards without a Guarantee Credit passport. +# The final HB and CTR awards include the model's current income rules, +# including three known defects outside this PR: a flat, CPI-uprated couple +# earnings disregard applied to pensions (#1908), no Savings Credit in HB +# income for a savings-credit-only claimant (#2112), and no non-dependant +# deduction exemption for a claimant on Attendance Allowance (#2007). The +# premium and applicable-amount assertions do not depend on them. - name: One qualifying pensioner and a non-blind partner get no HB or CTR severe premium period: 2026 diff --git a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py index 324bea9932..1475662ab8 100644 --- a/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py +++ b/policyengine_uk/tests/test_pension_age_severe_disability_premium_properties.py @@ -27,8 +27,10 @@ free TV licence for over-75s on Pension Credit is a genuine statutory cliff, so it is excluded. 3. Schedule: over State Pension age the premium is a whole number (0, 1 or - 2) of weekly severe disability rates, equals the Pension Credit severe - disability addition, and is the only premium besides the carer premium; + 2) of weekly severe disability rates, equals severe_disability_premium + and, for these households in 2026, the separately calculated Pension + Credit severe disability addition, and is the only premium besides the + carer premium; below State Pension age it is zero and benefits_premiums is the sum of the four legacy premiums, so working-age applicable amounts are unchanged. @@ -219,10 +221,14 @@ def get(variable): weekly_rate = float( simulation.tax_benefit_system.parameters( YEAR - ).gov.dwp.pension_credit.guarantee_credit.severe_disability.addition + ).gov.dwp.disability_premia.severe_single ) rates = premium / (weekly_rate * 52) assert min(abs(rates - k) for k in (0, 1, 2)) < 1e-6, rates + assert abs(premium - get("severe_disability_premium")) < 0.005 + # A cross-check, not the definition: with no other residents the + # Pension Credit addition has the same conditions and, in 2026, the + # same amounts, but its own parameter and residence test. assert ( abs(premium - get("severe_disability_minimum_guarantee_addition")) < 0.005 ) diff --git a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py index 7e6e524093..7921327326 100644 --- a/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/pension_age_severe_disability_premium.py @@ -8,20 +8,22 @@ class pension_age_severe_disability_premium(Variable): documentation = ( "The severe disability premium in the Housing Benefit and Council Tax " "Reduction applicable amount of a family over State Pension age. " - "The Pension Credit severe disability addition supplies the qualifying " - "benefit, couple, carer and rate calculation. Both partners must " - "qualify unless the non-qualifying partner is blind. For that route " - "the model assumes the qualifying partner claims Housing Benefit, " - "as a couple may arrange under regulation 63(1). Housing Benefit's " - "own non-dependant test is applied separately: a qualifying young " - "person aged 18 or over in another family can block this premium " - "although Pension Credit ignores them. Its modelled residence " - "exceptions match the working-age Housing Benefit premium, so both " - "use has_non_dependant_for_severe_disability_premium. Carers are " - "attributed by is_cared_for_by_carer_benefit_recipient, including " - "carers in other benefit units in the household. The premium inherits " - "the documented limitations of those shared helpers, including the " - "omission of Universal Credit carer-element awards." + "HB(SPC) Regs 2006 Sch 3 para 6 sets the same conditions as the " + "working-age premium (HB Regs 2006 Sch 3 para 14): the qualifying " + "benefits, both partners qualifying unless the other is blind, no " + "non-dependant aged 18 or over with the same exceptions (para 6(6), " + "reg 3), and no carer benefit paid for caring for the claimant or " + "partner. Para 12 sets the same weekly amounts. So this is " + "severe_disability_premium for a family over State Pension age, with " + "its amounts and its documented assumptions: where only one partner " + "qualifies and the other is blind, the qualifying partner is taken to " + "claim, as a couple may agree under HB(SPC) reg 63(1) and the CTR " + "schemes (England SI 2012/2885 Sch 8 para 4(1)); carers are attributed " + "by is_cared_for_by_carer_benefit_recipient, which does not count " + "Universal Credit carer-element awards. The Pension Credit severe " + "disability addition has the same conditions apart from its wider " + "residence exceptions, but its own amount parameter, so a Pension " + "Credit reform does not move this premium." ) definition_period = YEAR unit = GBP @@ -31,6 +33,7 @@ class pension_age_severe_disability_premium(Variable): "https://www.legislation.gov.uk/uksi/2006/214/regulation/3", "https://www.legislation.gov.uk/uksi/2006/214/regulation/63", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/paragraph/6", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/8/paragraph/4", "https://www.legislation.gov.uk/ssi/2012/319/schedule/1/paragraph/7", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/paragraph/6", "https://www.legislation.gov.uk/uksi/2002/1792/schedule/I/paragraph/1", @@ -39,10 +42,4 @@ class pension_age_severe_disability_premium(Variable): def formula(benunit, period, parameters): pension_age = benunit.any(benunit.members("is_SP_age", period)) - addition = benunit("severe_disability_minimum_guarantee_addition", period) - # HB(SPC) Sch 3 para 6(6) and reg 3 have the same residence - # exceptions as working-age HB Sch 3 para 14(4) and reg 3. - no_non_dependant = ~benunit( - "has_non_dependant_for_severe_disability_premium", period - ) - return where(pension_age & no_non_dependant, addition, 0) + return where(pension_age, benunit("severe_disability_premium", period), 0) diff --git a/policyengine_uk/variables/household/income/benefits_premiums.py b/policyengine_uk/variables/household/income/benefits_premiums.py index 0b3d0b5fa6..ff6a0846c7 100644 --- a/policyengine_uk/variables/household/income/benefits_premiums.py +++ b/policyengine_uk/variables/household/income/benefits_premiums.py @@ -26,8 +26,7 @@ class benefits_premiums(Variable): "Premiums in the Housing Benefit, Council Tax Reduction and Income " "Support applicable amounts. A family with a member over State " "Pension age uses the pension-age schedules: the severe disability " - "premium, shared with the Pension Credit severe disability addition, " - "and the carer premium. Those schedules have no adult disability or " + "premium and the carer premium. Those schedules have no adult disability or " "enhanced disability premium." ) definition_period = YEAR @@ -35,7 +34,11 @@ class benefits_premiums(Variable): reference = ( "https://www.legislation.gov.uk/uksi/2006/214/schedule/3", "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2", + "https://www.legislation.gov.uk/ssi/2012/319/schedule/1", + "https://www.legislation.gov.uk/wsi/2013/3035/schedule/2", + "https://www.legislation.gov.uk/nisr/2006/406/schedule/3", "https://www.legislation.gov.uk/uksi/2006/213/schedule/3", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2", ) def formula(benunit, period, parameters): From 2ffe7142cda33ed7182172492b5d5b56c055cd86 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 3 Oct 2026 14:47:52 -0400 Subject: [PATCH 6/9] Cite Schedule 4 for the Northern Ireland pension-age premiums SR 2006/406 Schedule 3 lists excluded tenancies; the applicable amounts, including the premiums, are in Schedule 4. Co-Authored-By: Claude Opus 5.5 --- policyengine_uk/variables/household/income/benefits_premiums.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk/variables/household/income/benefits_premiums.py b/policyengine_uk/variables/household/income/benefits_premiums.py index ff6a0846c7..17780055eb 100644 --- a/policyengine_uk/variables/household/income/benefits_premiums.py +++ b/policyengine_uk/variables/household/income/benefits_premiums.py @@ -36,7 +36,7 @@ class benefits_premiums(Variable): "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2", "https://www.legislation.gov.uk/ssi/2012/319/schedule/1", "https://www.legislation.gov.uk/wsi/2013/3035/schedule/2", - "https://www.legislation.gov.uk/nisr/2006/406/schedule/3", + "https://www.legislation.gov.uk/nisr/2006/406/schedule/4", "https://www.legislation.gov.uk/uksi/2006/213/schedule/3", "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2", ) From 44c27e085ee6c8d11518abecbec978e480348c21 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 3 Oct 2026 14:58:00 -0400 Subject: [PATCH 7/9] Name the Universal Credit carer-element omission in the changelog Co-Authored-By: Claude Opus 5.5 --- changelog.d/hb-pension-age-severe-disability-premium.fixed.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md index f4bd3d5f3e..af80310425 100644 --- a/changelog.d/hb-pension-age-severe-disability-premium.fixed.md +++ b/changelog.d/hb-pension-age-severe-disability-premium.fixed.md @@ -1 +1 @@ -- Corrected pension-age Housing Benefit and Council Tax Reduction premiums by removing adult disability and adult enhanced disability premiums absent from their statutory schedules and applying the severe disability premium's qualifying-benefit, couple, Housing Benefit non-dependant and shared carer-attribution conditions. +- Corrected pension-age Housing Benefit and Council Tax Reduction premiums by removing adult disability and adult enhanced disability premiums absent from their statutory schedules and applying the severe disability premium's qualifying-benefit, couple, Housing Benefit non-dependant and shared carer-attribution conditions. The carer condition does not yet count Universal Credit carer-element awards (#2120). From a16b6775dbf6540f41829ade0fc767a9f648d88c Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 3 Oct 2026 15:19:02 -0400 Subject: [PATCH 8/9] Update pension-age HB awards for main's earnings-disregard fix Main's #1908 takes the Housing Benefit earnings disregards from net earnings only, so State Pension income is no longer reduced by them. The six final awards here fall by 65% of the old disregard; the premium and applicable-amount assertions are unchanged. Co-Authored-By: Claude Opus 5.5 --- ...sion_age_severe_disability_conditions.yaml | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml index f1382bb123..34bb2652a1 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_severe_disability_conditions.yaml @@ -1,11 +1,12 @@ # HB(SPC) Regs 2006 Sch 3 para 6, with the non-dependant definition in # reg 3: these cases assert final awards without a Guarantee Credit passport. # The final HB and CTR awards include the model's current income rules, -# including three known defects outside this PR: a flat, CPI-uprated couple -# earnings disregard applied to pensions (#1908), no Savings Credit in HB +# including two known defects outside this PR: no Savings Credit in HB # income for a savings-credit-only claimant (#2112), and no non-dependant # deduction exemption for a claimant on Attendance Allowance (#2007). The -# premium and applicable-amount assertions do not depend on them. +# premium and applicable-amount assertions do not depend on them. Each HB +# award is the rent less 65% of income after tax above the applicable +# amount; State Pension gets no earnings disregard (#1908). - name: One qualifying pensioner and a non-blind partner get no HB or CTR severe premium period: 2026 @@ -33,7 +34,7 @@ guarantee_credit: 0 severe_disability_minimum_guarantee_addition: 0 pension_age_severe_disability_premium: 0 - housing_benefit: 2_883.79 + housing_benefit: 2_409.03 council_tax_benefit: 821.24 - name: Both qualifying pensioners keep two rates in their final HB and CTR awards @@ -62,7 +63,7 @@ output: guarantee_credit: 0 pension_age_severe_disability_premium: 172.10 * 52 - housing_benefit: 6_240 + housing_benefit: 6_146.01 council_tax_benefit: 1_857.22 - name: A qualifying pensioner with a blind non-qualifying partner gets one HB and CTR rate @@ -91,7 +92,7 @@ output: guarantee_credit: 0 pension_age_severe_disability_premium: 86.05 * 52 - housing_benefit: 5_792.28 + housing_benefit: 5_317.52 council_tax_benefit: 1_704.27 - name: A non-ignored adult resident blocks the pensioner's HB and CTR severe premium @@ -122,7 +123,7 @@ guarantee_credit: [0, 0] has_non_dependant_for_severe_disability_premium: [true, false] pension_age_severe_disability_premium: [0, 0] - housing_benefit: [4_136.08, 0] + housing_benefit: [3_898.70, 0] council_tax_benefit: [1_279.60, 0] - name: An 18-year-old of another family blocks HB and CTR although Pension Credit ignores him @@ -162,7 +163,7 @@ has_non_dependant_for_severe_disability_premium: [true, false] pension_age_severe_disability_premium: [0, 0] housing_benefit_applicable_amount: [13_312, 0] - housing_benefit: [4_136.08, 0] + housing_benefit: [3_898.70, 0] council_tax_benefit: [1_097.91, 0] - name: A qualifying-benefit resident in another benefit unit can still be the pensioner's paid carer @@ -204,5 +205,5 @@ has_non_dependant_for_severe_disability_premium: [false, false] is_cared_for_by_carer_benefit_recipient: [true, false] pension_age_severe_disability_premium: [0, 0] - housing_benefit: [4_136.08, 0] + housing_benefit: [3_898.70, 0] council_tax_benefit: [1_279.60, 0] From fdeb64703f604f80b4a306a1ac9732de1b840a09 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 3 Oct 2026 16:49:10 -0400 Subject: [PATCH 9/9] Correct the HB income in a pension-age premium test comment Main's #1908 no longer deducts earnings disregards from State Pension income, so the case's HB income is 16,914 (18,000 less 20% tax above the personal allowance), still below the applicable amount. The expected award is unchanged. Co-Authored-By: Claude Opus 5.5 --- .../benefit/family/housing_benefit/pension_age_premiums.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml index 7d7059d142..6a6f03994f 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/pension_age_premiums.yaml @@ -35,7 +35,7 @@ pension_age_severe_disability_premium: 86.05 * 52 benefits_premiums: 86.05 * 52 # The claimant reached pension age before 1 April 2021, so the older - # allowance applies. HB income 16,548.80 is below the applicable amount, + # allowance applies. HB income 16,914 is below the applicable amount, # (256.00 + 86.05) * 52 = 17,786.60, so HB and CTR are at their maximum. housing_benefit: 6_240 council_tax_benefit: 2_000