From aeaf232c07a7f9bb677b19b1541019a31d7d334e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 5 Oct 2026 08:46:37 -0400 Subject: [PATCH 1/2] Add the savings-credit-only HB regression case (#1945) and the CTR corporate_wealth note (#1909) Housing Benefit: a no-earnings savings-credit-only household built only from age, pensions, rent, tenure and capital, with no override of the earnings disregard or any Pension Credit or Housing Benefit income intermediate. The expected Pension Credit income, savings credit payable, reg 27(4) modification, assessable capital and final Housing Benefit are hand-computed from SI 2006/214 reg 27 and the repo's 2026 parameters, with the arithmetic in comments. Removing the reg 27(4)(a) savings-credit addition fails it. Council tax reduction: two cases pinning that Pension Credit capital counts corporate_wealth and not private_pension_wealth, and a changelog note that the capital-route loss in #1909 is an artefact of the corporate_wealth proxy (#1837, #1936). Co-Authored-By: Claude Sonnet 5.5 --- changelog.d/followups-1909-1945.changed.md | 1 + .../housing_benefit_savings_credit_only.yaml | 88 +++++++++++++++++-- .../council_tax_reduction_pension_credit.yaml | 84 ++++++++++++++++++ 3 files changed, 167 insertions(+), 6 deletions(-) create mode 100644 changelog.d/followups-1909-1945.changed.md diff --git a/changelog.d/followups-1909-1945.changed.md b/changelog.d/followups-1909-1945.changed.md new file mode 100644 index 0000000000..2be7aca163 --- /dev/null +++ b/changelog.d/followups-1909-1945.changed.md @@ -0,0 +1 @@ +Note on #1909's council tax reduction capital-route loss, which hits savings-credit-only pensioners whose Pension Credit capital passes £16,000 while their household savings do not: in that PR's dataset run it rested on the `corporate_wealth` proxy, which #1837 and #1936 describe as mostly imputed pension wealth. Pension Credit's capital sources count `corporate_wealth` but not `private_pension_wealth`, and `council_tax_reduction_assessable_capital` uses Pension Credit's figure for these pensioners. In datasets built before the `private_pension_wealth` split, `corporate_wealth` also holds the imputed pension wealth, which Pension Credit disregards (State Pension Credit Regulations 2002 Sch V paras 22 and 23). That loss is an artefact of the proxy, so council tax reduction offsets in pension costings that rest on it should not be read as real effects; a benefit unit that records `pension_credit_reported_capital` bypasses the proxy. Two council tax reduction test cases pin this. Also add a Housing Benefit regression case for #1945: a savings-credit-only pensioner built from age, pensions, rent, tenure and capital alone, with no disregard or income override. diff --git a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_savings_credit_only.yaml b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_savings_credit_only.yaml index 1c45251f4f..bc8af60aad 100644 --- a/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_savings_credit_only.yaml +++ b/policyengine_uk/tests/policy/baseline/finance/benefit/family/housing_benefit/housing_benefit_savings_credit_only.yaml @@ -25,12 +25,13 @@ # reached it before April 2016, so can have savings credit, and pays no # National Insurance. # -# Robustness to the other open Housing Benefit fixes: the tenants rent from -# the council, so the Local Housing Allowance order cannot apply; every case -# sets housing_benefit_applicable_income_disregard to the value the earnings -# disregard fix (PolicyEngine/policyengine-uk#1908) gives, 0 for a family with -# no earnings; and no claimant has a disability benefit, so the severe -# disability premium fix (#1938) does not change the applicable amount. +# Robustness to the other Housing Benefit fixes: the tenants rent from the +# council, so the Local Housing Allowance order cannot apply; cases 1 to 8 +# set housing_benefit_applicable_income_disregard to the value the earnings +# disregard fix (PolicyEngine/policyengine-uk#1908, merged) gives, 0 for a +# family with no earnings, and case 9 leaves it to the model; and no claimant +# has a disability benefit, so the severe disability premium fix (#1938) does +# not change the applicable amount. - name: Case 1, savings credit only, the savings credit payable is added to the Pension Credit income. period: 2026 @@ -325,3 +326,78 @@ # 12,914, below the applicable amount of 13,312. housing_benefit_applicable_income: 12_914 housing_benefit: 7_800 + +- name: Case 9, savings credit only, no earnings, built from age, pensions, rent, tenure and capital alone, with nothing overridden. + period: 2026 + absolute_error_margin: 0.01 + # A regression guard for the integrated route (reviewer request on #1945, 1 + # and 5 October 2026). The inputs are only age, pensions, rent, tenure and + # savings: no Housing Benefit disregard, no childcare, and no Pension Credit + # or Housing Benefit income intermediate is set, so every figure below is + # the model's own. Cases 1 to 8 set the earnings disregard directly. + # + # Law, SI 2006/214 reg 27 (NI: SR 2006/406 reg 25), read on + # legislation.gov.uk on 5 October 2026: (1) the authority uses the Secretary + # of State's calculation of income and capital for the savings-credit-only + # award; (4) it modifies the net income "only in so far as necessary to take + # into account" (a) the savings credit payable, (b) childcare charges, (c) + # and (d) the higher earnings and additional disregards, (e) to (g) items + # outside this household; (5) its own income rules, tariff income included, + # do not apply to the Secretary of State's figure; (6) capital is the + # Secretary of State's, with the £16,000 limit applied to it. + # + # 2026 parameters, as in the cases above: minimum guarantee £238.00 a week + # single (12,376 a year); savings credit threshold £208.07 (10,819.64), + # phase-in 60% and withdrawal 40%; Housing Benefit aged personal allowance + # £256.00 (13,312); taper 65%; personal allowance 12,570 and basic rate 20%. + input: + people: + person1: + age: 83 + state_pension: 10_200 + private_pension_income: 3_100 + benunits: + benunit: + members: [person1] + households: + household: + members: [person1] + rent: 6_240 + tenure_type: RENT_FROM_COUNCIL + savings: 13_900 + output: + # (10,200 + 3,100 - 12,570) x 0.2 = 730 x 0.2 = 146. + income_tax: 146 + # (13,900 - 10,000) / 500 = 7.8, so 8 steps of £1 a week; 8 x 52 = 416. + pension_credit_assessable_capital: 13_900 + pension_credit_deemed_income: 416 + # The Secretary of State's net income: 13,300 - 146 + 416 = 13,570. Above + # the minimum guarantee of 12,376, so no guarantee credit. + pension_credit_income: 13_570 + guarantee_credit: 0 + # Savings credit payable: the maximum is 0.6 x (12,376 - 10,819.64) = + # 933.816, below 0.6 x (13,570 - 10,819.64) = 1,650.216, so it is the + # maximum; less 0.4 x (13,570 - 12,376) = 477.60; 933.816 - 477.60 = + # 456.216. + savings_credit: 456.22 + pension_credit: 456.22 + in_receipt_of_savings_credit_only: true + # The reg 27(4) modification to the net income of 13,570: (a) adds the + # savings credit payable, 456.216. There is no (b) childcare, and with no + # earnings no (c) or (d) disregard, so the modification is +456.216. + housing_benefit_applicable_income_childcare_element: 0 + housing_benefit_applicable_income_disregard: 0 + # 13,570 + 456.216 - 0 - 0 = 14,026.216. Without (a) it would be 13,570. + housing_benefit_savings_credit_only_income: 14_026.22 + # Reg 27(5): no Housing Benefit tariff income on top of the deemed income + # inside the 13,570. + housing_benefit_tariff_income: 0 + housing_benefit_applicable_income: 14_026.22 + housing_benefit_applicable_amount: 13_312 + # Reg 27(6): the Secretary of State's capital, 13,900, within the limit. + housing_benefit_assessable_capital: 13_900 + housing_benefit_eligible: true + # 6,240 - 0.65 x (14,026.216 - 13,312) = 6,240 - 0.65 x 714.216 = + # 6,240 - 464.2404 = 5,775.7596. Without (a), 6,240 - 0.65 x (13,570 - + # 13,312) = 6,240 - 167.70 = 6,072.30. + housing_benefit: 5_775.76 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml index 6e52f66d3d..cd7ed13c33 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml @@ -616,3 +616,87 @@ in_receipt_of_savings_credit_only: true council_tax_reduction_assessable_capital: 16_000.01 council_tax_reduction: 0 + +# The next two cases pin where the capital-route loss of the savings-credit-only +# route comes from, so that it is not read as a real effect (#1909 follow-up; +# #1837, #1936). Pension Credit's capital sources count `corporate_wealth` and +# not `private_pension_wealth` (State Pension Credit Regulations 2002 Sch V +# paras 22 and 23 disregard the value of a right to a pension), and a +# savings-credit-only recipient is tested on the Pension Credit figure. In +# datasets built before the `private_pension_wealth` split, `corporate_wealth` +# also holds imputed private pension wealth, so the first case's loss is an +# artefact of the proxy there. The first case pins today's behaviour and will +# change once the data splits the column. + +- name: Savings credit only is excluded on corporate_wealth alone, although household savings are nil + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 90 + state_pension: 12_000 + private_pension_income: 1_500 + benunits: + benunit: + members: [pensioner] + claims_all_entitled_benefits: true + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + corporate_wealth: 20_000 + output: + # (12,000 + 1,500 - 12,570) x 0.2 = 186. (20,000 - 10,000) / 500 = 20 + # steps of £1 a week; 20 x 52 = 1,040 of deemed income. + pension_credit_assessable_capital: 20_000 + pension_credit_deemed_income: 1_040 + # 13,500 - 186 + 1,040 = 14,354, above the minimum guarantee of 12,376. + pension_credit_income: 14_354 + guarantee_credit: 0 + # 933.816 - 0.4 x (14,354 - 12,376) = 933.816 - 791.20 = 142.616. + savings_credit: 142.62 + in_receipt_of_savings_credit_only: true + # The Pension Credit capital is 20,000, over 16,000, with nil savings in + # the household. The same pensioner with 20,000 of private_pension_wealth + # keeps CTR in the next case. + council_tax_reduction_assessable_capital: 20_000 + council_tax_reduction: 0 + +- name: Savings credit only is not excluded on private_pension_wealth, which Pension Credit disregards + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 90 + state_pension: 12_000 + private_pension_income: 1_500 + benunits: + benunit: + members: [pensioner] + claims_all_entitled_benefits: true + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + private_pension_wealth: 20_000 + output: + # No capital counts, so no deemed income: as with no wealth at all, + # 13,500 - 186 = 13,314 and 933.816 - 0.4 x (13,314 - 12,376) = 558.616. + pension_credit_assessable_capital: 0 + pension_credit_deemed_income: 0 + pension_credit_income: 13_314 + savings_credit: 558.62 + in_receipt_of_savings_credit_only: true + council_tax_reduction_assessable_capital: 0 + # 2,000 - 0.2 x (13,314 + 558.616 - 13,312) = 2,000 - 112.1232 = 1,887.8768. + council_tax_reduction: 1_887.88 From ca9d39a032c7588b2dc0069b14e4fa26a72a721b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 5 Oct 2026 21:13:58 -0400 Subject: [PATCH 2/2] Clarify the corporate_wealth note and CTR test names (review nits) Co-Authored-By: Claude Opus 5.5 --- changelog.d/followups-1909-1945.changed.md | 2 +- .../council_tax_reduction_pension_credit.yaml | 28 +++++++++++-------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/changelog.d/followups-1909-1945.changed.md b/changelog.d/followups-1909-1945.changed.md index 2be7aca163..3a3dae0686 100644 --- a/changelog.d/followups-1909-1945.changed.md +++ b/changelog.d/followups-1909-1945.changed.md @@ -1 +1 @@ -Note on #1909's council tax reduction capital-route loss, which hits savings-credit-only pensioners whose Pension Credit capital passes £16,000 while their household savings do not: in that PR's dataset run it rested on the `corporate_wealth` proxy, which #1837 and #1936 describe as mostly imputed pension wealth. Pension Credit's capital sources count `corporate_wealth` but not `private_pension_wealth`, and `council_tax_reduction_assessable_capital` uses Pension Credit's figure for these pensioners. In datasets built before the `private_pension_wealth` split, `corporate_wealth` also holds the imputed pension wealth, which Pension Credit disregards (State Pension Credit Regulations 2002 Sch V paras 22 and 23). That loss is an artefact of the proxy, so council tax reduction offsets in pension costings that rest on it should not be read as real effects; a benefit unit that records `pension_credit_reported_capital` bypasses the proxy. Two council tax reduction test cases pin this. Also add a Housing Benefit regression case for #1945: a savings-credit-only pensioner built from age, pensions, rent, tenure and capital alone, with no disregard or income override. +- Note that the council tax reduction (CTR) capital-route loss in #1909 is an artefact of the `corporate_wealth` proxy, so CTR offsets in pension costings that rest on it should not be read as real effects. A pensioner whose Pension Credit award is savings credit only is tested against the CTR capital limit on Pension Credit's capital (`council_tax_reduction_assessable_capital`), and Pension Credit's capital sources count `corporate_wealth` but not `private_pension_wealth`. In datasets built before the `private_pension_wealth` split, `corporate_wealth` also holds imputed pension wealth, which Pension Credit disregards (State Pension Credit Regulations 2002 Sch V paras 22 and 23), so these pensioners can fail the £16,000 limit on pension wealth that is not countable capital. A benefit unit that records `pension_credit_reported_capital` bypasses the proxy. See #1837 and #1936. Two CTR test cases pin the route, and a new Housing Benefit case pins the savings-credit-only route of #1945 for a household built from age, pensions, rent, tenure and capital alone. diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml index cd7ed13c33..e07ff2f6f8 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pension_credit.yaml @@ -617,18 +617,22 @@ council_tax_reduction_assessable_capital: 16_000.01 council_tax_reduction: 0 -# The next two cases pin where the capital-route loss of the savings-credit-only -# route comes from, so that it is not read as a real effect (#1909 follow-up; -# #1837, #1936). Pension Credit's capital sources count `corporate_wealth` and -# not `private_pension_wealth` (State Pension Credit Regulations 2002 Sch V -# paras 22 and 23 disregard the value of a right to a pension), and a -# savings-credit-only recipient is tested on the Pension Credit figure. In -# datasets built before the `private_pension_wealth` split, `corporate_wealth` -# also holds imputed private pension wealth, so the first case's loss is an -# artefact of the proxy there. The first case pins today's behaviour and will -# change once the data splits the column. +# The next two cases pin the route behind the capital-route loss of #1909, so +# that the loss is not read as a real effect (see also #1837 and #1936). A +# savings-credit-only recipient is tested against the CTR capital limit on the +# Pension Credit figure, and Pension Credit's capital sources count +# `corporate_wealth` but not `private_pension_wealth`: State Pension Credit +# Regulations 2002 Sch V paras 22 and 23 disregard the value of a right to +# receive income from an occupational or personal pension scheme or under a +# retirement annuity contract. In datasets built before the +# `private_pension_wealth` split, `corporate_wealth` also holds imputed pension +# wealth, so there the first case's exclusion rests on pension wealth that +# Pension Credit does not count. The rule in the first case counts +# `corporate_wealth` whatever it holds, and stays as written once a dataset +# splits the column; what changes is the value the dataset gives +# `corporate_wealth`. -- name: Savings credit only is excluded on corporate_wealth alone, although household savings are nil +- name: Savings credit only, corporate_wealth counts as Pension Credit capital, so a pensioner with nil household savings is over the CTR capital limit period: 2026 absolute_error_margin: 0.01 input: @@ -667,7 +671,7 @@ council_tax_reduction_assessable_capital: 20_000 council_tax_reduction: 0 -- name: Savings credit only is not excluded on private_pension_wealth, which Pension Credit disregards +- name: Savings credit only, private_pension_wealth is not Pension Credit capital, so it does not take the pensioner over the CTR capital limit period: 2026 absolute_error_margin: 0.01 input: