From 374a3948080e7b934887fbf51fc1e03afb8e73dd Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 31 Oct 2026 20:24:07 -0400 Subject: [PATCH 01/43] Give the enhanced disability premium its qualifying benefits and age limit The legacy enhanced disability premium read is_enhanced_disabled_for_benefits, whose formula tested only the highest-rate DLA care component. The Regulations (HB Regs 2006 Sch 3 para 15, IS Regs 1987 Sch 2 para 13A, ESA Regs 2008 Sch 4 para 7, JSA Regs 1996 Sch 1 para 15A and the Northern Ireland equivalents) also name the enhanced PIP daily living component and armed forces independence payment, and they limit the premium to people who have not attained the qualifying age for State Pension Credit. - receives_enhanced_disability_premium_qualifying_benefit reads a GB and a Northern Ireland list of qualifying benefits, with each country's dates. - The claimant-or-partner count applies the age limit. - Council Tax Reduction applies its scheme's own condition: Scotland's working-age scheme adds attendance allowance from April 2023 and has had no age limit since 20 June 2022. - is_enhanced_disabled_for_benefits becomes a deprecated alias. Co-Authored-By: Claude Opus 5.5 --- .../enhanced_qualifying_benefits.yaml | 41 ++++++++++++++ ..._qualifying_benefits_northern_ireland.yaml | 49 +++++++++++++++++ .../age_limit_applies.yaml | 26 +++++++++ .../qualifying_benefits.yaml | 37 +++++++++++++ ...aimants_or_partners_for_legacy_benefits.py | 33 +++++++++--- ...x_reduction_enhanced_disability_premium.py | 38 +++++++++++++ .../council_tax_reduction_premiums.py | 21 ++++++-- ...n_enhanced_disability_premium_condition.py | 47 ++++++++++++++++ .../enhanced_disability_premium.py | 12 +++-- .../is_enhanced_disabled_for_benefits.py | 18 +++++-- ...d_disability_premium_qualifying_benefit.py | 54 +++++++++++++++++++ 11 files changed, 356 insertions(+), 20 deletions(-) create mode 100644 policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml create mode 100644 policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml create mode 100644 policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py create mode 100644 policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py create mode 100644 policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml new file mode 100644 index 0000000000..b1486ba8d7 --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml @@ -0,0 +1,41 @@ +description: > + Benefits whose receipt at the rate named meets the qualifying-benefit + condition of the legacy enhanced disability premium for a claimant or + partner: the care component of disability living allowance at the highest + rate, the daily living component of personal independence payment at the + enhanced rate, and armed forces independence payment. Each programme adds its + own conditions, such as the age limit. The Regulations also list the Scottish + equivalents (child disability payment and Scottish adult disability living + allowance care components at the highest rate, adult disability payment + daily living component at the enhanced rate), which are not separate model + variables. The 8 April 2013 date is Great Britain's: S.I. 2013/388 added the + PIP daily living component and S.I. 2013/591 added armed forces independence + payment. This list applies in Great Britain; the + enhanced_qualifying_benefits_northern_ireland parameter holds Northern + Ireland's separate commencement dates. Like other parameters, the model reads + the list as at 30 April of each year from 2015 and does not prorate a change + made during a year. +metadata: + label: Legacy benefit enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: The Housing Benefit Regulations 2006 Sch. 3 para. 15(1)(b), (c), (d) + href: https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15 + - title: The Income Support (General) Regulations 1987 Sch. 2 para. 13A(1ZA) + href: https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A + - title: The Employment and Support Allowance Regulations 2008 Sch. 4 para. 7(1)(b)-(d) + href: https://www.legislation.gov.uk/uksi/2008/794/schedule/4/paragraph/7 + - title: The Jobseeker's Allowance Regulations 1996 Sch. 1 para. 15A(1ZA) + href: https://www.legislation.gov.uk/uksi/1996/207/schedule/1/paragraph/15A + - title: The Personal Independence Payment (Supplementary Provisions and Consequential Amendments) Regulations 2013 reg. 2 + href: https://www.legislation.gov.uk/uksi/2013/388/regulation/2 + - title: "The Armed Forces and Reserve Forces Compensation Scheme (Consequential Provisions: Subordinate Legislation) Order 2013 art. 2" + href: https://www.legislation.gov.uk/uksi/2013/591/article/2 +values: + 2006-03-06: + - receives_highest_dla_sc + 2013-04-08: + - receives_highest_dla_sc + - receives_enhanced_pip_dl + - armed_forces_independence_payment diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml new file mode 100644 index 0000000000..2eaf40c641 --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml @@ -0,0 +1,49 @@ +description: > + Benefits whose receipt at the rate named meets the qualifying-benefit + condition of the legacy enhanced disability premium for a claimant or + partner in Northern Ireland. The care component of disability living + allowance at the highest rate qualifies. Armed forces independence payment + was added from 24 December 2013 by S.I. 2013/3021, and the personal + independence payment daily living component at the enhanced rate from 20 + June 2016 by S.R. 2016/228, in the Northern Ireland Income Support, + Jobseeker's Allowance, Housing Benefit and Employment and Support Allowance + regulations. Like other parameters, the model reads the list + as at 30 April of each year from 2015 and does not prorate a change made + during a year, so it adds the daily living component from 2017. The initial + value date follows the Great Britain list, not the commencement of S.R. + 2006/405 on 20 November 2006. +metadata: + label: Northern Ireland legacy benefit enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: The Housing Benefit Regulations (Northern Ireland) 2006 Sch. 4 para. 15(1)(aa), (b), (c) + href: https://www.legislation.gov.uk/nisr/2006/405/schedule/4/paragraph/15 + - title: The Employment and Support Allowance Regulations (Northern Ireland) 2008 Sch. 4 para. 7(1)(aa), (b), (c) + href: https://www.legislation.gov.uk/nisr/2008/280/schedule/4/paragraph/7 + - title: S.I. 2013/3021 art. 1 (commencement) + href: https://www.legislation.gov.uk/uksi/2013/3021/article/1 + - title: S.I. 2013/3021 art. 14(5)(d) (Income Support) + href: https://www.legislation.gov.uk/uksi/2013/3021/article/14 + - title: S.I. 2013/3021 art. 17(7)(d) (Jobseeker's Allowance) + href: https://www.legislation.gov.uk/uksi/2013/3021/article/17 + - title: S.I. 2013/3021 art. 26(6)(d) (Housing Benefit) + href: https://www.legislation.gov.uk/uksi/2013/3021/article/26 + - title: S.R. 2016/228 reg. 1 (commencement) + href: https://www.legislation.gov.uk/nisr/2016/228/regulation/1 + - title: S.R. 2016/228 reg. 11 (Income Support) + href: https://www.legislation.gov.uk/nisr/2016/228/regulation/11 + - title: S.R. 2016/228 reg. 14 (Jobseeker's Allowance) + href: https://www.legislation.gov.uk/nisr/2016/228/regulation/14 + - title: S.R. 2016/228 reg. 30(7)(d) (Housing Benefit) + href: https://www.legislation.gov.uk/nisr/2016/228/regulation/30 +values: + 2006-03-06: + - receives_highest_dla_sc + 2013-12-24: + - receives_highest_dla_sc + - armed_forces_independence_payment + 2016-06-20: + - receives_highest_dla_sc + - receives_enhanced_pip_dl + - armed_forces_independence_payment diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml new file mode 100644 index 0000000000..0fea543475 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml @@ -0,0 +1,26 @@ +description: > + Scotland's working-age Council Tax Reduction scheme pays the enhanced + disability premium only for an applicant or partner under the qualifying + age for State Pension Credit if this is true. The 2012 scheme had this limit + until 31 March 2022. The 2021 scheme limited it to those under pensionable + age, which the model reads as the same qualifying age (the two have agreed + for everyone since 2019-20), until S.S.I. 2022/161 removed the limit from + 20 June 2022. Like other parameters, + the model reads this as at 30 April of each year from 2015, so the limit + applies in 2022 and not from 2023. +metadata: + label: Scottish working-age Council Tax Reduction enhanced disability premium age limit applies + period: year + unit: bool + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 Sch. 1 para. 12(1)(b), (ba), (c) (to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/schedule/1/paragraph/12/2021-04-01 + - title: The Council Tax Reduction (Scotland) Regulations 2021 Sch. 1 para. 14(1) as in force on 1 April 2022 + href: https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14/2022-04-01 + - title: The Council Tax Reduction (Scotland) Amendment (No. 3) Regulations 2022 reg. 1 (in force 20 June 2022) + href: https://www.legislation.gov.uk/ssi/2022/161/regulation/1 + - title: The Council Tax Reduction (Scotland) Regulations 2021 Sch. 1 para. 14(1) + href: https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14 +values: + 2013-04-01: true + 2022-06-20: false diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml new file mode 100644 index 0000000000..9d066654e8 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml @@ -0,0 +1,37 @@ +description: > + Benefits whose receipt by the applicant or partner meets the enhanced + disability premium condition of Scotland's working-age Council Tax Reduction + scheme: the care component of disability living allowance at the highest + rate, the daily living component of personal independence payment at the + enhanced rate and armed forces independence payment, and from 1 April 2023 + attendance allowance at either rate (S.S.I. 2023/38). The scheme also lists + Scottish benefits (child disability payment, adult disability payment, + pension age disability payment and Scottish adult disability living + allowance), which are not separate model variables. Armed forces + independence payment was added to the 2012 scheme from 11 June 2013 (S.S.I. + 2013/142). Like other parameters, the model reads the list as at 30 April of + each year from 2015. +metadata: + label: Scottish working-age Council Tax Reduction enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: The Council Tax Reduction (Scotland) Regulations 2012 Sch. 1 para. 12(1) (to 31 March 2022) + href: https://www.legislation.gov.uk/ssi/2012/303/schedule/1/paragraph/12/2021-04-01 + - title: The Council Tax Reduction (Scotland) Regulations 2021 Sch. 1 para. 14(1) + href: https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14 + - title: The Council Tax Reduction and Council Tax (Discounts) (Miscellaneous Amendment) (Scotland) Regulations 2023 reg. 16(c) + href: https://www.legislation.gov.uk/ssi/2023/38/regulation/16 +values: + 2013-04-01: + - receives_highest_dla_sc + - receives_enhanced_pip_dl + 2013-06-11: + - receives_highest_dla_sc + - receives_enhanced_pip_dl + - armed_forces_independence_payment + 2023-04-01: + - receives_highest_dla_sc + - receives_enhanced_pip_dl + - armed_forces_independence_payment + - attendance_allowance diff --git a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py index 6b7428f74e..4f9e301338 100644 --- a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py +++ b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py @@ -6,18 +6,35 @@ class num_enhanced_disabled_claimants_or_partners_for_legacy_benefits(Variable): entity = BenUnit label = "Enhanced-disabled claimants or partners for legacy benefits" documentation = ( - "Claimants and partners satisfying the model's existing " - "is_enhanced_disabled_for_benefits indicator. This count excludes " - "children and young persons, whose separate enhanced premium is " - "not modelled here." + "Claimants and partners who meet the enhanced disability premium " + "condition: they receive a qualifying benefit (receives_enhanced_" + "disability_premium_qualifying_benefit) and have not attained the " + "qualifying age for State Pension Credit. Housing Benefit and the " + "Welsh and English Council Tax Reduction schemes limit both the " + "claimant and their family by age; Income Support, Jobseeker's " + "Allowance and Employment and Support Allowance name the partner, as " + "their claimants are under that age. This count excludes children and " + "young persons, whose separate enhanced premium is modelled for " + "Housing Benefit only (housing_benefit_child_disability_premiums)." ) definition_period = YEAR reference = ( - "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A", "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A", + "https://www.legislation.gov.uk/uksi/2008/794/schedule/4/paragraph/7", + "https://www.legislation.gov.uk/uksi/1996/207/schedule/1/paragraph/15A", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/4/paragraph/15", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", ) def formula(benunit, period, parameters): - claimant_or_partner = benunit.members("is_claimant_or_partner", period) - disabled = benunit.members("is_enhanced_disabled_for_benefits", period) - return benunit.sum(claimant_or_partner & disabled) + person = benunit.members + claimant_or_partner = person("is_claimant_or_partner", period) + qualifying = person( + "receives_enhanced_disability_premium_qualifying_benefit", period + ) + # "who has not attained the qualifying age for state pension credit" + # (HB Regs 2006 Sch 3 para 15(1)(b)-(d); IS Regs 1987 Sch 2 para + # 13A(1)(b)). + under_age = ~person("has_attained_state_pension_credit_qualifying_age", period) + return benunit.sum(claimant_or_partner & qualifying & under_age) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py new file mode 100644 index 0000000000..67aef05c5c --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -0,0 +1,38 @@ +from policyengine_uk.model_api import * + + +class council_tax_reduction_enhanced_disability_premium(Variable): + value_type = float + entity = BenUnit + label = "Working-age CTR enhanced disability premium" + documentation = ( + "The enhanced disability premium in a working-age Council Tax " + "Reduction applicable amount: the single rate, or the couple rate " + "where either or both members of a couple meet the scheme's condition " + "(meets_council_tax_reduction_enhanced_disability_premium_condition). " + "Outside Scotland this equals the legacy premium " + "(enhanced_disability_premium). Pension-age Council Tax Reduction has " + "no adult enhanced disability premium." + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", + "https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/paragraph/12", + ) + + def formula(benunit, period, parameters): + dis = parameters(period).gov.dwp.disability_premia + person = benunit.members + qualifies = benunit.any( + person("is_claimant_or_partner", period) + & person( + "meets_council_tax_reduction_enhanced_disability_premium_condition", + period, + ) + ) + single = benunit("is_single", period.this_year) + couple = benunit("is_couple", period.this_year) + weekly_amount = single * dis.enhanced_single + couple * dis.enhanced_couple + return weekly_amount * WEEKS_IN_YEAR * qualifies diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_premiums.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_premiums.py index d6bc318621..912f2d7b63 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_premiums.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_premiums.py @@ -15,8 +15,10 @@ class council_tax_reduction_premiums(Variable): "working_age_benefits_premiums). Where the household head applies " "alone (council_tax_reduction_head_applies_alone), they are the " "premiums of a single claimant on the head's own circumstances, under " - "the same conditions: the disability and enhanced disability premiums " - "on her own disability (working age only); the severe disability " + "the same conditions: the disability premium on her own disability and " + "the enhanced disability premium on the scheme's condition " + "(meets_council_tax_reduction_enhanced_disability_premium_condition), " + "both working age only; the severe disability " "premium if she receives a qualifying benefit, no carer benefit is " "paid for caring for her, and no other resident aged 18 or over is " "her non-dependant (everyone else in the household, since she has no " @@ -46,7 +48,9 @@ def formula(benunit, period, parameters): pensioner = benunit("council_tax_reduction_pensioner", period) # The working-age severe disability premium takes Council Tax # Reduction's own family test (council_tax_reduction_severe_disability_ - # premium, which differs from the shared premium in Scotland). + # premium, which differs from the shared premium in Scotland), and the + # enhanced disability premium the scheme's own condition + # (council_tax_reduction_enhanced_disability_premium). benefit_unit_premiums = where( pensioner, benunit("pension_age_benefits_premiums", period), @@ -54,6 +58,10 @@ def formula(benunit, period, parameters): + ( benunit("council_tax_reduction_severe_disability_premium", period) - benunit("severe_disability_premium", period) + ) + + ( + benunit("council_tax_reduction_enhanced_disability_premium", period) + - benunit("enhanced_disability_premium", period) ), ) head_applies_alone = benunit("council_tax_reduction_head_applies_alone", period) @@ -94,7 +102,12 @@ def head_has(condition): disability_premiums = ~pensioner * ( head_has(person("is_disabled_for_benefits", period)) * disability.disability_single - + head_has(person("is_enhanced_disabled_for_benefits", period)) + + head_has( + person( + "meets_council_tax_reduction_enhanced_disability_premium_condition", + period, + ) + ) * disability.enhanced_single ) head_premiums = (disability_premiums + severe + carer_premium) * WEEKS_IN_YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py new file mode 100644 index 0000000000..414a0f5de8 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -0,0 +1,47 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_scotland_scheme, +) + + +class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable): + value_type = bool + entity = Person + label = "Meets the working-age CTR enhanced disability premium condition" + documentation = ( + "Whether this person, as an applicant or partner, meets the enhanced " + "disability premium condition of the working-age Council Tax " + "Reduction scheme that covers their household. In Scotland the " + "scheme's own list of qualifying benefits applies, which adds " + "attendance allowance at either rate from 1 April 2023, and the age " + "limit applies only until 20 June 2022. Elsewhere the condition is " + "Housing Benefit's: a qualifying benefit (receives_enhanced_" + "disability_premium_qualifying_benefit) and not having attained the " + "qualifying age for State Pension Credit, as in the Welsh scheme and " + "England's Default Scheme. The English councils' own schemes have not " + "been checked against this. England's Default Scheme names the PIP " + "daily living component at either rate and does not name armed forces " + "independence payment, which the model does not follow." + ) + definition_period = YEAR + reference = ( + "https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14", + "https://www.legislation.gov.uk/ssi/2012/303/schedule/1/paragraph/12/2021-04-01", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", + "https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/paragraph/12", + ) + + def formula(person, period, parameters): + p = parameters( + period + ).gov.local_authorities.scotland.council_tax_reduction.working_age.enhanced_disability_premium + scotland = is_scotland_scheme(person.household("country", period)) + under_age = ~person("has_attained_state_pension_credit_qualifying_age", period) + scottish = (add(person, period, p.qualifying_benefits) > 0) & ( + under_age | ~p.age_limit_applies + ) + elsewhere = ( + person("receives_enhanced_disability_premium_qualifying_benefit", period) + & under_age + ) + return where(scotland, scottish, elsewhere) diff --git a/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py b/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py index 296ab7b49e..98f8b88ee9 100644 --- a/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py @@ -7,14 +7,20 @@ class enhanced_disability_premium(Variable): label = "Enhanced disability premium" documentation = ( "Legacy benefit enhanced disability premium for the claimant or " - "partner, using the model's existing enhanced-disability indicator. " - "The separate Housing Benefit enhanced rate for children and young " - "persons is not modelled here." + "partner: the single rate, or the couple rate where either or both " + "members of a couple meet the condition " + "(num_enhanced_disabled_claimants_or_partners_for_legacy_benefits). " + "Housing Benefit, Income Support and Council Tax Reduction read it; " + "Council Tax Reduction substitutes its own scheme's condition " + "(council_tax_reduction_enhanced_disability_premium). The separate " + "Housing Benefit enhanced rate for children and young persons is " + "housing_benefit_child_disability_premiums." ) definition_period = YEAR reference = ( "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A", "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/part/4", ) unit = GBP diff --git a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py index 7782b4ca94..1eff6e2266 100644 --- a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py +++ b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py @@ -4,11 +4,19 @@ class is_enhanced_disabled_for_benefits(Variable): value_type = bool entity = Person - label = "Whether meets the middle disability benefit entitlement" + label = "Receives an enhanced disability premium qualifying benefit (deprecated)" + documentation = ( + "Deprecated: no premium reads it. The enhanced disability premium " + "reads receives_enhanced_disability_premium_qualifying_benefit, which " + "this returns, and applies each programme's own conditions. It is " + "kept for downstream compatibility and for the deprecated counts " + "num_enhanced_disabled_adults and num_enhanced_disabled_children. The " + "Enhanced FRS stores its own value of this flag, which replaces this " + "formula in dataset runs: attendance allowance at the higher rate, or " + "disability living allowance care or personal independence payment " + "daily living near the top rate, from reported amounts." + ) definition_period = YEAR def formula(person, period, parameters): - DLA_requirement = ( - parameters(period).gov.dwp.dla.self_care.higher * WEEKS_IN_YEAR - ) - return person("dla_sc", period) >= DLA_requirement + return person("receives_enhanced_disability_premium_qualifying_benefit", period) diff --git a/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py b/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py new file mode 100644 index 0000000000..ce82acde71 --- /dev/null +++ b/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py @@ -0,0 +1,54 @@ +from policyengine_uk.model_api import * + + +class receives_enhanced_disability_premium_qualifying_benefit(Variable): + value_type = bool + entity = Person + label = "Receives an enhanced disability premium qualifying benefit" + documentation = ( + "In receipt of a benefit that meets the qualifying-benefit condition " + "of the legacy enhanced disability premium: the care component of " + "disability living allowance at the highest rate, the daily living " + "component of personal independence payment at the enhanced rate, or " + "armed forces independence payment. The award categories " + "(dla_sc_category, pip_dl_category) decide the rate, as in the severe " + "disability premium list (receives_severe_disability_premium_" + "qualifying_benefit), so a DLA or PIP amount entered without its " + "category does not count. Each programme adds its own conditions: " + "the age limit (num_enhanced_disabled_claimants_or_partners_for_" + "legacy_benefits) and, in Council Tax Reduction, its scheme's own list " + "(meets_council_tax_reduction_enhanced_disability_premium_condition). " + "Attendance allowance does not qualify. The Scottish equivalents " + "(child disability payment and Scottish adult disability living " + "allowance care components at the highest rate, adult disability " + "payment daily living component at the enhanced rate) are not " + "separate model variables. The limited capability for work-related " + "activity limb (Housing Benefit), the support component limb " + "(Employment and Support Allowance), the hospital rules and the " + "long-term patient exclusion are not modelled. Household country " + "selects the list: Northern Ireland adds armed forces independence " + "payment from 24 December 2013 and PIP daily living from 20 June " + "2016; Great Britain adds both from 8 April 2013. The model reads each " + "list as at 30 April of the year from 2015, without within-year " + "proration." + ) + definition_period = YEAR + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A", + "https://www.legislation.gov.uk/uksi/2008/794/schedule/4/paragraph/7", + "https://www.legislation.gov.uk/uksi/1996/207/schedule/1/paragraph/15A", + "https://www.legislation.gov.uk/nisr/2006/405/schedule/4/paragraph/15", + "https://www.legislation.gov.uk/nisr/2008/280/schedule/4/paragraph/7", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.dwp.disability_premia + country = person.household("country", period) + northern_ireland = country == country.possible_values.NORTHERN_IRELAND + return where( + northern_ireland, + add(person, period, p.enhanced_qualifying_benefits_northern_ireland) > 0, + add(person, period, p.enhanced_qualifying_benefits) > 0, + ) From 0c174d3c299e8080423bf0107565cbc4f2472e72 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 31 Oct 2026 20:31:29 -0400 Subject: [PATCH 02/43] Test the enhanced disability premium's benefits, rates, ages and couples YAML cases worked by hand from HB Regs 2006 Sch 3 para 15 and Part 4, IS Regs 1987 Sch 2 para 13A, the Northern Ireland lists and the Welsh and Scottish Council Tax Reduction schemes. Read the Scottish age-limit switch as a scalar with `not`, since `~` on a Python bool is bitwise inversion. Co-Authored-By: Claude Opus 5.5 --- .../gov/dwp/enhanced_disability_premium.yaml | 376 ++++++++++++++++++ .../enhanced_disability_premium.yaml | 239 +++++++++++ ...n_enhanced_disability_premium_condition.py | 2 +- 3 files changed, 616 insertions(+), 1 deletion(-) create mode 100644 policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml create mode 100644 policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml new file mode 100644 index 0000000000..61c00c2e6b --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml @@ -0,0 +1,376 @@ +# Legacy enhanced disability premium for a claimant or partner. +# Conditions: HB Regs 2006 Sch 3 para 15(1)(b)-(d); IS Regs 1987 Sch 2 para +# 13A(1), (1ZA); ESA Regs 2008 Sch 4 para 7(1)(b)-(d); JSA Regs 1996 Sch 1 +# para 15A(1), (1ZA); HB Regs (NI) 2006 Sch 4 para 15(1)(aa)-(c). +# Amounts (HB Regs 2006 Sch 3 Part 4, enhanced disability premium row (9), +# 2026-27): £22.00 for a person who is not a member of a couple, £31.40 where +# the condition is met in respect of a member of a couple. +# 2026-27 weekly rates: DLA care highest £114.60, middle £76.70; PIP daily +# living enhanced £114.60, standard £76.70 (gov.dwp parameters). + +- name: Case 1, enhanced PIP daily living qualifies a single claimant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: ENGLAND + output: + # 114.60 * 52 = 5,959.20 (HB para 15(1)(c); IS para 13A(1ZA)(c)). + pip_dl: 5_959.20 + receives_enhanced_disability_premium_qualifying_benefit: true + num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 1 + # 22.00 * 52 = 1,144.00. + enhanced_disability_premium: 1_144 + +- name: Case 2, the highest DLA care rate qualifies a single claimant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + dla_sc_category: HIGHER + households: + household: + members: [person1] + country: ENGLAND + output: + # 114.60 * 52 = 5,959.20 (HB para 15(1)(b); IS para 13A(1ZA)(b)). + dla_sc: 5_959.20 + receives_enhanced_disability_premium_qualifying_benefit: true + enhanced_disability_premium: 1_144 + +- name: Case 3, standard PIP daily living does not qualify. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: STANDARD + households: + household: + members: [person1] + country: ENGLAND + output: + # 76.70 * 52 = 3,988.40; para 15(1)(c) needs the enhanced rate. + pip_dl: 3_988.40 + receives_enhanced_disability_premium_qualifying_benefit: false + enhanced_disability_premium: 0 + +- name: Case 4, the middle DLA care rate does not qualify. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + dla_sc_category: MIDDLE + households: + household: + members: [person1] + country: ENGLAND + output: + # 76.70 * 52 = 3,988.40; para 15(1)(b) needs the highest rate. + dla_sc: 3_988.40 + receives_enhanced_disability_premium_qualifying_benefit: false + enhanced_disability_premium: 0 + +- name: Case 5, armed forces independence payment qualifies a single claimant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + output: + # HB para 15(1)(d); IS para 13A(1ZA)(a): any payment of AFIP. + receives_enhanced_disability_premium_qualifying_benefit: true + enhanced_disability_premium: 1_144 + +- name: Case 6, attendance allowance at the higher rate does not qualify. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + aa_category: HIGHER + households: + household: + members: [person1] + country: ENGLAND + output: + # None of HB para 15(1), IS para 13A(1ZA), ESA para 7(1) or JSA para + # 15A(1ZA) names attendance allowance. + receives_enhanced_disability_premium_qualifying_benefit: false + enhanced_disability_premium: 0 + +- name: Case 7, a single claimant over the State Pension Credit qualifying age gets no premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + dla_sc_category: HIGHER + households: + household: + members: [person1] + country: ENGLAND + output: + has_attained_state_pension_credit_qualifying_age: true + receives_enhanced_disability_premium_qualifying_benefit: true + # HB para 15(1)(b): "who has not attained the qualifying age for state + # pension credit". + num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 0 + enhanced_disability_premium: 0 + +- name: Case 8, a couple where one member qualifies gets the couple rate. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + person2: + age: 31 + benunits: + benunit: + members: [person1, person2] + households: + household: + members: [person1, person2] + country: ENGLAND + output: + receives_enhanced_disability_premium_qualifying_benefit: [true, false] + num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 1 + # 31.40 * 52 = 1,632.80. + enhanced_disability_premium: 1_632.80 + +- name: Case 9, a couple where both members qualify still gets one couple rate. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + person2: + age: 31 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + households: + household: + members: [person1, person2] + country: ENGLAND + output: + num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 2 + # Row (9)(c) pays £31.40 "where the claimant is a member of a couple and + # the conditions ... are satisfied in respect of a member of that + # couple": 31.40 * 52 = 1,632.80, not two single rates (2 * 1,144.00). + enhanced_disability_premium: 1_632.80 + +- name: Case 10, a couple whose only qualifying member is over the qualifying age gets no premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + households: + household: + members: [person1, person2] + country: ENGLAND + output: + is_couple: true + has_attained_state_pension_credit_qualifying_age: [false, true] + # IS para 13A(1)(b): "the claimant's partner, if any, who has not + # attained the qualifying age for state pension credit". + num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 0 + enhanced_disability_premium: 0 + +- name: Case 11, a couple with a qualifying member under the qualifying age gets the couple rate. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + pip_dl_category: ENHANCED + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + households: + household: + members: [person1, person2] + country: ENGLAND + output: + is_couple: true + num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 1 + enhanced_disability_premium: 1_632.80 + +- name: Case 12, Northern Ireland reads enhanced PIP daily living from 2017. + period: 2016 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: NORTHERN_IRELAND + output: + # S.R. 2016/228 added the PIP limb from 20 June 2016; the model reads the + # list at 30 April, so 2016 has no PIP limb in Northern Ireland. + receives_enhanced_disability_premium_qualifying_benefit: false + enhanced_disability_premium: 0 + +- name: Case 13, enhanced PIP daily living qualifies in Northern Ireland in 2017. + period: 2017 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: NORTHERN_IRELAND + output: + receives_enhanced_disability_premium_qualifying_benefit: true + # 2017-18 single rate £15.90: 15.90 * 52 = 826.80. + enhanced_disability_premium: 826.80 + +- name: Case 14, Northern Ireland already counts armed forces independence payment in 2016. + period: 2016 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: NORTHERN_IRELAND + output: + # S.I. 2013/3021 added the AFIP limb from 24 December 2013. 2016-17 + # single rate £15.75: 15.75 * 52 = 819.00. + receives_enhanced_disability_premium_qualifying_benefit: true + enhanced_disability_premium: 819 + +- name: Case 15, Great Britain counts enhanced PIP daily living in 2016. + period: 2016 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: WALES + output: + # S.I. 2013/388 added the PIP limb from 8 April 2013. + receives_enhanced_disability_premium_qualifying_benefit: true + enhanced_disability_premium: 819 + +- name: Case 16, Housing Benefit premiums include the premium for enhanced PIP daily living. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: ENGLAND + output: + housing_benefit_pension_age_regulations_apply: false + enhanced_disability_premium: 1_144 + # Enhanced PIP daily living is also on the severe disability premium + # list (gov.dwp.disability_premia.severe_qualifying_benefits); the + # claimant lives alone and no one is paid a carer benefit for them: + # 86.05 * 52 = 4,474.60. + severe_disability_premium: 4_474.60 + # 1,144.00 + 4,474.60 = 5,618.60. + benefits_premiums: 5_618.60 + +- name: Case 17, Housing Benefit for an over-age partner in the working-age regulations has no premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + jsa_income: 3_000 + households: + household: + members: [person1, person2] + country: ENGLAND + output: + is_couple: true + # Income-based Jobseeker's Allowance keeps the claim in the working-age + # regulations (housing_benefit_pension_age_regulations_apply), whose + # para 15(1)(b) excludes a family member who has attained the + # qualifying age. + housing_benefit_pension_age_regulations_apply: false + enhanced_disability_premium: 0 + # Only one partner receives a severe disability premium qualifying + # benefit and the other is not blind, so the model pays no severe + # disability premium either (severe_disability_premium). + benefits_premiums: 0 + +- name: Case 18, the Income Support applicable amount includes the premium for enhanced PIP daily living. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: ENGLAND + output: + # Personal allowance for a single claimant aged 25 or over, £95.55 + # (2026-27 DWP rates): 95.55 * 52 = 4,968.60. Premiums 1,144.00 + + # 4,474.60 = 5,618.60. Total 10,587.20. + income_support_applicable_amount: 10_587.20 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml new file mode 100644 index 0000000000..795984695e --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -0,0 +1,239 @@ +# Enhanced disability premium in working-age Council Tax Reduction. +# Wales: CTR (Prescribed Requirements) (Wales) Regs 2013 Sch 7 para 12(1): +# DLA care highest, PIP daily living enhanced or AFIP, for an applicant or +# family member "who has not attained the qualifying age for state pension +# credit". Scotland: CTR (Scotland) Regs 2021 Sch 1 para 14(1): the same +# benefits for the applicant or partner with no age limit from 20 June 2022 +# (S.S.I. 2022/161), and attendance allowance at either rate from 1 April +# 2023 (para 14(1)(g), S.S.I. 2023/38). The model reads each year's rules at +# 30 April. +# 2026-27 amounts: enhanced disability premium £22.00 single, £31.40 couple; +# severe disability premium £86.05 single. + +- name: Case 1, Welsh working-age CTR premiums include the premium for enhanced PIP daily living. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + households: + household: + members: [person1] + country: WALES + local_authority: CARDIFF + output: + council_tax_reduction_pensioner: false + # 22.00 * 52 = 1,144.00. + council_tax_reduction_enhanced_disability_premium: 1_144 + # Plus the severe disability premium, 86.05 * 52 = 4,474.60: 5,618.60. + council_tax_reduction_premiums: 5_618.60 + +- name: Case 2, Scottish working-age CTR counts attendance allowance at either rate from 2023. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + aa_category: LOWER + households: + household: + members: [person1] + country: SCOTLAND + local_authority: CITY_OF_EDINBURGH + output: + council_tax_reduction_pensioner: false + # The shared legacy premium does not count attendance allowance. + enhanced_disability_premium: 0 + # Para 14(1)(g): 22.00 * 52 = 1,144.00. + meets_council_tax_reduction_enhanced_disability_premium_condition: true + council_tax_reduction_enhanced_disability_premium: 1_144 + # Severe disability premium 4,474.60 + 1,144.00 = 5,618.60. + council_tax_reduction_premiums: 5_618.60 + +- name: Case 3, Scottish working-age CTR does not count attendance allowance in 2022. + period: 2022 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + aa_category: LOWER + households: + household: + members: [person1] + country: SCOTLAND + local_authority: CITY_OF_EDINBURGH + output: + meets_council_tax_reduction_enhanced_disability_premium_condition: false + council_tax_reduction_enhanced_disability_premium: 0 + # Only the severe disability premium, 2022-23 single rate £69.40: + # 69.40 * 52 = 3,608.80. + council_tax_reduction_premiums: 3_608.80 + +- name: Case 4, Scottish working-age CTR pays the couple rate for an over-age partner from 2023. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + jsa_income: 3_000 + households: + household: + members: [person1, person2] + country: SCOTLAND + local_authority: CITY_OF_EDINBURGH + output: + is_couple: true + # Income-based Jobseeker's Allowance keeps the couple in the working-age + # scheme. + council_tax_reduction_pensioner: false + # The shared legacy premium applies the age limit. + enhanced_disability_premium: 0 + # Para 14(1)(b) has no age limit: 31.40 * 52 = 1,632.80. + council_tax_reduction_enhanced_disability_premium: 1_632.80 + # No other premium: only one partner has a severe disability premium + # qualifying benefit. + council_tax_reduction_premiums: 1_632.80 + +- name: Case 5, Scottish working-age CTR applied the age limit in 2022. + period: 2022 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + jsa_income: 3_000 + households: + household: + members: [person1, person2] + country: SCOTLAND + local_authority: CITY_OF_EDINBURGH + output: + is_couple: true + council_tax_reduction_pensioner: false + # Para 14(1)(b) as in force on 30 April 2022: "the applicant's partner, + # who has not attained pensionable age". + council_tax_reduction_enhanced_disability_premium: 0 + council_tax_reduction_premiums: 0 + +- name: Case 6, Welsh working-age CTR keeps the age limit for an over-age partner. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + jsa_income: 3_000 + households: + household: + members: [person1, person2] + country: WALES + local_authority: CARDIFF + output: + is_couple: true + council_tax_reduction_pensioner: false + # Sch 7 para 12(1)(b): "who has not attained the qualifying age for state + # pension credit". + council_tax_reduction_enhanced_disability_premium: 0 + council_tax_reduction_premiums: 0 + +- name: Case 7, a household head who applies alone gets the premium for enhanced PIP daily living. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + is_household_head: true + pip_dl_category: ENHANCED + person2: + age: 17 + is_parent: true + is_household_head: false + person3: + age: 17 + is_parent: true + is_household_head: false + person4: + age: 0 + is_household_head: false + benunits: + benunit: + members: [person1, person2, person3, person4] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [person1, person2, person3, person4] + country: WALES + local_authority: CARDIFF + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_head_applies_alone: true + council_tax_reduction_pensioner: false + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, false, false, false] + # The head's own single-rate premium 1,144.00, plus the severe disability + # premium 4,474.60 (the other residents are under 18): 5,618.60. + council_tax_reduction_premiums: 5_618.60 + +- name: Case 8, a Scottish household head who applies alone and receives attendance allowance gets the premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + is_household_head: true + aa_category: LOWER + person2: + age: 17 + is_parent: true + is_household_head: false + person3: + age: 17 + is_parent: true + is_household_head: false + person4: + age: 0 + is_household_head: false + benunits: + benunit: + members: [person1, person2, person3, person4] + claims_all_entitled_benefits: true + would_claim_uc: false + households: + household: + members: [person1, person2, person3, person4] + country: SCOTLAND + local_authority: CITY_OF_EDINBURGH + council_tax: 1_800 + savings: 0 + output: + council_tax_reduction_head_applies_alone: true + council_tax_reduction_pensioner: false + # Para 14(1)(g) 1,144.00 plus the severe disability premium 4,474.60: + # 5,618.60. + council_tax_reduction_premiums: 5_618.60 diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index 414a0f5de8..e67a89aa2d 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -38,7 +38,7 @@ def formula(person, period, parameters): scotland = is_scotland_scheme(person.household("country", period)) under_age = ~person("has_attained_state_pension_credit_qualifying_age", period) scottish = (add(person, period, p.qualifying_benefits) > 0) & ( - under_age | ~p.age_limit_applies + under_age | (not p.age_limit_applies) ) elsewhere = ( person("receives_enhanced_disability_premium_qualifying_benefit", period) From d645540e29a355d00d78848c2a02293b22ca3e03 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 31 Oct 2026 21:35:48 -0400 Subject: [PATCH 03/43] Property-test the enhanced disability premium against the Regulations An oracle computed from the award inputs checks the legacy and Council Tax Reduction premiums for single people, couples and lone parents in every nation across 2016-2026, with monotonicity, rate bounds, the CTR-versus- legacy differential and the Housing Benefit child premiums' own copy of the paragraph 15 list. The CTR applicant differential now also draws enhanced PIP daily living for the household head, since the deprecated flag it drew no longer reaches the premium. Add the changelog fragment and cite the Income Support and ESA claimant age conditions. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 1 + ...ncil_tax_reduction_applicant_properties.py | 10 +- ..._enhanced_disability_premium_properties.py | 292 ++++++++++++++++++ ...aimants_or_partners_for_legacy_benefits.py | 12 +- .../is_enhanced_disabled_for_benefits.py | 6 +- 5 files changed, 310 insertions(+), 11 deletions(-) create mode 100644 changelog.d/1971.fixed.md create mode 100644 policyengine_uk/tests/test_enhanced_disability_premium_properties.py diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md new file mode 100644 index 0000000000..c4186c02fe --- /dev/null +++ b/changelog.d/1971.fixed.md @@ -0,0 +1 @@ +Paid the legacy enhanced disability premium for enhanced PIP daily living and armed forces independence payment as well as the highest DLA care rate, applied its State Pension Credit age limit, and gave working-age Council Tax Reduction in Scotland its own conditions (attendance allowance from April 2023, no age limit from June 2022). diff --git a/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py b/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py index e690a00ecf..55ba34fdfe 100644 --- a/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py +++ b/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py @@ -73,13 +73,17 @@ ] SHAPES = ["alone", "couple", "young_parents"] # The head's own circumstances that the premiums and the exemption read: -# disability, Attendance Allowance (a severe disability premium qualifying -# benefit, which also exempts her from non-dependant deductions), Carer's -# Allowance (the carer premium) and blindness. +# disability, the enhanced PIP daily living component (an enhanced disability +# premium qualifying benefit), Attendance Allowance (a severe disability +# premium qualifying benefit, which also exempts her from non-dependant +# deductions, and in Scotland's working-age scheme from 2023 an enhanced +# disability premium one), Carer's Allowance (the carer premium) and +# blindness. head_circumstances = st.fixed_dictionaries( dict( is_disabled_for_benefits=st.booleans(), is_enhanced_disabled_for_benefits=st.booleans(), + pip_dl_category=st.sampled_from(["NONE", "NONE", "ENHANCED"]), attendance_allowance=st.sampled_from([0, 0, 4_000]), carers_allowance=st.sampled_from([0, 0, 4_000]), is_blind=st.booleans(), diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py new file mode 100644 index 0000000000..4d9237a5df --- /dev/null +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -0,0 +1,292 @@ +"""Property-based tests for the legacy enhanced disability premium. + +The premium's condition for a claimant or partner (HB Regs 2006 Sch 3 para +15(1)(b)-(d); IS Regs 1987 Sch 2 para 13A; HB Regs (NI) 2006 Sch 4 para 15): +the highest-rate DLA care component, the enhanced-rate PIP daily living +component or armed forces independence payment, for a person who has not +attained the qualifying age for State Pension Credit. Northern Ireland counts +AFIP from 24 December 2013 and PIP from 20 June 2016, which the model reads +at 30 April, so from 2017. The single rate applies to a person who is not a +member of a couple, and one couple rate applies where the condition is met +in respect of either or both members (HB Regs 2006 Sch 3 Part 4). + +Scotland's working-age Council Tax Reduction scheme (SSI 2021/249 Sch 1 para +14) adds attendance allowance at either rate from 1 April 2023 and has no +age limit from 20 June 2022, which the model reads from 2023. + +Invariants, for any generated population of single people, couples and lone +parents in every UK nation, of any adult age, with any mix of DLA care, PIP +daily living, attendance allowance and AFIP awards: + +1. Oracle: enhanced_disability_premium equals the amount the law gives, + computed here from the award inputs and the parameter rates, and + council_tax_reduction_enhanced_disability_premium equals the scheme's. +2. No qualifying benefit: a family in which no claimant or partner receives + a qualifying benefit gets neither premium. +3. Monotone: giving a claimant or partner a qualifying benefit on top of + their awards never lowers either premium. +4. Bounds: each premium is nil, the single rate or the couple rate, and never + exceeds two single rates; the couple rate never exceeds two single rates + in any year. +5. Differential: outside Scotland, and in Scotland before 2023, the Council + Tax Reduction premium equals the legacy premium; in Scotland from 2023 it + is never lower. +6. Differential: for a child or young person in Great Britain, the enhanced + rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums, + which encodes the same paragraph 15 list separately) is paid exactly when + the child receives a qualifying benefit. +""" + +import numpy as np +from hypothesis import HealthCheck, given, settings +from hypothesis import strategies as st + +from policyengine_uk import CountryTaxBenefitSystem, Simulation + +PROPERTY_SETTINGS = settings( + max_examples=8, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +WEEKS_IN_YEAR = 52 +# Each example builds one simulation with inputs for every year here, so the +# Northern Ireland PIP date (2017) and the Scottish changes (2023) are on +# both sides of their boundaries in every example. +YEARS = [2016, 2017, 2022, 2023, 2026] +COUNTRIES = ["ENGLAND", "WALES", "SCOTLAND", "NORTHERN_IRELAND"] +# Award inputs for each kind of award a person can be drawn with. +AWARDS = { + "dla_care_lowest": {"dla_sc_category": "LOWER"}, + "dla_care_middle": {"dla_sc_category": "MIDDLE"}, + "dla_care_highest": {"dla_sc_category": "HIGHER"}, + "pip_daily_living_standard": {"pip_dl_category": "STANDARD"}, + "pip_daily_living_enhanced": {"pip_dl_category": "ENHANCED"}, + "afip": {"armed_forces_independence_payment": 2_000}, + "attendance_allowance_lower": {"aa_category": "LOWER"}, + "attendance_allowance_higher": {"aa_category": "HIGHER"}, +} +QUALIFYING_AWARDS = ["dla_care_highest", "pip_daily_living_enhanced", "afip"] +ADULT_AGES = [20, 30, 45, 60, 64, 66, 67, 70, 85] + +system = CountryTaxBenefitSystem() + + +def award_inputs(awards): + """Model inputs for a tuple of awards; a later award of the same + component replaces an earlier one.""" + inputs = {} + for award in awards: + inputs.update(AWARDS[award]) + return inputs + + +def qualifies(inputs, country, year): + """The legacy premium's qualifying benefits, from the Regulations.""" + if inputs.get("dla_sc_category") == "HIGHER": + return True + if inputs.get("armed_forces_independence_payment", 0) > 0: + return True + if inputs.get("pip_dl_category") == "ENHANCED": + return country != "NORTHERN_IRELAND" or year >= 2017 + return False + + +def qualifies_for_scottish_ctr(inputs, year): + """SSI 2021/249 Sch 1 para 14(1), with head (g) from 2023.""" + attendance_allowance = inputs.get("aa_category") in ("LOWER", "HIGHER") + return qualifies(inputs, "SCOTLAND", year) or ( + attendance_allowance and year >= 2023 + ) + + +awards = st.lists(st.sampled_from(sorted(AWARDS)), max_size=2).map(tuple) +adult = st.fixed_dictionaries(dict(age=st.sampled_from(ADULT_AGES), awards=awards)) +family = st.fixed_dictionaries( + dict( + country=st.sampled_from(COUNTRIES), + shape=st.sampled_from(["single", "couple", "lone_parent"]), + adults=st.lists(adult, min_size=2, max_size=2), + upgrade_member=st.integers(0, 1), + upgrade_award=st.sampled_from(QUALIFYING_AWARDS), + ) +) +child = st.fixed_dictionaries( + dict( + age=st.sampled_from([4, 10, 16, 17]), + awards=awards, + country=st.sampled_from(["ENGLAND", "WALES", "SCOTLAND"]), + ) +) + + +def adults_of(f): + return f["adults"][: 2 if f["shape"] == "couple" else 1] + + +def upgraded(f): + """The same family with one claimant or partner given a qualifying + benefit on top of their awards.""" + adults = [dict(a) for a in f["adults"]] + j = f["upgrade_member"] % len(adults_of(f)) + adults[j]["awards"] = adults[j]["awards"] + (f["upgrade_award"],) + return dict(f, adults=adults) + + +def every_year(inputs): + return {k: {year: v for year in YEARS} for k, v in inputs.items()} + + +def build(families, children): + """One household and one benefit unit per family, and one per child with + a parent aged 35. Claimants and partners are marked as such, so no age + gap reads one as the other's child.""" + people, benunits, households = {}, {}, {} + for i, f in enumerate(families): + members = [] + for j, a in enumerate(adults_of(f)): + name = f"f{i}_adult{j}" + inputs = dict( + age=a["age"], is_claimant_or_partner=True, **award_inputs(a["awards"]) + ) + people[name] = every_year(inputs) + members.append(name) + if f["shape"] == "lone_parent": + name = f"f{i}_child" + people[name] = every_year(dict(age=8, is_claimant_or_partner=False)) + members.append(name) + benunits[f"f{i}"] = {"members": members} + households[f"f{i}"] = { + "members": members, + "country": every_year(dict(country=f["country"]))["country"], + } + for i, c in enumerate(children): + members = [f"c{i}_parent", f"c{i}_child"] + people[members[0]] = every_year(dict(age=35)) + people[members[1]] = every_year(dict(age=c["age"], **award_inputs(c["awards"]))) + benunits[f"c{i}"] = {"members": members} + households[f"c{i}"] = { + "members": members, + "country": every_year(dict(country=c["country"]))["country"], + } + sim = Simulation( + situation=dict(people=people, benunits=benunits, households=households) + ) + person_ids = list(sim.populations["person"].ids) + benunit_ids = list(sim.populations["benunit"].ids) + return sim, person_ids.index, benunit_ids.index + + +def oracle(f, year, attained): + """The two annual premiums from the law for one family. attained[j] is + whether adult j has attained the qualifying age for State Pension + Credit.""" + p = system.parameters(year).gov.dwp.disability_premia + rate = p.enhanced_couple if f["shape"] == "couple" else p.enhanced_single + inputs = [award_inputs(a["awards"]) for a in adults_of(f)] + legacy = any( + qualifies(x, f["country"], year) and not attained[j] + for j, x in enumerate(inputs) + ) + if f["country"] == "SCOTLAND": + scheme = any( + qualifies_for_scottish_ctr(x, year) and (not attained[j] or year >= 2023) + for j, x in enumerate(inputs) + ) + else: + scheme = legacy + return rate * WEEKS_IN_YEAR * legacy, rate * WEEKS_IN_YEAR * scheme + + +def check_families(sim, person, benunit, families, year): + n = len(families) // 2 + edp = sim.calculate("enhanced_disability_premium", year) + ctr = sim.calculate("council_tax_reduction_enhanced_disability_premium", year) + attained = sim.calculate("has_attained_state_pension_credit_qualifying_age", year) + is_couple = sim.calculate("is_couple", year) + p = system.parameters(year).gov.dwp.disability_premia + single_annual = p.enhanced_single * WEEKS_IN_YEAR + couple_annual = p.enhanced_couple * WEEKS_IN_YEAR + family_edp, family_ctr = [], [] + for i, f in enumerate(families): + b = benunit(f"f{i}") + member_attained = [ + bool(attained[person(f"f{i}_adult{j}")]) for j in range(len(adults_of(f))) + ] + assert bool(is_couple[b]) == (f["shape"] == "couple") + legacy, scheme = oracle(f, year, member_attained) + family_edp.append(edp[b]) + family_ctr.append(ctr[b]) + # 1. Oracle. + assert np.isclose(edp[b], legacy, atol=0.01), (f, year, edp[b], legacy) + assert np.isclose(ctr[b], scheme, atol=0.01), (f, year, ctr[b], scheme) + # 2. No qualifying benefit, no premium. + inputs = [award_inputs(a["awards"]) for a in adults_of(f)] + if not any(qualifies(x, f["country"], year) for x in inputs): + assert edp[b] == 0 + if not any(qualifies_for_scottish_ctr(x, year) for x in inputs): + assert ctr[b] == 0 + # 4. Bounds. + for amount in (edp[b], ctr[b]): + assert any( + np.isclose(amount, x, atol=0.01) + for x in (0, single_annual, couple_annual) + ) + assert amount <= 2 * single_annual + 0.01 + # 5. Council Tax Reduction against the legacy premium. + if f["country"] != "SCOTLAND" or year < 2023: + assert np.isclose(ctr[b], edp[b], atol=0.01) + else: + assert ctr[b] >= edp[b] - 0.01 + # 3. Monotone: the second half are the first half's twins, each with a + # qualifying benefit added. + assert all(t >= s - 0.01 for s, t in zip(family_edp[:n], family_edp[n:])) + assert all(t >= s - 0.01 for s, t in zip(family_ctr[:n], family_ctr[n:])) + + +def check_children(sim, person, benunit, children, year): + # 6. The Housing Benefit child premiums' enhanced rate. + p = system.parameters(year).gov.dwp.housing_benefit.premiums + premiums = sim.calculate("housing_benefit_child_disability_premiums", year) + qualifying = sim.calculate( + "receives_enhanced_disability_premium_qualifying_benefit", year + ) + young = sim.calculate("is_child_or_young_person_for_legacy_benefits", year) + for i, c in enumerate(children): + k = person(f"c{i}_child") + if not young[k]: + continue + inputs = award_inputs(c["awards"]) + # The disabled child rate: any DLA, PIP or AFIP award. + disabled = any( + key in inputs + for key in ( + "dla_sc_category", + "pip_dl_category", + "armed_forces_independence_payment", + ) + ) + weekly = premiums[benunit(f"c{i}")] / WEEKS_IN_YEAR + enhanced_weekly = weekly - p.disabled_child * disabled + assert np.isclose( + enhanced_weekly, p.enhanced_disabled_child * qualifying[k], atol=0.01 + ), (c, year, weekly) + + +@PROPERTY_SETTINGS +@given( + families=st.lists(family, min_size=1, max_size=30), + children=st.lists(child, max_size=15), +) +def test_enhanced_disability_premium_invariants(families, children): + everyone = families + [upgraded(f) for f in families] + sim, person, benunit = build(everyone, children) + for year in YEARS: + check_families(sim, person, benunit, everyone, year) + check_children(sim, person, benunit, children, year) + + +def test_couple_rate_never_exceeds_two_single_rates(): + for year in range(2015, 2031): + p = system.parameters(year).gov.dwp.disability_premia + assert p.enhanced_couple <= 2 * p.enhanced_single, year diff --git a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py index 4f9e301338..489820c233 100644 --- a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py +++ b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py @@ -9,11 +9,13 @@ class num_enhanced_disabled_claimants_or_partners_for_legacy_benefits(Variable): "Claimants and partners who meet the enhanced disability premium " "condition: they receive a qualifying benefit (receives_enhanced_" "disability_premium_qualifying_benefit) and have not attained the " - "qualifying age for State Pension Credit. Housing Benefit and the " - "Welsh and English Council Tax Reduction schemes limit both the " - "claimant and their family by age; Income Support, Jobseeker's " - "Allowance and Employment and Support Allowance name the partner, as " - "their claimants are under that age. This count excludes children and " + "qualifying age for State Pension Credit. Housing Benefit, " + "Jobseeker's Allowance, the Welsh Council Tax Reduction scheme and " + "England's Default Scheme limit both the claimant and their family or " + "partner by age. Income Support and Employment and Support Allowance " + "name only the partner, as their claimants must be under that age " + "(SSCBA 1992 s.124(1)(aa); WRA 2007 s.1(3)(c), pensionable age). " + "This count excludes children and " "young persons, whose separate enhanced premium is modelled for " "Housing Benefit only (housing_benefit_child_disability_premiums)." ) diff --git a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py index 1eff6e2266..4708982d67 100644 --- a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py +++ b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py @@ -12,9 +12,9 @@ class is_enhanced_disabled_for_benefits(Variable): "kept for downstream compatibility and for the deprecated counts " "num_enhanced_disabled_adults and num_enhanced_disabled_children. The " "Enhanced FRS stores its own value of this flag, which replaces this " - "formula in dataset runs: attendance allowance at the higher rate, or " - "disability living allowance care or personal independence payment " - "daily living near the top rate, from reported amounts." + "formula in dataset runs: reported attendance allowance, disability " + "living allowance care or personal independence payment daily living " + "within £1 a week of its top rate." ) definition_period = YEAR From 108606daf6e98b6ff14799058da2d246cf901c80 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 31 Oct 2026 22:11:29 -0400 Subject: [PATCH 04/43] Say where England's Default Scheme differs from the CTR condition Co-Authored-By: Claude Opus 5.5 --- ..._enhanced_disability_premium_properties.py | 7 ++++--- ...n_enhanced_disability_premium_condition.py | 20 +++++++++---------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 4d9237a5df..a5e8fa4864 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -32,9 +32,10 @@ Tax Reduction premium equals the legacy premium; in Scotland from 2023 it is never lower. 6. Differential: for a child or young person in Great Britain, the enhanced - rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums, - which encodes the same paragraph 15 list separately) is paid exactly when - the child receives a qualifying benefit. + rate in the Housing Benefit child premiums + (housing_benefit_child_disability_premiums, which encodes the same + paragraph 15 list separately) is paid exactly when the child receives a + qualifying benefit. """ import numpy as np diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index e67a89aa2d..dc24a4f180 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -15,13 +15,14 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "scheme's own list of qualifying benefits applies, which adds " "attendance allowance at either rate from 1 April 2023, and the age " "limit applies only until 20 June 2022. Elsewhere the condition is " - "Housing Benefit's: a qualifying benefit (receives_enhanced_" - "disability_premium_qualifying_benefit) and not having attained the " - "qualifying age for State Pension Credit, as in the Welsh scheme and " - "England's Default Scheme. The English councils' own schemes have not " - "been checked against this. England's Default Scheme names the PIP " - "daily living component at either rate and does not name armed forces " - "independence payment, which the model does not follow." + "Housing Benefit's, as in the Welsh scheme: a qualifying benefit " + "(receives_enhanced_disability_premium_qualifying_benefit) and not " + "having attained the qualifying age for State Pension Credit. " + "England's Default Scheme has the same age limit but names the PIP " + "daily living component at either rate and no armed forces " + "independence payment. The model applies the Housing Benefit " + "condition to the English councils' schemes, whose own documents " + "have not been checked against it." ) definition_period = YEAR reference = ( @@ -32,9 +33,8 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable ) def formula(person, period, parameters): - p = parameters( - period - ).gov.local_authorities.scotland.council_tax_reduction.working_age.enhanced_disability_premium + ctr = parameters(period).gov.local_authorities.scotland.council_tax_reduction + p = ctr.working_age.enhanced_disability_premium scotland = is_scotland_scheme(person.household("country", period)) under_age = ~person("has_attained_state_pension_credit_qualifying_age", period) scottish = (add(person, period, p.qualifying_benefits) > 0) & ( From 9eb577ca6c9cee78acf47aac26b25a9b171e4691 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 31 Oct 2026 22:47:39 -0400 Subject: [PATCH 05/43] Pay the Scottish CTR enhanced premium for attendance allowance in two cases A lone-applying household head aged 60 in Edinburgh with attendance allowance now meets Scotland's working-age enhanced disability premium condition, which SSI 2023/38 extended to attendance allowance from 1 April 2023 (SSI 2021/249 Sch 1 para 14(1)(g)). Each case's premiums and applicable amount rise by the single rate, 22.00 * 52 = 1,144.00. Co-Authored-By: Claude Opus 5.5 --- .../applicant_or_partner.yaml | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml index 405fc1ffc3..3af07343bd 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml @@ -222,12 +222,15 @@ savings: 0 output: # Disability (44.85) and severe disability (86.05) premiums at the single - # rate: (44.85 + 86.05) * 52. The young mother's disability does not give - # the grandmother a premium, and at 17 neither parent is a non-dependant - # who bars the severe disability premium. - council_tax_reduction_premiums: [6_806.80] + # rate, and the enhanced disability premium (22.00), which Scotland's + # working-age scheme pays for attendance allowance from 1 April 2023 (SSI + # 2021/249 Sch 1 para 14(1)(g)): (44.85 + 86.05 + 22.00) * 52. The young + # mother's disability does not give the grandmother a premium, and at 17 + # neither parent is a non-dependant who bars the severe disability + # premium. + council_tax_reduction_premiums: [7_950.80] # Single aged 25 or over, 95.55 * 52 = 4,968.60, plus the premiums. - council_tax_reduction_applicable_amount: [11_775.40] + council_tax_reduction_applicable_amount: [12_919.40] - name: Adult parents in a lone-applying head's benefit unit are her non-dependants and bar her severe disability premium period: 2026 @@ -268,9 +271,11 @@ # At 19 the parents are residents aged 18 or over outside her family, so # the severe disability premium is not payable (HB Regs 2006 Sch 3 para # 14(2)(a)(ii), which the model applies to Council Tax Reduction too). - # Only the disability premium remains: 44.85 * 52. - council_tax_reduction_premiums: [2_332.20] - council_tax_reduction_applicable_amount: [7_300.80] + # The disability premium and the enhanced disability premium for her + # attendance allowance (SSI 2021/249 Sch 1 para 14(1)(g)) remain: + # (44.85 + 22.00) * 52. + council_tax_reduction_premiums: [3_476.20] + council_tax_reduction_applicable_amount: [8_444.80] - name: A blind grandmother head who applies alone has no non-dependant deduction in Merton period: 2026 From 152726500962d08ac808bd682d8d68a181a2e6f3 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 31 Oct 2026 23:33:31 -0400 Subject: [PATCH 06/43] Pay the enhanced premium for enhanced PIP in the young-person CTR cases The applicant in these three Scottish cases receives the enhanced PIP daily living component, which meets the enhanced disability premium condition for Housing Benefit (HB Regs 2006 Sch 3 para 15(1)(c)), Income Support (IS Regs 1987 Sch 2 para 13A(1ZA)(c)) and Scotland's working-age Council Tax Reduction (SSI 2021/249 Sch 1 para 14(1)(f)). Each premium total and applicable amount rises by 22.00 * 52 = 1,144.00, and each reduction by 20% of that, 228.80. Co-Authored-By: Claude Opus 5.5 --- ...evere_disability_premium_young_person.yaml | 50 ++++++++++++------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml index 8e67b31977..c9b002f64a 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml @@ -1,8 +1,11 @@ # SSI2021/249 regs6,8(2)(a),Sch1para13. Existing2026 model controls: # allowance95.55*52=4968.60; severe86.05*52=4474.60; withdrawal20%. # PIP qualifies SDP but generic disability flag is separately supplied/defaultfalse. +# Enhanced PIP daily living also gives the enhanced disability premium, +# 22.00*52=1144 (HB Regs 2006 Sch3 para15(1)(c); IS Regs 1987 Sch2 +# para13A(1ZA)(c); SSI2021/249 Sch1 para14(1)(f)). # Pension12570:no tax; PIP disregarded; Child Benefit claim declined. -# CTR=2000-20%*(12570-allowance):479.72 or1374.64. +# CTR=2000-20%*(12570-applicable amount):708.52 or1603.44. # Annual UC terminal-date input represents unavailable assessment-period detail. # Reverse case supplies CB family status: input-contract composition, # not a naturally derived eligibility pair or full statutory rate audit. @@ -48,19 +51,22 @@ council_tax: 2000 savings: 0 output: - simulated_council_tax_reduction_benunit: 479.72 + # 2000 - 20% * (12570 - 6112.60) = 708.52. + simulated_council_tax_reduction_benunit: 708.52 disability_premium: 0 - enhanced_disability_premium: 0 + enhanced_disability_premium: 1144 severe_disability_premium: 4474.6 council_tax_reduction_pensioner: false council_tax_reduction_applicable_income: 12570 - council_tax_reduction_applicable_amount: 4968.6 + # 4968.60 + 1144 (enhanced disability premium only). + council_tax_reduction_applicable_amount: 6112.6 council_tax_reduction_non_dep_deductions: 0 severe_disability_premium_before_non_dependant_test: 4474.6 council_tax_reduction_severe_disability_premium: 0 - working_age_benefits_premiums: 4474.6 - benefits_premiums: 4474.6 - income_support_applicable_amount: 9443.2 + # 4474.60 + 1144 = 5618.60; IS 4968.60 + 5618.60 = 10587.20. + working_age_benefits_premiums: 5618.6 + benefits_premiums: 5618.6 + income_support_applicable_amount: 10587.2 - name: Before terminal date both definitions retain Scottish CTR premium period: 2026 absolute_error_margin: 0.01 @@ -99,19 +105,21 @@ council_tax: 2000 savings: 0 output: - simulated_council_tax_reduction_benunit: 1374.64 + # 2000 - 20% * (12570 - 10587.20) = 1603.44. + simulated_council_tax_reduction_benunit: 1603.44 disability_premium: 0 - enhanced_disability_premium: 0 + enhanced_disability_premium: 1144 severe_disability_premium: 4474.6 council_tax_reduction_pensioner: false council_tax_reduction_applicable_income: 12570 - council_tax_reduction_applicable_amount: 9443.2 + # 4968.60 + 4474.60 + 1144 = 10587.20. + council_tax_reduction_applicable_amount: 10587.2 council_tax_reduction_non_dep_deductions: 0 severe_disability_premium_before_non_dependant_test: 4474.6 council_tax_reduction_severe_disability_premium: 4474.6 - working_age_benefits_premiums: 4474.6 - benefits_premiums: 4474.6 - income_support_applicable_amount: 9443.2 + working_age_benefits_premiums: 5618.6 + benefits_premiums: 5618.6 + income_support_applicable_amount: 10587.2 - name: 'Supplied-status contract: UC young person outside CB family restores Scottish CTR premium' period: 2026 @@ -152,16 +160,20 @@ council_tax: 2000 savings: 0 output: - simulated_council_tax_reduction_benunit: 1374.64 + # 2000 - 20% * (12570 - 10587.20) = 1603.44. + simulated_council_tax_reduction_benunit: 1603.44 disability_premium: 0 - enhanced_disability_premium: 0 + enhanced_disability_premium: 1144 severe_disability_premium: 0 council_tax_reduction_pensioner: false council_tax_reduction_applicable_income: 12570 - council_tax_reduction_applicable_amount: 9443.2 + # 4968.60 + 4474.60 + 1144 = 10587.20. + council_tax_reduction_applicable_amount: 10587.2 council_tax_reduction_non_dep_deductions: 0 severe_disability_premium_before_non_dependant_test: 4474.6 council_tax_reduction_severe_disability_premium: 4474.6 - working_age_benefits_premiums: 0 - benefits_premiums: 0 - income_support_applicable_amount: 4968.6 + # The non-dependant bars only the severe premium: 1144; IS 4968.60 + + # 1144 = 6112.60. + working_age_benefits_premiums: 1144 + benefits_premiums: 1144 + income_support_applicable_amount: 6112.6 From 72f4932930b1ec066c59bdaf4d40251d415954c5 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 01:45:43 -0500 Subject: [PATCH 07/43] Count enhanced premium awards by amount and category, and each CTR scheme's own list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit An award of the highest DLA care rate or the enhanced PIP daily living rate now needs a positive amount, and takes its rate from the award category or, for an amount entered without its category, from an amount within £1 a week of the top rate. A zero or neutralised amount is no award. The Housing Benefit child premium reads the same awards. Merton and Kingston upon Thames count PIP daily living at either rate and no armed forces independence payment; Newham counts both (Sch 3 para 12 of each council's 2026-27 scheme). Westminster keeps the Housing Benefit condition. Co-Authored-By: Claude Opus 5.5 --- .../enhanced_qualifying_benefits.yaml | 35 +++++----- ..._qualifying_benefits_northern_ireland.yaml | 33 +++++---- .../top_rate_amount_tolerance.yaml | 11 +++ .../qualifying_benefits.yaml | 20 ++++++ .../qualifying_benefits.yaml | 20 ++++++ .../qualifying_benefits.yaml | 22 ++++++ .../age_limit_applies.yaml | 18 ++--- .../qualifying_benefits.yaml | 35 +++++----- .../gov/dwp/dla/has_highest_dla_sc_award.py | 33 +++++++++ ...using_benefit_child_disability_premiums.py | 22 +++--- .../gov/dwp/pip/has_enhanced_pip_dl_award.py | 35 ++++++++++ ...x_reduction_enhanced_disability_premium.py | 9 ++- ...n_enhanced_disability_premium_condition.py | 70 ++++++++++++++----- ...d_disability_premium_qualifying_benefit.py | 47 ++++++------- 14 files changed, 292 insertions(+), 118 deletions(-) create mode 100644 policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml create mode 100644 policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py create mode 100644 policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml index b1486ba8d7..59933891b9 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml @@ -1,20 +1,19 @@ description: > - Benefits whose receipt at the rate named meets the qualifying-benefit - condition of the legacy enhanced disability premium for a claimant or - partner: the care component of disability living allowance at the highest - rate, the daily living component of personal independence payment at the - enhanced rate, and armed forces independence payment. Each programme adds its - own conditions, such as the age limit. The Regulations also list the Scottish - equivalents (child disability payment and Scottish adult disability living - allowance care components at the highest rate, adult disability payment - daily living component at the enhanced rate), which are not separate model - variables. The 8 April 2013 date is Great Britain's: S.I. 2013/388 added the + Awards that meet the qualifying-benefit condition of the legacy enhanced + disability premium for a claimant or partner in Great Britain: the care + component of disability living allowance at the highest rate + (has_highest_dla_sc_award), the daily living component of personal + independence payment at the enhanced rate (has_enhanced_pip_dl_award) and + armed forces independence payment. Each programme adds its own conditions, + such as the age limit. The Regulations also name the Scottish equivalents + (the care components of child disability payment and Scottish adult + disability living allowance at the highest rate, and the daily living + component of adult disability payment at the enhanced rate); the model has + no separate variables for them. From 8 April 2013, S.I. 2013/388 added the PIP daily living component and S.I. 2013/591 added armed forces independence - payment. This list applies in Great Britain; the - enhanced_qualifying_benefits_northern_ireland parameter holds Northern - Ireland's separate commencement dates. Like other parameters, the model reads - the list as at 30 April of each year from 2015 and does not prorate a change - made during a year. + payment. The enhanced_qualifying_benefits_northern_ireland parameter holds + Northern Ireland's list. The model reads the list as at 30 April of each + year from 2015 and does not prorate a change made during a year. metadata: label: Legacy benefit enhanced disability premium qualifying benefits period: year @@ -34,8 +33,8 @@ metadata: href: https://www.legislation.gov.uk/uksi/2013/591/article/2 values: 2006-03-06: - - receives_highest_dla_sc + - has_highest_dla_sc_award 2013-04-08: - - receives_highest_dla_sc - - receives_enhanced_pip_dl + - has_highest_dla_sc_award + - has_enhanced_pip_dl_award - armed_forces_independence_payment diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml index 2eaf40c641..dce7b2c155 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml @@ -1,17 +1,16 @@ description: > - Benefits whose receipt at the rate named meets the qualifying-benefit - condition of the legacy enhanced disability premium for a claimant or - partner in Northern Ireland. The care component of disability living - allowance at the highest rate qualifies. Armed forces independence payment - was added from 24 December 2013 by S.I. 2013/3021, and the personal - independence payment daily living component at the enhanced rate from 20 - June 2016 by S.R. 2016/228, in the Northern Ireland Income Support, - Jobseeker's Allowance, Housing Benefit and Employment and Support Allowance - regulations. Like other parameters, the model reads the list - as at 30 April of each year from 2015 and does not prorate a change made - during a year, so it adds the daily living component from 2017. The initial - value date follows the Great Britain list, not the commencement of S.R. - 2006/405 on 20 November 2006. + Awards that meet the qualifying-benefit condition of the legacy enhanced + disability premium for a claimant or partner in Northern Ireland. The care + component of disability living allowance at the highest rate qualifies. S.I. + 2013/3021 added armed forces independence payment from 24 December 2013, and + S.R. 2016/228 added the daily living component of personal independence + payment at the enhanced rate from 20 June 2016, to the Northern Ireland + Income Support, Jobseeker's Allowance, Housing Benefit and Employment and + Support Allowance regulations. The model reads the list as at 30 April of + each year from 2015 and does not prorate a change made during a year, so it + adds the daily living component from 2017. The first value's date follows + the Great Britain list rather than the commencement of S.R. 2006/405 on 20 + November 2006. metadata: label: Northern Ireland legacy benefit enhanced disability premium qualifying benefits period: year @@ -39,11 +38,11 @@ metadata: href: https://www.legislation.gov.uk/nisr/2016/228/regulation/30 values: 2006-03-06: - - receives_highest_dla_sc + - has_highest_dla_sc_award 2013-12-24: - - receives_highest_dla_sc + - has_highest_dla_sc_award - armed_forces_independence_payment 2016-06-20: - - receives_highest_dla_sc - - receives_enhanced_pip_dl + - has_highest_dla_sc_award + - has_enhanced_pip_dl_award - armed_forces_independence_payment diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml new file mode 100644 index 0000000000..4e7f51532d --- /dev/null +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml @@ -0,0 +1,11 @@ +description: The model counts a disability living allowance care amount or a personal independence payment daily living amount entered without its award category as a top-rate award for the enhanced disability premium when the amount reaches the top weekly rate less this tolerance, times 52. policyengine-uk-data allows the same £1 a week when it derives award categories from reported weekly amounts. +values: + 2015-01-01: 1 +metadata: + period: week + unit: currency-GBP + label: Enhanced disability premium top-rate amount tolerance + economy: false + reference: + - title: policyengine-uk-data, disability_benefits.py, CATEGORY_THRESHOLD_WEEKLY_TOLERANCE + href: https://github.com/PolicyEngine/policyengine-uk-data/blob/575ae3764cf0823ccf4c302fe7b640824cdb32c1/policyengine_uk_data/datasets/disability_benefits.py#L58 diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml new file mode 100644 index 0000000000..c682aff0c2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -0,0 +1,20 @@ +description: > + Awards to the applicant or a member of the applicant's family that meet the + enhanced disability premium condition of Kingston upon Thames's working-age + Council Tax Reduction scheme: the care component of disability living + allowance at the highest rate and the daily living component of personal + independence payment at either rate. The scheme names no armed forces + independence payment. Each award counts only for a person under the + qualifying age for State Pension Credit. The model reads the list as at 30 + April of each year and backdates it to 2015. +metadata: + label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: Council Tax Reduction Scheme 2026 - 2027, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf +values: + 2026-04-01: + - has_highest_dla_sc_award + - pip_dl diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml new file mode 100644 index 0000000000..4e60fcc785 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -0,0 +1,20 @@ +description: > + Awards to the applicant or a member of the applicant's family that meet the + enhanced disability premium condition of Merton's working-age Council Tax + Support scheme: the care component of disability living allowance at the + highest rate and the daily living component of personal independence + payment at either rate. The scheme names no armed forces independence + payment. Each award counts only for a person under the qualifying age for + State Pension Credit. The model reads the list as at 30 April of each year + and backdates it to 2015. +metadata: + label: Merton Council Tax Support enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2026, Sch. 3 para. 12(1)(b), (c) + href: https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf +values: + 2026-04-01: + - has_highest_dla_sc_award + - pip_dl diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml new file mode 100644 index 0000000000..8adfbf13bf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -0,0 +1,22 @@ +description: > + Awards to the applicant or a member of the applicant's family that meet the + enhanced disability premium condition of Newham's working-age Council Tax + Reduction scheme: the care component of disability living allowance at the + highest rate, the daily living component of personal independence payment + at either rate and armed forces independence payment. Each award counts + only for a person under the qualifying age for State Pension Credit. The + scheme also names the care component of child disability payment at the + highest rate, for which the model has no separate variable. The model reads + the list as at 30 April of each year and backdates it to 2015. +metadata: + label: Newham Council Tax Reduction enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: Council Tax Reduction Scheme 2026, Sch. 3 para. 12(1)(n), (o), (p) + href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 +values: + 2026-04-01: + - has_highest_dla_sc_award + - pip_dl + - armed_forces_independence_payment diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml index 0fea543475..e3dd616012 100644 --- a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml @@ -1,13 +1,13 @@ description: > - Scotland's working-age Council Tax Reduction scheme pays the enhanced - disability premium only for an applicant or partner under the qualifying - age for State Pension Credit if this is true. The 2012 scheme had this limit - until 31 March 2022. The 2021 scheme limited it to those under pensionable - age, which the model reads as the same qualifying age (the two have agreed - for everyone since 2019-20), until S.S.I. 2022/161 removed the limit from - 20 June 2022. Like other parameters, - the model reads this as at 30 April of each year from 2015, so the limit - applies in 2022 and not from 2023. + If this is true, Scottish councils include the enhanced disability premium + in a working-age Council Tax Reduction applicable amount only for an + applicant or partner under the qualifying age for State Pension Credit. The + Scottish Ministers set this limit in the 2012 scheme, which ran until 31 + March 2022, and set a limit at pensionable age in the 2021 scheme, which the + model reads as the same qualifying age (the two have agreed for everyone + since 2019-20). The Scottish Ministers removed the limit from 20 June 2022 + (S.S.I. 2022/161). The model reads this as at 30 April of each year from + 2015, so it applies the limit in 2022 and not from 2023. metadata: label: Scottish working-age Council Tax Reduction enhanced disability premium age limit applies period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml index 9d066654e8..1ff65e80b5 100644 --- a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml @@ -1,16 +1,15 @@ description: > - Benefits whose receipt by the applicant or partner meets the enhanced - disability premium condition of Scotland's working-age Council Tax Reduction - scheme: the care component of disability living allowance at the highest - rate, the daily living component of personal independence payment at the - enhanced rate and armed forces independence payment, and from 1 April 2023 - attendance allowance at either rate (S.S.I. 2023/38). The scheme also lists - Scottish benefits (child disability payment, adult disability payment, - pension age disability payment and Scottish adult disability living - allowance), which are not separate model variables. Armed forces - independence payment was added to the 2012 scheme from 11 June 2013 (S.S.I. - 2013/142). Like other parameters, the model reads the list as at 30 April of - each year from 2015. + Awards to the applicant or partner that meet the enhanced disability premium + condition of Scotland's working-age Council Tax Reduction scheme: the care + component of disability living allowance at the highest rate, the daily + living component of personal independence payment at the enhanced rate, + armed forces independence payment and, from 1 April 2023, attendance + allowance at either rate (S.S.I. 2023/38). The scheme also names Scottish + benefits (child disability payment, adult disability payment, pension age + disability payment and Scottish adult disability living allowance), for + which the model has no separate variables. S.S.I. 2013/142 added armed + forces independence payment to the 2012 scheme from 11 June 2013. The model + reads the list as at 30 April of each year from 2015. metadata: label: Scottish working-age Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -24,14 +23,14 @@ metadata: href: https://www.legislation.gov.uk/ssi/2023/38/regulation/16 values: 2013-04-01: - - receives_highest_dla_sc - - receives_enhanced_pip_dl + - has_highest_dla_sc_award + - has_enhanced_pip_dl_award 2013-06-11: - - receives_highest_dla_sc - - receives_enhanced_pip_dl + - has_highest_dla_sc_award + - has_enhanced_pip_dl_award - armed_forces_independence_payment 2023-04-01: - - receives_highest_dla_sc - - receives_enhanced_pip_dl + - has_highest_dla_sc_award + - has_enhanced_pip_dl_award - armed_forces_independence_payment - attendance_allowance diff --git a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py new file mode 100644 index 0000000000..3f5fe32917 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py @@ -0,0 +1,33 @@ +from policyengine_uk.model_api import * + + +class has_highest_dla_sc_award(Variable): + label = "Has an award of the DLA care component at the highest rate" + documentation = ( + "Whether the person has an award of the care component of disability " + "living allowance at the highest rate. An award needs a positive " + "amount (dla_sc), so an amount of zero, including one a reform sets " + "by neutralising dla_sc, is no award. The rate comes from the award " + "category (dla_sc_category) or from the amount: an amount entered " + "without its category counts when it reaches the highest weekly rate " + "less a tolerance (gov.dwp.disability_premia.top_rate_amount_" + "tolerance), times 52. The Regulations also count an award whose " + "payment stops while the person is in hospital; the model has no input " + "for that." + ) + entity = Person + definition_period = YEAR + value_type = bool + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.dwp + amount = person("dla_sc", period) + threshold = ( + p.dla.self_care.higher - p.disability_premia.top_rate_amount_tolerance + ) * WEEKS_IN_YEAR + highest_rate = person("receives_highest_dla_sc", period) | (amount >= threshold) + return (amount > 0) & highest_rate diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py index b2ad3bb956..33f4d68800 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py @@ -9,14 +9,16 @@ class housing_benefit_child_disability_premiums(Variable): label = "Housing Benefit child disability premiums" documentation = ( "Disabled-child and enhanced-child premiums for legally dependent " - "children and young persons. Uses actual DLA or PIP receipt, AFIP, " - "and the existing blindness indicator; enhanced rates additionally " - "require highest DLA care or enhanced PIP daily living receipt, or " - "AFIP. Scottish replacement awards must be represented in the existing " - "benefit fields: separate replacement-award fields are not available. " - "Hospital suspension, blindness run-on and bereavement continuation " - "are not reconstructed. A generic disability flag is insufficient. " - "These child amounts are separate from the shared adult premiums." + "children and young persons. The disabled-child rate needs a positive " + "DLA or PIP amount (either component), AFIP or the blindness " + "indicator. The enhanced rate needs an award that meets the adult " + "condition: the highest DLA care rate (has_highest_dla_sc_award), the " + "enhanced PIP daily living rate (has_enhanced_pip_dl_award) or AFIP. " + "The model has no separate fields for Scottish replacement awards, so " + "callers enter them in the DLA and PIP fields. The model omits " + "hospital suspension, the blindness run-on and bereavement " + "continuation, and a generic disability flag does not qualify. These " + "child amounts are separate from the shared adult premiums." ) reference = ( "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", @@ -40,8 +42,8 @@ def formula(benunit, period, parameters): afip = person("armed_forces_independence_payment", period) > 0 disabled = dla | pip | afip | person("is_blind", period) enhanced = ( - (dla_care & person("receives_highest_dla_sc", period)) - | (pip_daily & person("receives_enhanced_pip_dl", period)) + person("has_highest_dla_sc_award", period) + | person("has_enhanced_pip_dl_award", period) | afip ) weekly = p.disabled_child * disabled + p.enhanced_disabled_child * enhanced diff --git a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py new file mode 100644 index 0000000000..c17fa15d8f --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py @@ -0,0 +1,35 @@ +from policyengine_uk.model_api import * + + +class has_enhanced_pip_dl_award(Variable): + label = "Has an award of the PIP daily living component at the enhanced rate" + documentation = ( + "Whether the person has an award of the daily living component of " + "personal independence payment at the enhanced rate. An award needs a " + "positive amount (pip_dl), so an amount of zero, including one a " + "reform sets by neutralising pip_dl, is no award. The rate comes from " + "the award category (pip_dl_category) or from the amount: an amount " + "entered without its category counts when it reaches the enhanced " + "weekly rate less a tolerance (gov.dwp.disability_premia.top_rate_" + "amount_tolerance), times 52. The Regulations also count an award " + "whose payment stops while the person is in hospital; the model has no " + "input for that." + ) + entity = Person + definition_period = YEAR + value_type = bool + reference = ( + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", + "https://www.legislation.gov.uk/uksi/1987/1967/schedule/2/paragraph/13A", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.dwp + amount = person("pip_dl", period) + threshold = ( + p.pip.daily_living.enhanced - p.disability_premia.top_rate_amount_tolerance + ) * WEEKS_IN_YEAR + enhanced_rate = person("receives_enhanced_pip_dl", period) | ( + amount >= threshold + ) + return (amount > 0) & enhanced_rate diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index 67aef05c5c..7c742ad3e2 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -10,8 +10,11 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "Reduction applicable amount: the single rate, or the couple rate " "where either or both members of a couple meet the scheme's condition " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " - "Outside Scotland this equals the legacy premium " - "(enhanced_disability_premium). Pension-age Council Tax Reduction has " + "It differs from the legacy premium (enhanced_disability_premium) in " + "Scotland, Merton, Kingston upon Thames and Newham, whose schemes name " + "their own awards. The model pays the Housing Benefit amounts in every " + "scheme, though Kingston upon Thames's 2026-27 scheme sets lower ones " + "(£17.10 single, £24.50 couple). Pension-age Council Tax Reduction has " "no adult enhanced disability premium." ) definition_period = YEAR @@ -19,7 +22,7 @@ class council_tax_reduction_enhanced_disability_premium(Variable): reference = ( "https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", - "https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/paragraph/12", + "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/part/4", ) def formula(benunit, period, parameters): diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index dc24a4f180..a695f8568b 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -1,5 +1,8 @@ from policyengine_uk.model_api import * from policyengine_uk.variables.gov.local_authorities.council_tax_reduction.config import ( + is_kingston_upon_thames_area, + is_merton_area, + is_newham_area, is_scotland_scheme, ) @@ -11,37 +14,66 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable documentation = ( "Whether this person, as an applicant or partner, meets the enhanced " "disability premium condition of the working-age Council Tax " - "Reduction scheme that covers their household. In Scotland the " - "scheme's own list of qualifying benefits applies, which adds " - "attendance allowance at either rate from 1 April 2023, and the age " - "limit applies only until 20 June 2022. Elsewhere the condition is " - "Housing Benefit's, as in the Welsh scheme: a qualifying benefit " - "(receives_enhanced_disability_premium_qualifying_benefit) and not " - "having attained the qualifying age for State Pension Credit. " - "England's Default Scheme has the same age limit but names the PIP " - "daily living component at either rate and no armed forces " - "independence payment. The model applies the Housing Benefit " - "condition to the English councils' schemes, whose own documents " - "have not been checked against it." + "Reduction scheme that covers their household. Each scheme names its " + "own awards. Scotland's list adds attendance allowance at either rate " + "from 1 April 2023, and its age limit applies only until 20 June 2022. " + "Merton and Kingston upon Thames name the PIP daily living component " + "at either rate and no armed forces independence payment; Newham " + "names the PIP daily living component at either rate and armed forces " + "independence payment. Those three councils count an award only for a " + "person under the qualifying age for State Pension Credit. Every other " + "scheme takes the Housing Benefit condition " + "(receives_enhanced_disability_premium_qualifying_benefit, under the " + "same age limit): the Welsh scheme states it, and the model keeps it " + "for Westminster, whose published scheme document summarises its " + "working-age scheme without the premium conditions. Oxford's " + "working-age award uses income bands, so the premium does not reach " + "it." ) definition_period = YEAR reference = ( "https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14", "https://www.legislation.gov.uk/ssi/2012/303/schedule/1/paragraph/12/2021-04-01", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", - "https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/paragraph/12", + "https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf", + "https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf", + "https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026", ) def formula(person, period, parameters): - ctr = parameters(period).gov.local_authorities.scotland.council_tax_reduction - p = ctr.working_age.enhanced_disability_premium - scotland = is_scotland_scheme(person.household("country", period)) + la = parameters(period).gov.local_authorities + household = person.household + country = household("country", period) + local_authority = household("local_authority", period) under_age = ~person("has_attained_state_pension_credit_qualifying_age", period) - scottish = (add(person, period, p.qualifying_benefits) > 0) & ( + + def receives(benefits): + return add(person, period, benefits) > 0 + + def council_condition(council): + p = council.council_tax_reduction.enhanced_disability_premium + return receives(p.qualifying_benefits) & under_age + + p = la.scotland.council_tax_reduction.working_age.enhanced_disability_premium + scottish = receives(p.qualifying_benefits) & ( under_age | (not p.age_limit_applies) ) - elsewhere = ( + housing_benefit = ( person("receives_enhanced_disability_premium_qualifying_benefit", period) & under_age ) - return where(scotland, scottish, elsewhere) + return select( + [ + is_scotland_scheme(country), + is_merton_area(local_authority, country), + is_kingston_upon_thames_area(local_authority, country), + is_newham_area(local_authority, country), + ], + [ + scottish, + council_condition(la.merton), + council_condition(la.kingston_upon_thames), + council_condition(la.newham), + ], + default=housing_benefit, + ) diff --git a/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py b/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py index ce82acde71..f6e0094a3e 100644 --- a/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py +++ b/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py @@ -6,31 +6,30 @@ class receives_enhanced_disability_premium_qualifying_benefit(Variable): entity = Person label = "Receives an enhanced disability premium qualifying benefit" documentation = ( - "In receipt of a benefit that meets the qualifying-benefit condition " - "of the legacy enhanced disability premium: the care component of " - "disability living allowance at the highest rate, the daily living " - "component of personal independence payment at the enhanced rate, or " - "armed forces independence payment. The award categories " - "(dla_sc_category, pip_dl_category) decide the rate, as in the severe " - "disability premium list (receives_severe_disability_premium_" - "qualifying_benefit), so a DLA or PIP amount entered without its " - "category does not count. Each programme adds its own conditions: " - "the age limit (num_enhanced_disabled_claimants_or_partners_for_" - "legacy_benefits) and, in Council Tax Reduction, its scheme's own list " + "Whether the person has an award that meets the qualifying-benefit " + "condition of the legacy enhanced disability premium: the care " + "component of disability living allowance at the highest rate " + "(has_highest_dla_sc_award), the daily living component of personal " + "independence payment at the enhanced rate (has_enhanced_pip_dl_award) " + "or armed forces independence payment. Each award needs a positive " + "amount, so an amount of zero is no award. The rate comes from the " + "award category or, for an amount entered without its category, from " + "the amount. Each programme adds its own conditions: the age limit " + "(num_enhanced_disabled_claimants_or_partners_for_legacy_benefits) " + "and, in Council Tax Reduction, its scheme's own list " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " - "Attendance allowance does not qualify. The Scottish equivalents " - "(child disability payment and Scottish adult disability living " - "allowance care components at the highest rate, adult disability " - "payment daily living component at the enhanced rate) are not " - "separate model variables. The limited capability for work-related " - "activity limb (Housing Benefit), the support component limb " - "(Employment and Support Allowance), the hospital rules and the " - "long-term patient exclusion are not modelled. Household country " - "selects the list: Northern Ireland adds armed forces independence " - "payment from 24 December 2013 and PIP daily living from 20 June " - "2016; Great Britain adds both from 8 April 2013. The model reads each " - "list as at 30 April of the year from 2015, without within-year " - "proration." + "Attendance allowance does not qualify. The model has no separate " + "variables for the Scottish equivalents (the care components of child " + "disability payment and Scottish adult disability living allowance at " + "the highest rate, and the daily living component of adult disability " + "payment at the enhanced rate). It omits the limited capability for " + "work-related activity limb (Housing Benefit), the support component " + "limb (Employment and Support Allowance), the hospital rules and the " + "long-term patient exclusion. Household country selects the list: " + "Northern Ireland adds armed forces independence payment from 24 " + "December 2013 and PIP daily living from 20 June 2016; Great Britain " + "adds both from 8 April 2013. The model reads each list as at 30 April " + "of the year from 2015, without within-year proration." ) definition_period = YEAR reference = ( From b8de477aab8a8d3c033693e38177381bd8af13ea Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 01:45:49 -0500 Subject: [PATCH 08/43] Test award amounts, zero amounts and each council's enhanced premium list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds YAML for amounts entered without a category, the £1 tolerance, explicit zero amounts and part amounts, the child premium, a Merton applicant whose AFIP adds no premium and each London council's list, and replaces the property test's outside-Scotland equality with scheme-specific expectations. Co-Authored-By: Claude Opus 5.5 --- .../gov/dwp/enhanced_disability_premium.yaml | 173 ++++++++++ .../enhanced_disability_premium.yaml | 186 ++++++++++- ..._enhanced_disability_premium_properties.py | 316 +++++++++++++----- 3 files changed, 597 insertions(+), 78 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml index 61c00c2e6b..701ea25185 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml @@ -7,6 +7,9 @@ # the condition is met in respect of a member of a couple. # 2026-27 weekly rates: DLA care highest £114.60, middle £76.70; PIP daily # living enhanced £114.60, standard £76.70 (gov.dwp parameters). +# An award needs a positive amount. An amount entered without its category +# counts at the top rate when it reaches the top weekly rate less £1, times +# 52: (114.60 - 1) * 52 = 5,907.20 in 2026-27. - name: Case 1, enhanced PIP daily living qualifies a single claimant. period: 2026 @@ -374,3 +377,173 @@ # (2026-27 DWP rates): 95.55 * 52 = 4,968.60. Premiums 1,144.00 + # 4,474.60 = 5,618.60. Total 10,587.20. income_support_applicable_amount: 10_587.20 + +- name: Case 19, a DLA care amount at the highest rate without its category qualifies. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + dla_sc: 5_959.20 + households: + household: + members: [person1] + country: ENGLAND + output: + receives_highest_dla_sc: false + # 5,959.20 reaches 5,907.20. + has_highest_dla_sc_award: true + receives_enhanced_disability_premium_qualifying_benefit: true + enhanced_disability_premium: 1_144 + +- name: Case 20, a PIP daily living amount at the enhanced rate without its category qualifies. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl: 5_959.20 + households: + household: + members: [person1] + country: ENGLAND + output: + receives_enhanced_pip_dl: false + has_enhanced_pip_dl_award: true + enhanced_disability_premium: 1_144 + +- name: Case 21, an amount within £1 a week of the highest DLA care rate qualifies. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # £113.65 a week: 113.65 * 52 = 5,909.80, above 5,907.20. + dla_sc: 5_909.80 + households: + household: + members: [person1] + country: ENGLAND + output: + has_highest_dla_sc_award: true + enhanced_disability_premium: 1_144 + +- name: Case 22, an amount more than £1 a week below the highest DLA care rate does not qualify. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + # £113.50 a week: 113.50 * 52 = 5,902.00, below 5,907.20. + dla_sc: 5_902 + households: + household: + members: [person1] + country: ENGLAND + output: + has_highest_dla_sc_award: false + enhanced_disability_premium: 0 + +- name: Case 23, the highest DLA care category with an amount of zero is no award. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + dla_sc_category: HIGHER + dla_sc: 0 + households: + household: + members: [person1] + country: ENGLAND + output: + receives_highest_dla_sc: true + has_highest_dla_sc_award: false + receives_enhanced_disability_premium_qualifying_benefit: false + enhanced_disability_premium: 0 + +- name: Case 24, the enhanced PIP daily living category with an amount of zero is no award. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: ENHANCED + pip_dl: 0 + households: + household: + members: [person1] + country: ENGLAND + output: + has_enhanced_pip_dl_award: false + enhanced_disability_premium: 0 + +- name: Case 25, the highest DLA care category qualifies with an amount below the rate. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + dla_sc_category: HIGHER + dla_sc: 1_000 + households: + household: + members: [person1] + country: ENGLAND + output: + # The category gives the rate; the positive amount gives the award. + has_highest_dla_sc_award: true + enhanced_disability_premium: 1_144 + +- name: Case 26, a child with the highest DLA care category and an amount of zero gets no child premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + child: + age: 10 + dla_sc_category: HIGHER + dla_sc: 0 + benunits: + benunit: + members: [parent, child] + households: + household: + members: [parent, child] + country: ENGLAND + output: + receives_enhanced_disability_premium_qualifying_benefit: [false, false] + # No DLA amount, so neither the disabled-child nor the enhanced rate. + housing_benefit_child_disability_premiums: 0 + +- name: Case 27, a child with a highest-rate DLA care amount and no category gets both child premiums. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + child: + age: 10 + dla_sc: 5_959.20 + benunits: + benunit: + members: [parent, child] + households: + household: + members: [parent, child] + country: ENGLAND + output: + receives_enhanced_disability_premium_qualifying_benefit: [false, true] + # HB Sch 3 Part 4: disabled child £84.46 plus enhanced child £33.99, + # 118.45 * 52 = 6,159.40. + housing_benefit_child_disability_premiums: 6_159.40 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 795984695e..c8cacc66d8 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -5,8 +5,14 @@ # credit". Scotland: CTR (Scotland) Regs 2021 Sch 1 para 14(1): the same # benefits for the applicant or partner with no age limit from 20 June 2022 # (S.S.I. 2022/161), and attendance allowance at either rate from 1 April -# 2023 (para 14(1)(g), S.S.I. 2023/38). The model reads each year's rules at -# 30 April. +# 2023 (para 14(1)(g), S.S.I. 2023/38). Merton's Local Council Tax Support +# Scheme Rules 2026 and Kingston upon Thames's Council Tax Reduction Scheme +# 2026 - 2027, Sch 3 para 12(1): DLA care highest and PIP daily living at +# either rate, with no AFIP. Newham's Council Tax Reduction Scheme 2026, Sch 3 +# para 12(1): DLA care highest, PIP daily living at either rate and AFIP. +# Each London scheme keeps the qualifying age for State Pension Credit as the +# age limit. Westminster keeps the Housing Benefit condition. The model reads +# each year's rules at 30 April. # 2026-27 amounts: enhanced disability premium £22.00 single, £31.40 couple; # severe disability premium £86.05 single. @@ -237,3 +243,179 @@ # Para 14(1)(g) 1,144.00 plus the severe disability premium 4,474.60: # 5,618.60. council_tax_reduction_premiums: 5_618.60 + +- name: Case 9, AFIP adds no enhanced disability premium to a Merton reduction. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + private_pension_income: 12_000 + benunits: + benunit: + members: [person1] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + household: + members: [person1] + country: ENGLAND + local_authority: MERTON + council_tax: 1_800 + savings: 0 + output: + # Housing Benefit and Income Support still count AFIP (HB para 15(1)(d)). + enhanced_disability_premium: 1_144 + # Merton Sch 3 para 12(1) names no AFIP. + meets_council_tax_reduction_enhanced_disability_premium_condition: false + council_tax_reduction_enhanced_disability_premium: 0 + # AFIP is a severe disability premium qualifying benefit: 86.05 * 52 = + # 4,474.60. + council_tax_reduction_premiums: 4_474.60 + # Personal allowance 95.55 * 52 = 4,968.60, plus 4,474.60: 9,443.20. + council_tax_reduction_applicable_amount: 9_443.20 + # 1,800 - 20% of (12,000 - 9,443.20) = 1,800 - 511.36 = 1,288.64. + simulated_council_tax_reduction_benunit: 1_288.64 + +- name: Case 10, AFIP meets Newham's and Westminster's conditions but not Merton's or Kingston upon Thames's. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + merton: + age: 30 + armed_forces_independence_payment: 2_000 + kingston: + age: 30 + armed_forces_independence_payment: 2_000 + newham: + age: 30 + armed_forces_independence_payment: 2_000 + westminster: + age: 30 + armed_forces_independence_payment: 2_000 + benunits: + merton: + members: [merton] + kingston: + members: [kingston] + newham: + members: [newham] + westminster: + members: [westminster] + households: + merton: + members: [merton] + country: ENGLAND + local_authority: MERTON + kingston: + members: [kingston] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + newham: + members: [newham] + country: ENGLAND + local_authority: NEWHAM + westminster: + members: [westminster] + country: ENGLAND + local_authority: WESTMINSTER + output: + meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, true, true] + # 22.00 * 52 = 1,144.00. + council_tax_reduction_enhanced_disability_premium: [0, 0, 1_144, 1_144] + enhanced_disability_premium: [1_144, 1_144, 1_144, 1_144] + +- name: Case 11, standard PIP daily living meets the Merton, Kingston upon Thames and Newham conditions but not Westminster's. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + merton: + age: 30 + pip_dl_category: STANDARD + kingston: + age: 30 + pip_dl_category: STANDARD + newham: + age: 30 + pip_dl_category: STANDARD + westminster: + age: 30 + pip_dl_category: STANDARD + benunits: + merton: + members: [merton] + kingston: + members: [kingston] + newham: + members: [newham] + westminster: + members: [westminster] + households: + merton: + members: [merton] + country: ENGLAND + local_authority: MERTON + kingston: + members: [kingston] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + newham: + members: [newham] + country: ENGLAND + local_authority: NEWHAM + westminster: + members: [westminster] + country: ENGLAND + local_authority: WESTMINSTER + output: + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, true, true, false] + council_tax_reduction_enhanced_disability_premium: [1_144, 1_144, 1_144, 0] + # Housing Benefit needs the enhanced rate (HB para 15(1)(c)). + enhanced_disability_premium: [0, 0, 0, 0] + +- name: Case 12, the Merton and Newham schemes keep the age limit for an over-age partner. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + merton1: + age: 60 + merton2: + age: 70 + pip_dl_category: STANDARD + newham1: + age: 60 + newham2: + age: 70 + armed_forces_independence_payment: 2_000 + benunits: + merton: + members: [merton1, merton2] + jsa_income: 3_000 + newham: + members: [newham1, newham2] + jsa_income: 3_000 + households: + merton: + members: [merton1, merton2] + country: ENGLAND + local_authority: MERTON + newham: + members: [newham1, newham2] + country: ENGLAND + local_authority: NEWHAM + output: + is_couple: [true, true] + # Income-based Jobseeker's Allowance keeps each couple in the working-age + # scheme. + council_tax_reduction_pensioner: [false, false] + # Para 12(1)(c) and (p): "who has not attained the qualifying age for + # state pension credit". + meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, false, false] + council_tax_reduction_enhanced_disability_premium: [0, 0] diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index a5e8fa4864..32d0dfbfbb 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -2,45 +2,60 @@ The premium's condition for a claimant or partner (HB Regs 2006 Sch 3 para 15(1)(b)-(d); IS Regs 1987 Sch 2 para 13A; HB Regs (NI) 2006 Sch 4 para 15): -the highest-rate DLA care component, the enhanced-rate PIP daily living -component or armed forces independence payment, for a person who has not -attained the qualifying age for State Pension Credit. Northern Ireland counts -AFIP from 24 December 2013 and PIP from 20 June 2016, which the model reads -at 30 April, so from 2017. The single rate applies to a person who is not a -member of a couple, and one couple rate applies where the condition is met -in respect of either or both members (HB Regs 2006 Sch 3 Part 4). - -Scotland's working-age Council Tax Reduction scheme (SSI 2021/249 Sch 1 para -14) adds attendance allowance at either rate from 1 April 2023 and has no -age limit from 20 June 2022, which the model reads from 2023. - -Invariants, for any generated population of single people, couples and lone -parents in every UK nation, of any adult age, with any mix of DLA care, PIP -daily living, attendance allowance and AFIP awards: +an award of the highest-rate DLA care component, the enhanced-rate PIP daily +living component or armed forces independence payment, for a person who has +not attained the qualifying age for State Pension Credit. Northern Ireland +counts AFIP from 24 December 2013 and PIP from 20 June 2016, which the model +reads at 30 April, so from 2017. The single rate applies to a person who is +not a member of a couple, and one couple rate applies where the condition is +met in respect of either or both members (HB Regs 2006 Sch 3 Part 4). + +An award needs a positive amount of the benefit. Its rate comes from the +award category or, for an amount entered without its category, from the +amount: one that reaches the top weekly rate less £1, times 52, counts. + +Council Tax Reduction schemes name their own awards. Scotland's working-age +scheme (SSI 2021/249 Sch 1 para 14) adds attendance allowance at either rate +from 1 April 2023 and has no age limit from 20 June 2022, which the model +reads from 2023. Merton's and Kingston upon Thames's schemes (Sch 3 para 12) +count the PIP daily living component at either rate and no AFIP; Newham's +counts the PIP daily living component at either rate and AFIP. Wales, +Westminster and every other scheme take the Housing Benefit condition. + +Invariants, for the generated populations: single people, couples and lone +parents in each UK nation and in five English councils besides the default +one, at adult ages from 20 to 85, each holding up to two awards drawn from +DLA care and PIP daily living categories, amounts entered without a category, +categories with an explicit amount (zero or part of the rate), attendance +allowance and AFIP: 1. Oracle: enhanced_disability_premium equals the amount the law gives, computed here from the award inputs and the parameter rates, and council_tax_reduction_enhanced_disability_premium equals the scheme's. -2. No qualifying benefit: a family in which no claimant or partner receives - a qualifying benefit gets neither premium. +2. No qualifying award: a family in which no claimant or partner has a + qualifying award gets no premium. 3. Monotone: giving a claimant or partner a qualifying benefit on top of their awards never lowers either premium. 4. Bounds: each premium is nil, the single rate or the couple rate, and never exceeds two single rates; the couple rate never exceeds two single rates in any year. -5. Differential: outside Scotland, and in Scotland before 2023, the Council - Tax Reduction premium equals the legacy premium; in Scotland from 2023 it - is never lower. -6. Differential: for a child or young person in Great Britain, the enhanced - rate in the Housing Benefit child premiums - (housing_benefit_child_disability_premiums, which encodes the same - paragraph 15 list separately) is paid exactly when the child receives a - qualifying benefit. +5. Each scheme against the legacy premium: the Council Tax Reduction premium + equals the legacy premium in Wales, Northern Ireland and English councils + without their own list; in Scotland before 2023; never falls below it in + Scotland from 2023 or in Newham; and in Merton and Kingston upon Thames + never falls below it unless the legacy premium rests on AFIP alone, in + which case it is nil unless an under-age member has a PIP daily living + award. +6. Differential: for a child or young person in Great Britain, the qualifying + flag matches the oracle, and the enhanced rate in the Housing Benefit + child premiums (housing_benefit_child_disability_premiums) is paid + exactly when the flag holds. """ import numpy as np from hypothesis import HealthCheck, given, settings from hypothesis import strategies as st +from policyengine_core.reforms import Reform from policyengine_uk import CountryTaxBenefitSystem, Simulation @@ -51,18 +66,45 @@ suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], ) WEEKS_IN_YEAR = 52 +# The weekly tolerance an amount entered without its category gets below the +# top rate (policyengine-uk-data's CATEGORY_THRESHOLD_WEEKLY_TOLERANCE). +TOLERANCE = 1 # Each example builds one simulation with inputs for every year here, so the # Northern Ireland PIP date (2017) and the Scottish changes (2023) are on # both sides of their boundaries in every example. YEARS = [2016, 2017, 2022, 2023, 2026] -COUNTRIES = ["ENGLAND", "WALES", "SCOTLAND", "NORTHERN_IRELAND"] -# Award inputs for each kind of award a person can be drawn with. +# (country, local authority): None keeps the default local authority. +PLACES = [ + ("ENGLAND", None), + ("ENGLAND", "MERTON"), + ("ENGLAND", "KINGSTON_UPON_THAMES"), + ("ENGLAND", "NEWHAM"), + ("ENGLAND", "WESTMINSTER"), + ("ENGLAND", "OXFORD"), + ("WALES", "CARDIFF"), + ("SCOTLAND", "CITY_OF_EDINBURGH"), + ("NORTHERN_IRELAND", None), +] +# Award inputs for each kind of award a person can be drawn with. The amounts +# entered without a category clear (6,000) or miss (3,000) the top-rate +# threshold in every year here: (82.30 - 1) * 52 = 4,227.60 in 2016 and +# (114.60 - 1) * 52 = 5,907.20 in 2026. AWARDS = { "dla_care_lowest": {"dla_sc_category": "LOWER"}, "dla_care_middle": {"dla_sc_category": "MIDDLE"}, "dla_care_highest": {"dla_sc_category": "HIGHER"}, + "dla_care_top_amount_only": {"dla_sc": 6_000}, + "dla_care_low_amount_only": {"dla_sc": 3_000}, + "dla_care_highest_zero_amount": {"dla_sc_category": "HIGHER", "dla_sc": 0}, + "dla_care_highest_part_amount": {"dla_sc_category": "HIGHER", "dla_sc": 1_000}, "pip_daily_living_standard": {"pip_dl_category": "STANDARD"}, "pip_daily_living_enhanced": {"pip_dl_category": "ENHANCED"}, + "pip_daily_living_top_amount_only": {"pip_dl": 6_000}, + "pip_daily_living_low_amount_only": {"pip_dl": 3_000}, + "pip_daily_living_enhanced_zero_amount": { + "pip_dl_category": "ENHANCED", + "pip_dl": 0, + }, "afip": {"armed_forces_independence_payment": 2_000}, "attendance_allowance_lower": {"aa_category": "LOWER"}, "attendance_allowance_higher": {"aa_category": "HIGHER"}, @@ -74,38 +116,83 @@ def award_inputs(awards): - """Model inputs for a tuple of awards; a later award of the same - component replaces an earlier one.""" + """Model inputs for a tuple of awards; a later award's input replaces an + earlier one's.""" inputs = {} for award in awards: inputs.update(AWARDS[award]) return inputs +def amount(inputs, benefit, year): + """The annual amount of DLA care (dla_sc) or PIP daily living (pip_dl): + the amount entered, or the rate for the award category.""" + if benefit in inputs: + return inputs[benefit] + dwp = system.parameters(year).gov.dwp + rates = dwp.dla.self_care if benefit == "dla_sc" else dwp.pip.daily_living + category = inputs.get(f"{benefit}_category", "NONE") + if category == "NONE": + return 0 + return getattr(rates, category.lower()) * WEEKS_IN_YEAR + + +def top_rate_award(inputs, benefit, year): + """An award at the highest DLA care or enhanced PIP daily living rate: a + positive amount, and the top category or an amount within the + tolerance of the top rate.""" + dwp = system.parameters(year).gov.dwp + if benefit == "dla_sc": + top_category, top_rate = "HIGHER", dwp.dla.self_care.higher + else: + top_category, top_rate = "ENHANCED", dwp.pip.daily_living.enhanced + annual = amount(inputs, benefit, year) + top = inputs.get(f"{benefit}_category") == top_category or ( + annual >= (top_rate - TOLERANCE) * WEEKS_IN_YEAR + ) + return annual > 0 and top + + +def afip(inputs): + return inputs.get("armed_forces_independence_payment", 0) > 0 + + def qualifies(inputs, country, year): - """The legacy premium's qualifying benefits, from the Regulations.""" - if inputs.get("dla_sc_category") == "HIGHER": + """The legacy premium's qualifying awards, from the Regulations.""" + if top_rate_award(inputs, "dla_sc", year) or afip(inputs): return True - if inputs.get("armed_forces_independence_payment", 0) > 0: - return True - if inputs.get("pip_dl_category") == "ENHANCED": + if top_rate_award(inputs, "pip_dl", year): return country != "NORTHERN_IRELAND" or year >= 2017 return False -def qualifies_for_scottish_ctr(inputs, year): - """SSI 2021/249 Sch 1 para 14(1), with head (g) from 2023.""" - attendance_allowance = inputs.get("aa_category") in ("LOWER", "HIGHER") - return qualifies(inputs, "SCOTLAND", year) or ( - attendance_allowance and year >= 2023 - ) +def qualifies_for_scheme(inputs, place, year): + """The scheme's own awards, before its age limit.""" + country, council = place + any_pip = amount(inputs, "pip_dl", year) > 0 + dla_highest = top_rate_award(inputs, "dla_sc", year) + if country == "SCOTLAND": + # SSI 2021/249 Sch 1 para 14(1), with head (g) from 2023. + attendance_allowance = inputs.get("aa_category") in ("LOWER", "HIGHER") + return qualifies(inputs, country, year) or ( + attendance_allowance and year >= 2023 + ) + if council in ("MERTON", "KINGSTON_UPON_THAMES"): + return dla_highest or any_pip + if council == "NEWHAM": + return dla_highest or any_pip or afip(inputs) + return qualifies(inputs, country, year) + + +def scheme_age_limit(place, year): + return place[0] != "SCOTLAND" or year < 2023 awards = st.lists(st.sampled_from(sorted(AWARDS)), max_size=2).map(tuple) adult = st.fixed_dictionaries(dict(age=st.sampled_from(ADULT_AGES), awards=awards)) family = st.fixed_dictionaries( dict( - country=st.sampled_from(COUNTRIES), + place=st.sampled_from(PLACES), shape=st.sampled_from(["single", "couple", "lone_parent"]), adults=st.lists(adult, min_size=2, max_size=2), upgrade_member=st.integers(0, 1), @@ -138,6 +225,13 @@ def every_year(inputs): return {k: {year: v for year in YEARS} for k, v in inputs.items()} +def household_inputs(country, council): + inputs = dict(country=country) + if council is not None: + inputs["local_authority"] = council + return every_year(inputs) + + def build(families, children): """One household and one benefit unit per family, and one per child with a parent aged 35. Claimants and partners are marked as such, so no age @@ -157,19 +251,15 @@ def build(families, children): people[name] = every_year(dict(age=8, is_claimant_or_partner=False)) members.append(name) benunits[f"f{i}"] = {"members": members} - households[f"f{i}"] = { - "members": members, - "country": every_year(dict(country=f["country"]))["country"], - } + households[f"f{i}"] = dict(members=members, **household_inputs(*f["place"])) for i, c in enumerate(children): members = [f"c{i}_parent", f"c{i}_child"] people[members[0]] = every_year(dict(age=35)) people[members[1]] = every_year(dict(age=c["age"], **award_inputs(c["awards"]))) benunits[f"c{i}"] = {"members": members} - households[f"c{i}"] = { - "members": members, - "country": every_year(dict(country=c["country"]))["country"], - } + households[f"c{i}"] = dict( + members=members, **household_inputs(c["country"], None) + ) sim = Simulation( situation=dict(people=people, benunits=benunits, households=households) ) @@ -184,19 +274,46 @@ def oracle(f, year, attained): Credit.""" p = system.parameters(year).gov.dwp.disability_premia rate = p.enhanced_couple if f["shape"] == "couple" else p.enhanced_single + country = f["place"][0] inputs = [award_inputs(a["awards"]) for a in adults_of(f)] legacy = any( - qualifies(x, f["country"], year) and not attained[j] + qualifies(x, country, year) and not attained[j] for j, x in enumerate(inputs) + ) + age_limit = scheme_age_limit(f["place"], year) + scheme = any( + qualifies_for_scheme(x, f["place"], year) and not (age_limit and attained[j]) for j, x in enumerate(inputs) ) - if f["country"] == "SCOTLAND": - scheme = any( - qualifies_for_scottish_ctr(x, year) and (not attained[j] or year >= 2023) - for j, x in enumerate(inputs) + return rate * WEEKS_IN_YEAR * legacy, rate * WEEKS_IN_YEAR * scheme + + +def check_scheme_against_legacy(f, year, attained, edp, ctr): + """5. Each scheme's premium against the legacy premium.""" + country, council = f["place"] + if country == "SCOTLAND": + if year < 2023: + assert np.isclose(ctr, edp, atol=0.01) + else: + assert ctr >= edp - 0.01 + elif council == "NEWHAM": + assert ctr >= edp - 0.01 + elif council in ("MERTON", "KINGSTON_UPON_THAMES"): + under_age = [ + award_inputs(a["awards"]) + for j, a in enumerate(adults_of(f)) + if not attained[j] + ] + rests_on_afip = edp > 0 and not any( + top_rate_award(x, "dla_sc", year) or top_rate_award(x, "pip_dl", year) + for x in under_age ) + if not rests_on_afip: + assert ctr >= edp - 0.01 + elif not any(amount(x, "pip_dl", year) > 0 for x in under_age): + # AFIP adds nothing to these schemes. + assert ctr == 0 else: - scheme = legacy - return rate * WEEKS_IN_YEAR * legacy, rate * WEEKS_IN_YEAR * scheme + assert np.isclose(ctr, edp, atol=0.01) def check_families(sim, person, benunit, families, year): @@ -221,24 +338,20 @@ def check_families(sim, person, benunit, families, year): # 1. Oracle. assert np.isclose(edp[b], legacy, atol=0.01), (f, year, edp[b], legacy) assert np.isclose(ctr[b], scheme, atol=0.01), (f, year, ctr[b], scheme) - # 2. No qualifying benefit, no premium. + # 2. No qualifying award, no premium. inputs = [award_inputs(a["awards"]) for a in adults_of(f)] - if not any(qualifies(x, f["country"], year) for x in inputs): + if not any(qualifies(x, f["place"][0], year) for x in inputs): assert edp[b] == 0 - if not any(qualifies_for_scottish_ctr(x, year) for x in inputs): - assert ctr[b] == 0 + if not any(qualifies_for_scheme(x, f["place"], year) for x in inputs): + assert ctr[b] == 0 # 4. Bounds. - for amount in (edp[b], ctr[b]): + for annual in (edp[b], ctr[b]): assert any( - np.isclose(amount, x, atol=0.01) + np.isclose(annual, x, atol=0.01) for x in (0, single_annual, couple_annual) ) - assert amount <= 2 * single_annual + 0.01 - # 5. Council Tax Reduction against the legacy premium. - if f["country"] != "SCOTLAND" or year < 2023: - assert np.isclose(ctr[b], edp[b], atol=0.01) - else: - assert ctr[b] >= edp[b] - 0.01 + assert annual <= 2 * single_annual + 0.01 + check_scheme_against_legacy(f, year, member_attained, edp[b], ctr[b]) # 3. Monotone: the second half are the first half's twins, each with a # qualifying benefit added. assert all(t >= s - 0.01 for s, t in zip(family_edp[:n], family_edp[n:])) @@ -258,14 +371,12 @@ def check_children(sim, person, benunit, children, year): if not young[k]: continue inputs = award_inputs(c["awards"]) - # The disabled child rate: any DLA, PIP or AFIP award. - disabled = any( - key in inputs - for key in ( - "dla_sc_category", - "pip_dl_category", - "armed_forces_independence_payment", - ) + assert bool(qualifying[k]) == qualifies(inputs, c["country"], year), (c, year) + # The disabled child rate: a positive DLA or PIP amount, or AFIP. + disabled = ( + amount(inputs, "dla_sc", year) > 0 + or amount(inputs, "pip_dl", year) > 0 + or afip(inputs) ) weekly = premiums[benunit(f"c{i}")] / WEEKS_IN_YEAR enhanced_weekly = weekly - p.disabled_child * disabled @@ -291,3 +402,56 @@ def test_couple_rate_never_exceeds_two_single_rates(): for year in range(2015, 2031): p = system.parameters(year).gov.dwp.disability_premia assert p.enhanced_couple <= 2 * p.enhanced_single, year + + +class NeutraliseDlaCareAndPipDailyLiving(Reform): + def apply(self): + self.neutralize_variable("dla_sc") + self.neutralize_variable("pip_dl") + + +def test_neutralised_awards_pay_no_enhanced_premium(): + """A reform that neutralises DLA care and PIP daily living leaves their + categories in place but sets both amounts to zero, so no award remains: + neither premium nor the child's enhanced rate is paid.""" + year = 2026 + people = dict( + dla=dict(age=30, dla_sc_category="HIGHER"), + pip=dict(age=30, pip_dl_category="ENHANCED"), + parent=dict(age=35), + child=dict(age=10, dla_sc_category="HIGHER"), + ) + groups = dict(dla=["dla"], pip=["pip"], family=["parent", "child"]) + situation = dict( + people={name: every_year(inputs) for name, inputs in people.items()}, + benunits={name: {"members": members} for name, members in groups.items()}, + households={ + name: dict(members=members, **household_inputs("ENGLAND", "MERTON")) + for name, members in groups.items() + }, + ) + p = system.parameters(year).gov.dwp + single_annual = p.disability_premia.enhanced_single * WEEKS_IN_YEAR + child_annual = ( + p.housing_benefit.premiums.disabled_child + + p.housing_benefit.premiums.enhanced_disabled_child + ) * WEEKS_IN_YEAR + for reform, adult_premium, child_premium, flag in ( + (None, single_annual, child_annual, True), + (NeutraliseDlaCareAndPipDailyLiving, 0, 0, False), + ): + sim = Simulation(situation=situation, reform=reform) + assert sim.calculate( + "receives_enhanced_disability_premium_qualifying_benefit", year + ).tolist() == [flag, flag, False, flag] + for variable in ( + "enhanced_disability_premium", + "council_tax_reduction_enhanced_disability_premium", + ): + assert np.allclose( + sim.calculate(variable, year), [adult_premium, adult_premium, 0] + ), (reform, variable) + assert np.allclose( + sim.calculate("housing_benefit_child_disability_premiums", year), + [0, 0, child_premium], + ), reform From 69a99fa1dbbe1be086c3023a8478810b49e68aa6 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 02:59:35 -0500 Subject: [PATCH 09/43] Describe the award rule and council lists in the changelog and parameters Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../disability_premia/top_rate_amount_tolerance.yaml | 4 +--- .../enhanced_disability_premium/age_limit_applies.yaml | 10 +++++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index c4186c02fe..504e28ac8c 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Paid the legacy enhanced disability premium for enhanced PIP daily living and armed forces independence payment as well as the highest DLA care rate, applied its State Pension Credit age limit, and gave working-age Council Tax Reduction in Scotland its own conditions (attendance allowance from April 2023, no age limit from June 2022). +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive; an amount entered without its category counts when it comes within £1 a week of the top rate. Give four working-age Council Tax Reduction schemes their own lists. Scotland adds attendance allowance from April 2023 and drops the age limit from June 2022. Merton and Kingston upon Thames count PIP daily living at either rate and no armed forces independence payment, and Newham counts PIP daily living at either rate and armed forces independence payment. diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml index 4e7f51532d..bf52b396c3 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml @@ -1,6 +1,4 @@ -description: The model counts a disability living allowance care amount or a personal independence payment daily living amount entered without its award category as a top-rate award for the enhanced disability premium when the amount reaches the top weekly rate less this tolerance, times 52. policyengine-uk-data allows the same £1 a week when it derives award categories from reported weekly amounts. -values: - 2015-01-01: 1 +description: The model counts a DLA care or PIP daily living amount entered without its award category as a top-rate award for the enhanced disability premium when the amount reaches the top weekly rate less this tolerance, times 52. policyengine-uk-data allows the same £1 a week when it derives award categories from reported weekly amounts. metadata: period: week unit: currency-GBP diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml index e3dd616012..ae81518926 100644 --- a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/age_limit_applies.yaml @@ -3,11 +3,11 @@ description: > in a working-age Council Tax Reduction applicable amount only for an applicant or partner under the qualifying age for State Pension Credit. The Scottish Ministers set this limit in the 2012 scheme, which ran until 31 - March 2022, and set a limit at pensionable age in the 2021 scheme, which the - model reads as the same qualifying age (the two have agreed for everyone - since 2019-20). The Scottish Ministers removed the limit from 20 June 2022 - (S.S.I. 2022/161). The model reads this as at 30 April of each year from - 2015, so it applies the limit in 2022 and not from 2023. + March 2022. In the 2021 scheme they set the limit at pensionable age, which + the model reads as the same qualifying age (the two have agreed for everyone + since 2019-20), and from 20 June 2022 they removed it (S.S.I. 2022/161). The + model reads this as at 30 April of each year from 2015, so it applies the + limit in 2022 and not from 2023. metadata: label: Scottish working-age Council Tax Reduction enhanced disability premium age limit applies period: year From fdc798b3125987f0732e1fcaa1ad752f759b533f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 03:27:11 -0500 Subject: [PATCH 10/43] Restore the tolerance parameter's value Co-Authored-By: Claude Opus 5.5 --- .../gov/dwp/disability_premia/top_rate_amount_tolerance.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml index bf52b396c3..cbf2a21735 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml @@ -1,4 +1,6 @@ description: The model counts a DLA care or PIP daily living amount entered without its award category as a top-rate award for the enhanced disability premium when the amount reaches the top weekly rate less this tolerance, times 52. policyengine-uk-data allows the same £1 a week when it derives award categories from reported weekly amounts. +values: + 2015-01-01: 1 metadata: period: week unit: currency-GBP From 3e79f60250a5627b6d31b9d8a17bba1440c19388 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 04:16:48 -0500 Subject: [PATCH 11/43] Supply every generated person's DLA care and PIP daily living amounts A situation that supplies an amount for one person supplies zero for everyone else, so the oracle's per-person category rate did not hold once any person in the example entered an amount. Co-Authored-By: Claude Opus 5.5 --- ..._enhanced_disability_premium_properties.py | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 32d0dfbfbb..e8f58d4483 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -27,7 +27,8 @@ one, at adult ages from 20 to 85, each holding up to two awards drawn from DLA care and PIP daily living categories, amounts entered without a category, categories with an explicit amount (zero or part of the rate), attendance -allowance and AFIP: +allowance and AFIP. Each person gets explicit DLA care and PIP daily living +amounts: the amount the award enters, or the rate for its category: 1. Oracle: enhanced_disability_premium equals the amount the law gives, computed here from the award inputs and the parameter rates, and @@ -225,6 +226,19 @@ def every_year(inputs): return {k: {year: v for year in YEARS} for k, v in inputs.items()} +def person_inputs(age, awards, **extra): + """A person's inputs for every year. A situation that supplies an amount + for one person supplies the default, zero, for everyone else, as it does + for categories (utils/pip.py). So every person gets both amounts: the + amount entered, or the rate for the award category, which the amount + formulas would give.""" + inputs = award_inputs(awards) + person = every_year(dict(age=age, **extra, **inputs)) + for benefit in ("dla_sc", "pip_dl"): + person[benefit] = {year: amount(inputs, benefit, year) for year in YEARS} + return person + + def household_inputs(country, council): inputs = dict(country=country) if council is not None: @@ -241,21 +255,20 @@ def build(families, children): members = [] for j, a in enumerate(adults_of(f)): name = f"f{i}_adult{j}" - inputs = dict( - age=a["age"], is_claimant_or_partner=True, **award_inputs(a["awards"]) + people[name] = person_inputs( + a["age"], a["awards"], is_claimant_or_partner=True ) - people[name] = every_year(inputs) members.append(name) if f["shape"] == "lone_parent": name = f"f{i}_child" - people[name] = every_year(dict(age=8, is_claimant_or_partner=False)) + people[name] = person_inputs(8, (), is_claimant_or_partner=False) members.append(name) benunits[f"f{i}"] = {"members": members} households[f"f{i}"] = dict(members=members, **household_inputs(*f["place"])) for i, c in enumerate(children): members = [f"c{i}_parent", f"c{i}_child"] - people[members[0]] = every_year(dict(age=35)) - people[members[1]] = every_year(dict(age=c["age"], **award_inputs(c["awards"]))) + people[members[0]] = person_inputs(35, ()) + people[members[1]] = person_inputs(c["age"], c["awards"]) benunits[f"c{i}"] = {"members": members} households[f"c{i}"] = dict( members=members, **household_inputs(c["country"], None) From 199e5ec8a3c33a2c29ae12e4f987635106c5444e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 05:03:46 -0500 Subject: [PATCH 12/43] Name who acts in the enhanced premium docstrings and cite the NI age rules Co-Authored-By: Claude Opus 5.5 --- ...disabled_claimants_or_partners_for_legacy_benefits.py | 9 +++++---- .../household/demographic/enhanced_disability_premium.py | 6 +++--- .../demographic/is_enhanced_disabled_for_benefits.py | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py index 489820c233..77b482f038 100644 --- a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py +++ b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py @@ -14,10 +14,11 @@ class num_enhanced_disabled_claimants_or_partners_for_legacy_benefits(Variable): "England's Default Scheme limit both the claimant and their family or " "partner by age. Income Support and Employment and Support Allowance " "name only the partner, as their claimants must be under that age " - "(SSCBA 1992 s.124(1)(aa); WRA 2007 s.1(3)(c), pensionable age). " - "This count excludes children and " - "young persons, whose separate enhanced premium is modelled for " - "Housing Benefit only (housing_benefit_child_disability_premiums)." + "(SSCBA 1992 s.124(1)(aa) and SSCBA (NI) 1992 s.123(1)(aa); WRA 2007 " + "s.1(3)(c) and WRA (NI) 2007 s.1(3)(c), pensionable age). This count " + "excludes children and young persons, whose separate enhanced premium " + "the model computes for Housing Benefit only " + "(housing_benefit_child_disability_premiums)." ) definition_period = YEAR reference = ( diff --git a/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py b/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py index 98f8b88ee9..861be480b0 100644 --- a/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py @@ -12,9 +12,9 @@ class enhanced_disability_premium(Variable): "(num_enhanced_disabled_claimants_or_partners_for_legacy_benefits). " "Housing Benefit, Income Support and Council Tax Reduction read it; " "Council Tax Reduction substitutes its own scheme's condition " - "(council_tax_reduction_enhanced_disability_premium). The separate " - "Housing Benefit enhanced rate for children and young persons is " - "housing_benefit_child_disability_premiums." + "(council_tax_reduction_enhanced_disability_premium). " + "housing_benefit_child_disability_premiums holds Housing Benefit's " + "separate enhanced rate for children and young persons." ) definition_period = YEAR reference = ( diff --git a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py index 4708982d67..a9518abbe7 100644 --- a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py +++ b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py @@ -8,8 +8,8 @@ class is_enhanced_disabled_for_benefits(Variable): documentation = ( "Deprecated: no premium reads it. The enhanced disability premium " "reads receives_enhanced_disability_premium_qualifying_benefit, which " - "this returns, and applies each programme's own conditions. It is " - "kept for downstream compatibility and for the deprecated counts " + "this returns, and applies each programme's own conditions. The model " + "keeps it for downstream compatibility and for the deprecated counts " "num_enhanced_disabled_adults and num_enhanced_disabled_children. The " "Enhanced FRS stores its own value of this flag, which replaces this " "formula in dataset runs: reported attendance allowance, disability " From 3e84df795677e1d4897f77bccd0b5e8015c4602f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 05:48:54 -0500 Subject: [PATCH 13/43] Name the councils' lists in the changelog Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 504e28ac8c..aee20cfc55 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive; an amount entered without its category counts when it comes within £1 a week of the top rate. Give four working-age Council Tax Reduction schemes their own lists. Scotland adds attendance allowance from April 2023 and drops the age limit from June 2022. Merton and Kingston upon Thames count PIP daily living at either rate and no armed forces independence payment, and Newham counts PIP daily living at either rate and armed forces independence payment. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive; an amount entered without its category counts when it comes within £1 a week of the top rate. Give four working-age Council Tax Reduction schemes their own lists. Scotland's adds attendance allowance from April 2023 and drops the age limit from June 2022. Merton's and Kingston upon Thames's count PIP daily living at either rate and no armed forces independence payment, and Newham's counts PIP daily living at either rate and armed forces independence payment. From 7c42ca70fb37935898b265aa2828017db8e1ea41 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 05:49:56 -0500 Subject: [PATCH 14/43] Drop the label opener from the deprecated flag's docstring Co-Authored-By: Claude Opus 5.5 --- .../household/demographic/is_enhanced_disabled_for_benefits.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py index a9518abbe7..8e35131278 100644 --- a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py +++ b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py @@ -6,7 +6,7 @@ class is_enhanced_disabled_for_benefits(Variable): entity = Person label = "Receives an enhanced disability premium qualifying benefit (deprecated)" documentation = ( - "Deprecated: no premium reads it. The enhanced disability premium " + "No premium reads this deprecated flag. The enhanced disability premium " "reads receives_enhanced_disability_premium_qualifying_benefit, which " "this returns, and applies each programme's own conditions. The model " "keeps it for downstream compatibility and for the deprecated counts " From 28b0905640d60aba5bf9d4b93a424ec6b4ce59bf Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 10:02:13 -0500 Subject: [PATCH 15/43] Name who acts in the enhanced premium's documentation and test comments Give the qualifying verbs to claimants, councils and the Scottish Ministers in the parameter descriptions, docstrings, changelog and test comments, state the stored flag's exact DLA boundary, and qualify Kingston upon Thames's printed amounts with its adopted uprating mechanism. No executable code or parameter value changes: ASTs without docstrings and parameter YAML without descriptions and references match 7c42ca70f. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../enhanced_qualifying_benefits.yaml | 31 ++-- ..._qualifying_benefits_northern_ireland.yaml | 23 ++- .../top_rate_amount_tolerance.yaml | 2 +- .../qualifying_benefits.yaml | 16 +- .../qualifying_benefits.yaml | 16 +- .../qualifying_benefits.yaml | 19 +- .../qualifying_benefits.yaml | 22 +-- .../gov/dwp/enhanced_disability_premium.yaml | 60 ++++--- .../applicant_or_partner.yaml | 6 +- .../enhanced_disability_premium.yaml | 61 ++++--- ...evere_disability_premium_young_person.yaml | 2 +- ...ncil_tax_reduction_applicant_properties.py | 5 +- ..._enhanced_disability_premium_properties.py | 170 +++++++++--------- .../gov/dwp/dla/has_highest_dla_sc_award.py | 19 +- ...using_benefit_child_disability_premiums.py | 23 +-- ...aimants_or_partners_for_legacy_benefits.py | 27 +-- .../gov/dwp/pip/has_enhanced_pip_dl_award.py | 17 +- ...x_reduction_enhanced_disability_premium.py | 26 ++- ...n_enhanced_disability_premium_condition.py | 34 ++-- .../enhanced_disability_premium.py | 13 +- .../is_enhanced_disabled_for_benefits.py | 13 +- ...d_disability_premium_qualifying_benefit.py | 28 +-- 23 files changed, 332 insertions(+), 303 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index aee20cfc55..d7a42fcbe2 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive; an amount entered without its category counts when it comes within £1 a week of the top rate. Give four working-age Council Tax Reduction schemes their own lists. Scotland's adds attendance allowance from April 2023 and drops the age limit from June 2022. Merton's and Kingston upon Thames's count PIP daily living at either rate and no armed forces independence payment, and Newham's counts PIP daily living at either rate and armed forces independence payment. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches 52 times the top weekly rate less £1. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml index 59933891b9..2b27fd8483 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits.yaml @@ -1,19 +1,20 @@ description: > - Awards that meet the qualifying-benefit condition of the legacy enhanced - disability premium for a claimant or partner in Great Britain: the care - component of disability living allowance at the highest rate - (has_highest_dla_sc_award), the daily living component of personal - independence payment at the enhanced rate (has_enhanced_pip_dl_award) and - armed forces independence payment. Each programme adds its own conditions, - such as the age limit. The Regulations also name the Scottish equivalents - (the care components of child disability payment and Scottish adult - disability living allowance at the highest rate, and the daily living - component of adult disability payment at the enhanced rate); the model has - no separate variables for them. From 8 April 2013, S.I. 2013/388 added the - PIP daily living component and S.I. 2013/591 added armed forces independence - payment. The enhanced_qualifying_benefits_northern_ireland parameter holds - Northern Ireland's list. The model reads the list as at 30 April of each - year from 2015 and does not prorate a change made during a year. + Claimants and partners in Great Britain qualify for the legacy enhanced + disability premium through the care component of disability living allowance + at the highest rate (has_highest_dla_sc_award), the daily living component + of personal independence payment at the enhanced rate + (has_enhanced_pip_dl_award) and armed forces independence payment. The model + applies each programme's further conditions, such as the age limit, + elsewhere. Claimants also qualify through the Scottish equivalents (the care + components of child disability payment and Scottish adult disability living + allowance at the highest rate, and the daily living component of adult + disability payment at the enhanced rate), for which the model has no + separate variables. Claimants qualify through the PIP daily living component + from 8 April 2013 under S.I. 2013/388, and through armed forces independence + payment from the same date under S.I. 2013/591. The + enhanced_qualifying_benefits_northern_ireland parameter holds Northern + Ireland's list. The model reads the list as at 30 April of each year from + 2015 and does not prorate a change made during a year. metadata: label: Legacy benefit enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml index dce7b2c155..9b6b7b4338 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/enhanced_qualifying_benefits_northern_ireland.yaml @@ -1,16 +1,15 @@ description: > - Awards that meet the qualifying-benefit condition of the legacy enhanced - disability premium for a claimant or partner in Northern Ireland. The care - component of disability living allowance at the highest rate qualifies. S.I. - 2013/3021 added armed forces independence payment from 24 December 2013, and - S.R. 2016/228 added the daily living component of personal independence - payment at the enhanced rate from 20 June 2016, to the Northern Ireland - Income Support, Jobseeker's Allowance, Housing Benefit and Employment and - Support Allowance regulations. The model reads the list as at 30 April of - each year from 2015 and does not prorate a change made during a year, so it - adds the daily living component from 2017. The first value's date follows - the Great Britain list rather than the commencement of S.R. 2006/405 on 20 - November 2006. + Claimants and partners in Northern Ireland qualify for the legacy enhanced + disability premium through the care component of disability living allowance + at the highest rate. In Income Support, Jobseeker's Allowance, Housing + Benefit and Employment and Support Allowance, they also qualify through + armed forces independence payment from 24 December 2013 under S.I. + 2013/3021, and through the daily living component of personal independence + payment at the enhanced rate from 20 June 2016 under S.R. 2016/228. The + model reads the list as at 30 April of each year from 2015 and does not + prorate a change made during a year, so it counts the daily living component + from 2017. The model dates the first value from the Great Britain list's + start, not from the commencement of S.R. 2006/405 on 20 November 2006. metadata: label: Northern Ireland legacy benefit enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml index cbf2a21735..27e3a36feb 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml @@ -1,4 +1,4 @@ -description: The model counts a DLA care or PIP daily living amount entered without its award category as a top-rate award for the enhanced disability premium when the amount reaches the top weekly rate less this tolerance, times 52. policyengine-uk-data allows the same £1 a week when it derives award categories from reported weekly amounts. +description: The model counts a DLA care or PIP daily living amount as a top-rate award for the enhanced disability premium when the amount reaches 52 times the top weekly rate less this tolerance. policyengine-uk-data uses the same weekly tolerance when it derives award categories from reported amounts. values: 2015-01-01: 1 metadata: diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index c682aff0c2..3d8d1e264f 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -1,12 +1,12 @@ description: > - Awards to the applicant or a member of the applicant's family that meet the - enhanced disability premium condition of Kingston upon Thames's working-age - Council Tax Reduction scheme: the care component of disability living - allowance at the highest rate and the daily living component of personal - independence payment at either rate. The scheme names no armed forces - independence payment. Each award counts only for a person under the - qualifying age for State Pension Credit. The model reads the list as at 30 - April of each year and backdates it to 2015. + The Royal Borough of Kingston upon Thames counts the care component of + disability living allowance at the highest rate and the daily living + component of personal independence payment at either rate, for the applicant + or a member of the applicant's family, toward the enhanced disability + premium in its working-age Council Tax Reduction scheme. It omits armed + forces independence payment, and counts each award only for a person under + the qualifying age for State Pension Credit. The model reads the list as at + 30 April of each year and backdates it to 2015. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 4e60fcc785..c53e021a33 100644 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -1,12 +1,12 @@ description: > - Awards to the applicant or a member of the applicant's family that meet the - enhanced disability premium condition of Merton's working-age Council Tax - Support scheme: the care component of disability living allowance at the - highest rate and the daily living component of personal independence - payment at either rate. The scheme names no armed forces independence - payment. Each award counts only for a person under the qualifying age for - State Pension Credit. The model reads the list as at 30 April of each year - and backdates it to 2015. + The London Borough of Merton counts the care component of disability living + allowance at the highest rate and the daily living component of personal + independence payment at either rate, for the applicant or a member of the + applicant's family, toward the enhanced disability premium in its + working-age Council Tax Support scheme. It omits armed forces independence + payment, and counts each award only for a person under the qualifying age + for State Pension Credit. The model reads the list as at 30 April of each + year and backdates it to 2015. metadata: label: Merton Council Tax Support enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 8adfbf13bf..2de00fc306 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -1,13 +1,14 @@ description: > - Awards to the applicant or a member of the applicant's family that meet the - enhanced disability premium condition of Newham's working-age Council Tax - Reduction scheme: the care component of disability living allowance at the - highest rate, the daily living component of personal independence payment - at either rate and armed forces independence payment. Each award counts - only for a person under the qualifying age for State Pension Credit. The - scheme also names the care component of child disability payment at the - highest rate, for which the model has no separate variable. The model reads - the list as at 30 April of each year and backdates it to 2015. + The London Borough of Newham counts the care component of disability living + allowance at the highest rate, the daily living component of personal + independence payment at either rate and armed forces independence payment, + for the applicant or a member of the applicant's family, toward the enhanced + disability premium in its working-age Council Tax Reduction scheme. It + counts each award only for a person under the qualifying age for State + Pension Credit. It also counts the care component of child disability + payment at the highest rate, for which the model has no separate variable. + The model reads the list as at 30 April of each year and backdates it to + 2015. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml index 1ff65e80b5..f1ed21c9ef 100644 --- a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/working_age/enhanced_disability_premium/qualifying_benefits.yaml @@ -1,15 +1,15 @@ description: > - Awards to the applicant or partner that meet the enhanced disability premium - condition of Scotland's working-age Council Tax Reduction scheme: the care - component of disability living allowance at the highest rate, the daily - living component of personal independence payment at the enhanced rate, - armed forces independence payment and, from 1 April 2023, attendance - allowance at either rate (S.S.I. 2023/38). The scheme also names Scottish - benefits (child disability payment, adult disability payment, pension age - disability payment and Scottish adult disability living allowance), for - which the model has no separate variables. S.S.I. 2013/142 added armed - forces independence payment to the 2012 scheme from 11 June 2013. The model - reads the list as at 30 April of each year from 2015. + Scottish councils count the care component of disability living allowance at + the highest rate, the daily living component of personal independence + payment at the enhanced rate, armed forces independence payment and, from 1 + April 2023, attendance allowance at either rate (S.S.I. 2023/38), for the + applicant or partner, toward the enhanced disability premium in working-age + Council Tax Reduction. Scottish councils also count Scottish benefits (child + disability payment, adult disability payment, pension age disability payment + and Scottish adult disability living allowance), for which the model has no + separate variables. Applicants and family members qualify through armed + forces independence payment from 11 June 2013 under S.S.I. 2013/142. The + model reads the list as at 30 April of each year from 2015. metadata: label: Scottish working-age Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml index 701ea25185..cf4ce2947c 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml @@ -4,12 +4,12 @@ # para 15A(1), (1ZA); HB Regs (NI) 2006 Sch 4 para 15(1)(aa)-(c). # Amounts (HB Regs 2006 Sch 3 Part 4, enhanced disability premium row (9), # 2026-27): £22.00 for a person who is not a member of a couple, £31.40 where -# the condition is met in respect of a member of a couple. +# a member of a couple meets the condition. # 2026-27 weekly rates: DLA care highest £114.60, middle £76.70; PIP daily # living enhanced £114.60, standard £76.70 (gov.dwp parameters). -# An award needs a positive amount. An amount entered without its category -# counts at the top rate when it reaches the top weekly rate less £1, times -# 52: (114.60 - 1) * 52 = 5,907.20 in 2026-27. +# The model counts an award only with a positive amount, and counts an amount +# entered without its category at the top rate when it reaches 52 times the +# top weekly rate less £1: (114.60 - 1) * 52 = 5,907.20 in 2026-27. - name: Case 1, enhanced PIP daily living qualifies a single claimant. period: 2026 @@ -62,7 +62,8 @@ members: [person1] country: ENGLAND output: - # 76.70 * 52 = 3,988.40; para 15(1)(c) needs the enhanced rate. + # 76.70 * 52 = 3,988.40; claimants qualify under para 15(1)(c) only at + # the enhanced rate. pip_dl: 3_988.40 receives_enhanced_disability_premium_qualifying_benefit: false enhanced_disability_premium: 0 @@ -80,7 +81,8 @@ members: [person1] country: ENGLAND output: - # 76.70 * 52 = 3,988.40; para 15(1)(b) needs the highest rate. + # 76.70 * 52 = 3,988.40; claimants qualify under para 15(1)(b) only at + # the highest rate. dla_sc: 3_988.40 receives_enhanced_disability_premium_qualifying_benefit: false enhanced_disability_premium: 0 @@ -115,8 +117,8 @@ members: [person1] country: ENGLAND output: - # None of HB para 15(1), IS para 13A(1ZA), ESA para 7(1) or JSA para - # 15A(1ZA) names attendance allowance. + # Claimants do not qualify through attendance allowance under HB para + # 15(1), IS para 13A(1ZA), ESA para 7(1) or JSA para 15A(1ZA). receives_enhanced_disability_premium_qualifying_benefit: false enhanced_disability_premium: 0 @@ -183,9 +185,10 @@ country: ENGLAND output: num_enhanced_disabled_claimants_or_partners_for_legacy_benefits: 2 - # Row (9)(c) pays £31.40 "where the claimant is a member of a couple and - # the conditions ... are satisfied in respect of a member of that - # couple": 31.40 * 52 = 1,632.80, not two single rates (2 * 1,144.00). + # Housing Benefit pays £31.40 under row (9)(c) "where the claimant is a + # member of a couple and the conditions ... are satisfied in respect of a + # member of that couple": 31.40 * 52 = 1,632.80, not two single rates + # (2 * 1,144.00). enhanced_disability_premium: 1_632.80 - name: Case 10, a couple whose only qualifying member is over the qualifying age gets no premium. @@ -249,8 +252,9 @@ members: [person1] country: NORTHERN_IRELAND output: - # S.R. 2016/228 added the PIP limb from 20 June 2016; the model reads the - # list at 30 April, so 2016 has no PIP limb in Northern Ireland. + # Claimants in Northern Ireland qualify through PIP from 20 June 2016 + # under S.R. 2016/228; the model reads the list at 30 April, so it counts + # no PIP in Northern Ireland in 2016. receives_enhanced_disability_premium_qualifying_benefit: false enhanced_disability_premium: 0 @@ -284,8 +288,8 @@ members: [person1] country: NORTHERN_IRELAND output: - # S.I. 2013/3021 added the AFIP limb from 24 December 2013. 2016-17 - # single rate £15.75: 15.75 * 52 = 819.00. + # Claimants in Northern Ireland qualify through AFIP from 24 December 2013 + # under S.I. 2013/3021. 2016-17 single rate £15.75: 15.75 * 52 = 819.00. receives_enhanced_disability_premium_qualifying_benefit: true enhanced_disability_premium: 819 @@ -302,7 +306,8 @@ members: [person1] country: WALES output: - # S.I. 2013/388 added the PIP limb from 8 April 2013. + # Claimants in Great Britain qualify through PIP from 8 April 2013 under + # S.I. 2013/388. receives_enhanced_disability_premium_qualifying_benefit: true enhanced_disability_premium: 819 @@ -321,10 +326,10 @@ output: housing_benefit_pension_age_regulations_apply: false enhanced_disability_premium: 1_144 - # Enhanced PIP daily living is also on the severe disability premium - # list (gov.dwp.disability_premia.severe_qualifying_benefits); the - # claimant lives alone and no one is paid a carer benefit for them: - # 86.05 * 52 = 4,474.60. + # The severe disability premium list + # (gov.dwp.disability_premia.severe_qualifying_benefits) also includes + # enhanced PIP daily living; the claimant lives alone and nobody receives + # a carer benefit for caring for them: 86.05 * 52 = 4,474.60. severe_disability_premium: 4_474.60 # 1,144.00 + 4,474.60 = 5,618.60. benefits_premiums: 5_618.60 @@ -349,10 +354,11 @@ country: ENGLAND output: is_couple: true - # Income-based Jobseeker's Allowance keeps the claim in the working-age - # regulations (housing_benefit_pension_age_regulations_apply), whose - # para 15(1)(b) excludes a family member who has attained the - # qualifying age. + # Because the couple receives income-based Jobseeker's Allowance, the + # model applies the working-age regulations + # (housing_benefit_pension_age_regulations_apply), under whose para + # 15(1)(b) a family member who has attained the qualifying age does not + # qualify. housing_benefit_pension_age_regulations_apply: false enhanced_disability_premium: 0 # Only one partner receives a severe disability premium qualifying @@ -498,7 +504,8 @@ members: [person1] country: ENGLAND output: - # The category gives the rate; the positive amount gives the award. + # The model takes the rate from the category and the award from the + # positive amount. has_highest_dla_sc_award: true enhanced_disability_premium: 1_144 @@ -522,7 +529,8 @@ country: ENGLAND output: receives_enhanced_disability_premium_qualifying_benefit: [false, false] - # No DLA amount, so neither the disabled-child nor the enhanced rate. + # With no DLA amount, the model pays neither the disabled-child nor the + # enhanced rate. housing_benefit_child_disability_premiums: 0 - name: Case 27, a child with a highest-rate DLA care amount and no category gets both child premiums. diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml index 3af07343bd..88ff9f2404 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml @@ -222,9 +222,9 @@ savings: 0 output: # Disability (44.85) and severe disability (86.05) premiums at the single - # rate, and the enhanced disability premium (22.00), which Scotland's - # working-age scheme pays for attendance allowance from 1 April 2023 (SSI - # 2021/249 Sch 1 para 14(1)(g)): (44.85 + 86.05 + 22.00) * 52. The young + # rate, and the enhanced disability premium (22.00), which Scottish + # councils pay for attendance allowance from 1 April 2023 (SSI 2021/249 + # Sch 1 para 14(1)(g)): (44.85 + 86.05 + 22.00) * 52. The young # mother's disability does not give the grandmother a premium, and at 17 # neither parent is a non-dependant who bars the severe disability # premium. diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index c8cacc66d8..1579395488 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -1,18 +1,19 @@ # Enhanced disability premium in working-age Council Tax Reduction. -# Wales: CTR (Prescribed Requirements) (Wales) Regs 2013 Sch 7 para 12(1): -# DLA care highest, PIP daily living enhanced or AFIP, for an applicant or -# family member "who has not attained the qualifying age for state pension -# credit". Scotland: CTR (Scotland) Regs 2021 Sch 1 para 14(1): the same -# benefits for the applicant or partner with no age limit from 20 June 2022 -# (S.S.I. 2022/161), and attendance allowance at either rate from 1 April -# 2023 (para 14(1)(g), S.S.I. 2023/38). Merton's Local Council Tax Support -# Scheme Rules 2026 and Kingston upon Thames's Council Tax Reduction Scheme -# 2026 - 2027, Sch 3 para 12(1): DLA care highest and PIP daily living at -# either rate, with no AFIP. Newham's Council Tax Reduction Scheme 2026, Sch 3 -# para 12(1): DLA care highest, PIP daily living at either rate and AFIP. -# Each London scheme keeps the qualifying age for State Pension Credit as the -# age limit. Westminster keeps the Housing Benefit condition. The model reads -# each year's rules at 30 April. +# Welsh councils count DLA care highest, PIP daily living enhanced or AFIP, +# for an applicant or family member "who has not attained the qualifying age +# for state pension credit" (CTR (Prescribed Requirements) (Wales) Regs 2013 +# Sch 7 para 12(1)). Scottish councils count the same benefits for the +# applicant or partner (CTR (Scotland) Regs 2021 Sch 1 para 14(1)), with no +# age limit from 20 June 2022 (S.S.I. 2022/161), and attendance allowance at +# either rate from 1 April 2023 (para 14(1)(g), S.S.I. 2023/38). Merton and +# Kingston upon Thames count DLA care highest and PIP daily living at either +# rate and omit AFIP (Merton's Local Council Tax Support Scheme Rules 2026 and +# Kingston upon Thames's Council Tax Reduction Scheme 2026 - 2027, Sch 3 para +# 12(1)). Newham counts DLA care highest, PIP daily living at either rate and +# AFIP (Newham's Council Tax Reduction Scheme 2026, Sch 3 para 12(1)). The +# three London councils keep the qualifying age for State Pension Credit as +# the age limit. The model applies the Housing Benefit condition in +# Westminster and reads each year's rules at 30 April. # 2026-27 amounts: enhanced disability premium £22.00 single, £31.40 couple; # severe disability premium £86.05 single. @@ -51,7 +52,7 @@ local_authority: CITY_OF_EDINBURGH output: council_tax_reduction_pensioner: false - # The shared legacy premium does not count attendance allowance. + # The model's legacy premium does not count attendance allowance. enhanced_disability_premium: 0 # Para 14(1)(g): 22.00 * 52 = 1,144.00. meets_council_tax_reduction_enhanced_disability_premium_condition: true @@ -75,8 +76,8 @@ output: meets_council_tax_reduction_enhanced_disability_premium_condition: false council_tax_reduction_enhanced_disability_premium: 0 - # Only the severe disability premium, 2022-23 single rate £69.40: - # 69.40 * 52 = 3,608.80. + # The model pays only the severe disability premium, at the 2022-23 + # single rate £69.40: 69.40 * 52 = 3,608.80. council_tax_reduction_premiums: 3_608.80 - name: Case 4, Scottish working-age CTR pays the couple rate for an over-age partner from 2023. @@ -100,15 +101,16 @@ local_authority: CITY_OF_EDINBURGH output: is_couple: true - # Income-based Jobseeker's Allowance keeps the couple in the working-age - # scheme. + # Because the couple receives income-based Jobseeker's Allowance, the + # model applies the working-age scheme. council_tax_reduction_pensioner: false - # The shared legacy premium applies the age limit. + # The model's legacy premium applies the age limit. enhanced_disability_premium: 0 - # Para 14(1)(b) has no age limit: 31.40 * 52 = 1,632.80. + # Scottish councils apply no age limit under para 14(1)(b): 31.40 * 52 = + # 1,632.80. council_tax_reduction_enhanced_disability_premium: 1_632.80 - # No other premium: only one partner has a severe disability premium - # qualifying benefit. + # The model pays no other premium, because only one partner has a severe + # disability premium qualifying benefit. council_tax_reduction_premiums: 1_632.80 - name: Case 5, Scottish working-age CTR applied the age limit in 2022. @@ -268,12 +270,13 @@ council_tax: 1_800 savings: 0 output: - # Housing Benefit and Income Support still count AFIP (HB para 15(1)(d)). + # The model's legacy premium still counts AFIP for Housing Benefit and + # Income Support (HB para 15(1)(d)). enhanced_disability_premium: 1_144 - # Merton Sch 3 para 12(1) names no AFIP. + # Merton omits AFIP from Sch 3 para 12(1). meets_council_tax_reduction_enhanced_disability_premium_condition: false council_tax_reduction_enhanced_disability_premium: 0 - # AFIP is a severe disability premium qualifying benefit: 86.05 * 52 = + # AFIP counts toward the severe disability premium: 86.05 * 52 = # 4,474.60. council_tax_reduction_premiums: 4_474.60 # Personal allowance 95.55 * 52 = 4,968.60, plus 4,474.60: 9,443.20. @@ -376,7 +379,7 @@ output: meets_council_tax_reduction_enhanced_disability_premium_condition: [true, true, true, false] council_tax_reduction_enhanced_disability_premium: [1_144, 1_144, 1_144, 0] - # Housing Benefit needs the enhanced rate (HB para 15(1)(c)). + # Under HB para 15(1)(c), claimants qualify only at the enhanced rate. enhanced_disability_premium: [0, 0, 0, 0] - name: Case 12, the Merton and Newham schemes keep the age limit for an over-age partner. @@ -412,8 +415,8 @@ local_authority: NEWHAM output: is_couple: [true, true] - # Income-based Jobseeker's Allowance keeps each couple in the working-age - # scheme. + # Because each couple receives income-based Jobseeker's Allowance, the + # model applies the working-age scheme. council_tax_reduction_pensioner: [false, false] # Para 12(1)(c) and (p): "who has not attained the qualifying age for # state pension credit". diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml index c9b002f64a..0e6a2dcf5b 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/severe_disability_premium_young_person.yaml @@ -1,7 +1,7 @@ # SSI2021/249 regs6,8(2)(a),Sch1para13. Existing2026 model controls: # allowance95.55*52=4968.60; severe86.05*52=4474.60; withdrawal20%. # PIP qualifies SDP but generic disability flag is separately supplied/defaultfalse. -# Enhanced PIP daily living also gives the enhanced disability premium, +# Enhanced PIP daily living also qualifies for the enhanced disability premium, # 22.00*52=1144 (HB Regs 2006 Sch3 para15(1)(c); IS Regs 1987 Sch2 # para13A(1ZA)(c); SSI2021/249 Sch1 para14(1)(f)). # Pension12570:no tax; PIP disregarded; Child Benefit claim declined. diff --git a/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py b/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py index 55ba34fdfe..fe461a859e 100644 --- a/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py +++ b/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py @@ -76,9 +76,8 @@ # disability, the enhanced PIP daily living component (an enhanced disability # premium qualifying benefit), Attendance Allowance (a severe disability # premium qualifying benefit, which also exempts her from non-dependant -# deductions, and in Scotland's working-age scheme from 2023 an enhanced -# disability premium one), Carer's Allowance (the carer premium) and -# blindness. +# deductions, and an enhanced disability premium one for Scottish councils +# from 2023), Carer's Allowance (the carer premium) and blindness. head_circumstances = st.fixed_dictionaries( dict( is_disabled_for_benefits=st.booleans(), diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index e8f58d4483..a55beecd00 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -1,56 +1,54 @@ """Property-based tests for the legacy enhanced disability premium. -The premium's condition for a claimant or partner (HB Regs 2006 Sch 3 para -15(1)(b)-(d); IS Regs 1987 Sch 2 para 13A; HB Regs (NI) 2006 Sch 4 para 15): -an award of the highest-rate DLA care component, the enhanced-rate PIP daily -living component or armed forces independence payment, for a person who has -not attained the qualifying age for State Pension Credit. Northern Ireland -counts AFIP from 24 December 2013 and PIP from 20 June 2016, which the model -reads at 30 April, so from 2017. The single rate applies to a person who is -not a member of a couple, and one couple rate applies where the condition is -met in respect of either or both members (HB Regs 2006 Sch 3 Part 4). - -An award needs a positive amount of the benefit. Its rate comes from the -award category or, for an amount entered without its category, from the -amount: one that reaches the top weekly rate less £1, times 52, counts. - -Council Tax Reduction schemes name their own awards. Scotland's working-age -scheme (SSI 2021/249 Sch 1 para 14) adds attendance allowance at either rate -from 1 April 2023 and has no age limit from 20 June 2022, which the model -reads from 2023. Merton's and Kingston upon Thames's schemes (Sch 3 para 12) -count the PIP daily living component at either rate and no AFIP; Newham's -counts the PIP daily living component at either rate and AFIP. Wales, -Westminster and every other scheme take the Housing Benefit condition. - -Invariants, for the generated populations: single people, couples and lone -parents in each UK nation and in five English councils besides the default -one, at adult ages from 20 to 85, each holding up to two awards drawn from -DLA care and PIP daily living categories, amounts entered without a category, -categories with an explicit amount (zero or part of the rate), attendance -allowance and AFIP. Each person gets explicit DLA care and PIP daily living -amounts: the amount the award enters, or the rate for its category: - -1. Oracle: enhanced_disability_premium equals the amount the law gives, - computed here from the award inputs and the parameter rates, and - council_tax_reduction_enhanced_disability_premium equals the scheme's. -2. No qualifying award: a family in which no claimant or partner has a - qualifying award gets no premium. +A claimant or partner meets the premium's condition (HB Regs 2006 Sch 3 para +15(1)(b)-(d); IS Regs 1987 Sch 2 para 13A; HB Regs (NI) 2006 Sch 4 para 15) +with an award of the highest-rate DLA care component, the enhanced-rate PIP +daily living component or armed forces independence payment, while under the +qualifying age for State Pension Credit. Claimants in Northern Ireland qualify +through AFIP from 24 December 2013 and through PIP from 20 June 2016, which +the model reads at 30 April, so from 2017. Housing Benefit pays the single +rate to a person who is not a member of a couple, and one couple rate where +either or both members meet the condition (HB Regs 2006 Sch 3 Part 4). + +The model counts an award only with a positive amount of the benefit, and +takes its rate from the award category or from an amount that reaches 52 +times the top weekly rate less £1. + +Scottish councils count attendance allowance at either rate from 1 April 2023 +(SSI 2021/249 Sch 1 para 14), and the Scottish Ministers removed the age limit +from 20 June 2022, which the model reads from 2023. Merton and Kingston upon +Thames (Sch 3 para 12) count the PIP daily living component at either rate +and omit AFIP; Newham counts the PIP daily living component at either rate +and AFIP. The model applies the Housing Benefit condition in Wales, +Westminster and every other scheme. + +The test generates single people, couples and lone parents in the places and +age range below, with the listed awards. It supplies each person's entered +DLA care and PIP daily living amount, or computes an amount from their +category. It checks these invariants: + +1. Oracle: enhanced_disability_premium equals the statutory amount, which the + test computes from the award inputs and the parameter rates, and + council_tax_reduction_enhanced_disability_premium equals the amount under + the scheme's own list. +2. No qualifying award: the model pays no premium to a family in which no + claimant or partner has a qualifying award. 3. Monotone: giving a claimant or partner a qualifying benefit on top of their awards never lowers either premium. -4. Bounds: each premium is nil, the single rate or the couple rate, and never - exceeds two single rates; the couple rate never exceeds two single rates - in any year. +4. Bounds: each premium equals nil, the single rate or the couple rate, and + never exceeds two single rates; the couple rate never exceeds two single + rates in any year. 5. Each scheme against the legacy premium: the Council Tax Reduction premium equals the legacy premium in Wales, Northern Ireland and English councils - without their own list; in Scotland before 2023; never falls below it in - Scotland from 2023 or in Newham; and in Merton and Kingston upon Thames - never falls below it unless the legacy premium rests on AFIP alone, in - which case it is nil unless an under-age member has a PIP daily living - award. + without their own list, and in Scotland before 2023. It never falls below + the legacy premium in Scotland from 2023 or in Newham. In Merton and + Kingston upon Thames it never falls below the legacy premium unless that + premium rests on AFIP alone, and then the model pays none unless an + under-age member has a PIP daily living award. 6. Differential: for a child or young person in Great Britain, the qualifying - flag matches the oracle, and the enhanced rate in the Housing Benefit - child premiums (housing_benefit_child_disability_premiums) is paid - exactly when the flag holds. + flag matches the oracle. The model pays the child's enhanced rate in the + Housing Benefit child premiums (housing_benefit_child_disability_premiums) + when the flag holds and pays none when it does not. """ import numpy as np @@ -67,12 +65,12 @@ suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], ) WEEKS_IN_YEAR = 52 -# The weekly tolerance an amount entered without its category gets below the -# top rate (policyengine-uk-data's CATEGORY_THRESHOLD_WEEKLY_TOLERANCE). +# The test allows this weekly tolerance below the top rate +# (policyengine-uk-data's CATEGORY_THRESHOLD_WEEKLY_TOLERANCE). TOLERANCE = 1 -# Each example builds one simulation with inputs for every year here, so the -# Northern Ireland PIP date (2017) and the Scottish changes (2023) are on -# both sides of their boundaries in every example. +# Each example builds one simulation with inputs for every year here, so +# every example tests both sides of the Northern Ireland PIP date (2017) and +# the Scottish changes (2023). YEARS = [2016, 2017, 2022, 2023, 2026] # (country, local authority): None keeps the default local authority. PLACES = [ @@ -86,10 +84,10 @@ ("SCOTLAND", "CITY_OF_EDINBURGH"), ("NORTHERN_IRELAND", None), ] -# Award inputs for each kind of award a person can be drawn with. The amounts -# entered without a category clear (6,000) or miss (3,000) the top-rate -# threshold in every year here: (82.30 - 1) * 52 = 4,227.60 in 2016 and -# (114.60 - 1) * 52 = 5,907.20 in 2026. +# The generator assigns the award inputs below. The reported amounts of 6,000 +# and 3,000 respectively exceed and fall below each tested year's threshold: +# (82.30 - 1) * 52 = 4,227.60 in 2016 and (114.60 - 1) * 52 = 5,907.20 in +# 2026. AWARDS = { "dla_care_lowest": {"dla_sc_category": "LOWER"}, "dla_care_middle": {"dla_sc_category": "MIDDLE"}, @@ -117,8 +115,8 @@ def award_inputs(awards): - """Model inputs for a tuple of awards; a later award's input replaces an - earlier one's.""" + """Return the model inputs for a tuple of awards, letting a later award's + input replace an earlier one's.""" inputs = {} for award in awards: inputs.update(AWARDS[award]) @@ -126,8 +124,8 @@ def award_inputs(awards): def amount(inputs, benefit, year): - """The annual amount of DLA care (dla_sc) or PIP daily living (pip_dl): - the amount entered, or the rate for the award category.""" + """Return the entered annual amount of DLA care (dla_sc) or PIP daily + living (pip_dl), or compute it from the award category.""" if benefit in inputs: return inputs[benefit] dwp = system.parameters(year).gov.dwp @@ -139,9 +137,9 @@ def amount(inputs, benefit, year): def top_rate_award(inputs, benefit, year): - """An award at the highest DLA care or enhanced PIP daily living rate: a - positive amount, and the top category or an amount within the - tolerance of the top rate.""" + """Check for an award at the highest DLA care or enhanced PIP daily living + rate: a positive amount and either the top category or an amount within + the tolerance of the top rate.""" dwp = system.parameters(year).gov.dwp if benefit == "dla_sc": top_category, top_rate = "HIGHER", dwp.dla.self_care.higher @@ -159,7 +157,8 @@ def afip(inputs): def qualifies(inputs, country, year): - """The legacy premium's qualifying awards, from the Regulations.""" + """Check for the legacy premium's qualifying awards under the + Regulations.""" if top_rate_award(inputs, "dla_sc", year) or afip(inputs): return True if top_rate_award(inputs, "pip_dl", year): @@ -168,7 +167,7 @@ def qualifies(inputs, country, year): def qualifies_for_scheme(inputs, place, year): - """The scheme's own awards, before its age limit.""" + """Check for the scheme's own awards, before its age limit.""" country, council = place any_pip = amount(inputs, "pip_dl", year) > 0 dla_highest = top_rate_award(inputs, "dla_sc", year) @@ -214,8 +213,8 @@ def adults_of(f): def upgraded(f): - """The same family with one claimant or partner given a qualifying - benefit on top of their awards.""" + """Return the same family with one claimant or partner given a + qualifying benefit on top of their awards.""" adults = [dict(a) for a in f["adults"]] j = f["upgrade_member"] % len(adults_of(f)) adults[j]["awards"] = adults[j]["awards"] + (f["upgrade_award"],) @@ -227,11 +226,11 @@ def every_year(inputs): def person_inputs(age, awards, **extra): - """A person's inputs for every year. A situation that supplies an amount - for one person supplies the default, zero, for everyone else, as it does - for categories (utils/pip.py). So every person gets both amounts: the - amount entered, or the rate for the award category, which the amount - formulas would give.""" + """Return a person's inputs for every year. A situation that supplies an + amount for one person supplies the default, zero, for everyone else, as + it does for categories (utils/pip.py). So the test gives every person + both amounts: the amount entered, or the rate for the award category, + which the amount formulas would give.""" inputs = award_inputs(awards) person = every_year(dict(age=age, **extra, **inputs)) for benefit in ("dla_sc", "pip_dl"): @@ -247,9 +246,9 @@ def household_inputs(country, council): def build(families, children): - """One household and one benefit unit per family, and one per child with - a parent aged 35. Claimants and partners are marked as such, so no age - gap reads one as the other's child.""" + """Build one household and one benefit unit per family, and one per child + with a parent aged 35. The test marks claimants and partners as such, so + the model never reads an age gap as making one the other's child.""" people, benunits, households = {}, {}, {} for i, f in enumerate(families): members = [] @@ -282,9 +281,9 @@ def build(families, children): def oracle(f, year, attained): - """The two annual premiums from the law for one family. attained[j] is - whether adult j has attained the qualifying age for State Pension - Credit.""" + """Compute the two annual premiums under the law for one family. + attained[j] holds when adult j has attained the qualifying age for State + Pension Credit.""" p = system.parameters(year).gov.dwp.disability_premia rate = p.enhanced_couple if f["shape"] == "couple" else p.enhanced_single country = f["place"][0] @@ -301,7 +300,8 @@ def oracle(f, year, attained): def check_scheme_against_legacy(f, year, attained, edp, ctr): - """5. Each scheme's premium against the legacy premium.""" + """Check invariant 5: each scheme's premium against the legacy + premium.""" country, council = f["place"] if country == "SCOTLAND": if year < 2023: @@ -323,7 +323,7 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): if not rests_on_afip: assert ctr >= edp - 0.01 elif not any(amount(x, "pip_dl", year) > 0 for x in under_age): - # AFIP adds nothing to these schemes. + # These councils do not count AFIP. assert ctr == 0 else: assert np.isclose(ctr, edp, atol=0.01) @@ -365,8 +365,8 @@ def check_families(sim, person, benunit, families, year): ) assert annual <= 2 * single_annual + 0.01 check_scheme_against_legacy(f, year, member_attained, edp[b], ctr[b]) - # 3. Monotone: the second half are the first half's twins, each with a - # qualifying benefit added. + # 3. Monotone: the test pairs each family in the first half with its twin + # in the second half, which has a qualifying benefit added. assert all(t >= s - 0.01 for s, t in zip(family_edp[:n], family_edp[n:])) assert all(t >= s - 0.01 for s, t in zip(family_ctr[:n], family_ctr[n:])) @@ -385,7 +385,8 @@ def check_children(sim, person, benunit, children, year): continue inputs = award_inputs(c["awards"]) assert bool(qualifying[k]) == qualifies(inputs, c["country"], year), (c, year) - # The disabled child rate: a positive DLA or PIP amount, or AFIP. + # A child qualifies for the disabled child rate with a positive DLA or + # PIP amount, or AFIP. disabled = ( amount(inputs, "dla_sc", year) > 0 or amount(inputs, "pip_dl", year) > 0 @@ -425,8 +426,9 @@ def apply(self): def test_neutralised_awards_pay_no_enhanced_premium(): """A reform that neutralises DLA care and PIP daily living leaves their - categories in place but sets both amounts to zero, so no award remains: - neither premium nor the child's enhanced rate is paid.""" + categories in place but sets both amounts to zero, so no award remains. + The model then pays neither adult premium nor the child's disability + premiums.""" year = 2026 people = dict( dla=dict(age=30, dla_sc_category="HIGHER"), diff --git a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py index 3f5fe32917..26a286729a 100644 --- a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py +++ b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py @@ -4,16 +4,15 @@ class has_highest_dla_sc_award(Variable): label = "Has an award of the DLA care component at the highest rate" documentation = ( - "Whether the person has an award of the care component of disability " - "living allowance at the highest rate. An award needs a positive " - "amount (dla_sc), so an amount of zero, including one a reform sets " - "by neutralising dla_sc, is no award. The rate comes from the award " - "category (dla_sc_category) or from the amount: an amount entered " - "without its category counts when it reaches the highest weekly rate " - "less a tolerance (gov.dwp.disability_premia.top_rate_amount_" - "tolerance), times 52. The Regulations also count an award whose " - "payment stops while the person is in hospital; the model has no input " - "for that." + "The model counts an award of the care component of disability " + "living allowance at the highest rate when the person has a positive " + "amount (dla_sc) and either the highest-rate category " + "(dla_sc_category) or an amount that reaches 52 times the highest " + "weekly rate less a tolerance (gov.dwp.disability_premia.top_rate_" + "amount_tolerance). It rejects an amount of zero, including one that " + "a reform sets by neutralising dla_sc. Claimants also qualify while " + "the suspension or hospital rules stop or abate payment of the award " + "(HB Regs 2006 Sch 3 para 15(1)(b)); the model has no input for that." ) entity = Person definition_period = YEAR diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py index 33f4d68800..171979a8cb 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/housing_benefit_child_disability_premiums.py @@ -8,17 +8,18 @@ class housing_benefit_child_disability_premiums(Variable): unit = GBP label = "Housing Benefit child disability premiums" documentation = ( - "Disabled-child and enhanced-child premiums for legally dependent " - "children and young persons. The disabled-child rate needs a positive " - "DLA or PIP amount (either component), AFIP or the blindness " - "indicator. The enhanced rate needs an award that meets the adult " - "condition: the highest DLA care rate (has_highest_dla_sc_award), the " - "enhanced PIP daily living rate (has_enhanced_pip_dl_award) or AFIP. " - "The model has no separate fields for Scottish replacement awards, so " - "callers enter them in the DLA and PIP fields. The model omits " - "hospital suspension, the blindness run-on and bereavement " - "continuation, and a generic disability flag does not qualify. These " - "child amounts are separate from the shared adult premiums." + "The model pays the disabled-child and enhanced-child premiums for " + "legally dependent children and young persons. A child qualifies for " + "the disabled-child rate through a positive DLA or PIP amount (either " + "component), AFIP or the blindness indicator, and for the enhanced " + "rate through an award that meets the adult condition: the highest " + "DLA care rate (has_highest_dla_sc_award), the enhanced PIP daily " + "living rate (has_enhanced_pip_dl_award) or AFIP. The model has no " + "separate fields for Scottish replacement awards, so callers enter " + "them in the DLA and PIP fields. The model omits hospital suspension, " + "the blindness run-on and bereavement continuation, and a generic " + "disability flag does not qualify. The model computes these child " + "premiums separately from the adult premiums." ) reference = ( "https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15", diff --git a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py index 77b482f038..5a0fd69fb7 100644 --- a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py +++ b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py @@ -6,19 +6,20 @@ class num_enhanced_disabled_claimants_or_partners_for_legacy_benefits(Variable): entity = BenUnit label = "Enhanced-disabled claimants or partners for legacy benefits" documentation = ( - "Claimants and partners who meet the enhanced disability premium " - "condition: they receive a qualifying benefit (receives_enhanced_" - "disability_premium_qualifying_benefit) and have not attained the " - "qualifying age for State Pension Credit. Housing Benefit, " - "Jobseeker's Allowance, the Welsh Council Tax Reduction scheme and " - "England's Default Scheme limit both the claimant and their family or " - "partner by age. Income Support and Employment and Support Allowance " - "name only the partner, as their claimants must be under that age " - "(SSCBA 1992 s.124(1)(aa) and SSCBA (NI) 1992 s.123(1)(aa); WRA 2007 " - "s.1(3)(c) and WRA (NI) 2007 s.1(3)(c), pensionable age). This count " - "excludes children and young persons, whose separate enhanced premium " - "the model computes for Housing Benefit only " - "(housing_benefit_child_disability_premiums)." + "The model counts the claimants and partners who meet the enhanced " + "disability premium condition: they receive a qualifying benefit " + "(receives_enhanced_disability_premium_qualifying_benefit) and have " + "not attained the qualifying age for State Pension Credit. Under the " + "Housing Benefit and Jobseeker's Allowance Regulations, the Welsh " + "Council Tax Reduction scheme and England's Default Scheme, the age " + "limit applies to the claimant and to family members or partners. " + "Parliament limits Income Support and Employment and Support " + "Allowance to claimants under that age (SSCBA 1992 s.124(1)(aa) and " + "SSCBA (NI) 1992 s.123(1)(aa); WRA 2007 s.1(3)(c) and WRA (NI) 2007 " + "s.1(3)(c), pensionable age), so their Regulations state the age " + "limit only for the partner. The count leaves out children and young " + "persons, whose separate enhanced premium the model computes for " + "Housing Benefit only (housing_benefit_child_disability_premiums)." ) definition_period = YEAR reference = ( diff --git a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py index c17fa15d8f..1afec958d0 100644 --- a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py +++ b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py @@ -4,16 +4,15 @@ class has_enhanced_pip_dl_award(Variable): label = "Has an award of the PIP daily living component at the enhanced rate" documentation = ( - "Whether the person has an award of the daily living component of " - "personal independence payment at the enhanced rate. An award needs a " - "positive amount (pip_dl), so an amount of zero, including one a " - "reform sets by neutralising pip_dl, is no award. The rate comes from " - "the award category (pip_dl_category) or from the amount: an amount " - "entered without its category counts when it reaches the enhanced " + "The model counts an award of the daily living component of personal " + "independence payment at the enhanced rate when the person has a " + "positive amount (pip_dl) and either the enhanced-rate category " + "(pip_dl_category) or an amount that reaches 52 times the enhanced " "weekly rate less a tolerance (gov.dwp.disability_premia.top_rate_" - "amount_tolerance), times 52. The Regulations also count an award " - "whose payment stops while the person is in hospital; the model has no " - "input for that." + "amount_tolerance). It rejects an amount of zero, including one that " + "a reform sets by neutralising pip_dl. Claimants also qualify when the " + "hospital in-patient rules end payment of the award (HB Regs 2006 Sch " + "3 para 15(1)(c)); the model has no input for that." ) entity = Person definition_period = YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index 7c742ad3e2..bf0fd7e2fe 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -6,16 +6,24 @@ class council_tax_reduction_enhanced_disability_premium(Variable): entity = BenUnit label = "Working-age CTR enhanced disability premium" documentation = ( - "The enhanced disability premium in a working-age Council Tax " - "Reduction applicable amount: the single rate, or the couple rate " - "where either or both members of a couple meet the scheme's condition " + "The model includes the enhanced disability premium in a working-age " + "Council Tax Reduction applicable amount at the single rate, or at the " + "couple rate where either or both members of a couple meet the " + "scheme's condition " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " - "It differs from the legacy premium (enhanced_disability_premium) in " - "Scotland, Merton, Kingston upon Thames and Newham, whose schemes name " - "their own awards. The model pays the Housing Benefit amounts in every " - "scheme, though Kingston upon Thames's 2026-27 scheme sets lower ones " - "(£17.10 single, £24.50 couple). Pension-age Council Tax Reduction has " - "no adult enhanced disability premium." + "It pays a different premium from the legacy one " + "(enhanced_disability_premium) in Scotland, Merton, Kingston upon " + "Thames and Newham, where the councils count their own awards. The " + "model pays the Housing Benefit amounts in every scheme. Both 2026-27 " + "editions of Kingston upon Thames's scheme print £17.10 single and " + "£24.50 couple (Sch 3 para 17(5)). In 2014 the council adopted an " + "annual uprating mechanism (Annex 3), which takes working-age " + "premiums from the Government's and DWP's uprating documents where " + "the pension-age uprating omits them, and delegated each year's " + "uprating to its Director of Finance. The model follows that " + "mechanism, which gives the Housing Benefit amounts; we found no " + "decision that sets Kingston's own 2026-27 amounts. Pension-age " + "Council Tax Reduction includes no adult enhanced disability premium." ) definition_period = YEAR unit = GBP diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index a695f8568b..8b19a248f5 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -12,23 +12,25 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable entity = Person label = "Meets the working-age CTR enhanced disability premium condition" documentation = ( - "Whether this person, as an applicant or partner, meets the enhanced " - "disability premium condition of the working-age Council Tax " - "Reduction scheme that covers their household. Each scheme names its " - "own awards. Scotland's list adds attendance allowance at either rate " - "from 1 April 2023, and its age limit applies only until 20 June 2022. " - "Merton and Kingston upon Thames name the PIP daily living component " - "at either rate and no armed forces independence payment; Newham " - "names the PIP daily living component at either rate and armed forces " - "independence payment. Those three councils count an award only for a " - "person under the qualifying age for State Pension Credit. Every other " - "scheme takes the Housing Benefit condition " + "The model checks whether this person, as an applicant or partner, " + "meets the enhanced disability premium condition of the working-age " + "Council Tax Reduction scheme that covers their household. Scottish " + "councils count attendance allowance at either rate from 1 April " + "2023, and the Scottish Ministers removed the age limit from 20 June " + "2022. Merton and Kingston upon Thames count the PIP daily living " + "component at either rate and omit armed forces independence payment; " + "Newham counts the PIP daily living component at either rate and " + "armed forces independence payment. Those three councils count an " + "award only for a person under the qualifying age for State Pension " + "Credit. The model applies the Housing Benefit condition elsewhere " "(receives_enhanced_disability_premium_qualifying_benefit, under the " - "same age limit): the Welsh scheme states it, and the model keeps it " - "for Westminster, whose published scheme document summarises its " - "working-age scheme without the premium conditions. Oxford's " - "working-age award uses income bands, so the premium does not reach " - "it." + "same age limit). Welsh councils apply that condition under W.S.I. " + "2013/3029 Sch 7 para 12. Westminster City Council publishes a " + "2026-27 summary of its working-age scheme without the premium " + "conditions, so the model assumes the Housing Benefit condition there. " + "Oxford City Council sets " + "its working-age award from income bands, so the premium does not " + "reach it." ) definition_period = YEAR reference = ( diff --git a/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py b/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py index 861be480b0..aecfcfecff 100644 --- a/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py +++ b/policyengine_uk/variables/household/demographic/enhanced_disability_premium.py @@ -6,14 +6,15 @@ class enhanced_disability_premium(Variable): entity = BenUnit label = "Enhanced disability premium" documentation = ( - "Legacy benefit enhanced disability premium for the claimant or " - "partner: the single rate, or the couple rate where either or both " - "members of a couple meet the condition " + "The model pays the legacy benefit enhanced disability premium for " + "the claimant or partner at the single rate, or at the couple rate " + "where either or both members of a couple meet the condition " "(num_enhanced_disabled_claimants_or_partners_for_legacy_benefits). " - "Housing Benefit, Income Support and Council Tax Reduction read it; " - "Council Tax Reduction substitutes its own scheme's condition " + "The model's Housing Benefit, Income Support and Council Tax " + "Reduction applicable amounts read it, and Council Tax Reduction " + "replaces it with its own scheme's premium " "(council_tax_reduction_enhanced_disability_premium). " - "housing_benefit_child_disability_premiums holds Housing Benefit's " + "housing_benefit_child_disability_premiums computes Housing Benefit's " "separate enhanced rate for children and young persons." ) definition_period = YEAR diff --git a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py index 8e35131278..932af29201 100644 --- a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py +++ b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py @@ -10,11 +10,14 @@ class is_enhanced_disabled_for_benefits(Variable): "reads receives_enhanced_disability_premium_qualifying_benefit, which " "this returns, and applies each programme's own conditions. The model " "keeps it for downstream compatibility and for the deprecated counts " - "num_enhanced_disabled_adults and num_enhanced_disabled_children. The " - "Enhanced FRS stores its own value of this flag, which replaces this " - "formula in dataset runs: reported attendance allowance, disability " - "living allowance care or personal independence payment daily living " - "within £1 a week of its top rate." + "num_enhanced_disabled_adults and num_enhanced_disabled_children. " + "policyengine-uk-data stores its own value of this flag in the " + "Enhanced FRS, and the model uses that value in place of this formula " + "in dataset runs. The stored flag holds where reported attendance " + "allowance reaches the higher weekly rate less £1, reported disability " + "living allowance care exceeds the highest weekly rate less £1, or " + "reported personal independence payment daily living reaches the " + "enhanced weekly rate less £1." ) definition_period = YEAR diff --git a/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py b/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py index f6e0094a3e..e955416fbb 100644 --- a/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py +++ b/policyengine_uk/variables/household/demographic/receives_enhanced_disability_premium_qualifying_benefit.py @@ -6,17 +6,17 @@ class receives_enhanced_disability_premium_qualifying_benefit(Variable): entity = Person label = "Receives an enhanced disability premium qualifying benefit" documentation = ( - "Whether the person has an award that meets the qualifying-benefit " - "condition of the legacy enhanced disability premium: the care " - "component of disability living allowance at the highest rate " + "The model counts a person as receiving a qualifying benefit for the " + "legacy enhanced disability premium when they have an award of the " + "care component of disability living allowance at the highest rate " "(has_highest_dla_sc_award), the daily living component of personal " "independence payment at the enhanced rate (has_enhanced_pip_dl_award) " - "or armed forces independence payment. Each award needs a positive " - "amount, so an amount of zero is no award. The rate comes from the " - "award category or, for an amount entered without its category, from " - "the amount. Each programme adds its own conditions: the age limit " + "or armed forces independence payment. It counts only positive " + "amounts, and takes the rate from the award category or, for an " + "amount entered without its category, from the amount. The model " + "applies each programme's further conditions elsewhere: the age limit " "(num_enhanced_disabled_claimants_or_partners_for_legacy_benefits) " - "and, in Council Tax Reduction, its scheme's own list " + "and, in Council Tax Reduction, the scheme's own list " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " "Attendance allowance does not qualify. The model has no separate " "variables for the Scottish equivalents (the care components of child " @@ -25,11 +25,13 @@ class receives_enhanced_disability_premium_qualifying_benefit(Variable): "payment at the enhanced rate). It omits the limited capability for " "work-related activity limb (Housing Benefit), the support component " "limb (Employment and Support Allowance), the hospital rules and the " - "long-term patient exclusion. Household country selects the list: " - "Northern Ireland adds armed forces independence payment from 24 " - "December 2013 and PIP daily living from 20 June 2016; Great Britain " - "adds both from 8 April 2013. The model reads each list as at 30 April " - "of the year from 2015, without within-year proration." + "long-term patient exclusion. The model reads the Northern Ireland " + "list for households in Northern Ireland and the Great Britain list " + "elsewhere. Claimants in Northern Ireland qualify through armed forces " + "independence payment from 24 December 2013 and through PIP daily " + "living from 20 June 2016, and claimants in Great Britain through both " + "from 8 April 2013. The model reads each list as at 30 April of the " + "year from 2015, without within-year proration." ) definition_period = YEAR reference = ( From 92198f157811ea24603a031f63c0ac32b27a409f Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 10:36:08 -0500 Subject: [PATCH 16/43] Give the over-age parents' comment a real verb Co-Authored-By: Claude Opus 5.5 --- .../council_tax_reduction/applicant_or_partner.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml index 88ff9f2404..591fc4eb5b 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/applicant_or_partner.yaml @@ -226,7 +226,7 @@ # councils pay for attendance allowance from 1 April 2023 (SSI 2021/249 # Sch 1 para 14(1)(g)): (44.85 + 86.05 + 22.00) * 52. The young # mother's disability does not give the grandmother a premium, and at 17 - # neither parent is a non-dependant who bars the severe disability + # neither parent counts as a non-dependant who bars the severe disability # premium. council_tax_reduction_premiums: [7_950.80] # Single aged 25 or over, 95.55 * 52 = 4,968.60, plus the premiums. From d3a4cbac2fac5de7608f7cebd84729bea200b137 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 10:38:43 -0500 Subject: [PATCH 17/43] Give Kingston's uprating to the council in the CTR premium documentation Co-Authored-By: Claude Opus 5.5 --- .../council_tax_reduction_enhanced_disability_premium.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index bf0fd7e2fe..5988a15c65 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -17,7 +17,7 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "model pays the Housing Benefit amounts in every scheme. Both 2026-27 " "editions of Kingston upon Thames's scheme print £17.10 single and " "£24.50 couple (Sch 3 para 17(5)). In 2014 the council adopted an " - "annual uprating mechanism (Annex 3), which takes working-age " + "annual uprating mechanism (Annex 3), under which it takes working-age " "premiums from the Government's and DWP's uprating documents where " "the pension-age uprating omits them, and delegated each year's " "uprating to its Director of Finance. The model follows that " From 47d6b4e4fca561ceed9533f55a54d2624617bcdd Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 11:10:02 -0500 Subject: [PATCH 18/43] Date Kingston's uprating decisions and quote its 2026-27 rule State that the council delegated annual uprating in December 2013, kept its 2015-17 scheme apart from Annex 3's uprating in July 2014, and that its 2026-27 introductions name the Prescribed Requirement Scheme. Co-Authored-By: Claude Opus 5.5 --- ...ax_reduction_enhanced_disability_premium.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index 5988a15c65..3a14ad94ef 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -16,13 +16,17 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "Thames and Newham, where the councils count their own awards. The " "model pays the Housing Benefit amounts in every scheme. Both 2026-27 " "editions of Kingston upon Thames's scheme print £17.10 single and " - "£24.50 couple (Sch 3 para 17(5)). In 2014 the council adopted an " - "annual uprating mechanism (Annex 3), under which it takes working-age " - "premiums from the Government's and DWP's uprating documents where " - "the pension-age uprating omits them, and delegated each year's " - "uprating to its Director of Finance. The model follows that " - "mechanism, which gives the Housing Benefit amounts; we found no " - "decision that sets Kingston's own 2026-27 amounts. Pension-age " + "£24.50 couple (Sch 3 para 17(5)), and their introductions say the " + "council uprates premiums as set out in the Prescribed Requirement " + "Scheme. In December 2013 the council delegated each year's uprating, " + "and the choice of its sources, to its Director of Finance. In July " + "2014 it kept its scheme for 2015-17 apart from the uprating in Annex " + "3, under which it takes working-age amounts from the Government's " + "general uprating documents where the pension-age uprating lacks " + "them; the 2026 pension-age uprating (S.I. 2026/27) has no adult " + "enhanced premium. The model " + "reads that mechanism as giving the Housing Benefit amounts; we found " + "no decision that sets Kingston's own 2026-27 amounts. Pension-age " "Council Tax Reduction includes no adult enhanced disability premium." ) definition_period = YEAR From 43a545dcb2d56d37e693743657699e042d18f804 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sun, 1 Nov 2026 12:00:31 -0500 Subject: [PATCH 19/43] Group the top-rate threshold and name who acts in its docs Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../top_rate_amount_tolerance.yaml | 2 +- .../gov/dwp/enhanced_disability_premium.yaml | 4 +-- ..._enhanced_disability_premium_properties.py | 33 +++++++++---------- .../gov/dwp/dla/has_highest_dla_sc_award.py | 4 +-- ...aimants_or_partners_for_legacy_benefits.py | 9 ++--- .../gov/dwp/pip/has_enhanced_pip_dl_award.py | 4 +-- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index d7a42fcbe2..4a12b4192a 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches 52 times the top weekly rate less £1. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. diff --git a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml index 27e3a36feb..9561f197f1 100644 --- a/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml +++ b/policyengine_uk/parameters/gov/dwp/disability_premia/top_rate_amount_tolerance.yaml @@ -1,4 +1,4 @@ -description: The model counts a DLA care or PIP daily living amount as a top-rate award for the enhanced disability premium when the amount reaches 52 times the top weekly rate less this tolerance. policyengine-uk-data uses the same weekly tolerance when it derives award categories from reported amounts. +description: The model counts a DLA care or PIP daily living amount as a top-rate award for the enhanced disability premium when the amount reaches 52 × (top weekly rate − this weekly tolerance). policyengine-uk-data uses the same weekly tolerance when it derives award categories from reported amounts. values: 2015-01-01: 1 metadata: diff --git a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml index cf4ce2947c..7535951f7a 100644 --- a/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/dwp/enhanced_disability_premium.yaml @@ -8,8 +8,8 @@ # 2026-27 weekly rates: DLA care highest £114.60, middle £76.70; PIP daily # living enhanced £114.60, standard £76.70 (gov.dwp parameters). # The model counts an award only with a positive amount, and counts an amount -# entered without its category at the top rate when it reaches 52 times the -# top weekly rate less £1: (114.60 - 1) * 52 = 5,907.20 in 2026-27. +# entered without its category at the top rate when it reaches +# 52 × (top weekly rate − £1): (114.60 - 1) * 52 = 5,907.20 in 2026-27. - name: Case 1, enhanced PIP daily living qualifies a single claimant. period: 2026 diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index a55beecd00..c9b635ed61 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -11,8 +11,8 @@ either or both members meet the condition (HB Regs 2006 Sch 3 Part 4). The model counts an award only with a positive amount of the benefit, and -takes its rate from the award category or from an amount that reaches 52 -times the top weekly rate less £1. +takes its rate from the award category or from an amount that reaches +52 × (top weekly rate − £1). Scottish councils count attendance allowance at either rate from 1 April 2023 (SSI 2021/249 Sch 1 para 14), and the Scottish Ministers removed the age limit @@ -27,26 +27,25 @@ DLA care and PIP daily living amount, or computes an amount from their category. It checks these invariants: -1. Oracle: enhanced_disability_premium equals the statutory amount, which the - test computes from the award inputs and the parameter rates, and +1. The test computes the statutory amount from the award inputs and the + parameter rates. enhanced_disability_premium equals that amount, and council_tax_reduction_enhanced_disability_premium equals the amount under the scheme's own list. -2. No qualifying award: the model pays no premium to a family in which no - claimant or partner has a qualifying award. -3. Monotone: giving a claimant or partner a qualifying benefit on top of - their awards never lowers either premium. -4. Bounds: each premium equals nil, the single rate or the couple rate, and - never exceeds two single rates; the couple rate never exceeds two single - rates in any year. -5. Each scheme against the legacy premium: the Council Tax Reduction premium - equals the legacy premium in Wales, Northern Ireland and English councils +2. The model pays no premium to a family in which no claimant or partner has + a qualifying award. +3. Giving a claimant or partner a qualifying benefit on top of their awards + never lowers either premium. +4. Each premium equals nil, the single rate or the couple rate, and never + exceeds two single rates; the couple rate never exceeds two single rates + in any year. +5. The Council Tax Reduction premium equals the legacy premium in Wales, Northern Ireland and English councils without their own list, and in Scotland before 2023. It never falls below the legacy premium in Scotland from 2023 or in Newham. In Merton and Kingston upon Thames it never falls below the legacy premium unless that premium rests on AFIP alone, and then the model pays none unless an under-age member has a PIP daily living award. -6. Differential: for a child or young person in Great Britain, the qualifying - flag matches the oracle. The model pays the child's enhanced rate in the +6. For a child or young person in Great Britain, the qualifying flag matches + the test's own calculation. The model pays the child's enhanced rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums) when the flag holds and pays none when it does not. """ @@ -213,8 +212,8 @@ def adults_of(f): def upgraded(f): - """Return the same family with one claimant or partner given a - qualifying benefit on top of their awards.""" + """Add a qualifying benefit to one claimant's or partner's awards and + return the family.""" adults = [dict(a) for a in f["adults"]] j = f["upgrade_member"] % len(adults_of(f)) adults[j]["awards"] = adults[j]["awards"] + (f["upgrade_award"],) diff --git a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py index 26a286729a..2b3e49adb3 100644 --- a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py +++ b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py @@ -7,8 +7,8 @@ class has_highest_dla_sc_award(Variable): "The model counts an award of the care component of disability " "living allowance at the highest rate when the person has a positive " "amount (dla_sc) and either the highest-rate category " - "(dla_sc_category) or an amount that reaches 52 times the highest " - "weekly rate less a tolerance (gov.dwp.disability_premia.top_rate_" + "(dla_sc_category) or an amount that reaches 52 × (highest weekly " + "rate − weekly tolerance; gov.dwp.disability_premia.top_rate_" "amount_tolerance). It rejects an amount of zero, including one that " "a reform sets by neutralising dla_sc. Claimants also qualify while " "the suspension or hospital rules stop or abate payment of the award " diff --git a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py index 5a0fd69fb7..f74ad80458 100644 --- a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py +++ b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py @@ -13,10 +13,11 @@ class num_enhanced_disabled_claimants_or_partners_for_legacy_benefits(Variable): "Housing Benefit and Jobseeker's Allowance Regulations, the Welsh " "Council Tax Reduction scheme and England's Default Scheme, the age " "limit applies to the claimant and to family members or partners. " - "Parliament limits Income Support and Employment and Support " - "Allowance to claimants under that age (SSCBA 1992 s.124(1)(aa) and " - "SSCBA (NI) 1992 s.123(1)(aa); WRA 2007 s.1(3)(c) and WRA (NI) 2007 " - "s.1(3)(c), pensionable age), so their Regulations state the age " + "Parliament limits Income Support to claimants under that age (SSCBA " + "1992 s.124(1)(aa) and SSCBA (NI) 1992 s.123(1)(aa)), and Parliament " + "and the Northern Ireland Assembly limit Employment and Support " + "Allowance to claimants under pensionable age (WRA 2007 s.1(3)(c) " + "and WRA (NI) 2007 s.1(3)(c)), so their Regulations state the age " "limit only for the partner. The count leaves out children and young " "persons, whose separate enhanced premium the model computes for " "Housing Benefit only (housing_benefit_child_disability_premiums)." diff --git a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py index 1afec958d0..b4b43ac7e8 100644 --- a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py +++ b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py @@ -7,8 +7,8 @@ class has_enhanced_pip_dl_award(Variable): "The model counts an award of the daily living component of personal " "independence payment at the enhanced rate when the person has a " "positive amount (pip_dl) and either the enhanced-rate category " - "(pip_dl_category) or an amount that reaches 52 times the enhanced " - "weekly rate less a tolerance (gov.dwp.disability_premia.top_rate_" + "(pip_dl_category) or an amount that reaches 52 × (enhanced weekly " + "rate − weekly tolerance; gov.dwp.disability_premia.top_rate_" "amount_tolerance). It rejects an amount of zero, including one that " "a reform sets by neutralising pip_dl. Claimants also qualify when the " "hospital in-patient rules end payment of the award (HB Regs 2006 Sch " From 852823c11db0c1ddbccb8047a077731ae86c7e96 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 09:18:28 +0000 Subject: [PATCH 20/43] Start each council's enhanced premium list in the first year a scheme text supports Kingston upon Thames adopted the Default Scheme from 1 April 2013 and kept it apart from uprating for 2014-15 to 2016-17; Newham's 2013 scheme counts DLA care at the highest rate and PIP daily living at either rate, and its 2014 scheme adds armed forces independence payment; Merton's 2023 rules are the earliest Merton text cited. A per-council qualifying_benefits_in_effect switch makes meets_council_tax_reduction_enhanced_disability_premium_condition apply the Housing Benefit condition before a council's list starts, because the model backdates each parameter's first value to 2015. The property test checks every year from 2015 to 2030, draws a family in each council with its own list for every example, and adds invariant 7: before a council's list starts its premium equals the legacy premium. Two Merton cases cover 2022 and 2023. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../qualifying_benefits.yaml | 27 +++- .../qualifying_benefits_in_effect.yaml | 19 +++ .../qualifying_benefits.yaml | 12 +- .../qualifying_benefits_in_effect.yaml | 20 +++ .../qualifying_benefits.yaml | 35 +++-- .../qualifying_benefits_in_effect.yaml | 18 +++ .../enhanced_disability_premium.yaml | 103 ++++++++++++- ..._enhanced_disability_premium_properties.py | 135 +++++++++++++----- ...n_enhanced_disability_premium_condition.py | 24 +++- 9 files changed, 335 insertions(+), 58 deletions(-) create mode 100644 policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 3d8d1e264f..e62a9325ea 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -5,16 +5,37 @@ description: > or a member of the applicant's family, toward the enhanced disability premium in its working-age Council Tax Reduction scheme. It omits armed forces independence payment, and counts each award only for a person under - the qualifying age for State Pension Credit. The model reads the list as at - 30 April of each year and backdates it to 2015. + the qualifying age for State Pension Credit. The council made its scheme + from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets + this list, and kept the scheme apart from uprating for 2014-15, 2015-16 and + 2016-17; its scheme texts for 2023 to 2026-27 keep the same para 12. The + model reads the list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year unit: list reference: + - title: Council, 11 December 2012, item 42 (a scheme from 1 April 2013 adopting the Default Scheme) + href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744 + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 Sch. 3 para. 12 (as made) + href: https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made + - title: Council, 8 October 2013, item 42 (no changes for 2014/15 other than the Government's changes to the Default Scheme) + href: https://moderngov.kingston.gov.uk/ieListDocuments.aspx?CId=137&MId=7156&Ver=4 + - title: Decision 2535, 17 December 2013 (2014/15 the same as 2013/14 apart from uprating) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 + - title: Decision 2707, 16 July 2014 (2015/16 and 2016/17 unchanged apart from uprating) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 + - title: Council, 15 December 2015, item 81c (revisions from 1 April 2016, none to Sch 3 para 12) + href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=29804 + - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf + - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/downloads/Council_Tax_Reduction_Scheme_2024_2025.pdf + - title: Council Tax Reduction Scheme 2025-26, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/2026-07/Council%20Tax%20Reduction%20Scheme%202025-26.pdf - title: Council Tax Reduction Scheme 2026 - 2027, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf values: - 2026-04-01: + 2013-04-01: - has_highest_dla_sc_award - pip_dl diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml new file mode 100644 index 0000000000..9aac9d7762 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml @@ -0,0 +1,19 @@ +description: > + If this is true, the model applies the Royal Borough of Kingston upon + Thames's own list (qualifying_benefits) to the enhanced disability premium + in its working-age Council Tax Reduction scheme; otherwise it applies the + Housing Benefit condition there + (receives_enhanced_disability_premium_qualifying_benefit), under the same + age limit. The council's resolutions support its own list from 2013-14, when + it adopted the Default Scheme, so the model applies the list in every year. +metadata: + label: Kingston upon Thames Council Tax Reduction enhanced disability premium own list in effect + period: year + unit: bool + reference: + - title: Council, 11 December 2012, item 42 (a scheme from 1 April 2013 adopting the Default Scheme) + href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744 + - title: Decision 2535, 17 December 2013 (the council adopted the Default Scheme for 2013/14) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 +values: + 2013-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index c53e021a33..884e3384b8 100644 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -5,16 +5,22 @@ description: > applicant's family, toward the enhanced disability premium in its working-age Council Tax Support scheme. It omits armed forces independence payment, and counts each award only for a person under the qualifying age - for State Pension Credit. The model reads the list as at 30 April of each - year and backdates it to 2015. + for State Pension Credit. The council's scheme rules for 2023-24, 2025-26 and + 2026-27 set this list, and the model applies it from 2023-24 + (qualifying_benefits_in_effect). The model reads the list as at 30 April of + each year. metadata: label: Merton Council Tax Support enhanced disability premium qualifying benefits period: year unit: list reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2023, Sch. 3 para. 12(1)(b), (c) + href: https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2025, Sch. 3 para. 12(1)(b), (c) + href: https://www.merton.gov.uk/sites/default/files/2025-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202025-26.pdf - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2026, Sch. 3 para. 12(1)(b), (c) href: https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf values: - 2026-04-01: + 2023-04-01: - has_highest_dla_sc_award - pip_dl diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml new file mode 100644 index 0000000000..c00db5ce48 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml @@ -0,0 +1,20 @@ +description: > + If this is true, the model applies the London Borough of Merton's own list + (qualifying_benefits) to the enhanced disability premium in its working-age + Council Tax Support scheme; otherwise it applies the Housing Benefit + condition there (receives_enhanced_disability_premium_qualifying_benefit), + under the same age limit. The council's scheme rules for 2023-24 are the + earliest text the model cites for its list, so the model applies the + Housing Benefit condition in Merton before 2023-24. +metadata: + label: Merton Council Tax Support enhanced disability premium own list in effect + period: year + unit: bool + reference: + - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2023, Sch. 3 para. 12(1)(b), (c) + href: https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf + - title: The Housing Benefit Regulations 2006 Sch. 3 para. 15(1)(b), (c), (d) + href: https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15 +values: + 2013-04-01: false + 2023-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 2de00fc306..1439613c7f 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -1,23 +1,38 @@ description: > The London Borough of Newham counts the care component of disability living - allowance at the highest rate, the daily living component of personal - independence payment at either rate and armed forces independence payment, - for the applicant or a member of the applicant's family, toward the enhanced - disability premium in its working-age Council Tax Reduction scheme. It - counts each award only for a person under the qualifying age for State - Pension Credit. It also counts the care component of child disability - payment at the highest rate, for which the model has no separate variable. - The model reads the list as at 30 April of each year and backdates it to - 2015. + allowance at the highest rate and the daily living component of personal + independence payment at either rate, for the applicant or a member of the + applicant's family, toward the enhanced disability premium in its + working-age Council Tax Reduction scheme, and from 1 April 2014 armed forces + independence payment. It counts each award only for a person under the + qualifying age for State Pension Credit. Its scheme texts from 2022 also + count the care component of child disability payment at the highest rate, + for which the model has no separate variable. The model reads the list as + at 30 April of each year. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year unit: list reference: + - title: Council, 24 January 2013, minutes (adopting the local scheme in Appendix 1 from 1 April 2013) + href: https://mgov.newham.gov.uk/documents/g9739/Printed%20minutes%2024th-Jan-2013%2018.00%20Council.pdf?T=1 + - title: Council Tax Reduction Scheme 2013 (Appendix 1), Sch. 3 para. 12(1)(b), (c) + href: https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf + - title: Council, 9 December 2013, minutes (adopting the scheme in Appendix 2 from 1 April 2014) + href: https://mgov.newham.gov.uk/documents/g9807/Printed%20minutes%2009th-Dec-2013%2020.00%20Council.pdf?T=1 + - title: Council Tax Reduction Scheme 2014, Sch. 3 para. 12(1)(b), (c), (d) + href: https://mgov.newham.gov.uk/documents/s85542/LB%20Newham%20Local%20CTR%20Scheme_1415_12_11_13A.pdf + - title: Council Tax Reduction Scheme 2017 (Appendix 1), Sch. 3 para. 12(1)(b), (c), (d) + href: https://mgov.newham.gov.uk/documents/s110300/Appendix%201%20LB%20Newham%20Local%20CTR%20Scheme%201718.pdf + - title: Council, 28 February 2022, supplementary agenda (Council Tax Reduction Scheme), Sch. 3 para. 12(1) + href: https://mgov.newham.gov.uk/documents/b31136/Supplementary%20Agenda%20-%20Council%20Tax%20Reduction%20Scheme%2028th-Feb-2022%2019.00%20Council.pdf?T=9 - title: Council Tax Reduction Scheme 2026, Sch. 3 para. 12(1)(n), (o), (p) href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 values: - 2026-04-01: + 2013-04-01: + - has_highest_dla_sc_award + - pip_dl + 2014-04-01: - has_highest_dla_sc_award - pip_dl - armed_forces_independence_payment diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml new file mode 100644 index 0000000000..0d62594b22 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml @@ -0,0 +1,18 @@ +description: > + If this is true, the model applies the London Borough of Newham's own list + (qualifying_benefits) to the enhanced disability premium in its working-age + Council Tax Reduction scheme; otherwise it applies the Housing Benefit + condition there (receives_enhanced_disability_premium_qualifying_benefit), + under the same age limit. The council's scheme texts support its own list + from 2013-14, so the model applies the list in every year. +metadata: + label: Newham Council Tax Reduction enhanced disability premium own list in effect + period: year + unit: bool + reference: + - title: Council, 24 January 2013, minutes (adopting the local scheme in Appendix 1 from 1 April 2013) + href: https://mgov.newham.gov.uk/documents/g9739/Printed%20minutes%2024th-Jan-2013%2018.00%20Council.pdf?T=1 + - title: Council Tax Reduction Scheme 2013 (Appendix 1), Sch. 3 para. 12(1)(b), (c) + href: https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf +values: + 2013-04-01: true diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 1579395488..39cbfec877 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -12,8 +12,11 @@ # 12(1)). Newham counts DLA care highest, PIP daily living at either rate and # AFIP (Newham's Council Tax Reduction Scheme 2026, Sch 3 para 12(1)). The # three London councils keep the qualifying age for State Pension Credit as -# the age limit. The model applies the Housing Benefit condition in -# Westminster and reads each year's rules at 30 April. +# the age limit. The model applies each council's list from the first scheme +# year whose text supports it: 2013-14 in Kingston upon Thames and Newham +# (with AFIP from 2014-15), and 2023-24 in Merton (the 2023 rules). It applies +# the Housing Benefit condition in Merton before 2023 and in Westminster, and +# reads each year's rules at 30 April. # 2026-27 amounts: enhanced disability premium £22.00 single, £31.40 couple; # severe disability premium £86.05 single. @@ -422,3 +425,99 @@ # state pension credit". meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, false, false] council_tax_reduction_enhanced_disability_premium: [0, 0] + +- name: Case 13, Merton applies the Housing Benefit condition in 2022, before its own list starts. + # The 2023 rules are the earliest Merton scheme text the model cites, so in + # 2022 the model applies the Housing Benefit condition (HB Regs 2006 Sch 3 + # para 15(1)(c): the enhanced rate only). The case pins the 2022-23 energy + # and cost of living payments at zero, so household net income moves only + # with the reduction. 2022-23 rates: PIP daily living standard 61.85, + # personal allowance (25 or over) 77.00, severe disability premium 69.40. + period: 2022 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: STANDARD + private_pension_income: 11_000 + benunits: + benunit: + members: [person1] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + household: + members: [person1] + country: ENGLAND + local_authority: MERTON + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + output: + enhanced_disability_premium: 0 + meets_council_tax_reduction_enhanced_disability_premium_condition: false + council_tax_reduction_enhanced_disability_premium: 0 + # The severe disability premium alone: 69.40 * 52 = 3,608.80. + council_tax_reduction_premiums: 3_608.80 + # Personal allowance 77.00 * 52 = 4,004.00, plus 3,608.80: 7,612.80. + council_tax_reduction_applicable_amount: 7_612.80 + # 1,800 - 20% of (11,000 - 7,612.80) = 1,800 - 677.44 = 1,122.56. + council_tax_reduction: 1_122.56 + # Pension 11,000 + PIP 61.85 * 52 = 3,216.20 + reduction 1,122.56 - + # council tax 1,800 = 13,538.76. The pension falls below the 12,570 + # personal allowance, so the model charges no income tax. + household_net_income: 13_538.76 + +- name: Case 14, Merton's own list counts standard PIP daily living from 2023, the year of its 2023 rules. + # Merton's Local Council Tax Support Scheme Rules 2023, Sch 3 para 12(1)(c): + # PIP daily living "payable at either rate". The case pins the 2023-24 energy + # and cost of living payments at zero. 2023-24 rates: PIP daily living + # standard 68.10, personal allowance (25 or over) 84.80, severe disability + # premium 76.40, enhanced disability premium 19.55. + period: 2023 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + pip_dl_category: STANDARD + private_pension_income: 11_000 + benunits: + benunit: + members: [person1] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + household: + members: [person1] + country: ENGLAND + local_authority: MERTON + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + output: + # The legacy premium still counts the enhanced rate only. + enhanced_disability_premium: 0 + meets_council_tax_reduction_enhanced_disability_premium_condition: true + # 19.55 * 52 = 1,016.60. + council_tax_reduction_enhanced_disability_premium: 1_016.60 + # Severe disability premium 76.40 * 52 = 3,972.80, plus 1,016.60: + # 4,989.40. + council_tax_reduction_premiums: 4_989.40 + # Personal allowance 84.80 * 52 = 4,409.60, plus 4,989.40: 9,399.00. + council_tax_reduction_applicable_amount: 9_399 + # 1,800 - 20% of (11,000 - 9,399.00) = 1,800 - 320.20 = 1,479.80. + council_tax_reduction: 1_479.80 + # Pension 11,000 + PIP 68.10 * 52 = 3,541.20 + reduction 1,479.80 - + # council tax 1,800 = 14,221.00. The pension falls below the 12,570 + # personal allowance, so the model charges no income tax. + household_net_income: 14_221 diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index c9b635ed61..1c730c74f7 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -19,13 +19,16 @@ from 20 June 2022, which the model reads from 2023. Merton and Kingston upon Thames (Sch 3 para 12) count the PIP daily living component at either rate and omit AFIP; Newham counts the PIP daily living component at either rate -and AFIP. The model applies the Housing Benefit condition in Wales, -Westminster and every other scheme. +and AFIP. Each council's list applies from the first scheme year whose text +supports it (COUNCIL_LISTS). The model applies the Housing Benefit condition +in each of those councils before that year, and in Wales, Westminster and +every other scheme. The test generates single people, couples and lone parents in the places and -age range below, with the listed awards. It supplies each person's entered -DLA care and PIP daily living amount, or computes an amount from their -category. It checks these invariants: +age range below, with the listed awards, and adds a family in each council +with its own list to every example. It supplies each person's entered DLA +care and PIP daily living amount, or computes an amount from their category. +It checks these invariants in every year from 2015 to 2030: 1. The test computes the statutory amount from the award inputs and the parameter rates. enhanced_disability_premium equals that amount, and @@ -38,16 +41,20 @@ 4. Each premium equals nil, the single rate or the couple rate, and never exceeds two single rates; the couple rate never exceeds two single rates in any year. -5. The Council Tax Reduction premium equals the legacy premium in Wales, Northern Ireland and English councils - without their own list, and in Scotland before 2023. It never falls below - the legacy premium in Scotland from 2023 or in Newham. In Merton and - Kingston upon Thames it never falls below the legacy premium unless that - premium rests on AFIP alone, and then the model pays none unless an - under-age member has a PIP daily living award. +5. The Council Tax Reduction premium equals the legacy premium in Wales, + Northern Ireland and English councils without their own list, and in + Scotland before 2023. It never falls below the legacy premium in Scotland + from 2023, or in a council whose own list counts AFIP (Newham's). Where a + council's own list omits AFIP (Merton's and Kingston upon Thames's), it + never falls below the legacy premium unless that premium rests on AFIP + alone, and then the model pays none unless an under-age member has a PIP + daily living award. 6. For a child or young person in Great Britain, the qualifying flag matches the test's own calculation. The model pays the child's enhanced rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums) when the flag holds and pays none when it does not. +7. In each year before a council's own list starts, its Council Tax + Reduction premium equals the legacy premium. """ import numpy as np @@ -67,10 +74,10 @@ # The test allows this weekly tolerance below the top rate # (policyengine-uk-data's CATEGORY_THRESHOLD_WEEKLY_TOLERANCE). TOLERANCE = 1 -# Each example builds one simulation with inputs for every year here, so -# every example tests both sides of the Northern Ireland PIP date (2017) and -# the Scottish changes (2023). -YEARS = [2016, 2017, 2022, 2023, 2026] +# Each example builds one simulation with inputs for every year from 2015 to +# 2030, so every example tests both sides of the Northern Ireland PIP date +# (2017), the Scottish changes (2023) and each council's first year. +YEARS = list(range(2015, 2031)) # (country, local authority): None keeps the default local authority. PLACES = [ ("ENGLAND", None), @@ -83,21 +90,21 @@ ("SCOTLAND", "CITY_OF_EDINBURGH"), ("NORTHERN_IRELAND", None), ] -# The generator assigns the award inputs below. The reported amounts of 6,000 -# and 3,000 respectively exceed and fall below each tested year's threshold: -# (82.30 - 1) * 52 = 4,227.60 in 2016 and (114.60 - 1) * 52 = 5,907.20 in -# 2026. +# The generator assigns the award inputs below. The reported amounts of 7,000 +# and 3,000 respectively exceed and fall below each tested year's threshold, +# which rises from (82.30 - 1) * 52 = 4,227.60 in 2015 to 6,596.16 at the +# model's uprated 2030 rates (test_entered_amounts_straddle_the_threshold). AWARDS = { "dla_care_lowest": {"dla_sc_category": "LOWER"}, "dla_care_middle": {"dla_sc_category": "MIDDLE"}, "dla_care_highest": {"dla_sc_category": "HIGHER"}, - "dla_care_top_amount_only": {"dla_sc": 6_000}, + "dla_care_top_amount_only": {"dla_sc": 7_000}, "dla_care_low_amount_only": {"dla_sc": 3_000}, "dla_care_highest_zero_amount": {"dla_sc_category": "HIGHER", "dla_sc": 0}, "dla_care_highest_part_amount": {"dla_sc_category": "HIGHER", "dla_sc": 1_000}, "pip_daily_living_standard": {"pip_dl_category": "STANDARD"}, "pip_daily_living_enhanced": {"pip_dl_category": "ENHANCED"}, - "pip_daily_living_top_amount_only": {"pip_dl": 6_000}, + "pip_daily_living_top_amount_only": {"pip_dl": 7_000}, "pip_daily_living_low_amount_only": {"pip_dl": 3_000}, "pip_daily_living_enhanced_zero_amount": { "pip_dl_category": "ENHANCED", @@ -109,6 +116,22 @@ } QUALIFYING_AWARDS = ["dla_care_highest", "pip_daily_living_enhanced", "afip"] ADULT_AGES = [20, 30, 45, 60, 64, 66, 67, 70, 85] +# Each council's own list (Sch 3 para 12 of its scheme), by the first scheme +# year whose text supports it: "dla_highest" is the DLA care component at the +# highest rate, "any_pip" the PIP daily living component at either rate and +# "afip" armed forces independence payment. Before a council's first year the +# model applies the Housing Benefit condition there. +COUNCIL_LISTS = { + # The 2023 rules. + "MERTON": {2023: ("dla_highest", "any_pip")}, + # The Default Scheme, adopted for 2013-14. + "KINGSTON_UPON_THAMES": {2013: ("dla_highest", "any_pip")}, + # The 2013 scheme, and the 2014 scheme with AFIP. + "NEWHAM": { + 2013: ("dla_highest", "any_pip"), + 2014: ("dla_highest", "any_pip", "afip"), + }, +} system = CountryTaxBenefitSystem() @@ -165,22 +188,32 @@ def qualifies(inputs, country, year): return False +def council_list(council, year): + """Return the awards on a council's own list in a year, or None before + the first scheme year whose text supports the list.""" + starts = [start for start in COUNCIL_LISTS.get(council, {}) if start <= year] + return COUNCIL_LISTS[council][max(starts)] if starts else None + + def qualifies_for_scheme(inputs, place, year): """Check for the scheme's own awards, before its age limit.""" country, council = place - any_pip = amount(inputs, "pip_dl", year) > 0 - dla_highest = top_rate_award(inputs, "dla_sc", year) if country == "SCOTLAND": # SSI 2021/249 Sch 1 para 14(1), with head (g) from 2023. attendance_allowance = inputs.get("aa_category") in ("LOWER", "HIGHER") return qualifies(inputs, country, year) or ( attendance_allowance and year >= 2023 ) - if council in ("MERTON", "KINGSTON_UPON_THAMES"): - return dla_highest or any_pip - if council == "NEWHAM": - return dla_highest or any_pip or afip(inputs) - return qualifies(inputs, country, year) + listed = council_list(council, year) + if listed is None: + # The Housing Benefit condition. + return qualifies(inputs, country, year) + held = dict( + dla_highest=top_rate_award(inputs, "dla_sc", year), + any_pip=amount(inputs, "pip_dl", year) > 0, + afip=afip(inputs), + ) + return any(held[award] for award in listed) def scheme_age_limit(place, year): @@ -198,6 +231,14 @@ def scheme_age_limit(place, year): upgrade_award=st.sampled_from(QUALIFYING_AWARDS), ) ) +# A family in each council with its own list, drawn for every example. +council_families = st.tuples( + *( + family.map(lambda f, place=place: dict(f, place=place)) + for place in PLACES + if place[1] in COUNCIL_LISTS + ) +) child = st.fixed_dictionaries( dict( age=st.sampled_from([4, 10, 16, 17]), @@ -302,14 +343,20 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): """Check invariant 5: each scheme's premium against the legacy premium.""" country, council = f["place"] + listed = council_list(council, year) if country == "SCOTLAND": if year < 2023: assert np.isclose(ctr, edp, atol=0.01) else: assert ctr >= edp - 0.01 - elif council == "NEWHAM": + elif council in COUNCIL_LISTS and listed is None: + # Invariant 7 covers a council before its own list starts. + return + elif listed is None: + assert np.isclose(ctr, edp, atol=0.01) + elif "afip" in listed: assert ctr >= edp - 0.01 - elif council in ("MERTON", "KINGSTON_UPON_THAMES"): + else: under_age = [ award_inputs(a["awards"]) for j, a in enumerate(adults_of(f)) @@ -322,10 +369,16 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): if not rests_on_afip: assert ctr >= edp - 0.01 elif not any(amount(x, "pip_dl", year) > 0 for x in under_age): - # These councils do not count AFIP. + # The list omits AFIP. assert ctr == 0 - else: - assert np.isclose(ctr, edp, atol=0.01) + + +def check_before_list_starts(f, year, edp, ctr): + """Check invariant 7: before a council's own list starts, its premium + equals the legacy premium.""" + council = f["place"][1] + if council in COUNCIL_LISTS and council_list(council, year) is None: + assert np.isclose(ctr, edp, atol=0.01), (f, year, ctr, edp) def check_families(sim, person, benunit, families, year): @@ -364,6 +417,7 @@ def check_families(sim, person, benunit, families, year): ) assert annual <= 2 * single_annual + 0.01 check_scheme_against_legacy(f, year, member_attained, edp[b], ctr[b]) + check_before_list_starts(f, year, edp[b], ctr[b]) # 3. Monotone: the test pairs each family in the first half with its twin # in the second half, which has a qualifying benefit added. assert all(t >= s - 0.01 for s, t in zip(family_edp[:n], family_edp[n:])) @@ -401,9 +455,11 @@ def check_children(sim, person, benunit, children, year): @PROPERTY_SETTINGS @given( families=st.lists(family, min_size=1, max_size=30), + council_families=council_families, children=st.lists(child, max_size=15), ) -def test_enhanced_disability_premium_invariants(families, children): +def test_enhanced_disability_premium_invariants(families, council_families, children): + families = families + list(council_families) everyone = families + [upgraded(f) for f in families] sim, person, benunit = build(everyone, children) for year in YEARS: @@ -417,6 +473,17 @@ def test_couple_rate_never_exceeds_two_single_rates(): assert p.enhanced_couple <= 2 * p.enhanced_single, year +def test_entered_amounts_straddle_the_threshold(): + """In every tested year the entered top amount reaches the top-rate + threshold and the entered low amount falls below it.""" + for year in YEARS: + for benefit, award in (("dla_sc", "dla_care"), ("pip_dl", "pip_daily_living")): + top = AWARDS[f"{award}_top_amount_only"] + low = AWARDS[f"{award}_low_amount_only"] + assert top_rate_award(top, benefit, year), (award, year) + assert not top_rate_award(low, benefit, year), (award, year) + + class NeutraliseDlaCareAndPipDailyLiving(Reform): def apply(self): self.neutralize_variable("dla_sc") diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index 8b19a248f5..ab476aa49e 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -22,7 +22,11 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "Newham counts the PIP daily living component at either rate and " "armed forces independence payment. Those three councils count an " "award only for a person under the qualifying age for State Pension " - "Credit. The model applies the Housing Benefit condition elsewhere " + "Credit. The model applies each council's own list from the first " + "scheme year whose text supports it " + "(qualifying_benefits_in_effect): 2013-14 in Kingston upon Thames and " + "Newham, and 2023-24 in Merton. Before then, and in every other " + "scheme, it applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " "2013/3029 Sch 7 para 12. Westminster City Council publishes a " @@ -37,8 +41,12 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14", "https://www.legislation.gov.uk/ssi/2012/303/schedule/1/paragraph/12/2021-04-01", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", + "https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf", "https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf", + "https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744", + "https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made", "https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf", + "https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf", "https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026", ) @@ -52,18 +60,22 @@ def formula(person, period, parameters): def receives(benefits): return add(person, period, benefits) > 0 + housing_benefit = ( + person("receives_enhanced_disability_premium_qualifying_benefit", period) + & under_age + ) + def council_condition(council): p = council.council_tax_reduction.enhanced_disability_premium - return receives(p.qualifying_benefits) & under_age + own_list = receives(p.qualifying_benefits) & under_age + # Before the first scheme year whose text supports the council's + # own list, the model applies the Housing Benefit condition. + return where(p.qualifying_benefits_in_effect, own_list, housing_benefit) p = la.scotland.council_tax_reduction.working_age.enhanced_disability_premium scottish = receives(p.qualifying_benefits) & ( under_age | (not p.age_limit_applies) ) - housing_benefit = ( - person("receives_enhanced_disability_premium_qualifying_benefit", period) - & under_age - ) return select( [ is_scotland_scheme(country), From bf4fcb558f030c8b14cc15ca0d5258e7b1633269 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 09:30:47 +0000 Subject: [PATCH 21/43] Say what Westminster's resolutions state about its working-age scheme Westminster City Council's annual resolutions describe its scheme only as based on the Default Scheme Regulations, with war pensions and Armed Forces Compensation Scheme payments disregarded in full and, from 2020, updated for the amendments to the Prescribed Requirements Regulations. None states the enhanced disability premium's qualifying awards, so the model keeps the Housing Benefit condition there. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- ...tax_reduction_enhanced_disability_premium_condition.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index ab476aa49e..0dde5fa4f3 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -31,7 +31,12 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "same age limit). Welsh councils apply that condition under W.S.I. " "2013/3029 Sch 7 para 12. Westminster City Council publishes a " "2026-27 summary of its working-age scheme without the premium " - "conditions, so the model assumes the Housing Benefit condition there. " + "conditions. Its Council's annual resolutions describe the scheme only " + "as based on the Default Scheme Regulations, with war pensions and " + "Armed Forces Compensation Scheme payments disregarded in full and, " + "from 2020, updated for the amendments to the Prescribed Requirements " + "Regulations, so the model assumes the Housing Benefit condition " + "there. " "Oxford City Council sets " "its working-age award from income bands, so the premium does not " "reach it." @@ -48,6 +53,7 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf", "https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf", "https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026", + "https://committees.westminster.gov.uk/mgAi.aspx?ID=22982", ) def formula(person, period, parameters): From c337a17e207ad079a532ca1942411639e55d8afe Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 09:47:10 +0000 Subject: [PATCH 22/43] Cite each council's scheme texts and decisions for every year of its list Kingston upon Thames's list rests on its December 2012 adoption of the Default Scheme, its decisions keeping the scheme for 2014-15 to 2016-17 and its December 2015 revisions, and on its texts for 2023 to 2026-27, whose 2023 edition records no later council revision. Newham's rests on its texts for 2013, 2014, 2017, 2022, 2023 and 2026 and its budget reports for the years between. Merton's rules for 2023-24, 2025-26 and 2026-27 set its list, and the council offers its 2023 rules as its 2024-25 scheme. The changelog says when each list applies. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 17 ++++++++++------- .../qualifying_benefits.yaml | 6 ++++-- .../qualifying_benefits.yaml | 12 +++++++++--- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 4a12b4192a..590cf94765 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. The model applies each council's list from the first scheme year a council text supports (2013-14 in Kingston upon Thames and Newham, 2023-24 in Merton) and the Housing Benefit condition before then. diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index e62a9325ea..29aeeac522 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -7,9 +7,12 @@ description: > forces independence payment, and counts each award only for a person under the qualifying age for State Pension Credit. The council made its scheme from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets - this list, and kept the scheme apart from uprating for 2014-15, 2015-16 and - 2016-17; its scheme texts for 2023 to 2026-27 keep the same para 12. The - model reads the list as at 30 April of each year. + this list; kept the scheme apart from uprating for 2014-15, 2015-16 and + 2016-17; and revised other provisions from April 2016 and April 2017. Its + scheme texts for 2023 to 2026-27 keep the same para 12, and the 2023 text + records no later council revision, so the model also applies the list from + 2018-19 to 2022-23, for which no text or decision is cited. The model reads + the list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -25,14 +28,14 @@ metadata: href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 - title: Decision 2707, 16 July 2014 (2015/16 and 2016/17 unchanged apart from uprating) href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 - - title: Council, 15 December 2015, item 81c (revisions from 1 April 2016, none to Sch 3 para 12) - href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=29804 + - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/downloads/Council_Tax_Reduction_Scheme_2024_2025.pdf - - title: Council Tax Reduction Scheme 2025-26, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/2026-07/Council%20Tax%20Reduction%20Scheme%202025-26.pdf + - title: Council Tax Reduction Scheme 2025 - 2026, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/2025-04/Council_Tax_Reduction_Scheme_2025_26.pdf - title: Council Tax Reduction Scheme 2026 - 2027, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf values: diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 884e3384b8..61ab3add3c 100644 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -7,8 +7,10 @@ description: > payment, and counts each award only for a person under the qualifying age for State Pension Credit. The council's scheme rules for 2023-24, 2025-26 and 2026-27 set this list, and the model applies it from 2023-24 - (qualifying_benefits_in_effect). The model reads the list as at 30 April of - each year. + (qualifying_benefits_in_effect). The council's website offers its 2023 rules + as its 2024-25 scheme, and the 2023 and 2025 rules set the same list, so the + model keeps it in 2024-25. The model reads the list as at 30 April of each + year. metadata: label: Merton Council Tax Support enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 1439613c7f..8c067fcd49 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -7,8 +7,12 @@ description: > independence payment. It counts each award only for a person under the qualifying age for State Pension Credit. Its scheme texts from 2022 also count the care component of child disability payment at the highest rate, - for which the model has no separate variable. The model reads the list as - at 30 April of each year. + for which the model has no separate variable. The council's texts for 2013, + 2014, 2017, 2022, 2023 and 2026 set these lists. For the years between, its + budget reports say that the scheme stays unchanged or that the council + changed other provisions, or (for 2018-19 and 2024-25) say nothing of it, + and the texts on either side keep the same para 12. The model reads the list + as at 30 April of each year. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -24,8 +28,10 @@ metadata: href: https://mgov.newham.gov.uk/documents/s85542/LB%20Newham%20Local%20CTR%20Scheme_1415_12_11_13A.pdf - title: Council Tax Reduction Scheme 2017 (Appendix 1), Sch. 3 para. 12(1)(b), (c), (d) href: https://mgov.newham.gov.uk/documents/s110300/Appendix%201%20LB%20Newham%20Local%20CTR%20Scheme%201718.pdf - - title: Council, 28 February 2022, supplementary agenda (Council Tax Reduction Scheme), Sch. 3 para. 12(1) + - title: Council, 28 February 2022, supplementary agenda (Council Tax Reduction Scheme 2022), Sch. 3 para. 12(1)(b), (c), (d) href: https://mgov.newham.gov.uk/documents/b31136/Supplementary%20Agenda%20-%20Council%20Tax%20Reduction%20Scheme%2028th-Feb-2022%2019.00%20Council.pdf?T=9 + - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c), (d) + href: https://www.newham.gov.uk/downloads/file/5876/council-tax-reduction-scheme-2023 - title: Council Tax Reduction Scheme 2026, Sch. 3 para. 12(1)(n), (o), (p) href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 values: From e22dbc75f7989204893267c0c6e98740949b60a1 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 10:19:20 +0000 Subject: [PATCH 23/43] Say the CTR premium differs from the legacy one in Merton only from 2023-24 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../council_tax_reduction_enhanced_disability_premium.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index 3a14ad94ef..fab93371b9 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -12,8 +12,9 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "scheme's condition " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " "It pays a different premium from the legacy one " - "(enhanced_disability_premium) in Scotland, Merton, Kingston upon " - "Thames and Newham, where the councils count their own awards. The " + "(enhanced_disability_premium) in Scotland, Kingston upon Thames, " + "Newham and, from 2023-24, Merton, where the councils count their own " + "awards. The " "model pays the Housing Benefit amounts in every scheme. Both 2026-27 " "editions of Kingston upon Thames's scheme print £17.10 single and " "£24.50 couple (Sch 3 para 17(5)), and their introductions say the " From fbc1f77ff67168846b01f496dcfcdcd00a459e1b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 10:54:15 +0000 Subject: [PATCH 24/43] Cite Kingston upon Thames's 2023-24 budget report for the years before 2023 The report Budget Council approved on 2 March 2023 says the Council Tax Support Scheme "remains unchanged", the 2023 text records no council revision after December 2015, and the council's decision registers for 2017 to 2026 list no Council Tax Reduction decision. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../qualifying_benefits.yaml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 29aeeac522..8a6ebd079f 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -9,10 +9,12 @@ description: > from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets this list; kept the scheme apart from uprating for 2014-15, 2015-16 and 2016-17; and revised other provisions from April 2016 and April 2017. Its - scheme texts for 2023 to 2026-27 keep the same para 12, and the 2023 text - records no later council revision, so the model also applies the list from - 2018-19 to 2022-23, for which no text or decision is cited. The model reads - the list as at 30 April of each year. + scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text + records no council revision after December 2015, the council's decision + registers for 2017 to 2026 list no Council Tax Reduction decision, and its + 2023-24 budget report says the scheme "remains unchanged", so the model also + applies the list from 2018-19 to 2022-23, for which no text is cited. The + model reads the list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -30,6 +32,8 @@ metadata: href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 + - title: Budget Report 2023/24 to 2026/27, para. 51 (the Council Tax Support Scheme "remains unchanged"), approved by Budget Council on 2 March 2023 + href: https://moderngov.kingston.gov.uk/mgConvert2PDF.aspx?ID=99625 - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) From a2c6de6a2d4d00fdbd3c8f90c22b5288ab8f6219 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 11:06:00 +0000 Subject: [PATCH 25/43] Cite Newham's 2024-25 Council Tax booklet for the years between its texts Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../qualifying_benefits.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 8c067fcd49..f50663eb0c 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -8,11 +8,11 @@ description: > qualifying age for State Pension Credit. Its scheme texts from 2022 also count the care component of child disability payment at the highest rate, for which the model has no separate variable. The council's texts for 2013, - 2014, 2017, 2022, 2023 and 2026 set these lists. For the years between, its - budget reports say that the scheme stays unchanged or that the council - changed other provisions, or (for 2018-19 and 2024-25) say nothing of it, - and the texts on either side keep the same para 12. The model reads the list - as at 30 April of each year. + 2014, 2017, 2022, 2023 and 2026 set these lists. For the years between, the + council's budget reports and its 2024-25 Council Tax booklet say that the + scheme stays unchanged or that the council changed other provisions, except + for 2018-19, and the texts on either side keep the same para 12. The model + reads the list as at 30 April of each year. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year From db9cd7615ad345676002bd006af7fb00ca810403 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 11:19:50 +0000 Subject: [PATCH 26/43] Say Kingston upon Thames's decision registers omit some Council resolutions Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../enhanced_disability_premium/qualifying_benefits.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 8a6ebd079f..5d79536b1f 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -11,10 +11,11 @@ description: > 2016-17; and revised other provisions from April 2016 and April 2017. Its scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text records no council revision after December 2015, the council's decision - registers for 2017 to 2026 list no Council Tax Reduction decision, and its - 2023-24 budget report says the scheme "remains unchanged", so the model also - applies the list from 2018-19 to 2022-23, for which no text is cited. The - model reads the list as at 30 April of each year. + registers for 2017 to 2026 list no Council Tax Reduction decision (though + they omit some Council resolutions), and its 2023-24 budget report says the + scheme "remains unchanged", so the model also applies the list from 2018-19 + to 2022-23, for which no text is cited. The model reads the list as at 30 + April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year From 860a96c01b768e0d76a8aa5a4b140af86f3ed9ae Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 11:23:20 +0000 Subject: [PATCH 27/43] State the evidence and assumption for Westminster, and cite Newham's reports Westminster's documentation now gives what its resolutions and budget reports say and that no scheme text states the qualifying awards. Kingston upon Thames's and Newham's lists start before the model's first year, which the YAML header, the changelog, the variable documentation and the property test's comment now say. Newham's list cites the budget reports, minutes and booklet its description relies on. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 24 ++++++++++++++--- .../enhanced_disability_premium.yaml | 7 ++--- ..._enhanced_disability_premium_properties.py | 4 ++- ...n_enhanced_disability_premium_condition.py | 26 +++++++++++-------- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 590cf94765..f5b5d6c172 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. The model applies each council's list from the first scheme year a council text supports (2013-14 in Kingston upon Thames and Newham, 2023-24 in Merton) and the Housing Benefit condition before then. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. The model applies each council's list from the first scheme year a council text supports, and the Housing Benefit condition before then: Merton's from 2023-24, and Kingston upon Thames's and Newham's in every model year, since their texts support them from 2013-14. diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index f50663eb0c..fa8fd52d0a 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -9,10 +9,12 @@ description: > count the care component of child disability payment at the highest rate, for which the model has no separate variable. The council's texts for 2013, 2014, 2017, 2022, 2023 and 2026 set these lists. For the years between, the - council's budget reports and its 2024-25 Council Tax booklet say that the - scheme stays unchanged or that the council changed other provisions, except - for 2018-19, and the texts on either side keep the same para 12. The model - reads the list as at 30 April of each year. + council's budget reports say the scheme will remain unchanged (2015-16, + 2016-17) or propose no changes (2020-21, 2021-22), its 2024-25 Council Tax + booklet says the council is keeping the scheme in place, and its 2019-20 and + 2025-26 revisions changed other provisions; the texts on either side of each + of those years, and of 2018-19, keep the same para 12. The model reads the + list as at 30 April of each year. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -26,12 +28,26 @@ metadata: href: https://mgov.newham.gov.uk/documents/g9807/Printed%20minutes%2009th-Dec-2013%2020.00%20Council.pdf?T=1 - title: Council Tax Reduction Scheme 2014, Sch. 3 para. 12(1)(b), (c), (d) href: https://mgov.newham.gov.uk/documents/s85542/LB%20Newham%20Local%20CTR%20Scheme_1415_12_11_13A.pdf + - title: Budget proposals report (Council, 23 February 2015), appendix 1, para. 7.12 (the 2015/16 scheme "will remain unchanged") + href: https://mgov.newham.gov.uk/documents/s94929/Mayors%20Budget%20Proposals%20Report%20-%20appendix%201.pdf + - title: Budget proposals report (Council, 22 February 2016), para. 7.15 (the 2016/17 scheme "will remain unchanged") + href: https://mgov.newham.gov.uk/documents/s102326/Mayors%20Budget%20Proposals%20Report%20PDF.pdf - title: Council Tax Reduction Scheme 2017 (Appendix 1), Sch. 3 para. 12(1)(b), (c), (d) href: https://mgov.newham.gov.uk/documents/s110300/Appendix%201%20LB%20Newham%20Local%20CTR%20Scheme%201718.pdf + - title: Council, 18 February 2019, minutes (a lower minimum contribution from 1 April 2019) + href: https://mgov.newham.gov.uk/documents/g12186/Printed%20minutes%2018th-Feb-2019%2019.00%20Council.pdf?T=1 + - title: Budget report 2020-21 (Council, 2 March 2020), para. 4.31 ("No changes to the council tax support scheme are proposed in 2020/21") + href: https://mgov.newham.gov.uk/documents/s135762/Budget%20Report%202020-21%20to%202022-23.pdf + - title: Budget report 2021-22 (Council, 1 March 2021), para. 5.19 (no changes proposed) + href: https://mgov.newham.gov.uk/documents/s143898/210219%20Budget%20report%202021-22%20-%202023%20FINAL.pdf - title: Council, 28 February 2022, supplementary agenda (Council Tax Reduction Scheme 2022), Sch. 3 para. 12(1)(b), (c), (d) href: https://mgov.newham.gov.uk/documents/b31136/Supplementary%20Agenda%20-%20Council%20Tax%20Reduction%20Scheme%2028th-Feb-2022%2019.00%20Council.pdf?T=9 - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c), (d) href: https://www.newham.gov.uk/downloads/file/5876/council-tax-reduction-scheme-2023 + - title: Council Tax booklet 2024-25, Mayor's message ("keeping firmly in place the 90% council tax reduction scheme") + href: https://www.newham.gov.uk/downloads/file/7105/council-tax-2024-25-budget-booklet + - title: Budget setting report 2025-26 (Council, 27 February 2025), para. 8.5 (changes to maximum support, taper, capital limit and non-dependant deductions) + href: https://mgov.newham.gov.uk/documents/s179147/Final%20Budget%20Setting%20Report%20Full%20Councilx.pdf - title: Council Tax Reduction Scheme 2026, Sch. 3 para. 12(1)(n), (o), (p) href: https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026 values: diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 39cbfec877..9e2e06fd21 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -13,9 +13,10 @@ # AFIP (Newham's Council Tax Reduction Scheme 2026, Sch 3 para 12(1)). The # three London councils keep the qualifying age for State Pension Credit as # the age limit. The model applies each council's list from the first scheme -# year whose text supports it: 2013-14 in Kingston upon Thames and Newham -# (with AFIP from 2014-15), and 2023-24 in Merton (the 2023 rules). It applies -# the Housing Benefit condition in Merton before 2023 and in Westminster, and +# year whose text supports it: Merton's from 2023-24 (the 2023 rules), and +# Kingston upon Thames's and Newham's in every model year, since their texts +# support them from 2013-14 (Newham's with AFIP from 2014-15). It applies the +# Housing Benefit condition in Merton before 2023 and in Westminster, and # reads each year's rules at 30 April. # 2026-27 amounts: enhanced disability premium £22.00 single, £31.40 couple; # severe disability premium £86.05 single. diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 1c730c74f7..f7f2b9e94e 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -76,7 +76,9 @@ TOLERANCE = 1 # Each example builds one simulation with inputs for every year from 2015 to # 2030, so every example tests both sides of the Northern Ireland PIP date -# (2017), the Scottish changes (2023) and each council's first year. +# (2017), the Scottish changes (2023) and Merton's first year (2023). +# Kingston upon Thames's and Newham's lists start in 2013-14, before the +# model's first year, so the test checks them in every year. YEARS = list(range(2015, 2031)) # (country, local authority): None keeps the default local authority. PLACES = [ diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index 0dde5fa4f3..bda6202e69 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -23,20 +23,24 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "armed forces independence payment. Those three councils count an " "award only for a person under the qualifying age for State Pension " "Credit. The model applies each council's own list from the first " - "scheme year whose text supports it " - "(qualifying_benefits_in_effect): 2013-14 in Kingston upon Thames and " - "Newham, and 2023-24 in Merton. Before then, and in every other " - "scheme, it applies the Housing Benefit condition " + "scheme year whose text supports it (qualifying_benefits_in_effect): " + "Merton's from 2023-24, and Kingston upon Thames's and Newham's in " + "every model year, since their texts support them from 2013-14. " + "Before Merton's first year, and in every other scheme, it applies " + "the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " "2013/3029 Sch 7 para 12. Westminster City Council publishes a " - "2026-27 summary of its working-age scheme without the premium " - "conditions. Its Council's annual resolutions describe the scheme only " - "as based on the Default Scheme Regulations, with war pensions and " - "Armed Forces Compensation Scheme payments disregarded in full and, " - "from 2020, updated for the amendments to the Prescribed Requirements " - "Regulations, so the model assumes the Housing Benefit condition " - "there. " + "2026-27 summary of its working-age scheme without the premium's " + "qualifying awards. Its Council's annual resolutions describe the " + "scheme as based on the Default Scheme Regulations, with war pensions " + "and Armed Forces Compensation Scheme payments disregarded in full " + "and, from 2020, updated for the amendments to the Prescribed " + "Requirements Regulations, and its budget reports say it mirrors the " + "original Default Scheme Regulations; the council has also changed " + "provisions those descriptions leave out. No scheme text states the " + "qualifying awards, so the model assumes the Housing Benefit " + "condition there. " "Oxford City Council sets " "its working-age award from income bands, so the premium does not " "reach it." From 9b1cfcd736ed240d7a492361638d67e6ed576946 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 11:24:54 +0000 Subject: [PATCH 28/43] Narrow Kingston's and Newham's claims about the years between their texts Kingston upon Thames's 2023 text lists an Energy Bills Rebate disregard from April 2022 besides its footnoted December 2015 revisions, so the description says its footnotes cite only those revisions. Newham's texts on either side of each gap count the same DLA care, PIP daily living and armed forces independence payment awards, though the 2022 text adds a child disability payment head. The three list descriptions use "towards". Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../qualifying_benefits.yaml | 17 +++++++++-------- .../qualifying_benefits.yaml | 2 +- .../qualifying_benefits.yaml | 7 ++++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 5d79536b1f..01a070e0b6 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -2,20 +2,21 @@ description: > The Royal Borough of Kingston upon Thames counts the care component of disability living allowance at the highest rate and the daily living component of personal independence payment at either rate, for the applicant - or a member of the applicant's family, toward the enhanced disability + or a member of the applicant's family, towards the enhanced disability premium in its working-age Council Tax Reduction scheme. It omits armed forces independence payment, and counts each award only for a person under the qualifying age for State Pension Credit. The council made its scheme from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets this list; kept the scheme apart from uprating for 2014-15, 2015-16 and 2016-17; and revised other provisions from April 2016 and April 2017. Its - scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text - records no council revision after December 2015, the council's decision - registers for 2017 to 2026 list no Council Tax Reduction decision (though - they omit some Council resolutions), and its 2023-24 budget report says the - scheme "remains unchanged", so the model also applies the list from 2018-19 - to 2022-23, for which no text is cited. The model reads the list as at 30 - April of each year. + scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text's + footnotes cite only the December 2015 council revisions, and the only later + change it lists (an Energy Bills Rebate disregard from 1 April 2022) leaves + para 12 alone; the council's decision registers for 2017 to 2026 list no + Council Tax Reduction decision (though they omit some Council resolutions); + and its 2023-24 budget report says the scheme "remains unchanged". So the + model also applies the list from 2018-19 to 2022-23, for which it cites no + scheme text. The model reads the list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 61ab3add3c..d3a1d6f093 100644 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -2,7 +2,7 @@ description: > The London Borough of Merton counts the care component of disability living allowance at the highest rate and the daily living component of personal independence payment at either rate, for the applicant or a member of the - applicant's family, toward the enhanced disability premium in its + applicant's family, towards the enhanced disability premium in its working-age Council Tax Support scheme. It omits armed forces independence payment, and counts each award only for a person under the qualifying age for State Pension Credit. The council's scheme rules for 2023-24, 2025-26 and diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index fa8fd52d0a..b4e7a54cd3 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -2,7 +2,7 @@ description: > The London Borough of Newham counts the care component of disability living allowance at the highest rate and the daily living component of personal independence payment at either rate, for the applicant or a member of the - applicant's family, toward the enhanced disability premium in its + applicant's family, towards the enhanced disability premium in its working-age Council Tax Reduction scheme, and from 1 April 2014 armed forces independence payment. It counts each award only for a person under the qualifying age for State Pension Credit. Its scheme texts from 2022 also @@ -13,8 +13,9 @@ description: > 2016-17) or propose no changes (2020-21, 2021-22), its 2024-25 Council Tax booklet says the council is keeping the scheme in place, and its 2019-20 and 2025-26 revisions changed other provisions; the texts on either side of each - of those years, and of 2018-19, keep the same para 12. The model reads the - list as at 30 April of each year. + of those years, and of 2018-19, count the same DLA care, PIP daily living + and armed forces independence payment awards. The model reads the list as + at 30 April of each year. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year From 7ca20772f40e7240ac79e534db55a87f0bd2ce34 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 11:34:11 +0000 Subject: [PATCH 29/43] Cite Westminster's budget report and decision 1181 in the condition's references Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- ...eduction_enhanced_disability_premium_condition.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index bda6202e69..e6b5d68605 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -36,11 +36,11 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "scheme as based on the Default Scheme Regulations, with war pensions " "and Armed Forces Compensation Scheme payments disregarded in full " "and, from 2020, updated for the amendments to the Prescribed " - "Requirements Regulations, and its budget reports say it mirrors the " - "original Default Scheme Regulations; the council has also changed " - "provisions those descriptions leave out. No scheme text states the " - "qualifying awards, so the model assumes the Housing Benefit " - "condition there. " + "Requirements Regulations, and its budget reports since 2022 say it " + "mirrors the original Default Scheme Regulations; the council has also " + "changed provisions those descriptions leave out. No scheme text " + "states the qualifying awards, so the model assumes the Housing " + "Benefit condition there. " "Oxford City Council sets " "its working-age award from income bands, so the premium does not " "reach it." @@ -58,6 +58,8 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf", "https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026", "https://committees.westminster.gov.uk/mgAi.aspx?ID=22982", + "https://www.westminster.gov.uk/sites/default/files/media/documents/business-and-financial-planning-2026-27-to-2028-29.pdf", + "https://committees.westminster.gov.uk/ieDecisionDetails.aspx?ID=1181", ) def formula(person, period, parameters): From 6563f73e528d391ecdcb292e3d79fd1d6f1615fd Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 11:46:18 +0000 Subject: [PATCH 30/43] Say Kingston upon Thames's 2023 text cites no council revision after 2015 The 2023 text also lists the Prescribed Requirements amendments of 2016 to 2023, so its Energy Bills Rebate disregard is not the only later change it records. The description now says the text cites no council revision after December 2015 and that S.I. 2022/127 requires the disregard of every scheme from 2022-23, and the references cite that regulation. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01WR8LHdkxRDWigGnq9dxCbC --- .../qualifying_benefits.yaml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 01a070e0b6..718caf28f0 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -9,14 +9,15 @@ description: > from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets this list; kept the scheme apart from uprating for 2014-15, 2015-16 and 2016-17; and revised other provisions from April 2016 and April 2017. Its - scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text's - footnotes cite only the December 2015 council revisions, and the only later - change it lists (an Energy Bills Rebate disregard from 1 April 2022) leaves - para 12 alone; the council's decision registers for 2017 to 2026 list no - Council Tax Reduction decision (though they omit some Council resolutions); - and its 2023-24 budget report says the scheme "remains unchanged". So the - model also applies the list from 2018-19 to 2022-23, for which it cites no - scheme text. The model reads the list as at 30 April of each year. + scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text cites + no council revision after December 2015, and its Energy Bills Rebate + disregard from 1 April 2022, which S.I. 2022/127 requires of every scheme + from 2022-23, leaves para 12 alone; the council's decision registers for + 2017 to 2026 list no Council Tax Reduction decision (though they omit some + Council resolutions); and its 2023-24 budget report says the scheme + "remains unchanged". So the model also applies the list from 2018-19 to + 2022-23, for which it cites no scheme text. The model reads the list as at + 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -38,6 +39,8 @@ metadata: href: https://moderngov.kingston.gov.uk/mgConvert2PDF.aspx?ID=99625 - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf + - title: The Council Tax (Demand Notices and Reduction Schemes) (England) (Amendment) Regulations 2022, reg. 3 (energy rebate disregard in every scheme) + href: https://www.legislation.gov.uk/uksi/2022/127/regulation/3/made - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/downloads/Council_Tax_Reduction_Scheme_2024_2025.pdf - title: Council Tax Reduction Scheme 2025 - 2026, Sch. 3 para. 12(1)(b), (c) From 82501ec466998354bce4f041872ac688fa8d7269 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 05:51:05 +0000 Subject: [PATCH 31/43] Apply Merton's list from 2013 and Westminster's Default Scheme list, and drop the per-council switch Merton prints the Default Scheme's para 12(1) in its archived rules from 2013-14, and Westminster's Cabinet says its scheme mirrors the Default Scheme Regulations, so every council list now starts by 1 April 2013 and the qualifying_benefits_in_effect switches go. Cases 13 and 14 set is_disabled_for_benefits, and new cases cover Merton in 2015 and Westminster in 2015 and 2026. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6Fr7DqLnNz9mtyukPw --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 27 +- .../qualifying_benefits_in_effect.yaml | 19 - .../qualifying_benefits.yaml | 45 ++- .../qualifying_benefits_in_effect.yaml | 20 -- .../qualifying_benefits.yaml | 22 +- .../qualifying_benefits_in_effect.yaml | 18 - .../qualifying_benefits.yaml | 36 ++ .../enhanced_disability_premium.yaml | 325 +++++++++++++++--- ..._enhanced_disability_premium_properties.py | 63 ++-- .../gov/dwp/dla/has_highest_dla_sc_award.py | 4 +- ...aimants_or_partners_for_legacy_benefits.py | 13 +- .../gov/dwp/pip/has_enhanced_pip_dl_award.py | 4 +- ...x_reduction_enhanced_disability_premium.py | 16 +- ...n_enhanced_disability_premium_condition.py | 45 +-- 15 files changed, 447 insertions(+), 212 deletions(-) delete mode 100644 policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml delete mode 100644 policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml delete mode 100644 policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index f5b5d6c172..cdc5186146 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Kingston upon Thames count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. The model applies each council's list from the first scheme year a council text supports, and the Housing Benefit condition before then: Merton's from 2023-24, and Kingston upon Thames's and Newham's in every model year, since their texts support them from 2013-14. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 718caf28f0..840471ae30 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -8,16 +8,17 @@ description: > the qualifying age for State Pension Credit. The council made its scheme from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets this list; kept the scheme apart from uprating for 2014-15, 2015-16 and - 2016-17; and revised other provisions from April 2016 and April 2017. Its - scheme texts for 2023 to 2026-27 keep the same para 12. The 2023 text cites - no council revision after December 2015, and its Energy Bills Rebate - disregard from 1 April 2022, which S.I. 2022/127 requires of every scheme - from 2022-23, leaves para 12 alone; the council's decision registers for - 2017 to 2026 list no Council Tax Reduction decision (though they omit some - Council resolutions); and its 2023-24 budget report says the scheme - "remains unchanged". So the model also applies the list from 2018-19 to - 2022-23, for which it cites no scheme text. The model reads the list as at - 30 April of each year. + 2016-17; and revised other provisions from April 2016 and April 2017. It + keeps the same para 12 in its scheme texts for 2021-22, 2022-23 and 2023 to + 2026-27. In its 2021-22, 2022-23 and 2023 texts the council cites no + revision of its own after December 2015. In its 2023 text the Energy Bills + Rebate disregard it adds from 1 April 2022, which the Secretary of State + requires of every scheme from 2022-23 (S.I. 2022/127 reg 3), leaves para 12 + alone; the council's decision registers for 2017 to 2026 list no Council Tax + Reduction decision (though they omit some Council resolutions); and its + 2023-24 budget report says the scheme "remains unchanged". So the model + also applies the list from 2018-19 to 2020-21, for which it cites no + scheme text. The model reads the list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -35,10 +36,16 @@ metadata: href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 + - title: Council Tax Reduction Scheme 2021-2022 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20221206070019id_/https://www.kingston.gov.uk/downloads/file/616/council-tax-reduction-scheme-2021-2022 + - title: Council Tax Reduction Scheme 2022-2023 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20221206083043id_/https://www.kingston.gov.uk/downloads/file/513/council-tax-reduction-scheme-2022-2023 - title: Budget Report 2023/24 to 2026/27, para. 51 (the Council Tax Support Scheme "remains unchanged"), approved by Budget Council on 2 March 2023 href: https://moderngov.kingston.gov.uk/mgConvert2PDF.aspx?ID=99625 - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf + - title: Council Tax Reduction Scheme 2023, "Basis for the local scheme" (based on the Default Scheme Regulations) + href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf - title: The Council Tax (Demand Notices and Reduction Schemes) (England) (Amendment) Regulations 2022, reg. 3 (energy rebate disregard in every scheme) href: https://www.legislation.gov.uk/uksi/2022/127/regulation/3/made - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml deleted file mode 100644 index 9aac9d7762..0000000000 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml +++ /dev/null @@ -1,19 +0,0 @@ -description: > - If this is true, the model applies the Royal Borough of Kingston upon - Thames's own list (qualifying_benefits) to the enhanced disability premium - in its working-age Council Tax Reduction scheme; otherwise it applies the - Housing Benefit condition there - (receives_enhanced_disability_premium_qualifying_benefit), under the same - age limit. The council's resolutions support its own list from 2013-14, when - it adopted the Default Scheme, so the model applies the list in every year. -metadata: - label: Kingston upon Thames Council Tax Reduction enhanced disability premium own list in effect - period: year - unit: bool - reference: - - title: Council, 11 December 2012, item 42 (a scheme from 1 April 2013 adopting the Default Scheme) - href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744 - - title: Decision 2535, 17 December 2013 (the council adopted the Default Scheme for 2013/14) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 -values: - 2013-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index d3a1d6f093..cfb34f6099 100644 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -5,17 +5,48 @@ description: > applicant's family, towards the enhanced disability premium in its working-age Council Tax Support scheme. It omits armed forces independence payment, and counts each award only for a person under the qualifying age - for State Pension Credit. The council's scheme rules for 2023-24, 2025-26 and - 2026-27 set this list, and the model applies it from 2023-24 - (qualifying_benefits_in_effect). The council's website offers its 2023 rules - as its 2024-25 scheme, and the 2023 and 2025 rules set the same list, so the - model keeps it in 2024-25. The model reads the list as at 30 April of each - year. + for State Pension Credit. The council sets this list in its scheme rules for + 2013-14, 2014-15, 2015-16, 2020-21, 2021-22, 2022-23, 2023-24, 2025-26 and + 2026-27, and links its 2023 rules as its 2024-25 scheme. Its Cabinet and + Council reports for 2017/18 to 2020/21 say the Council continued the same + scheme through 2019/20, so the model also applies the list from 2016-17 to + 2019-20, for which it cites no scheme text. The model reads the list as at + 30 April of each year. metadata: label: Merton Council Tax Support enhanced disability premium qualifying benefits period: year unit: list reference: + - title: Council Tax Reduction Scheme L B Merton April 2013 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20150530202253id_/http://www.merton.gov.uk/council_tax_reduction_scheme_l_b_merton_april_2013_with_uprated_amounts_final_310113-2.pdf + - title: Council Tax Reduction Scheme L B Merton April 2014 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20150530203929id_/http://www.merton.gov.uk/council_tax_reduction_scheme_l_b_merton_april_2014_with_uprated_amounts_final_280114.pdf + - title: Council Tax Reduction Scheme L B Merton April 2015 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20150530203354id_/http://www.merton.gov.uk/council_tax_reduction_scheme_l_b_merton_april_2015_with_uprated_amounts_final_280115.pdf + - title: Cabinet report on the Council Tax Support Scheme 2017/18 (archived copy; the Council continued the same scheme) + href: https://web.archive.org/web/20240912160841id_/https://democracy.merton.gov.uk/documents/s15005/Council%20Tax%20Support%20Scheme.pdf + - title: Cabinet report on the Council Tax Support Scheme 2018/19, 13 November 2017 (archived copy) + href: https://web.archive.org/web/20250420052844id_/https://democracy.merton.gov.uk/documents/s20013/Council%20Tax%20Support%20Scheme%20Cabinet%20Report%201819.pdf + - title: Council report on the Council Tax Support Scheme 2018/19, 22 November 2017 (archived copy) + href: https://web.archive.org/web/20250513135239id_/https://democracy.merton.gov.uk/documents/s20163/Council%20Tax%20Support%20Scheme%20Full%20Council%20Report%201819.pdf + - title: Cabinet report on the Council Tax Support Scheme 2019/20 (archived copy) + href: https://web.archive.org/web/20220325065644id_/https://democracy.merton.gov.uk/documents/s25279/Council%20Tax%20Support%20Scheme%20and%20Council%20Tax%20Technical%20Reforms%20201920%20full%20Council%20eport.pdf + - title: Council report on the Council Tax Support Scheme 2019/20, 21 November 2018 (archived copy) + href: https://web.archive.org/web/20200919054918id_/https://democracy.merton.gov.uk/documents/s25438/Council%20Tax%20Support%20Scheme%20and%20Council%20Tax%20Technical%20Reforms%20201920%20full%20Council%20report%202.pdf + - title: Cabinet report on the Council Tax Support Scheme 2020/21, 11 November 2019 (archived copy) + href: https://web.archive.org/web/20220208235004id_/https://democracy.merton.gov.uk/documents/s30060/Council%20Tax%20Support%20Scheme%20202021.pdf + - title: Council report on the Council Tax Support Scheme 2020/21, 5 February 2020 (archived copy) + href: https://web.archive.org/web/20200928082644id_/https://democracy.merton.gov.uk/documents/s30950/Council%20Tax%20Support%20Sceme%20202021.pdf + - title: Council Tax Reduction Scheme L B Merton 2020-21 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20230207113512id_/https://www.merton.gov.uk/system/files?file=council20tax20reduction20scheme20l20b20merton20final20formatting20numbers202020-21.pdf + - title: Council Tax Reduction Scheme L B Merton 2021-22 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20240911170941id_/https://www.merton.gov.uk/system/files?file=council20tax20reduction20scheme20l20b20merton202021-2220final.pdf + - title: Council Tax Reduction Scheme L B Merton 2022-2023 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20230129084916id_/https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202022-2023.pdf + - title: Council Tax Reduction Scheme L B Merton 2022-2023 final (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20260117195021id_/https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202022-2023%20final.pdf + - title: Council Tax Reduction Scheme L B Merton 2023-24 (archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20240718130610id_/https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24.pdf - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2023, Sch. 3 para. 12(1)(b), (c) href: https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2025, Sch. 3 para. 12(1)(b), (c) @@ -23,6 +54,6 @@ metadata: - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2026, Sch. 3 para. 12(1)(b), (c) href: https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf values: - 2023-04-01: + 2013-04-01: - has_highest_dla_sc_award - pip_dl diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml deleted file mode 100644 index c00db5ce48..0000000000 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml +++ /dev/null @@ -1,20 +0,0 @@ -description: > - If this is true, the model applies the London Borough of Merton's own list - (qualifying_benefits) to the enhanced disability premium in its working-age - Council Tax Support scheme; otherwise it applies the Housing Benefit - condition there (receives_enhanced_disability_premium_qualifying_benefit), - under the same age limit. The council's scheme rules for 2023-24 are the - earliest text the model cites for its list, so the model applies the - Housing Benefit condition in Merton before 2023-24. -metadata: - label: Merton Council Tax Support enhanced disability premium own list in effect - period: year - unit: bool - reference: - - title: The London Borough of Merton Local Council Tax Support Scheme Rules 2023, Sch. 3 para. 12(1)(b), (c) - href: https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf - - title: The Housing Benefit Regulations 2006 Sch. 3 para. 15(1)(b), (c), (d) - href: https://www.legislation.gov.uk/uksi/2006/213/schedule/3/paragraph/15 -values: - 2013-04-01: false - 2023-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index b4e7a54cd3..52818af0fb 100644 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -5,17 +5,17 @@ description: > applicant's family, towards the enhanced disability premium in its working-age Council Tax Reduction scheme, and from 1 April 2014 armed forces independence payment. It counts each award only for a person under the - qualifying age for State Pension Credit. Its scheme texts from 2022 also - count the care component of child disability payment at the highest rate, - for which the model has no separate variable. The council's texts for 2013, - 2014, 2017, 2022, 2023 and 2026 set these lists. For the years between, the - council's budget reports say the scheme will remain unchanged (2015-16, - 2016-17) or propose no changes (2020-21, 2021-22), its 2024-25 Council Tax - booklet says the council is keeping the scheme in place, and its 2019-20 and - 2025-26 revisions changed other provisions; the texts on either side of each - of those years, and of 2018-19, count the same DLA care, PIP daily living - and armed forces independence payment awards. The model reads the list as - at 30 April of each year. + qualifying age for State Pension Credit. From its 2022 text the council + also counts the care component of child disability payment at the highest + rate, for which the model has no separate variable. The council sets these + lists in its texts for 2013, 2014, 2017, 2022, 2023 and 2026. For the years + between, the council says in its budget reports that the scheme will remain + unchanged (2015-16, 2016-17) or proposes no changes (2020-21, 2021-22), says + in its 2024-25 Council Tax booklet that it is keeping the scheme in place, + and changed other provisions in its 2019-20 and 2025-26 revisions; in its + texts on either side of each of those years, and of 2018-19, it counts the + same DLA care, PIP daily living and armed forces independence payment + awards. The model reads the list as at 30 April of each year. metadata: label: Newham Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml b/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml deleted file mode 100644 index 0d62594b22..0000000000 --- a/policyengine_uk/parameters/gov/local_authorities/newham/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_in_effect.yaml +++ /dev/null @@ -1,18 +0,0 @@ -description: > - If this is true, the model applies the London Borough of Newham's own list - (qualifying_benefits) to the enhanced disability premium in its working-age - Council Tax Reduction scheme; otherwise it applies the Housing Benefit - condition there (receives_enhanced_disability_premium_qualifying_benefit), - under the same age limit. The council's scheme texts support its own list - from 2013-14, so the model applies the list in every year. -metadata: - label: Newham Council Tax Reduction enhanced disability premium own list in effect - period: year - unit: bool - reference: - - title: Council, 24 January 2013, minutes (adopting the local scheme in Appendix 1 from 1 April 2013) - href: https://mgov.newham.gov.uk/documents/g9739/Printed%20minutes%2024th-Jan-2013%2018.00%20Council.pdf?T=1 - - title: Council Tax Reduction Scheme 2013 (Appendix 1), Sch. 3 para. 12(1)(b), (c) - href: https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf -values: - 2013-04-01: true diff --git a/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml new file mode 100644 index 0000000000..f9379c3faf --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/westminster/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -0,0 +1,36 @@ +description: > + The model counts the care component of disability living allowance at the + highest rate and the daily living component of personal independence + payment at either rate, for the applicant or a member of the applicant's + family, towards the enhanced disability premium in Westminster City + Council's working-age Council Tax Support scheme. It omits armed forces + independence payment, and counts each award only for a person under the + qualifying age for State Pension Credit. This is the Default Scheme's list + (S.I. 2012/2886 Sch 3 para 12). The council has approved the same scheme, + based on the Default Scheme Regulations, since 2013/14, and its Cabinet + says from December 2020 that the council's local scheme mirrors those + Regulations. The model cites no full Westminster scheme text. + The model reads the list as at 30 April of each year. +metadata: + label: Westminster Council Tax Support enhanced disability premium qualifying benefits + period: year + unit: list + reference: + - title: Report of the Cabinet, 10 December 2018, Council Tax (archived copy; the same scheme for 2019/20, based on the Default Scheme Regulations) + href: https://web.archive.org/web/20220927103652id_/https://committees.westminster.gov.uk/documents/s30518/Report%20of%20the%20Cabinet%20on%2010%20Dec%202018%20-%20Council%20Tax.pdf + - title: Statement of decision, Council Tax Discounts including Council Tax Local Reduction Scheme, 2020/21 (archived copy) + href: https://web.archive.org/web/20250501010325id_/https://committees.westminster.gov.uk/documents/d1138/Printed%20decision%20Council%20Tax%20Discounts%20including%20Council%20Tax%20Local%20Reduction%20Scheme%20and%20Council%20T.pdf?T=5 + - title: Report of the Cabinet, 14 December 2020, Council Tax Discounts (archived copy; the Default Scheme Regulations "are mirrored within the City Council's local scheme") + href: https://web.archive.org/web/20240621074656id_/https://committees.westminster.gov.uk/documents/s40219/Report%20of%20the%20Cabinet%2014%20December%202020%20-Council%20Tax%20Discounts.pdf + - title: Cabinet report, 13 December 2021, Council Tax Taxbase and Discounts (archived copy) + href: https://web.archive.org/web/20211205134208id_/https://committees.westminster.gov.uk/documents/s45385/Cabinet%20Report%20-%20Council%20Tax%20Taxbase%20and%20Discounts%20Report.pdf + - title: Cabinet report, 12 December 2022, Council Tax Discounts (archived copy) + href: https://web.archive.org/web/20230106164259id_/https://committees.westminster.gov.uk/documents/s50264/Council%20Tax%20Discounts.pdf + - title: Cabinet report, 11 December 2023, Council Tax Discounts including Council Tax Local Reduction Scheme (archived copy) + href: https://web.archive.org/web/20250207010503id_/https://committees.westminster.gov.uk/documents/s57091/Council%20Tax%20Discounts%20including%20Council%20Tax%20Local%20Reduction%20Scheme%20and%20Council%20Tax%20Base%20report.pdf + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 Sch. 3 para. 12 (as made) + href: https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made +values: + 2013-04-01: + - has_highest_dla_sc_award + - pip_dl diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 9e2e06fd21..c7542f3478 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -10,14 +10,19 @@ # rate and omit AFIP (Merton's Local Council Tax Support Scheme Rules 2026 and # Kingston upon Thames's Council Tax Reduction Scheme 2026 - 2027, Sch 3 para # 12(1)). Newham counts DLA care highest, PIP daily living at either rate and -# AFIP (Newham's Council Tax Reduction Scheme 2026, Sch 3 para 12(1)). The -# three London councils keep the qualifying age for State Pension Credit as -# the age limit. The model applies each council's list from the first scheme -# year whose text supports it: Merton's from 2023-24 (the 2023 rules), and -# Kingston upon Thames's and Newham's in every model year, since their texts -# support them from 2013-14 (Newham's with AFIP from 2014-15). It applies the -# Housing Benefit condition in Merton before 2023 and in Westminster, and -# reads each year's rules at 30 April. +# AFIP (Newham's Council Tax Reduction Scheme 2026, Sch 3 para 12(1)). In +# Westminster the model applies the Default Scheme's list (S.I. 2012/2886 Sch +# 3 para 12(1)): DLA care highest and PIP daily living at either rate, without +# AFIP. The four London councils keep the qualifying age for State Pension +# Credit as the age limit. Each council's list starts on or before 1 April +# 2013, so the model applies it in every model year, and reads each year's +# rules at 30 April. +# Unless a case sets `is_disabled_for_benefits`, it keeps its default, false, +# and the model pays no disability premium, although the schemes give one to +# a claimant under the qualifying age who receives these awards (for example +# HB Regs 2006 Sch 3 paras 12(a) and 13(1)(a)(i); Merton's rules Sch 3 paras +# 9(a) and 10(1)(a)(i)). In those cases the totals from +# `council_tax_reduction_premiums` down follow that default, not the schemes. # 2026-27 amounts: enhanced disability premium £22.00 single, £31.40 couple; # severe disability premium £86.05 single. @@ -288,7 +293,7 @@ # 1,800 - 20% of (12,000 - 9,443.20) = 1,800 - 511.36 = 1,288.64. simulated_council_tax_reduction_benunit: 1_288.64 -- name: Case 10, AFIP meets Newham's and Westminster's conditions but not Merton's or Kingston upon Thames's. +- name: Case 10, AFIP meets Newham's condition but not Merton's, Kingston upon Thames's or Westminster's. period: 2026 absolute_error_margin: 0.01 input: @@ -332,12 +337,12 @@ country: ENGLAND local_authority: WESTMINSTER output: - meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, true, true] + meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, true, false] # 22.00 * 52 = 1,144.00. - council_tax_reduction_enhanced_disability_premium: [0, 0, 1_144, 1_144] + council_tax_reduction_enhanced_disability_premium: [0, 0, 1_144, 0] enhanced_disability_premium: [1_144, 1_144, 1_144, 1_144] -- name: Case 11, standard PIP daily living meets the Merton, Kingston upon Thames and Newham conditions but not Westminster's. +- name: Case 11, standard PIP daily living meets the Merton, Kingston upon Thames, Newham and Westminster conditions. period: 2026 absolute_error_margin: 0.01 input: @@ -381,8 +386,8 @@ country: ENGLAND local_authority: WESTMINSTER output: - meets_council_tax_reduction_enhanced_disability_premium_condition: [true, true, true, false] - council_tax_reduction_enhanced_disability_premium: [1_144, 1_144, 1_144, 0] + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, true, true, true] + council_tax_reduction_enhanced_disability_premium: [1_144, 1_144, 1_144, 1_144] # Under HB para 15(1)(c), claimants qualify only at the enhanced rate. enhanced_disability_premium: [0, 0, 0, 0] @@ -427,21 +432,26 @@ meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, false, false] council_tax_reduction_enhanced_disability_premium: [0, 0] -- name: Case 13, Merton applies the Housing Benefit condition in 2022, before its own list starts. - # The 2023 rules are the earliest Merton scheme text the model cites, so in - # 2022 the model applies the Housing Benefit condition (HB Regs 2006 Sch 3 - # para 15(1)(c): the enhanced rate only). The case pins the 2022-23 energy +- name: Case 13, Merton's own list counts standard PIP daily living in 2022. + # Merton's scheme rules for 2022-23, Sch 3 para 12(1)(c), count the PIP + # daily living component at either rate. The case pins the 2022-23 energy # and cost of living payments at zero, so household net income moves only # with the reduction. 2022-23 rates: PIP daily living standard 61.85, - # personal allowance (25 or over) 77.00, severe disability premium 69.40. + # personal allowance (25 or over) 77.00, severe disability premium 69.40, + # disability premium 36.20, enhanced disability premium 17.75. period: 2022 absolute_error_margin: 0.01 + # The claimant receives PIP, so the case sets is_disabled_for_benefits for + # the disability premium (HB Regs 2006 Sch 3 paras 12(a) and 13(1)(a)(i); + # Merton's rules Sch 3 paras 9(a) and 10(1)(a)(i)). A pension of 12,500, + # below the 12,570 personal allowance, keeps the reduction on the taper. input: people: person1: age: 30 pip_dl_category: STANDARD - private_pension_income: 11_000 + is_disabled_for_benefits: true + private_pension_income: 12_500 benunits: benunit: members: [person1] @@ -460,34 +470,42 @@ energy_bills_rebate: 0 cost_of_living_support_payment: 0 output: + # The legacy premium counts the enhanced rate only. enhanced_disability_premium: 0 - meets_council_tax_reduction_enhanced_disability_premium_condition: false - council_tax_reduction_enhanced_disability_premium: 0 - # The severe disability premium alone: 69.40 * 52 = 3,608.80. - council_tax_reduction_premiums: 3_608.80 - # Personal allowance 77.00 * 52 = 4,004.00, plus 3,608.80: 7,612.80. - council_tax_reduction_applicable_amount: 7_612.80 - # 1,800 - 20% of (11,000 - 7,612.80) = 1,800 - 677.44 = 1,122.56. - council_tax_reduction: 1_122.56 - # Pension 11,000 + PIP 61.85 * 52 = 3,216.20 + reduction 1,122.56 - - # council tax 1,800 = 13,538.76. The pension falls below the 12,570 - # personal allowance, so the model charges no income tax. - household_net_income: 13_538.76 + meets_council_tax_reduction_enhanced_disability_premium_condition: true + # Merton's list counts the standard PIP daily living rate: 17.75 * 52 = 923.00. + council_tax_reduction_enhanced_disability_premium: 923 + # Severe disability premium 69.40 * 52 = 3,608.80, disability premium + # 36.20 * 52 = 1,882.40 and the enhanced disability premium 923.00: 6,414.20. + council_tax_reduction_premiums: 6_414.20 + # Personal allowance 77.00 * 52 = 4,004.00, plus 6,414.20: 10,418.20. + council_tax_reduction_applicable_amount: 10_418.20 + # 1,800 - 20% of (12,500 - 10,418.20) = 1,800 - 416.36 = 1,383.64. + council_tax_reduction: 1_383.64 + # Pension 12,500 + PIP 61.85 * 52 = 3,216.20 + reduction 1,383.64 - + # council tax 1,800 = 15,299.84. + household_net_income: 15_299.84 -- name: Case 14, Merton's own list counts standard PIP daily living from 2023, the year of its 2023 rules. +- name: Case 14, Merton's own list counts standard PIP daily living in 2023. # Merton's Local Council Tax Support Scheme Rules 2023, Sch 3 para 12(1)(c): # PIP daily living "payable at either rate". The case pins the 2023-24 energy # and cost of living payments at zero. 2023-24 rates: PIP daily living # standard 68.10, personal allowance (25 or over) 84.80, severe disability - # premium 76.40, enhanced disability premium 19.55. + # premium 76.40, disability premium 39.85, enhanced disability premium + # 19.55. period: 2023 absolute_error_margin: 0.01 + # The claimant receives PIP, so the case sets is_disabled_for_benefits for + # the disability premium (HB Regs 2006 Sch 3 paras 12(a) and 13(1)(a)(i); + # Merton's rules Sch 3 paras 9(a) and 10(1)(a)(i)). A pension of 12,500, + # below the 12,570 personal allowance, keeps the reduction on the taper. input: people: person1: age: 30 pip_dl_category: STANDARD - private_pension_income: 11_000 + is_disabled_for_benefits: true + private_pension_income: 12_500 benunits: benunit: members: [person1] @@ -511,14 +529,229 @@ meets_council_tax_reduction_enhanced_disability_premium_condition: true # 19.55 * 52 = 1,016.60. council_tax_reduction_enhanced_disability_premium: 1_016.60 - # Severe disability premium 76.40 * 52 = 3,972.80, plus 1,016.60: - # 4,989.40. - council_tax_reduction_premiums: 4_989.40 - # Personal allowance 84.80 * 52 = 4,409.60, plus 4,989.40: 9,399.00. - council_tax_reduction_applicable_amount: 9_399 - # 1,800 - 20% of (11,000 - 9,399.00) = 1,800 - 320.20 = 1,479.80. - council_tax_reduction: 1_479.80 - # Pension 11,000 + PIP 68.10 * 52 = 3,541.20 + reduction 1,479.80 - - # council tax 1,800 = 14,221.00. The pension falls below the 12,570 - # personal allowance, so the model charges no income tax. - household_net_income: 14_221 + # Severe disability premium 76.40 * 52 = 3,972.80, disability premium + # 39.85 * 52 = 2,072.20 and the enhanced disability premium 1,016.60: + # 7,061.60. + council_tax_reduction_premiums: 7_061.60 + # Personal allowance 84.80 * 52 = 4,409.60, plus 7,061.60: 11,471.20. + council_tax_reduction_applicable_amount: 11_471.20 + # 1,800 - 20% of (12,500 - 11,471.20) = 1,800 - 205.76 = 1,594.24. + council_tax_reduction: 1_594.24 + # Pension 12,500 + PIP 68.10 * 52 = 3,541.20 + reduction 1,594.24 - + # council tax 1,800 = 15,835.44. + household_net_income: 15_835.44 + +- name: Case 15, Merton's own list counts standard PIP daily living and omits AFIP in 2015. + # Merton's scheme rules for 2015-16, Sch 3 para 12(1)(b), (c), count the DLA + # care component at the highest rate and the PIP daily living component at + # either rate, and name no armed forces payment. 2015-16 rates: PIP daily + # living standard 55.10, personal allowance (25 or over) 73.10, severe + # disability premium 61.85, disability premium 32.25, enhanced disability + # premium 15.75. Each claimant receives PIP or AFIP, so the case sets + # is_disabled_for_benefits for the disability premium. A pension of 10,500, + # below the 10,600 personal allowance, keeps each reduction on the taper. + # The case pins the cost of living and energy payments at zero. + period: 2015 + absolute_error_margin: 0.01 + input: + people: + pip: + age: 30 + pip_dl_category: STANDARD + is_disabled_for_benefits: true + private_pension_income: 10_500 + afip: + age: 30 + armed_forces_independence_payment: 2_000 + is_disabled_for_benefits: true + private_pension_income: 10_500 + benunits: + pip: + members: [pip] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + afip: + members: [afip] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + pip: + members: [pip] + country: ENGLAND + local_authority: MERTON + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + afip: + members: [afip] + country: ENGLAND + local_authority: MERTON + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + output: + # The legacy premium counts AFIP (HB para 15(1)(d)) but not the standard + # PIP rate: 15.75 * 52 = 819.00. + enhanced_disability_premium: [0, 819] + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, false] + council_tax_reduction_enhanced_disability_premium: [819, 0] + # Severe disability premium 61.85 * 52 = 3,216.20 and disability premium + # 32.25 * 52 = 1,677.00: 4,893.20, plus 819.00 for PIP: 5,712.20. + council_tax_reduction_premiums: [5_712.20, 4_893.20] + # Personal allowance 73.10 * 52 = 3,801.20: 9,513.40 and 8,694.40. + council_tax_reduction_applicable_amount: [9_513.40, 8_694.40] + # 1,800 - 20% of (10,500 - 9,513.40) = 1,800 - 197.32 = 1,602.68; + # 1,800 - 20% of (10,500 - 8,694.40) = 1,800 - 361.12 = 1,438.88. + council_tax_reduction: [1_602.68, 1_438.88] + # Pension 10,500 + PIP 55.10 * 52 = 2,865.20 + 1,602.68 - 1,800 = + # 13,167.88. The model leaves AFIP out of household benefits + # (HOUSEHOLD_BENEFIT_VARIABLES), so 10,500 + 1,438.88 - 1,800 = 10,138.88. + household_net_income: [13_167.88, 10_138.88] + +- name: Case 16, Westminster's list counts standard PIP daily living and omits AFIP in 2015. + # The model applies the Default Scheme's list (S.I. 2012/2886 Sch 3 para + # 12(1)(b), (c)) in Westminster. 2015-16 rates as in Case 15; Westminster's + # maximum reduction (100%) and withdrawal rate (20%) match Merton's. + period: 2015 + absolute_error_margin: 0.01 + input: + people: + pip: + age: 30 + pip_dl_category: STANDARD + is_disabled_for_benefits: true + private_pension_income: 10_500 + afip: + age: 30 + armed_forces_independence_payment: 2_000 + is_disabled_for_benefits: true + private_pension_income: 10_500 + benunits: + pip: + members: [pip] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + afip: + members: [afip] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + pip: + members: [pip] + country: ENGLAND + local_authority: WESTMINSTER + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + afip: + members: [afip] + country: ENGLAND + local_authority: WESTMINSTER + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + output: + # 15.75 * 52 = 819.00. + enhanced_disability_premium: [0, 819] + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, false] + council_tax_reduction_enhanced_disability_premium: [819, 0] + # 3,216.20 + 1,677.00 = 4,893.20, plus 819.00 for PIP: 5,712.20. + council_tax_reduction_premiums: [5_712.20, 4_893.20] + # Plus the personal allowance 3,801.20: 9,513.40 and 8,694.40. + council_tax_reduction_applicable_amount: [9_513.40, 8_694.40] + # 1,800 - 20% of (10,500 - 9,513.40) = 1,602.68; + # 1,800 - 20% of (10,500 - 8,694.40) = 1,438.88. + council_tax_reduction: [1_602.68, 1_438.88] + # 10,500 + 2,865.20 + 1,602.68 - 1,800 = 13,167.88; + # 10,500 + 1,438.88 - 1,800 = 10,138.88, without AFIP as in Case 15. + household_net_income: [13_167.88, 10_138.88] + +- name: Case 17, Westminster's list counts standard PIP daily living and omits AFIP in 2026. + # 2026-27 rates: PIP daily living standard 76.70, personal allowance (under + # 25) 75.65, severe disability premium 86.05, disability premium 44.85, + # enhanced disability premium 22.00. Each claimant is aged 24, so the lower + # personal allowance keeps each applicable amount below a pension of 12,500, + # under the 12,570 personal allowance, and each reduction on the taper. + # The case pins the 2026-27 household energy payment and the earlier + # payments at zero. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pip: + age: 24 + pip_dl_category: STANDARD + is_disabled_for_benefits: true + private_pension_income: 12_500 + afip: + age: 24 + armed_forces_independence_payment: 2_000 + is_disabled_for_benefits: true + private_pension_income: 12_500 + benunits: + pip: + members: [pip] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + afip: + members: [afip] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + pip: + members: [pip] + country: ENGLAND + local_authority: WESTMINSTER + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + household_energy_payment: 0 + afip: + members: [afip] + country: ENGLAND + local_authority: WESTMINSTER + council_tax: 1_800 + savings: 0 + tv_licence: 0 + energy_bills_rebate: 0 + cost_of_living_support_payment: 0 + household_energy_payment: 0 + output: + # 22.00 * 52 = 1,144.00. + enhanced_disability_premium: [0, 1_144] + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, false] + council_tax_reduction_enhanced_disability_premium: [1_144, 0] + # Severe disability premium 86.05 * 52 = 4,474.60 and disability premium + # 44.85 * 52 = 2,332.20: 6,806.80, plus 1,144.00 for PIP: 7,950.80. + council_tax_reduction_premiums: [7_950.80, 6_806.80] + # Personal allowance 75.65 * 52 = 3,933.80: 11,884.60 and 10,740.60. + council_tax_reduction_applicable_amount: [11_884.60, 10_740.60] + # 1,800 - 20% of (12,500 - 11,884.60) = 1,800 - 123.08 = 1,676.92; + # 1,800 - 20% of (12,500 - 10,740.60) = 1,800 - 351.88 = 1,448.12. + council_tax_reduction: [1_676.92, 1_448.12] + # Pension 12,500 + PIP 76.70 * 52 = 3,988.40 + 1,676.92 - 1,800 = + # 16,365.32; pension 12,500 + 1,448.12 - 1,800 = 12,148.12, without AFIP + # as in Case 15. + household_net_income: [16_365.32, 12_148.12] diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index f7f2b9e94e..ba0dcc44d2 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -19,10 +19,11 @@ from 20 June 2022, which the model reads from 2023. Merton and Kingston upon Thames (Sch 3 para 12) count the PIP daily living component at either rate and omit AFIP; Newham counts the PIP daily living component at either rate -and AFIP. Each council's list applies from the first scheme year whose text -supports it (COUNCIL_LISTS). The model applies the Housing Benefit condition -in each of those councils before that year, and in Wales, Westminster and -every other scheme. +and AFIP. In Westminster the model applies the Default Scheme's list (S.I. +2012/2886 Sch 3 para 12), which counts the PIP daily living component at +either rate and omits AFIP. Each council's list starts on or before 1 April +2013 (COUNCIL_LISTS), so it applies in every model year. The model applies +the Housing Benefit condition in Wales and every other scheme. The test generates single people, couples and lone parents in the places and age range below, with the listed awards, and adds a family in each council @@ -42,19 +43,17 @@ exceeds two single rates; the couple rate never exceeds two single rates in any year. 5. The Council Tax Reduction premium equals the legacy premium in Wales, - Northern Ireland and English councils without their own list, and in - Scotland before 2023. It never falls below the legacy premium in Scotland - from 2023, or in a council whose own list counts AFIP (Newham's). Where a - council's own list omits AFIP (Merton's and Kingston upon Thames's), it - never falls below the legacy premium unless that premium rests on AFIP - alone, and then the model pays none unless an under-age member has a PIP - daily living award. + Northern Ireland, Oxford and the default English council, and in Scotland + before 2023. It never falls below the legacy premium in Scotland from + 2023, or where a council's own list counts AFIP (Newham's). Where a + council's own list omits AFIP (Merton's, Kingston upon Thames's and + Westminster's), it never falls below the legacy premium unless that + premium rests on AFIP alone, and then the model pays none unless an + under-age claimant or partner has a PIP daily living award. 6. For a child or young person in Great Britain, the qualifying flag matches the test's own calculation. The model pays the child's enhanced rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums) when the flag holds and pays none when it does not. -7. In each year before a council's own list starts, its Council Tax - Reduction premium equals the legacy premium. """ import numpy as np @@ -76,9 +75,9 @@ TOLERANCE = 1 # Each example builds one simulation with inputs for every year from 2015 to # 2030, so every example tests both sides of the Northern Ireland PIP date -# (2017), the Scottish changes (2023) and Merton's first year (2023). -# Kingston upon Thames's and Newham's lists start in 2013-14, before the -# model's first year, so the test checks them in every year. +# (2017) and the Scottish changes (2023). Every council's own list starts in +# 2013-14, before the model's first year, so the test checks each list in +# every year. YEARS = list(range(2015, 2031)) # (country, local authority): None keeps the default local authority. PLACES = [ @@ -118,14 +117,13 @@ } QUALIFYING_AWARDS = ["dla_care_highest", "pip_daily_living_enhanced", "afip"] ADULT_AGES = [20, 30, 45, 60, 64, 66, 67, 70, 85] -# Each council's own list (Sch 3 para 12 of its scheme), by the first scheme -# year whose text supports it: "dla_highest" is the DLA care component at the -# highest rate, "any_pip" the PIP daily living component at either rate and -# "afip" armed forces independence payment. Before a council's first year the -# model applies the Housing Benefit condition there. +# Each council's own list (Sch 3 para 12 of its scheme), by the scheme year +# it starts: "dla_highest" is the DLA care component at the highest rate, +# "any_pip" the PIP daily living component at either rate and "afip" armed +# forces independence payment. COUNCIL_LISTS = { - # The 2023 rules. - "MERTON": {2023: ("dla_highest", "any_pip")}, + # The 2013 rules. + "MERTON": {2013: ("dla_highest", "any_pip")}, # The Default Scheme, adopted for 2013-14. "KINGSTON_UPON_THAMES": {2013: ("dla_highest", "any_pip")}, # The 2013 scheme, and the 2014 scheme with AFIP. @@ -133,6 +131,9 @@ 2013: ("dla_highest", "any_pip"), 2014: ("dla_highest", "any_pip", "afip"), }, + # The Default Scheme: the council has approved the same scheme since + # 2013-14, and its Cabinet says the council's scheme mirrors it. + "WESTMINSTER": {2013: ("dla_highest", "any_pip")}, } system = CountryTaxBenefitSystem() @@ -191,8 +192,8 @@ def qualifies(inputs, country, year): def council_list(council, year): - """Return the awards on a council's own list in a year, or None before - the first scheme year whose text supports the list.""" + """Return the awards on a council's own list in a year, or None for a + council without one.""" starts = [start for start in COUNCIL_LISTS.get(council, {}) if start <= year] return COUNCIL_LISTS[council][max(starts)] if starts else None @@ -351,9 +352,6 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): assert np.isclose(ctr, edp, atol=0.01) else: assert ctr >= edp - 0.01 - elif council in COUNCIL_LISTS and listed is None: - # Invariant 7 covers a council before its own list starts. - return elif listed is None: assert np.isclose(ctr, edp, atol=0.01) elif "afip" in listed: @@ -375,14 +373,6 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): assert ctr == 0 -def check_before_list_starts(f, year, edp, ctr): - """Check invariant 7: before a council's own list starts, its premium - equals the legacy premium.""" - council = f["place"][1] - if council in COUNCIL_LISTS and council_list(council, year) is None: - assert np.isclose(ctr, edp, atol=0.01), (f, year, ctr, edp) - - def check_families(sim, person, benunit, families, year): n = len(families) // 2 edp = sim.calculate("enhanced_disability_premium", year) @@ -419,7 +409,6 @@ def check_families(sim, person, benunit, families, year): ) assert annual <= 2 * single_annual + 0.01 check_scheme_against_legacy(f, year, member_attained, edp[b], ctr[b]) - check_before_list_starts(f, year, edp[b], ctr[b]) # 3. Monotone: the test pairs each family in the first half with its twin # in the second half, which has a qualifying benefit added. assert all(t >= s - 0.01 for s, t in zip(family_edp[:n], family_edp[n:])) diff --git a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py index 2b3e49adb3..f6899e6060 100644 --- a/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py +++ b/policyengine_uk/variables/gov/dwp/dla/has_highest_dla_sc_award.py @@ -8,8 +8,8 @@ class has_highest_dla_sc_award(Variable): "living allowance at the highest rate when the person has a positive " "amount (dla_sc) and either the highest-rate category " "(dla_sc_category) or an amount that reaches 52 × (highest weekly " - "rate − weekly tolerance; gov.dwp.disability_premia.top_rate_" - "amount_tolerance). It rejects an amount of zero, including one that " + "rate − weekly tolerance), with the tolerance in " + "gov.dwp.disability_premia.top_rate_amount_tolerance. It rejects an amount of zero, including one that " "a reform sets by neutralising dla_sc. Claimants also qualify while " "the suspension or hospital rules stop or abate payment of the award " "(HB Regs 2006 Sch 3 para 15(1)(b)); the model has no input for that." diff --git a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py index f74ad80458..6ca2676bc6 100644 --- a/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py +++ b/policyengine_uk/variables/gov/dwp/num_enhanced_disabled_claimants_or_partners_for_legacy_benefits.py @@ -13,12 +13,13 @@ class num_enhanced_disabled_claimants_or_partners_for_legacy_benefits(Variable): "Housing Benefit and Jobseeker's Allowance Regulations, the Welsh " "Council Tax Reduction scheme and England's Default Scheme, the age " "limit applies to the claimant and to family members or partners. " - "Parliament limits Income Support to claimants under that age (SSCBA " - "1992 s.124(1)(aa) and SSCBA (NI) 1992 s.123(1)(aa)), and Parliament " - "and the Northern Ireland Assembly limit Employment and Support " - "Allowance to claimants under pensionable age (WRA 2007 s.1(3)(c) " - "and WRA (NI) 2007 s.1(3)(c)), so their Regulations state the age " - "limit only for the partner. The count leaves out children and young " + "Parliament and the Northern Ireland Assembly limit Income Support to " + "claimants under that age (SSCBA 1992 s.124(1)(aa); SSCBA (NI) 1992 " + "s.123(1)(aa), inserted by the State Pension Credit Act (Northern " + "Ireland) 2002) and Employment and Support Allowance to claimants " + "under pensionable age (WRA 2007 s.1(3)(c); WRA (NI) 2007 " + "s.1(3)(c)), so their Regulations state the age limit only for the " + "partner. The count leaves out children and young " "persons, whose separate enhanced premium the model computes for " "Housing Benefit only (housing_benefit_child_disability_premiums)." ) diff --git a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py index b4b43ac7e8..268c96c37d 100644 --- a/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py +++ b/policyengine_uk/variables/gov/dwp/pip/has_enhanced_pip_dl_award.py @@ -8,8 +8,8 @@ class has_enhanced_pip_dl_award(Variable): "independence payment at the enhanced rate when the person has a " "positive amount (pip_dl) and either the enhanced-rate category " "(pip_dl_category) or an amount that reaches 52 × (enhanced weekly " - "rate − weekly tolerance; gov.dwp.disability_premia.top_rate_" - "amount_tolerance). It rejects an amount of zero, including one that " + "rate − weekly tolerance), with the tolerance in " + "gov.dwp.disability_premia.top_rate_amount_tolerance. It rejects an amount of zero, including one that " "a reform sets by neutralising pip_dl. Claimants also qualify when the " "hospital in-patient rules end payment of the award (HB Regs 2006 Sch " "3 para 15(1)(c)); the model has no input for that." diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index fab93371b9..21cd435fc8 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -12,10 +12,9 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "scheme's condition " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " "It pays a different premium from the legacy one " - "(enhanced_disability_premium) in Scotland, Kingston upon Thames, " - "Newham and, from 2023-24, Merton, where the councils count their own " - "awards. The " - "model pays the Housing Benefit amounts in every scheme. Both 2026-27 " + "(enhanced_disability_premium) in Scotland, Merton, Kingston upon " + "Thames, Newham and Westminster, where the scheme counts its own " + "awards. The model pays the Housing Benefit amounts in every scheme. Both 2026-27 " "editions of Kingston upon Thames's scheme print £17.10 single and " "£24.50 couple (Sch 3 para 17(5)), and their introductions say the " "council uprates premiums as set out in the Prescribed Requirement " @@ -25,9 +24,12 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "3, under which it takes working-age amounts from the Government's " "general uprating documents where the pension-age uprating lacks " "them; the 2026 pension-age uprating (S.I. 2026/27) has no adult " - "enhanced premium. The model " - "reads that mechanism as giving the Housing Benefit amounts; we found " - "no decision that sets Kingston's own 2026-27 amounts. Pension-age " + "enhanced premium. The model reads that mechanism as giving the " + "Housing Benefit amounts, although the council's texts for 2021-22 to " + "2024-25 uprate the working-age personal allowances to the Housing " + "Benefit rates and keep this premium at its April 2020 rates; no " + "decision the model cites sets Kingston's own 2026-27 amounts. " + "Pension-age " "Council Tax Reduction includes no adult enhanced disability premium." ) definition_period = YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index e6b5d68605..b3f0d3e16b 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -4,6 +4,7 @@ is_merton_area, is_newham_area, is_scotland_scheme, + is_westminster_area, ) @@ -20,36 +21,28 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "2022. Merton and Kingston upon Thames count the PIP daily living " "component at either rate and omit armed forces independence payment; " "Newham counts the PIP daily living component at either rate and " - "armed forces independence payment. Those three councils count an " - "award only for a person under the qualifying age for State Pension " - "Credit. The model applies each council's own list from the first " - "scheme year whose text supports it (qualifying_benefits_in_effect): " - "Merton's from 2023-24, and Kingston upon Thames's and Newham's in " - "every model year, since their texts support them from 2013-14. " - "Before Merton's first year, and in every other scheme, it applies " - "the Housing Benefit condition " + "armed forces independence payment. In Westminster the model applies " + "the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12), which " + "counts the PIP daily living component at either rate and omits armed " + "forces independence payment: the council has approved the same " + "scheme, based on the Default Scheme Regulations, since 2013/14, and " + "its Cabinet says from December 2020 that its local scheme mirrors " + "those Regulations, though the model cites no full Westminster scheme " + "text. Those four councils count an award only for a person under the " + "qualifying age for State Pension Credit, and each list starts on or " + "before 1 April 2013, so the model applies it in every model year. In " + "every other scheme the model applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " - "2013/3029 Sch 7 para 12. Westminster City Council publishes a " - "2026-27 summary of its working-age scheme without the premium's " - "qualifying awards. Its Council's annual resolutions describe the " - "scheme as based on the Default Scheme Regulations, with war pensions " - "and Armed Forces Compensation Scheme payments disregarded in full " - "and, from 2020, updated for the amendments to the Prescribed " - "Requirements Regulations, and its budget reports since 2022 say it " - "mirrors the original Default Scheme Regulations; the council has also " - "changed provisions those descriptions leave out. No scheme text " - "states the qualifying awards, so the model assumes the Housing " - "Benefit condition there. " - "Oxford City Council sets " - "its working-age award from income bands, so the premium does not " - "reach it." + "2013/3029 Sch 7 para 12. Oxford City Council sets its working-age " + "award from income bands, so the premium does not reach it." ) definition_period = YEAR reference = ( "https://www.legislation.gov.uk/ssi/2021/249/schedule/1/paragraph/14", "https://www.legislation.gov.uk/ssi/2012/303/schedule/1/paragraph/12/2021-04-01", "https://www.legislation.gov.uk/wsi/2013/3029/schedule/7/paragraph/12", + "https://web.archive.org/web/20150530202253id_/http://www.merton.gov.uk/council_tax_reduction_scheme_l_b_merton_april_2013_with_uprated_amounts_final_310113-2.pdf", "https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf", "https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf", "https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744", @@ -57,6 +50,7 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf", "https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf", "https://www.newham.gov.uk/downloads/file/10753/council-tax-reduction-scheme-2026", + "https://web.archive.org/web/20240621074656id_/https://committees.westminster.gov.uk/documents/s40219/Report%20of%20the%20Cabinet%2014%20December%202020%20-Council%20Tax%20Discounts.pdf", "https://committees.westminster.gov.uk/mgAi.aspx?ID=22982", "https://www.westminster.gov.uk/sites/default/files/media/documents/business-and-financial-planning-2026-27-to-2028-29.pdf", "https://committees.westminster.gov.uk/ieDecisionDetails.aspx?ID=1181", @@ -79,10 +73,7 @@ def receives(benefits): def council_condition(council): p = council.council_tax_reduction.enhanced_disability_premium - own_list = receives(p.qualifying_benefits) & under_age - # Before the first scheme year whose text supports the council's - # own list, the model applies the Housing Benefit condition. - return where(p.qualifying_benefits_in_effect, own_list, housing_benefit) + return receives(p.qualifying_benefits) & under_age p = la.scotland.council_tax_reduction.working_age.enhanced_disability_premium scottish = receives(p.qualifying_benefits) & ( @@ -94,12 +85,14 @@ def council_condition(council): is_merton_area(local_authority, country), is_kingston_upon_thames_area(local_authority, country), is_newham_area(local_authority, country), + is_westminster_area(local_authority, country), ], [ scottish, council_condition(la.merton), council_condition(la.kingston_upon_thames), council_condition(la.newham), + council_condition(la.westminster), ], default=housing_benefit, ) From 8e9ddaeb4069c91b99ba93c29399e7cd3bc57297 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 5 Nov 2026 06:50:22 +0000 Subject: [PATCH 32/43] Name the council as the actor in the Merton and Kingston list descriptions Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6Fr7DqLnNz9mtyukPw --- .../qualifying_benefits.yaml | 7 ++++--- .../qualifying_benefits.yaml | 10 +++++----- .../enhanced_disability_premium.yaml | 7 ++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 840471ae30..777a3ebe75 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -14,9 +14,10 @@ description: > revision of its own after December 2015. In its 2023 text the Energy Bills Rebate disregard it adds from 1 April 2022, which the Secretary of State requires of every scheme from 2022-23 (S.I. 2022/127 reg 3), leaves para 12 - alone; the council's decision registers for 2017 to 2026 list no Council Tax - Reduction decision (though they omit some Council resolutions); and its - 2023-24 budget report says the scheme "remains unchanged". So the model + alone; the council lists no Council Tax Reduction decision in its decision + registers for 2017 to 2026 (though it leaves some Council resolutions out + of them); and in its 2023-24 budget report it says the scheme "remains + unchanged". So the model also applies the list from 2018-19 to 2020-21, for which it cites no scheme text. The model reads the list as at 30 April of each year. metadata: diff --git a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index cfb34f6099..c5b835d9eb 100644 --- a/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/merton/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -7,11 +7,11 @@ description: > payment, and counts each award only for a person under the qualifying age for State Pension Credit. The council sets this list in its scheme rules for 2013-14, 2014-15, 2015-16, 2020-21, 2021-22, 2022-23, 2023-24, 2025-26 and - 2026-27, and links its 2023 rules as its 2024-25 scheme. Its Cabinet and - Council reports for 2017/18 to 2020/21 say the Council continued the same - scheme through 2019/20, so the model also applies the list from 2016-17 to - 2019-20, for which it cites no scheme text. The model reads the list as at - 30 April of each year. + 2026-27, and links its 2023 rules as its 2024-25 scheme. In its Cabinet and + Council reports for 2017/18 to 2020/21 the council says it continued the + same scheme through 2019/20, so the model also applies the list from + 2016-17 to 2019-20, for which it cites no scheme text. The model reads the + list as at 30 April of each year. metadata: label: Merton Council Tax Support enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index c7542f3478..7d62752eda 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -685,9 +685,10 @@ - name: Case 17, Westminster's list counts standard PIP daily living and omits AFIP in 2026. # 2026-27 rates: PIP daily living standard 76.70, personal allowance (under # 25) 75.65, severe disability premium 86.05, disability premium 44.85, - # enhanced disability premium 22.00. Each claimant is aged 24, so the lower - # personal allowance keeps each applicable amount below a pension of 12,500, - # under the 12,570 personal allowance, and each reduction on the taper. + # enhanced disability premium 22.00. Each claimant, aged 24, takes the lower + # personal allowance, which keeps each applicable amount below a pension of + # 12,500, under the 12,570 personal allowance, and each reduction on the + # taper. # The case pins the 2026-27 household energy payment and the earlier # payments at zero. period: 2026 From d74ea3d92bf1f2c770a8a95a176569e7fe707b7d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 09:57:16 -0500 Subject: [PATCH 33/43] Credit Kingston's uprating fallback to decision 2535 The documentation put the fallback in Annex 3 of the July 2014 report. Decision 2535 of December 2013 names the sources, and the record holds no copy of Annex 3. Co-Authored-By: Claude Opus 5.5 --- ...ncil_tax_reduction_enhanced_disability_premium.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index 21cd435fc8..ac4a65295c 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -19,12 +19,12 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "£24.50 couple (Sch 3 para 17(5)), and their introductions say the " "council uprates premiums as set out in the Prescribed Requirement " "Scheme. In December 2013 the council delegated each year's uprating, " - "and the choice of its sources, to its Director of Finance. In July " - "2014 it kept its scheme for 2015-17 apart from the uprating in Annex " - "3, under which it takes working-age amounts from the Government's " - "general uprating documents where the pension-age uprating lacks " - "them; the 2026 pension-age uprating (S.I. 2026/27) has no adult " - "enhanced premium. The model reads that mechanism as giving the " + "and the choice of its sources, to its Director of Finance, naming " + "the Government's general uprating documents where the pension-age " + "uprating lacks the detail. In July 2014 it kept its scheme for " + "2015-17 apart from a general uprating. The 2026 pension-age uprating " + "(S.I. 2026/27) has no adult enhanced premium. The model reads that " + "mechanism as giving the " "Housing Benefit amounts, although the council's texts for 2021-22 to " "2024-25 uprate the working-age personal allowances to the Housing " "Benefit rates and keep this premium at its April 2020 rates; no " From 7ab43a5b5657505e9ae5888823a560f34b71985e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 18:07:36 -0500 Subject: [PATCH 34/43] Keep the Housing Benefit list for Kingston in 2018-19 to 2022-23 No complete Kingston scheme text binds those years: none survives for 2018-19 to 2020-21, and the archived 2021-22 and 2022-23 copies stop before the age condition. A Kingston parameter now gates the council's own list, which applies in 2013-14 to 2017-18 and from 2023-24. Tests cover AFIP in 2017, 2020, 2022 and 2024, highest-rate DLA care in 2020, and Merton in 2020. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 27 +++-- .../qualifying_benefits_apply.yaml | 39 +++++++ .../enhanced_disability_premium.yaml | 104 +++++++++++++++++- ...n_enhanced_disability_premium_condition.py | 10 +- 5 files changed, 163 insertions(+), 19 deletions(-) create mode 100644 policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index cdc5186146..7ef6705b0b 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. Apply Kingston upon Thames's own list in 2013-14 to 2017-18 and from 2023-24, and keep the Housing Benefit list in 2018-19 to 2022-23 because no complete scheme text for those years survives. diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 777a3ebe75..78f3616330 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -8,18 +8,21 @@ description: > the qualifying age for State Pension Credit. The council made its scheme from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets this list; kept the scheme apart from uprating for 2014-15, 2015-16 and - 2016-17; and revised other provisions from April 2016 and April 2017. It - keeps the same para 12 in its scheme texts for 2021-22, 2022-23 and 2023 to - 2026-27. In its 2021-22, 2022-23 and 2023 texts the council cites no - revision of its own after December 2015. In its 2023 text the Energy Bills - Rebate disregard it adds from 1 April 2022, which the Secretary of State - requires of every scheme from 2022-23 (S.I. 2022/127 reg 3), leaves para 12 - alone; the council lists no Council Tax Reduction decision in its decision + 2016-17; and revised other provisions from April 2016 and April 2017. Its + truncated 2021-22 and 2022-23 scheme copies show the qualifying benefit + list but stop before the age condition. It keeps the same para 12 in its + scheme texts for 2023 to 2026-27. In its 2021-22, 2022-23 and 2023 texts + the council cites no revision of its own after December 2015. In its 2023 + text the Energy Bills Rebate disregard it adds from 1 April 2022, which + the Secretary of State requires of every scheme from 2022-23 (S.I. + 2022/127 reg 3), leaves para 12 alone; the council lists no Council Tax + Reduction decision in its decision registers for 2017 to 2026 (though it leaves some Council resolutions out of them); and in its 2023-24 budget report it says the scheme "remains - unchanged". So the model - also applies the list from 2018-19 to 2020-21, for which it cites no - scheme text. The model reads the list as at 30 April of each year. + unchanged". The model applies the list in 2013-14 to 2017-18 and from + 2023-24. It keeps the Housing Benefit list in 2018-19 to 2022-23 because + no complete scheme text for those years survives. The model reads the + list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year @@ -37,9 +40,9 @@ metadata: href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 - - title: Council Tax Reduction Scheme 2021-2022 (archived copy), Sch. 3 para. 12(1)(b), (c) + - title: Council Tax Reduction Scheme 2021-2022 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) href: https://web.archive.org/web/20221206070019id_/https://www.kingston.gov.uk/downloads/file/616/council-tax-reduction-scheme-2021-2022 - - title: Council Tax Reduction Scheme 2022-2023 (archived copy), Sch. 3 para. 12(1)(b), (c) + - title: Council Tax Reduction Scheme 2022-2023 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) href: https://web.archive.org/web/20221206083043id_/https://www.kingston.gov.uk/downloads/file/513/council-tax-reduction-scheme-2022-2023 - title: Budget Report 2023/24 to 2026/27, para. 51 (the Council Tax Support Scheme "remains unchanged"), approved by Budget Council on 2 March 2023 href: https://moderngov.kingston.gov.uk/mgConvert2PDF.aspx?ID=99625 diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml new file mode 100644 index 0000000000..f19dccb31d --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml @@ -0,0 +1,39 @@ +description: > + If this is true, the model applies Kingston upon Thames's own qualifying + benefit list for the enhanced disability premium in its working-age + Council Tax Reduction scheme. The model applies that list in 2013-14 to + 2017-18 and from 2023-24. It keeps the Housing Benefit list in 2018-19 to + 2022-23 because no complete scheme text for those years survives. The model + reads this parameter as at 30 April of each year, like the qualifying + benefit list. +metadata: + label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits apply + period: year + unit: bool + reference: + - title: Council, 11 December 2012, item 42 (a scheme from 1 April 2013 adopting the Default Scheme) + href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744 + - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 Sch. 3 para. 12 (as made) + href: https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made + - title: Decision 2535, 17 December 2013 (2014/15 the same as 2013/14 apart from uprating) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 + - title: Decision 2707, 16 July 2014 (2015/16 and 2016/17 unchanged apart from uprating) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 + - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) + href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 + - title: Council Tax Reduction Scheme 2021-2022 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20221206070019id_/https://www.kingston.gov.uk/downloads/file/616/council-tax-reduction-scheme-2021-2022 + - title: Council Tax Reduction Scheme 2022-2023 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) + href: https://web.archive.org/web/20221206083043id_/https://www.kingston.gov.uk/downloads/file/513/council-tax-reduction-scheme-2022-2023 + - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf + - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/downloads/Council_Tax_Reduction_Scheme_2024_2025.pdf + - title: Council Tax Reduction Scheme 2025 - 2026, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/2025-04/Council_Tax_Reduction_Scheme_2025_26.pdf + - title: Council Tax Reduction Scheme 2026 - 2027, Sch. 3 para. 12(1)(b), (c) + href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf +values: + 2013-04-01: true + 2018-04-01: false + 2023-04-01: true diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 7d62752eda..4a810f7226 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -14,9 +14,11 @@ # Westminster the model applies the Default Scheme's list (S.I. 2012/2886 Sch # 3 para 12(1)): DLA care highest and PIP daily living at either rate, without # AFIP. The four London councils keep the qualifying age for State Pension -# Credit as the age limit. Each council's list starts on or before 1 April -# 2013, so the model applies it in every model year, and reads each year's -# rules at 30 April. +# Credit as the age limit. The model applies Kingston's list in 2013-14 to +# 2017-18 and from 2023-24, and keeps the Housing Benefit list in 2018-19 to +# 2022-23 because no complete scheme text for those years survives. The +# other councils' lists apply in every model year. The model reads each +# year's rules at 30 April. # Unless a case sets `is_disabled_for_benefits`, it keeps its default, false, # and the model pays no disability premium, although the schemes give one to # a claimant under the qualifying age who receives these awards (for example @@ -756,3 +758,99 @@ # 16,365.32; pension 12,500 + 1,448.12 - 1,800 = 12,148.12, without AFIP # as in Case 15. household_net_income: [16_365.32, 12_148.12] + +- name: Case 18, Kingston keeps the Housing Benefit condition for AFIP in 2020. + period: 2020 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # Kingston's list does not apply; the GB Housing Benefit list counts AFIP. + meets_council_tax_reduction_enhanced_disability_premium_condition: true + +- name: Case 19, Kingston keeps the Housing Benefit condition for AFIP in 2022. + period: 2022 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # Kingston's list does not apply; the GB Housing Benefit list counts AFIP. + meets_council_tax_reduction_enhanced_disability_premium_condition: true + +- name: Case 20, Kingston's own list omits AFIP in 2017. + period: 2017 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # Kingston's list applies and counts only highest DLA care or PIP daily living. + meets_council_tax_reduction_enhanced_disability_premium_condition: false + +- name: Case 21, Kingston's own list omits AFIP in 2024. + period: 2024 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # Kingston's list applies and counts only highest DLA care or PIP daily living. + meets_council_tax_reduction_enhanced_disability_premium_condition: false + +- name: Case 22, Kingston keeps the Housing Benefit condition for highest DLA care in 2020. + period: 2020 + input: + people: + person1: + age: 30 + dla_sc_category: HIGHER + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # The GB Housing Benefit list counts has_highest_dla_sc_award. + meets_council_tax_reduction_enhanced_disability_premium_condition: true + +- name: Case 23, Merton's own list still omits AFIP in 2020. + period: 2020 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: MERTON + output: + # Merton's list still counts only highest DLA care or PIP daily living. + meets_council_tax_reduction_enhanced_disability_premium_condition: false diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index b3f0d3e16b..d10d6c4f9d 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -29,8 +29,11 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "its Cabinet says from December 2020 that its local scheme mirrors " "those Regulations, though the model cites no full Westminster scheme " "text. Those four councils count an award only for a person under the " - "qualifying age for State Pension Credit, and each list starts on or " - "before 1 April 2013, so the model applies it in every model year. In " + "qualifying age for State Pension Credit. The model applies Kingston's " + "list in 2013-14 to 2017-18 and from 2023-24, and keeps the Housing " + "Benefit list in 2018-19 to 2022-23 because no complete scheme text " + "for those years survives. The other three councils' lists start on " + "or before 1 April 2013 and apply in every model year. In " "every other scheme the model applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " @@ -83,7 +86,8 @@ def council_condition(council): [ is_scotland_scheme(country), is_merton_area(local_authority, country), - is_kingston_upon_thames_area(local_authority, country), + is_kingston_upon_thames_area(local_authority, country) + & la.kingston_upon_thames.council_tax_reduction.enhanced_disability_premium.qualifying_benefits_apply, is_newham_area(local_authority, country), is_westminster_area(local_authority, country), ], From 13da5f66a3e7bd1ab4af1159f5af700be942f230 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 19:57:30 -0500 Subject: [PATCH 35/43] Give the premium property test's oracle Kingston's gap years The oracle now applies the Housing Benefit condition for Kingston upon Thames in 2018-19 to 2022-23, as the model does, and invariant 5 names those years among the places where the two premiums match. Co-Authored-By: Claude Opus 5.5 --- ..._enhanced_disability_premium_properties.py | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index ba0dcc44d2..9154690a2c 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -22,8 +22,10 @@ and AFIP. In Westminster the model applies the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12), which counts the PIP daily living component at either rate and omits AFIP. Each council's list starts on or before 1 April -2013 (COUNCIL_LISTS), so it applies in every model year. The model applies -the Housing Benefit condition in Wales and every other scheme. +2013 (COUNCIL_LISTS) and applies in every model year, except that for +Kingston upon Thames the model applies the Housing Benefit condition in +2018-19 to 2022-23, for which no complete scheme text survives. The model +also applies the Housing Benefit condition in Wales and every other scheme. The test generates single people, couples and lone parents in the places and age range below, with the listed awards, and adds a family in each council @@ -43,10 +45,10 @@ exceeds two single rates; the couple rate never exceeds two single rates in any year. 5. The Council Tax Reduction premium equals the legacy premium in Wales, - Northern Ireland, Oxford and the default English council, and in Scotland - before 2023. It never falls below the legacy premium in Scotland from - 2023, or where a council's own list counts AFIP (Newham's). Where a - council's own list omits AFIP (Merton's, Kingston upon Thames's and + Northern Ireland, Oxford and the default English council, in Scotland + before 2023, and in Kingston upon Thames in 2018-19 to 2022-23. It never + falls below the legacy premium in Scotland from 2023, or where a council's + own list counts AFIP (Newham's). Where a council's own list omits AFIP (Merton's, Kingston upon Thames's and Westminster's), it never falls below the legacy premium unless that premium rests on AFIP alone, and then the model pays none unless an under-age claimant or partner has a PIP daily living award. @@ -120,12 +122,19 @@ # Each council's own list (Sch 3 para 12 of its scheme), by the scheme year # it starts: "dla_highest" is the DLA care component at the highest rate, # "any_pip" the PIP daily living component at either rate and "afip" armed -# forces independence payment. +# forces independence payment. None marks years where the model applies the +# Housing Benefit condition instead. COUNCIL_LISTS = { # The 2013 rules. "MERTON": {2013: ("dla_highest", "any_pip")}, - # The Default Scheme, adopted for 2013-14. - "KINGSTON_UPON_THAMES": {2013: ("dla_highest", "any_pip")}, + # The Default Scheme, adopted for 2013-14. No complete scheme text for + # 2018-19 to 2022-23 survives, so the model applies the Housing Benefit + # condition in those years. + "KINGSTON_UPON_THAMES": { + 2013: ("dla_highest", "any_pip"), + 2018: None, + 2023: ("dla_highest", "any_pip"), + }, # The 2013 scheme, and the 2014 scheme with AFIP. "NEWHAM": { 2013: ("dla_highest", "any_pip"), @@ -192,8 +201,8 @@ def qualifies(inputs, country, year): def council_list(council, year): - """Return the awards on a council's own list in a year, or None for a - council without one.""" + """Return the awards on a council's own list in a year, or None where + the model applies the Housing Benefit condition.""" starts = [start for start in COUNCIL_LISTS.get(council, {}) if start <= year] return COUNCIL_LISTS[council][max(starts)] if starts else None From 191683edcf701273ae80880720c34649cec1343a Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 19:57:43 -0500 Subject: [PATCH 36/43] Rewrap invariant 5 in the premium property test Co-Authored-By: Claude Opus 5.5 --- .../tests/test_enhanced_disability_premium_properties.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 9154690a2c..dfc543683f 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -48,8 +48,8 @@ Northern Ireland, Oxford and the default English council, in Scotland before 2023, and in Kingston upon Thames in 2018-19 to 2022-23. It never falls below the legacy premium in Scotland from 2023, or where a council's - own list counts AFIP (Newham's). Where a council's own list omits AFIP (Merton's, Kingston upon Thames's and - Westminster's), it never falls below the legacy premium unless that + own list counts AFIP (Newham's). Where a council's own list omits AFIP + (Merton's, Kingston upon Thames's and Westminster's), it never falls below the legacy premium unless that premium rests on AFIP alone, and then the model pays none unless an under-age claimant or partner has a PIP daily living award. 6. For a child or young person in Great Britain, the qualifying flag matches From ab65ced6078317427db8779fc3e239a690b0eeb2 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 19:57:59 -0500 Subject: [PATCH 37/43] Finish rewrapping invariant 5 Co-Authored-By: Claude Opus 5.5 --- .../tests/test_enhanced_disability_premium_properties.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index dfc543683f..0176296581 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -49,9 +49,10 @@ before 2023, and in Kingston upon Thames in 2018-19 to 2022-23. It never falls below the legacy premium in Scotland from 2023, or where a council's own list counts AFIP (Newham's). Where a council's own list omits AFIP - (Merton's, Kingston upon Thames's and Westminster's), it never falls below the legacy premium unless that - premium rests on AFIP alone, and then the model pays none unless an - under-age claimant or partner has a PIP daily living award. + (Merton's, Kingston upon Thames's and Westminster's), it never falls + below the legacy premium unless that premium rests on AFIP alone, and then + the model pays none unless an under-age claimant or partner has a PIP + daily living award. 6. For a child or young person in Great Britain, the qualifying flag matches the test's own calculation. The model pays the child's enhanced rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums) From 4ec21f36de3f0e72946d32a4f7823ec0133e4e92 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 20:09:24 -0500 Subject: [PATCH 38/43] Test Kingston's 2018 and 2023 boundaries and call the gap rule an assumption Four cases cover the first fallback year and the first year back, each with AFIP and with standard-rate PIP daily living. The descriptions now say the model assumes the Housing Benefit list for 2018-19 to 2022-23, as it does for councils without a list of their own. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 7 +- .../qualifying_benefits_apply.yaml | 7 +- .../enhanced_disability_premium.yaml | 70 ++++++++++++++++++- ..._enhanced_disability_premium_properties.py | 4 +- ...n_enhanced_disability_premium_condition.py | 6 +- 6 files changed, 81 insertions(+), 15 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 7ef6705b0b..2b2440e1a1 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. Apply Kingston upon Thames's own list in 2013-14 to 2017-18 and from 2023-24, and keep the Housing Benefit list in 2018-19 to 2022-23 because no complete scheme text for those years survives. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. Apply Kingston upon Thames's own list in 2013-14 to 2017-18 and from 2023-24, and assume the Housing Benefit list in 2018-19 to 2022-23, for which no complete scheme text survives. diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 78f3616330..73bcee0184 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -20,9 +20,10 @@ description: > registers for 2017 to 2026 (though it leaves some Council resolutions out of them); and in its 2023-24 budget report it says the scheme "remains unchanged". The model applies the list in 2013-14 to 2017-18 and from - 2023-24. It keeps the Housing Benefit list in 2018-19 to 2022-23 because - no complete scheme text for those years survives. The model reads the - list as at 30 April of each year. + 2023-24. No complete scheme text for 2018-19 to 2022-23 survives, so for + those years the model assumes the Housing Benefit list, as it does for + councils without a list of their own. The model reads the list as at 30 + April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml index f19dccb31d..e6d8dc0dc4 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml @@ -2,9 +2,10 @@ description: > If this is true, the model applies Kingston upon Thames's own qualifying benefit list for the enhanced disability premium in its working-age Council Tax Reduction scheme. The model applies that list in 2013-14 to - 2017-18 and from 2023-24. It keeps the Housing Benefit list in 2018-19 to - 2022-23 because no complete scheme text for those years survives. The model - reads this parameter as at 30 April of each year, like the qualifying + 2017-18 and from 2023-24. No complete scheme text for 2018-19 to 2022-23 + survives, so for those years the model assumes the Housing Benefit list, as + it does for councils without a list of their own. The model reads this + parameter as at 30 April of each year, like the qualifying benefit list. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits apply diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 4a810f7226..738d7b441e 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -15,9 +15,9 @@ # 3 para 12(1)): DLA care highest and PIP daily living at either rate, without # AFIP. The four London councils keep the qualifying age for State Pension # Credit as the age limit. The model applies Kingston's list in 2013-14 to -# 2017-18 and from 2023-24, and keeps the Housing Benefit list in 2018-19 to -# 2022-23 because no complete scheme text for those years survives. The -# other councils' lists apply in every model year. The model reads each +# 2017-18 and from 2023-24. No complete scheme text for 2018-19 to 2022-23 +# survives, so for those years the model assumes the Housing Benefit list. +# The other councils' lists apply in every model year. The model reads each # year's rules at 30 April. # Unless a case sets `is_disabled_for_benefits`, it keeps its default, false, # and the model pays no disability premium, although the schemes give one to @@ -854,3 +854,67 @@ output: # Merton's list still counts only highest DLA care or PIP daily living. meets_council_tax_reduction_enhanced_disability_premium_condition: false + +- name: Case 24, Kingston's first Housing Benefit year counts AFIP (2018). + period: 2018 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # The switch is false from 1 April 2018; the GB Housing Benefit list counts AFIP. + meets_council_tax_reduction_enhanced_disability_premium_condition: true + +- name: Case 25, Kingston's own list omits AFIP again from 2023. + period: 2023 + input: + people: + person1: + age: 30 + armed_forces_independence_payment: 2_000 + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # The switch is true again from 1 April 2023; Kingston's list omits AFIP. + meets_council_tax_reduction_enhanced_disability_premium_condition: false + +- name: Case 26, Kingston's first Housing Benefit year omits standard PIP daily living (2018). + period: 2018 + input: + people: + person1: + age: 30 + pip_dl_category: STANDARD + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # The GB Housing Benefit list counts only the enhanced PIP daily living rate. + meets_council_tax_reduction_enhanced_disability_premium_condition: false + +- name: Case 27, Kingston's own list counts standard PIP daily living again from 2023. + period: 2023 + input: + people: + person1: + age: 30 + pip_dl_category: STANDARD + households: + household: + members: [person1] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + output: + # Kingston's list counts the PIP daily living component at either rate. + meets_council_tax_reduction_enhanced_disability_premium_condition: true diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 0176296581..bec8d59022 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -23,7 +23,7 @@ 2012/2886 Sch 3 para 12), which counts the PIP daily living component at either rate and omits AFIP. Each council's list starts on or before 1 April 2013 (COUNCIL_LISTS) and applies in every model year, except that for -Kingston upon Thames the model applies the Housing Benefit condition in +Kingston upon Thames the model assumes the Housing Benefit condition in 2018-19 to 2022-23, for which no complete scheme text survives. The model also applies the Housing Benefit condition in Wales and every other scheme. @@ -129,7 +129,7 @@ # The 2013 rules. "MERTON": {2013: ("dla_highest", "any_pip")}, # The Default Scheme, adopted for 2013-14. No complete scheme text for - # 2018-19 to 2022-23 survives, so the model applies the Housing Benefit + # 2018-19 to 2022-23 survives, so the model assumes the Housing Benefit # condition in those years. "KINGSTON_UPON_THAMES": { 2013: ("dla_highest", "any_pip"), diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index d10d6c4f9d..ec228a2495 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -30,9 +30,9 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "those Regulations, though the model cites no full Westminster scheme " "text. Those four councils count an award only for a person under the " "qualifying age for State Pension Credit. The model applies Kingston's " - "list in 2013-14 to 2017-18 and from 2023-24, and keeps the Housing " - "Benefit list in 2018-19 to 2022-23 because no complete scheme text " - "for those years survives. The other three councils' lists start on " + "list in 2013-14 to 2017-18 and from 2023-24. No complete scheme text " + "for 2018-19 to 2022-23 survives, so for those years the model assumes " + "the Housing Benefit list. The other three councils' lists start on " "or before 1 April 2013 and apply in every model year. In " "every other scheme the model applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " From 43b3f7dc15785d6ccd0424459162c949a2d029ea Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 20:38:08 -0500 Subject: [PATCH 39/43] Say the model cites no complete Kingston text for 2018-19 to 2022-23 "No complete scheme text for 2018-19 to 2022-23 survives" claimed that no copy exists anywhere. The sources show only that the model cites none: it holds no Kingston text for 2018-19 to 2020-21, and the archive's 2021-22 and 2022-23 copies stop at 1,048,576 bytes. The docstring, both parameter descriptions, the YAML header, the property test and the changelog fragment now say what the model cites, as the docstring already does for Westminster. The `qualifying_benefits` description also said those truncated copies "stop before the age condition". Both print limbs (b) and (c) of para 12 in plain text, and a lost font hides part of limb (ii)'s age test, so the description now says that. Its long semicolon sentences become separate ones with the council or the Secretary of State as subject. No parameter value, formula or test case changes. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 36 +++++++++---------- .../qualifying_benefits_apply.yaml | 9 +++-- .../enhanced_disability_premium.yaml | 4 +-- ..._enhanced_disability_premium_properties.py | 8 ++--- ...n_enhanced_disability_premium_condition.py | 8 ++--- 6 files changed, 33 insertions(+), 34 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 2b2440e1a1..9cbbd48171 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. Apply Kingston upon Thames's own list in 2013-14 to 2017-18 and from 2023-24, and assume the Housing Benefit list in 2018-19 to 2022-23, for which no complete scheme text survives. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. Apply Kingston upon Thames's own list in 2013-14 to 2017-18 and from 2023-24, and assume the Housing Benefit list in 2018-19 to 2022-23, for which the model cites no complete scheme text. diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml index 73bcee0184..820db3b0f5 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml @@ -6,24 +6,24 @@ description: > premium in its working-age Council Tax Reduction scheme. It omits armed forces independence payment, and counts each award only for a person under the qualifying age for State Pension Credit. The council made its scheme - from 1 April 2013 by adopting the Default Scheme, whose Sch 3 para 12 sets - this list; kept the scheme apart from uprating for 2014-15, 2015-16 and - 2016-17; and revised other provisions from April 2016 and April 2017. Its - truncated 2021-22 and 2022-23 scheme copies show the qualifying benefit - list but stop before the age condition. It keeps the same para 12 in its - scheme texts for 2023 to 2026-27. In its 2021-22, 2022-23 and 2023 texts - the council cites no revision of its own after December 2015. In its 2023 - text the Energy Bills Rebate disregard it adds from 1 April 2022, which - the Secretary of State requires of every scheme from 2022-23 (S.I. - 2022/127 reg 3), leaves para 12 alone; the council lists no Council Tax - Reduction decision in its decision - registers for 2017 to 2026 (though it leaves some Council resolutions out - of them); and in its 2023-24 budget report it says the scheme "remains - unchanged". The model applies the list in 2013-14 to 2017-18 and from - 2023-24. No complete scheme text for 2018-19 to 2022-23 survives, so for - those years the model assumes the Housing Benefit list, as it does for - councils without a list of their own. The model reads the list as at 30 - April of each year. + from 1 April 2013 by adopting the Default Scheme, in whose Sch 3 para 12 + the Secretary of State sets this list. It kept the scheme apart from + uprating for 2014-15, 2015-16 and 2016-17, and revised other provisions + from April 2016 and April 2017. Its truncated 2021-22 and 2022-23 scheme + copies print the qualifying benefit list, but a lost font hides part of + the family-member age condition. It keeps the same para 12 in its scheme + texts for 2023 to 2026-27. In its 2021-22, 2022-23 and 2023 texts the + council cites no revision of its own after December 2015. In its 2023 + text it adds the Energy Bills Rebate disregard from 1 April 2022 and + leaves para 12 alone. The Secretary of State requires that disregard of + every scheme from 2022-23 (S.I. 2022/127 reg 3). The council lists no + Council Tax Reduction decision in its decision registers for 2017 to 2026, + though it leaves some Council resolutions out of them. In its 2023-24 + budget report it says the scheme "remains unchanged". The model applies + the list in 2013-14 to 2017-18 and from 2023-24. It cites no complete + scheme text for 2018-19 to 2022-23. For those years it assumes the Housing + Benefit list, as it does for councils without a list of their own. The + model reads the list as at 30 April of each year. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits period: year diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml index e6d8dc0dc4..0a3c505a07 100644 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml @@ -2,11 +2,10 @@ description: > If this is true, the model applies Kingston upon Thames's own qualifying benefit list for the enhanced disability premium in its working-age Council Tax Reduction scheme. The model applies that list in 2013-14 to - 2017-18 and from 2023-24. No complete scheme text for 2018-19 to 2022-23 - survives, so for those years the model assumes the Housing Benefit list, as - it does for councils without a list of their own. The model reads this - parameter as at 30 April of each year, like the qualifying - benefit list. + 2017-18 and from 2023-24. It cites no complete Kingston scheme text for + 2018-19 to 2022-23. For those years it assumes the Housing Benefit list, + as it does for councils without a list of their own. The model reads this + parameter as at 30 April of each year, like the qualifying benefit list. metadata: label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits apply period: year diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 738d7b441e..c52c8d539c 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -15,8 +15,8 @@ # 3 para 12(1)): DLA care highest and PIP daily living at either rate, without # AFIP. The four London councils keep the qualifying age for State Pension # Credit as the age limit. The model applies Kingston's list in 2013-14 to -# 2017-18 and from 2023-24. No complete scheme text for 2018-19 to 2022-23 -# survives, so for those years the model assumes the Housing Benefit list. +# 2017-18 and from 2023-24. It cites no complete Kingston scheme text for +# 2018-19 to 2022-23, so for those years it assumes the Housing Benefit list. # The other councils' lists apply in every model year. The model reads each # year's rules at 30 April. # Unless a case sets `is_disabled_for_benefits`, it keeps its default, false, diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index bec8d59022..e873bc1c43 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -24,7 +24,7 @@ either rate and omits AFIP. Each council's list starts on or before 1 April 2013 (COUNCIL_LISTS) and applies in every model year, except that for Kingston upon Thames the model assumes the Housing Benefit condition in -2018-19 to 2022-23, for which no complete scheme text survives. The model +2018-19 to 2022-23, for which it cites no complete scheme text. The model also applies the Housing Benefit condition in Wales and every other scheme. The test generates single people, couples and lone parents in the places and @@ -128,9 +128,9 @@ COUNCIL_LISTS = { # The 2013 rules. "MERTON": {2013: ("dla_highest", "any_pip")}, - # The Default Scheme, adopted for 2013-14. No complete scheme text for - # 2018-19 to 2022-23 survives, so the model assumes the Housing Benefit - # condition in those years. + # The Default Scheme, adopted for 2013-14, and the council's own texts + # from 2023-24. The model cites no complete scheme text for 2018-19 to + # 2022-23, so it assumes the Housing Benefit condition in those years. "KINGSTON_UPON_THAMES": { 2013: ("dla_highest", "any_pip"), 2018: None, diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index ec228a2495..61fbdb7a8b 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -30,10 +30,10 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "those Regulations, though the model cites no full Westminster scheme " "text. Those four councils count an award only for a person under the " "qualifying age for State Pension Credit. The model applies Kingston's " - "list in 2013-14 to 2017-18 and from 2023-24. No complete scheme text " - "for 2018-19 to 2022-23 survives, so for those years the model assumes " - "the Housing Benefit list. The other three councils' lists start on " - "or before 1 April 2013 and apply in every model year. In " + "list in 2013-14 to 2017-18 and from 2023-24. It cites no complete " + "Kingston scheme text for 2018-19 to 2022-23, so for those years it " + "assumes the Housing Benefit list. The other three councils' lists " + "start on or before 1 April 2013 and apply in every model year. In " "every other scheme the model applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " From f663e27b19be69dea844fc91f0ee19b37dc850ee Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 22:17:56 -0500 Subject: [PATCH 40/43] Correct the property test's note on the years it checks each list The comment above YEARS still said the test checks each council's list in every year. Since 13da5f66a the test checks Kingston upon Thames's list only in the years the model applies it, and the Housing Benefit condition in 2018 to 2022. The comment now says so and adds Kingston's Housing Benefit years to the edges every example crosses. No parameter value, formula or test case changes. Co-Authored-By: Claude Opus 5.5 --- .../tests/test_enhanced_disability_premium_properties.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index e873bc1c43..9a78cb7677 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -78,9 +78,10 @@ TOLERANCE = 1 # Each example builds one simulation with inputs for every year from 2015 to # 2030, so every example tests both sides of the Northern Ireland PIP date -# (2017) and the Scottish changes (2023). Every council's own list starts in -# 2013-14, before the model's first year, so the test checks each list in -# every year. +# (2017), the Scottish changes (2023) and Kingston upon Thames's Housing +# Benefit years (2018 to 2022). Every council's own list starts in 2013-14, +# before the model's first year, so the test checks each list in every year +# the model applies it. YEARS = list(range(2015, 2031)) # (country, local authority): None keeps the default local authority. PLACES = [ From 403dde1ce6e16e04c72b3f5c93a13d17c5f37f51 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 5 Nov 2026 22:43:49 -0500 Subject: [PATCH 41/43] Say the model assumes the Housing Benefit condition in Kingston's tests The names of CTR Cases 18, 19, 22, 24 and 26 said Kingston keeps the Housing Benefit condition in 2018 to 2022, as if a Kingston text set it. They now say the model assumes it. In the property test, invariant 1, qualifies_for_scheme and the oracle said the test applies each scheme's own list or the law. They now name the list the model applies that year and its Housing Benefit assumption for Kingston. The COUNCIL_LISTS comment names the Council that adopted the Default Scheme. No parameter value, formula or expected value changes. Co-Authored-By: Claude Opus 5.5 --- .../enhanced_disability_premium.yaml | 10 +++++----- ...st_enhanced_disability_premium_properties.py | 17 ++++++++++------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index c52c8d539c..fa579ada90 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -759,7 +759,7 @@ # as in Case 15. household_net_income: [16_365.32, 12_148.12] -- name: Case 18, Kingston keeps the Housing Benefit condition for AFIP in 2020. +- name: Case 18, in Kingston the model assumes the Housing Benefit condition and counts AFIP in 2020. period: 2020 input: people: @@ -775,7 +775,7 @@ # Kingston's list does not apply; the GB Housing Benefit list counts AFIP. meets_council_tax_reduction_enhanced_disability_premium_condition: true -- name: Case 19, Kingston keeps the Housing Benefit condition for AFIP in 2022. +- name: Case 19, in Kingston the model assumes the Housing Benefit condition and counts AFIP in 2022. period: 2022 input: people: @@ -823,7 +823,7 @@ # Kingston's list applies and counts only highest DLA care or PIP daily living. meets_council_tax_reduction_enhanced_disability_premium_condition: false -- name: Case 22, Kingston keeps the Housing Benefit condition for highest DLA care in 2020. +- name: Case 22, in Kingston the model assumes the Housing Benefit condition and counts highest DLA care in 2020. period: 2020 input: people: @@ -855,7 +855,7 @@ # Merton's list still counts only highest DLA care or PIP daily living. meets_council_tax_reduction_enhanced_disability_premium_condition: false -- name: Case 24, Kingston's first Housing Benefit year counts AFIP (2018). +- name: Case 24, in Kingston the model assumes the Housing Benefit condition from 2018 and counts AFIP. period: 2018 input: people: @@ -887,7 +887,7 @@ # The switch is true again from 1 April 2023; Kingston's list omits AFIP. meets_council_tax_reduction_enhanced_disability_premium_condition: false -- name: Case 26, Kingston's first Housing Benefit year omits standard PIP daily living (2018). +- name: Case 26, in Kingston the model assumes the Housing Benefit condition from 2018 and omits standard PIP daily living. period: 2018 input: people: diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 9a78cb7677..04c54b12f5 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -36,7 +36,7 @@ 1. The test computes the statutory amount from the award inputs and the parameter rates. enhanced_disability_premium equals that amount, and council_tax_reduction_enhanced_disability_premium equals the amount under - the scheme's own list. + the list the model applies to the scheme in that year. 2. The model pays no premium to a family in which no claimant or partner has a qualifying award. 3. Giving a claimant or partner a qualifying benefit on top of their awards @@ -129,8 +129,9 @@ COUNCIL_LISTS = { # The 2013 rules. "MERTON": {2013: ("dla_highest", "any_pip")}, - # The Default Scheme, adopted for 2013-14, and the council's own texts - # from 2023-24. The model cites no complete scheme text for 2018-19 to + # The Council adopted the Default Scheme for 2013-14 and kept its list + # through 2017-18, and the council prints the same list in its texts from + # 2023-24. The model cites no complete scheme text for 2018-19 to # 2022-23, so it assumes the Housing Benefit condition in those years. "KINGSTON_UPON_THAMES": { 2013: ("dla_highest", "any_pip"), @@ -210,7 +211,8 @@ def council_list(council, year): def qualifies_for_scheme(inputs, place, year): - """Check for the scheme's own awards, before its age limit.""" + """Check for the awards on the list the model applies to the scheme in + that year, before the scheme's age limit.""" country, council = place if country == "SCOTLAND": # SSI 2021/249 Sch 1 para 14(1), with head (g) from 2023. @@ -335,9 +337,10 @@ def build(families, children): def oracle(f, year, attained): - """Compute the two annual premiums under the law for one family. - attained[j] holds when adult j has attained the qualifying age for State - Pension Credit.""" + """Compute the two annual premiums for one family from the Regulations + and COUNCIL_LISTS, with the model's Housing Benefit assumption for + Kingston upon Thames in 2018 to 2022. attained[j] holds when adult j has + attained the qualifying age for State Pension Credit.""" p = system.parameters(year).gov.dwp.disability_premia rate = p.enhanced_couple if f["shape"] == "couple" else p.enhanced_single country = f["place"][0] From f5d34e4e8ea2c0bc5edc9a9d48c222c9a9f9b919 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 6 Nov 2026 10:21:07 -0500 Subject: [PATCH 42/43] Keep Kingston upon Thames on highest-rate DLA care alone The model can't yet read Kingston's own list for every model year, or a decision setting its amounts. So this PR activates no new Kingston route: the condition stays highest-rate DLA care with no age limit, as on main, and issue #2881 lists what the model needs to apply the council's list. Remove the two Kingston parameter files and their cases, and add two cases that pin the condition. The property test's oracle and invariant 5 follow. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../qualifying_benefits.yaml | 65 ----- .../qualifying_benefits_apply.yaml | 39 --- .../enhanced_disability_premium.yaml | 247 ++++++------------ ..._enhanced_disability_premium_properties.py | 83 +++--- ...x_reduction_enhanced_disability_premium.py | 23 +- ...n_enhanced_disability_premium_condition.py | 27 +- 7 files changed, 144 insertions(+), 342 deletions(-) delete mode 100644 policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml delete mode 100644 policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 9cbbd48171..6370320616 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give five working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton, Kingston upon Thames and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. Apply Kingston upon Thames's own list in 2013-14 to 2017-18 and from 2023-24, and assume the Housing Benefit list in 2018-19 to 2022-23, for which the model cites no complete scheme text. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. In Kingston upon Thames the model keeps highest-rate DLA care alone, with no age limit, until it can apply the council's own list. diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml deleted file mode 100644 index 820db3b0f5..0000000000 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits.yaml +++ /dev/null @@ -1,65 +0,0 @@ -description: > - The Royal Borough of Kingston upon Thames counts the care component of - disability living allowance at the highest rate and the daily living - component of personal independence payment at either rate, for the applicant - or a member of the applicant's family, towards the enhanced disability - premium in its working-age Council Tax Reduction scheme. It omits armed - forces independence payment, and counts each award only for a person under - the qualifying age for State Pension Credit. The council made its scheme - from 1 April 2013 by adopting the Default Scheme, in whose Sch 3 para 12 - the Secretary of State sets this list. It kept the scheme apart from - uprating for 2014-15, 2015-16 and 2016-17, and revised other provisions - from April 2016 and April 2017. Its truncated 2021-22 and 2022-23 scheme - copies print the qualifying benefit list, but a lost font hides part of - the family-member age condition. It keeps the same para 12 in its scheme - texts for 2023 to 2026-27. In its 2021-22, 2022-23 and 2023 texts the - council cites no revision of its own after December 2015. In its 2023 - text it adds the Energy Bills Rebate disregard from 1 April 2022 and - leaves para 12 alone. The Secretary of State requires that disregard of - every scheme from 2022-23 (S.I. 2022/127 reg 3). The council lists no - Council Tax Reduction decision in its decision registers for 2017 to 2026, - though it leaves some Council resolutions out of them. In its 2023-24 - budget report it says the scheme "remains unchanged". The model applies - the list in 2013-14 to 2017-18 and from 2023-24. It cites no complete - scheme text for 2018-19 to 2022-23. For those years it assumes the Housing - Benefit list, as it does for councils without a list of their own. The - model reads the list as at 30 April of each year. -metadata: - label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits - period: year - unit: list - reference: - - title: Council, 11 December 2012, item 42 (a scheme from 1 April 2013 adopting the Default Scheme) - href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744 - - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 Sch. 3 para. 12 (as made) - href: https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made - - title: Council, 8 October 2013, item 42 (no changes for 2014/15 other than the Government's changes to the Default Scheme) - href: https://moderngov.kingston.gov.uk/ieListDocuments.aspx?CId=137&MId=7156&Ver=4 - - title: Decision 2535, 17 December 2013 (2014/15 the same as 2013/14 apart from uprating) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 - - title: Decision 2707, 16 July 2014 (2015/16 and 2016/17 unchanged apart from uprating) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 - - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 - - title: Council Tax Reduction Scheme 2021-2022 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) - href: https://web.archive.org/web/20221206070019id_/https://www.kingston.gov.uk/downloads/file/616/council-tax-reduction-scheme-2021-2022 - - title: Council Tax Reduction Scheme 2022-2023 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) - href: https://web.archive.org/web/20221206083043id_/https://www.kingston.gov.uk/downloads/file/513/council-tax-reduction-scheme-2022-2023 - - title: Budget Report 2023/24 to 2026/27, para. 51 (the Council Tax Support Scheme "remains unchanged"), approved by Budget Council on 2 March 2023 - href: https://moderngov.kingston.gov.uk/mgConvert2PDF.aspx?ID=99625 - - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf - - title: Council Tax Reduction Scheme 2023, "Basis for the local scheme" (based on the Default Scheme Regulations) - href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf - - title: The Council Tax (Demand Notices and Reduction Schemes) (England) (Amendment) Regulations 2022, reg. 3 (energy rebate disregard in every scheme) - href: https://www.legislation.gov.uk/uksi/2022/127/regulation/3/made - - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/downloads/Council_Tax_Reduction_Scheme_2024_2025.pdf - - title: Council Tax Reduction Scheme 2025 - 2026, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/2025-04/Council_Tax_Reduction_Scheme_2025_26.pdf - - title: Council Tax Reduction Scheme 2026 - 2027, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf -values: - 2013-04-01: - - has_highest_dla_sc_award - - pip_dl diff --git a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml b/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml deleted file mode 100644 index 0a3c505a07..0000000000 --- a/policyengine_uk/parameters/gov/local_authorities/kingston_upon_thames/council_tax_reduction/enhanced_disability_premium/qualifying_benefits_apply.yaml +++ /dev/null @@ -1,39 +0,0 @@ -description: > - If this is true, the model applies Kingston upon Thames's own qualifying - benefit list for the enhanced disability premium in its working-age - Council Tax Reduction scheme. The model applies that list in 2013-14 to - 2017-18 and from 2023-24. It cites no complete Kingston scheme text for - 2018-19 to 2022-23. For those years it assumes the Housing Benefit list, - as it does for councils without a list of their own. The model reads this - parameter as at 30 April of each year, like the qualifying benefit list. -metadata: - label: Kingston upon Thames Council Tax Reduction enhanced disability premium qualifying benefits apply - period: year - unit: bool - reference: - - title: Council, 11 December 2012, item 42 (a scheme from 1 April 2013 adopting the Default Scheme) - href: https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744 - - title: The Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012 Sch. 3 para. 12 (as made) - href: https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made - - title: Decision 2535, 17 December 2013 (2014/15 the same as 2013/14 apart from uprating) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2535 - - title: Decision 2707, 16 July 2014 (2015/16 and 2016/17 unchanged apart from uprating) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=2707 - - title: Decision 3042, 15 December 2015 (revisions from 1 April 2016 and 1 April 2017, none to Sch 3 para 12) - href: https://moderngov.kingston.gov.uk/ieDecisionDetails.aspx?ID=3042 - - title: Council Tax Reduction Scheme 2021-2022 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) - href: https://web.archive.org/web/20221206070019id_/https://www.kingston.gov.uk/downloads/file/616/council-tax-reduction-scheme-2021-2022 - - title: Council Tax Reduction Scheme 2022-2023 (truncated archived copy), Sch. 3 para. 12(1)(b), (c) - href: https://web.archive.org/web/20221206083043id_/https://www.kingston.gov.uk/downloads/file/513/council-tax-reduction-scheme-2022-2023 - - title: Council Tax Reduction Scheme 2023, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/downloads/CTRS_2023_Final.pdf - - title: Council Tax Reduction Scheme 2024-2025, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/downloads/Council_Tax_Reduction_Scheme_2024_2025.pdf - - title: Council Tax Reduction Scheme 2025 - 2026, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/2025-04/Council_Tax_Reduction_Scheme_2025_26.pdf - - title: Council Tax Reduction Scheme 2026 - 2027, Sch. 3 para. 12(1)(b), (c) - href: https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf -values: - 2013-04-01: true - 2018-04-01: false - 2023-04-01: true diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index fa579ada90..75562a8dd1 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -5,20 +5,17 @@ # Sch 7 para 12(1)). Scottish councils count the same benefits for the # applicant or partner (CTR (Scotland) Regs 2021 Sch 1 para 14(1)), with no # age limit from 20 June 2022 (S.S.I. 2022/161), and attendance allowance at -# either rate from 1 April 2023 (para 14(1)(g), S.S.I. 2023/38). Merton and -# Kingston upon Thames count DLA care highest and PIP daily living at either -# rate and omit AFIP (Merton's Local Council Tax Support Scheme Rules 2026 and -# Kingston upon Thames's Council Tax Reduction Scheme 2026 - 2027, Sch 3 para -# 12(1)). Newham counts DLA care highest, PIP daily living at either rate and -# AFIP (Newham's Council Tax Reduction Scheme 2026, Sch 3 para 12(1)). In -# Westminster the model applies the Default Scheme's list (S.I. 2012/2886 Sch -# 3 para 12(1)): DLA care highest and PIP daily living at either rate, without -# AFIP. The four London councils keep the qualifying age for State Pension -# Credit as the age limit. The model applies Kingston's list in 2013-14 to -# 2017-18 and from 2023-24. It cites no complete Kingston scheme text for -# 2018-19 to 2022-23, so for those years it assumes the Housing Benefit list. -# The other councils' lists apply in every model year. The model reads each -# year's rules at 30 April. +# either rate from 1 April 2023 (para 14(1)(g), S.S.I. 2023/38). Merton counts +# DLA care highest and PIP daily living at either rate and omits AFIP (Merton's +# Local Council Tax Support Scheme Rules 2026, Sch 3 para 12(1)). Newham counts +# DLA care highest, PIP daily living at either rate and AFIP (Newham's Council +# Tax Reduction Scheme 2026, Sch 3 para 12(1)). In Westminster the model applies +# the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12(1)): DLA care highest +# and PIP daily living at either rate, without AFIP. Those three councils keep +# the qualifying age for State Pension Credit as the age limit, and their lists +# apply in every model year. In Kingston upon Thames the model counts DLA care +# highest alone, with no age limit (issue #2881). The model reads each year's +# rules at 30 April. # Unless a case sets `is_disabled_for_benefits`, it keeps its default, false, # and the model pays no disability premium, although the schemes give one to # a claimant under the qualifying age who receives these awards (for example @@ -295,7 +292,7 @@ # 1,800 - 20% of (12,000 - 9,443.20) = 1,800 - 511.36 = 1,288.64. simulated_council_tax_reduction_benunit: 1_288.64 -- name: Case 10, AFIP meets Newham's condition but not Merton's, Kingston upon Thames's or Westminster's. +- name: Case 10, AFIP meets Newham's condition but not Merton's or Westminster's. period: 2026 absolute_error_margin: 0.01 input: @@ -303,9 +300,6 @@ merton: age: 30 armed_forces_independence_payment: 2_000 - kingston: - age: 30 - armed_forces_independence_payment: 2_000 newham: age: 30 armed_forces_independence_payment: 2_000 @@ -315,8 +309,6 @@ benunits: merton: members: [merton] - kingston: - members: [kingston] newham: members: [newham] westminster: @@ -326,10 +318,6 @@ members: [merton] country: ENGLAND local_authority: MERTON - kingston: - members: [kingston] - country: ENGLAND - local_authority: KINGSTON_UPON_THAMES newham: members: [newham] country: ENGLAND @@ -339,12 +327,12 @@ country: ENGLAND local_authority: WESTMINSTER output: - meets_council_tax_reduction_enhanced_disability_premium_condition: [false, false, true, false] + meets_council_tax_reduction_enhanced_disability_premium_condition: [false, true, false] # 22.00 * 52 = 1,144.00. - council_tax_reduction_enhanced_disability_premium: [0, 0, 1_144, 0] - enhanced_disability_premium: [1_144, 1_144, 1_144, 1_144] + council_tax_reduction_enhanced_disability_premium: [0, 1_144, 0] + enhanced_disability_premium: [1_144, 1_144, 1_144] -- name: Case 11, standard PIP daily living meets the Merton, Kingston upon Thames, Newham and Westminster conditions. +- name: Case 11, standard PIP daily living meets the Merton, Newham and Westminster conditions. period: 2026 absolute_error_margin: 0.01 input: @@ -352,9 +340,6 @@ merton: age: 30 pip_dl_category: STANDARD - kingston: - age: 30 - pip_dl_category: STANDARD newham: age: 30 pip_dl_category: STANDARD @@ -364,8 +349,6 @@ benunits: merton: members: [merton] - kingston: - members: [kingston] newham: members: [newham] westminster: @@ -375,10 +358,6 @@ members: [merton] country: ENGLAND local_authority: MERTON - kingston: - members: [kingston] - country: ENGLAND - local_authority: KINGSTON_UPON_THAMES newham: members: [newham] country: ENGLAND @@ -388,10 +367,10 @@ country: ENGLAND local_authority: WESTMINSTER output: - meets_council_tax_reduction_enhanced_disability_premium_condition: [true, true, true, true] - council_tax_reduction_enhanced_disability_premium: [1_144, 1_144, 1_144, 1_144] + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, true, true] + council_tax_reduction_enhanced_disability_premium: [1_144, 1_144, 1_144] # Under HB para 15(1)(c), claimants qualify only at the enhanced rate. - enhanced_disability_premium: [0, 0, 0, 0] + enhanced_disability_premium: [0, 0, 0] - name: Case 12, the Merton and Newham schemes keep the age limit for an over-age partner. period: 2026 @@ -759,7 +738,7 @@ # as in Case 15. household_net_income: [16_365.32, 12_148.12] -- name: Case 18, in Kingston the model assumes the Housing Benefit condition and counts AFIP in 2020. +- name: Case 18, Merton's own list omits AFIP in 2020. period: 2020 input: people: @@ -770,151 +749,95 @@ household: members: [person1] country: ENGLAND - local_authority: KINGSTON_UPON_THAMES - output: - # Kingston's list does not apply; the GB Housing Benefit list counts AFIP. - meets_council_tax_reduction_enhanced_disability_premium_condition: true - -- name: Case 19, in Kingston the model assumes the Housing Benefit condition and counts AFIP in 2022. - period: 2022 - input: - people: - person1: - age: 30 - armed_forces_independence_payment: 2_000 - households: - household: - members: [person1] - country: ENGLAND - local_authority: KINGSTON_UPON_THAMES - output: - # Kingston's list does not apply; the GB Housing Benefit list counts AFIP. - meets_council_tax_reduction_enhanced_disability_premium_condition: true - -- name: Case 20, Kingston's own list omits AFIP in 2017. - period: 2017 - input: - people: - person1: - age: 30 - armed_forces_independence_payment: 2_000 - households: - household: - members: [person1] - country: ENGLAND - local_authority: KINGSTON_UPON_THAMES - output: - # Kingston's list applies and counts only highest DLA care or PIP daily living. - meets_council_tax_reduction_enhanced_disability_premium_condition: false - -- name: Case 21, Kingston's own list omits AFIP in 2024. - period: 2024 - input: - people: - person1: - age: 30 - armed_forces_independence_payment: 2_000 - households: - household: - members: [person1] - country: ENGLAND - local_authority: KINGSTON_UPON_THAMES + local_authority: MERTON output: - # Kingston's list applies and counts only highest DLA care or PIP daily living. + # Merton's list counts only highest DLA care or PIP daily living. meets_council_tax_reduction_enhanced_disability_premium_condition: false -- name: Case 22, in Kingston the model assumes the Housing Benefit condition and counts highest DLA care in 2020. - period: 2020 +- name: Case 19, in Kingston upon Thames the model counts only highest-rate DLA care. + # The council's texts from 2023-24 print a wider list with an age limit (Sch 3 + # para 12), and issue #2881 lists what the model needs to apply it. + period: 2026 + absolute_error_margin: 0.01 input: people: - person1: + dla: age: 30 dla_sc_category: HIGHER - households: - household: - members: [person1] - country: ENGLAND - local_authority: KINGSTON_UPON_THAMES - output: - # The GB Housing Benefit list counts has_highest_dla_sc_award. - meets_council_tax_reduction_enhanced_disability_premium_condition: true - -- name: Case 23, Merton's own list still omits AFIP in 2020. - period: 2020 - input: - people: - person1: + enhanced_pip: age: 30 - armed_forces_independence_payment: 2_000 - households: - household: - members: [person1] - country: ENGLAND - local_authority: MERTON - output: - # Merton's list still counts only highest DLA care or PIP daily living. - meets_council_tax_reduction_enhanced_disability_premium_condition: false - -- name: Case 24, in Kingston the model assumes the Housing Benefit condition from 2018 and counts AFIP. - period: 2018 - input: - people: - person1: + pip_dl_category: ENHANCED + standard_pip: + age: 30 + pip_dl_category: STANDARD + afip: age: 30 armed_forces_independence_payment: 2_000 + benunits: + dla: + members: [dla] + enhanced_pip: + members: [enhanced_pip] + standard_pip: + members: [standard_pip] + afip: + members: [afip] households: - household: - members: [person1] + dla: + members: [dla] country: ENGLAND local_authority: KINGSTON_UPON_THAMES - output: - # The switch is false from 1 April 2018; the GB Housing Benefit list counts AFIP. - meets_council_tax_reduction_enhanced_disability_premium_condition: true - -- name: Case 25, Kingston's own list omits AFIP again from 2023. - period: 2023 - input: - people: - person1: - age: 30 - armed_forces_independence_payment: 2_000 - households: - household: - members: [person1] + enhanced_pip: + members: [enhanced_pip] country: ENGLAND local_authority: KINGSTON_UPON_THAMES - output: - # The switch is true again from 1 April 2023; Kingston's list omits AFIP. - meets_council_tax_reduction_enhanced_disability_premium_condition: false - -- name: Case 26, in Kingston the model assumes the Housing Benefit condition from 2018 and omits standard PIP daily living. - period: 2018 - input: - people: - person1: - age: 30 - pip_dl_category: STANDARD - households: - household: - members: [person1] + standard_pip: + members: [standard_pip] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + afip: + members: [afip] country: ENGLAND local_authority: KINGSTON_UPON_THAMES output: - # The GB Housing Benefit list counts only the enhanced PIP daily living rate. - meets_council_tax_reduction_enhanced_disability_premium_condition: false + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, false, false, false] + # 22.00 * 52 = 1,144.00. + council_tax_reduction_enhanced_disability_premium: [1_144, 0, 0, 0] + # The legacy premium also counts enhanced PIP daily living and AFIP. + enhanced_disability_premium: [1_144, 1_144, 0, 1_144] + # Every award here also gives the severe disability premium, 86.05 * 52 = + # 4,474.60, and the first adds 1,144.00: 5,618.60. + council_tax_reduction_premiums: [5_618.60, 4_474.60, 4_474.60, 4_474.60] -- name: Case 27, Kingston's own list counts standard PIP daily living again from 2023. - period: 2023 +- name: Case 20, in Kingston upon Thames the model sets no age limit for an over-age partner. + period: 2026 + absolute_error_margin: 0.01 input: people: person1: - age: 30 - pip_dl_category: STANDARD + age: 60 + person2: + age: 70 + dla_sc_category: HIGHER + benunits: + benunit: + members: [person1, person2] + jsa_income: 3_000 households: household: - members: [person1] + members: [person1, person2] country: ENGLAND local_authority: KINGSTON_UPON_THAMES output: - # Kingston's list counts the PIP daily living component at either rate. - meets_council_tax_reduction_enhanced_disability_premium_condition: true + is_couple: true + # Because the couple receives income-based Jobseeker's Allowance, the + # model applies the working-age scheme. + council_tax_reduction_pensioner: false + # The model's legacy premium applies the age limit. + enhanced_disability_premium: 0 + meets_council_tax_reduction_enhanced_disability_premium_condition: [false, true] + # The couple rate, 31.40 * 52 = 1,632.80, with no age limit in Kingston. + council_tax_reduction_enhanced_disability_premium: 1_632.80 + # The model pays no other premium, because only one partner has a severe + # disability premium qualifying benefit. + council_tax_reduction_premiums: 1_632.80 diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 04c54b12f5..3ba828cba0 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -16,20 +16,19 @@ Scottish councils count attendance allowance at either rate from 1 April 2023 (SSI 2021/249 Sch 1 para 14), and the Scottish Ministers removed the age limit -from 20 June 2022, which the model reads from 2023. Merton and Kingston upon -Thames (Sch 3 para 12) count the PIP daily living component at either rate -and omit AFIP; Newham counts the PIP daily living component at either rate -and AFIP. In Westminster the model applies the Default Scheme's list (S.I. -2012/2886 Sch 3 para 12), which counts the PIP daily living component at -either rate and omits AFIP. Each council's list starts on or before 1 April -2013 (COUNCIL_LISTS) and applies in every model year, except that for -Kingston upon Thames the model assumes the Housing Benefit condition in -2018-19 to 2022-23, for which it cites no complete scheme text. The model -also applies the Housing Benefit condition in Wales and every other scheme. +from 20 June 2022, which the model reads from 2023. Merton (Sch 3 para 12) +counts the PIP daily living component at either rate and omits AFIP; Newham +counts the PIP daily living component at either rate and AFIP. In Westminster +the model applies the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12), +which counts the PIP daily living component at either rate and omits AFIP. +Each of those lists starts on or before 1 April 2013 (COUNCIL_LISTS) and +applies in every model year. In Kingston upon Thames the model counts +highest-rate DLA care alone, with no age limit (issue #2881). The model also +applies the Housing Benefit condition in Wales and every other scheme. The test generates single people, couples and lone parents in the places and -age range below, with the listed awards, and adds a family in each council -with its own list to every example. It supplies each person's entered DLA +age range below, with the listed awards, and adds a family in each council in +COUNCIL_LISTS to every example. It supplies each person's entered DLA care and PIP daily living amount, or computes an amount from their category. It checks these invariants in every year from 2015 to 2030: @@ -45,14 +44,14 @@ exceeds two single rates; the couple rate never exceeds two single rates in any year. 5. The Council Tax Reduction premium equals the legacy premium in Wales, - Northern Ireland, Oxford and the default English council, in Scotland - before 2023, and in Kingston upon Thames in 2018-19 to 2022-23. It never - falls below the legacy premium in Scotland from 2023, or where a council's - own list counts AFIP (Newham's). Where a council's own list omits AFIP - (Merton's, Kingston upon Thames's and Westminster's), it never falls - below the legacy premium unless that premium rests on AFIP alone, and then - the model pays none unless an under-age claimant or partner has a PIP - daily living award. + Northern Ireland, Oxford and the default English council, and in Scotland + before 2023. It never falls below the legacy premium in Scotland from 2023, + or where a council's own list counts AFIP (Newham's). Where a council's own + list omits AFIP (Merton's and Westminster's), it never falls below the + legacy premium unless that premium rests on AFIP alone, and then the model + pays none unless an under-age claimant or partner has a PIP daily living + award. In Kingston upon Thames it never falls below the legacy premium where + an under-age claimant or partner has highest-rate DLA care. 6. For a child or young person in Great Britain, the qualifying flag matches the test's own calculation. The model pays the child's enhanced rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums) @@ -78,10 +77,9 @@ TOLERANCE = 1 # Each example builds one simulation with inputs for every year from 2015 to # 2030, so every example tests both sides of the Northern Ireland PIP date -# (2017), the Scottish changes (2023) and Kingston upon Thames's Housing -# Benefit years (2018 to 2022). Every council's own list starts in 2013-14, -# before the model's first year, so the test checks each list in every year -# the model applies it. +# (2017) and the Scottish changes (2023). Every council's own list starts in +# 2013-14, before the model's first year, so the test checks each list in +# every year the model applies it. YEARS = list(range(2015, 2031)) # (country, local authority): None keeps the default local authority. PLACES = [ @@ -124,20 +122,13 @@ # Each council's own list (Sch 3 para 12 of its scheme), by the scheme year # it starts: "dla_highest" is the DLA care component at the highest rate, # "any_pip" the PIP daily living component at either rate and "afip" armed -# forces independence payment. None marks years where the model applies the -# Housing Benefit condition instead. +# forces independence payment. COUNCIL_LISTS = { # The 2013 rules. "MERTON": {2013: ("dla_highest", "any_pip")}, - # The Council adopted the Default Scheme for 2013-14 and kept its list - # through 2017-18, and the council prints the same list in its texts from - # 2023-24. The model cites no complete scheme text for 2018-19 to - # 2022-23, so it assumes the Housing Benefit condition in those years. - "KINGSTON_UPON_THAMES": { - 2013: ("dla_highest", "any_pip"), - 2018: None, - 2023: ("dla_highest", "any_pip"), - }, + # The model's condition: the council's texts from 2023-24 print a wider + # list with an age limit, which the model doesn't yet apply (issue #2881). + "KINGSTON_UPON_THAMES": {2013: ("dla_highest",)}, # The 2013 scheme, and the 2014 scheme with AFIP. "NEWHAM": { 2013: ("dla_highest", "any_pip"), @@ -233,6 +224,8 @@ def qualifies_for_scheme(inputs, place, year): def scheme_age_limit(place, year): + if place[1] == "KINGSTON_UPON_THAMES": + return False return place[0] != "SCOTLAND" or year < 2023 @@ -247,7 +240,7 @@ def scheme_age_limit(place, year): upgrade_award=st.sampled_from(QUALIFYING_AWARDS), ) ) -# A family in each council with its own list, drawn for every example. +# A family in each council in COUNCIL_LISTS, drawn for every example. council_families = st.tuples( *( family.map(lambda f, place=place: dict(f, place=place)) @@ -338,9 +331,8 @@ def build(families, children): def oracle(f, year, attained): """Compute the two annual premiums for one family from the Regulations - and COUNCIL_LISTS, with the model's Housing Benefit assumption for - Kingston upon Thames in 2018 to 2022. attained[j] holds when adult j has - attained the qualifying age for State Pension Credit.""" + and COUNCIL_LISTS. attained[j] holds when adult j has attained the + qualifying age for State Pension Credit.""" p = system.parameters(year).gov.dwp.disability_premia rate = p.enhanced_couple if f["shape"] == "couple" else p.enhanced_single country = f["place"][0] @@ -361,6 +353,9 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): premium.""" country, council = f["place"] listed = council_list(council, year) + under_age = [ + award_inputs(a["awards"]) for j, a in enumerate(adults_of(f)) if not attained[j] + ] if country == "SCOTLAND": if year < 2023: assert np.isclose(ctr, edp, atol=0.01) @@ -370,12 +365,12 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): assert np.isclose(ctr, edp, atol=0.01) elif "afip" in listed: assert ctr >= edp - 0.01 + elif council == "KINGSTON_UPON_THAMES": + # The legacy premium also counts PIP daily living and AFIP, which the + # model's Kingston condition leaves out. + if any(top_rate_award(x, "dla_sc", year) for x in under_age): + assert ctr >= edp - 0.01 else: - under_age = [ - award_inputs(a["awards"]) - for j, a in enumerate(adults_of(f)) - if not attained[j] - ] rests_on_afip = edp > 0 and not any( top_rate_award(x, "dla_sc", year) or top_rate_award(x, "pip_dl", year) for x in under_age diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index ac4a65295c..9a49dcf702 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -12,24 +12,13 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "scheme's condition " "(meets_council_tax_reduction_enhanced_disability_premium_condition). " "It pays a different premium from the legacy one " - "(enhanced_disability_premium) in Scotland, Merton, Kingston upon " - "Thames, Newham and Westminster, where the scheme counts its own " - "awards. The model pays the Housing Benefit amounts in every scheme. Both 2026-27 " + "(enhanced_disability_premium) in Scotland, Merton, Newham and " + "Westminster, where the scheme counts its own awards, and in Kingston " + "upon Thames, where the model counts highest-rate DLA care alone. " + "The model pays the Housing Benefit amounts in every scheme. Both 2026-27 " "editions of Kingston upon Thames's scheme print £17.10 single and " - "£24.50 couple (Sch 3 para 17(5)), and their introductions say the " - "council uprates premiums as set out in the Prescribed Requirement " - "Scheme. In December 2013 the council delegated each year's uprating, " - "and the choice of its sources, to its Director of Finance, naming " - "the Government's general uprating documents where the pension-age " - "uprating lacks the detail. In July 2014 it kept its scheme for " - "2015-17 apart from a general uprating. The 2026 pension-age uprating " - "(S.I. 2026/27) has no adult enhanced premium. The model reads that " - "mechanism as giving the " - "Housing Benefit amounts, although the council's texts for 2021-22 to " - "2024-25 uprate the working-age personal allowances to the Housing " - "Benefit rates and keep this premium at its April 2020 rates; no " - "decision the model cites sets Kingston's own 2026-27 amounts. " - "Pension-age " + "£24.50 couple (Sch 3 para 17(5)), and no decision the model cites " + "sets Kingston's own 2026-27 amounts (issue #2881). Pension-age " "Council Tax Reduction includes no adult enhanced disability premium." ) definition_period = YEAR diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index 61fbdb7a8b..6825b8fbdf 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -18,22 +18,23 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "Council Tax Reduction scheme that covers their household. Scottish " "councils count attendance allowance at either rate from 1 April " "2023, and the Scottish Ministers removed the age limit from 20 June " - "2022. Merton and Kingston upon Thames count the PIP daily living " - "component at either rate and omit armed forces independence payment; " - "Newham counts the PIP daily living component at either rate and " - "armed forces independence payment. In Westminster the model applies " + "2022. Merton counts the PIP daily living component at either rate " + "and omits armed forces independence payment; Newham counts the PIP " + "daily living component at either rate and armed forces independence " + "payment. In Westminster the model applies " "the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12), which " "counts the PIP daily living component at either rate and omits armed " "forces independence payment: the council has approved the same " "scheme, based on the Default Scheme Regulations, since 2013/14, and " "its Cabinet says from December 2020 that its local scheme mirrors " "those Regulations, though the model cites no full Westminster scheme " - "text. Those four councils count an award only for a person under the " - "qualifying age for State Pension Credit. The model applies Kingston's " - "list in 2013-14 to 2017-18 and from 2023-24. It cites no complete " - "Kingston scheme text for 2018-19 to 2022-23, so for those years it " - "assumes the Housing Benefit list. The other three councils' lists " - "start on or before 1 April 2013 and apply in every model year. In " + "text. Those three councils count an award only for a person under the " + "qualifying age for State Pension Credit, and their lists start on or " + "before 1 April 2013 and apply in every model year. In Kingston upon " + "Thames the model counts highest-rate DLA care alone, with no age " + "limit; the council's texts from 2023-24 print a wider list with an " + "age limit (Sch 3 para 12), and issue #2881 lists what the model needs " + "to apply it. In " "every other scheme the model applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " @@ -48,7 +49,6 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "https://web.archive.org/web/20150530202253id_/http://www.merton.gov.uk/council_tax_reduction_scheme_l_b_merton_april_2013_with_uprated_amounts_final_310113-2.pdf", "https://www.merton.gov.uk/system/files/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202023-24_0.pdf", "https://www.merton.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%20L%20B%20Merton%202026-27.pdf", - "https://moderngov.kingston.gov.uk/mgAi.aspx?ID=20744", "https://www.legislation.gov.uk/uksi/2012/2886/appendix/3/regulation/12/made", "https://www.kingston.gov.uk/sites/default/files/2026-03/Council%20Tax%20Reduction%20Scheme%202026%20-%202027.pdf", "https://mgov.newham.gov.uk/documents/s74450/Appendix%201%20-%20LB%20Newham%20Local%20CTR%20Scheme_16_01_13.pdf", @@ -86,15 +86,14 @@ def council_condition(council): [ is_scotland_scheme(country), is_merton_area(local_authority, country), - is_kingston_upon_thames_area(local_authority, country) - & la.kingston_upon_thames.council_tax_reduction.enhanced_disability_premium.qualifying_benefits_apply, + is_kingston_upon_thames_area(local_authority, country), is_newham_area(local_authority, country), is_westminster_area(local_authority, country), ], [ scottish, council_condition(la.merton), - council_condition(la.kingston_upon_thames), + person("has_highest_dla_sc_award", period), council_condition(la.newham), council_condition(la.westminster), ], From b99e8c594433beb178d3bdc795233879716091e6 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 6 Nov 2026 14:29:43 -0500 Subject: [PATCH 43/43] Read is_enhanced_disabled_for_benefits for Kingston upon Thames's premium MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Kingston upon Thames's working-age Council Tax Reduction condition read has_highest_dla_sc_award, so an applicant whose flag rests on enhanced PIP daily living lost the enhanced disability premium: £1,144 a year of premium and £228.80 of reduction for a single applicant on a £15,000 pension. The condition now reads is_enhanced_disabled_for_benefits with main's formula and no age limit, as main's legacy count does, so Kingston's CTR premiums match main's for every input. A Kingston reduction still changes where someone gains or loses Income Support through the branch's legacy premium: an applicant's award passports them to the maximum reduction, and a non-dependant's award spares the household their deduction. - is_enhanced_disabled_for_benefits: main's label and formula, with documentation of its readers, its formula and the value policyengine-uk-data stores. - The condition's and the premium's documentation, the CTR YAML header and Case 19 describe the flag. Case 25 gives two Kingston applicants enhanced PIP daily living, one with the flag: reductions of £1,481.08 and £1,252.28. - test_enhanced_disability_premium_properties.py: the Kingston oracle computes the flag's formula (DLA care of at least 52 times the highest weekly rate, at any age), and invariant 5 compares the two premiums wherever a claimant or partner meets it. - The applicant property test's comment names the flag, and the changelog says Kingston keeps reading it. Co-Authored-By: Claude Opus 5.5 --- changelog.d/1971.fixed.md | 2 +- .../enhanced_disability_premium.yaml | 79 ++++++++++++++++++- ...ncil_tax_reduction_applicant_properties.py | 12 +-- ..._enhanced_disability_premium_properties.py | 32 ++++++-- ...x_reduction_enhanced_disability_premium.py | 3 +- ...n_enhanced_disability_premium_condition.py | 10 +-- .../is_enhanced_disabled_for_benefits.py | 33 ++++---- 7 files changed, 133 insertions(+), 38 deletions(-) diff --git a/changelog.d/1971.fixed.md b/changelog.d/1971.fixed.md index 6370320616..8203a92bc9 100644 --- a/changelog.d/1971.fixed.md +++ b/changelog.d/1971.fixed.md @@ -1 +1 @@ -Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. In Kingston upon Thames the model keeps highest-rate DLA care alone, with no age limit, until it can apply the council's own list. +Pay the legacy enhanced disability premium for an award of enhanced PIP daily living or armed forces independence payment as well as the highest DLA care rate, and apply its State Pension Credit age limit. Count an award only where its amount is positive, and count an amount entered without its category when it reaches `52 × (top weekly rate − £1)`. Give four working-age Council Tax Reduction schemes their own lists. Scottish councils count attendance allowance at either rate from April 2023, and the Scottish Ministers removed the age limit from June 2022. Merton and Westminster count either PIP daily living rate and omit armed forces independence payment; Newham counts either PIP daily living rate and armed forces independence payment. In Kingston upon Thames the model keeps reading `is_enhanced_disabled_for_benefits`, with no age limit, until it can apply the council's own list. diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml index 0fc16536a9..2a62a3664c 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/enhanced_disability_premium.yaml @@ -13,9 +13,11 @@ # the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12(1)): DLA care highest # and PIP daily living at either rate, without AFIP. Those three councils keep # the qualifying age for State Pension Credit as the age limit, and their lists -# apply in every model year. In Kingston upon Thames the model counts DLA care -# highest alone, with no age limit (issue #2881). The model reads each year's -# rules at 30 April. +# apply in every model year. In Kingston upon Thames the model reads +# is_enhanced_disabled_for_benefits, with no age limit (issue #2881): the value +# a case supplies, or else the flag's formula, which counts DLA care of at +# least 52 times the highest weekly rate. The model reads each year's rules at +# 30 April. # Unless a case sets `is_disabled_for_benefits`, it keeps its default, false, # and the model pays no disability premium, although the schemes give one to # a claimant under the qualifying age who receives these awards (for example @@ -754,7 +756,9 @@ # Merton's list counts only highest DLA care or PIP daily living. meets_council_tax_reduction_enhanced_disability_premium_condition: false -- name: Case 19, in Kingston upon Thames the model counts only highest-rate DLA care. +- name: Case 19, in Kingston upon Thames the flag's formula counts only highest-rate DLA care. + # The case supplies no is_enhanced_disabled_for_benefits, so the model applies + # the flag's formula: DLA care of at least 52 times the highest weekly rate. # The council's texts from 2023-24 print a wider list with an age limit (Sch 3 # para 12), and issue #2881 lists what the model needs to apply it. period: 2026 @@ -949,3 +953,70 @@ council_tax_reduction_devolved_working_age: true # The head's own conditions: (22.00 + 86.05) * 52. council_tax_reduction_working_age_adult_premiums: 5_618.60 + +- name: Case 25, in Kingston upon Thames a supplied is_enhanced_disabled_for_benefits gives the premium. + # Two applicants aged 40 with enhanced PIP daily living. The first carries + # the flag, as policyengine-uk-data sets it for that award; the second + # doesn't. A pension of 15,000 keeps both reductions on the taper. 2026-27 + # rates: personal allowance (25 or over) 95.55, severe disability premium + # 86.05, disability premium 44.85, enhanced disability premium 22.00; + # Kingston's withdrawal rate 20%. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + flag: + age: 40 + pip_dl_category: ENHANCED + is_disabled_for_benefits: true + is_enhanced_disabled_for_benefits: true + private_pension_income: 15_000 + no_flag: + age: 40 + pip_dl_category: ENHANCED + is_disabled_for_benefits: true + is_enhanced_disabled_for_benefits: false + private_pension_income: 15_000 + benunits: + flag: + members: [flag] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + no_flag: + members: [no_flag] + would_claim_uc: false + would_claim_IS: false + would_claim_pc: false + claims_all_entitled_benefits: true + households: + flag: + members: [flag] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax: 1_800 + savings: 0 + no_flag: + members: [no_flag] + country: ENGLAND + local_authority: KINGSTON_UPON_THAMES + council_tax: 1_800 + savings: 0 + output: + # Without the flag, the model reads its formula, which counts DLA care + # alone, though the council's texts list PIP daily living (issue #2881). + meets_council_tax_reduction_enhanced_disability_premium_condition: [true, false] + # The legacy premium counts enhanced PIP daily living in both. + enhanced_disability_premium: [1_144, 1_144] + # 22.00 * 52 = 1,144.00. + council_tax_reduction_enhanced_disability_premium: [1_144, 0] + # Severe disability premium 86.05 * 52 = 4,474.60 and disability premium + # 44.85 * 52 = 2,332.20, plus 1,144.00 with the flag: 7,950.80 and 6,806.80. + council_tax_reduction_premiums: [7_950.80, 6_806.80] + # Personal allowance 95.55 * 52 = 4,968.60, plus the premiums. + council_tax_reduction_applicable_amount: [12_919.40, 11_775.40] + # Income tax of 20% of (15,000 - 12,570) = 486 leaves income of 14,514. + # 1,800 - 20% of (14,514 - 12,919.40) = 1,481.08, and 1,800 - 20% of + # (14,514 - 11,775.40) = 1,252.28. + council_tax_reduction: [1_481.08, 1_252.28] diff --git a/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py b/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py index 368a05afd9..fc534a6d84 100644 --- a/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py +++ b/policyengine_uk/tests/test_council_tax_reduction_applicant_properties.py @@ -73,11 +73,13 @@ ] SHAPES = ["alone", "couple", "young_parents"] # The head's own circumstances that the premiums and the exemption read: -# disability, the enhanced PIP daily living component (an enhanced disability -# premium qualifying benefit), Attendance Allowance (a severe disability -# premium qualifying benefit, which also exempts her from non-dependant -# deductions, and an enhanced disability premium one for Scottish councils -# from 2023), Carer's Allowance (the carer premium) and blindness. +# disability, the enhanced disability flag (the enhanced disability premium +# condition in Kingston upon Thames), the enhanced PIP daily living component +# (an enhanced disability premium qualifying benefit elsewhere), Attendance +# Allowance (a severe disability premium qualifying benefit, which also +# exempts her from non-dependant deductions, and an enhanced disability +# premium one for Scottish councils from 2023), Carer's Allowance (the carer +# premium) and blindness. head_circumstances = st.fixed_dictionaries( dict( is_disabled_for_benefits=st.booleans(), diff --git a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py index 3ba828cba0..2ae2d6f9a8 100644 --- a/policyengine_uk/tests/test_enhanced_disability_premium_properties.py +++ b/policyengine_uk/tests/test_enhanced_disability_premium_properties.py @@ -22,8 +22,10 @@ the model applies the Default Scheme's list (S.I. 2012/2886 Sch 3 para 12), which counts the PIP daily living component at either rate and omits AFIP. Each of those lists starts on or before 1 April 2013 (COUNCIL_LISTS) and -applies in every model year. In Kingston upon Thames the model counts -highest-rate DLA care alone, with no age limit (issue #2881). The model also +applies in every model year. In Kingston upon Thames the model reads +is_enhanced_disabled_for_benefits, with no age limit (issue #2881). The test +supplies no value for that flag, so the model applies its formula: DLA care of +at least 52 times the highest weekly rate, with no tolerance. The model also applies the Housing Benefit condition in Wales and every other scheme. The test generates single people, couples and lone parents in the places and @@ -51,7 +53,8 @@ legacy premium unless that premium rests on AFIP alone, and then the model pays none unless an under-age claimant or partner has a PIP daily living award. In Kingston upon Thames it never falls below the legacy premium where - an under-age claimant or partner has highest-rate DLA care. + a claimant or partner of any age has DLA care of at least 52 times the + highest weekly rate. 6. For a child or young person in Great Britain, the qualifying flag matches the test's own calculation. The model pays the child's enhanced rate in the Housing Benefit child premiums (housing_benefit_child_disability_premiums) @@ -122,13 +125,14 @@ # Each council's own list (Sch 3 para 12 of its scheme), by the scheme year # it starts: "dla_highest" is the DLA care component at the highest rate, # "any_pip" the PIP daily living component at either rate and "afip" armed -# forces independence payment. +# forces independence payment. "enhanced_disabled_flag" is the formula of +# is_enhanced_disabled_for_benefits, which the model reads in place of a list. COUNCIL_LISTS = { # The 2013 rules. "MERTON": {2013: ("dla_highest", "any_pip")}, # The model's condition: the council's texts from 2023-24 print a wider # list with an age limit, which the model doesn't yet apply (issue #2881). - "KINGSTON_UPON_THAMES": {2013: ("dla_highest",)}, + "KINGSTON_UPON_THAMES": {2013: ("enhanced_disabled_flag",)}, # The 2013 scheme, and the 2014 scheme with AFIP. "NEWHAM": { 2013: ("dla_highest", "any_pip"), @@ -184,6 +188,14 @@ def afip(inputs): return inputs.get("armed_forces_independence_payment", 0) > 0 +def enhanced_disabled_flag(inputs, year): + """Compute the formula of is_enhanced_disabled_for_benefits, which the + model reads in Kingston upon Thames: DLA care of at least 52 times the + highest weekly rate, entered or computed from the category.""" + higher = system.parameters(year).gov.dwp.dla.self_care.higher + return amount(inputs, "dla_sc", year) >= higher * WEEKS_IN_YEAR + + def qualifies(inputs, country, year): """Check for the legacy premium's qualifying awards under the Regulations.""" @@ -219,6 +231,7 @@ def qualifies_for_scheme(inputs, place, year): dla_highest=top_rate_award(inputs, "dla_sc", year), any_pip=amount(inputs, "pip_dl", year) > 0, afip=afip(inputs), + enhanced_disabled_flag=enhanced_disabled_flag(inputs, year), ) return any(held[award] for award in listed) @@ -366,9 +379,12 @@ def check_scheme_against_legacy(f, year, attained, edp, ctr): elif "afip" in listed: assert ctr >= edp - 0.01 elif council == "KINGSTON_UPON_THAMES": - # The legacy premium also counts PIP daily living and AFIP, which the - # model's Kingston condition leaves out. - if any(top_rate_award(x, "dla_sc", year) for x in under_age): + # The legacy premium also counts PIP daily living, AFIP, highest-rate + # DLA care entered with a smaller amount, and DLA care amounts within + # £1 a week of the top rate, all of which the flag's formula leaves + # out. The flag sets no age limit. + claimants = [award_inputs(a["awards"]) for a in adults_of(f)] + if any(enhanced_disabled_flag(x, year) for x in claimants): assert ctr >= edp - 0.01 else: rests_on_afip = edp > 0 and not any( diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py index 9f541daba7..0f3afd3974 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_enhanced_disability_premium.py @@ -14,7 +14,8 @@ class council_tax_reduction_enhanced_disability_premium(Variable): "It pays a different premium from the legacy one " "(enhanced_disability_premium) in Scotland, Merton, Newham and " "Westminster, where the scheme counts its own awards, and in Kingston " - "upon Thames, where the model counts highest-rate DLA care alone. " + "upon Thames, where the model reads is_enhanced_disabled_for_benefits " + "with no age limit. " "This variable pays the Housing Benefit amounts in every scheme; " "Scotland's and Wales's working-age awards read only whether it is " "payable and pay their own amounts " diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py index 6825b8fbdf..a5b7fb6a0f 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/meets_council_tax_reduction_enhanced_disability_premium_condition.py @@ -31,10 +31,10 @@ class meets_council_tax_reduction_enhanced_disability_premium_condition(Variable "text. Those three councils count an award only for a person under the " "qualifying age for State Pension Credit, and their lists start on or " "before 1 April 2013 and apply in every model year. In Kingston upon " - "Thames the model counts highest-rate DLA care alone, with no age " - "limit; the council's texts from 2023-24 print a wider list with an " - "age limit (Sch 3 para 12), and issue #2881 lists what the model needs " - "to apply it. In " + "Thames the model reads is_enhanced_disabled_for_benefits, with no age " + "limit; that variable's documentation says what sets it. The council's " + "texts from 2023-24 print a wider list with an age limit (Sch 3 para " + "12), and issue #2881 lists what the model needs to apply it. In " "every other scheme the model applies the Housing Benefit condition " "(receives_enhanced_disability_premium_qualifying_benefit, under the " "same age limit). Welsh councils apply that condition under W.S.I. " @@ -93,7 +93,7 @@ def council_condition(council): [ scottish, council_condition(la.merton), - person("has_highest_dla_sc_award", period), + person("is_enhanced_disabled_for_benefits", period), council_condition(la.newham), council_condition(la.westminster), ], diff --git a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py index 932af29201..273ec67b76 100644 --- a/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py +++ b/policyengine_uk/variables/household/demographic/is_enhanced_disabled_for_benefits.py @@ -4,22 +4,27 @@ class is_enhanced_disabled_for_benefits(Variable): value_type = bool entity = Person - label = "Receives an enhanced disability premium qualifying benefit (deprecated)" + label = "Whether meets the middle disability benefit entitlement" documentation = ( - "No premium reads this deprecated flag. The enhanced disability premium " - "reads receives_enhanced_disability_premium_qualifying_benefit, which " - "this returns, and applies each programme's own conditions. The model " - "keeps it for downstream compatibility and for the deprecated counts " - "num_enhanced_disabled_adults and num_enhanced_disabled_children. " - "policyengine-uk-data stores its own value of this flag in the " - "Enhanced FRS, and the model uses that value in place of this formula " - "in dataset runs. The stored flag holds where reported attendance " - "allowance reaches the higher weekly rate less £1, reported disability " - "living allowance care exceeds the highest weekly rate less £1, or " - "reported personal independence payment daily living reaches the " - "enhanced weekly rate less £1." + "The model reads this flag for the enhanced disability premium in " + "Kingston upon Thames's working-age Council Tax Reduction, with no age " + "limit (meets_council_tax_reduction_enhanced_disability_premium_condition), " + "and in the deprecated counts num_enhanced_disabled_adults and " + "num_enhanced_disabled_children. No other premium reads it. The formula " + "holds where DLA care reaches 52 times the highest weekly rate. " + "policyengine-uk-data stores its own value of this flag in the Enhanced " + "FRS, and the model uses that value in place of the formula in dataset " + "runs. The stored flag holds where reported attendance allowance " + "reaches the higher weekly rate less £1, reported disability living " + "allowance care exceeds the highest weekly rate less £1, or reported " + "personal independence payment daily living reaches the enhanced weekly " + "rate less £1. Issue #2881 lists what the model needs to apply Kingston " + "upon Thames's own list." ) definition_period = YEAR def formula(person, period, parameters): - return person("receives_enhanced_disability_premium_qualifying_benefit", period) + DLA_requirement = ( + parameters(period).gov.dwp.dla.self_care.higher * WEEKS_IN_YEAR + ) + return person("dla_sc", period) >= DLA_requirement