Repository navigation
Fix pre-2027 property income tax main-rate reforms - #2625
Conversation
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 12 (thresholds in Notes
Moves flagged for review
Receipts by tax head
Spending by benefit and service
Caseloads
Government balance, each component counted once
Model totals
Household income totals
Inequality
Mean household net income in each side's own deciles
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileMean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.
No change in any year: population; poverty rates; people in poverty. Checks failing on both base and head (1)
Counted-once checkEach of 86 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.
Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
vahid-ahmadi
left a comment
There was a problem hiding this comment.
@juaristi22 thanks, first-round review at 92c0018d1. The law is right, the code does what #2607 asked for and the tests pin it. One should, on the PR body only, and two nits.
What I checked
- Law, against legislation.gov.uk (Finance Act 2026 c. 11, as enacted). s. 6 inserts ITA 2007 ss. 6D, 11CA, 16A and 17A, and s. 6(8) says the amendments "have effect for the tax year 2027-28 and subsequent tax years". s. 7 sets the 2027-28 property rates at 22%, 42% and 47%. Before 2027-28 there is no separate property rate, so property income is charged at the main rates and a reform to
rates.ukshould reach it. The new pre-2027formuladoes that, andformula_2027keeps the separate property-rate body, which matches s. 6(8). New s. 16A stacks property income above other non-savings income and below savings and dividends, which is how both formulas already stack it. - The pre-2027 formula is the same "tax on (other + property) minus tax on (other)" form already used for Scottish taxpayers, on the full
rates.ukscale with Gift Aid. Under baseline parametersrates.ukandrates.propertyare both 20/40/45 before 2027, so baseline tax should not move. The aggregate-impact bot agrees: income tax moves by -£103 and -£248 in total in 2025-26 and 2026-27 (rounding), and nothing from 2027-28. The 1p basic, 1p higher and 3p additional rate reforms each pick up about £135m to £287m more in 2025-26 and 2026-27, which is the property income that used to be missed. - Tests in a fresh venv:
test_property_income_rate_reforms.py55 passed. Withproperty_income_tax.pyreset to the merge base55cd7fb04, 33 of the 55 fail and the 22 controls (2027 onwards, Scottish, and baseline cases) pass, so the tests pin the change.policyengine-core test policyengine_uk/tests/policy/baseline/gov/hmrc/income_tax: 340 passed. - CI at head: all 16 checks pass.
Reproducer:andchangelog.d/2607.fixed.mdare present. #2607 also asked for the policy test in its "Test" section;test_main_rate_reform_reaches_property_and_final_tax_from_natural_incomecovers it (in 2026-27 rather than 2025-26, which is fine). - I did not use /review-program's validator agents for this one; it is a single formula change, so I checked it by hand.
Findings
-
should: PR body,
axiom: needed. Same point as on #2595: the template keepsneededfor external contributors, and on a maintainer PR it leaves the parity step with no owner (the Fix evidence check accepts it, so CI is green). rulespec-uk has nothing on the property rates yet (no11CAor property-rate encoding). Opening ape-parityissue there for ITA 2007 ss. 11CA and 16A as inserted by FA 2026 s. 6, with the s. 6(8) commencement, and changing the line toaxiom: <issue> queuedwould close this. Companion cases can come straight from the law, for example £5,000 of property profit in the basic band in 2026-27 under a 21% basic rate taxed at 21%, and at 22% in 2027-28. -
nit:
parameters/gov/hmrc/income_tax/rates/property.yamlstill starts at 2015 and says nothing about when it applies. After this PR a reform torates.property.*before 2027-28 has no effect, which is right in law and is tested (test_pre_2027_separate_property_rate_reform_does_not_apply), but anyone editing it in the app for 2025 or 2026 would see nothing happen and not know why. One sentence in the description ("Applies from 2027-28; before then property income is taxed at the main rates") would help, and FA 2026 s. 7 is now a better reference for the 2027 values than the OBR EFO. -
nit, no action needed here: FA 2026 s. 6 also inserts s. 11CB, Welsh property rates set by the Senedd. The model has no separate Welsh rates, so Welsh taxpayers get the UK property rates from 2027-28, as on main today. Worth an issue if Welsh property rates are ever set differently.
Overlap and merge order: none of your other open PRs touch property_income_tax.py. The branch is some way behind main but GitHub reports it mergeable, and the merge queue will retest it.
🤖 Generated with Claude Code
vahid-ahmadi
left a comment
There was a problem hiding this comment.
@juaristi22 second round at 92c0018d1, approving.
Earlier findings
axiom: needed(was a should): still open, but we now treat it as a nit on maintainer PRs, so it no longer blocks. rulespec-uk still has no issue for the property rates, so when you have a moment, opening ape-parityissue there for ITA 2007 ss. 11CA and 16A as inserted by FA 2026 s. 6 (with the s. 6(8) commencement) and changing the line toaxiom: <issue> queuedwould still be the tidy end state.rates/property.yamldescription and reference (nit): unchanged, fine to leave or do later.- Welsh property rates, s. 11CB (nit): no action needed here.
At head: no code change since the first round, all 16 checks pass, mergeable with no conflicts.
🤖 Generated with Claude Code
Fixes #2607
Before 2027-28, rUK property income follows reforms to the full main UK income-tax scale, including Gift Aid band extensions. The annual 2027 formula preserves the existing separate property-rate calculation, and Scottish treatment stays unchanged. Finance Act 2026 sections 6 and 7 provide the dated commencement and property-rate references.
Reproducer: policyengine_uk/tests/test_property_income_rate_reforms.py::test_pre_2027_property_income_uses_main_rate_reform
Local validation: 99 focused Python tests passed, including 55 new rate-reform and annual-routing cases; 66 affected YAML cases passed. The unchanged selected outcome checker passed with source mode and data absent, REQUIRE_TEST_DATA=1 and no skipped or unfinished selected tests.
make formatpassed with complete Python AST and non-Python byte preservation. These public synthetic and focused checks are not a whole-suite or certified-dataset result; resulting-head CI remains pending.axiom: needed
Microcosm issue 1370 adoption and supported parity remain open. No encoder run or private costing was performed.