diff --git a/changelog.d/1957.fixed.md b/changelog.d/1957.fixed.md new file mode 100644 index 0000000000..2d0f798bec --- /dev/null +++ b/changelog.d/1957.fixed.md @@ -0,0 +1 @@ +Uprate the Scottish Carer Supplement each April by the previous September's CPI, rounded to the nearest 5p, instead of holding it at £11.70 a week from 2027-28, and round the Carer Support Payment component's projected rate to the nearest 5p in the same way. diff --git a/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/rate.yaml b/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/rate.yaml index 1aee85e056..4cab258689 100644 --- a/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/rate.yaml +++ b/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/rate.yaml @@ -7,9 +7,26 @@ metadata: period: week unit: currency-GBP label: Carer Support Payment rate - uprating: gov.benefit_uprating_cpi + # September CPI and nearest-5p rounding follow Scottish Ministers' current + # policy; s86A leaves the choice of relevant prices to Ministers. + # Apply each year's rise to the previous rounded rate each April. + uprating: + parameter: gov.benefit_uprating_cpi + at_defined_interval: + start: "0001-01-01" + end: "0002-01-01" + enactment: "0002-04-01" + rounding: + type: nearest + interval: 0.05 reference: - title: Carer Support Payment - mygov.scot href: https://www.mygov.scot/carer-support-payment - title: The Social Security (Up-rating) (Miscellaneous Amendments) (Scotland) Regulations 2026 reg. 12(3)(a) href: https://www.legislation.gov.uk/ssi/2026/170/regulation/12/made + - title: Social Security (Scotland) Act 2018 s. 86B (duty to uprate assistance) + href: https://www.legislation.gov.uk/asp/2018/9/section/86B + - title: Social Security Assistance in Scotland - up-rating for inflation in 2026-27, section 2.1 (12 months to September CPI, rounded to the nearest five pence) + href: https://www.gov.scot/publications/social-security-assistance-scotland-up-rating-inflation-2026-27/pages/3/ + - title: Social Security Assistance in Scotland - up-rating for inflation in 2026-27, section 3 (12 months to September CPI) + href: https://www.gov.scot/publications/social-security-assistance-scotland-up-rating-inflation-2026-27/pages/4/ diff --git a/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/supplement.yaml b/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/supplement.yaml index d375e1ac37..533389b053 100644 --- a/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/supplement.yaml +++ b/policyengine_uk/parameters/gov/social_security_scotland/carer_support_payment/supplement.yaml @@ -7,10 +7,30 @@ metadata: period: week unit: currency-GBP label: Scottish Carer Supplement rate + # September CPI and nearest-5p rounding follow Scottish Ministers' current + # policy; s86A leaves the choice of relevant prices to Ministers. + # Apply each year's rise to the previous rounded rate each April. + uprating: + parameter: gov.benefit_uprating_cpi + at_defined_interval: + start: "0001-01-01" + end: "0002-01-01" + enactment: "0002-04-01" + rounding: + type: nearest + interval: 0.05 reference: - - title: New rates for carer and disability payments in 2026 - href: https://www.socialsecurity.gov.scot/news-events/news/new-payment-rates-from-april-2026 - title: The Carer's Assistance (Miscellaneous and Consequential Amendments, Revocation, Transitional and Saving Provisions) (Scotland) Regulations 2025 reg. 3 href: https://www.legislation.gov.uk/ssi/2025/340/made - title: The Social Security (Up-rating) (Miscellaneous Amendments) (Scotland) Regulations 2026 reg. 12(3)(b) href: https://www.legislation.gov.uk/ssi/2026/170/regulation/12/made + - title: Social Security (Scotland) Act 2018 s. 86A (inflation-adjusted level) + href: https://www.legislation.gov.uk/asp/2018/9/section/86A + - title: Social Security (Scotland) Act 2018 s. 86B (duty to uprate assistance) + href: https://www.legislation.gov.uk/asp/2018/9/section/86B + - title: Social Security Assistance in Scotland - up-rating for inflation in 2026-27, section 2.1 (12 months to September CPI, rounded to the nearest five pence) + href: https://www.gov.scot/publications/social-security-assistance-scotland-up-rating-inflation-2026-27/pages/3/ + - title: Social Security Assistance in Scotland - up-rating for inflation in 2026-27, section 3 (12 months to September CPI) + href: https://www.gov.scot/publications/social-security-assistance-scotland-up-rating-inflation-2026-27/pages/4/ + - title: Social Security Assistance in Scotland - up-rating for inflation in 2026-27, table 5 (2026-27 rates) + href: https://www.gov.scot/publications/social-security-assistance-scotland-up-rating-inflation-2026-27/pages/7/ diff --git a/policyengine_uk/tests/policy/baseline/gov/social_security_scotland/scottish_carer_supplement.yaml b/policyengine_uk/tests/policy/baseline/gov/social_security_scotland/scottish_carer_supplement.yaml new file mode 100644 index 0000000000..ffb1748332 --- /dev/null +++ b/policyengine_uk/tests/policy/baseline/gov/social_security_scotland/scottish_carer_supplement.yaml @@ -0,0 +1,58 @@ +# Social Security (Scotland) Act 2018 s.86B requires Scottish Ministers to +# bring forward legislation raising the Scottish Carer Supplement and the +# Carer Support Payment component to at least their s.86A inflation-adjusted +# levels. Their measure is the 12 months to September CPI, rounded to the +# nearest 5p (Social Security Assistance in Scotland: up-rating for inflation +# in 2026-27, sections 2 and 3). From April 2027 the model raises both each +# April by the previous September's CPI (gov.benefit_uprating_cpi) and rounds +# to the nearest 5p: 3.5% for April 2027 (ONS, 21 October 2026) and the OBR +# March 2026 EFO forecast of 2.1% for April 2028. + +- name: Scottish Carer Supplement is 11.70 a week in 2026 + period: 2026 + absolute_error_margin: 0.01 + input: + age: 35 + care_hours: 40 + country: SCOTLAND + output: + # SSI 2026/170 reg. 12(3)(b): 11.70 x 52. + scottish_carer_supplement: 608.40 + carer_support_payment: 86.45 * 52 + +- name: Scottish Carer Supplement rises by September CPI in 2027 + period: 2027 + absolute_error_margin: 0.01 + input: + age: 35 + care_hours: 40 + country: SCOTLAND + output: + # 11.70 x 1.035 = 12.1095, to the nearest 5p 12.10; x 52 = 629.20. + scottish_carer_supplement: 12.10 * 52 + # 86.45 x 1.035 = 89.47575, to the nearest 5p 89.50. + carer_support_payment: 89.50 * 52 + +- name: Scottish Carer Supplement keeps rising in 2028 + period: 2028 + absolute_error_margin: 0.01 + input: + age: 35 + care_hours: 40 + country: SCOTLAND + output: + # 12.10 x 1.021 = 12.3541, to the nearest 5p 12.35; x 52 = 642.20. + scottish_carer_supplement: 12.35 * 52 + # 89.50 x 1.021 = 91.3795, to the nearest 5p 91.40. + carer_support_payment: 91.40 * 52 + +- name: Carer in England gets no Scottish Carer Supplement in 2027 + period: 2027 + absolute_error_margin: 0 + input: + age: 35 + care_hours: 40 + country: ENGLAND + output: + scottish_carer_supplement: 0 + carer_support_payment: 0 diff --git a/policyengine_uk/tests/test_scottish_carer_supplement_uprating.py b/policyengine_uk/tests/test_scottish_carer_supplement_uprating.py new file mode 100644 index 0000000000..dcd78f7985 --- /dev/null +++ b/policyengine_uk/tests/test_scottish_carer_supplement_uprating.py @@ -0,0 +1,136 @@ +"""Uprating of the Scottish Carer Supplement and Carer Support Payment. + +Social Security (Scotland) Act 2018 s.86B requires Scottish Ministers to bring +forward legislation raising each figure of assistance given under Chapter 2 of +Part 2, carer's assistance included, to at least its s.86A inflation-adjusted +level. Their measure is the 12 months to September CPI, rounded to the nearest +5p (Social Security Assistance in Scotland: up-rating for inflation in +2026-27, sections 2 and 3). SSI 2026/170 reg 12(3) raised the Carer Support +Payment component from 83.30 to 86.45 and the Scottish Carer Supplement from +11.29 to 11.70: both are the 3.8% September 2025 rate, rounded to 5p. The +supplement had no uprating metadata, so the model froze it at 11.70 a week from +2027 while the Carer Support Payment component kept rising. + +Both rates now rise as Scottish Child Payment and Pension Age Winter Heating +Payment do: each April by the previous September's CPI +(gov.benefit_uprating_cpi), rounded to the nearest 5p. Invariants, for every +year from 2027 to 2039, the last year of the uprating index: + +1. Each April's rate is the previous rounded rate times one plus the + September CPI rise, rounded to the nearest 5p. The reference here compounds + the published 2026 rates in Decimal, independently of the index. +2. Neither rate falls, since the rise is never negative. +3. Metamorphic: setting the previous September's CPI to a published rate g + moves that April's rates to the previous rates times 1 + g, rounded to 5p, + and leaves the year before alone. + +The YAML tests in tests/policy/baseline/gov/social_security_scotland check +that a Carer Support Payment recipient in Scotland gets 52 weeks of each rate. +""" + +from decimal import ROUND_HALF_UP, Decimal + +import pytest +from hypothesis import HealthCheck, assume, given, settings +from hypothesis import strategies as st + +from policyengine_uk import Simulation +from policyengine_uk.model_api import Scenario +from policyengine_uk.system import system + +CARER = "gov.social_security_scotland.carer_support_payment" +CPI_SEPTEMBER = "gov.economic_assumptions.statutory_uprating_inputs.cpi_september" +# SSI 2026/170 reg 12(3)(a) and (b). +RATES_2026 = { + f"{CARER}.supplement": Decimal("11.70"), + f"{CARER}.rate": Decimal("86.45"), +} +# Hand calculations: the 2026 rate x 1.035 (September 2026 CPI, ONS release +# of 21 October 2026), to the nearest 5p: 11.70 -> 12.1095; 86.45 -> 89.47575. +APRIL_2027 = {f"{CARER}.supplement": 12.10, f"{CARER}.rate": 89.50} +YEARS = range(2027, 2040) +FIVE_PENCE = Decimal("0.05") + +PERSON = { + "people": {"person": {"age": {2026: 40}}}, + "benunits": {"benunit": {"members": ["person"]}}, + "households": {"household": {"members": ["person"]}}, +} + + +def nearest_5p(amount: Decimal) -> Decimal: + return (amount / FIVE_PENCE).quantize(Decimal(1), ROUND_HALF_UP) * FIVE_PENCE + + +def weekly_rate(parameters, name, year): + return parameters.get_child(name)(f"{year}-04-30") + + +@pytest.mark.parametrize("name", RATES_2026) +def test_2026_rates_are_the_enacted_ones(name): + assert weekly_rate(system.parameters, name, 2026) == float(RATES_2026[name]) + + +@pytest.mark.parametrize("name, expected", APRIL_2027.items()) +def test_april_2027_rates_use_september_2026_cpi(name, expected): + assert weekly_rate(system.parameters, name, 2027) == pytest.approx( + expected, abs=1e-9 + ) + + +@pytest.mark.parametrize("name", RATES_2026) +def test_each_april_compounds_the_previous_rounded_rate(name): + parameters = system.parameters + rise = parameters.gov.economic_assumptions.yoy_growth.september_cpi_uprating + previous = RATES_2026[name] + for year in YEARS: + growth = 1 + Decimal(str(rise(f"{year}-01-01"))) + expected = nearest_5p(previous * growth) + actual = weekly_rate(parameters, name, year) + assert actual == pytest.approx(float(expected), abs=1e-9), year + assert actual >= weekly_rate(parameters, name, year - 1), year + previous = expected + + +def parameters_under(changes): + simulation = Simulation( + situation=PERSON, + scenario=Scenario(parameter_changes=changes, applied_before_data_load=True), + ) + return simulation.tax_benefit_system.parameters + + +@settings( + max_examples=8, + deadline=None, + derandomize=True, + suppress_health_check=[HealthCheck.too_slow], +) +@given( + year=st.integers(min_value=YEARS.start, max_value=2035), + september_permille=st.integers(min_value=0, max_value=120), +) +def test_rates_follow_the_previous_september_cpi(year, september_permille): + september = Decimal(september_permille) / 1000 + expected = {} + for name in RATES_2026: + before = Decimal(f"{weekly_rate(system.parameters, name, year - 1):.2f}") + unrounded = before * (1 + september) + # The index is stored to 5 decimal places, so skip rises that land + # within a tenth of a step of a 5p half-way point. + steps = unrounded / FIVE_PENCE + remainder = abs(steps - steps.to_integral_value()) + assume(Decimal("0.5") - remainder > Decimal("0.1")) + expected[name] = (before, nearest_5p(unrounded)) + + parameters = parameters_under( + {CPI_SEPTEMBER: {f"year:{year - 1}-09-01:1": float(september)}} + ) + + for name, (before, after) in expected.items(): + assert weekly_rate(parameters, name, year - 1) == pytest.approx( + float(before), abs=1e-9 + ) + assert weekly_rate(parameters, name, year) == pytest.approx( + float(after), abs=1e-9 + )