From e2699b77458e8f00cc8f360b6615bb75373f7b0b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 13:43:10 +0000 Subject: [PATCH 01/11] Move the shared child disability premium conditions into one helper Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a --- .../_child_disability_premiums.py | 29 +++++++++++++++++++ ...using_benefit_child_disability_premiums.py | 18 +++++------- 2 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py b/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py new file mode 100644 index 0000000000..ab9cf41589 --- /dev/null +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py @@ -0,0 +1,29 @@ +from policyengine_uk.model_api import * + + +def child_disability_premium_benefit_conditions(person, period): + """The disabled child and enhanced disability premium conditions that + Housing Benefit and pension-age Council Tax Reduction share, for each + person, leaving out the armed forces independence payment. + + A child or young person meets the disabled child condition with a positive + DLA amount (either component), a positive PIP amount (either component) or + the blindness indicator (HB Regs 2006 Sch 3 para 16; SI 2012/2885 Sch 2 + para 8(a)-(b); WSI 2013/3029 Sch 2 para 8(a)-(b); SSI 2012/319 Sch 1 para + 9(a)-(b)). They meet the enhanced condition with the DLA care component at + the highest rate (has_highest_dla_sc_award) or the PIP daily living + component at the enhanced rate (has_enhanced_pip_dl_award) (HB Regs 2006 + Sch 3 para 15; SI 2012/2885 Sch 2 para 7(1)(a)-(b); WSI 2013/3029 Sch 2 + para 7(1)(a)-(b); SSI 2012/319 Sch 1 para 8(1)(a)-(b)). Each caller adds + its own armed forces independence payment route. + + Both conditions read only DLA and PIP fields, so callers enter a Scottish + child disability payment or adult disability payment there. + """ + dla = (person("dla_sc", period) > 0) | (person("dla_m", period) > 0) + pip = (person("pip_dl", period) > 0) | (person("pip_m", period) > 0) + disabled_child = dla | pip | person("is_blind", period) + enhanced = person("has_highest_dla_sc_award", period) | person( + "has_enhanced_pip_dl_award", period + ) + return disabled_child, enhanced 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 171979a8cb..9e46823182 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 @@ -1,4 +1,7 @@ from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.dwp.housing_benefit._child_disability_premiums import ( + child_disability_premium_benefit_conditions, +) class housing_benefit_child_disability_premiums(Variable): @@ -36,16 +39,11 @@ def formula(benunit, period, parameters): p = parameters(period).gov.dwp.housing_benefit.premiums person = benunit.members child = person("is_child_or_young_person_for_legacy_benefits", period) - dla_care = person("dla_sc", period) > 0 - dla = dla_care | (person("dla_m", period) > 0) - pip_daily = person("pip_dl", period) > 0 - pip = pip_daily | (person("pip_m", period) > 0) + disabled, enhanced = child_disability_premium_benefit_conditions(person, period) + # Housing Benefit counts AFIP for any child or young person in both + # premiums. afip = person("armed_forces_independence_payment", period) > 0 - disabled = dla | pip | afip | person("is_blind", period) - enhanced = ( - person("has_highest_dla_sc_award", period) - | person("has_enhanced_pip_dl_award", period) - | afip - ) + disabled = disabled | afip + enhanced = enhanced | afip weekly = p.disabled_child * disabled + p.enhanced_disabled_child * enhanced return benunit.sum(child * weekly) * WEEKS_IN_YEAR From 67004f48a8cb3d4f01883a8a6e488960b38303f5 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 13:43:10 +0000 Subject: [PATCH 02/11] Add the pension-age CTR child disability premium amounts and AFIP routes Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a --- .../disabled_child_premium/child.yaml | 16 ++++ .../disabled_child_premium/young_person.yaml | 19 +++++ .../enhanced_disability_premium/child.yaml | 19 +++++ .../young_person.yaml | 19 +++++ .../disabled_child_premium.yaml | 77 +++++++++++++++++++ .../enhanced_disability_premium.yaml | 77 +++++++++++++++++++ .../disabled_child_premium/child.yaml | 16 ++++ .../disabled_child_premium/young_person.yaml | 14 ++++ .../enhanced_disability_premium/child.yaml | 16 ++++ .../young_person.yaml | 14 ++++ .../disabled_child_premium.yaml | 77 +++++++++++++++++++ .../enhanced_disability_premium.yaml | 77 +++++++++++++++++++ .../disabled_child_premium/child.yaml | 19 +++++ .../disabled_child_premium/young_person.yaml | 19 +++++ .../enhanced_disability_premium/child.yaml | 14 ++++ .../young_person.yaml | 14 ++++ .../disabled_child_premium.yaml | 72 +++++++++++++++++ .../enhanced_disability_premium.yaml | 72 +++++++++++++++++ 18 files changed, 651 insertions(+) create mode 100644 policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml new file mode 100644 index 0000000000..fab893223c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml @@ -0,0 +1,16 @@ +description: Councils in England count a child (under 16) in a pensioner's family for the disabled child premium under the England Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: false + reference: + - title: SI 2012/2885 Sch. 2 para. 8, as in force on 30 April 2015, which has no AFIP limb; nor has the text in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + - title: SI 2012/2885 Sch. 2 para. 8(e), as in force on 30 April 2023, which reaches only a young person + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2023-04-30 +metadata: + unit: bool + period: year + label: England Council Tax Reduction pensioner disabled child premium AFIP route for a child + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml new file mode 100644 index 0000000000..4f3a4f33dc --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml @@ -0,0 +1,19 @@ +description: Councils in England count a young person (a Child Benefit qualifying young person) in a pensioner's family for the disabled child premium under the England Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: false + reference: + - title: SI 2012/2885 Sch. 2 para. 8, as in force on 30 April 2015, which has no AFIP limb; nor has the text in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + 2023-04-01: + value: true + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2023 (SI 2023/16) regs. 1(3) and 7(8), inserting Sch. 2 para. 8(e) for schemes for financial years from 1 April 2023 + href: https://www.legislation.gov.uk/uksi/2023/16/made +metadata: + unit: bool + period: year + label: England Council Tax Reduction pensioner disabled child premium AFIP route for a young person + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml new file mode 100644 index 0000000000..4de79d91be --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml @@ -0,0 +1,19 @@ +description: Councils in England count a child (under 16) in a pensioner's family for the enhanced disability premium under the England Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: false + reference: + - title: SI 2012/2885 Sch. 2 para. 7(1), as in force on 30 April 2015, which has no AFIP limb; nor has the text in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + 2023-04-01: + value: true + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2023 (SI 2023/16) regs. 1(3) and 7(7)(c), inserting Sch. 2 para. 7(1)(c) for schemes for financial years from 1 April 2023 + href: https://www.legislation.gov.uk/uksi/2023/16/made +metadata: + unit: bool + period: year + label: England Council Tax Reduction pensioner enhanced disability premium AFIP route for a child + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml new file mode 100644 index 0000000000..f66428b35e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml @@ -0,0 +1,19 @@ +description: Councils in England count a young person (a Child Benefit qualifying young person) in a pensioner's family for the enhanced disability premium under the England Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: false + reference: + - title: SI 2012/2885 Sch. 2 para. 7(1), as in force on 30 April 2015, which has no AFIP limb; nor has the text in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + 2023-04-01: + value: true + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) (Amendment) Regulations 2023 (SI 2023/16) regs. 1(3) and 7(7)(c), inserting Sch. 2 para. 7(1)(c) for schemes for financial years from 1 April 2023 + href: https://www.legislation.gov.uk/uksi/2023/16/made +metadata: + unit: bool + period: year + label: England Council Tax Reduction pensioner enhanced disability premium AFIP route for a young person + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml new file mode 100644 index 0000000000..f4f52013a6 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml @@ -0,0 +1,77 @@ +description: Weekly amount of the disabled child premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 8, in the applicable amount of a pensioner under the England Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. +values: + # We take each value from the table of premium amounts in the version + # of the schedule in force on 30 April of that year. + 2013-04-01: + value: 57.89 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2013 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2013-04-30 + 2014-04-01: + value: 59.50 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2014 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2014-04-30 + 2015-04-01: + value: 60.06 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2015 (unchanged to 2016-17) + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + 2017-04-01: + value: 60.90 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2017 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2017-04-30 + 2018-04-01: + value: 62.86 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2018 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2018-04-30 + 2019-04-01: + value: 64.19 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2019 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2019-04-30 + 2020-04-01: + value: 65.52 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2020 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2020-04-30 + 2021-04-01: + value: 65.94 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2021 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2021-04-30 + 2022-04-01: + value: 68.04 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2022-04-30 + 2023-04-01: + value: 74.69 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2023 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2023-04-30 + 2024-04-01: + value: 80.01 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2024 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2024-04-30 + 2025-04-01: + value: 81.37 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2025 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2025-04-30 + 2026-04-01: + value: 84.46 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (3), as in force on 30 April 2026 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: England Council Tax Reduction pensioner disabled child premium for a child or young person + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(d) and Sch. 2 paras. 8 and 4, Part 4 entry (3) + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml new file mode 100644 index 0000000000..6ed7cdf17c --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml @@ -0,0 +1,77 @@ +description: Weekly amount of the enhanced disability premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 7, in the applicable amount of a pensioner under the England Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. +values: + # We take each value from the table of premium amounts in the version + # of the schedule in force on 30 April of that year. + 2013-04-01: + value: 23.45 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2013 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2013-04-30 + 2014-04-01: + value: 24.08 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2014 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2014-04-30 + 2015-04-01: + value: 24.43 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2015 (unchanged to 2016-17) + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2015-04-30 + 2017-04-01: + value: 24.78 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2017 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2017-04-30 + 2018-04-01: + value: 25.48 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2018 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2018-04-30 + 2019-04-01: + value: 26.04 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2019 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2019-04-30 + 2020-04-01: + value: 26.60 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2020 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2020-04-30 + 2021-04-01: + value: 26.67 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2021 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2021-04-30 + 2022-04-01: + value: 27.44 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2022 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2022-04-30 + 2023-04-01: + value: 30.17 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2023 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2023-04-30 + 2024-04-01: + value: 32.20 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2024 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2024-04-30 + 2025-04-01: + value: 32.75 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2025 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2025-04-30 + 2026-04-01: + value: 33.99 + reference: + - title: SI 2012/2885 Sch. 2 Part 4 entry (2), as in force on 30 April 2026 + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: England Council Tax Reduction pensioner enhanced disability premium for a child or young person + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(d) and Sch. 2 paras. 7 and 4, Part 4 entry (2) + href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml new file mode 100644 index 0000000000..429c9ecfa5 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml @@ -0,0 +1,16 @@ +description: Councils in Scotland count a child (under 16) in a pensioner's family for the disabled child premium under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2013-06-11: + value: false + reference: + - title: SSI 2012/319 Sch. 1 para. 9(ba), as in force on 30 April 2015, which reaches only a young person + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2015-04-30 + - title: SSI 2012/319 Sch. 1 para. 9(ba), as in force on 30 April 2026, which reaches only a young person + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2026-04-30 +metadata: + unit: bool + period: year + label: Scotland Council Tax Reduction pensioner disabled child premium AFIP route for a child + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 Sch. 1 paras. 8 and 9 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml new file mode 100644 index 0000000000..8097ce0d4e --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml @@ -0,0 +1,14 @@ +description: Councils in Scotland count a young person (a Child Benefit qualifying young person) in a pensioner's family for the disabled child premium under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2013-06-11: + value: true + reference: + - title: SSI 2013/142 regs. 1 and 12(7)(d), inserting SSI 2012/319 Sch. 1 para. 9(ba) from 11 June 2013, as the text in force on 30 April 2015 notes + href: https://www.legislation.gov.uk/ssi/2013/142/made +metadata: + unit: bool + period: year + label: Scotland Council Tax Reduction pensioner disabled child premium AFIP route for a young person + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 Sch. 1 paras. 8 and 9 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml new file mode 100644 index 0000000000..5c07ab4a51 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml @@ -0,0 +1,16 @@ +description: Councils in Scotland count a child (under 16) in a pensioner's family for the enhanced disability premium under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2013-06-11: + value: false + reference: + - title: SSI 2012/319 Sch. 1 para. 8(1)(aa), as in force on 30 April 2015, which reaches only a young person + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2015-04-30 + - title: SSI 2012/319 Sch. 1 para. 8(1)(aa), as in force on 30 April 2026, which reaches only a young person + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2026-04-30 +metadata: + unit: bool + period: year + label: Scotland Council Tax Reduction pensioner enhanced disability premium AFIP route for a child + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 Sch. 1 paras. 8 and 9 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml new file mode 100644 index 0000000000..1e6312e585 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml @@ -0,0 +1,14 @@ +description: Councils in Scotland count a young person (a Child Benefit qualifying young person) in a pensioner's family for the enhanced disability premium under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2013-06-11: + value: true + reference: + - title: SSI 2013/142 regs. 1 and 12(7)(c), inserting SSI 2012/319 Sch. 1 para. 8(1)(aa) from 11 June 2013, as the text in force on 30 April 2015 notes + href: https://www.legislation.gov.uk/ssi/2013/142/made +metadata: + unit: bool + period: year + label: Scotland Council Tax Reduction pensioner enhanced disability premium AFIP route for a young person + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 Sch. 1 paras. 8 and 9 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml new file mode 100644 index 0000000000..6379b89387 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml @@ -0,0 +1,77 @@ +description: Weekly amount of the disabled child premium for each child or young person in the applicant's family who meets the condition in Sch. 1 para. 9, in the applicable amount of a pensioner under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. +values: + # We take each value from the table of premium amounts in the version + # of the schedule in force on 30 April of that year. + 2013-04-01: + value: 57.89 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2013 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2013-04-30 + 2014-04-01: + value: 59.50 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2014 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2014-04-30 + 2015-04-01: + value: 60.06 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2015 (unchanged to 2016-17) + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2015-04-30 + 2017-04-01: + value: 60.90 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2017 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2017-04-30 + 2018-04-01: + value: 62.86 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2018 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2018-04-30 + 2019-04-01: + value: 64.19 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2019 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2019-04-30 + 2020-04-01: + value: 65.52 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2020 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2020-04-30 + 2021-04-01: + value: 65.94 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2021 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2021-04-30 + 2022-04-01: + value: 68.04 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2022 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2022-04-30 + 2023-04-01: + value: 74.69 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2023 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2023-04-30 + 2024-04-01: + value: 80.01 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2024 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2024-04-30 + 2025-04-01: + value: 81.37 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2025 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2025-04-30 + 2026-04-01: + value: 84.46 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (3), as in force on 30 April 2026 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Scotland Council Tax Reduction pensioner disabled child premium for a child or young person + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 20(d) and Sch. 1 paras. 9 and 13 entry (3) + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml new file mode 100644 index 0000000000..796ee71805 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml @@ -0,0 +1,77 @@ +description: Weekly amount of the enhanced disability premium for each child or young person in the applicant's family who meets the condition in Sch. 1 para. 8, in the applicable amount of a pensioner under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. +values: + # We take each value from the table of premium amounts in the version + # of the schedule in force on 30 April of that year. + 2013-04-01: + value: 23.45 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2013 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2013-04-30 + 2014-04-01: + value: 24.08 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2014 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2014-04-30 + 2015-04-01: + value: 24.43 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2015 (unchanged to 2016-17) + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2015-04-30 + 2017-04-01: + value: 24.78 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2017 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2017-04-30 + 2018-04-01: + value: 25.48 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2018 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2018-04-30 + 2019-04-01: + value: 26.04 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2019 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2019-04-30 + 2020-04-01: + value: 26.60 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2020 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2020-04-30 + 2021-04-01: + value: 26.67 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2021 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2021-04-30 + 2022-04-01: + value: 27.44 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2022 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2022-04-30 + 2023-04-01: + value: 30.17 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2023 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2023-04-30 + 2024-04-01: + value: 32.20 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2024 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2024-04-30 + 2025-04-01: + value: 32.75 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2025 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2025-04-30 + 2026-04-01: + value: 33.99 + reference: + - title: SSI 2012/319 Sch. 1 para. 13 entry (2), as in force on 30 April 2026 + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Scotland Council Tax Reduction pensioner enhanced disability premium for a child or young person + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012 reg. 20(d) and Sch. 1 paras. 8 and 13 entry (2) + href: https://www.legislation.gov.uk/ssi/2012/319/schedule/1 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml new file mode 100644 index 0000000000..2e43cc5f5f --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/child.yaml @@ -0,0 +1,19 @@ +description: Councils in Wales count a child (under 16) in a pensioner's family for the disabled child premium under the Welsh Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: false + reference: + - title: WSI 2013/3029 Sch. 2 para. 8, as in force on 30 April 2015 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 + 2024-04-01: + value: true + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements and Default Scheme) (Amendment) (Wales) Regulations 2024 (WSI 2024/56) regs. 1(3) and 5(d), inserting Sch. 2 para. 8(d) for schemes for financial years from 1 April 2024 + href: https://www.legislation.gov.uk/wsi/2024/56/made +metadata: + unit: bool + period: year + label: Wales Council Tax Reduction pensioner disabled child premium AFIP route for a child + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml new file mode 100644 index 0000000000..c63ca6b577 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/disabled_child_premium/young_person.yaml @@ -0,0 +1,19 @@ +description: Councils in Wales count a young person (a Child Benefit qualifying young person) in a pensioner's family for the disabled child premium under the Welsh Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: false + reference: + - title: WSI 2013/3029 Sch. 2 para. 8, as in force on 30 April 2015 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 + 2024-04-01: + value: true + reference: + - title: The Council Tax Reduction Schemes (Prescribed Requirements and Default Scheme) (Amendment) (Wales) Regulations 2024 (WSI 2024/56) regs. 1(3) and 5(d), inserting Sch. 2 para. 8(d) for schemes for financial years from 1 April 2024 + href: https://www.legislation.gov.uk/wsi/2024/56/made +metadata: + unit: bool + period: year + label: Wales Council Tax Reduction pensioner disabled child premium AFIP route for a young person + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml new file mode 100644 index 0000000000..caa4849543 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/child.yaml @@ -0,0 +1,14 @@ +description: Councils in Wales count a child (under 16) in a pensioner's family for the enhanced disability premium under the Welsh Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: true + reference: + - title: WSI 2013/3029 Sch. 2 para. 7(1)(c), as in force on 30 April 2015 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 +metadata: + unit: bool + period: year + label: Wales Council Tax Reduction pensioner enhanced disability premium AFIP route for a child + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml new file mode 100644 index 0000000000..d61a05b708 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/armed_forces_independence_payment/enhanced_disability_premium/young_person.yaml @@ -0,0 +1,14 @@ +description: Councils in Wales count a young person (a Child Benefit qualifying young person) in a pensioner's family for the enhanced disability premium under the Welsh Council Tax Reduction prescribed requirements when an armed forces independence payment (AFIP) is payable for them, if this is true. +values: + 2015-04-01: + value: true + reference: + - title: WSI 2013/3029 Sch. 2 para. 7(1)(c), as in force on 30 April 2015 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 +metadata: + unit: bool + period: year + label: Wales Council Tax Reduction pensioner enhanced disability premium AFIP route for a young person + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 2 paras. 7 and 8 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml new file mode 100644 index 0000000000..8bb89e4a9b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml @@ -0,0 +1,72 @@ +description: Weekly amount of the disabled child premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 8, in the applicable amount of a pensioner under the Welsh Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. +values: + # We take each value from the table of premium amounts in the version + # of the schedule in force on 30 April of that year. + 2014-04-01: + value: 59.50 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2014 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2014-04-30 + 2015-04-01: + value: 60.06 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2015 (unchanged to 2016-17) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 + 2017-04-01: + value: 60.90 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2017 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2017-04-30 + 2018-04-01: + value: 62.86 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2018 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2018-04-30 + 2019-04-01: + value: 64.19 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2019 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2019-04-30 + 2020-04-01: + value: 65.52 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2020 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2020-04-30 + 2021-04-01: + value: 65.94 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2021 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2021-04-30 + 2022-04-01: + value: 68.04 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2022 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2022-04-30 + 2023-04-01: + value: 74.69 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2023 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2023-04-30 + 2024-04-01: + value: 80.01 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2024 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2024-04-30 + 2025-04-01: + value: 81.37 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2025 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2025-04-30 + 2026-04-01: + value: 84.46 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (3), as in force on 30 April 2026 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Wales Council Tax Reduction pensioner disabled child premium for a child or young person + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 1 para. 1(1)(d) and Sch. 2 paras. 8 and 12 entry (3) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml new file mode 100644 index 0000000000..eaeb5e6611 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml @@ -0,0 +1,72 @@ +description: Weekly amount of the enhanced disability premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 7, in the applicable amount of a pensioner under the Welsh Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. +values: + # We take each value from the table of premium amounts in the version + # of the schedule in force on 30 April of that year. + 2014-04-01: + value: 24.08 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2014 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2014-04-30 + 2015-04-01: + value: 24.43 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2015 (unchanged to 2016-17) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2015-04-30 + 2017-04-01: + value: 24.78 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2017 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2017-04-30 + 2018-04-01: + value: 25.48 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2018 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2018-04-30 + 2019-04-01: + value: 26.04 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2019 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2019-04-30 + 2020-04-01: + value: 26.60 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2020 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2020-04-30 + 2021-04-01: + value: 26.67 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2021 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2021-04-30 + 2022-04-01: + value: 27.44 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2022 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2022-04-30 + 2023-04-01: + value: 30.17 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2023 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2023-04-30 + 2024-04-01: + value: 32.20 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2024 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2024-04-30 + 2025-04-01: + value: 32.75 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2025 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2025-04-30 + 2026-04-01: + value: 33.99 + reference: + - title: WSI 2013/3029 Sch. 2 para. 12 entry (2), as in force on 30 April 2026 + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2/2026-04-30 +metadata: + unit: currency-GBP + period: week + label: Wales Council Tax Reduction pensioner enhanced disability premium for a child or young person + uprating: gov.benefit_uprating_cpi + reference: + - title: The Council Tax Reduction Schemes and Prescribed Requirements (Wales) Regulations 2013 Sch. 1 para. 1(1)(d) and Sch. 2 paras. 7 and 12 entry (2) + href: https://www.legislation.gov.uk/wsi/2013/3029/schedule/2 From e4767ab502fe81e1d2153610e31fe56c08785561 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 13:43:10 +0000 Subject: [PATCH 03/11] Add the child disability premiums to pensioner Council Tax Reduction Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a --- ...council_tax_reduction_applicable_amount.py | 12 ++- ...ion_pensioner_child_disability_premiums.py | 95 +++++++++++++++++++ .../council_tax_reduction_premiums.py | 24 +++-- .../household/income/benefits_premiums.py | 9 +- 4 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py index 8507549d97..ea9728d04d 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_applicable_amount.py @@ -16,7 +16,10 @@ class council_tax_reduction_applicable_amount(Variable): "For a pensioner we also add an amount for each child or young " "person in the family (council_tax_reduction_pensioner_child_amounts) " "and the family premium " - "(council_tax_reduction_pensioner_family_premium)." + "(council_tax_reduction_pensioner_family_premium). A pensioner's " + "council_tax_reduction_premiums include the disabled child and " + "enhanced disability premiums for each qualifying child or young " + "person (council_tax_reduction_pensioner_child_disability_premiums)." ) definition_period = YEAR unit = GBP @@ -99,8 +102,11 @@ def formula(benunit, period, parameters): + couple * couple_personal_allowance + lone_parent * lone_parent_personal_allowance ) * WEEKS_IN_YEAR - # We currently include the severe disability and carer premiums for - # pensioners, and choose the schedule by the same pensioner test. + # For a pensioner, council_tax_reduction_premiums holds the severe + # disability and carer premiums and the disabled child and enhanced + # disability premiums for the family's children and young persons + # (SI 2012/2885 Sch 1 para 6(1)(d)). It chooses the schedule by the + # same pensioner test. premiums = benunit("council_tax_reduction_premiums", period) # A pensioner's amounts for the children and young persons in the # family and the family premium (SI 2012/2885 Sch 1 para 6(1)(b)-(c); diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py new file mode 100644 index 0000000000..ddfd59ccd0 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py @@ -0,0 +1,95 @@ +from policyengine_uk.model_api import * +from policyengine_uk.variables.gov.dwp.housing_benefit._child_disability_premiums import ( + child_disability_premium_benefit_conditions, +) +from policyengine_uk.variables.household.demographic.country import Country + + +class council_tax_reduction_pensioner_child_disability_premiums(Variable): + value_type = float + entity = BenUnit + label = "Council Tax Reduction pensioner child disability premiums" + documentation = ( + "Councils add the disabled child premium and the enhanced disability " + "premium to a pensioner's Council Tax Reduction applicable amount for " + "each child or young person in the family " + "(is_child_or_young_person_for_council_tax_reduction) who meets the " + "premium's condition, at the nation's weekly amounts. A child or young " + "person meets the disabled child condition with a positive DLA or PIP " + "amount (either component) or the blindness indicator, and the " + "enhanced condition with the highest DLA care rate " + "(has_highest_dla_sc_award) or the enhanced PIP daily living rate " + "(has_enhanced_pip_dl_award), as for Housing Benefit. An armed forces " + "independence payment meets each condition where the nation's scheme " + "names it for that person in that year: in England, for a child or " + "young person for the enhanced premium and for a young person for the " + "disabled child premium, from 2023-24; in Wales, for a child or young " + "person for the enhanced premium, and for the disabled child premium " + "from 2024-25; in Scotland, for a young person for both. A young " + "person is a Child Benefit qualifying young person " + "(is_qualifying_young_person_for_child_benefit). The model has no " + "fields for child disability payment, adult disability payment or " + "Scottish Adult Disability Living Allowance, so callers enter them in " + "the DLA and PIP fields. The model omits the hospital limbs and the " + "section 145A run-on after a child's death. Where the household head " + "applies alone (council_tax_reduction_head_applies_alone), the model " + "assumes the head has no children in their family. Working-age " + "families and families outside England, Wales and Scotland get nil." + ) + definition_period = YEAR + unit = GBP + reference = ( + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/1/paragraph/6", + "https://www.legislation.gov.uk/uksi/2012/2885/schedule/2", + "https://www.legislation.gov.uk/uksi/2023/16/regulation/7/made", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/1/paragraph/1", + "https://www.legislation.gov.uk/wsi/2013/3029/schedule/2", + "https://www.legislation.gov.uk/wsi/2024/56/regulation/5/made", + "https://www.legislation.gov.uk/ssi/2012/319/regulation/20", + "https://www.legislation.gov.uk/ssi/2012/319/schedule/1", + ) + + def formula(benunit, period, parameters): + local_authorities = parameters(period).gov.local_authorities + nations = [ + local_authorities.england.council_tax_reduction.pensioners.applicable_amount, + local_authorities.wales.council_tax_reduction.pensioners.applicable_amount, + local_authorities.scotland.council_tax_reduction.pensioners.applicable_amount, + ] + person = benunit.members + country = person.household("country", period) + in_nation = [ + country == Country.ENGLAND, + country == Country.WALES, + country == Country.SCOTLAND, + ] + + def by_nation(get, default): + return select(in_nation, [get(p) for p in nations], default=default) + + disabled, enhanced = child_disability_premium_benefit_conditions(person, period) + # Each scheme names the armed forces independence payment for a child, + # a young person, both or neither, by premium and year. + afip = person("armed_forces_independence_payment", period) > 0 + young_person = person("is_qualifying_young_person_for_child_benefit", period) + + def afip_route(premium): + routes = [p.armed_forces_independence_payment[premium] for p in nations] + return afip & where( + young_person, + select(in_nation, [r.young_person for r in routes], default=False), + select(in_nation, [r.child for r in routes], default=False), + ) + + disabled = disabled | afip_route("disabled_child_premium") + enhanced = enhanced | afip_route("enhanced_disability_premium") + weekly = ( + by_nation(lambda p: p.disabled_child_premium, 0) * disabled + + by_nation(lambda p: p.enhanced_disability_premium, 0) * enhanced + ) + child = person("is_child_or_young_person_for_council_tax_reduction", period) + pensioner = benunit("council_tax_reduction_pensioner", period) + applicant_family = ~benunit("council_tax_reduction_head_applies_alone", period) + return ( + pensioner * applicant_family * benunit.sum(child * weekly) * WEEKS_IN_YEAR + ) 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 912f2d7b63..b29ca340b7 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 @@ -7,12 +7,15 @@ class council_tax_reduction_premiums(Variable): label = "Council Tax Reduction disability and carer premiums" documentation = ( "The disability and carer premiums in the Council Tax Reduction " - "applicable amount, which are the applicant's. A pensioner " - "(council_tax_reduction_pensioner) has the pension-age schedule (the " - "severe disability and carer premiums), anyone else the working-age " - "schedule. Where the applicant is the benefit unit's claimant, these " - "are the benefit unit's premiums (pension_age_benefits_premiums or " - "working_age_benefits_premiums). Where the household head applies " + "applicable amount. A pensioner (council_tax_reduction_pensioner) has " + "the pension-age schedule (the severe disability and carer premiums, " + "and the disabled child and enhanced disability premiums for each " + "qualifying child or young person in the family), anyone else the " + "working-age schedule. Where the applicant is the benefit unit's " + "claimant, these are the benefit unit's premiums: for a pensioner, " + "pension_age_benefits_premiums plus " + "council_tax_reduction_pensioner_child_disability_premiums; otherwise " + "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 premium on her own disability and " @@ -53,7 +56,14 @@ def formula(benunit, period, parameters): # (council_tax_reduction_enhanced_disability_premium). benefit_unit_premiums = where( pensioner, - benunit("pension_age_benefits_premiums", period), + # A pensioner's premiums include the disabled child and enhanced + # disability premiums for the family's children and young persons + # (SI 2012/2885 Sch 1 para 6(1)(d); WSI 2013/3029 Sch 1 para + # 1(1)(d); SSI 2012/319 reg 20(d)). + benunit("pension_age_benefits_premiums", period) + + benunit( + "council_tax_reduction_pensioner_child_disability_premiums", period + ), benunit("working_age_benefits_premiums", period) + ( benunit("council_tax_reduction_severe_disability_premium", period) diff --git a/policyengine_uk/variables/household/income/benefits_premiums.py b/policyengine_uk/variables/household/income/benefits_premiums.py index d3030731f2..5511457bd0 100644 --- a/policyengine_uk/variables/household/income/benefits_premiums.py +++ b/policyengine_uk/variables/household/income/benefits_premiums.py @@ -10,10 +10,11 @@ # The pension-age schedules (HB(SPC) Regs 2006 Sch 3 Part 3; CTR (Prescribed # Requirements) (England) Regs 2012 Sch 2 Part 3; the Scottish and Welsh # pension-age CTR schedules) have only the severe disability, enhanced -# disability (children only), disabled child and carer premiums. The two -# child premiums are modelled for Housing Benefit only, by -# housing_benefit_child_disability_premiums in the applicable amount; -# Council Tax Reduction does not model them. +# disability (children only), disabled child and carer premiums. This list +# holds the two adult premiums. The model computes the two child premiums +# separately: housing_benefit_child_disability_premiums for Housing Benefit, +# and council_tax_reduction_pensioner_child_disability_premiums for Council +# Tax Reduction, which council_tax_reduction_premiums adds for a pensioner. PENSION_AGE_PREMIUMS = [ "pension_age_severe_disability_premium", "carer_premium", From 7d8b70dd345ff5a2d68f39131533049c3f66754c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 13:43:10 +0000 Subject: [PATCH 04/11] Test the pensioner CTR child disability premiums by nation and year Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a --- ...n_pensioner_child_disability_premiums.yaml | 940 ++++++++++++++++++ 1 file changed, 940 insertions(+) create mode 100644 policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml new file mode 100644 index 0000000000..0a01fe7f22 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml @@ -0,0 +1,940 @@ +# Councils add the disabled child premium and the enhanced disability premium +# to a pensioner's Council Tax Reduction applicable amount for each qualifying +# child or young person in the family: +# +# - England: SI 2012/2885 Sch 1 para 6(1)(d), Sch 2 paras 7 and 8, amounts in +# Sch 2 Part 4 entries (2) and (3). SI 2023/16 adds an AFIP limb for any +# child or young person to para 7 and for a young person to para 8, for +# schemes from 1 April 2023. +# - Wales: WSI 2013/3029 Sch 1 para 1(1)(d), Sch 2 paras 7, 8 and 12. Para +# 7(1)(c) names AFIP for any child or young person; WSI 2024/56 adds it to +# para 8 for schemes from 1 April 2024. +# - Scotland: SSI 2012/319 reg 20(d), Sch 1 paras 8, 9 and 13. Paras 8(1)(aa) +# and 9(ba) name AFIP for a young person only. +# +# Weekly amounts, the same in all three nations (each schedule's table of +# premium amounts in force on 30 April): +# year enhanced disability premium disabled child premium +# 2015 24.43 60.06 +# 2022 27.44 68.04 +# 2023 30.17 74.69 +# 2024 32.20 80.01 +# 2026 33.99 84.46 +# So in 2026 the two premiums come to 84.46 * 52 = 4,391.92 and 33.99 * 52 = +# 1,767.48 a year, together 118.45 * 52 = 6,159.40. +# +# Each 2026 pensioner is 72, reached State Pension age before 1 April 2021, +# and gets a single or lone parent personal allowance of 256.00 a week (13,312 +# a year). Councils add a child or young person amount of 87.88 a week in +# England and Wales and 109.85 in Scotland, and in Wales a family premium of +# 20.22 (#2826's parameters). A young person here is a 17-year-old at school, +# a Child Benefit qualifying young person (SI 2012/2885 reg 2; WSI 2013/3029 +# reg 2; SSI 2012/319 reg 4). We multiply weekly amounts by 52. + +- name: Case A0 England, an English pensioner with no child gets no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 0 + # 256.00 * 52. + council_tax_reduction_applicable_amount: 13_312 + +- name: Case A1 England, a ten-year-old with no disability benefit adds no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 0 + council_tax_reduction_premiums: 0 + # (256.00 + 87.88) * 52. + council_tax_reduction_applicable_amount: 17_881.76 + +- name: Case A2 England, a child on the highest DLA care rate adds both premiums. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # (84.46 + 33.99) * 52 = 6,159.40. + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + council_tax_reduction_premiums: 6_159.40 + # 17,881.76 + 6,159.40. + council_tax_reduction_applicable_amount: 24_041.16 + +- name: Case A3 England, a child on the middle DLA care rate adds the disabled child premium only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: MIDDLE + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # 84.46 * 52 = 4,391.92. + council_tax_reduction_pensioner_child_disability_premiums: 4_391.92 + # 17,881.76 + 4,391.92. + council_tax_reduction_applicable_amount: 22_273.68 + +- name: Case A4 England, a blind child with no DLA adds the disabled child premium only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + is_blind: true + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # 84.46 * 52 = 4,391.92. + council_tax_reduction_pensioner_child_disability_premiums: 4_391.92 + # 17,881.76 + 4,391.92. + council_tax_reduction_applicable_amount: 22_273.68 + +- name: Case A2c England, with £24,000 of pensions the premiums bring income within the applicable amount and the full reduction. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + private_pension_income: 11_430 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + council_tax_reduction_applicable_amount: 24_041.16 + # Applicable income 21,714.00 falls short of 24,041.16, so councils + # give the maximum reduction, 100% of the council tax (England Sch 1 + # paras 2(e), 7(1) and 10(2)), here 2,000. + council_tax_reduction_applicable_income: 21_714.00 + council_tax_reduction: 2_000 + +- name: Case A0 Wales, a Welsh pensioner with no child gets no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 0 + # 256.00 * 52. + council_tax_reduction_applicable_amount: 13_312 + +- name: Case A1 Wales, a ten-year-old with no disability benefit adds no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 0 + council_tax_reduction_premiums: 0 + # (256.00 + 87.88 + 20.22) * 52. + council_tax_reduction_applicable_amount: 18_933.20 + +- name: Case A2 Wales, a child on the highest DLA care rate adds both premiums. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # (84.46 + 33.99) * 52 = 6,159.40. + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + council_tax_reduction_premiums: 6_159.40 + # 18,933.20 + 6,159.40. + council_tax_reduction_applicable_amount: 25_092.60 + +- name: Case A3 Wales, a child on the middle DLA care rate adds the disabled child premium only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: MIDDLE + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # 84.46 * 52 = 4,391.92. + council_tax_reduction_pensioner_child_disability_premiums: 4_391.92 + # 18,933.20 + 4,391.92. + council_tax_reduction_applicable_amount: 23_325.12 + +- name: Case A4 Wales, a blind child with no DLA adds the disabled child premium only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + is_blind: true + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # 84.46 * 52 = 4,391.92. + council_tax_reduction_pensioner_child_disability_premiums: 4_391.92 + # 18,933.20 + 4,391.92. + council_tax_reduction_applicable_amount: 23_325.12 + +- name: Case A2c Wales, with £24,000 of pensions the premiums bring income within the applicable amount and the full reduction. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + private_pension_income: 11_430 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + council_tax_reduction_applicable_amount: 25_092.60 + # Applicable income 21,714.00 falls short of 25,092.60, so councils + # give the maximum reduction, 100% of the council tax (England Sch 1 + # paras 2(e), 7(1) and 10(2)), here 2,000. + council_tax_reduction_applicable_income: 21_714.00 + council_tax_reduction: 2_000 + +- name: Case A0 Scotland, a Scottish pensioner with no child gets no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + benunits: + benunit: + members: [pensioner] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 0 + # 256.00 * 52. + council_tax_reduction_applicable_amount: 13_312 + +- name: Case A1 Scotland, a ten-year-old with no disability benefit adds no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 0 + council_tax_reduction_premiums: 0 + # (256.00 + 109.85) * 52. + council_tax_reduction_applicable_amount: 19_024.20 + +- name: Case A2 Scotland, a child on the highest DLA care rate adds both premiums. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # (84.46 + 33.99) * 52 = 6,159.40. + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + council_tax_reduction_premiums: 6_159.40 + # 19,024.20 + 6,159.40. + council_tax_reduction_applicable_amount: 25_183.60 + +- name: Case A3 Scotland, a child on the middle DLA care rate adds the disabled child premium only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: MIDDLE + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # 84.46 * 52 = 4,391.92. + council_tax_reduction_pensioner_child_disability_premiums: 4_391.92 + # 19,024.20 + 4,391.92. + council_tax_reduction_applicable_amount: 23_416.12 + +- name: Case A4 Scotland, a blind child with no DLA adds the disabled child premium only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + is_blind: true + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + # 84.46 * 52 = 4,391.92. + council_tax_reduction_pensioner_child_disability_premiums: 4_391.92 + # 19,024.20 + 4,391.92. + council_tax_reduction_applicable_amount: 23_416.12 + +- name: Case A2c Scotland, with £24,000 of pensions the premiums bring income within the applicable amount and the full reduction. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + private_pension_income: 11_430 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + council_tax_reduction_applicable_amount: 25_183.60 + # Applicable income 21,753.67 falls short of 25,183.60, so councils + # give the maximum reduction, 100% of the council tax (England Sch 1 + # paras 2(e), 7(1) and 10(2)), here 2,000. + council_tax_reduction_applicable_income: 21_753.67 + council_tax_reduction: 2_000 + +- name: AFIP England 2022, a young person on AFIP alone meets neither condition before SI 2023/16. + period: 2022 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 17 + current_education: UPPER_SECONDARY + age_started_or_accepted_current_education_or_training: 16 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, true] + is_child_or_young_person_for_council_tax_reduction: [false, true] + council_tax_reduction_pensioner_child_disability_premiums: 0 + +- name: AFIP England 2023, a young person on AFIP alone meets both conditions (paras 7(1)(c) and 8(e)). + period: 2023 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 17 + current_education: UPPER_SECONDARY + age_started_or_accepted_current_education_or_training: 16 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, true] + # (74.69 + 30.17) * 52 = 104.86 * 52 = 5,452.72. + council_tax_reduction_pensioner_child_disability_premiums: 5_452.72 + +- name: AFIP England 2023, a child under 16 on AFIP alone meets the enhanced condition only. + period: 2023 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, false] + # Para 8(e) reaches only a young person: 30.17 * 52 = 1,568.84. + council_tax_reduction_pensioner_child_disability_premiums: 1_568.84 + +- name: AFIP Wales 2023, a child on AFIP alone meets the enhanced condition only (para 7(1)(c)). + period: 2023 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, false] + # 30.17 * 52 = 1,568.84. + council_tax_reduction_pensioner_child_disability_premiums: 1_568.84 + +- name: AFIP Wales 2024, a child on AFIP alone meets both conditions (paras 7(1)(c) and 8(d)). + period: 2024 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, false] + # (80.01 + 32.20) * 52 = 112.21 * 52 = 5,834.92. + council_tax_reduction_pensioner_child_disability_premiums: 5_834.92 + +- name: AFIP Scotland 2026, a child under 16 on AFIP alone meets neither condition. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, false] + # Paras 8(1)(aa) and 9(ba) reach only a young person. + council_tax_reduction_pensioner_child_disability_premiums: 0 + +- name: AFIP Scotland 2026, a young person on AFIP alone meets both conditions (paras 8(1)(aa) and 9(ba)). + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 17 + current_education: UPPER_SECONDARY + age_started_or_accepted_current_education_or_training: 16 + armed_forces_independence_payment: 3_000 + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + is_qualifying_young_person_for_child_benefit: [false, true] + # (84.46 + 33.99) * 52 = 6,159.40. + council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 + +- name: Earlier year England 2015, a child on the highest DLA care rate adds both premiums at the 2015-16 amounts. + period: 2015 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: true + # (60.06 + 24.43) * 52 = 84.49 * 52 = 4,393.48. + council_tax_reduction_pensioner_child_disability_premiums: 4_393.48 + council_tax_reduction_premiums: 4_393.48 + +- name: Earlier year Wales 2015, a child on the highest DLA care rate adds both premiums at the 2015-16 amounts. + period: 2015 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: WALES + local_authority: CARDIFF + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: true + # (60.06 + 24.43) * 52 = 84.49 * 52 = 4,393.48. + council_tax_reduction_pensioner_child_disability_premiums: 4_393.48 + council_tax_reduction_premiums: 4_393.48 + +- name: Earlier year Scotland 2015, a child on the highest DLA care rate adds both premiums at the 2015-16 amounts. + period: 2015 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: SCOTLAND + local_authority: GLASGOW_CITY + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: true + # (60.06 + 24.43) * 52 = 84.49 * 52 = 4,393.48. + council_tax_reduction_pensioner_child_disability_premiums: 4_393.48 + council_tax_reduction_premiums: 4_393.48 + +- name: Nil, a working-age lone parent's child on the highest DLA care rate adds no pensioner child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 40 + employment_income: 20_000 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [parent, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [parent, child] + country: ENGLAND + local_authority: MAIDSTONE + tenure_type: OWNED_OUTRIGHT + council_tax: 2_000 + savings: 0 + output: + council_tax_reduction_pensioner: false + is_child_or_young_person_for_council_tax_reduction: [false, true] + council_tax_reduction_pensioner_child_disability_premiums: 0 + +- name: Nil, a pensioner household head who applies alone has no child in her family, so her grandchild on the highest DLA care rate adds nothing. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + grandmother: + age: 80 + is_household_head: true + mother: + age: 30 + is_parent: true + is_household_head: false + father: + age: 30 + is_parent: true + is_household_head: false + child: + age: 5 + dla_sc_category: HIGHER + is_household_head: false + benunits: + family: + members: [grandmother, mother, father, child] + would_claim_pc: false + would_claim_uc: false + households: + home: + members: [grandmother, mother, father, child] + country: ENGLAND + local_authority: MAIDSTONE + council_tax: 2_000 + savings: 0 + output: + is_claimant_or_partner: [false, true, true, false] + council_tax_reduction_head_applies_alone: [true] + council_tax_reduction_pensioner: [true] + council_tax_reduction_pensioner_child_disability_premiums: [0] + # A single pensioner aged 80: 256.00 * 52. + council_tax_reduction_applicable_amount: [13_312] From 9ef585defd64daa7fb592b26af631c058c1be497 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 13:58:17 +0000 Subject: [PATCH 05/11] Add property tests and a changelog fragment for the pensioner CTR child premiums Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FL1yqXPRpn5qQ2y8a --- changelog.d/2824.fixed.md | 1 + ...ner_child_disability_premium_properties.py | 418 ++++++++++++++++++ 2 files changed, 419 insertions(+) create mode 100644 changelog.d/2824.fixed.md create mode 100644 policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py diff --git a/changelog.d/2824.fixed.md b/changelog.d/2824.fixed.md new file mode 100644 index 0000000000..1ad9218c56 --- /dev/null +++ b/changelog.d/2824.fixed.md @@ -0,0 +1 @@ +The model now adds the disabled child premium and the enhanced disability premium to a pensioner's Council Tax Reduction applicable amount for each qualifying child or young person in England, Wales and Scotland, with each nation's armed forces independence payment routes by year. diff --git a/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py b/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py new file mode 100644 index 0000000000..9255e77899 --- /dev/null +++ b/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py @@ -0,0 +1,418 @@ +"""Property-based tests for a pensioner's Council Tax Reduction child +disability premiums. + +Councils add the disabled child premium and the enhanced disability premium +to a pensioner's applicable amount for each qualifying child or young person +in the family (SI 2012/2885 Sch 1 para 6(1)(d) and Sch 2 paras 7, 8 and Part +4; WSI 2013/3029 Sch 1 para 1(1)(d) and Sch 2 paras 7, 8 and 12; SSI 2012/319 +reg 20(d) and Sch 1 paras 8, 9 and 13). A child or young person meets the +disabled child condition with DLA or PIP (either component) or blindness, and +the enhanced condition with the highest DLA care rate or the enhanced PIP +daily living rate. The armed forces independence payment (AFIP) meets a +condition where the nation's scheme names it for that person in that year +(AFIP_ROUTES). + +The test generates families in England, Wales and Scotland with children and +young persons on the listed awards, and checks these invariants: + +1. Working-age families, and a pensioner household head who applies alone, + get no child disability premium. +2. A pensioner family's premiums equal the sum, over its children and young + persons, of 52 times each premium whose condition the child meets, at the + weekly amounts in AMOUNTS. +3. On the model's inputs, every child or young person who meets the enhanced + condition also meets the disabled child condition, except through AFIP: + a child under 16 on AFIP alone meets only the enhanced condition in + England from 2023 and in Wales before 2024. +4. The applicable amount never falls when a child or young person gains a + qualifying benefit. +5. For pension-age families with no AFIP, in every year from 2015 to 2026, + the premiums equal housing_benefit_child_disability_premiums wherever + is_child_or_young_person_for_council_tax_reduction and + is_child_or_young_person_for_legacy_benefits agree. +""" + +import numpy as np +from hypothesis import HealthCheck, assume, given, settings +from hypothesis import strategies as st +from policyengine_core.periods import period as make_period + +from policyengine_uk import Simulation +from policyengine_uk.variables.gov.dwp.housing_benefit._child_disability_premiums import ( + child_disability_premium_benefit_conditions, +) + +SETTINGS = settings( + max_examples=6, + deadline=None, + derandomize=True, + suppress_health_check=[ + HealthCheck.too_slow, + HealthCheck.data_too_large, + HealthCheck.filter_too_much, + ], +) +WEEKS_IN_YEAR = 52 +AUTHORITIES = {"ENGLAND": "MAIDSTONE", "WALES": "CARDIFF", "SCOTLAND": "GLASGOW_CITY"} +YEARS = list(range(2015, 2027)) +# Weekly (enhanced disability premium, disabled child premium) for each child +# or young person, the same in all three nations from 2014-15 (each schedule's +# table of premium amounts in force on 30 April). +AMOUNTS = { + 2015: (24.43, 60.06), + 2016: (24.43, 60.06), + 2017: (24.78, 60.90), + 2018: (25.48, 62.86), + 2019: (26.04, 64.19), + 2020: (26.60, 65.52), + 2021: (26.67, 65.94), + 2022: (27.44, 68.04), + 2023: (30.17, 74.69), + 2024: (32.20, 80.01), + 2025: (32.75, 81.37), + 2026: (33.99, 84.46), +} + + +def afip_routes(country, year, young_person): + """Whether AFIP meets the (enhanced, disabled child) condition: England + paras 7(1)(c) and 8(e) from 2023-24 (SI 2023/16); Wales para 7(1)(c), and + para 8(d) from 2024-25 (WSI 2024/56); Scotland paras 8(1)(aa) and 9(ba), + for a young person only.""" + if country == "ENGLAND": + return year >= 2023, year >= 2023 and young_person + if country == "WALES": + return True, year >= 2024 + return young_person, young_person + + +# Award inputs, and whether each meets the (disabled child, enhanced) +# condition on its own. +AWARDS = { + "dla_care_lowest": ({"dla_sc_category": "LOWER"}, True, False), + "dla_care_middle": ({"dla_sc_category": "MIDDLE"}, True, False), + "dla_care_highest": ({"dla_sc_category": "HIGHER"}, True, True), + "dla_mobility_lower": ({"dla_m_category": "LOWER"}, True, False), + "pip_daily_living_standard": ({"pip_dl_category": "STANDARD"}, True, False), + "pip_daily_living_enhanced": ({"pip_dl_category": "ENHANCED"}, True, True), + "pip_mobility_standard": ({"pip_m_category": "STANDARD"}, True, False), + "blind": ({"is_blind": True}, True, False), + "afip": ({"armed_forces_independence_payment": 2_000}, False, False), +} +# A child under 16, a Child Benefit qualifying young person (17 and at +# school) and a 17-year-old out of education, who is neither. +KINDS = ("child", "young_person", "not_counted") + +child_strategy = st.fixed_dictionaries( + { + "kind": st.sampled_from(KINDS), + "age": st.integers(0, 15), + # Two awards never set the same input. + "awards": st.lists( + st.sampled_from(list(AWARDS)), + max_size=2, + unique_by=lambda award: tuple(AWARDS[award][0]), + ), + } +) +pensioner_family = st.fixed_dictionaries( + { + "country": st.sampled_from(list(AUTHORITIES)), + "age": st.integers(67, 90), + "partner_age": st.one_of(st.none(), st.integers(60, 90)), + "claims_pc": st.booleans(), + "children": st.lists(child_strategy, min_size=1, max_size=3), + } +) +working_age_family = st.fixed_dictionaries( + { + "country": st.sampled_from(list(AUTHORITIES)), + "age": st.integers(25, 55), + "partner_age": st.one_of(st.none(), st.integers(25, 55)), + "claims_pc": st.just(False), + "children": st.lists(child_strategy, min_size=1, max_size=3), + } +) + + +def child_inputs(child, year): + if child["kind"] == "child": + inputs = {"age": child["age"]} + else: + inputs = {"age": 17} + if child["kind"] == "young_person": + inputs["current_education"] = "UPPER_SECONDARY" + inputs["age_started_or_accepted_current_education_or_training"] = 16 + for award in child["awards"]: + inputs.update(AWARDS[award][0]) + return {name: {year: value} for name, value in inputs.items()} + + +def situation(families, year, head_alone=()): + """One benefit unit and household for each family, and for each family + in head_alone a pensioner household head who applies alone, with that + family's adults as the claimant couple in her benefit unit.""" + data = {"people": {}, "benunits": {}, "households": {}} + for index, spec in enumerate(families): + alone = index in head_alone + members = [] + if alone: + name = f"head_{index}" + data["people"][name] = { + "age": {year: 80}, + "is_household_head": {year: True}, + } + members.append(name) + adults = [spec["age"]] + if spec["partner_age"] is not None or alone: + adults.append(spec["partner_age"] or spec["age"]) + for number, age in enumerate(adults): + name = f"adult_{index}_{number}" + person = {"age": {year: age}} + if alone: + person["is_parent"] = {year: True} + person["is_household_head"] = {year: False} + data["people"][name] = person + members.append(name) + for number, child in enumerate(spec["children"]): + name = f"child_{index}_{number}" + data["people"][name] = child_inputs(child, year) + if alone: + data["people"][name]["is_household_head"] = {year: False} + members.append(name) + data["benunits"][f"family_{index}"] = { + "members": members, + "would_claim_pc": {year: spec["claims_pc"]}, + "would_claim_uc": {year: False}, + } + data["households"][f"home_{index}"] = { + "members": members, + "country": {year: spec["country"]}, + "local_authority": {year: AUTHORITIES[spec["country"]]}, + "tenure_type": {year: "OWNED_OUTRIGHT"}, + "council_tax": {year: 2_000}, + "savings": {year: 0}, + } + return data + + +def child_premiums(child, country, year): + """The test's own annual premiums for one child or young person.""" + if child["kind"] == "not_counted": + return 0.0 + enhanced_amount, disabled_amount = AMOUNTS[year] + disabled = any(AWARDS[award][1] for award in child["awards"]) + enhanced = any(AWARDS[award][2] for award in child["awards"]) + if "afip" in child["awards"]: + afip_enhanced, afip_disabled = afip_routes( + country, year, child["kind"] == "young_person" + ) + disabled = disabled or afip_disabled + enhanced = enhanced or afip_enhanced + return WEEKS_IN_YEAR * (disabled_amount * disabled + enhanced_amount * enhanced) + + +def calculate(families, year, names, head_alone=()): + simulation = Simulation(situation=situation(families, year, head_alone)) + return {name: np.asarray(simulation.calculate(name, year)) for name in names} + + +@SETTINGS +@given( + st.lists(working_age_family, min_size=1, max_size=4), + st.lists(pensioner_family, min_size=1, max_size=3), + st.sampled_from(YEARS), +) +def test_nil_for_working_age_families_and_a_head_who_applies_alone( + working_age, pensioners, year +): + families = working_age + pensioners + head_alone = set(range(len(working_age), len(families))) + result = calculate( + families, + year, + [ + "council_tax_reduction_pensioner", + "council_tax_reduction_head_applies_alone", + "council_tax_reduction_pensioner_child_disability_premiums", + ], + head_alone, + ) + pensioner = result["council_tax_reduction_pensioner"] + alone = result["council_tax_reduction_head_applies_alone"] + # The generator builds what it means to build. + assert not pensioner[: len(working_age)].any() + assert alone[len(working_age) :].all() + assert pensioner[len(working_age) :].all() + np.testing.assert_array_equal( + result["council_tax_reduction_pensioner_child_disability_premiums"], 0 + ) + + +@SETTINGS +@given( + st.lists(pensioner_family, min_size=1, max_size=6), + st.sampled_from(YEARS), +) +def test_family_total_is_the_sum_of_each_childs_premiums(families, year): + result = calculate( + families, + year, + [ + "council_tax_reduction_pensioner", + "council_tax_reduction_pensioner_child_disability_premiums", + ], + ) + assert result["council_tax_reduction_pensioner"].all() + expected = [ + sum(child_premiums(child, spec["country"], year) for child in spec["children"]) + for spec in families + ] + np.testing.assert_allclose( + result["council_tax_reduction_pensioner_child_disability_premiums"], + expected, + atol=0.01, + ) + + +@SETTINGS +@given(st.lists(child_strategy, min_size=1, max_size=8), st.sampled_from(YEARS)) +def test_shared_enhanced_condition_implies_disabled_child_condition(children, year): + families = [ + { + "country": "ENGLAND", + "age": 72, + "partner_age": None, + "claims_pc": False, + "children": children, + } + ] + simulation = Simulation(situation=situation(families, year)) + person = simulation.populations["person"] + disabled, enhanced = child_disability_premium_benefit_conditions( + person, make_period(year) + ) + assert not (enhanced & ~disabled).any() + + +@SETTINGS +@given( + st.sampled_from(list(AUTHORITIES)), + st.sampled_from(YEARS), + st.sampled_from(["child", "young_person"]), + st.lists( + st.sampled_from(list(AWARDS)), + min_size=1, + max_size=2, + unique_by=lambda award: tuple(AWARDS[award][0]), + ), +) +def test_enhanced_without_disabled_child_premium_only_through_afip( + country, year, kind, awards +): + child = {"kind": kind, "age": 10, "awards": awards} + families = [ + { + "country": country, + "age": 72, + "partner_age": None, + "claims_pc": False, + "children": [child], + } + ] + total = calculate( + families, year, ["council_tax_reduction_pensioner_child_disability_premiums"] + )["council_tax_reduction_pensioner_child_disability_premiums"][0] + enhanced_amount, disabled_amount = AMOUNTS[year] + enhanced_only = abs(total - WEEKS_IN_YEAR * enhanced_amount) < 0.01 + # AFIP alone meets only the enhanced condition for a child under 16 in + # England from 2023-24, and for any child or young person in Wales before + # 2024-25. + exception = awards == ["afip"] and ( + (country == "ENGLAND" and year >= 2023 and kind == "child") + or (country == "WALES" and year < 2024) + ) + assert enhanced_only == exception + + +@SETTINGS +@given( + pensioner_family, + st.sampled_from(YEARS), + st.integers(0, 2), + st.sampled_from(list(AWARDS)), +) +def test_applicable_amount_never_falls_when_a_child_gains_a_benefit( + family, year, index, award +): + index = index % len(family["children"]) + gained = dict(family) + gained["children"] = [dict(child) for child in family["children"]] + awards = gained["children"][index]["awards"] + # The new award adds a benefit rather than replacing one the child has. + assume(all(set(AWARDS[a][0]).isdisjoint(AWARDS[award][0]) for a in awards)) + gained["children"][index]["awards"] = awards + [award] + result = calculate( + [family, gained], + year, + [ + "council_tax_reduction_applicable_amount", + "council_tax_reduction_pensioner_child_disability_premiums", + ], + ) + amount = result["council_tax_reduction_applicable_amount"] + premiums = result["council_tax_reduction_pensioner_child_disability_premiums"] + assert amount[1] >= amount[0] - 0.01 + assert premiums[1] >= premiums[0] - 0.01 + + +@settings( + max_examples=3, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow, HealthCheck.data_too_large], +) +@given( + st.lists( + pensioner_family.map( + lambda spec: { + **spec, + "children": [ + {**child, "awards": [a for a in child["awards"] if a != "afip"]} + for child in spec["children"] + ], + } + ), + min_size=1, + max_size=6, + ) +) +def test_matches_housing_benefit_child_premiums_without_afip(families): + names = [ + "council_tax_reduction_pensioner", + "council_tax_reduction_pensioner_child_disability_premiums", + "housing_benefit_child_disability_premiums", + ] + for year in YEARS: + simulation = Simulation(situation=situation(families, year)) + result = {name: np.asarray(simulation.calculate(name, year)) for name in names} + council = np.asarray( + simulation.calculate( + "is_child_or_young_person_for_council_tax_reduction", year + ) + ) + legacy = np.asarray( + simulation.calculate("is_child_or_young_person_for_legacy_benefits", year) + ) + agree = simulation.populations["benunit"].all(council == legacy) + # For a pensioner's family the two definitions coincide. + assert agree.all() + compared = agree & result["council_tax_reduction_pensioner"] + assert compared.all() + np.testing.assert_allclose( + result["council_tax_reduction_pensioner_child_disability_premiums"][ + compared + ], + result["housing_benefit_child_disability_premiums"][compared], + atol=0.01, + ) From f00ad5be14f03b036cb17f1c17c70aa740536660 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 21:13:22 +0000 Subject: [PATCH 06/11] Check the lower DLA mobility age and every AFIP route in the property tests The family-total oracle now gives a child under 5 nothing for the lower DLA mobility rate alone, as dla_m does, and explicit examples check that boundary and each AFIP route on every run. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM --- ...ner_child_disability_premium_properties.py | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py b/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py index 9255e77899..387ef53c83 100644 --- a/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py +++ b/policyengine_uk/tests/test_council_tax_reduction_pensioner_child_disability_premium_properties.py @@ -9,8 +9,8 @@ disabled child condition with DLA or PIP (either component) or blindness, and the enhanced condition with the highest DLA care rate or the enhanced PIP daily living rate. The armed forces independence payment (AFIP) meets a -condition where the nation's scheme names it for that person in that year -(AFIP_ROUTES). +condition where the nation's ministers name it for that person in that year +(afip_routes). The test generates families in England, Wales and Scotland with children and young persons on the listed awards, and checks these invariants: @@ -22,8 +22,8 @@ weekly amounts in AMOUNTS. 3. On the model's inputs, every child or young person who meets the enhanced condition also meets the disabled child condition, except through AFIP: - a child under 16 on AFIP alone meets only the enhanced condition in - England from 2023 and in Wales before 2024. + AFIP alone meets only the enhanced condition for a child under 16 in + England from 2023, and for any child or young person in Wales before 2024. 4. The applicable amount never falls when a child or young person gains a qualifying benefit. 5. For pension-age families with no AFIP, in every year from 2015 to 2026, @@ -33,7 +33,7 @@ """ import numpy as np -from hypothesis import HealthCheck, assume, given, settings +from hypothesis import HealthCheck, assume, example, given, settings from hypothesis import strategies as st from policyengine_core.periods import period as make_period @@ -151,7 +151,7 @@ def child_inputs(child, year): def situation(families, year, head_alone=()): """One benefit unit and household for each family, and for each family in head_alone a pensioner household head who applies alone, with that - family's adults as the claimant couple in her benefit unit.""" + family's adults as the claimant couple in the head's benefit unit.""" data = {"people": {}, "benunits": {}, "households": {}} for index, spec in enumerate(families): alone = index in head_alone @@ -201,7 +201,16 @@ def child_premiums(child, country, year): if child["kind"] == "not_counted": return 0.0 enhanced_amount, disabled_amount = AMOUNTS[year] - disabled = any(AWARDS[award][1] for award in child["awards"]) + disabled = any( + AWARDS[award][1] + # dla_m pays the lower mobility rate only from age 5. + and not ( + award == "dla_mobility_lower" + and child["kind"] == "child" + and child["age"] < 5 + ) + for award in child["awards"] + ) enhanced = any(AWARDS[award][2] for award in child["awards"]) if "afip" in child["awards"]: afip_enhanced, afip_disabled = afip_routes( @@ -254,6 +263,23 @@ def test_nil_for_working_age_families_and_a_head_who_applies_alone( st.lists(pensioner_family, min_size=1, max_size=6), st.sampled_from(YEARS), ) +# Children aged 3, 4 and 5 on the lower DLA mobility rate alone: dla_m +# pays that rate only from age 5 (gov.dwp.dla.mobility.lower_min_age). +@example( + [ + { + "country": "ENGLAND", + "age": 72, + "partner_age": None, + "claims_pc": False, + "children": [ + {"kind": "child", "age": age, "awards": ["dla_mobility_lower"]} + ], + } + for age in (3, 4, 5) + ], + 2026, +) def test_family_total_is_the_sum_of_each_childs_premiums(families, year): result = calculate( families, @@ -307,6 +333,18 @@ def test_shared_enhanced_condition_implies_disabled_child_condition(children, ye unique_by=lambda award: tuple(AWARDS[award][0]), ), ) +# Each AFIP route for a child and a young person, which the six drawn +# examples may not reach. +@example("ENGLAND", 2022, "child", ["afip"]) +@example("ENGLAND", 2022, "young_person", ["afip"]) +@example("ENGLAND", 2023, "child", ["afip"]) +@example("ENGLAND", 2023, "young_person", ["afip"]) +@example("WALES", 2023, "child", ["afip"]) +@example("WALES", 2023, "young_person", ["afip"]) +@example("WALES", 2024, "child", ["afip"]) +@example("WALES", 2024, "young_person", ["afip"]) +@example("SCOTLAND", 2026, "child", ["afip"]) +@example("SCOTLAND", 2026, "young_person", ["afip"]) def test_enhanced_without_disabled_child_premium_only_through_afip( country, year, kind, awards ): From 2df03f2beedad48ce272cadb4cd59bdae51a1c13 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 21:13:22 +0000 Subject: [PATCH 07/11] Test the Northern Ireland nil and cite each nation's own provisions in the YAML cases Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM --- ...n_pensioner_child_disability_premiums.yaml | 75 ++++++++++++++----- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml index 0a01fe7f22..b508cb564c 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml @@ -3,14 +3,16 @@ # child or young person in the family: # # - England: SI 2012/2885 Sch 1 para 6(1)(d), Sch 2 paras 7 and 8, amounts in -# Sch 2 Part 4 entries (2) and (3). SI 2023/16 adds an AFIP limb for any -# child or young person to para 7 and for a young person to para 8, for -# schemes from 1 April 2023. -# - Wales: WSI 2013/3029 Sch 1 para 1(1)(d), Sch 2 paras 7, 8 and 12. Para -# 7(1)(c) names AFIP for any child or young person; WSI 2024/56 adds it to -# para 8 for schemes from 1 April 2024. -# - Scotland: SSI 2012/319 reg 20(d), Sch 1 paras 8, 9 and 13. Paras 8(1)(aa) -# and 9(ba) name AFIP for a young person only. +# Sch 2 Part 4 entries (2) and (3). For schemes from 1 April 2023 the +# Secretary of State added an AFIP limb to para 7 for any child or young +# person, and to para 8 for a young person (SI 2023/16 regs 1(3) and +# 7(7)-(8)). +# - Wales: WSI 2013/3029 Sch 1 para 1(1)(d), Sch 2 paras 7, 8 and 12. The +# Welsh Ministers name AFIP for any child or young person in para 7(1)(c), +# and added it to para 8 for schemes from 1 April 2024 (WSI 2024/56 regs +# 1(3) and 5(d)). +# - Scotland: SSI 2012/319 reg 20(d), Sch 1 paras 8, 9 and 13. The Scottish +# Ministers name AFIP for a young person only (paras 8(1)(aa) and 9(ba)). # # Weekly amounts, the same in all three nations (each schedule's table of # premium amounts in force on 30 April): @@ -27,9 +29,11 @@ # and gets a single or lone parent personal allowance of 256.00 a week (13,312 # a year). Councils add a child or young person amount of 87.88 a week in # England and Wales and 109.85 in Scotland, and in Wales a family premium of -# 20.22 (#2826's parameters). A young person here is a 17-year-old at school, -# a Child Benefit qualifying young person (SI 2012/2885 reg 2; WSI 2013/3029 -# reg 2; SSI 2012/319 reg 4). We multiply weekly amounts by 52. +# 20.22 (the child_or_young_person and family_premium parameters under +# gov.local_authorities..council_tax_reduction.pensioners.applicable_amount). +# A young person here is a 17-year-old at school, a Child Benefit qualifying +# young person (SI 2012/2885 reg 2; WSI 2013/3029 reg 2; SSI 2012/319 reg +# 4). The formula multiplies weekly amounts by 52. - name: Case A0 England, an English pensioner with no child gets no child disability premium. period: 2026 @@ -385,9 +389,10 @@ output: council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 council_tax_reduction_applicable_amount: 25_092.60 - # Applicable income 21,714.00 falls short of 25,092.60, so councils - # give the maximum reduction, 100% of the council tax (England Sch 1 - # paras 2(e), 7(1) and 10(2)), here 2,000. + # Applicable income 21,714.00 falls short of 25,092.60, so the council + # gives the maximum reduction, the whole council tax + # (gov.local_authorities.wales.council_tax_reduction.maximum_support_rate), + # here 2,000. council_tax_reduction_applicable_income: 21_714.00 council_tax_reduction: 2_000 @@ -565,9 +570,10 @@ output: council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 council_tax_reduction_applicable_amount: 25_183.60 - # Applicable income 21,753.67 falls short of 25,183.60, so councils - # give the maximum reduction, 100% of the council tax (England Sch 1 - # paras 2(e), 7(1) and 10(2)), here 2,000. + # Applicable income 21,753.67 falls short of 25,183.60, so the council + # gives the maximum reduction, the whole council tax + # (gov.local_authorities.scotland.council_tax_reduction.maximum_support_rate), + # here 2,000. council_tax_reduction_applicable_income: 21_753.67 council_tax_reduction: 2_000 @@ -633,6 +639,9 @@ # (74.69 + 30.17) * 52 = 104.86 * 52 = 5,452.72. council_tax_reduction_pensioner_child_disability_premiums: 5_452.72 +# The Secretary of State and the Welsh Ministers name AFIP for a child or +# young person (England para 7(1)(c); Wales paras 7(1)(c) and 8(d)); the +# cases with a 10-year-old on AFIP test that wording. - name: AFIP England 2023, a child under 16 on AFIP alone meets the enhanced condition only. period: 2023 absolute_error_margin: 0.01 @@ -659,7 +668,8 @@ savings: 0 output: is_qualifying_young_person_for_child_benefit: [false, false] - # Para 8(e) reaches only a young person: 30.17 * 52 = 1,568.84. + # The Secretary of State gives AFIP the disabled child premium for a young + # person only (para 8(e)): 30.17 * 52 = 1,568.84. council_tax_reduction_pensioner_child_disability_premiums: 1_568.84 - name: AFIP Wales 2023, a child on AFIP alone meets the enhanced condition only (para 7(1)(c)). @@ -746,7 +756,8 @@ savings: 0 output: is_qualifying_young_person_for_child_benefit: [false, false] - # Paras 8(1)(aa) and 9(ba) reach only a young person. + # The Scottish Ministers give AFIP both premiums for a young person only + # (paras 8(1)(aa) and 9(ba)). council_tax_reduction_pensioner_child_disability_premiums: 0 - name: AFIP Scotland 2026, a young person on AFIP alone meets both conditions (paras 8(1)(aa) and 9(ba)). @@ -938,3 +949,29 @@ council_tax_reduction_pensioner_child_disability_premiums: [0] # A single pensioner aged 80: 256.00 * 52. council_tax_reduction_applicable_amount: [13_312] + +- name: Nil, a pensioner in Northern Ireland with a child on the highest DLA care rate gets no child disability premium. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + pensioner: + age: 72 + state_pension: 12_570 + child: + age: 10 + dla_sc_category: HIGHER + benunits: + benunit: + members: [pensioner, child] + would_claim_pc: false + would_claim_uc: false + households: + household: + members: [pensioner, child] + country: NORTHERN_IRELAND + output: + council_tax_reduction_pensioner: true + # The child meets both conditions, as Housing Benefit's reading shows. + housing_benefit_child_disability_premiums: 6_159.40 + council_tax_reduction_pensioner_child_disability_premiums: 0 From 16a74f81d17cbcbcd829c5111192da0b035def4c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 21:13:22 +0000 Subject: [PATCH 08/11] Name the actor in the child premium comments and docstrings Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01LwQq6FttQdG5fxwz6TgtjM --- .../applicable_amount/disabled_child_premium.yaml | 6 +++--- .../applicable_amount/enhanced_disability_premium.yaml | 6 +++--- .../applicable_amount/disabled_child_premium.yaml | 4 ++-- .../applicable_amount/enhanced_disability_premium.yaml | 4 ++-- .../applicable_amount/disabled_child_premium.yaml | 4 ++-- .../applicable_amount/enhanced_disability_premium.yaml | 4 ++-- .../dwp/housing_benefit/_child_disability_premiums.py | 5 +++-- .../housing_benefit_child_disability_premiums.py | 3 +-- ..._tax_reduction_pensioner_child_disability_premiums.py | 9 +++++---- .../council_tax_reduction_premiums.py | 4 +++- 10 files changed, 26 insertions(+), 23 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml index f4f52013a6..6d35085da5 100644 --- a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml @@ -1,7 +1,7 @@ description: Weekly amount of the disabled child premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 8, in the applicable amount of a pensioner under the England Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. values: - # We take each value from the table of premium amounts in the version - # of the schedule in force on 30 April of that year. + # Each value is the weekly amount in the table of premium amounts in the + # version of the schedule in force on 30 April of that year. 2013-04-01: value: 57.89 reference: @@ -73,5 +73,5 @@ metadata: label: England Council Tax Reduction pensioner disabled child premium for a child or young person uprating: gov.benefit_uprating_cpi reference: - - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(d) and Sch. 2 paras. 8 and 4, Part 4 entry (3) + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(d) and Sch. 2 paras. 4 and 8, Part 4 entry (3) href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml index 6ed7cdf17c..b4213e49a5 100644 --- a/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/england/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml @@ -1,7 +1,7 @@ description: Weekly amount of the enhanced disability premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 7, in the applicable amount of a pensioner under the England Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. values: - # We take each value from the table of premium amounts in the version - # of the schedule in force on 30 April of that year. + # Each value is the weekly amount in the table of premium amounts in the + # version of the schedule in force on 30 April of that year. 2013-04-01: value: 23.45 reference: @@ -73,5 +73,5 @@ metadata: label: England Council Tax Reduction pensioner enhanced disability premium for a child or young person uprating: gov.benefit_uprating_cpi reference: - - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(d) and Sch. 2 paras. 7 and 4, Part 4 entry (2) + - title: The Council Tax Reduction Schemes (Prescribed Requirements) (England) Regulations 2012 Sch. 1 para. 6(1)(d) and Sch. 2 paras. 4 and 7, Part 4 entry (2) href: https://www.legislation.gov.uk/uksi/2012/2885/schedule/2 diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml index 6379b89387..9683f95180 100644 --- a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml @@ -1,7 +1,7 @@ description: Weekly amount of the disabled child premium for each child or young person in the applicant's family who meets the condition in Sch. 1 para. 9, in the applicable amount of a pensioner under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. values: - # We take each value from the table of premium amounts in the version - # of the schedule in force on 30 April of that year. + # Each value is the weekly amount in the table of premium amounts in the + # version of the schedule in force on 30 April of that year. 2013-04-01: value: 57.89 reference: diff --git a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml index 796ee71805..f73dd6228d 100644 --- a/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/scotland/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml @@ -1,7 +1,7 @@ description: Weekly amount of the enhanced disability premium for each child or young person in the applicant's family who meets the condition in Sch. 1 para. 8, in the applicable amount of a pensioner under the Council Tax Reduction (State Pension Credit) (Scotland) Regulations 2012. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. values: - # We take each value from the table of premium amounts in the version - # of the schedule in force on 30 April of that year. + # Each value is the weekly amount in the table of premium amounts in the + # version of the schedule in force on 30 April of that year. 2013-04-01: value: 23.45 reference: diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml index 8bb89e4a9b..de505ab186 100644 --- a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/disabled_child_premium.yaml @@ -1,7 +1,7 @@ description: Weekly amount of the disabled child premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 8, in the applicable amount of a pensioner under the Welsh Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. values: - # We take each value from the table of premium amounts in the version - # of the schedule in force on 30 April of that year. + # Each value is the weekly amount in the table of premium amounts in the + # version of the schedule in force on 30 April of that year. 2014-04-01: value: 59.50 reference: diff --git a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml index eaeb5e6611..b3161806bf 100644 --- a/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/wales/council_tax_reduction/pensioners/applicable_amount/enhanced_disability_premium.yaml @@ -1,7 +1,7 @@ description: Weekly amount of the enhanced disability premium for each child or young person in the applicant's family who meets the condition in Sch. 2 para. 7, in the applicable amount of a pensioner under the Welsh Council Tax Reduction prescribed requirements. The amounts equal the Housing Benefit amounts in every year from 2015-16 to 2026-27. values: - # We take each value from the table of premium amounts in the version - # of the schedule in force on 30 April of that year. + # Each value is the weekly amount in the table of premium amounts in the + # version of the schedule in force on 30 April of that year. 2014-04-01: value: 24.08 reference: diff --git a/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py b/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py index ab9cf41589..b8d89ac57c 100644 --- a/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py +++ b/policyengine_uk/variables/gov/dwp/housing_benefit/_child_disability_premiums.py @@ -17,8 +17,9 @@ def child_disability_premium_benefit_conditions(person, period): para 7(1)(a)-(b); SSI 2012/319 Sch 1 para 8(1)(a)-(b)). Each caller adds its own armed forces independence payment route. - Both conditions read only DLA and PIP fields, so callers enter a Scottish - child disability payment or adult disability payment there. + Neither condition reads a field for child disability payment or adult + disability payment, which the model lacks, so callers enter those awards + in the DLA and PIP fields. """ dla = (person("dla_sc", period) > 0) | (person("dla_m", period) > 0) pip = (person("pip_dl", period) > 0) | (person("pip_m", period) > 0) 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 9e46823182..1e89a7739d 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 @@ -40,8 +40,7 @@ def formula(benunit, period, parameters): person = benunit.members child = person("is_child_or_young_person_for_legacy_benefits", period) disabled, enhanced = child_disability_premium_benefit_conditions(person, period) - # Housing Benefit counts AFIP for any child or young person in both - # premiums. + # The formula counts AFIP for any child or young person in both premiums. afip = person("armed_forces_independence_payment", period) > 0 disabled = disabled | afip enhanced = enhanced | afip diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py index ddfd59ccd0..ee86a5fc6b 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.py @@ -20,8 +20,8 @@ class council_tax_reduction_pensioner_child_disability_premiums(Variable): "enhanced condition with the highest DLA care rate " "(has_highest_dla_sc_award) or the enhanced PIP daily living rate " "(has_enhanced_pip_dl_award), as for Housing Benefit. An armed forces " - "independence payment meets each condition where the nation's scheme " - "names it for that person in that year: in England, for a child or " + "independence payment meets each condition where the nation's " + "ministers name it for that person in that year: in England, for a child or " "young person for the enhanced premium and for a young person for the " "disabled child premium, from 2023-24; in Wales, for a child or young " "person for the enhanced premium, and for the disabled child premium " @@ -68,8 +68,9 @@ def by_nation(get, default): return select(in_nation, [get(p) for p in nations], default=default) disabled, enhanced = child_disability_premium_benefit_conditions(person, period) - # Each scheme names the armed forces independence payment for a child, - # a young person, both or neither, by premium and year. + # The Secretary of State and the Welsh and Scottish Ministers name the + # armed forces independence payment for a child, a young person, both or + # neither, by premium and year. afip = person("armed_forces_independence_payment", period) > 0 young_person = person("is_qualifying_young_person_for_child_benefit", period) 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 b29ca340b7..ac815020d8 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,7 +15,9 @@ class council_tax_reduction_premiums(Variable): "claimant, these are the benefit unit's premiums: for a pensioner, " "pension_age_benefits_premiums plus " "council_tax_reduction_pensioner_child_disability_premiums; otherwise " - "working_age_benefits_premiums. Where the household head applies " + "working_age_benefits_premiums, with Council Tax Reduction's own " + "severe disability and enhanced disability premiums in place of the " + "shared ones. 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 premium on her own disability and " From 6e96ffef8246550731553561623e97d8a3bdd258 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 3 Nov 2026 18:39:58 -0500 Subject: [PATCH 09/11] Cite the Welsh and Scottish rules in the A2c comments The Welsh and Scottish A2c cases now cite the provisions that give a pensioner whose income does not exceed the applicable amount the whole council tax: WSI 2013/3029 reg 22(e) and Sch 1 paras 2(1) and 4(2), and SSI 2012/319 regs 14(5)(a)(ii) and (8)(a) and 47(1). A case name drops a pronoun. Comments and one case name only. Co-Authored-By: Claude Opus 5.5 --- ...eduction_pensioner_child_disability_premiums.yaml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml index b508cb564c..de145cd6b6 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax_reduction/council_tax_reduction_pensioner_child_disability_premiums.yaml @@ -390,8 +390,9 @@ council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 council_tax_reduction_applicable_amount: 25_092.60 # Applicable income 21,714.00 falls short of 25,092.60, so the council - # gives the maximum reduction, the whole council tax - # (gov.local_authorities.wales.council_tax_reduction.maximum_support_rate), + # gives the maximum reduction, the whole council tax (WSI 2013/3029 + # reg 22(e) and Sch 1 paras 2(1) and 4(2); + # gov.local_authorities.wales.council_tax_reduction.maximum_support_rate), # here 2,000. council_tax_reduction_applicable_income: 21_714.00 council_tax_reduction: 2_000 @@ -571,8 +572,9 @@ council_tax_reduction_pensioner_child_disability_premiums: 6_159.40 council_tax_reduction_applicable_amount: 25_183.60 # Applicable income 21,753.67 falls short of 25,183.60, so the council - # gives the maximum reduction, the whole council tax - # (gov.local_authorities.scotland.council_tax_reduction.maximum_support_rate), + # gives the maximum reduction, the whole council tax (SSI 2012/319 + # regs 14(5)(a)(ii) and (8)(a) and 47(1); + # gov.local_authorities.scotland.council_tax_reduction.maximum_support_rate), # here 2,000. council_tax_reduction_applicable_income: 21_753.67 council_tax_reduction: 2_000 @@ -910,7 +912,7 @@ is_child_or_young_person_for_council_tax_reduction: [false, true] council_tax_reduction_pensioner_child_disability_premiums: 0 -- name: Nil, a pensioner household head who applies alone has no child in her family, so her grandchild on the highest DLA care rate adds nothing. +- name: Nil, a pensioner household head who applies alone has no child in their family, so their grandchild on the highest DLA care rate adds nothing. period: 2026 absolute_error_margin: 0.01 input: From 4788937fe09a96e4d86c6c1f271b10778b4fa55c Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 10 Nov 2026 15:36:56 -0500 Subject: [PATCH 10/11] Name CTR's own carer premium among the working-age substitutes Main now gives a working-age benefit unit Council Tax Reduction's own carer premium (council_tax_reduction_carer_premium) in place of the shared one, as it does for the severe disability and enhanced disability premiums. The documentation's list of those substitutes now names all three. Co-Authored-By: Claude Opus 5.5 --- .../council_tax_reduction/council_tax_reduction_premiums.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 da5ac21196..1a8c543998 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 @@ -16,8 +16,8 @@ class council_tax_reduction_premiums(Variable): "pension_age_benefits_premiums plus " "council_tax_reduction_pensioner_child_disability_premiums; otherwise " "working_age_benefits_premiums, with Council Tax Reduction's own " - "severe disability and enhanced disability premiums in place of the " - "shared ones. Where the household head applies " + "severe disability, enhanced disability and carer premiums in place " + "of the shared ones. 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 premium on her own disability and " From 3b1a89f79058fddf667fe845bef454de42dac972 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 10 Nov 2026 17:02:34 -0500 Subject: [PATCH 11/11] Sample ordinary parameters from outside every calendar-year series test_ordinary_parameters_read_every_key_as_before drew its ordinary parameters from every gov leaf outside yoy_growth, so it also drew the energy price indices, which read calendar years. A pull request that moves the derandomized sample onto one of them fails the check. The ordinary list and the calendar-year check now share one prefix tuple, and a new test asserts that no ordinary parameter reads calendar years. Co-Authored-By: Claude Opus 5.5 --- .../tests/test_process_time_reforms.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/tests/test_process_time_reforms.py b/policyengine_uk/tests/test_process_time_reforms.py index d67fa29932..0255b27b9c 100644 --- a/policyengine_uk/tests/test_process_time_reforms.py +++ b/policyengine_uk/tests/test_process_time_reforms.py @@ -57,6 +57,8 @@ LAGGED_CPI = f"{GROWTH}.obr.lagged_cpi" INDICES = "gov.economic_assumptions.indices" ENERGY_PRICES = "gov.economic_assumptions.energy_prices" +# The calendar-year series on the gov tree (invariant 2). +CALENDAR_YEAR_SERIES = (f"{GROWTH}.", f"{INDICES}.", f"{ENERGY_PRICES}.") CPI_INDEX = f"{INDICES}.obr.consumer_price_index" INPUTS = "gov.economic_assumptions.statutory_uprating_inputs" AWE = f"{INPUTS}.awe_total_pay_may_july" @@ -324,9 +326,7 @@ def test_calendar_year_series_are_the_growth_rates_indices_and_household_tree(): for path in paths: if path.startswith("baseline."): continue - expected = path.startswith( - (f"{GROWTH}.", f"{INDICES}.", f"{ENERGY_PRICES}.", "household.") - ) + expected = path.startswith(CALENDAR_YEAR_SERIES + ("household.",)) assert reads(path) is expected, path assert not reads("gov.not.a.parameter") @@ -600,8 +600,7 @@ def statutory_leaves(): ORDINARY = [ path for path in statutory_leaves() - if path.startswith("gov.") - and not path.startswith(("gov.economic_assumptions.yoy_growth.",)) + if path.startswith("gov.") and not path.startswith(CALENDAR_YEAR_SERIES) ] KEYS = st.one_of( st.integers(2016, 2040), @@ -613,6 +612,12 @@ def statutory_leaves(): ) +def test_no_ordinary_parameter_reads_calendar_years(): + reads = tbs_module.parameter_reads_calendar_years() + assert ORDINARY + assert [path for path in ORDINARY if reads(path)] == [] + + @settings(max_examples=200, deadline=None, derandomize=True) @given(path=st.sampled_from(ORDINARY), key=KEYS) def test_ordinary_parameters_read_every_key_as_before(path, key):