From 11cac61271df66ec6ccdda9555c700c1a2a3f5b4 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Mon, 19 Jan 2026 09:39:52 -0500 Subject: [PATCH 1/2] fix(scotland): add 2026-27 higher rate threshold freeze to baseline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scottish Budget 2025-26 announced freezing higher, advanced, and top rate thresholds through 2026-27. This updates the baseline parameters to include these frozen values for 2026-04-06. Without this fix, PolicyEngine's baseline incorrectly assumes CPI growth for 2026, leading to incorrect policy costings when comparing to SFC (Scottish Fiscal Commission) estimates. Thresholds frozen at: - Higher rate: £31,092 - Advanced rate: £62,430 - Top rate: £125,140 Co-Authored-By: Claude Opus 4.5 --- .../gov/hmrc/income_tax/rates/scotland/rates.yaml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/policyengine_uk/parameters/gov/hmrc/income_tax/rates/scotland/rates.yaml b/policyengine_uk/parameters/gov/hmrc/income_tax/rates/scotland/rates.yaml index 328ef24ec..488f0af08 100644 --- a/policyengine_uk/parameters/gov/hmrc/income_tax/rates/scotland/rates.yaml +++ b/policyengine_uk/parameters/gov/hmrc/income_tax/rates/scotland/rates.yaml @@ -45,6 +45,8 @@ brackets: 2023-04-06: 31_092 2024-04-06: 31_092 2025-04-06: 31_092 + # Scottish Budget 2025-26 announced freeze through 2026-27 + 2026-04-06: 31_092 metadata: uprating: gov.economic_assumptions.indices.obr.consumer_price_index rate: @@ -57,6 +59,8 @@ brackets: 2023-04-06: 125_140 2024-04-06: 62_430 2025-04-06: 62_430 + # Scottish Budget 2025-26 announced freeze through 2026-27 + 2026-04-06: 62_430 metadata: uprating: gov.economic_assumptions.indices.obr.consumer_price_index rate: @@ -69,6 +73,8 @@ brackets: 2017-04-06: null 2024-04-06: 125_140 2025-04-06: 125_140 + # Scottish Budget 2025-26 announced freeze through 2026-27 + 2026-04-06: 125_140 metadata: uprating: gov.economic_assumptions.indices.obr.consumer_price_index rate: @@ -81,3 +87,5 @@ metadata: reference: - title: GOV.UK href: https://www.gov.uk/government/publications/rates-and-allowances-income-tax/income-tax-rates-and-allowances-current-and-past + - title: Scottish Budget 2025-26 - Higher rate threshold freeze + href: https://www.gov.scot/publications/scottish-budget-2025-26/ From 30c12fcb10b83e4829127c1fb919e7f7339e3441 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Tue, 20 Jan 2026 12:39:39 +0000 Subject: [PATCH 2/2] Add changelog entry and apply Black formatting Co-Authored-By: Claude Opus 4.5 --- changelog_entry.yaml | 4 ++++ .../gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py | 1 - .../tests/microsimulation/test_reform_impacts.py | 1 - .../microsimulation/test_salary_sacrifice_cap_reform.py | 1 - policyengine_uk/tests/test_behavioral_responses.py | 1 - policyengine_uk/utils/dependencies.py | 6 ++---- policyengine_uk/variables/gov/hmrc/fuel_duty/fuel_duty.py | 1 - .../variables/gov/hmrc/income_tax/reliefs/loss_relief.py | 1 - 8 files changed, 6 insertions(+), 10 deletions(-) diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb..1a1623bf3 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + fixed: + - Add 2026-27 Scottish income tax threshold freeze to baseline (higher, advanced, and top rates) per Scottish Budget 2025-26. diff --git a/policyengine_uk/parameters/gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py b/policyengine_uk/parameters/gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py index f24f902fb..f7864b055 100644 --- a/policyengine_uk/parameters/gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py +++ b/policyengine_uk/parameters/gov/hmrc/fuel_duty/calculate_fuel_duty_rates.py @@ -18,7 +18,6 @@ import yaml - # Years to calculate rates for CALCULATION_YEARS = range(2026, 2031) diff --git a/policyengine_uk/tests/microsimulation/test_reform_impacts.py b/policyengine_uk/tests/microsimulation/test_reform_impacts.py index 4e036dd34..24cfde006 100644 --- a/policyengine_uk/tests/microsimulation/test_reform_impacts.py +++ b/policyengine_uk/tests/microsimulation/test_reform_impacts.py @@ -8,7 +8,6 @@ from pathlib import Path from policyengine_uk import Microsimulation - # Load configuration from YAML file config_path = Path(__file__).parent / "reforms_config.yaml" with open(config_path, "r") as f: diff --git a/policyengine_uk/tests/microsimulation/test_salary_sacrifice_cap_reform.py b/policyengine_uk/tests/microsimulation/test_salary_sacrifice_cap_reform.py index 5a76645d9..ec5353ddd 100644 --- a/policyengine_uk/tests/microsimulation/test_salary_sacrifice_cap_reform.py +++ b/policyengine_uk/tests/microsimulation/test_salary_sacrifice_cap_reform.py @@ -20,7 +20,6 @@ import pandas as pd from policyengine_uk import Microsimulation - # Policy year when the salary sacrifice cap takes effect POLICY_YEAR = 2030 # Use 2030 to ensure cap is active (cap starts 2029-04-06) diff --git a/policyengine_uk/tests/test_behavioral_responses.py b/policyengine_uk/tests/test_behavioral_responses.py index f28b0c2e6..16f7b50ff 100644 --- a/policyengine_uk/tests/test_behavioral_responses.py +++ b/policyengine_uk/tests/test_behavioral_responses.py @@ -16,7 +16,6 @@ from policyengine_uk import Microsimulation from policyengine_uk.model_api import Scenario - # Check if HF token is available for data-dependent tests HF_TOKEN_AVAILABLE = bool(os.environ.get("HUGGING_FACE_TOKEN")) requires_hf_data = pytest.mark.skipif( diff --git a/policyengine_uk/utils/dependencies.py b/policyengine_uk/utils/dependencies.py index c1ea9d059..71f4126d3 100644 --- a/policyengine_uk/utils/dependencies.py +++ b/policyengine_uk/utils/dependencies.py @@ -179,14 +179,12 @@ def create_waterfall_change_chart( def add_fonts(): - fonts = HTML( - """ + fonts = HTML(""" - """ - ) + """) return display_html(fonts) diff --git a/policyengine_uk/variables/gov/hmrc/fuel_duty/fuel_duty.py b/policyengine_uk/variables/gov/hmrc/fuel_duty/fuel_duty.py index 3169b8db6..b0806780c 100644 --- a/policyengine_uk/variables/gov/hmrc/fuel_duty/fuel_duty.py +++ b/policyengine_uk/variables/gov/hmrc/fuel_duty/fuel_duty.py @@ -1,6 +1,5 @@ from policyengine_uk.model_api import * - STATUTORY_CONSUMER_INCIDENCE = 0.5 ECONOMIC_CONSUMER_INCIDENCE = 1 diff --git a/policyengine_uk/variables/gov/hmrc/income_tax/reliefs/loss_relief.py b/policyengine_uk/variables/gov/hmrc/income_tax/reliefs/loss_relief.py index fc5aaecc6..ced48ecb1 100644 --- a/policyengine_uk/variables/gov/hmrc/income_tax/reliefs/loss_relief.py +++ b/policyengine_uk/variables/gov/hmrc/income_tax/reliefs/loss_relief.py @@ -1,6 +1,5 @@ from policyengine_uk.model_api import * - """ The section detailing some tax reliefs applicable is section 24 of the Act, but others are described in the 2003 and 2005 Acts as deductions from the respective components. """