From daee9d425d4913dbe7d1b8714c29fdad01b02f68 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Fri, 18 Sep 2026 15:56:09 +0100 Subject: [PATCH 1/7] Add statutory council tax discounts (LGFA 1992 s.11, England) Adds the appropriate percentage (25%, s.11(3)) as a parameter, a council_tax_discount_rate variable applying it once for a single resident (s.11(1)) and twice where there is no resident (s.11(2)), and simulated_council_tax_less_discounts. The 50% no-resident rate is derived as twice the parameter rather than set independently. Schedule 1 disregards are not modelled, so residents are treated as never disregarded; this understates discounts for households containing disregarded adults. Co-Authored-By: Claude Opus 5 (1M context) --- .../council-tax-statutory-discounts.md | 1 + .../discounts/appropriate_percentage.yaml | 11 ++ .../council_tax/council_tax_discounts.yaml | 106 ++++++++++++++++++ .../test_council_tax_discount_derivation.py | 64 +++++++++++ .../council_tax/council_tax_discount_rate.py | 57 ++++++++++ .../simulated_council_tax_less_discounts.py | 24 ++++ 6 files changed, 263 insertions(+) create mode 100644 changelog.d/council-tax-statutory-discounts.md create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml create mode 100644 policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml create mode 100644 policyengine_uk/tests/test_council_tax_discount_derivation.py create mode 100644 policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py create mode 100644 policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py diff --git a/changelog.d/council-tax-statutory-discounts.md b/changelog.d/council-tax-statutory-discounts.md new file mode 100644 index 0000000000..08170b78df --- /dev/null +++ b/changelog.d/council-tax-statutory-discounts.md @@ -0,0 +1 @@ +Added statutory council tax discounts (LGFA 1992 s.11) for England: an appropriate-percentage parameter, a derived discount rate variable, and council tax net of discounts. diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml new file mode 100644 index 0000000000..2037364fe0 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml @@ -0,0 +1,11 @@ +description: The appropriate percentage for council tax discounts under Part I of the Local Government Finance Act 1992, applied once where there is one resident who is not disregarded and twice where there is no such resident. Applied to England only in this model. +metadata: + economy: false + unit: /1 + period: year + label: Council tax appropriate percentage + reference: + - title: Local Government Finance Act 1992, section 11(3) + href: https://www.legislation.gov.uk/ukpga/1992/14/section/11 +values: + 1993-04-01: 0.25 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml new file mode 100644 index 0000000000..a46efaab8b --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml @@ -0,0 +1,106 @@ +- name: A single resident adult in England receives the 25% discount + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: SOUTH_EAST + local_authority: MAIDSTONE + council_tax_band: D + output: + simulated_council_tax: 2502.59 + council_tax_discount_rate: 0.25 + simulated_council_tax_less_discounts: 1876.94 + +- name: Two resident adults in England receive no discount + period: 2026 + absolute_error_margin: 0.01 + input: + people: + adult_1: + age: 40 + adult_2: + age: 38 + benunits: + benunit: + members: [adult_1, adult_2] + households: + household: + members: [adult_1, adult_2] + region: SOUTH_EAST + local_authority: MAIDSTONE + council_tax_band: D + output: + simulated_council_tax: 2502.59 + council_tax_discount_rate: 0 + simulated_council_tax_less_discounts: 2502.59 + +- name: A dwelling with no resident aged 18 or over receives twice the appropriate percentage + period: 2026 + absolute_error_margin: 0.01 + input: + people: + child: + age: 10 + benunits: + benunit: + members: [child] + households: + household: + members: [child] + region: SOUTH_EAST + local_authority: MAIDSTONE + council_tax_band: D + output: + simulated_council_tax: 2502.59 + council_tax_discount_rate: 0.5 + simulated_council_tax_less_discounts: 1251.30 + +- name: Three resident adults in England receive no discount + period: 2026 + absolute_error_margin: 0.01 + input: + people: + adult_1: + age: 40 + adult_2: + age: 38 + adult_3: + age: 20 + benunits: + benunit: + members: [adult_1, adult_2, adult_3] + households: + household: + members: [adult_1, adult_2, adult_3] + region: SOUTH_EAST + local_authority: MAIDSTONE + council_tax_band: D + output: + council_tax_discount_rate: 0 + +- name: The discount does not apply outside England pending separate provision + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: WALES + local_authority: CARDIFF + council_tax_band: D + output: + council_tax_discount_rate: 0 diff --git a/policyengine_uk/tests/test_council_tax_discount_derivation.py b/policyengine_uk/tests/test_council_tax_discount_derivation.py new file mode 100644 index 0000000000..50795c5a82 --- /dev/null +++ b/policyengine_uk/tests/test_council_tax_discount_derivation.py @@ -0,0 +1,64 @@ +"""The no-resident council tax discount must derive from the appropriate percentage. + +LGFA 1992 s.11(2) sets the no-resident discount as "twice the appropriate +percentage", and s.11(3) sets the appropriate percentage at 25 per cent unless +the Secretary of State orders otherwise. The familiar 50 per cent is therefore +derived, not a printed statutory figure. These tests change the appropriate +percentage and assert that both rates move with it, which a hardcoded 0.5 would +fail. +""" + +from policyengine_uk import Simulation + +YEAR = 2026 + +PARAMETER = "gov.local_authorities.council_tax.discounts.appropriate_percentage" + +SINGLE_ADULT = { + "people": {"person": {"age": {YEAR: 40}}}, + "benunits": {"benunit": {"members": ["person"]}}, + "households": { + "household": { + "members": ["person"], + "region": {YEAR: "SOUTH_EAST"}, + "local_authority": {YEAR: "MAIDSTONE"}, + "council_tax_band": {YEAR: "D"}, + } + }, +} + +NO_RESIDENT = { + "people": {"person": {"age": {YEAR: 10}}}, + "benunits": {"benunit": {"members": ["person"]}}, + "households": { + "household": { + "members": ["person"], + "region": {YEAR: "SOUTH_EAST"}, + "local_authority": {YEAR: "MAIDSTONE"}, + "council_tax_band": {YEAR: "D"}, + } + }, +} + + +def _rate(situation, reform=None): + simulation = Simulation(situation=situation, reform=reform) + return simulation.calculate("council_tax_discount_rate", YEAR)[0] + + +def test_baseline_rates_are_the_statutory_defaults(): + assert _rate(SINGLE_ADULT) == 0.25 + assert _rate(NO_RESIDENT) == 0.5 + + +def test_no_resident_rate_is_twice_the_appropriate_percentage(): + reform = {PARAMETER: {f"{YEAR}-01-01.{YEAR}-12-31": 0.3}} + assert _rate(SINGLE_ADULT, reform) == 0.3 + # Twice the appropriate percentage, not an independently set 0.5. + assert abs(_rate(NO_RESIDENT, reform) - 0.6) < 1e-9 + + +def test_zero_appropriate_percentage_removes_both_discounts(): + reform = {PARAMETER: {f"{YEAR}-01-01.{YEAR}-12-31": 0}} + assert _rate(SINGLE_ADULT, reform) == 0 + assert _rate(NO_RESIDENT, reform) == 0 diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py new file mode 100644 index 0000000000..f58bd192f9 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py @@ -0,0 +1,57 @@ +from policyengine_uk.model_api import * + + +class council_tax_discount_rate(Variable): + value_type = float + entity = Household + label = "Council tax statutory discount rate" + documentation = ( + "The statutory council tax discount as a proportion of the gross " + "liability, under section 11 of the Local Government Finance Act 1992 " + "(England). Section 11(1) gives the appropriate percentage where there " + "is only one resident of the dwelling who is not disregarded, and " + "section 11(2) gives twice the appropriate percentage where there is no " + "such resident. The appropriate percentage is 25 per cent under section " + "11(3) unless the Secretary of State orders otherwise, so the familiar " + "50 per cent rate is derived here as twice the parameter rather than " + "set independently.\n\n" + "A resident is defined by section 6(5) as an individual aged 18 or over " + "who has their sole or main residence in the dwelling, so the adult " + "count is the statutory test rather than an approximation. However, the " + "Schedule 1 disregarded-person categories (students, the severely " + "mentally impaired, carers, and others) are NOT yet modelled. Residents " + "are therefore treated as never disregarded. This overstates the number " + "of counting residents, so this variable understates discounts for " + "households containing disregarded adults: a household of two adults " + "where one is disregarded should receive the 25 per cent discount and " + "receives none here, and a household whose only adults are all " + "disregarded should receive 50 per cent and receives none here. Adding " + "Schedule 1 will change these results.\n\n" + "Only England is in scope here. Part I of the Act also applies to " + "Wales, but the Welsh provisions (sections 12 and 12A to 12B, giving " + "Welsh Ministers separate powers over unoccupied and second homes) have " + "not been verified in this work; Scotland is under section 79. The " + "discount is therefore zero outside England pending that work." + ) + definition_period = YEAR + unit = "/1" + + def formula(household, period, parameters): + # LGFA 1992 s.6(5): a resident is an individual aged 18 or over whose + # sole or main residence is the dwelling. Schedule 1 disregards are not + # modelled, so every resident adult is counted (see documentation). + residents = household.sum(household.members("is_adult", period)) + p = parameters( + period + ).gov.local_authorities.council_tax.discounts.appropriate_percentage + + single_resident_rate = p # s.11(1): the appropriate percentage + no_resident_rate = 2 * p # s.11(2): twice the appropriate percentage + + rate = where( + residents == 0, + no_resident_rate, + where(residents == 1, single_resident_rate, 0), + ) + country = household("country", period).decode_to_str() + return where(country == "ENGLAND", rate, 0) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py b/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py new file mode 100644 index 0000000000..d862aa6c00 --- /dev/null +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py @@ -0,0 +1,24 @@ +from policyengine_uk.model_api import * + + +class simulated_council_tax_less_discounts(Variable): + value_type = float + entity = Household + label = "Simulated council tax after statutory discounts" + documentation = ( + "Simulated gross council tax less the statutory discount under section " + "11 of the Local Government Finance Act 1992 (England). Before " + "exemptions, section 11A determinations, the section 11B and 11C " + "long-term-empty and second-home premiums, and Council Tax Reduction.\n\n" + "Schedule 1 disregarded-person categories are not yet modelled, so the " + "discount is understated for households containing disregarded adults; " + "see council_tax_discount_rate." + ) + definition_period = YEAR + unit = GBP + quantity_type = FLOW + + def formula(household, period, parameters): + gross = household("simulated_council_tax", period) + discount_rate = household("council_tax_discount_rate", period) + return gross * (1 - discount_rate) From 5319c5f5fc59325cecb855a44f3482e5cb44c32f Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Sat, 26 Sep 2026 16:56:17 +0100 Subject: [PATCH 2/7] Apply council tax statutory discounts across Great Britain Addresses review asks on #1864. The discount rate was zero outside England, so simulated_council_tax_less_discounts was net of discount in England and gross in Wales and Scotland, which would mix bases in a UK aggregate. Rather than renaming the variable England-only, the discount is now applied GB-wide, each nation carrying its own verified statutory reference. The appropriate percentage is 25 per cent in all three nations, but under three different provisions: LGFA 1992 s.11(1)/(3) for England, s.79(1)/(3) for Scotland, and s.11 until 31 March 2026 and then reg. 3 of the Council Tax (Discounts, Disregards and Exemptions) (Wales) Regulations 2026 under the new s.11E for Wales. The no-resident case genuinely differs, so the doubling is now a per-nation parameter rather than a constant: - England: s.11(2)(a) gives twice the appropriate percentage, so 50 per cent stays derived rather than printed. - Scotland: s.79(2)(a) was repealed with effect 1 April 2005 by reg. 2 of S.S.I. 2005/51, so the multiple falls to zero from then. - Wales: s.11(2)(a) applied until 31 March 2026; the 2026 Regulations prescribe 50 per cent only where residents are all disregarded (reg. 4) or in the narrow unoccupied cases of reg. 6, so no general no-resident discount survives and the multiple falls to zero. Northern Ireland levies domestic rates rather than council tax and is zero throughout. Also documents that the no-resident branch is unreachable on survey data, since every FRS household has an adult reference person, so the doubled rate only fires on synthetic inputs. The resident count via is_adult is unchanged. Adds per-nation policy test cases, including the Welsh no-resident transition either side of the 2026 reform. Co-Authored-By: Claude Opus 5 (1M context) --- .../council-tax-statutory-discounts.md | 2 +- .../discounts/appropriate_percentage.yaml | 11 -- .../appropriate_percentage/england.yaml | 11 ++ .../appropriate_percentage/scotland.yaml | 11 ++ .../appropriate_percentage/wales.yaml | 15 ++ .../no_resident_multiple/england.yaml | 11 ++ .../no_resident_multiple/scotland.yaml | 14 ++ .../discounts/no_resident_multiple/wales.yaml | 14 ++ .../council_tax/council_tax_discounts.yaml | 141 +++++++++++++++++- .../test_council_tax_discount_derivation.py | 2 +- .../council_tax/council_tax_discount_rate.py | 116 +++++++++----- .../simulated_council_tax_less_discounts.py | 23 ++- 12 files changed, 308 insertions(+), 63 deletions(-) delete mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/england.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/scotland.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/wales.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/england.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/scotland.yaml create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/wales.yaml diff --git a/changelog.d/council-tax-statutory-discounts.md b/changelog.d/council-tax-statutory-discounts.md index 08170b78df..ec2b6c9da0 100644 --- a/changelog.d/council-tax-statutory-discounts.md +++ b/changelog.d/council-tax-statutory-discounts.md @@ -1 +1 @@ -Added statutory council tax discounts (LGFA 1992 s.11) for England: an appropriate-percentage parameter, a derived discount rate variable, and council tax net of discounts. +Added statutory council tax discounts across Great Britain (Local Government Finance Act 1992 sections 11 and 79, and the Council Tax (Discounts, Disregards and Exemptions) (Wales) Regulations 2026): per-nation appropriate-percentage and no-resident-multiple parameters, a derived discount rate variable, and council tax net of discounts. diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml deleted file mode 100644 index 2037364fe0..0000000000 --- a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The appropriate percentage for council tax discounts under Part I of the Local Government Finance Act 1992, applied once where there is one resident who is not disregarded and twice where there is no such resident. Applied to England only in this model. -metadata: - economy: false - unit: /1 - period: year - label: Council tax appropriate percentage - reference: - - title: Local Government Finance Act 1992, section 11(3) - href: https://www.legislation.gov.uk/ukpga/1992/14/section/11 -values: - 1993-04-01: 0.25 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/england.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/england.yaml new file mode 100644 index 0000000000..737d1f7033 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/england.yaml @@ -0,0 +1,11 @@ +description: The appropriate percentage for council tax discounts in England, applied where there is one resident who is not disregarded, and doubled where there is no such resident. +metadata: + economy: false + unit: /1 + period: year + label: England council tax appropriate percentage + reference: + - title: "Local Government Finance Act 1992, section 11(3)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/11 +values: + 1993-04-01: 0.25 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/scotland.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/scotland.yaml new file mode 100644 index 0000000000..8d2c1a66e2 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/scotland.yaml @@ -0,0 +1,11 @@ +description: The appropriate percentage for council tax discounts in Scotland, applied where there is one resident who is not disregarded. +metadata: + economy: false + unit: /1 + period: year + label: Scotland council tax appropriate percentage + reference: + - title: "Local Government Finance Act 1992, section 79(3)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/79 +values: + 1993-04-01: 0.25 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/wales.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/wales.yaml new file mode 100644 index 0000000000..b40f8af275 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/appropriate_percentage/wales.yaml @@ -0,0 +1,15 @@ +description: The appropriate percentage for council tax discounts in Wales, applied where there is one resident who is not disregarded. Until 31 March 2026 this was the appropriate percentage in section 11(3) of the Local Government Finance Act 1992, which then applied to England and Wales alike. From 1 April 2026 section 11 is England-only and the Welsh discount is prescribed by regulations under section 11E; regulation 3 of the 2026 Regulations prescribes the same 25 per cent, so the value is continuous. +metadata: + economy: false + unit: /1 + period: year + label: Wales council tax appropriate percentage + reference: + - title: "Local Government Finance Act 1992, section 11(3) (applied to England and Wales until 31 March 2026)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/11 + - title: "Local Government Finance Act 1992, section 11E (Discounts: Wales, in force 1 April 2026)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/11E + - title: "The Council Tax (Discounts, Disregards and Exemptions) (Wales) Regulations 2026 (S.I. 2026/8 (W.)), regulation 3" + href: https://www.legislation.gov.uk/wsi/2026/8/regulation/3/made +values: + 1993-04-01: 0.25 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/england.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/england.yaml new file mode 100644 index 0000000000..1161c240e9 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/england.yaml @@ -0,0 +1,11 @@ +description: The multiple of the appropriate percentage discounted where a chargeable dwelling in England has no resident. Section 11(2)(a) of the Local Government Finance Act 1992 gives twice the appropriate percentage, so this is 2 and the familiar 50 per cent is derived rather than printed. +metadata: + economy: false + unit: /1 + period: year + label: England council tax no-resident discount multiple + reference: + - title: "Local Government Finance Act 1992, section 11(2)(a)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/11 +values: + 1993-04-01: 2 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/scotland.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/scotland.yaml new file mode 100644 index 0000000000..4e46af1a1b --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/scotland.yaml @@ -0,0 +1,14 @@ +description: The multiple of the appropriate percentage discounted where a chargeable dwelling in Scotland has no resident. Section 79(2)(a) of the Local Government Finance Act 1992 originally gave twice the appropriate percentage, but it was repealed with effect from 1 April 2005 by regulation 2 of the Council Tax (Discount for Unoccupied Dwellings) (Scotland) Regulations 2005. From that date no discount arises under section 79 merely because a dwelling is unoccupied, so the multiple is zero; unoccupied dwellings in Scotland are dealt with by separate provision that is not modelled here. +metadata: + economy: false + unit: /1 + period: year + label: Scotland council tax no-resident discount multiple + reference: + - title: "Local Government Finance Act 1992, section 79(2)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/79 + - title: "The Council Tax (Discount for Unoccupied Dwellings) (Scotland) Regulations 2005 (S.S.I. 2005/51), regulation 2" + href: https://www.legislation.gov.uk/ssi/2005/51/regulation/2 +values: + 1993-04-01: 2 + 2005-04-01: 0 diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/wales.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/wales.yaml new file mode 100644 index 0000000000..23a7f40cf7 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/no_resident_multiple/wales.yaml @@ -0,0 +1,14 @@ +description: The multiple of the appropriate percentage discounted where a chargeable dwelling in Wales has no resident. Until 31 March 2026 section 11(2)(a) of the Local Government Finance Act 1992 applied to Wales and gave twice the appropriate percentage. From 1 April 2026 section 11 is England-only and the Welsh discounts are prescribed under section 11E; regulation 4 of the 2026 Regulations prescribes 50 per cent only where there are residents and every one of them is disregarded, and regulation 6 prescribes 50 per cent for an unoccupied dwelling only in the narrow caravan-pitch, boat-mooring and job-related cases. No general no-resident discount is prescribed, so the multiple is zero from that date. +metadata: + economy: false + unit: /1 + period: year + label: Wales council tax no-resident discount multiple + reference: + - title: "Local Government Finance Act 1992, section 11(2)(a) (applied to England and Wales until 31 March 2026)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/11 + - title: "The Council Tax (Discounts, Disregards and Exemptions) (Wales) Regulations 2026 (S.I. 2026/8 (W.)), regulations 4 and 6" + href: https://www.legislation.gov.uk/wsi/2026/8/regulation/4/made +values: + 1993-04-01: 2 + 2026-04-01: 0 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml index a46efaab8b..098d4be5ed 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml @@ -86,21 +86,148 @@ output: council_tax_discount_rate: 0 -- name: The discount does not apply outside England pending separate provision +- name: A single resident adult in Wales receives the 25% discount + # Regulation 3 of the Council Tax (Discounts, Disregards and Exemptions) (Wales) Regulations 2026, and section 11(1) before 1 April 2026. period: 2026 - absolute_error_margin: 0.01 + absolute_error_margin: 0.001 input: people: - person: + person_1: age: 40 benunits: benunit: - members: [person] + members: [person_1] households: household: - members: [person] + members: [person_1] region: WALES - local_authority: CARDIFF - council_tax_band: D + output: + council_tax_discount_rate: 0.25 + +- name: Two resident adults in Wales receive no discount + period: 2026 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 40 + person_2: + age: 38 + benunits: + benunit: + members: [person_1, person_2] + households: + household: + members: [person_1, person_2] + region: WALES + output: + council_tax_discount_rate: 0 + +- name: A single resident adult in Scotland receives the 25% discount + # Local Government Finance Act 1992 section 79(1), the appropriate percentage being 25 per cent under section 79(3). + period: 2026 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 40 + benunits: + benunit: + members: [person_1] + households: + household: + members: [person_1] + region: SCOTLAND + output: + council_tax_discount_rate: 0.25 + +- name: Two resident adults in Scotland receive no discount + period: 2026 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 40 + person_2: + age: 38 + benunits: + benunit: + members: [person_1, person_2] + households: + household: + members: [person_1, person_2] + region: SCOTLAND + output: + council_tax_discount_rate: 0 + +- name: A dwelling with no resident in Scotland receives no discount + # Section 79(2)(a) was repealed with effect from 1 April 2005 by regulation 2 of the Council Tax (Discount for Unoccupied Dwellings) (Scotland) Regulations 2005, so no discount arises under section 79 merely because a dwelling is unoccupied. + period: 2026 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 10 + benunits: + benunit: + members: [person_1] + households: + household: + members: [person_1] + region: SCOTLAND + output: + council_tax_discount_rate: 0 + +- name: A dwelling with no resident in Wales receives twice the appropriate percentage before the 2026 reform + # Section 11(2)(a) applied to England and Wales alike until 31 March 2026. + period: 2025 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 10 + benunits: + benunit: + members: [person_1] + households: + household: + members: [person_1] + region: WALES + output: + council_tax_discount_rate: 0.5 + +- name: A dwelling with no resident in Wales receives no discount after the 2026 reform + # From 1 April 2026 the Welsh regulations prescribe 50 per cent only where residents are all disregarded (regulation 4) or in the narrow unoccupied cases of regulation 6, so no general no-resident discount arises. Tested in 2027 because these calendar-year parameters resolve at 1 January, before the 1 April 2026 commencement. + period: 2027 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 10 + benunits: + benunit: + members: [person_1] + households: + household: + members: [person_1] + region: WALES + output: + council_tax_discount_rate: 0 + +- name: Northern Ireland receives no council tax discount + # Northern Ireland levies domestic rates rather than council tax. + period: 2026 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 40 + benunits: + benunit: + members: [person_1] + households: + household: + members: [person_1] + region: NORTHERN_IRELAND output: council_tax_discount_rate: 0 diff --git a/policyengine_uk/tests/test_council_tax_discount_derivation.py b/policyengine_uk/tests/test_council_tax_discount_derivation.py index 50795c5a82..1c1ec6bfa2 100644 --- a/policyengine_uk/tests/test_council_tax_discount_derivation.py +++ b/policyengine_uk/tests/test_council_tax_discount_derivation.py @@ -12,7 +12,7 @@ YEAR = 2026 -PARAMETER = "gov.local_authorities.council_tax.discounts.appropriate_percentage" +PARAMETER = "gov.local_authorities.council_tax.discounts.appropriate_percentage.england" SINGLE_ADULT = { "people": {"person": {"age": {YEAR: 40}}}, diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py index f58bd192f9..fcdc53b0e4 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py @@ -7,51 +7,95 @@ class council_tax_discount_rate(Variable): label = "Council tax statutory discount rate" documentation = ( "The statutory council tax discount as a proportion of the gross " - "liability, under section 11 of the Local Government Finance Act 1992 " - "(England). Section 11(1) gives the appropriate percentage where there " - "is only one resident of the dwelling who is not disregarded, and " - "section 11(2) gives twice the appropriate percentage where there is no " - "such resident. The appropriate percentage is 25 per cent under section " - "11(3) unless the Secretary of State orders otherwise, so the familiar " - "50 per cent rate is derived here as twice the parameter rather than " - "set independently.\n\n" - "A resident is defined by section 6(5) as an individual aged 18 or over " - "who has their sole or main residence in the dwelling, so the adult " - "count is the statutory test rather than an approximation. However, the " - "Schedule 1 disregarded-person categories (students, the severely " - "mentally impaired, carers, and others) are NOT yet modelled. Residents " - "are therefore treated as never disregarded. This overstates the number " - "of counting residents, so this variable understates discounts for " - "households containing disregarded adults: a household of two adults " - "where one is disregarded should receive the 25 per cent discount and " - "receives none here, and a household whose only adults are all " - "disregarded should receive 50 per cent and receives none here. Adding " - "Schedule 1 will change these results.\n\n" - "Only England is in scope here. Part I of the Act also applies to " - "Wales, but the Welsh provisions (sections 12 and 12A to 12B, giving " - "Welsh Ministers separate powers over unoccupied and second homes) have " - "not been verified in this work; Scotland is under section 79. The " - "discount is therefore zero outside England pending that work." + "liability, applied across Great Britain. Northern Ireland uses " + "domestic rates rather than council tax, so the rate is zero there.\n\n" + "SINGLE-RESIDENT DISCOUNT. Each nation gives the same 25 per cent " + "where there is only one resident who is not disregarded, but under " + "three different provisions:\n" + "- England: section 11(1) of the Local Government Finance Act 1992, " + "the appropriate percentage being 25 per cent under section 11(3) " + "unless the Secretary of State orders otherwise.\n" + "- Scotland: section 79(1) of the same Act, the appropriate percentage " + "being 25 per cent under section 79(3).\n" + "- Wales: section 11(1) as it applied to England and Wales alike until " + "31 March 2026. The Local Government Finance (Wales) Act 2024 inserted " + "the words 'in England' into section 11 with effect from 1 April 2026 " + "and inserted section 11E, under which the Welsh discounts are " + "prescribed by regulations. Regulation 3 of the Council Tax " + "(Discounts, Disregards and Exemptions) (Wales) Regulations 2026 " + "prescribes the same 25 per cent, so the rate is continuous across " + "that change.\n\n" + "NO-RESIDENT DISCOUNT. Here the nations genuinely differ, so the " + "doubling is a per-nation parameter rather than a constant:\n" + "- England: section 11(2)(a) gives twice the appropriate percentage, " + "so the familiar 50 per cent is derived as two times the parameter " + "rather than set independently.\n" + "- Scotland: section 79(2)(a) gave twice the appropriate percentage " + "until it was repealed with effect from 1 April 2005 by regulation 2 " + "of the Council Tax (Discount for Unoccupied Dwellings) (Scotland) " + "Regulations 2005. From then on no discount arises under section 79 " + "merely because a dwelling is unoccupied, so the multiple is zero.\n" + "- Wales: section 11(2)(a) applied until 31 March 2026. From 1 April " + "2026 the 2026 Regulations prescribe 50 per cent only where there are " + "residents and every one of them is disregarded (regulation 4), and " + "for an unoccupied dwelling only in the narrow caravan-pitch, " + "boat-mooring and job-related cases (regulation 6). No general " + "no-resident discount is prescribed, so the multiple is zero.\n\n" + "THE NO-RESIDENT BRANCH IS UNREACHABLE ON SURVEY DATA. Every " + "Family Resources Survey household has an adult reference person, so " + "a household with no resident aged 18 or over does not occur in the " + "microdata. The doubled rate therefore only ever fires on synthetic " + "inputs, such as the household-level calculator or the policy tests " + "below. It is retained because it is what the statute says, not " + "because it changes any survey-based aggregate.\n\n" + "WHO COUNTS AS A RESIDENT. Section 6(5) of the Act defines a resident " + "as an individual aged 18 or over who has their sole or main residence " + "in the dwelling, so counting residents as adults aged 18 or over is " + "the statutory test rather than an approximation.\n\n" + "WHAT IS APPROXIMATED. The disregarded-person categories (students, " + "the severely mentally impaired, carers, and others) in Schedule 1 to " + "the Act, and in Part 3 of the 2026 Regulations for Wales, are NOT " + "yet modelled. Residents are therefore treated as never disregarded. " + "This overstates the number of counting residents, so this variable " + "understates discounts for households containing disregarded adults: a " + "household of two adults where one is disregarded should receive the " + "25 per cent discount and receives none here, and a household whose " + "only adults are all disregarded should receive 50 per cent and " + "receives none here. Adding the disregards will change these results." ) definition_period = YEAR unit = "/1" def formula(household, period, parameters): # LGFA 1992 s.6(5): a resident is an individual aged 18 or over whose - # sole or main residence is the dwelling. Schedule 1 disregards are not - # modelled, so every resident adult is counted (see documentation). + # sole or main residence is the dwelling. Disregards are not modelled, + # so every resident adult is counted (see documentation). residents = household.sum(household.members("is_adult", period)) - p = parameters( - period - ).gov.local_authorities.council_tax.discounts.appropriate_percentage + discounts = parameters(period).gov.local_authorities.council_tax.discounts + country = household("country", period).decode_to_str() - single_resident_rate = p # s.11(1): the appropriate percentage - no_resident_rate = 2 * p # s.11(2): twice the appropriate percentage + # The appropriate percentage and the no-resident multiple are both + # per-nation: the percentage happens to agree at 25 per cent, but the + # multiple does not (see documentation). + single_rate = np.zeros_like(residents, dtype=float) + no_resident_rate = np.zeros_like(residents, dtype=float) + for key, nation in ( + ("ENGLAND", "england"), + ("WALES", "wales"), + ("SCOTLAND", "scotland"), + ): + percentage = float(getattr(discounts.appropriate_percentage, nation)) + multiple = float(getattr(discounts.no_resident_multiple, nation)) + single_rate = np.where(country == key, percentage, single_rate) + no_resident_rate = np.where( + country == key, multiple * percentage, no_resident_rate + ) - rate = where( + # s.11(1)/(2) for England, s.79(1)/(2) for Scotland, reg. 3 of the 2026 + # Regulations for Wales. Northern Ireland keeps the zero initialised + # above, as it levies domestic rates rather than council tax. + return where( residents == 0, no_resident_rate, - where(residents == 1, single_resident_rate, 0), + where(residents == 1, single_rate, 0), ) - country = household("country", period).decode_to_str() - return where(country == "ENGLAND", rate, 0) diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py b/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py index d862aa6c00..88d919383a 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py @@ -6,13 +6,22 @@ class simulated_council_tax_less_discounts(Variable): entity = Household label = "Simulated council tax after statutory discounts" documentation = ( - "Simulated gross council tax less the statutory discount under section " - "11 of the Local Government Finance Act 1992 (England). Before " - "exemptions, section 11A determinations, the section 11B and 11C " - "long-term-empty and second-home premiums, and Council Tax Reduction.\n\n" - "Schedule 1 disregarded-person categories are not yet modelled, so the " - "discount is understated for households containing disregarded adults; " - "see council_tax_discount_rate." + "Simulated gross council tax less the statutory discount, on a " + "consistent basis across Great Britain so that a UK aggregate does not " + "mix a net-of-discount England with a gross Wales and Scotland. The " + "discount is that of section 11 of the Local Government Finance Act " + "1992 in England, section 79 in Scotland, and section 11 until 31 " + "March 2026 and then the regulations under section 11E in Wales; see " + "council_tax_discount_rate for the citations and for how the " + "no-resident case differs between the three. Northern Ireland levies " + "domestic rates rather than council tax and is zero throughout.\n\n" + "This figure is before exemptions, the section 11A and Welsh " + "equivalent billing-authority determinations, the section 11B and 11C " + "long-term-empty and second-home premiums and their Welsh " + "counterparts in sections 12A and 12B, and Council Tax Reduction.\n\n" + "Disregarded-person categories are not yet modelled, so the discount " + "is understated for households containing disregarded adults; see " + "council_tax_discount_rate." ) definition_period = YEAR unit = GBP From 3f6efcbfbf233eebc3997c763d8eae212ab38b85 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Sat, 26 Sep 2026 17:00:44 +0100 Subject: [PATCH 3/7] Pin the Welsh no-resident reform in model year 2026, not 2027 The post-reform Welsh case was tested in 2027 on the assumption that a change dated 1 April 2026 would not reach model year 2026, these being calendar-year periods. That is wrong: these are annual parameters, so the 1 April 2026 change takes effect for the whole of model year 2026. Verified directly, model year 2026 already gives a zero no-resident multiple for Wales. The case is therefore pinned at 2026, the actual commencement year, with the pre-reform case left at 2025. The misleading comment about calendar-year resolution is replaced. Also confirms the commencement date underpinning the Welsh references: regulation 1 of the Council Tax (Discounts, Disregards and Exemptions) (Wales) Regulations 2026 brings the discount provisions into force on 1 April 2026, the same day the Local Government Finance (Wales) Act 2024 narrows section 11 to England, so the 25 per cent rate is continuous across the change. Co-Authored-By: Claude Opus 5 (1M context) --- .../local_authorities/council_tax/council_tax_discounts.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml index 098d4be5ed..e1d46fb46f 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml @@ -197,8 +197,8 @@ council_tax_discount_rate: 0.5 - name: A dwelling with no resident in Wales receives no discount after the 2026 reform - # From 1 April 2026 the Welsh regulations prescribe 50 per cent only where residents are all disregarded (regulation 4) or in the narrow unoccupied cases of regulation 6, so no general no-resident discount arises. Tested in 2027 because these calendar-year parameters resolve at 1 January, before the 1 April 2026 commencement. - period: 2027 + # From 1 April 2026 the Welsh regulations prescribe 50 per cent only where residents are all disregarded (regulation 4) or in the narrow unoccupied cases of regulation 6, so no general no-resident discount arises. Model year 2026 already reflects this: these are annual parameters, so a change dated 1 April 2026 takes effect for the whole of model year 2026, which is why the pre-reform case above is pinned at 2025. + period: 2026 absolute_error_margin: 0.001 input: people: From 159f74354557739b15497a943049374d50cf12ee Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Wed, 7 Oct 2026 10:47:32 +0100 Subject: [PATCH 4/7] Test a child beside one adult, single-adult liability in Wales and Scotland and Scotland's pre-2005 no-resident rule; state the partial discount scope at the consumer The resident disregards stay unmodelled; simulated_council_tax_less_discounts now says it is not the complete net liability and that its aggregates are an upper bound on liability after discounts. Co-Authored-By: Claude Opus 5.5 --- .../council_tax/council_tax_discounts.yaml | 83 +++++++++++++++++++ .../simulated_council_tax_less_discounts.py | 10 ++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml index e1d46fb46f..d9be9f6a33 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml @@ -231,3 +231,86 @@ region: NORTHERN_IRELAND output: council_tax_discount_rate: 0 + +- name: A child alongside one adult does not count as a resident, so the 25% discount applies + # LGFA 1992 s.6(5): a resident is an individual aged 18 or over. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + adult: + age: 40 + child: + age: 10 + benunits: + benunit: + members: [adult, child] + households: + household: + members: [adult, child] + region: SOUTH_EAST + local_authority: MAIDSTONE + council_tax_band: D + output: + council_tax_discount_rate: 0.25 + simulated_council_tax_less_discounts: 1876.94 + +- name: A single adult in Cardiff pays 75% of the Band D liability + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: WALES + local_authority: CARDIFF + council_tax_band: D + output: + simulated_council_tax: 2013.18 + council_tax_discount_rate: 0.25 + simulated_council_tax_less_discounts: 1509.89 + +- name: A single adult in Edinburgh pays 75% of the Band D liability + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person: + age: 40 + benunits: + benunit: + members: [person] + households: + household: + members: [person] + region: SCOTLAND + local_authority: CITY_OF_EDINBURGH + council_tax_band: D + output: + simulated_council_tax: 1626.05 + council_tax_discount_rate: 0.25 + simulated_council_tax_less_discounts: 1219.54 + +- name: A dwelling with no resident in Scotland received twice the appropriate percentage before April 2005 + # Section 79(2)(a) applied until its repeal with effect from 1 April 2005 (S.S.I. 2005/51 reg. 2). + period: 2004 + absolute_error_margin: 0.001 + input: + people: + person_1: + age: 10 + benunits: + benunit: + members: [person_1] + households: + household: + members: [person_1] + region: SCOTLAND + output: + council_tax_discount_rate: 0.5 diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py b/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py index 88d919383a..7d6ba08c8c 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/simulated_council_tax_less_discounts.py @@ -19,8 +19,14 @@ class simulated_council_tax_less_discounts(Variable): "equivalent billing-authority determinations, the section 11B and 11C " "long-term-empty and second-home premiums and their Welsh " "counterparts in sections 12A and 12B, and Council Tax Reduction.\n\n" - "Disregarded-person categories are not yet modelled, so the discount " - "is understated for households containing disregarded adults; see " + "PARTIAL: this is not the complete net liability. Disregarded-person " + "categories (students, carers, the severely mentally impaired and " + "others) are not yet modelled, so every adult counts as a resident " + "and the discount is understated for households containing " + "disregarded adults: two adults with one disregarded get no discount " + "here instead of 25 per cent, and all-disregarded households get none " + "instead of 50 per cent. Aggregates of this variable are therefore an " + "upper bound on liability after discounts; see " "council_tax_discount_rate." ) definition_period = YEAR From f68ad58c550cb5dddd65252d7fd679d456ba5363 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Wed, 7 Oct 2026 11:47:52 +0100 Subject: [PATCH 5/7] Count council tax residents by the s.6(5) age test, not the deprecated is_adult flag Main's code-health test bans model reads of the generic child and adult variables. LGFA 1992 s.6(5) defines a resident as an individual aged 18 or over, so the count now compares age with a cited resident_minimum_age parameter. Results are unchanged. Co-Authored-By: Claude Opus 5.5 --- .../council_tax/discounts/resident_minimum_age.yaml | 11 +++++++++++ .../council_tax/council_tax_discount_rate.py | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml new file mode 100644 index 0000000000..86ae868167 --- /dev/null +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml @@ -0,0 +1,11 @@ +description: Minimum age at which an individual counts as a resident for the council tax discounts. Section 6(5) of the Local Government Finance Act 1992 defines a resident as an individual aged 18 or over who has their sole or main residence in the dwelling; the definition applies in England, Wales and Scotland. +metadata: + economy: false + unit: year + period: year + label: Council tax resident minimum age + reference: + - title: "Local Government Finance Act 1992, section 6(5)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/6 +values: + 1993-04-01: 18 diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py index fcdc53b0e4..4d5adcb9a8 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py @@ -70,8 +70,9 @@ def formula(household, period, parameters): # LGFA 1992 s.6(5): a resident is an individual aged 18 or over whose # sole or main residence is the dwelling. Disregards are not modelled, # so every resident adult is counted (see documentation). - residents = household.sum(household.members("is_adult", period)) discounts = parameters(period).gov.local_authorities.council_tax.discounts + age = household.members("age", period) + residents = household.sum(age >= discounts.resident_minimum_age) country = household("country", period).decode_to_str() # The appropriate percentage and the no-resident multiple are both From 4b311f5279452f1596b6a781564e7a6ef605bb25 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Fri, 9 Oct 2026 18:03:01 +0100 Subject: [PATCH 6/7] Rename changelog fragment to council-tax-statutory-discounts.added.md (review: typed fragment) Co-Authored-By: Claude Opus 5.5 --- ...tory-discounts.md => council-tax-statutory-discounts.added.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog.d/{council-tax-statutory-discounts.md => council-tax-statutory-discounts.added.md} (100%) diff --git a/changelog.d/council-tax-statutory-discounts.md b/changelog.d/council-tax-statutory-discounts.added.md similarity index 100% rename from changelog.d/council-tax-statutory-discounts.md rename to changelog.d/council-tax-statutory-discounts.added.md From c8f85676fdc256b336afd845d534dd576fd3b4a6 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Mon, 19 Oct 2026 13:17:38 +0200 Subject: [PATCH 7/7] Cite LGFA 1992 s.99(1) for the Scottish resident definition Section 6(5) defines "resident" for Part I (England and Wales). For Scotland, Part II's own definition is in s.99(1), with the same age 18 and sole or main residence test. Add it beside s.6(5) in the parameter reference and description, the formula comment and the YAML test note. No value or output changes. Co-Authored-By: Claude Opus 5.5 --- .../council_tax/discounts/resident_minimum_age.yaml | 4 +++- .../council_tax/council_tax_discounts.yaml | 2 +- .../council_tax/council_tax_discount_rate.py | 7 ++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml index 86ae868167..8eb7e37186 100644 --- a/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml +++ b/policyengine_uk/parameters/gov/local_authorities/council_tax/discounts/resident_minimum_age.yaml @@ -1,4 +1,4 @@ -description: Minimum age at which an individual counts as a resident for the council tax discounts. Section 6(5) of the Local Government Finance Act 1992 defines a resident as an individual aged 18 or over who has their sole or main residence in the dwelling; the definition applies in England, Wales and Scotland. +description: Minimum age at which an individual counts as a resident for the council tax discounts. The Local Government Finance Act 1992 defines a resident as an individual aged 18 or over who has their sole or main residence in the dwelling, in section 6(5) for England and Wales (Part I) and section 99(1) for Scotland (Part II). metadata: economy: false unit: year @@ -7,5 +7,7 @@ metadata: reference: - title: "Local Government Finance Act 1992, section 6(5)" href: https://www.legislation.gov.uk/ukpga/1992/14/section/6 + - title: "Local Government Finance Act 1992, section 99(1)" + href: https://www.legislation.gov.uk/ukpga/1992/14/section/99 values: 1993-04-01: 18 diff --git a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml index d9be9f6a33..968cb24adf 100644 --- a/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml +++ b/policyengine_uk/tests/policy/baseline/gov/local_authorities/council_tax/council_tax_discounts.yaml @@ -233,7 +233,7 @@ council_tax_discount_rate: 0 - name: A child alongside one adult does not count as a resident, so the 25% discount applies - # LGFA 1992 s.6(5): a resident is an individual aged 18 or over. + # LGFA 1992 s.6(5) (s.99(1) in Scotland): a resident is an individual aged 18 or over. period: 2026 absolute_error_margin: 0.01 input: diff --git a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py index 4d5adcb9a8..04246fa176 100644 --- a/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py +++ b/policyengine_uk/variables/gov/local_authorities/council_tax/council_tax_discount_rate.py @@ -67,9 +67,10 @@ class council_tax_discount_rate(Variable): unit = "/1" def formula(household, period, parameters): - # LGFA 1992 s.6(5): a resident is an individual aged 18 or over whose - # sole or main residence is the dwelling. Disregards are not modelled, - # so every resident adult is counted (see documentation). + # LGFA 1992 s.6(5) (England and Wales) and s.99(1) (Scotland): a + # resident is an individual aged 18 or over whose sole or main + # residence is the dwelling. Disregards are not modelled, so every + # resident adult is counted (see documentation). discounts = parameters(period).gov.local_authorities.council_tax.discounts age = household.members("age", period) residents = household.sum(age >= discounts.resident_minimum_age)