From 2858989d7f647dbe91d6967fc940cfceffbd6b76 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 22 Oct 2026 01:08:10 -0400 Subject: [PATCH 1/3] Read only the claimant's and partner's ESA in the Pension Credit earnings disregard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The higher Pension Credit earnings disregard (SPC Regs 2002 Sch VI para 4(1)(a)(vii)) applies when "the claimant or, if he has a partner, his partner" is in receipt of employment and support allowance. Its benefit-unit list read esa_income, the benefit unit's income-related ESA, which also holds an award that another member (neither claimant, partner nor a dependant) claims in their own right. The list now names claimant_or_partner_esa_income (#2027), so that member's award no longer raises the claimant's disregard from £5 or £10 to £20 a week. Adds excluded-adult YAML cases and controls in legacy_award_readers/pension_credit_earnings_disregard.yaml (two of the four fail on the old list), adds pension_credit_earnings_disregard to FAMILY_READERS in the legacy award reader properties, and renames the list entry in the Pension Credit earnings disregard property test. Follow-up to #2026 and #2027; the reader came from #2019. Co-Authored-By: Claude Opus 5.5 --- .../disability_benefit_unit_benefits.yaml | 11 +- .../higher/disability_benefits.yaml | 4 +- .../pension_credit_earnings_disregard.yaml | 122 ++++++++++++++++++ .../test_legacy_award_readers_properties.py | 29 +++-- ...on_credit_earnings_disregard_properties.py | 4 +- 5 files changed, 148 insertions(+), 22 deletions(-) create mode 100644 policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/pension_credit_earnings_disregard.yaml diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml index 8e31a28658..9800da4b22 100644 --- a/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml @@ -1,10 +1,11 @@ description: > Benefit-unit awards whose receipt qualifies the benefit unit for the higher Pension Credit earnings disregard (Sch. VI para. 4(1)(a)(vii), employment - and support allowance, from 27 October 2008). The model holds income-related - employment and support allowance on the benefit unit, as the claimant's - award; contributory employment and support allowance is a person-level - benefit in `disability_benefits`. + and support allowance, from 27 October 2008). The claimant's or partner's + income-related employment and support allowance is held on the benefit unit + (claimant_or_partner_esa_income); an award another member of the benefit + unit claims in their own right does not count. Contributory employment and + support allowance is a person-level benefit in `disability_benefits`. metadata: label: Pension Credit higher earnings disregard benefit-unit disability benefits unit: list @@ -16,4 +17,4 @@ metadata: values: 2003-10-06: [] 2008-10-27: - - esa_income + - claimant_or_partner_esa_income diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefits.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefits.yaml index 6aa826b95b..61458b0266 100644 --- a/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefits.yaml +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefits.yaml @@ -1,8 +1,8 @@ description: > Person-level benefits whose receipt by the claimant or partner qualifies the benefit unit for the higher Pension Credit earnings disregard (Sch. VI para. - 4(1)(a)). Income-related employment and support allowance, a benefit-unit - award, is in `disability_benefit_unit_benefits`. + 4(1)(a)). The claimant's or partner's income-related employment and support + allowance, a benefit-unit award, is in `disability_benefit_unit_benefits`. `incapacity_benefit` stands for long-term incapacity benefit (para. 4(1)(a)(i)); the model does not separate the short-term rates. Not modelled: the war pensions mobility supplement (v), which has no variable; pension age diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/pension_credit_earnings_disregard.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/pension_credit_earnings_disregard.yaml new file mode 100644 index 0000000000..bca7da11ad --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/legacy_award_readers/pension_credit_earnings_disregard.yaml @@ -0,0 +1,122 @@ +# State Pension Credit Regs 2002 Sch VI para 4(1)(a)(vii): £20 a week of +# earnings is disregarded if "the claimant or, if he has a partner, his +# partner" is in receipt of employment and support allowance; otherwise £5 a +# week for a single claimant and £10 for a couple (para 5), capped at the +# earnings. "other" is a member who is neither the claimant, the partner nor a +# child or young person they are responsible for, so their income-related ESA +# is their own claim and does not raise the claimant's disregard; nor does +# their contributory ESA, a person-level award read only for the claimant and +# partner. The claimant's £3,000 of earnings is below the income tax personal +# allowance, and a claimant over state pension age pays no National Insurance, +# so the net earnings under reg. 17(9) and (10) are the £3,000 itself. + +- name: Another member's income-related ESA leaves a single pensioner with the £5 earnings disregard + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + employment_income: 3_000 + other: + age: 30 + is_claimant_or_partner: false + current_education: NOT_IN_EDUCATION + esa_income_reported: 5_000 + benunits: + benunit: + members: [claimant, other] + households: + household: + members: [claimant, other] + output: + esa_income: 5_000 + claimant_or_partner_esa_income: 0 + ni_class_1_employee: [0, 0] + pension_credit_employment_income_tax: 0 + pension_credit_earnings: 3_000 + # 5 x 52 + pension_credit_earnings_disregard: 260 + +- name: Another member's income-related ESA leaves a couple with the £10 earnings disregard + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + employment_income: 3_000 + partner: + age: 68 + is_claimant_or_partner: true + other: + age: 30 + is_claimant_or_partner: false + current_education: NOT_IN_EDUCATION + esa_income_reported: 5_000 + benunits: + benunit: + members: [claimant, partner, other] + households: + household: + members: [claimant, partner, other] + output: + claimant_or_partner_esa_income: 0 + pension_credit_earnings: 3_000 + # 10 x 52 + pension_credit_earnings_disregard: 520 + +- name: The partner's income-related ESA gives the couple the £20 earnings disregard + # A mixed-age couple: the partner is under state pension age. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + employment_income: 3_000 + partner: + age: 60 + is_claimant_or_partner: true + esa_income_reported: 5_000 + benunits: + benunit: + members: [claimant, partner] + households: + household: + members: [claimant, partner] + output: + claimant_or_partner_esa_income: 5_000 + pension_credit_earnings: 3_000 + # 20 x 52 + pension_credit_earnings_disregard: 1_040 + +- name: Another member's contributory ESA leaves a single pensioner with the £5 earnings disregard + period: 2026 + absolute_error_margin: 0.01 + input: + people: + claimant: + age: 70 + is_claimant_or_partner: true + employment_income: 3_000 + other: + age: 30 + is_claimant_or_partner: false + current_education: NOT_IN_EDUCATION + esa_contrib_reported: 5_000 + benunits: + benunit: + members: [claimant, other] + households: + household: + members: [claimant, other] + output: + esa_contrib: [0, 5_000] + claimant_or_partner_esa_income: 0 + pension_credit_earnings: 3_000 + # 5 x 52 + pension_credit_earnings_disregard: 260 diff --git a/policyengine_uk/tests/test_legacy_award_readers_properties.py b/policyengine_uk/tests/test_legacy_award_readers_properties.py index 7850e3a79a..2711d2fe47 100644 --- a/policyengine_uk/tests/test_legacy_award_readers_properties.py +++ b/policyengine_uk/tests/test_legacy_award_readers_properties.py @@ -27,6 +27,8 @@ SI 2019/37 arts 2(3) and 4, through SI 2006/214 reg 5. - The extended childcare parent and partner conditions: SI 2022/1134 regs 11A(1)(e), 14(4)(b) and 15(4). +- The higher Pension Credit earnings disregard for a claimant or partner on + employment and support allowance: SPC Regs 2002 Sch VI para 4(1)(a)(vii). A member of the benefit unit who is neither the claimant, the partner nor a child or young person they are responsible for (for example a non-dependent @@ -121,6 +123,7 @@ "income_support_eligible", "housing_benefit_pension_age_regulations_apply", "has_mixed_age_couple_pension_credit_saving", + "pension_credit_earnings_disregard", ] MEMBER_READERS = [ "is_scp_eligible", @@ -486,19 +489,19 @@ def test_adult_non_dependant_ends_the_severe_disability_premium(): # --- Further family shapes (begin) --- # Some readers only bite for a claimant over state pension age (the Housing -# Benefit regulations that apply, the mixed-age couple saving), for a single -# applicant under 25, or for parents of a young child of whom only one works -# (the extended childcare partner condition). The families above rarely take -# those shapes, so three more properties check every family and member reader -# on them. The claimant and partner seldom report an award themselves, and on -# the savings drawn below the £16,000 capital limit the added member's award -# survives tariff income, so a reader that wrongly counts it changes (£20,000 -# of savings screens income-related ESA and income-based JSA to nil). The -# shapes pay no rent, so Universal Credit stays far below the benefit cap. -# The cap reads only the couple's own awards and the family's -# (benefit_cap_reduction), not another member's; the first property checks -# that on JSA_COUPLE_WITH_LODGER, a family that an added member's £3,000 of -# JSA would take over the cap if it counted. +# Benefit regulations that apply, the Pension Credit earnings disregard, the +# mixed-age couple saving), for a single applicant under 25, or for parents of +# a young child of whom only one works (the extended childcare partner +# condition). The families above rarely take those shapes, so three more +# properties check every family and member reader on them. The claimant and +# partner seldom report an award themselves, and on the savings drawn below the +# £16,000 capital limit the added member's award survives tariff income, so a +# reader that wrongly counts it changes (£20,000 of savings screens +# income-related ESA and income-based JSA to nil). The shapes pay no rent, so +# Universal Credit stays far below the benefit cap. The cap reads only the +# couple's own awards and the family's (benefit_cap_reduction), not another +# member's; the first property checks that on JSA_COUPLE_WITH_LODGER, a family +# that an added member's £3,000 of JSA would take over the cap if it counted. PENSION_AGE = 68 # Whether the pension-age property enters is_mixed_age_couple, so that a # reader of the couple's award reports is tested on those reports alone. diff --git a/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py b/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py index cad0a87ef3..8b8696e236 100644 --- a/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py +++ b/policyengine_uk/tests/test_pension_credit_earnings_disregard_properties.py @@ -318,9 +318,9 @@ def lists(date): return set(p.disability_benefits), set(p.disability_benefit_unit_benefits) person, unit = lists("2008-10-26") - assert "esa_contrib" not in person and "esa_income" not in unit + assert "esa_contrib" not in person and "claimant_or_partner_esa_income" not in unit person, unit = lists("2008-10-27") - assert "esa_contrib" in person and "esa_income" in unit + assert "esa_contrib" in person and "claimant_or_partner_esa_income" in unit person, _ = lists("2013-04-07") assert "pip" not in person and "armed_forces_independence_payment" not in person person, _ = lists("2013-04-08") From 57bef110b78b3ba1c1044c054607bde0861685bc Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 22 Oct 2026 01:08:14 -0400 Subject: [PATCH 2/3] Add a changelog entry for the Pension Credit earnings disregard switch Co-Authored-By: Claude Opus 5.5 --- changelog.d/legacy-award-reader-switches-2019.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/legacy-award-reader-switches-2019.fixed.md diff --git a/changelog.d/legacy-award-reader-switches-2019.fixed.md b/changelog.d/legacy-award-reader-switches-2019.fixed.md new file mode 100644 index 0000000000..43f8ab30b7 --- /dev/null +++ b/changelog.d/legacy-award-reader-switches-2019.fixed.md @@ -0,0 +1 @@ +- Count only the claimant's and partner's own income-related ESA towards the higher Pension Credit earnings disregard (SPC Regs 2002 Sch VI para 4(1)(a)(vii)): an award another member of the benefit unit claims in their own right no longer raises the disregard to £20 a week. From 5f917432689c8e4f1d9eb57f59cb95052df86259 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 22 Oct 2026 03:29:39 -0400 Subject: [PATCH 3/3] Keep the further-shapes comment as it was; quote the scoped award's name The Pension Credit earnings disregard has no age gate in the model: it is worked out for every benefit unit with earnings, and the working-age 'never change' property already fails on the old list. So it does not belong among the readers that "only bite for a claimant over state pension age"; restore main's wording of that comment. Put claimant_or_partner_esa_income in backticks in the parameter description, like disability_benefits. Review r1 findings (2026-10-22). Co-Authored-By: Claude Opus 5.5 --- .../disability_benefit_unit_benefits.yaml | 2 +- .../test_legacy_award_readers_properties.py | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml b/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml index 9800da4b22..7ac86d00e0 100644 --- a/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml +++ b/policyengine_uk/parameters/gov/dwp/pension_credit/earnings_disregard/higher/disability_benefit_unit_benefits.yaml @@ -3,7 +3,7 @@ description: > Pension Credit earnings disregard (Sch. VI para. 4(1)(a)(vii), employment and support allowance, from 27 October 2008). The claimant's or partner's income-related employment and support allowance is held on the benefit unit - (claimant_or_partner_esa_income); an award another member of the benefit + (`claimant_or_partner_esa_income`); an award another member of the benefit unit claims in their own right does not count. Contributory employment and support allowance is a person-level benefit in `disability_benefits`. metadata: diff --git a/policyengine_uk/tests/test_legacy_award_readers_properties.py b/policyengine_uk/tests/test_legacy_award_readers_properties.py index 2711d2fe47..455f4cfe35 100644 --- a/policyengine_uk/tests/test_legacy_award_readers_properties.py +++ b/policyengine_uk/tests/test_legacy_award_readers_properties.py @@ -489,19 +489,19 @@ def test_adult_non_dependant_ends_the_severe_disability_premium(): # --- Further family shapes (begin) --- # Some readers only bite for a claimant over state pension age (the Housing -# Benefit regulations that apply, the Pension Credit earnings disregard, the -# mixed-age couple saving), for a single applicant under 25, or for parents of -# a young child of whom only one works (the extended childcare partner -# condition). The families above rarely take those shapes, so three more -# properties check every family and member reader on them. The claimant and -# partner seldom report an award themselves, and on the savings drawn below the -# £16,000 capital limit the added member's award survives tariff income, so a -# reader that wrongly counts it changes (£20,000 of savings screens -# income-related ESA and income-based JSA to nil). The shapes pay no rent, so -# Universal Credit stays far below the benefit cap. The cap reads only the -# couple's own awards and the family's (benefit_cap_reduction), not another -# member's; the first property checks that on JSA_COUPLE_WITH_LODGER, a family -# that an added member's £3,000 of JSA would take over the cap if it counted. +# Benefit regulations that apply, the mixed-age couple saving), for a single +# applicant under 25, or for parents of a young child of whom only one works +# (the extended childcare partner condition). The families above rarely take +# those shapes, so three more properties check every family and member reader +# on them. The claimant and partner seldom report an award themselves, and on +# the savings drawn below the £16,000 capital limit the added member's award +# survives tariff income, so a reader that wrongly counts it changes (£20,000 +# of savings screens income-related ESA and income-based JSA to nil). The +# shapes pay no rent, so Universal Credit stays far below the benefit cap. +# The cap reads only the couple's own awards and the family's +# (benefit_cap_reduction), not another member's; the first property checks +# that on JSA_COUPLE_WITH_LODGER, a family that an added member's £3,000 of +# JSA would take over the cap if it counted. PENSION_AGE = 68 # Whether the pension-age property enters is_mixed_age_couple, so that a # reader of the couple's award reports is tested on those reports alone.