Repository navigation
Model landlords' finance-cost tax reduction and stop the property allowance stacking on expenses - #2172
Conversation
…stacking on expenses Adds three optional landlord inputs (property_rental_income, property_finance_costs, property_finance_costs_brought_forward) and models: - the property allowance as ITTOIA 2005 Part 6A Chapter 2 gives it: full relief for receipts within the allowance, partial relief replacing expenses, never on top of expenses already netted out of property_income (#1900), from 2017-18; - the s. 274A/274AA tax reduction for residential finance costs: the property basic rate (basic rate before 2027-28, FA 2026 Sch 1 para 40, Scottish taxpayers included) on the lowest of the relievable costs, the property profits and adjusted total income, limited to the Step 5 tax left, with the carry-forward; - the s. 783BL choice between the two, made by comparing income tax in two branches only for people with a real choice; - the s. 272A phase-in as a parameter (zero restores full deductibility); - UC no longer sets the reduction against the tax on earnings; tax credits deduct finance costs from property income (SI 2002/2006 reg 11(2A)). Fixes #2170. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… pre-2020 fallback - Choose routes one person per benefit unit at a time, with everyone else's route held fixed, repeating until nobody changes, so a partner's switch (through the Marriage Allowance) cannot flip a person's choice. - Means tests that count property income (tax credits, Housing Benefit, Income Support, Pension Credit, council tax reduction) count it after finance costs, through property_income_after_finance_costs, which replaces tax_credits_property_income. They deduct income tax net of the reduction, so counting the profit before the costs made finance costs raise their income. - The part of the reduction above the tax on property income comes off the UC deduction for tax on earnings, so that deduction never exceeds the income tax paid. - property_receipts_within_allowance decides full relief exactly, testing property_income (not the profit after deductible costs) when receipts are unknown, which fixes 2017-18 to 2019-20 and float ties at £1,000. - Separate the new UC case from the one it had been spliced into; add YAML cases for each finding and a couples property test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Automated review pass (Claude Code, high effort) — round 1 at
|
| Case | Year | Result | By hand |
|---|---|---|---|
| £30k receipts, £8k expenses (£22k profit), £6k finance costs, £40k employment | 2026 | relieved £6,000, relief £1,200, no carry-forward, no allowance | ✓ |
| £900 receipts | 2026 | full relief, taxable property income £0 | ✓ (s. 783BE) |
| £3,000 receipts, £500 expenses | 2026 | allowance route, deduction £500 → taxable £2,000 | ✓ (s. 783BH: receipts − £1,000) |
| £12k receipts, £4k profit, £9k finance costs, £80k employment | 2026 | relieved £4,000 (profit binds), relief £800, carry-forward £5,000 | ✓ (s. 274AA(2)–(4)) |
| Same | 2027 | relief £880 (22%) | ✓ |
| £14k profit, £8k finance costs, no other income | 2026 | adjusted total income £1,430 binds → relief £286 = all Step 5 tax, carry-forward £6,570 | ✓ |
- The allowance: it's nil before 2017-18. Rent-a-room receipts are excluded from
property_rental_income(s. 783BB(2)), and the allowance is never used with the finance-cost reducer (s. 783BL). - The restriction: the phase-in (25/50/75/100%) feeds
deductible_property_finance_costs. Setting the share to 0 restores full relief, and a test pins this. - Step 6: the reduction is limited to the Step 5 tax left after other reductions. Step 7 charges are untouched.
- The UC change: the finance-cost reduction now comes off the tax on property first, and only the excess comes off the tax on earnings. That matches the reduction being given on property profits.
- Uprating: the new inputs are uprated, with receipts uprated alongside profit.
ITTOIA 2005 s. 274AA(6) defines adjusted total income as net income, less savings and dividend income, less the allowances deducted at Step 3 of ITA 2007 s. 23 (the personal and blind person's allowances). The model's `allowances` also holds Gift Aid, covenanted payments and pension relief, which extend the basic rate band instead of reducing net income, so subtracting them understated the costs relieved and overstated the carry-forward. Gifts of shares to charity and other Step 2 deductions still come off net income. Adds a YAML case with Gift Aid (review round 1, item 1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Vahid. Round 1 is addressed in 747a4a3. The description is updated to match. 1. Adjusted total income: fixed.
Gift Aid, covenanted payments and pension relief no longer come off. Your probe is now a YAML case ("Gift Aid does not reduce adjusted total income", 2026-27): £18,000 of profit, £8,000 of finance costs and £3,000 of Gift Aid.
One caveat, written in the code comment: 2. The no-receipts fallback: direction and bounds now in the description. Both datasets flag SPI-imputed households (
Income tax effect against
The error runs one way: for survey-reported profits, the fallback can only overstate tax. A landlord whose actual expenses are under £1,000 would elect partial relief and pay less. HMRC's Property Rental Income Statistics 2026 report £21.9bn of non-finance expenses across 2.88m landlords, about £7,600 each on average. So most landlords' actual expenses exceed £1,000, but the data cannot say how many survey-reported landlords fall below it. 3. Legacy means tests: agreed. Under HB Regs 2006 reg. 46(4), rent from a let property is mostly income derived from capital, and so treated as capital. #1995 (Max's draft, "Treat income derived from capital as capital in the legacy means tests") is that change, so I haven't opened a new issue.
4. The 22% rate: checked against the enacted text.
Checks at 747a4a3:
|
vahid-ahmadi
left a comment
There was a problem hiding this comment.
Automated review pass (Claude Code, high effort) — round 2 at 747a4a37
Verdict: approve. All four round-1 items are closed. Two notes below are for the record; neither needs a change in this PR.
| Round-1 item | Status | Evidence |
|---|---|---|
| 1. Adjusted total income took off every allowance | Closed | property_finance_costs_relieved.py now starts from the model's adjusted_net_income, which is the sum of the taxable income components with nothing deducted, i.e. total income (Step 1). It takes off the Step 2 reliefs (charitable_investment_gifts, other_deductions), savings and dividend income, and the Step 3 allowances (personal_allowance, blind_persons_allowance). Gift Aid and relief-at-source pension contributions no longer come off. I re-ran my probe (2026, £18,000 profit, £8,000 finance costs): with and without £3,000 of Gift Aid, £5,430 is relieved and £2,570 carried forward. The new YAML case pins this. |
| 2. Direction of the no-receipts fallback | Closed | The description now calls the revenue figures upper bounds. It gives a lower bound from giving every survey-reported landlord receipts equal to profit: Enhanced FRS +£0.18bn (2025) to +£0.21bn (2030), Microcosm +£0.33bn to +£0.40bn. That construction is a valid lower bound. The allowance is worth max(0, £1,000 − expenses), which is largest when expenses are zero, and at zero expenses it reproduces main's min(profit, £1,000). |
| 3. Rental income as capital in the legacy means tests | Closed by pointer | #1995 (Max, draft, "Treat income derived from capital as capital in the legacy means tests") is the right home, and the description says so. Tax credits keep the reg. 11(2A) deduction. |
| 4. The 22% rate from 2027-28 | Closed | The variable cites FA 2026 Sch. 1 para. 40, which substitutes "PBR" for "BR" in s. 274AA(5) and s. 274C(2), and s. 6(8) gives effect from 2027-28. The Schedule's legislation.gov.uk page resolves. I didn't re-read the para. 40 text myself; María quotes it in her reply. |
Notes, no change needed here:
- The relief of £486 in the Gift Aid case. This comes from how the model already treats Gift Aid, not from this PR. The Step 6 limit (
tax_left=income_tax_pre_chargesless the other reductions) uses the model's Step 5 tax, and the model deducts Gift Aid from taxable income: £1,086 of tax without the gift, £486 with it. In law, Gift Aid extends the basic-rate band rather than reducing a basic-rate taxpayer's tax, so the Step 5 tax would stay £1,086 and the reduction would be £1,086. Income tax is £0 either way, and the costs relieved and carried forward don't depend on it. It would only matter for a basic-rate landlord whose remaining tax is less than the reduction. The model-wide Gift Aid treatment is a separate issue. other_deductionsas Step 2. It maps SPIMOTHDED + DEFICIEN.MOTHDED's components (qualifying loan interest, annuities and similar) are Step 2 reliefs under ITA 2007 s. 24. I couldn't confirm thatDEFICIEN, deficiency relief on life-policy gains (ITTOIA s. 539), is given at Step 2 rather than as a reduction. If it isn't, subtracting it understates adjusted total income slightly for the few records that hold it.
The pension caveat in the code comment is right: net-pay contributions are already out of employment income, while pension_contributions_relief mixes them with relief at source. Treating them all as relief at source overstates adjusted total income only for net-pay members whose relief is capped by adjusted total income, which needs both a mortgage-financed let and very low other income. That's small.
Checks at this head, run locally from the PR worktree:
policyengine-core teston the three property YAML files: 38 passed.- The full
gov/hmrc/income_taxYAML directory: 210 passed. test_property_income_properties.py: 6 passed.- CI: 7/7 green.
2.123.0 carries PolicyEngine/policyengine-uk#2172: property_rental_income, property_finance_costs and property_finance_costs_brought_forward, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit. The lock's UK side moves exactly to 2.123.0 (uv lock --upgrade-package policyengine-uk==2.123.0) and nothing else moves: policyengine-core stays 3.32.19 on the UK side, which 2.123.0 accepts, and 3.32.5 on the US side (#1086's per-country pins). The UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0. The step from #1121's 2.122.2 also brings #2160, #2096, #2097 and #2144. Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs, the three property inputs uncovered) and the mapping reviewed against 2.123.0 (the property_income note quotes its new documentation, alignment still approximate; the liquid-asset reason holds unchanged), the spec's declared dependency and the H2 fixture's, the coverage manifest's source digests, and APPROVED_UV_LOCK_SHA256. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.123.0 carries PolicyEngine/policyengine-uk#2172: property_rental_income, property_finance_costs and property_finance_costs_brought_forward, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit. The lock's UK side moves exactly to 2.123.0 (uv lock --upgrade-package policyengine-uk==2.123.0) and nothing else moves: policyengine-core stays 3.32.19 on the UK side, which 2.123.0 accepts, and 3.32.5 on the US side (#1086's per-country pins). The UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0. The step from #1121's 2.122.2 also brings #2160, #2096, #2097 and #2144. Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs, the three property inputs uncovered) and the mapping reviewed against 2.123.0 (the property_income note quotes its new documentation, alignment still approximate; the liquid-asset reason holds unchanged), the spec's declared dependency and the H2 fixture's, the coverage manifest's source digests, and APPROVED_UV_LOCK_SHA256. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2027 has merged, so this brings the branch up to main. One conflict, resolved mechanically: main (#2172) renamed the step-one component property_income to property_income_after_finance_costs in tax_credits_applicable_income. This branch had moved that income calculation, unchanged, into tax_credits_current_year_income, so the rename now lands there and tax_credits_applicable_income keeps the passport. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2170. Fixes #1900.
What was wrong
property_incomeis profit after allowable expenses and before residential finance costs: the SPI'sINCPROP, which both datasets use. Two rules that follow from that were missing.property_allowance_deductionreturnedmin(property_income, £1,000). The allowance replaces expenses rather than adding to them (ITTOIA 2005 s. 783BH(3): "No relevant expenses are brought into account"), and it is measured against gross receipts. This is the property twin of the trading allowance bug fixed in Stop stacking the trading allowance on expenses already netted from profit #1881. The parameter also started in 2005-06, but the allowance has effect from 2017-18 (F(No.2)A 2017 Sch. 3 para. 13).other_tax_credits, which the enhanced FRS leaves at zero.The law
All read from the revised text on legislation.gov.uk on 6 October 2026.
What this PR does
New inputs (Person, year, all optional with default 0):
property_rental_income: gross receipts of the property businesses, excluding rent-a-room receipts. Zero, or less thanproperty_income, means unknown, as withself_employment_gross_receipts(Stop stacking the trading allowance on expenses already netted from profit #1881). It is uprated withproperty_income(per-capita GDP), so uprated receipts never fall below uprated profit.property_finance_costs: the year's costs of dwelling-related loans. Uprated by OBR mortgage interest.property_finance_costs_brought_forward: the s. 274AA(4) amount. Uprated with the costs.All three are in
uprating_indices.yamlas well as the class attribute.property_incomekeeps its meaning and is relabelled "property income", with documentation saying what it is.New and rewritten formulas:
property_allowable_expenses: receipts less profit, where receipts are known.deductible_property_finance_costs: (1 − disallowed share) × costs. This is nil from 2020-21.property_receipts_within_allowance: receipts at most £1,000, or without receiptsproperty_incomeat most £1,000.property_incomeis before finance costs, so receipts are never below it.property_allowance_deduction_if_used: Stop stacking the trading allowance on expenses already netted from profit #1881's formula. With receipts known it ismax(0, min(profit, £1,000 − expenses)). Without them, full relief applies only where profit is at most £1,000, and there is no stacking above it.uses_property_allowance: the choice between the two routes (next section).property_allowance_deduction: the deduction if the allowance is used, otherwise nil.taxable_property_income: profit less any deductible finance costs and the allowance deduction, floored at nil.property_finance_costs_relievable,property_finance_costs_relieved(the s. 274AA amount, nil on the allowance route; adjusted total income takes off the Step 2 reliefs in the model, gifts of shares to charity and other deductions, and the personal and blind person's allowances, but not Gift Aid, covenanted payments or pension relief),property_finance_cost_relief(the rate times the amount relieved, limited to the Step 5 tax left after the person's other Step 6 reductions) andproperty_finance_costs_carried_forward.property_income_after_finance_costs: property income less finance costs, floored at nil for a profit. It replacesproperty_incomein the means tests that count it: tax credits, Housing Benefit, Income Support, Pension Credit and council tax reduction.Parameters:
gov.hmrc.income_tax.reliefs.property_finance_costs.disallowed_share: 0, then 25%, 50%, 75% and 100% from 2017-18. The formulas use it, so setting it to 0 is the "restore mortgage interest relief" reform; a YAML case pins this.property_finance_cost_reliefis appended toincome_tax_subtractions. The relief rate readsrates.property.basic, which is 20% (the basic rate) until 2026-27 and 22% from 2027-28.How the route is chosen
Universal Credit and the means tests
uc_income_tax_on_earningstakes every Step 6 reduction off the tax on earnings first. The finance-cost reduction is given on, and limited by, property profits, so it now comes off the tax on property first. A landlord's finance costs no longer cut the UC deduction for tax on their earnings. A YAML case checks this.property_income_after_finance_costs.Where this departs from the issue
Revenue effect
Real
Microsimulationruns on 6 October 2026,main4ec7ef1 (2.122.2) against this branch, years 2025-26 to 2030-31. Two published datasets were used: the Enhanced FRS 2024-25 (policyengine-uk-data 1.57.3, sha256ef34c1ae…) and Microcosm UK (microcosm_uk_2024_25.h5, sha256aa31bdf6…). Neither carries receipts, finance costs orother_tax_credits. So on today's data the change is the allowance fix alone.The figures below are upper bounds.
household_is_spi_synthetic). In this run every survey-reported landlord gets receipts equal to profit, i.e. no expenses, so the allowance gives them its full partial relief. That is the most it could be worth to them, and for them it reproducesmain.Enhanced FRS
Microcosm UK
main's Marriage Allowance rule: a landlord with more taxable profit has less unused allowance to transfer, and UC deducts the earner's extra tax.The finance-cost reduction, illustrated (not an estimate)
property_finance_costs= k × profit. k is set so that the 2024-25 total is either £12.82bn (residential finance costs declared, HMRC Property Rental Income Statistics 2026, all entities) or £5.77bn (costs that got relief, SPI 2022-23). The same k applies in later years.Scripts, logs and per-person arrays are kept locally.
Tests
YAML.
policyengine-core test policyengine_uk/tests/policy -c policyengine_uk: 2,598 passed.reliefs/property_finance_cost_relief.yaml(21, including Gift Aid not reducing adjusted total income),allowances/property_allowance_deduction.yaml(11),household/income/property_income_after_finance_costs.yaml(6, including two Housing Benefit cases), one UC case inuc_earnings_deductions.yaml, and one inallowances.yaml.Updated expectations. 15 existing cases encoded the stacking.
taxable_property_income.yaml(3). They now supply receipts with no expenses, so the allowance applies under the law and the arithmetic is unchanged.allowances.yaml(a receipts version is added beside it) and the £50,000 case intaxable_property_income.yaml.Properties.
pytest policyengine_uk/tests/test_property_income_properties.py: 6 Hypothesis properties, 30 examples each, in 2027-28. Five use 42 single people per example, a third of them Scottish; the sixth uses 12 married couples.Across the 30 examples, 265 person-cases faced a real choice: 163 took the allowance, 102 kept expenses, and 35 elected out of full relief.
Mutation checks. Each mutant is applied to the branch and run against the new YAML files and the property tests.
main's formula), always taking the allowance, never taking it when a reduction is at stake, no Step 5 limit, carrying this year's costs forward on the allowance route, no adjusted total income limit, UC deducting the reduction from tax on earnings, Scottish relief at 20% from 2027-28, and the tie-break.Python tests on the touched surface. 2,026 passed and 2 xfailed (both pre-existing). Files: the property, UC (claimant income, earnings deductions, income from capital, State Pension), means-test income, CTR Pension Credit, Housing Benefit (earnings disregard, pension age), trading allowance and Pension Credit reported capital property tests, plus
code_health/and the parameter description, metadata and fiscal-year tests. The rest of the pytest suite is left to CI.Lint.
ruff format --check .andruff check .are clean.Docs. The property allowance row in
income-tax.ipynbwas edited by hand, as Stop stacking the trading allowance on expenses already netted from profit #1881 did for the trading allowance, andgrowthfactors.mdlists the new inputs.make documentationwas not run.Review round 1 (Vahid, at 9112334): addressed in 747a4a3
allowancesoff, including Gift Aid and pension relief. It now takes off the Step 2 reliefs and the personal and blind person's allowances only, and a Gift Aid YAML case pins this. One caveat:pension_contributions_reliefdoes not separate net pay arrangements from relief at source, and it is treated as relief at source.property_finance_cost_reliefcites both.Independent review
A separate, read-only Claude session reviewed the branch against the statute, reproducing each finding with a script. It found four should-fix issues and three nits, and all are fixed here.
property_income, which receipts are never below.It confirmed the readings of ss. 272A, 274A-274AA and 783BE-783BL, 22% for Scottish taxpayers from 2027-28, the parameter dates and the s. 29 limit.
Known limits (not changed here)
market_income,household_market_income,hbai_household_net_income) still countsproperty_incomebefore finance costs. The FRS rent concept is net of mortgage interest (its show card lists mortgage payments and loan interest). So once finance costs are supplied these could subtract them. That is a definitional call for HBAI comparability, so it is left for a follow-up.income_tax_subtractions. So once Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963 lands, the Marriage Allowance reduction comes first automatically. Model Marriage Allowance as the statutory s.55B transfer and Step 6 reduction #1963's own limit should keep its explicit list, which avoids a cycle.taxable_property_income, which this PR uses as the adjusted profits. Under s. 800 those receipts are profits of the same property business, so that is right.property_finance_costsfrom the SPI'sLLIR_RESTRICT_AMT_TOT, which holds the costs that got relief. Microcosm UK will supply receipts and costs (UK: model landlord property income on the taxable (net of expenses) concept, not rent received microcosm#1106).axiom: needed
🤖 Generated with Claude Code