Repository navigation
Band savings and dividends above property income - #2352
Merged
Merged
Conversation
ITA 2007 s. 16 treats savings and dividend income as the highest part of total income, so property income, which is non-savings income, fills the bands below them. Since #1408, earned_taxable_income leaves property income out (property_income_tax taxes it separately), and the savings bands, the savings starting-rate taper and dividend_income_tax all stacked on earned_taxable_income, so they were banded as if property income were not there. £40,000 of property income and £20,000 of dividends paid £2,096.25 of dividend tax instead of £4,528.75. New non_savings_taxable_income (earned_taxable_income plus property income after allowances, from the new taxable_property_income_after_allowances, which property_income_tax now reads too) is the base for those variables. Fixes #2351 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e bug The case expected nil savings tax for two people with property income and savings interest. With savings above the property income (ITA 2007 s. 16), person 1 is a higher-rate taxpayer: (2,900 - 500) x 40% = 960; person 2 a basic-rate one: (1,525 - 1,000) x 20% = 105. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… variables Review follow-ups for #2352: - taxed_income, which sets the annual allowance charge's marginal rate, stacked on earned_taxable_income too and so left property income out; it now adds non_savings_taxable_income (Case 6: £10,000 of excess contributions with £60,000 of property income pay 40%, not 20%). - One non_savings_income_after_allowances variable feeds both taxable_property_income_after_allowances and property_income_tax. - Cite ss. 16A and 25(3A) for 2027-28; say the identity holds without Marriage Allowance and pin that case (#1947); point the starting-rate comment at #1799; replace the monotonic check, which main also passed, with a higher-rate check main fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
marked this pull request as ready for review
October 11, 2026 22:47
Collaborator
Author
|
CI run cancelled to free runners (UK hub, 2026-10-11 23:30Z). The PolicyEngine org is at GitHub's limit of 60 concurrent jobs, with about 360 queued. Fleet ops asked the hub to let the Budget-critical #2305 take runners first. This PR's queued run had not started, so I cancelled it. Nothing is wrong with the PR. Please don't re-run it or push just to retrigger CI. The hub re-runs this run itself once #2305 has runners. The record is |
Collaborator
Author
|
Hand-off to the UK hub (session local_66e4b1fd, PolicyBench UK round 2).
|
This was referenced Oct 11, 2026
MaxGhenis
added a commit
that referenced
this pull request
Oct 12, 2026
With #2352, savings and dividends sit above property income (ITA 2007 s. 16). Two YAML cases check that the s. 414(2)(b) extension applies on that order: £40,000 of property income with £20,000 of dividends (dividend tax £4,278.75 against £4,528.75) or £20,000 of savings (savings tax £5,646 against £5,846). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 12, 2026
The frozen expectations predated #2352 (savings and dividends above property income) and main's Scottish personal savings allowance on the UK bands, so the mixed-income rows and one allowance changed on main. Regenerated from main 3381500. With no gift, the branch matches main byte for byte on all 21 variables and the tax band. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis
added a commit
that referenced
this pull request
Oct 12, 2026
Round-3 review nit. The design note listed two limitations the #2352 merge removed: savings and dividends now stack above property income, and the Personal Savings Allowance tests net income against the UK limits raised by the gift. It now describes that behaviour instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Fixes #2351
axiom: ukpga/2007/3/16 encoded-correct (rulespec-uk c65fd7df:
uk/statutes/ukpga/2007/3/16.yaml, anduk/statutes/income_tax/individual/savings_dividend_oracle_pipeline.yamlstacks savings and dividends on all non-savings income, with no separate property slice)What changes
ITA 2007 s. 16 treats savings and dividend income as the highest part of total income, with dividends above savings. Property income is non-savings income, so it fills the bands below them, as pay does. That holds in 2026-27 and, with property income's own rates, from 2027-28.
Since #1408,
earned_taxable_incomesubtractstaxable_property_income, becauseproperty_income_taxtaxes property income separately. But these variables stack savings or dividends onearned_taxable_income:basic_rate_savings_income_pre_starter,basic_rate_savings_income,higher_rate_savings_income,add_rate_savings_income;savings_starter_rate_income;dividend_income_tax.So savings and dividends were banded as if property income were not there.
New
taxable_property_income_after_allowances: taxable property income less the allowances it absorbs. This is the sliceproperty_income_taxalready computed inline; it now reads this variable, with no change in behaviour.New
non_savings_taxable_income:earned_taxable_incomeplus property income after allowances. With no Marriage Allowance it equalsnon_savings_income_after_allowances(a property test checks this).earned_taxable_incomealso subtracts Marriage Allowance, which the law gives as a tax reduction (ITA 2007 s. 55B). That is a separate open defect (Marriage Allowance is booked on the recipient as the transferor's unused allowance, not the fixed s.55B transfer #1947, PR Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963); YAML Case 7 pins the current behaviour.The six variables above stack savings and dividends on
non_savings_taxable_income.taxed_income, which sets the marginal rate of the annual allowance charge (personal_pension_contributions_tax), addsnon_savings_taxable_incometoo. Onmain, £10,000 of excess contributions with £60,000 of property income was charged at 20% instead of 40%.New
non_savings_income_after_allowances: adjusted net income less savings, dividends and allowances, floored at nil. Bothtaxable_property_income_after_allowancesandproperty_income_taxread it, so there is one copy of the expression.From 2027-28 the order is statutory:
Both are cited.
Unchanged:
earned_taxable_incomeand the earned-income bands, which property income must stay out of, becauseproperty_income_taxtaxes it.Worked example, 2026-27: £40,000 of property income and £20,000 of dividends. Non-savings taxable income is £27,430. The £500 dividend allowance and £9,770 fill the basic-rate band at 10.75% (£1,050.28), and £9,730 is at 35.75% (£3,478.48): £4,528.75.
maincharges all £19,500 at 10.75%: £2,096.25. The same income as pay gives £4,528.75 onmaintoo.Impact (real run)
Measured on
enhanced_frs_2023_24.h5(local policyengine-uk-data storage, 6 October build) for 2026. This branch at 2de2210 (whose model code is the head's, after a clean merge of main) and main's code (c6d15c8) each ran a full simulation of the same data (impact_compare.py).The £30.73m Income Tax change is £25.90m on savings plus £4.81m on dividends, plus about £0.02m from the annual allowance charge (
taxed_income).Tests
New YAML (
gov/hmrc/income_tax/property_income_band_base.yaml), seven cases:Cases 1-6 fail on
main.Changed YAML (
integration/income.yaml, "Property income uses post-allowance rate bands"): it expected nil savings tax for two people with property income and savings interest, which encoded this bug. With savings above the property income:Property tests (
test_property_income_band_base_properties.py, Hypothesis):non_savings_taxable_income= adjusted net income less savings, dividends and allowances, floored at nil;mainpasses it too);maincharged £2,900, below the 20%-only £3,900).The first and last fail on
main. The first moves the taxable amount, because the £1,000 property allowance relieves small property income in full; Hypothesis found that case (£312).Run locally at 2de2210:
Review: a GPT-6.1 Sol review approved 1a80b21. Its should-fix and nit findings are addressed in 2de2210:
taxed_income;Not changed
The savings starting rate still tapers from the personal allowance plus £5,000 rather than from the start of taxable non-savings income (#1799). This PR changes only the income that taper reads.
🤖 Generated with Claude Code