Repository navigation
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>
|
#2038 merged into main as 4012143, so this PR's base is now
🤖 Generated with Claude Code |
Brings in #2038 as merged (paid-to versus couple receipt, payee-only is_on_pension_credit over the qualifying age, is_on_universal_credit without an ineligible partner, the dated age test), #1949 (UC earned income deducts each person's own tax on earnings) and the rest of main. Conflicts: - uc_earned_income: take #1949's formula; uc_income_tax_on_earnings works from the rates and never reads income_tax. - is_benefit_cap_exempt_earnings: main's claimant-only sum, deducting income_tax_before_winter_fuel_payment_charge. - is_benefit_cap_exempt_other: main's version (it no longer tests earnings). - winter_fuel_payment_eligible: main's age test with this branch's <=. - The Hypothesis reference: main's paid-to logic; the WFP means condition holds outside 2024; the charge exempts only a person a relevant benefit is paid to (the claimant for IS, JSA, ESA and PC; both for UC), as the model's is_on_* variables now do. Two income_tax readers came in from main and would include the charge: - housing_benefit_net_earnings (HB regs 36(3)): deducts the tax before the charge, which is not tax deducted from earnings; - uses_property_allowance: the route branches compare the tax before the charge, since the charge depends on Pension Credit, which depends on property income. New YAML cases cover both, and the partner of an Income Support claimant who is paid and charged. relevant_benefits.yaml describes the payee reading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model's total_income is before the property allowance, so the charge is the same on either route; reading income_tax in the route branches would only recompute the means-tested benefits there (a probe with income_tax in the route made the same choice and raised no CycleError). Correct the YAML case's comment to match: total income is £35,300 on either route. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Without universal_credit: 0 the model computes a Universal Credit award for the couple, which makes both members joint claimants and exempts the partner. Zero Universal Credit and Pension Credit, as the other cases do. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three property tests that CI failed on 03154a1 compared a means test with income_tax, which now includes the winter fuel payment charge: - test_uc_earnings_deductions_properties: the pre-#1942 UC earned income formula deducted benunit_tax, which now reads the charge and so UC receipt (CycleError). It deducts the benefit unit's income tax before the charge and its NI instead. - test_council_tax_reduction_carer_income_properties and test_housing_benefit_savings_credit_only_properties: CTR and HB income deduct income_tax_before_winter_fuel_payment_charge, so the identities add back that liability, not income_tax. The HB boundary test also excludes the charge, as it excludes the other payments that depend on Pension Credit receipt. A YAML case pins CTR income to the tax before the charge, which no YAML case covered. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r3 (lost to the 10/12 reboot) found two properties false inside their own generators on aede16d, both comparing a means test with income_tax, which now includes the winter fuel payment charge: - test_deductions_equal_tax_and_ni_on_earnings_alone: a pensioner in a mixed-age couple earning £40,000 off UC is charged £200. UC deducts tax on earnings (reg 55(5)), so the test compares with the tax before the charge. - check_routes in the CTR Pension Credit properties: MAIN_DEDUCTIONS now uses the tax before the charge, as the CTR means test does. Both counterexamples are pinned as plain tests that also assert the charge is levied. Also: - the inert income_tax: 0 inputs in two means-test YAML files now set the variable the means tests read; - the property-allowance YAML case is labelled a known gap: the law's partial relief would bring total income under £35,000; - s.681J links to ITEPA, not FA 2026; - the changelog no longer says the household test "charged" anyone; - the HB property's reason for excluding the WFP fits its 2026 year. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
#2047 merged into #2047's |
…harge # Conflicts: # policyengine_uk/variables/gov/dwp/is_benefit_cap_exempt_health_disability.py
…harge Conflict in is_benefit_cap_exempt_earnings.py: take main's uc_individual_earned_income_before_mif, which deducts each person's own uc_income_tax_on_earnings and so never reads income_tax or the charge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e property election Review r5 and CI on adcf821: - The charge tested total_income, which leaves out the statutory sick and maternity pay the model taxes as employment income. Total income is the income charged to tax (ITA 2007 s.23 Step 1), so they now count (test_uc_statutory_pay_properties invariant 2 failed on CI). - uses_property_allowance compared tax before the charge. A route can change Pension Credit and so the s.681I(4) exemption; it now compares income_tax, as main did (r5 P2, the m6 mutant was not equivalent). - test_trading_loss_properties: the means tests deduct tax before the charge, so the properties hold that; relief versus income cut compares it too, since relief comes after total income (Step 2). - test_variable_code_sharing reads a variable with a formula; income_tax now only adds. - YAML: statutory sick pay in total income, trade loss relief after total income, and the election that avoids the charge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main now has the PAWHP household-income lines (#2047) and UC and benefit cap earnings tests that deduct each person's own tax on earnings, so the fragments no longer claim them. The property election compares income_tax, which includes the charge, since 1024887. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The election has counted the charge since 1024887, so the case is about total income being taken before the property allowance, not about the election ignoring the charge. Expected values are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… the trade loss property - test_rule_comparison (new on main) replaces income_tax's formula, but income_tax now only adds the pre-charge liability and the charge, so it has none (CI: StopIteration). It now replaces the pre-charge formula. - The zero-profit trade loss property held only tax before the charge, since 1024887. It now also checks the charge: it moves only in a household where the loss changes who is on a relevant benefit, as when lower tax ends Pension Credit and with it the exemption (s.681I(4)). A pinned pensioner exercises that case: on Pension Credit (£217.48) and not charged without the loss; off it and charged £200 with it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The winter fuel payment charge tests total income (ITEPA 2003 s.681I(1)(b)), which is ITA 2007 s.23 Step 1: the income charged to tax, after employment expenses, capital allowances, the trading and property allowances and exempt ISA interest, and before the Step 2 reliefs. The charge read total_income, which sums gross income. Add total_income_charged_to_tax, the Step 1 figure adjusted_total_income already worked out for the s.24A cap (the taxable components with losses brought forward added back), and have both read it. Tests that set the charge's income now set the new variable; six YAML cases pin each deduction, and the property allowance case that pinned the old gap now follows the law. r6 P1: test_income_tax_falls_with_the_loss_by_at_most_the_relief compared income_tax, which the charge can raise when the relief ends a Pension Credit award. Compare tax before the charge, check that the charge moves only with benefit receipt or total income, and pin r6's counterexample. Invariants 3 and 9 say so. Nits: the code-sharing helper's name, the deprecated limit's reference, the changed.md wording, and a pinned pensioner charged on both sides of the zero-profit test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ousehold Review r7 found two ways the property allowance election could choose the route with the higher income tax once the winter fuel payment charge is in it: - Without finance costs at stake, the allowance was taken whenever it lowered taxable property income. Lower tax before the charge can raise the income Pension Credit counts, end the award and with it the s.681I(4) exemption, and the charge can exceed the saving. While the charge has effect, these landlords now compare both routes too; ties keep the allowance, so anyone the charge does not reach gets the answer the shortcut gave. - Landlords decided one per benefit unit, so landlords in separate benefit units of one household switched together. A couple's Pension Credit decides whether the partner is entitled to a payment, which moves another benefit unit's shared payment and charge. Landlords now decide one per household. Pins both counterexamples in YAML and adds a Hypothesis property: no landlord in a pensioner household lowers their own income tax, charge included, by switching route alone. The couples property now covers every landlord the allowance would help. Also qualifies the trading loss invariants (they hold tax before the charge) and total_income_charged_to_tax's description. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflict: test_trading_loss_properties.py docstring. Kept main's invariant 1 wording (pre-pension net_income, #2440) and this branch's invariants 2 and 3 (tax before the charge). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d limit Review r8: the opening claim that every election lowers tax holds only with finance costs to relieve; without them the allowance is the default and ties keep it. The household loop stops after MAX_ROUNDS even if routes are still changing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FA 2004 s.193(2) deducts contributions under a net pay arrangement from employment income, so total income (ITA 2007 s.23 Step 1), which the winter fuel payment charge tests, is after them. The model holds employment income gross of pension contributions, takes employee contributions as net pay and gives their relief through allowances, so total_income_charged_to_tax overstated a working pensioner's total income by their relieved employee contributions. New net_pay_pension_relief: the relieved employee contributions, up to taxable employment income. adjusted_total_income now deducts at Steps 3 and 4 only the relieved contributions not already out of total income (s.24A(8)), so its values are unchanged. Relief at source (s.192) still leaves total income alone. Tests: four YAML cases worked from the law, and a Hypothesis property (net pay relief, total income, adjusted total income, the charge, and relief at source leaving total income alone); two mutants each fail it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…at source Review r9 found the net pay deduction capped at pension_contributions_relief, whose relevant UK earnings leave out statutory sick and maternity pay. A pensioner with £1,000 of wages, £3,000 of SSP, a £32,500 pension and £2,000 of employee contributions had £1,000 deducted and a £200 charge, where the law deducts the whole £2,000 (FA 2004 ss.189(2)(a), 190(1), 193(2); HMRC PTM044100) and charges nothing. Personal contributions also moved the deduction, through the basic-amount rise that s.191(7) keeps for relief at source. The deduction is now the employee contributions up to taxable employment income, none from age 75. Relevant UK earnings include all of that income, so the s.190 limit never binds below it. It no longer reads relief at source. Two YAML cases pin the SSP case with and without personal contributions; the net pay property test now draws statutory sick and maternity pay. ATI's comment and the changelog qualify "unchanged" for float32 rounding. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…del's relief Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ATI comment's "never exceed" holds for contributions of zero or more; the add-back cancels either way. Relieving employee contributions first is the model's order, not one the Act states. The fixed fragment now says the payment reaches everyone of pensionable age who meets its other conditions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Back to draft: review r11 approved the head
|
Fixes #1760
Reproducer:
policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/charges/winter_fuel_payment_charge.yaml::2025 total income of exactly £35,000 is not chargedReproducer: policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/charges/winter_fuel_payment_charge.yaml::2025 Northern Ireland pays everyone of pensionable age
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.
This was stacked on #2038, which has merged. The branch has since merged
mainat7ad002f54, and this PR targetsmain.The law
What was wrong
On
maina household test stands in for the charge: a person not on a relevant benefit is paid only if some member of pensionable age in the household has 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 £270.9m of charge (the 2026-10-17 run, being re-run: see the impact section).Three consequences of putting it in income tax:
The means tests deduct income tax before the charge. Pension Credit income, Income Support applicable income, Housing Benefit applicable income and net earnings, and Council Tax Reduction applicable income deducted
income_tax. They now deductincome_tax_before_winter_fuel_payment_charge. The charge depends on Pension Credit and Universal Credit receipt, so deducting it from Pension Credit income makes the model circular: withpension_credit_incomedeductingincome_tax, the core raisesCycleErroronincome_tax@2025. It also is not tax on the income those tests assess: it is the payment, recovered. Universal Credit earned income (Deduct only each person's own tax and NI on earnings from UC earned income #1949) and the benefit cap's earnings test (uc_individual_earned_income_before_mif) already deduct each person's ownuc_income_tax_on_earnings, worked from the rates, which leaves out charges. The Enhanced FRS run confirms no means-tested award moves (see below).The property allowance election counts the charge.
uses_property_allowancecompares each route'sincome_tax, as onmain, which now includes the charge. A route can change total income, because the allowance is deducted in working out property profits, and it can change the tax deducted from Pension Credit income, and so Pension Credit and the s.681I(4) exemption. Two YAML cases cover this. In "a landlord's property allowance election can keep total income under £35,000", partial relief brings total income from £35,300 to £34,500, so the pensioner pays £4,386 rather than £4,246 plus the £200 charge. In "a landlord's property allowance election counts the charge", total income is over £35,000 either way, and £4,490 of tax with the allowance gets the pensioner Pension Credit and no charge, against £4,350 and the charge with expenses. The cost is that each route's branch also works out the person's relevant-benefit receipt.Two parts of the election on
mainassumed that lower taxable property income means lower tax, which the charge breaks. While the charge has effect, both now compare routes:mainthey take the allowance whenever it lowers taxable property income, with no comparison. The allowance's lower tax can raise the income Pension Credit counts, end the award and with it the exemption, and the charge can be more than the saving. In "a landlord without finance costs keeps expenses when the allowance would end Pension Credit", the allowance would save £160 of tax but end £80 of Pension Credit and bring in the £200 charge (£5,227.40 against £5,187.40). While the charge has effect these landlords compare both routes too. Ties keep the allowance, so anyone the charge does not reach gets the same route as before.mainlandlords in separate benefit units of one household switch together, so one landlord's switch was counted in the other's comparison. In "landlords in two benefit units of one household each elect with the other's route fixed", the lodger elects partial relief and pays £6,186 rather than £6,211.PAWHP has to count as household income. Count the Pension Age Winter Heating Payment in household and HBAI income #2047 (merged) put
pawhpinhousehold_benefits,hbai_household_net_incomeandhbai_benefits. Without that, the charge on PAWHP would lower a Scottish household's income with no payment to set it against.Who is "entitled to a relevant benefit"
The charge reads the model's
is_on_income_support,is_on_income_based_jsa,is_on_pension_credit,is_on_income_related_esaandis_on_universal_credit. Since #2027 and #2038 these name the person entitled:So the partner of an Income Support claimant, paid a Winter Fuel Payment of their own because the claimant is under pensionable age, is charged if their own total income exceeds £35,000. A YAML case covers this. The Hypothesis reference exempts only the person a relevant benefit is paid to, not the whole couple.
Changes
winter_fuel_payment_charge(person): the person'swinter_fuel_paymentpluspension_age_winter_heating_payment, when their own total income exceeds the threshold and they are on none of the s.681I(5) benefits.total_income_charged_to_tax(person, new): total income as s.23 Step 1 defines it. It is the model's taxable income components (net_income_before_trade_loss_relief), less the employee pension contributions relieved under a net pay arrangement, with losses brought forward (loss_relief, which the model deducts from trading profits) added back.adjusted_total_income, the base of the s.24A cap, already worked this out for its own Step 1; it now reads the new variable instead, and at Steps 3 and 4 deducts only the relieved contributions not already out of total income (s.24A(8)), so its values do not change, up to float32 rounding (review r9 measured 6p on an adjusted total income of about £905,000).net_pay_pension_relief(person, new): the employee contributions, up to taxable employment income, and none from age 75 (s.188(3)(a)). The model holdsemployment_incomegross of pension contributions, takes employee contributions as paid under a net pay arrangement and gives their relief throughallowances, after total income. FA 2004 s.193(2) deducts them from employment income, so without this a working pensioner's total income would include them. The s.190 limit for relief is relevant UK earnings, which include all employment income chargeable to tax, statutory sick and maternity pay among it (s.189(2)(a); HMRC PTM044100), so it never holds the deduction below taxable employment income. Within the limit, the model relieves employee contributions before personal ones, so contributions relieved at source never change the deduction.total_income, which sums gross income and which other parts of the model read, is unchanged.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 who meets its other conditions.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.income_tax_before_winter_fuel_payment_charge(listed above).uses_property_allowancekeeps comparingincome_tax; its docstring now says that includes the charge.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, 39 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, the partner of an Income Support claimant (paid and charged), Northern Ireland, PAWHP at the 2025 and 2026 amounts, no charge in 2024, the charge insideincome_tax, PAWHP as household income, Council Tax Reduction income before the charge, what total income is (after employment expenses, capital allowances, the trading allowance and net pay pension contributions, up to taxable employment income and none from age 75, but not after contributions relieved at source; statutory sick pay as relevant UK earnings for the net pay deduction, with and without contributions relieved at source; without ISA interest; with statutory sick pay; and before trade loss relief and losses brought forward), and four landlords' property allowance elections: one that keeps total income under £35,000, one that gets Pension Credit, one without finance costs that keeps expenses to keep Pension Credit, and two landlords in separate benefit units of one household.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 pays everyone from 2025 and computes each person's charge from s.681I, exempting only the person a relevant benefit is paid to. 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 further 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.main: eight mutants that each point one reader atincome_taxor droppawhpfrom HBAI. Seven are killed by the YAML suites, the Hypothesis properties or aCycleError. The Council Tax Reduction one was killed once a YAML case was added. The eighth, the property allowance election comparingincome_tax, is now the rule: review r5 found the case above, where comparing tax before the charge picks the route with the higher final tax.main: ten mutants, each breaking one rule (charged at exactly £35,000; household income; a household member's benefit exempting; PAWHP not charged; charged before 2025; entitlement tested after the charge; no exemption; charge left out ofincome_tax; Winter Fuel Payment still requiring a benefit; tax credits exempting). All ten fail at least one case.income_taxto drive a means test (Housing Benefit applicable income and net earnings, the Income Support family definitions, Pension Credit income). They now enterincome_tax_before_winter_fuel_payment_charge, with the same expected values. A Housing Benefit net earnings case checks that the charge does not come off a charged pensioner's earnings (8,628.50, whereincome_taxwould give 8,578.50).tests/test_property_income_properties.py): a new property covers pensioner households: a couple, with five children or a sixth child in place of the partner, claiming Pension Credit, plus a lodger who may claim it, in England, Wales and Scotland in 2025. No landlord lowers their ownincome_taxby switching route alone. It pins both review r7 households. The couples property now covers every landlord the allowance would help, not only those with finance costs at stake. Two mutants each fail it: the old shortcut for landlords without finance costs, and electing per benefit unit.tests/test_total_income_net_pay_properties.py): over single pensioners in England with pay, statutory sick and maternity pay, employment expenses, a private pension and both kinds of contribution, the model's net pay relief, total income, adjusted total income and charge match a reference worked from FA 2004 ss.188, 192 and 193 and ITA 2007 s.24A(8), and removing contributions relieved at source changes neither total income nor the charge. Three mutants each fail it: total income not after net pay contributions (which also fails two YAML cases), adjusted total income deducting them twice, and review r9's case, the deduction capped atpension_contributions_relief(which also fails the statutory sick pay YAML case).income_taxnow only adds, sotest_variable_code_sharingandtest_rule_comparisonuseincome_tax_before_winter_fuel_payment_charge.total_income_charged_to_tax(the charge YAML, the reform tests, two relevant-benefit cases and the Hypothesis file). Four cases of the deprecated household test, which readstotal_income, enter a private pension instead, which feeds both.d73e73b99(the head's code, before two comment edits), the charge YAML (39 passed) and the net pay property (passed). The wider targeted suites are held by the same host reservation; CI runs every suite on the head.d0920a9cd.Impact: Enhanced FRS
Being re-run against
mainat7ad002f54(the commit merged in) and this branch atd0920a9cd, after the statutory pay fix. A host reservation is holding local impact runs, so the figures below are still the 2026-10-17 run, and they will be replaced before merge.Real runs of the microsimulation on a private copy of the Enhanced FRS 2024-25 (sha256
e433e532b17b), 2024 to 2030: basemainat88a524802against this branch at5c1dbebfa. Nothing is scaled or estimated. £m a year:2025 by country (£m; people charged; households gaining or losing):
household_benefitsandhbai_benefitsrise by the gross payments andhousehold_taxby the charge, sogov_balanceimproves by £74.7m. Northern Ireland households gain £24.4m, because pensioners there not on a relevant benefit were paid nothing onmain.5c1dbebfaagainst95ae26c0b, same base): the 2025 charge falls from £271.1m on 1,703k people to £270.9m on 1,701k. Against the run of 2026-10-16 (basee7610ac52, branch26ff32421),95ae26c0bgives the same figures: the 89 commits ofmainmerged in since move nothing here.Limits
pension_contributions_relief) leaves statutory pay out of relevant UK earnings (Pension contribution relief is capped at wages and profit and leaves out statutory pay #2371; Include SSP and SMP in pension-relief earnings #2464 fixes it). So where statutory pay is part of someone's earnings, income tax can relieve less than total income is after. The charge follows the law here.adjusted_total_income.taxable_miscellaneous_income), so a loss on one miscellaneous transaction netted into it also lowers total income, although relief for it belongs at Step 2 (ITA 2007 s.152). Review r10's case: a £6,000 profit and a £2,000 loss on separate transactions, with £30,000 of pension, are £36,000 of total income in law (charged), but £34,000 in the model (not charged).gov.contrib.policyengine.disable_simulated_benefits, household income takes the reported winter payment (winter_fuel_allowance, orpawhpin Scotland while PAWHP is paid), while the charge stays on each person's simulated payment.Axiom
axiom: TheAxiomFoundation/rulespec-uk#420 queued
The legal id is
uk/statute/ukpga/2003/1/681I. s.681I is not in the corpus and no rulespec-uk module encodes it. The issue carries (comment) the module path, the verbatim law, the required outputs, areview_findingand companion tests from the same ground truth as the YAML here. The encoder blocker is recorded in this comment: the signed encoder runs from a corpus citation, anduk/statute/ukpga/2003/1/681Ihas not been ingested (axiom-corpus2137e79be).Notes for merging
adjusted_total_income.pytoo. Whichever merges second keeps both: this PR's Step 1 fromtotal_income_charged_to_taxand its net pay add-back, and Restrict the ordinary ATI pension uplift to relief at source #2488'srelief_limit. With contributions of zero or more, the net pay deduction stays within Restrict the ordinary ATI pension uplift to relief at source #2488's relieved contributions, because taxable employment income is part of relevant earnings. The reference intests/test_total_income_net_pay_properties.py(itsmax(3_600.0, taxable_pay)and invariant 3) has to take Restrict the ordinary ATI pension uplift to relief at source #2488's limit too.pension_contributions_relief, Pension contribution relief is capped at wages and profit and leaves out statutory pay #2371) closes the gap in "Limits". Once it merges, the sentence on Pension contribution relief is capped at wages and profit and leaves out statutory pay #2371 innet_pay_pension_relief's documentation should go.Review
Held (2026-10-18): the property allowance comparison added in
26ff32421makes CI's Python shards run out of memory; see this comment. A decision on keeping it or restoringmain's shortcut for landlords without finance costs is pending.Review r8 approved
26ff32421, and review r9 requested the statutory pay fix on5c1dbebfa. Review r10 (GPT-6.1 Sol) approveded0b799eawith body fixes, now made;d0920a9cdqualifies two comments and the fixed changelog fragment after it; review r11 (GPT-6.1 Sol) approvedd0920a9cd, with one body fix, now made.🤖 Generated with Claude Code