Repository navigation
Conversation
tax_band compared a Scottish taxpayer's total taxable income, savings and dividends included, with the Scottish limits. The Scottish rates charge only income that is neither savings nor dividend income (ITA 2007 s. 11A), and savings and dividends take the rest-of-UK bands (ss. 11D(6), 13(5)). The band is now the higher of the Scottish band of non-savings income and, where any taxable income is savings or dividends, the rest-of-UK band of all taxable income. Income at a limit stays in the lower band. The same formula now runs from 2017-18: before, 2017-18 used the rest-of-UK limits for Scottish taxpayers and 2018-19 read the five-rate Scottish schedule as the three-rate one. Other taxpayers are unchanged. Fixes #2350 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cases with hand-worked arithmetic for the issue's Scottish incomes with dividends and with savings, both limits at once, one pound above the basic rate limit, Gift Aid, allowances beyond pay, starter-rate pay, 2017-18 and 2018-19, with rest-of-UK controls. Eleven fail on main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
For Scottish taxpayers the tests raise one band's rates at a time and check that a person in a band pays tax at that band's rates and at no higher band's, that the Marriage Allowance conditions match, and that against the formula before #2350 the band rises only from starter to basic. They also show savings_allowance does not read tax_band. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tenth snapshot row is a Scottish taxpayer with no pay and 10,000 of property income, 20,000 of savings and 10,000 of dividends. The allowance takes all the property income, so nothing is charged at a Scottish rate (ITA 2007 s. 11A), and the 27,430 of savings and dividends left sit below the basic rate limit (ss. 11D(6) and 13(5)). The band is basic. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
meets_marriage_allowance_income_conditions stops reading tax_band. It ports liable_only_at_marriage_allowance_rates from #1963 and computes it from income before the Marriage Allowance, since this head still takes the allowance off earned_taxable_income: non-savings income up to the start of the Scottish higher rate or the basic rate limit, savings above the limit only where the savings nil rate and the starting rate for savings cover them, and dividends counted without the dividend allowance (s. 55B(2)(ba)). The CPS expanded reform reads the same helper, and the eligible_bands parameter, which nothing else read, goes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model's Scottish scale carries its 2017-18 values back to 2015-16 and 2016-17, so the rate test's empty-scale branch never ran and it read the 31,500 Scottish higher-rate start for those years. In 2016-17 s. 11A(1) charged the Scottish basic rate on income that would otherwise bear the basic rate, and 2015-16 had no Scottish rate, so the test now uses the basic rate limit before 2017-18. The property test leaves Scottish taxpayers out before 2017-18, where the model's liability uses the carried-back scale, and Ruff formats its limits table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
property_income is profit, and with no receipts given the model applies no property allowance to a profit above 1,000, so the two cases now give 31,092 and 31,093 of profit directly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Scenario's parameter_changes takes numbers only, so a list of bands failed validation before the removal check. The test now passes the saved list through Reform.from_dict and Scenario.from_reform, which check the path first, and checks the alias stays in the parameter tree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FA 2014 Sch. 38 para. 12 gives s. 11A effect from the year the Treasury appointed under s. 25(5) of the Scotland Act 2012, and SI 2015/2000 art. 3 appoints 2016-17. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Under a starting rate limit raised to 40,000, the model charges 37,700 of 38,000 of interest at the starting rate for savings and the rest at the savings nil rate, both of which s. 55B(2)(b) allows. Baseline limits never separate the starting rate from the savings nil rate in this test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s income Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comments only: the Treasury adds the Scottish basic rate, a reform raises the starting rate limit, and the model reads its 2017-18 Scottish scale in earlier years. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Section 13(2) charges the dividend upper rate on dividends that would otherwise bear the higher rate, which s. 10(3) starts at the basic rate limit. The model's dividend scale holds 37,500 in 2015-16, against a 32,000 basic rate limit, so the test read it there and admitted dividends the statute charges at the upper rate. The property ties the dividend scale to a reformed basic rate limit instead of drawing it on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
FA 2016 s. 4 inserted the savings nil rate (ss. 12A and 12B) and added it to s. 55B(2)(b), with effect for 2016-17 and later years (s. 4(17)). The model's Personal Savings Allowance amounts start in 2005, so the test counted a nil rate in 2015-16 that the law didn't have. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…test Section 12(1) charges the starting rate for savings only on savings that would otherwise bear a basic rate, so it never reaches past the basic rate limit. Section 12A(1) to (4) charges the savings nil rate on the lowest savings above the starting rate limit, up to the savings allowance. The test now fails a person when any savings above the basic rate limit lie outside that slice, instead of starting the slice where the starting rate ends. Under a starting rate limit of 40,000, 12,570 of pay and 38,000 of interest leave 300 above the basic rate limit at the savings higher rate, so that case now fails the conditions. A new case under a 37,500 limit meets them: s. 12 charges 37,500 at the starting rate and s. 12A the 500 above it at the savings nil rate. The property keeps a reformed starting rate limit at or below the basic rate limit, where the model's savings liability places the nil rate as s. 12A does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rate test's notes now say which rates s. 55B(2)(b) permits each year and where the test follows the statute against the model's liability. tax_band, savings_allowance, non_savings_income_after_allowances and the CPS reform's conditions variable describe what each now does, and the Scottish rates cases name the band each reaches. The changelog fragment names the income conditions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comments and one case name only: the 2015-16 cases say which rates s. 55B(2)(b) permits, and the property's Marriage Allowance section names its nil-rate amounts and reforms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Documentation only: the rate test's docstring and non_savings_income_after_allowances name s. 414(2)(b) as what raises the rate limits, and the docstring drops a passive phrase. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…llocation With pay of 50,070 the least-tax allocation of the personal allowance (ITA 2007 s. 25(2)) can move a pound of allowance onto the savings and take the last pound of interest into the savings nil rate. Pay at the basic rate limit leaves no allocation that lowers the tax, so the case gives 40p of savings tax and fails the conditions either way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GDsfRzbSb9XEm12wG
Rewrite the rate-test, tax_band and test notes so that the body that makes each rule acts, with the section in brackets, and keep statutory quotations as they are. Rename the two pre-2017-18 Scottish cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GDsfRzbSb9XEm12wG
The tax_band docstring names each Scottish rate resolution as the source of "on income above" one limit "and up to" the next, and the Scottish rates YAML comment cites ITA 2007 s. 11A(1A), (4) and (5) and s. 13, since s. 11A itself excludes only savings income. Text only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review (review). We moved the branch to
The transferor side, the election, and #1947's rounding and double count stay with #1963. The known limits now link #2865 (the 2015-16 parameters), #2866 (Scottish taxpayers before 2017-18) and #2867 (the savings nil-rate slice under a raised starting rate limit). We queued the reduction's encoding as TheAxiomFoundation/rulespec-uk#536, beside #523. |
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed 89f2f9f34d3a39ea5909e1f8e3b8feed8047392e. COMPLETE — original C1 resolved; one required completion fix remains.
The Step6 reduction fixes the Scottish cash error. The £1,260 allowance now gives £252 relief, with the original dividend/savings cases producing tax £5,724.57/£6,130.82 and household net-income gains of £252. The remaining-liability cap also works: £86 of tax remaining permits £86 relief. The operative statutory treatment and appropriate-percentage history were independently checked.
C2 — Record the encoder blocker in actual queued issue #536. .github/CONTRIBUTING.md:61 requires: “Use queued only when the signed encoder is blocked; record the blocker in the issue.” The filed issue has the law, modules, outputs and companion cases, but neither its body nor comments state the blocker. #523 records one, but #536 does not incorporate it. Add the applicable blocker to #536, or explicitly incorporate the precise shared blocker. This requires completing the queued record; it does not require running the encoder or requesting another approval. No new tax-payment defect was found.
A1 — Update the adjacent Pension Credit test expectations. The exact-head YAML job has two failures in pension_credit_earnings_disregard.yaml: expected tax £3,016.62/£2,805.73, actual £3,029.22/£2,810.82. The old expectations reflect the removed income-exclusion method; the new figures follow the £252 Step6 reduction. Update these source-backed expectations and check the downstream disregard/Pension Credit assertions, which the failed tax assertion prevented the job from reaching. This is not a new claim of incorrect tax paid.
Validation: 139 local tests and six native final-income cases passed, with exact snapshot pins verified; independent source review checked 33 originals/extracts. Hosted YAML separately recorded 5,550 passes and those two failures. Its log was inspected without another local test run. Hosted CI readiness is unmet.
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed the updated source record at unchanged head 89f2f9f34d3a39ea5909e1f8e3b8feed8047392e. COMPLETE — C1 and C2 resolved; A1 remains open. No material source gaps.
The actual #536 Blocker section now records the approval, signing and corpus prerequisites, satisfying C2. Its substantive law, outputs and companion cases remain supported. The original tax correction and retained139 passing tests/six native cases remain valid; no code tests were repeated.
A1 still needs fixing: the unchanged Pension Credit YAML still expects tax £3,016.62/£2,805.73, while the corrected formula produces £3,029.22/£2,810.82. Update those expectations and check the downstream disregard/Pension Credit assertions. Exact-head hosted YAML/Result checks still fail, so approval remains withheld.
|
Picking this up for the UK hub. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GW4VyFJ2Wtu8apY8j
…ance reduction Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GW4VyFJ2Wtu8apY8j
|
Generated by Claude Code |
|
Ready for hub review Head: Before starting: #2828's branch last moved at 2026-11-03 21:41 UTC (about 15 hours earlier) and no comment said anyone was mid-change, so I posted the pickup comment. A1
The hub's arithmetic holds. The earnings do not cross into the intermediate band: taxable income without them (15,430) already exceeds 14,921, so all 1,040 bear 21%. The old comment's crossing came from the old deduction, which cut taxable income to 14,170 without pay; the new comment says so. No hand value differs from the model. Task 2The whole Tests at the head (clean runs)
Revert checkOn a scratch worktree of the head, with Judgment calls
SkippedNothing needing survey data ran. I didn't run the HMRC directory separately (the whole tree covers it) or the full pytest suite.
|
The taxable income exceeds 14,921 even without the earnings, so all 1,040 of them bear 21%. The claimant pays no Class 1 contributions above State Pension age, and the 20 pound disregard covers all 821.60 of net earnings. No expected value changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the re-review. For A1, the two Scottish couple cases in
The case comments now set out these steps. At |
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed adopted head e511964cb5d3408713bf16910857c0ad00b595b7. COMPLETE — A1 resolved; C1 and C2 remain resolved; no open findings or material evidence gaps.
Both Scottish Pension Credit cases now use the statutory Step 6 reduction: tax £3,029.22 with pay and £2,810.82 without; the £218.40 tax increment leaves £821.60 net earnings, fully disregarded. Pension Credit income is £25,189.18 in both cases. Independent statutory arithmetic and current execution agree.
All 61 selected repository checks passed, including all 34 cases in the changed Pension Credit YAML. Final household checks also confirm unchanged calculated Pension Credit/CTR with wages and an £821.60 household-income increase, on the stated reported-AA and take-up assumptions. A reviewer input-name error stopped the first external PC diagnostic before calculation; only that diagnostic was corrected and rerun successfully. The original log is retained; repository tests were not repeated.
The current source records and earlier qualifications remain intact. Approval awaits the remaining exact-head CI; the completed review can be retained for that CI-only follow-up.
juaristi22
left a comment
There was a problem hiding this comment.
Approved current head e511964cb5d3408713bf16910857c0ad00b595b7. COMPLETE — C1, C2 and A1 remain resolved; no findings or material evidence gaps. Applicable current-head checks have passed.
The completed review of the Scottish Marriage Allowance tax reduction and Pension Credit earnings-disregard regression is retained. The 61 passing repository checks, successful final tax/Pension Credit/CTR/household-income checks and 36 original/source-extract pairs were integrity-checked at this identical head. No tests or calculations were repeated for this CI-only approval; the original reviewer-fixture correction and historical results remain separately qualified in the full report.
The actual Axiom #523 and #536 records and their declared encoding blockers remain unchanged.
…s new tests Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Incremental review at ffa8651ff178289a0935ba9349c3b0d87c4e2433: COMPLETE, no remaining findings or material evidence gaps. Prior C1, C2 and A1 remain resolved.
The previously approved Scottish tax-band and Marriage Allowance core logic is unchanged. This round checked the changed earnings/unearned-tax attribution through Welsh working-age Council Tax Reduction against the paid-tax disregard rule and the relevant Axiom source packets.
56 current repository tests passed (49 YAML and 7 Python), plus one actual-input Welsh couple control through final income tax, Council Tax Reduction and household net income: the £252 tax reduction lowers CTR by £50.40, giving a £201.60 net-income gain. The earlier 61 passes remain separate historical evidence. All 38 retained/new source originals and their extracts passed integrity checks. Reviewer-only harness setup/assertion errors were corrected against the saved outputs and are documented separately from repository test outcomes.
Fresh approval is deferred while current-head CI is pending. This completed code/source review can be retained while CI is checked on a later run.
|
All checks pass at |
juaristi22
left a comment
There was a problem hiding this comment.
Approved at ffa8651ff178289a0935ba9349c3b0d87c4e2433. The completed independent review has no remaining findings or material evidence gaps; C1, C2 and A1 remain resolved. All 21 latest checks now pass at this exact head, including the required Lint and Test / Result checks.
This closes the pending-CI approval hold. The reviewed code and description are unchanged, all 38 retained source pairs were integrity-checked, and the author's approval request adds no new scope. No code review, tests or model calculations were repeated.
Fixes #2350
Reproducer:
policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/allowances/marriage_allowance_tax_reduction.yaml::A Scottish intermediate-rate recipient with dividends gets 20% of the transferable amount;policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/allowances/meets_marriage_allowance_income_conditions.yaml::Under a raised Scottish higher rate, nil-rate savings meet the conditions;policyengine_uk/tests/test_tax_band_scottish_properties.py::test_marriage_allowance_follows_the_liability_with_nil_ratesaxiom: TheAxiomFoundation/rulespec-uk#523 queued, with TheAxiomFoundation/rulespec-uk#536 queued for the s. 55B(1) and (3) reduction at Step 6
What and why
tax_bandcompared a Scottish taxpayer's total taxable income, savings and dividends included, with the Scottish limits. Parliament applies Scottish rates to income other than savings and dividends under ITA 2007 ss. 11A and 13. The Scottish Parliament's 2025-26 resolution (S6M-16531) calls this "non-savings and non-dividend income". Parliament puts savings and dividends at the top of income (s. 16) and charges them at the rates they would bear outside Scotland (ss. 11D(6) and 13(5)). The model already calculated non-savings, savings and dividend liabilities separately.For a Scottish taxpayer,
tax_bandnow takes the higher of two bands:non_savings_income_after_allowances, their income other than savings and dividends after allowances, which go to it first, as inearned_income_tax;net_income - allowances), since Parliament puts savings and dividends at its top (s. 16).The model keeps income up to a limit in the lower band. Parliament charges income "up to" a limit at the lower rate (s. 10(2) to (3A)), and the Scottish Parliament charges each Scottish rate "on income above" one limit "and up to" the next. As before, the model raises the Scottish limits from the basic rate's upper limit, and the basic and higher rate limits, by the grossed-up Gift Aid gift, as Parliament requires (s. 414(2)(b)). The model retains nil-rate savings and dividends in their underlying bands. Parliament sets separate rate conditions for the Marriage Allowance (s. 55B).
Marriage Allowance rate conditions
meets_marriage_allowance_income_conditionsno longer readstax_band. It callsliable_only_at_marriage_allowance_rates, which applies s. 55B(2)(b) and (ba) to the person's income. A person fails it when any of these holds:Under s. 414(2)(b), the model raises each limit by the grossed-up gift. Parliament and the Treasury set the permitted rates year by year:
The model's Scottish rate schedule starts in April 2017, and the model reads its first values in earlier years too, so the test sets a Scottish taxpayer's limit by the year, not from that schedule. The test also departs from three historical or reformed parameters that the liability reads. It starts the dividend upper rate at the basic rate limit, where the model's 2015-16 dividend scale starts it at £37,500. It counts no savings nil rate in 2015-16, where the model's Personal Savings Allowance starts in 2005. And it places the savings nil rate above the starting rate limit, where the liability starts it after the income charged at the starting rate. The two agree unless a reform raises that limit above the basic rate limit or changes the starting rate's phase-out, which the test no longer reads.
Parliament charges tax at each rate at Step 4 and takes tax reductions off at Step 6 (s. 23), and it gives the Marriage Allowance as a tax reduction at Step 6 (ss. 55A(2) and 55B(1)). So the allowance never changes the income each rate applies to, and the test never reads it. The test takes
non_savings_income_after_allowances,taxable_savings_interest_income,received_allowances_savings_income,savings_allowance(from 2016-17), the starting rate limit for savings,taxable_dividend_income,received_allowances_dividend_incomeandgift_aid_grossed_up.The direct test admits people at a permitted rate limit and people whose savings bear permitted nil rates:
tax_bandoutside Scotland still calls itHIGHER;Dividends the dividend allowance covers still fail when, without it, they would bear the dividend upper rate.
tax_bandstays the same for everyone outside Scotland, but the Marriage Allowance conditions move there too. We ran a grid of 4,816 single adults (3,596 of them outside Scotland) onorigin/mainand on this branch for each year from 2015-16 to 2028-29. Outside Scotland 91 person-years move, all to meeting the conditions:In Scotland 841 person-years move: 833 to meeting the conditions, and 8 in 2017-18 to failing them. Every adult's
income_taxandsavings_allowance, and every band outside Scotland, matchorigin/main; Scottish bands change in 3,339 person-years. These synthetic households give no population estimate, and the years after 2026-27 use the model's projections.The
create_expanded_ma_reformCPS reform calls the same helper. It keeps its rule: people meet its conditions when they meet the statutory ones or the reform's expansion conditions. We ran 400 generated married couples, 187 of them with a child, in 2017-18, 2018-19, 2021-22, 2025-26 and 2026-27. The rule holds for every person-year, under this branch's direct test and under conditions read off this branch'stax_band. The statutory conditions move for 21 person-years, the reform's for 20, and the reform's conditions and allowance move for no one whose statutory conditions stay the same.This PR deletes
gov.hmrc.income_tax.allowances.marriage_allowance.eligible_bands, which nothing else read. A reform or saved policy that names it now fails with directions to the rate limits (REMOVED_PARAMETERS).Marriage Allowance tax reduction
The model used to take the Marriage Allowance off
earned_taxable_income(gov.hmrc.income_tax.earned_taxable_income_exclusions). That saved the recipient tax at the rate on their top £1,260 of income other than savings and dividends, and it lowered the base under their savings and dividends. Parliament gives the recipient "a tax reduction for a tax year of the appropriate percentage of the transferable amount" (ITA 2007 s. 55B(1)) at Step 6 (s. 55A(2)). The appropriate percentage is "the basic rate or default basic rate or, in the case of a Scottish taxpayer or Welsh taxpayer, the Scottish basic rate or Welsh basic rate" (s. 55B(3)). The Scottish Parliament set the Scottish basic rate at 20% for 2025-26 (S6M-16531). A reduction comes off "only so far as there is sufficient tax calculated at Step 5", counting "tax reductions already deducted at Step 6" (s. 29(2) and (3)).This PR gives every recipient that reduction:
gov.hmrc.income_tax.earned_taxable_income_exclusionsno longer listsmarriage_allowance, so the allowance no longer changesearned_taxable_income,non_savings_taxable_income, the savings rate bands or the dividend base.marriage_allowance_appropriate_percentage(new) gives the basic rate, or for a Scottish taxpayer from 2016-17 the Scottish basic rate. It reads the Scottish scale's basic rate band itself (brackets[1]), the waypension_credit_self_employment_deductionsreads it. The model has no Welsh rates, so a Welsh taxpayer takes the basic rate.marriage_allowance_tax_reduction(new) gives the appropriate percentage timesmarriage_allowanceand limits it to the Step 5 tax that the reductions listed before it leave (earlier_tax_reductions).gov.hmrc.income_tax.step_6_tax_reductionslists it last. Section 27(5) does not list Chapter 3A, so s. 27(2) sets its place: "the order which will result in the greatest reduction". Each listed reduction has an amount fixed before Step 6, so every order deducts the same total; listing this one last leaves the other reductions' amounts as they were.marriage_allowancekeeps the amount the model books today: the transferor's unused personal allowance, up to 10% of the personal allowance, rounded up to £10.This fixes items 2 and 3 of #1947 for the recipient: a recipient taxed mostly on dividends or savings now gets the reduction in full, and a Scottish recipient gets 20%, not their marginal rate. We ran each case on this branch and at
e5b16d14b(the branch before this change), for a married earner whose spouse earns £5,000:e5b16d14bIn the first row household net income falls from £41,919.12 to £41,906.53. In the fifth, the old deduction cut the earner's taxable pay below the £5,000 starting rate limit for savings, so £1,260 of interest bore the 0% starting rate as well. The old model saved them £504 rather than £252.
uc_income_tax_on_earningstakes the Step 6 reductions off the tax on earnings, so Universal Credit's deduction for income tax follows the change. The Scottish £40,000 earner's deduction rises by £12.60, from £5,318.22 to £5,330.82, and the English £30,000 earner's stays at £3,234.Readers of the old deduction
uc_income_tax_on_earningsanduc_income_tax_on_traderead both lists, so they follow the change with no code change (above).pension_credit_self_employment_deductionstakesmarriage_allowanceoff the profit at a single notional rate, the basic rate or the Scottish basic rate. At one rate, with both floored at zero, rate x max(0, profit - reliefs - amount) equals max(0, rate x max(0, profit - reliefs) - rate x amount), and the married couple's allowance comes off after either. A million random draws of profit, reliefs, allowance, married couple's allowance and rate give the same notional tax both ways to within £0.000000000004. Its comment now says this; the code stays the same.uc_earnings_deductions.yaml's case that sets its own exclusions list no longer listsmarriage_allowance.create_expanded_ma_reform) redefinesmarriage_allowance;marriage_allowance_tax_reductionreads the reform's allowance, and a property test checks that under the reform a higher- or additional-rate recipient's tax falls by 20% of the allowance (£252 in 2025-26), not 40% or 45%.non_savings_taxable_income,higher_rate_savings_income,add_rate_savings_income,basic_rate_savings_income,savings_starter_rate_incomeanddividend_income_taxreadmarriage_allowancethroughearned_taxable_incomeate5b16d14b. They no longer do.property_income_band_base.yaml's Case 7 pinned the old base for Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947; it now gives £17,430, not £16,170, and income tax of £3,234.earned_income_tax, which comes before Step 6, lessuc_income_tax_on_earnings. With the reduction at Step 6, that difference keeps tax the reduction has cancelled: for a Welsh earner with £13,000 of pay, a £3,000 pension and a partner's £1,260, the route would disregard £686 on the pension, £252 more than they pay.working_age_unearned_income_taxnow takes the reductions off throughearnings_tax_reductions, whichuc_income_tax_on_earnings_sliceshares, so the route disregards £434. A new case incouncil_tax_reduction_devolved_working_age.yamltakes that through to an award of £460.12.liable_only_at_marriage_allowance_ratesandnon_savings_taxable_income, invariant 2's note intest_property_income_band_base_properties.py,docs/engineering/gift-aid.mdandmarriage_allowance/max.yamlnow describe the reduction. The rate test computes the same thing as before.The rest-of-UK band needs savings or dividends
The issue proposes the higher of the Scottish band of non-savings income and the rest-of-UK band of total taxable income. That second band measures the savings and dividends only when the person has some. Without them it lifts a Scottish starter-rate taxpayer to
BASIC: in 2018-19, £12,570 of pay leaves £720 of taxable income, all at the 19% starter rate, and the proposal givesBASIC. The existing caseScottish intermediate rate recognised(2022-23, £14,650 of income,STARTER) fails under the proposal. This PR applies the rest-of-UK band only when the person has taxable savings or dividends.Other years
The same band formula now runs from 2017-18. The model dispatches annual formulas at 1 January, so before this PR:
BASIC, and the earner met the Marriage Allowance conditions, though in 2017-18 Parliament allowed only the Scottish basic rate (s. 55B(2)(b)).ADDITIONAL.Labels
TaxBandhas no advanced or top label, soADDITIONALcovers the Scottish advanced and top rates and the savings and dividend additional rates.HIGHERcovers the Scottish higher rate and the savings higher and dividend upper rates.STARTERandINTERMEDIATEcome from the Scottish band only.What reads
tax_band, and what movesmeets_marriage_allowance_income_conditionsand the CPS reform no longer read it.marriage_allowanceandincome_taxmove for married couples whose earner now meets, or no longer meets, the conditions. We ran an earner whose spouse earns £5,000 onorigin/mainand on this branch:HIGHER→INTERMEDIATEHIGHER→INTERMEDIATEADDITIONAL→INTERMEDIATEBASIC→HIGHERHIGHERHIGHERHIGHERBASICThe spouse pays no income tax in any row. Where the earner has the allowance, it now saves them the appropriate percentage of it: 20% x £1,260 = £252 in 2025-26 and 20% x £1,190 = £238 in 2018-19.
origin/maindeducted it from earned income, so in the 2017-18 row it saved £430, taking £1,000 out of the 40% band and £150 out of the 20% band; under this branch that earner fails the conditions. These synthetic households give no population estimate.Counts of taxpayers by marginal rate move, since Scottish taxpayers move to the band their income reaches (One consistent UK target surface: enforced cross-grain reconciliation, declared uprating holds, nation household controls and the 942a1fa re-pin (#1123 PR A) microcosm#1198 binds HMRC's Scottish higher and additional rate counts on
tax_band). In the 4,816-adult grid, 3,129 of the 3,339 Scottish band changes move down; the grid gives no population shares. The other 210 move up: 8 Scottish taxpayers in 2017-18 above the Scottish higher-rate limit, and 202 starter-rate taxpayers with some savings or dividends, whom the model now bandsBASIC. The model charges savings that low at the 0% starting rate for savings and such dividends at the nil or ordinary rate, and the band counts nil-rate income where it sits.savings_allowancedoes not readtax_band. Since the fix for Personal Savings Allowance uses the Scottish bands for Scottish taxpayers (ITA 2007 s. 12B(8)) #2347 it sets the Personal Savings Allowance on the rest-of-UK bands itself (s. 12B(8)), and its documentation now says so. This PR does not move it:test_savings_allowance_does_not_read_the_bandforces every band as an input and the allowance stays the same, and the 4,816-adult differential above finds no change in it.Microcosm's engine test
test_scottish_savings_and_dividends_count_against_the_scottish_thresholdspins the issue's first case (Scotland, £40,000 of pay and £5,000 of dividends,HIGHER). With this change the model givesINTERMEDIATE, so that test fails until Microcosm updates it.Existing tests changed
The eleventh row (index 10) of the
test_gift_aid.pybit-for-bit snapshot, a Scottish taxpayer in 2026-27 with no pay, £10,000 of property income, £20,000 of savings and £10,000 of dividends, moves fromINTERMEDIATEtoBASIC. The model sets the allowance against all the property income, so no income bears a Scottish rate (s. 11A), and the remaining £27,430 of savings and dividends falls below the £37,700 UK basic rate limit (ss. 11D(6) and 13(5)). Its other eleven rows and every other snapshot value stay the same.On
origin/main, the six cases inmeets_marriage_allowance_income_conditions.yamlsettax_bandas an input. They now set the income that puts a person in each band; every expected value stays the same.test_marriage_allowance_cps_switch.py's invariant 5 pinned the CPS reform's values from before the reduction: with the reform on, the £60,000 earner saved 40% of the allowance. Its expected tax now comes from s. 55B(1) and (3): £11,432 - 20% x £1,260 = £11,180 at the reform's 10% rate, and £11,432 - 20% x £2,520 = £10,928 at 20%, in place of £10,928 and £10,424.property_income_band_base.yaml's Case 7 pinned the old Marriage Allowance base for Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947; it now gives £17,430 and income tax of £3,234 (above).pension_credit_earnings_disregard.yaml's two Scottish couple cases for 2025-26 pinned the old deduction. In both, the claimant has £12,000 of State Pension and £16,000 of private pension, and the partner has no taxable income. The first case adds £1,040 of pay. The claimant's taxable income exceeds £14,921, where the Scottish intermediate rate starts, both with pay (£16,470) and without (£15,430), so all of the pay bears 21%. Before the Marriage Allowance, tax comes to £2,827 x 19% + £12,094 x 20% + £1,549 x 21% = £3,281.22 with pay and £3,062.82 without. Parliament takes 20% x £1,260 = £252 off each at Step 6 (s. 55B), and four outputs change:income_tax, with payincome_tax, without paypension_credit_earnings_disregard, with paypension_credit_income, both casesThe pay adds £3,029.22 - £2,810.82 = £218.40 of tax (all £1,040 at 21%), and the claimant pays no Class 1 contributions above State Pension age. Net earnings come to £821.60, and the £20-a-week disregard, up to £1,040 a year, covers them in full. Pension Credit income stays the same with and without pay: £29,040 - £3,029.22 - £821.60 = £28,000 - £2,810.82 = £25,189.18. Main deducts the £1,260 from the claimant's taxable income instead, which leaves £14,170 without pay, below where the intermediate rate starts. So £751 of the pay bears 20% and £289 bears 21%, adding £210.89 of tax.
Main added
test_step_6_puts_the_pension_tax_allowance_after_every_other_reductionafter this branch's base. This branch lists the Marriage Allowance after the Pension Tax Allowance, so the test becomestest_step_6_lists_the_pension_and_marriage_allowances_last. Both reductions have amounts fixed before Step 6, so the order leaves the total as it was.Main also added
test_council_tax_reduction_pensioner_children_tariff_properties.py, which pins a Scottish couple on £25,000 of pay in 2019-20 at £24,674.64 of Council Tax Reduction income and a £460.78 award. Taxable income now stays £12,500, so its last £350 reach the 21% band: £380 + £2,030 + £73.50 - £250 = £2,233.50 of tax, against £2,230 with the allowance off taxable income. Income falls to £24,671.14, and the award rises by 20% of £3.50 to £461.48.test_marriage_allowance_cps_switch.py's invariant 3 readeligible_bands. It now checks that no one with taxable income above the basic rate limit, or above £31,092 (the start of the Scottish higher rate) for a Scottish taxpayer, meets the conditions or has the allowance, and that everyone else meets them.Known limits, unchanged here
tax_bandputs taxable income exactly at a limit in the band above, and pay equal to the personal allowance inBASIC, where Parliament charges income up to a limit at the lower rate (s. 10). Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 pins the first at £50,270 of pay. The Marriage Allowance no longer reads the band, so this affects counts by marginal rate only.tax_bandputs rest-of-UK income at a limit in the band above #2782 tracks it.marriage_allowancestill books the transferor's unused personal allowance on the recipient, up to 10% of the personal allowance and rounded up to £10. Parliament instead fixes the transferable amount (s. 55B(4) and (5)) and cuts the transferor's own allowance by it (s. 55B(6)). The rest of Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947 (the fixed transfer, the transferor's reduced allowance, the election and its conditions, the rounding of a partial amount and the double count) stays with Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963.test_state_pension_does_not_change_partners_marriage_allowancestill fails, as its strict xfail expects.first_extended_scottish_thresholdalready does, so a reform that changes the number of Scottish brackets gets wrong labels.earned_income_taxcharges a Scottish taxpayer 40% above £31,500 of taxable pay in those years, where Parliament taxed that pay on the rest-of-UK limits. In 2015-16, £42,200 of pay leaves £31,600 of taxable pay, below the statutory £31,785 limit, and the model charges a Scottish taxpayer £6,340 against £6,320 in England. In 2016-17, £43,000 of pay leaves £32,000, the basic rate limit Parliament set for 2016-17 (FA 2015 s. 4(1)(a), as Finance (No. 2) Act 2015 s. 6(a) amended it), and the model charges £6,500 against £6,400. The Marriage Allowance test uses the basic rate limit in those years. A Scottish taxpayer can therefore meet this income test while the model charges some of their income at 40% in 2015-16 or 2016-17. The property test leaves those Scottish taxpayers out (Charge Scottish taxpayers on the rest-of-UK limits in 2015-16 and 2016-17 #2866).Overlap
#1963 (draft,
marriage-allowance-electionat 69c919f) models the Marriage Allowance as the statutory transfer and Step 6 reduction. Both branches defineliable_only_at_marriage_allowance_ratesin the same file, and this branch now addsmarriage_allowance_appropriate_percentageandmarriage_allowance_tax_reductionunder #1963's names. This branch deducts the reduction after the reductions listed before it instep_6_tax_reductions, throughearlier_tax_reductions, and has nomarriage_allowance_tax_reduction_limit. #1963 conflicts with this branch's head, which mergesmainat a866277, in 21 files:marriage_allowance/max.yaml,income_tax_subtractions.yaml, the CPS reform,pension_credit_earnings_disregard.yaml,meets_marriage_allowance_income_conditions.yaml,property_income_band_base.yaml,test_marriage_allowance_cps_switch.py,test_aggregate_impact_measure.py,test_property_income_properties.py,test_state_pension_components.py,measure.py,basic_state_pension.py,new_state_pension.py,pension_credit_self_employment_deductions.py,marriage_allowance.py,marriage_allowance_appropriate_percentage.py,marriage_allowance_tax_reduction.py,meets_marriage_allowance_income_conditions.py,uses_property_allowance.py,non_savings_taxable_income.pyandproperty_finance_cost_relief.py. Nine of those (income_tax_subtractions.yaml,test_aggregate_impact_measure.py,test_property_income_properties.py,test_state_pension_components.py,measure.py,basic_state_pension.py,new_state_pension.py,uses_property_allowance.pyandproperty_finance_cost_relief.py) conflict withmainat a866277 itself.#2830 (
fix-2106-allowance-orderat 6602ccc) conflicts with this branch innon_savings_income_after_allowances.pyand intest_property_income_band_base_properties.py, whose invariant 2 note both branches rewrite. #2841 (fix-2782-tax-band-boundariesat a15905c) conflicts intax_band.py, which both branches change. #2830 and #2841 merge cleanly withmainat a866277, and #1963 conflicts with it as above.#2670 also edits
create_expanded_ma_reform(its child condition). No other open PR touches these files.We ran 1,000 generated households in all four nations (607 married couples and 393 single adults) for each year from 2015-16 to 2028-29. This branch's rate test and #1963's at 69c919f agree in 22,497 of 22,498 person-years, couples included. In the one difference, in 2016-17, a single Scottish taxpayer with £20,519 of pay, £22,267 of property income and £1 of interest has £31,786 of taxable income other than savings and dividends. This branch holds them to the £32,000 basic rate limit and finds the conditions met, where #1963 uses the £31,500 that the model's Scottish schedule shows in that year.
Merge notes
This branch merges
mainat a866277, with no conflicts.In
pension_credit_earnings_disregard.yaml, Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 gives the two Scottish couple cases the sameincome_tax,pension_credit_earnings_disregardandpension_credit_incomeas this branch and adds Pension Credit outputs below them, so Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 can take its own side of that conflict.When Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 rebases onto this branch, it keeps this branch's helper, both callers, the removed-parameter migration and the regression cases. The helper carries the pre-2017-18 year rule for Scottish taxpayers, the strict comparisons at each limit, the Gift Aid extensions and the dividend test on the basic rate limit, and it places the savings nil rate from 2016-17 above the starting rate limit.
Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 also keeps this branch's reduction:
marriage_allowance_appropriate_percentage(which reads the Scottish basic rate band,brackets[1], and gives the basic rate before 2016-17),marriage_allowance_tax_reduction(limited throughearlier_tax_reductions), its place last instep_6_tax_reductions.yaml, the removal ofmarriage_allowancefromearned_taxable_income_exclusions.yaml, andmarriage_allowance_tax_reduction.yaml. Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963'sincome_tax_subtractions.yamlentry goes, sinceorigin/mainlists Step 6 reductions instep_6_tax_reductions.yaml. Where Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963's election readsmarriage_allowance_tax_reduction_limit, it can compute the same limit fromincome_tax_pre_chargeslessearlier_tax_reductions.Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 still brings the transferor side and the election: the fixed transferable amount (s. 55B(4) and (5)), the transferor's reduced personal allowance (s. 55B(6)), the election and its conditions (s. 55C), and the fixes for Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947's rounding of a partial amount (item 4) and double count (item 5). Its expected values for the recipient's tax should come out the same, since both branches give 20% of the transferable amount at Step 6.
The helper's docstring on this branch replaces the two paragraphs it shared with Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963. Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 should take this wording:
For Set reliefs and allowances against income for the least tax #2830, take Set reliefs and allowances against income for the least tax #2830's
non_savings_income_after_allowances.pyand replace its last documentation sentence, "property_income_tax, taxable_property_income_after_allowances and earned_taxable_income read it, and non_savings_taxable_income reads it through the last two.", with "property_income_tax, taxable_property_income_after_allowances, earned_taxable_income, the Marriage Allowance rate test and, for Scottish taxpayers, tax_band read it, and non_savings_taxable_income reads it through taxable_property_income_after_allowances and earned_taxable_income." Intest_property_income_band_base_properties.py, take Set reliefs and allowances against income for the least tax #2830's invariant 2 and replace "with no Marriage Allowance, " and "(earned_taxable_income also subtracts Marriage Allowance; Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947)" with a closing sentence: "The Marriage Allowance does not enter it: the model gives the allowance as a tax reduction at Step 6 (ITA 2007 s. 55B(1))."earned_taxable_income_exclusions.yamlno longer listsmarriage_allowance, so Set reliefs and allowances against income for the least tax #2830'sIGNORED_EXCLUSIONSno longer changes anything and can go. We merged Set reliefs and allowances against income for the least tax #2830's head into a copy of this branch's head, taking Set reliefs and allowances against income for the least tax #2830's side of both conflicts. The merge computesincome_taxwith no cycle, and five of the households in the table above give the same income tax as on this branch (£5,724.57, £6,130.82, £19.70, £1,148 and £231.75). The HMRC allowance YAML directory (248 cases) andproperty_income_band_base.yaml(7 cases) pass on it.Correct rest-of-UK tax bands at exact income limits #2841 conflicts only in
tax_band.py, which this change leaves as it was ate5b16d14b.Invariants
The property tests assert these on generated cases:
STARTERtoBASICwhere savings or dividends sit below the Scottish starter limit: they sit in the rest-of-UK basic band.test_marriage_allowance_tax_reduction_properties.pyasserts these on generated married couples in England, Scotland, Wales and Northern Ireland, with pay, private pensions, savings and dividends drawn freely, in 2016-17, 2017-18, 2018-19, 2021-22, 2025-26 and 2026-27:income_taxequals the income tax withwould_claim_marriage_allowancefalse, less the smaller of the appropriate percentage ofmarriage_allowanceand the Step 5 tax that the earlier reductions leave.meets_marriage_allowance_income_conditionsgives the same result withwould_claim_marriage_allowancetrue and false.We ran a grid of 896 married couples in each year from 2015-16 to 2028-29 (25,088 person-years) at
e5b16d14band on this branch. The earner has £0 to £130,000 of pay (14 levels) and no other income, £3,000 of interest, £5,000 of dividends or £10,000 of private pension; the spouse earns £0, £5,000, £11,000 or £20,000; the couple lives in England, Scotland, Wales or Northern Ireland. Across the grid, two invariants hold:meets_marriage_allowance_income_conditionsgives the same result in all 25,088 person-years, andmarriage_allowancestays the same in every one.income_tax: every person-year whoseincome_taxmoves has the allowance.test_council_tax_reduction_devolved_working_age_properties.pyadds one on #1966's route:uc_income_tax_on_earningsandcouncil_tax_reduction_working_age_unearned_income_taxadd to the family's income tax, so a Step 6 reduction neither disappears nor counts twice.For everyone outside Scotland,
tax_bandstays the same. For single people anywhere,income_taxandsavings_allowancestay the same.On the same grid, against
e5b16d14b, the reduction movesincome_taxin these person-years, all of them Marriage Allowance recipients (6,272 person-years in each nation):household_net_incomemoves in the same couples, the other way: 33 households rise and 34 fall in each of England, Wales and Northern Ireland, and 141 rise and 316 fall in Scotland (3,136 household-years in each nation). Outside Scotland, tax rises only for earners with £14,000 or £18,000 of pay and £3,000 of interest, whose deduction used to open the 0% starting rate band for savings (up to £199.20). It falls only for earners with £12,570 of pay and £5,000 of dividends, whose tax the deduction could not reach (from 2018-19, by £26 to £252). In Scotland tax rises by up to £12.60 for earners whose top £1,260 of non-savings income bore the 21% intermediate rate (with pay only, dividends or a pension). With savings it rises by up to £199.20 (2027-28: £18,000 of pay and £3,000 of interest, £1,073.77 to £1,272.97). It falls by up to £12.60 where that slice bore the 19% starter rate, and by up to £252 for earners whose tax comes mostly from dividends. The largest falls, £252, come in 2022-23 and later for earners with £12,570 of pay and £5,000 of dividends (2022-23: £262.50 to £10.50). Universal Credit'suc_income_tax_on_earningsrises in 234 person-years and falls in 144. These synthetic households give no population estimate, and the years after 2026-27 use the model's projections.Invariant 4 compares the test with the model's liability, so its reforms hold the starting rate limit at or below the basic rate limit, the range in which the model's liability places the savings nil rate where Parliament does (s. 12A). It also leaves out Scottish taxpayers before 2017-18, and its years start in 2016-17. YAML cases worked from the statute cover those: the 2015-16 dividend and savings cases at the model's £32,000 limit and at the statutory £31,785, and the two cases under a raised starting rate limit.
Test plan
scottish_rates.yamlandmeets_marriage_allowance_income_conditions.yaml, which we worked by hand from ITA 2007, FA 2016, SI 2015/1810, SI 2018/459 and the Scottish rate resolutions. Both files pass: 36 and 31 cases.marriage_allowance_tax_reduction.yaml: 16 cases worked by hand from ss. 55B(1) and (3) and 29(2) and (3), S6M-16531 and the parameter files, with the arithmetic in each comment. All pass.git diff --check.changelog.d/2350.fixed.md.We ran these locally with no survey data:
scottish_rates.yaml: 36 passed.meets_marriage_allowance_income_conditions.yaml: 31 passed.liable_only_at_marriage_allowance_rateson 200,000 generated sets of non-savings, savings and dividend income, basic rate limits, starting rate limits, savings allowances, Gift Aid, years and nations. It agrees in every case with a hand-worked oracle of ss. 10, 12, 12A and 13 and FA 2016 s. 4(17).policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax/): 570 passed.2ca7c5ff7, which mergesmainat 9dd44e1:pension_credit_earnings_disregard.yaml, 34 passed; the wholepolicyengine_uk/tests/policy/baselineYAML tree, 5,589 passed and none failed;scottish_rates.yaml,meets_marriage_allowance_income_conditions.yaml,marriage_allowance_tax_reduction.yaml,marriage_allowance_statutory_rate.yamlandmarriage_allowance.yamltogether, 96 passed. When we putmarriage_allowanceback on the exclusions list and took the reduction off the Step 6 list, the two Scottish Pension Credit cases failed onincome_tax(£3,016.62 and £2,805.73) and the file's other 32 passed. With-n 4, the eleven property and snapshot files above together withtest_marriage_allowance_cps_switch.py: 245 passed and 1 xfailed (the same strict xfail).code_health: 3,150 passed. Ruff 0.17.2 format and lint, the F811/F821 check andgit diff --check: clean. The head,e511964cb, changes only a comment inpension_credit_earnings_disregard.yamlafter2ca7c5ff7.marriage_allowance:marriage_allowance.yaml7,marriage_allowance_statutory_rate.yaml6,marriage_allowance_tax_reduction.yaml16,property_income_band_base.yaml7,property_finance_cost_relief.yaml21,gift_aid.yaml23,tax_band_historical.yaml16,uc_earnings_deductions.yaml15,uc_mif_earned_income.yaml29,uc_is_responsible_carer.yaml8 andpension_credit_statutory_pay_earnings.yaml12, all passed.marriage_tax_reforms.yaml: 10 passed.integration/income.yaml: 8 passed.test_tax_band_scottish_properties.py: 5 passed.test_marriage_allowance_cps_switch.py: 45 passed.-n 4:test_marriage_allowance_tax_reduction_properties.py,test_tax_band_scottish_properties.py,test_gift_aid.py,test_income_tax_step_6_step_7_properties.py,test_property_income_band_base_properties.py,test_pension_credit_earnings_disregard_properties.py,test_uc_state_pension_properties.py,test_uc_income_from_capital_properties.py,test_uc_unearned_benefits_properties.py,test_deterministic_variables.pyandtest_dated_reform_routes.pytogether: 200 passed and 1 xfailed. The strict xfailtest_state_pension_does_not_change_partners_marriage_allowancestill fails: the recipient's allowance still reads the transferor's unused personal allowance (Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947, Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963).code_health: 3,095 passed.git diff --check: clean.We ran each mutation of the reduction on a copy of the branch, against
marriage_allowance_tax_reduction.yaml(16 cases),marriage_allowance_statutory_rate.yaml(6),property_income_band_base.yaml(7),uc_earnings_deductions.yaml(15),meets_marriage_allowance_income_conditions.yaml(31),marriage_tax_reforms.yaml(10) and the three property tests:marriage_allowanceback on the exclusions list, the reduction off the Step 6 listproperty_income_band_base.yamlfailsmarriage_allowanceon the exclusions list as well as the reductionNo mutation changes the rate test's 31 cases or the CPS reform's 10.
We ran one-line mutations of the Marriage Allowance test and of
tax_bandagainst both YAML files:scottish_rates.yaml(36 cases)tax_bandwithout the Gift Aid rise in the UK limitstax_bandputs income at the UK additional limit above ittax_bandreadsearned_taxable_incomeUnder the £5,000 starting rate limit, a slice that starts at non-savings income and one that starts at the larger of it and the limit give the same answer: where they differ, both end below the basic rate limit. So only a raised starting rate limit separates the slice mutation, and the YAML case under a £37,500 limit does. The savings-test mutation changes the savings result only where dividends sit above the savings and take income past the basic rate limit. There the dividend test already fails the person. So no input whose net income equals the sum of its non-savings, savings and dividend income separates the mutation at the helper's output, and the 200,000-case differential above finds no difference with it either. A supplied
adjusted_net_incomebelow the income components breaks that equality and separates them.🤖 Generated with Claude Code