Conversation
ITEPA 2003 s.681I (FA 2026 Sch 10, from 2025-26) charges a person entitled to a winter fuel payment the whole payment when their own total income exceeds £35,000 and they are not entitled to IS, income-based JSA, Pension Credit, income-related ESA or UC. It covers the Winter Fuel Payment in England and Wales (SI 2025/969) and Northern Ireland (NISR 2025/142) and Scotland's Pension Age Winter Heating Payment (SSI 2024/351). - winter_fuel_payment_charge (Person) under gov.hmrc.income_tax.charges, added to income_tax after tax reductions (ITA 2007 s.23 Step 7, s.30). - Payments stay gross; from 2025 the WFP pays everyone of pensionable age (require_benefits false), so entitlement, and the shared amounts, come before the charge. - Means tests deduct income_tax_before_winter_fuel_payment_charge: the charge recovers a payment, and it depends on PC/UC receipt. - pawhp counts in household_benefits and HBAI income, like the WFP. - The household income test is deprecated (off from 2025; boundary <=). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ment charge ITEPA 2003 s.681I(5) lists five relevant benefits and no tax credits. A mutant that exempted tax credit recipients survived the other cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Models the winter fuel payment charge (ITEPA 2003 s.681I, inserted by FA 2026 Sch 10, from 2025-26) person by person, for the Winter Fuel Payment in England, Wales and Northern Ireland and for Scotland's Pension Age Winter Heating Payment. The payments are now paid in full to everyone entitled, and the charge recovers them through income tax.
Stacked on #2038 (→ #2027 → #2013 → #2001 → #1896).
The law
What was wrong
On #2038 a household test stood in for the charge: a person not on a relevant benefit was paid only if some member of pensionable age in the household had total income under £35,000, in England and Wales only.
Design: an income tax charge, not a net payment
The charge could be netted off each person's payment, or added to income tax. This PR adds it to income tax.
CB_HITCinsideincome_tax, withchild_benefitkept gross.gov_spendingcounts what DWP, the Department for Communities and Social Security Scotland pay, andgov_taxcounts the UK income tax charge. Netting would show an income tax receipt as lower Scottish spending on PAWHP.What the choice changes, against netting:
household_net_incomeandhbai_household_net_incomeare the same under both. Each counts the payment and deducts the tax.household_benefits,hbai_benefitsandgov_spendingcarry the gross payment.household_tax,income_taxandgov_taxcarry the charge. In 2025 that is £304m on each side.Two consequences of putting it in income tax:
income_tax(ortax). They now deductincome_tax_before_winter_fuel_payment_charge. The charge depends on Pension Credit and Universal Credit receipt, so deducting it would make the model circular (the core raisesCycleError). It also is not tax on the income those tests assess: it is the payment, recovered. The Enhanced FRS run confirms no means-tested award moves (see below).pawhpwas ingov_spendingbut not inhousehold_benefits,hbai_household_net_incomeorhbai_benefits. Left out, the charge on PAWHP would lower a Scottish household's income with no payment to set it against. This PR adds it to all three. Count the Pension Age Winter Heating Payment in household and HBAI income #2047 adds the same three lines in the same places, so whichever merges second merges cleanly.Changes
winter_fuel_payment_charge(person): the person'swinter_fuel_paymentpluspension_age_winter_heating_payment, when their owntotal_incomeexceeds the threshold and they are on none of the s.681I(5) benefits.income_tax=income_tax_before_winter_fuel_payment_charge(the previous formula) +winter_fuel_payment_charge.gov.hmrc.income_tax.charges.winter_fuel_payment:in_effect(true from 2025),income_threshold(£35,000),relevant_benefits.gov.dwp.winter_fuel_payment.eligibility.require_benefitsis false from 2025, so the Winter Fuel Payment reaches everyone of pensionable age in England, Wales and Northern Ireland.gov.dwp.winter_fuel_payment.eligibility.taxable_income_testis deprecated, not removed. A reform that sets a missing parameter fails to load, so both parameters stay. The test is off from 2025 and has effect only in a reform that also setsrequire_benefitsto true. Its limit now admits total income equal to it. A saved reform that only movedmaximum_taxable_incomeno longer does anything: the lever for the threshold is nowgov.hmrc.income_tax.charges.winter_fuel_payment.income_threshold.Invariants
income_tax−income_tax_before_winter_fuel_payment_charge=winter_fuel_payment_charge, for every person.Tests
tests/policy/baseline/gov/hmrc/income_tax/charges/winter_fuel_payment_charge.yaml, 20 cases. They cover the £35,000 boundary on both sides, each partner charged on their own income, a person charged in full still counting as entitled for someone else's shared amount, a lodger, a non-dependant's ESA, a Universal Credit couple, the excluded partner of a Pension Credit claimant, Northern Ireland, PAWHP at the 2025 and 2026 amounts, no charge in 2024, the charge insideincome_tax, and PAWHP as household income.reforms/parametric/winter_fuel_payment_charge/charge_parameters.yaml(a higher threshold, repeal, the charge on a universal 2024 payment, tax credits not exempting), and the deprecated household test inwinter_fuel_allowance/taxable_income_test.yaml(still works when a reform requires a relevant benefit; inert otherwise).tests/test_winter_heating_payment_properties.py): the reference implementation now pays everyone from 2025 and computes each person's charge from s.681I. The model must match it for payments, charges andincome_taxless the pre-charge liability, over households of up to three benefit units in all four countries, with incomes either side of £35,000 and exactly on it. A new property sets every income to £5,000 and then £50,000 and requires identical payments, no charge at £5,000, and the whole payment charged at £50,000 for anyone not on a relevant benefit.income_tax; Winter Fuel Payment still requiring a benefit; tax credits exempting). All ten fail at least one case. The tax-credit mutant survived until the reform case above was added.pension_credit_incomedeductingincome_tax, the core raisesCycleErroronincome_tax@2025.income_taxortaxto drive a means test. They now enterincome_tax_before_winter_fuel_payment_charge, with the same expected values.eeb4698a8: YAML 1,644 passed. pytest: PYTEST_RESULTImpact: Enhanced FRS
Real Enhanced FRS microsimulations on a private copy of
enhanced_frs_2024_25.h5(sha256e433e532b17b…), 2024 to 2030, one run per package state: #2038 head071d5170b, #2047 head27f5fdb0fand this brancheeb4698a8. Aggregates only.gov_spending(£m)gov_tax(£m)gov_balance(£m)The two net-income columns differ only by PAWHP being counted as income, which #2047 also does. Against #2047 the change is the charge alone. Against #2038 it also includes the PAWHP that was missing from household income (£201m in 2025). 2024 is the control: nothing changes against #2047, and against #2038 only the £34m of PAWHP newly counted.
2025 by country, against #2047:
household_benefitsandhbai_benefitsrise by £197m against Count the Pension Age Winter Heating Payment in household and HBAI income #2047 (the extra Winter Fuel Payments) andincome_taxby £304m.A household counts as gaining or losing when its net income moves by £1 or more. The model computes in float32, so a payment charged back in full can leave a few pence either way.
Scripts and outputs are in
~/reviews/winter-fuel-payment-charge-2026-10-02/impact(dataset_impact.py,compare_impact.py,branch_vs_base.md,branch_vs_base2047.md).Axiom
axiom: uk/statute/ukpga/2003/1/681ITheAxiomFoundation/rulespec-uk#420 queued. s.681I is not in the corpus and no rulespec-uk module encodes it; the issue now carries (comment) the module path, the verbatim law, the required outputs, areview_findingand 15 companion tests from the same ground truth as the YAML here.Notes for merging
is_on_income_support,is_on_income_based_jsaandis_on_income_related_esapayee-only. The charge reads them directly, and payee-only is the right reading of "P is entitled to a relevant benefit" (s.681I(4)) for those three, so the charge's rules need no change. Test Winter Fuel Payment and PAWHP receipt per person #2038's couple rules do need to adapt: in a scratch merge, an income-related ESA couple of pensionable age gets two Winter Fuel Payments. This PR will merge Test Winter Fuel Payment and PAWHP receipt per person #2038's adapted head, then rerun its tests, the impact and a delta review.pawhplines. Its property test already allows for the charge: the net measures fall by the payment less the change inincome_tax.uc_earned_incometo deduct its ownuc_income_tax_on_earnings, which does not readincome_tax. On conflict, take Deduct only each person's own tax and NI on earnings from UC earned income #1949's formula.🤖 Generated with Claude Code