Repository navigation
Conversation
The Family Resources Survey records the rent a boarder or lodger pays the householder only on the payer (CVPAY). New person inputs `rent_paid_as_boarder` and `rent_paid_as_lodger` carry it, and `rent_from_boarders_and_lodgers` gives it to the household head. - Income tax: rent-a-room relief (ITTOIA 2005 ss. 784-802). Receipts up to the limit (£3,250 from 1992-93, £4,250 from 1997-98, £7,500 from 2016-17; halved where someone else in the household also receives rent from the home) are not taxed; above it the excess is property income (the s. 800 election), with no property allowance (s. 783BB(2)). `sublet_income` counts as rent-a-room receipts too. - Legacy means tests: `legacy_benefits_home_letting_income` (#1995) now also counts lodger rent less £20 a week (per person at pension age, per lodger family at working age) and board and lodging less £20 and half the excess per boarder (IS Sch 9 paras 19-20; HB Sch 5 paras 22, 42; HB (SPC) Sch 5 paras 9-10; SPC Sch IV paras 8-9; CTR Sch 5 paras 9-10). Tax on counted letting income is deducted (`rent_a_room_income_tax`). - Tax credits count the taxable rent-a-room income (SI 2002/2006 reg 11(2)); Universal Credit counts none of it (reg 66(1)). - People paying the householder rent are not non-dependants for UC, HB or CTR (UC Sch 4 para 9(2)(d); HB reg 3(2)(e)(i); CTR reg 9(2)(e)). - Rent paid between household members is not household income; `sublet_income`, from outside the household, now is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Coordination note from #2062 (issue #2059), which makes every programme read one household head. This PR's Whichever of the two PRs lands second needs these readers switched:
#2062 adds a test, |
Rent-a-room tax moves from capital-source tax to counted tax in the rewritten legacy_means_test_income_tax; lodger and boarder receipts use the claimant-or-partner pension-age switch and count for the head's benefit unit when the head is its claimant or partner. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of #2002: - UC earned income stops deducting the tax on rent-a-room income: UC does not count the rent (reg 66(1)) and reg 55(5)(b) allows only tax in respect of the employment. New rent_a_room_income_tax_after_reductions is that tax less its pro-rata share of Step 6 reductions. - Council tax reduction does the same where it excludes the rent: the Scottish working-age scheme and Welsh applicants with a UC award, whose income is the UC assessment (WSI 2013/3029 reg 3, Sch 6 para 9); home-letting income is no longer added for the latter. - Property tests: the rent-a-room limit must be halved exactly when two people in the household receive rent; uncounted rent leaves UC earned income and the excluded CTR routes unchanged; partner sublet income in the closed form; no lambda (ruff E731). - YAML: UC earned income with a lodger above the limit; Welsh CTR for a UC recipient. - Documentation: commercial and non-relative assumption for the non-dependant exclusion, multiple heads, annual inputs over 52 weeks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
#2062 is now on This PR still adds formulas that read the raw flag:
Each needs to read the resolved head instead:
|
rent_from_boarders_and_lodgers and legacy_benefits_home_letting_income read is_resolved_household_head and benunit_contains_household_head, as every other programme does on main, instead of is_household_head. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KubCAd9d7yLvRkRTg
Hand-worked cases: the finance-cost reduction capped at the property tax on income from capital; taxable rent-a-room income reaching total income, adjusted net income and post-tax income once; UC's tax on earnings unchanged by the rent; and council tax reduction on the Universal Credit route and the Scottish working-age scheme, with and without pay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KubCAd9d7yLvRkRTg
pays_rent_to_householder holds for the boarder or lodger who pays and, as an assumption across schemes (HB Regs 2006 reg 8(1)(b)), for their partner; nobody else in their benefit unit. The HB, UC and household-head non-dependant gates and the UC Pension Credit exemption read the new benunit_is_liable_for_household_rent, which is false for a family whose only rent is paid to the householder. Adds the review's case through final Housing Benefit, UC and CTR cases, and person-level properties. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KubCAd9d7yLvRkRTg
A lodger paying 30,000 leaves 22,500 taxable, above the personal allowance, so council tax reduction on the Universal Credit route leaves its 1,986 without earnings out of the deducted tax. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6KubCAd9d7yLvRkRTg
|
Generated by Claude Code |
|
Generated by Claude Code |
|
Generated by Claude Code |
|
Ready for hub review Head Commits on top of
Restart check
C1: person-level liability
Who now sees the non-payerI read each reader and left each one as the law has it.
For the hub to decide. The ruling keeps everyone in the payer's family except the payer and partner, so a lodger's dependent child now counts too. A lodger's 10-year-old turns The mergeAll 14 conflicts are resolved as the brief says:
What else the merge moved:
UC finance-cost route. The rent reaches Hand-worked CTR cases (pay £30,000, a lodger paying £15,000):
Other auto-merged formulas. None read wrongly. Tests (this head unless stated)
Differentials (scratch)
Mutations (scratch copy; the 29 YAML cases in the two boarder and lodger files, and the 12 properties at 10 examples)
The UC-route mutant first survived both: in the earlier cases the rent fell inside the personal allowance without pay. Judgment calls
Skipped
Generated by Claude Code |
|
Thanks for this case. A lodger's children now count as the householder's non-dependants too, so in PolicyEngine they can take a head under 35 off HB's shared accommodation rate. Universal Credit's Sch 4 para 9(2)(g) leaves them out, and #2016, the fix for #2011, needs to apply that here. GitHub shows a conflict because #1995's branch has four newer commits, which we'll merge in next. |
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed adopted head f7788dc97a8d1ad4dc7aa136281ec0abadcaaf3e. C1 is resolved, but new C2 requires changes. Overall review remains PARTIAL because of the completion gaps below.
C2 — Exclude the commercial lodger's qualifying young person from the host's UC bedrooms. The new person-level rule in is_non_dependant_of_household_head.py includes the lodger's non-paying child/QYP. UC Schedule 4 paragraph 9(2)(d)/(g) excludes the commercial lodger and their child/QYP where nobody in the host's extended benefit unit is responsible. That young person therefore supplies no extra UC bedroom under paragraphs 8/10.
Executed 2026 case: private London tenant aged 40, wages £15,000, rent £18,000; unrelated commercial lodger aged 40, wages £20,000, paying the host £5,200, with their 18-year-old qualifying young person in their own benefit unit. The lodger parent has main responsibility; the host has none. Actual code counts two bedrooms, housing element £18,000, final UC £15,223.02. An otherwise identical source-rule-only child exclusion gives one bedroom, housing element £15,546, UC £12,769.02. Household income changes by the same £2,454/year. Host earnings avoid a benefit-cap-masked comparison.
Preserve the corrected non-paying-adult result, apply UC's child/QYP membership rule at the appropriate UC reader, and add a final-UC regression for this case. The deferred #2016 interaction does not resolve the current head. HB uses its own definition; I am not asserting the separate HB child observation is wrong using UC law.
Validation: the corrected adult-son case now gives HB £7,053.80 and deduction £3,346.20, resolving C1. 87 of 88 selected checks passed, with zero failures; one changed HB property was unfinished at the single 540-second timeout, and no exact-head hosted test completion is available. Scottish pension-age person-level parity corroboration also remains incomplete: the actual #402 addendum explicitly leaves the SSI 2012/319 module pending/unquoted, without supported encoded-correct corroboration. This is an evidence gap, not proof that an existing module is absent or wrong.
Only #1995's older 7381a46c7 is integrated here; its current fixes and the declared stack/readiness conditions also need to be accounted for before final approval.
|
Picking this up for the UK hub. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
|
Picking this up for the UK hub as brief 1016, which replaces brief 989. Reply here if you're mid-change and I'll stop. Generated by Claude Code |
…it unit UC Regs 2013 Sch 4 para 9(2)(g) leaves out of the renter's non-dependants a child or qualifying young person for whom no one in the renter's extended benefit unit is responsible. A boarder or lodger and, in the model, their partner leave that unit under para 9(2)(d), so their children and qualifying young people leave it too. is_uc_non_dependant_of_household_head applies that rule on top of is_non_dependant_of_household_head, taking the claimant and partner of a child's own benefit unit as responsible for them. LHA_allowed_bedrooms, lha_renter_has_non_dependant and uc_non_dep_deductions read it; Housing Benefit and council tax reduction keep the shared flag. lha_renter_has_non_dependant now counts every Universal Credit non-dependant of another family, not only its claimants and partners, so a lodger's non-paying adult son takes a householder under 35 off the shared accommodation rate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QmsZJW5Q229j9RMjeKuoC2
Two files conflicted. legacy_benefits_home_letting_income.py: #1995 moved the sub-tenant rule into a helper, home_letting_income, so that council tax reduction can apply it to its own applicant and partner (council_tax_reduction_home_letting_income). This branch had added the rent boarders and lodgers pay the household head. The helper now holds both parts, and each reader passes the people whose receipts count and its pension-age test: the legacy reader the benefit unit's claimant and partner with State Pension age, the council tax reduction reader the applicant and partner with council_tax_reduction_pensioner. A household head who applies alone for council tax reduction therefore counts the rent boarders and lodgers pay her there, but not in her benefit unit's legacy measure. council_tax_reduction_applicable_income.py: #1995 floors the counted members' deducted income tax at nil; this branch subtracts, where the scheme does not count the rent, the tax the rent would bear without earnings. The formula subtracts first and floors the result, so the deduction never adds tax to income. Two YAML cases pin the council tax reduction reader: a head applying alone with a lodger couple, and the same head in her own benefit unit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QmsZJW5Q229j9RMjeKuoC2
In Scottish council tax reduction for people over the qualifying age for State Pension Credit, a lodger liable on a commercial basis falls within reg 3(2)(e); the model treats the lodger's partner as liable too. The lodger's son and child, who pay nothing and belong to no family of the head's, count as non-dependants under reg 3(1), and the model flags the son, aged 18 or over, for a deduction. Also name the actors in the new YAML comments. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QmsZJW5Q229j9RMjeKuoC2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QmsZJW5Q229j9RMjeKuoC2
|
Generated by Claude Code |
|
Generated by Claude Code |
|
Generated by Claude Code |
|
Ready for hub review Head Commits on top of
Restart check
C2: a commercial lodger's child and the UC extended benefit unit
Mutation and revert checks
The floor-order mutant survives: the order matters only where one member's earnings move a Step 7 charge off another and the counted members' deducted income tax, less the rent's tax without earnings, falls below nil. No case builds that, and I didn't find one in the time. The #1995 merge (
|
| Person | Model | Reg 3 | Agree |
|---|---|---|---|
| The payer | no non-dependant; CTR £1,630.40 | excepted, (2)(e) | yes |
| The payer's partner, paying nothing | no non-dependant; CTR £1,630.40 | excepted only if liable, (2)(e) | only under the model's partner assumption |
| The payer's child of 10 | no deduction (the flag starts at 18); £1,630.40 | a non-dependant, (1) and (2)(a); unquoted rules set the deduction age | status yes, deduction not checked |
| The payer's earning child of 18 | deduction £1,060.80; CTR £569.60 | a non-dependant | yes |
| A non-paying adult son of 30 | deduction £1,060.80; CTR £569.60 | a non-dependant | yes |
| The head's daughter of 40 paying £5,200 (close relative) | no non-dependant; CTR £1,630.40 | a non-dependant, (3)(a)(i); paying nothing she carries £1,060.80, CTR £739.20 | no |
I fixed nothing here. The partner turns on the agreement, which the words don't settle. The close-relative and non-commercial departure needs an input the model lacks, so the fix falls outside the CTR readers. I also found a reg 3(2)(a) departure outside the five runs. A head of 70 who applies alone, sharing a benefit unit with a couple of 25 (one earning £5,200 over 20 hours) and their baby, gets CTR of £1,800 with no deduction, although her means test treats her as single. test_household_head_agreement_properties.py pins that rule, so I left it. "Known interactions" lists all three. boarders_and_lodgers_non_dependants.yaml:678 pins the agreeing statuses (flags only, so #2007's CTR scale can't break it).
Tests at a107b225c
- YAML (
policyengine-core test):gov/dwp/legacy_means_tests/115 passed (boarders_and_lodgers.yaml22,boarders_and_lodgers_non_dependants.yaml15);gov/hmrc/income_tax/rent_a_room/7 (includesrent_a_room_relief.yaml, the third YAML file this PR changes);rent_of_sharers_boarders_and_lodgers.yaml19;resolved_household_head.yaml9; HBnon_dep_deduction/53; UChousing_costs_element/20 (UCnon_dep_deduction/13 of them);council_tax_reduction/331;housing_benefit_meals_deduction.yaml8. At8236c3a1c, all offinance/benefit/family/passed (1,690). I ran these at685544ff2;a107b225cchanges one YAML comment. - Python (
-n 4,uv sync --frozen --extra dev):test_boarder_lodger_rent_properties.py12 passed (303 s). The other five (test_legacy_means_test_income_from_capital_properties.py,test_rent_of_sharers_boarders_and_lodgers_properties.py,test_household_head_agreement_properties.py,test_council_tax_reduction_claimant_properties.py,test_uc_lodger_child_extended_benefit_unit_properties.py) were still running when I posted this; I'll edit this comment with their counts if they finish before the session ends. The new property passed at8236c3a1c(1 test, 156 s). policyengine_uk/tests/code_health -n 4: still running when I posted this; I'll edit in the count.- Checks:
uvx ruff@0.17.2 format --check .2,200 files already formatted;ruff check .andruff check --select F811,F821 policyengine_ukclean;git diff --check 7ba0ea7af..HEADclean..github/check_fix_pr.pyon the posted title and body, aspr_fix_evidence.yamlruns it: PASS against7ba0ea7af(not a fix PR there) and PASS againstmain(valid reproducer evidence, 20 changed executable tests). git merge-tree --write-tree --name-only HEAD:7ba0ea7afclean;origin/main(9b456bda6) clean; Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016983488065:LHA_allowed_bedrooms.py,lha_renter_has_non_dependant.py; Give benefit-unit members aged 16 or over a bedroom under LHA rules #20102d362d2fc: 9 files (CHANGELOG.md,pyproject.toml,housing-benefit.ipynb,pension_credit_income.py,trading_allowance_deduction.py, all also conflicting with7ba0ea7afalone, plusLHA_allowed_bedrooms.py,housing_benefit_individual_non_dep_deduction_eligible.py,uc_individual_non_dep_deduction_eligible.py,uc_non_dep_deductions.py); Fix HB and national CTR non-dependant deductions #2007fde435bd3: the same five from Treat income derived from capital as capital in the legacy means tests #1995 plushousing_benefit_individual_non_dep_deduction_eligible.py; Charge non-dependant deductions within the claimant's benefit unit #2017b3e0d76b8: the five plushousing_benefit_individual_non_dep_deduction_eligible.py,uc_individual_non_dep_deduction_eligible.py,uc_non_dep_deductions.py. Atf7788dc97, Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016 merged cleanly; C2 addsLHA_allowed_bedrooms.pyandlha_renter_has_non_dependant.pythere,LHA_allowed_bedrooms.pyanduc_non_dep_deductions.pywith Give benefit-unit members aged 16 or over a bedroom under LHA rules #2010, anduc_non_dep_deductions.pywith Charge non-dependant deductions within the claimant's benefit unit #2017.
Skipped
- Measured impact. No dataset here has the two inputs, so I didn't rerun the microsimulation; the body keeps the
6df59cdb4figures, labelled, and says what this head can move. - Laws nobody quoted. UC reg 4(6)(a) (looked-after children), Sch 4 para 28 (specified renters), SSI 2012/319 reg 11 and its deduction rules. I relied on none of them, and left Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016's looked-after part to Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016.
- Property runs for most mutants. I ran the property only for the no-para-9(2)(g) mutant, as the brief asked.
Judgment calls
- Going ahead despite
pensioner-ctr-disability-premiums-9b4amp(Restart check). - Widening
lha_renter_has_non_dependantto every UC non-dependant of another family (C2 above). - Keeping a child whose benefit unit has no claimant or partner as a non-dependant.
- Subtracting the uncounted rent's tax before Treat income derived from capital as capital in the legacy means tests #1995's floor.
- The CTR reader takes this PR's lodger rules under
council_tax_reduction_pensioner, not State Pension age. - In the addendum, beyond quoting reg 3 and adding para 9(2)(g), I rewrote the lines that called SSI 2012/319 unquoted or pending, added two companion cases (the non-paying daughter control and the Scottish pension-age family) and output 6, and changed "two households" in the opening. Each follows from the two additions.
- In the body I replaced the reviewer's name in the case labels with descriptions of the households.
Generated by Claude Code
#1995's head-alone property asserted that the couple's rent never moves the household head's council tax reduction income. With this branch's rent-a-room relief, the couple's first receipts halve the head's limit, so part of her own letting rent becomes taxable and the tax the scheme deducts rises: Hypothesis found a head of 65 in the North East with £5,254.85 of rent whose income fell by £300.97 when the couple's rent rose from nil to £1. The equalities now hold where her taxable rent-a-room income stays the same, the couple's rent never raises her income, and an example pins that household. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QmsZJW5Q229j9RMjeKuoC2
juaristi22
left a comment
There was a problem hiding this comment.
Re-reviewed adopted head 3995b274fa19fd5df0a84f420b4fe404b19c4634, including the #1995/main integration. COMPLETE — C1 and C2 are resolved; no findings or material evidence gaps.
The new UC-specific selector excludes a commercial lodger’s qualifying young person from the renter’s UC bedrooms while preserving the generic Housing Benefit/CTR classification. The positive-UC final-result regression confirms the £2,454 correction through UC and household net income; the non-paying adult Housing Benefit case remains correct.
All 80 selected checks passed: 72 YAML cases, seven properties and one final-output diagnostic, with no failures or skips. The previously unfinished Housing Benefit property now passes. These are current-head results on the matching Core 3.34.1 environment, distinct from historical validation.
The actual Axiom #402 addendum now supplies the missing Scottish pensioner definition and the UC bedroom provisions; official text was independently checked. Existing input/relationship assumptions and data-release limitations remain qualified. Approval awaits readiness and applicable exact-head CI.
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; 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. Checks failing on both base and head (1)
Counted-once checkEach of 92 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
|
juaristi22
left a comment
There was a problem hiding this comment.
Approved at 3995b274fa19fd5df0a84f420b4fe404b19c4634.
Review status: COMPLETE — no remaining findings or material evidence gaps. C1 and C2 remain resolved. The preceding review’s 80 passing local checks at this head remain valid; no local tests or models were rerun.
The updated description was checked independently against primary CI evidence:
- Code changes run 41889276464: 5,812 YAML passes; 12,218 Python passes, two expected failures and 61 skips. The code-health/property counts and shard 5 retry explanation are supported: its first test step passed before the outcome-log upload failed.
- Aggregate impact run 41889276386: zero reported changes for 2025–2031 in the comparable metrics on the named certified dataset. This comparison uses the report’s DSA privacy adjustments; the unchanged VAT level check remains a limitation. The pending boarder/lodger input mapping and the qualifications on historical population estimates remain explicit.
The PR is ready for review and all 20 latest CI checks pass at this exact commit. Head, description, human feedback, source dependencies and applicable branch rules were refreshed before approval.
Summary
This PR builds on #1995, which stops counting income from capital in the legacy means tests and adds
legacy_benefits_home_letting_incomefor rent from letting part of the home. #1995 landed inmainat7ba0ea7af.Stack and readiness. This PR targets
main, and this head mergesmainat5c7744144.This PR models the rent a householder receives from boarders and lodgers who live in the household. The Family Resources Survey records that rent only on the payer, as CVPAY (PolicyEngine/policyengine-uk-data#506 adds it as
rent_paid_as_boarderandrent_paid_as_lodger). This PR also routessublet_income(rent from a sub-tenant outside the household) through income tax.What changes
Who receives it.
rent_from_boarders_and_lodgersgives the household head (is_resolved_household_head) the rent that household members outside the head's benefit unit pay.Income tax: rent-a-room relief. PolicyEngine charges no income tax on receipts up to £7,500 a year. Above that, it charges the excess as property income, assuming the s. 800 election. The limit halves where someone else in the household also receives rent from the home. The receipts get no £1,000 property allowance.
Legacy means tests. Income Support, Housing Benefit, Pension Credit and council tax reduction count the rent less these statutory disregards:
They deduct the tax on counted letting income like the tax on other counted income:
legacy_means_test_income_taxputs the rent-a-room share of property income tax on the counted side. Treat income derived from capital as capital in the legacy means tests #1995'shome_letting_incomenow holds both the sub-tenant rule and this PR's boarder and lodger rules, and each reader passes the people whose receipts count:legacy_benefits_home_letting_incomethe benefit unit's claimant and partner, under the State Pension age test;council_tax_reduction_home_letting_income(Treat income derived from capital as capital in the legacy means tests #1995) the council tax reduction applicant and partner, undercouncil_tax_reduction_pensioner. So councils count the rent boarders and lodgers pay a household head who applies alone, though the legacy measure of the head's benefit unit counts none of it.Where a programme doesn't count the rent. Universal Credit doesn't count it, and deducts only the tax on earnings (
uc_income_tax_on_earnings, which takes earnings as the lowest slice). The rent changes that deduction only through the cap on property finance-cost relief. Council tax reduction leaves the rent out on the Universal Credit route (Treat income derived from capital as capital in the legacy means tests #1995'suniversal_credit_route) and in the Scottish working-age scheme. There PolicyEngine treats the rent as uncounted income, as Treat income derived from capital as capital in the legacy means tests #1995 treats income from capital. It leaves out of the deducted tax the tax the rent would bear without earnings (rent_a_room_income_tax_without_earnings), and keeps the extra tax that earnings cause on it. The formula subtracts that tax from the counted members' deducted income tax and then applies Treat income derived from capital as capital in the legacy means tests #1995's floor at nil, so the deduction never adds tax to income.Tax credits count the taxable rent-a-room income (
tax_credits_current_year_income).Non-dependants. A boarder or lodger pays the householder on a commercial basis, so PolicyEngine leaves them out of the householder's non-dependants for UC, HB and CTR (every local CTR scheme in the model reads this flag). PolicyEngine decides that liability person by person. The payer and the payer's partner leave the non-dependant count, and anyone else in their benefit unit who pays nothing, such as an adult son, stays in it (
pays_rent_to_householder,benunit_is_liable_for_household_rent).Universal Credit's extended benefit unit. For Universal Credit, PolicyEngine also leaves out of the householder's non-dependants a boarder's or lodger's child or qualifying young person, for whom nobody in the householder's extended benefit unit has responsibility (UC Sch 4 para 9(2)(g);
is_uc_non_dependant_of_household_head). Such a child supplies no bedroom (LHA_allowed_bedrooms), no housing cost contribution (uc_non_dep_deductions), and doesn't take a householder under 35 off the shared accommodation rate (lha_renter_has_non_dependant). A child whose parent pays nothing stays a non-dependant.lha_renter_has_non_dependantnow counts every Universal Credit non-dependant of another family, not only its claimants and partners, so a lodger's non-paying adult son takes a single householder under 35 off the UC shared accommodation rate, as he already did for Housing Benefit. The Housing Benefit and CTR formulas keepis_non_dependant_of_household_head.Household income. Household market and net income leave out rent that members of a household pay each other. Market income, household market income and HBAI net income now count
sublet_income, which comes from outside the household, alongsideproperty_income_after_finance_costs.The law
We read these provisions in their revised text on legislation.gov.uk on 1 October 2026, the non-dependant provisions on 2 November 2026, and UC Sch 4 paras 8 to 10 and SSI 2012/319 reg 3 (as in force from 1 April 2026) on 3 November 2026.
Modelling choices
is_resolved_household_head: the FRS household reference person in the data). The FRS asks the CVPAY questions only about people not related to the HRP, so payers have no family relation to the householder. The model treats every such arrangement as commercial.pays_rent_to_householderholds for a person outside the head's benefit unit who pays, and for a claimant or partner in a benefit unit where a claimant or partner pays. HB Regs 2006 and HB (SPC) Regs 2006 reg 8(1)(b) treat the partner of a liable person as liable. UC and the CTR schemes have no such words, and the data hold no agreement, so PolicyEngine applies the same rule in every scheme, assuming a couple's room binds both members. A payer other than a claimant or partner, such as a qualifying young person, makes nobody else liable.uc_non_dep_deduction_exemptalready does. Where that benefit unit has no claimant or partner, PolicyEngine can't tell who has responsibility, and keeps the child a non-dependant. A claimant or partner never counts as anyone's child.rent_a_room_income_taxto the pro rata share of property income tax that falls on taxable rent-a-room income, because nothing in the law orders the two.legacy_means_test_income_tax(Treat income derived from capital as capital in the legacy means tests #1995) takes the residential finance-cost reduction off the tax on property income first and shares the other Step 6 reductions pro rata. This PR moves the rent-a-room share from the capital side to the counted side.property_income_tax − rent_a_room_income_tax), so the capital side never goes negative. Any excess joins the reductions shared pro rata. ITTOIA 2005 s. 274AA limits the relief by property profits, which include taxable rent-a-room income, so it can exceed the tax on the rest of the property income.rent_a_room_income_tax_after_reductionsreads the same split aslegacy_means_test_income_tax(legacy_means_test_tax_split), after the finance-cost reduction, so for a person whose only counted income comes from rent-a-room receipts, the two give the same figure.rent_a_room_income_tax_without_earningsreadsrent_a_room_income_tax_after_reductionson the same branch without earnings, with the same earnings sources and early return, as Treat income derived from capital as capital in the legacy means tests #1995'slegacy_means_test_uncounted_income_tax_without_earnings.property_incomeandsublet_incomedo. PolicyEngine has no national private rent index among its parameters.sublet_incomekeeps Treat income derived from capital as capital in the legacy means tests #1995's single-occupier disregard.Invariants and tests
test_boarder_lodger_rent_properties.py(Hypothesis) generates households with one or two members in the head's unit and up to two paying units. A paying unit holds one or two claimants or partners and possibly a third adult, neither claimant nor partner, each paying or not, with roles supplied (is_claimant_or_partner). It varies working and pension age, earnings, sublet income, tenure, region and a Housing Benefit claim, for 2025 and 2026. It checks:legacy_means_test_income_tax≤ income tax; 0 ≤rent_a_room_income_tax_after_reductions≤rent_a_room_income_tax; the capital side after reductions insidelegacy_means_test_income_taxnever goes negative (read throughlegacy_means_test_tax_split); and for a person whose only counted income comes from rent-a-room receipts,rent_a_room_income_tax_after_reductionsequalslegacy_means_test_income_tax(a separate generator varies savings, dividends, property income, finance costs and other tax credits in England and Scotland).pays_rent_to_householderequals, for every person, the predicate the test computes from the inputs.test_uc_lodger_child_extended_benefit_unit_properties.py(Hypothesis, 15 examples) generates a household head who claims Universal Credit, with possibly a partner and children of their own, one or two commercial lodger units (each with possibly a partner, a non-paying adult and a child), and possibly a non-paying family with a child, across four regions, two tenures and 2025 and 2026. It keeps everyone in the lodger units under State Pension age, so no lodger family receives Pension Credit. It checks:LHA_allowed_bedrooms), housing element (uc_housing_costs_element) and non-dependant deductions (uc_non_dep_deductions) unchanged, and the added person never counts as the head's UC non-dependant.test_household_head_agreement_properties.pyandtest_rent_of_sharers_boarders_and_lodgers_properties.pypin the non-dependant flag against the families liable for rent. Each now computes liability to the householder person by person from the inputs, intest_every_programme_reads_one_headandtest_non_dependantsrespectively; nothing else in those files changes.The YAML cases cover:
The adult-son case (Scotland, 2026-27). A household head of 60 has eligible rent of £10,400 a year. An unrelated lodger of 50 pays the head £5,200, and the lodger's son of 30, in the lodger's benefit unit, pays nothing and earns £15,600 over 20 hours. The son counts as the head's non-dependant, with an HB deduction of £64.35 a week, £3,346.20 a year. Counted home-letting income comes to £4,160, and final Housing Benefit to £7,053.80. Before the person-level rule, PolicyEngine read the whole family as commercial payers and paid Housing Benefit of £10,400.
The lodger's qualifying young person (London, Inner South East London, 2026-27). A private tenant of 40 earns £15,000, pays rent of £18,000 and claims Universal Credit. An unrelated commercial lodger of 40 earns £20,000 and pays the tenant £5,200; the lodger's son of 18, a qualifying young person in non-advanced education, lives in the lodger's benefit unit. Nobody in the tenant's extended benefit unit has responsibility for him, so the tenant gets one bedroom, a housing element of £15,546 (the one-bedroom rate) and Universal Credit of £12,769.02. At
f7788dc97, PolicyEngine counted him as a non-dependant aged 16 or over and gave two bedrooms, a housing element of £18,000 and Universal Credit of £15,223.02; the case fails there on all three.Tests at
3995b274f. This head mergesmainat5c7744144into25535f380, and no file changed on both sides since7ba0ea7af.test_dwp_published_rates.py, 1 intest_build_metadata.py). All ofpolicyengine_uk/tests/code_healthpassed (3,165), and so did the six property files:test_boarder_lodger_rent_properties.py12,test_legacy_means_test_income_from_capital_properties.py9,test_rent_of_sharers_boarders_and_lodgers_properties.py6,test_household_head_agreement_properties.py3,test_council_tax_reduction_claimant_properties.py3 andtest_uc_lodger_child_extended_benefit_unit_properties.py1. The run's second attempt reran shard 5, whose first attempt passed every test but failed to upload its outcome log.685544ff2withuv sync --frozen --extra dev:gov/dwp/legacy_means_tests/115 passed (boarders_and_lodgers.yaml22 andboarders_and_lodgers_non_dependants.yaml15 among them);gov/hmrc/income_tax/rent_a_room/7;rent_of_sharers_boarders_and_lodgers.yaml19;resolved_household_head.yaml9; HBnon_dep_deduction/53; UChousing_costs_element/20 (UCnon_dep_deduction/13 of them);council_tax_reduction/331;housing_benefit_meals_deduction.yaml8. Since then,a107b225chas reworded one YAML comment and25535f380has changed one property test.a107b225c,uvx ruff@0.17.2 format --check .(2,200 files already formatted),ruff check .andruff check --select F811,F821 policyengine_uk: clean.git diff --check 7ba0ea7af..HEAD: clean..github/check_fix_pr.pyon this title and body at3995b274f, aspr_fix_evidence.yamlruns it: PASS againstmainat5c7744144(no fixed fragment in this PR's own diff).Mutation check at
298a8ccba(before the merge of #1995's89bdbeed9; the rules it mutates did not change in that merge). We applied each mutant below to a copy of this branch and ran the 32 YAML cases and the property tests, with shrinking off.At
298a8ccbathe YAML cases caught all 12. At 10 examples per test, the property tests caught the three mutants that break an invariant on most households. The other nine change a rule only for particular household shapes, so the YAML cases cover those.Mutation check at
f7788dc97. We applied each mutant to a copy of the branch and ran the 29 YAML cases inboarders_and_lodgers.yamlandboarders_and_lodgers_non_dependants.yamland the 12 property tests (10 examples each, seed 0).person.benunit.any(paid > 0))benunit_is_rent_liablebenunit_is_rent_liableis_non_dependant_of_household_headreadsbenunit_is_rent_liableuc_non_dep_receives_pension_creditreadsbenunit_is_rent_liableThe YAML cases catch all 10. Only the case with a lodger paying £30,000 catches the UC-route mutant: in the others, the rent falls inside the personal allowance without pay, so nothing comes off either way. We ran the properties at
8410e1161, whose property tests matchf7788dc97's. The property tests miss the mutants that only change particular household shapes: the generator has no finance costs, no Pension Credit families among the payers and few UC-route applicants with rent above the personal allowance.Mutation check of this head's changes. We applied each mutant to a copy of the branch at the commit that added the rule it mutates, and ran the YAML files named in each row; for the first, also invariant 12 (15 examples, with shrinking). The first three rows ran at
8236c3a1c, the deduction row at685544ff2, and the last four at8d494ab9d; none of the mutated formulas changed after.is_uc_non_dependant_of_household_headreturnsis_non_dependant_of_household_headboarders_and_lodgers_non_dependants.yamllha_renter_has_non_dependantcounts only other families' claimants and partnersuc_non_dep_deductionsreadsis_non_dependant_of_household_headlegacy_means_tests/, UChousing_costs_element/,rent_of_sharers_boarders_and_lodgers.yaml)council_tax_reduction_home_letting_incomecounts only sublet income (#1995's helper as it stood)boarders_and_lodgers.yaml,boarders_and_lodgers_non_dependants.yaml,income_from_capital.yaml)council_tax_reduction_home_letting_incometakes the legacy State Pension age testlegacy_benefits_home_letting_incomecounts the head's receipt whatever the head's rolecouncil_tax_reduction/,legacy_means_tests/)The YAML cases catch the first seven. The deduction mutant survives because no child or qualifying young person reaches the UC deduction age of 21, so the two flags give the same deductions. The floor-order mutant survives because the order matters only where one member's earnings move a Step 7 charge off another and the counted members' deducted income tax, less the rent's tax without earnings, falls below nil; no case builds that household.
Measured impact
CI's Aggregate impact run 41889276386 compared this head with
mainat5c7744144on the certified enhanced FRS 2024-25 (policyengine-uk-data 1.58.1), for 2025-26 to 2031-32. It found no change in any year: no household's net income changed, and neither did any tax receipt, poverty rate or inequality measure. That dataset doesn't carry the boarder and lodger rent yet: PolicyEngine/policyengine-uk-data#506 addsrent_paid_as_boarderandrent_paid_as_lodger.We measured these at
6df59cdb4against #1995's89bdbeed9, and haven't rerun them on this head. We ran one 2026 Microsimulation per model version on the same dataset:87a5f50with production settings and seed 0. It matches a seed-0 build of its parent (Add Tax Credits statistics to validation page #503 head0812cd1) in every column of every table, household weights included, apart from the two new inputs. Its later commitee40d7aadds uprating rows and tests, and changes nothing that the data build's pinned model reads.89bdbeed9. This PR:6df59cdb4.Disclosure. We matched each enhanced-FRS record of a paying household to its survey household by its members' ages and FRS rent amounts. Every change falls inside those households. Each figure below rests on at least 10 survey households. We report no figure resting on fewer, nor any that would reveal one by subtraction, and no survey-household counts.
6df59cdb4against89bdbeed96df59cdb4in Housing Benefit, council tax reduction, Income Support or tax credit awards, Universal Credit unearned income, household market income, AHC poverty, or child poverty (BHC or AHC).What this head can move. The rent, rent-a-room relief, taxable income and income tax rows depend on rules this head leaves unchanged, apart from giving the rent to the resolved household head, the household reference person in the data. This head can move:
housing_benefit_has_non_dependant, wherever a paying benefit unit holds someone other than the payer, a claimant or a partner. FRS benefit units hold one adult or a couple plus dependent children, so this reaches a payer's dependent children and qualifying young people (aged up to 19), and a couple 20 or more years apart where the dataset does not supplyis_claimant_or_partner;is_claimant_or_partner. A payer's children and qualifying young people stay out of the UC extended benefit unit, as at6df59cdb4;tax_credits_current_year_income;89bdbeed9to7ba0ea7af, which the baseline would need too.Not in this PR
personal_rent); this PR does not change that.property_income; moving it tosublet_incometakes a change there.Known interactions
benunit_contains_household_head), so the two agree.7ba0ea7af(8d494ab9d). Two files conflicted. Inlegacy_benefits_home_letting_income.py, Treat income derived from capital as capital in the legacy means tests #1995 had moved the sub-tenant rule intohome_letting_incomefor its CTR reader, and this PR had added the boarder and lodger rules beside it; the helper now holds both, and each reader keeps its own people and pension-age test (What changes, "Legacy means tests"). Incouncil_tax_reduction_applicable_income.py, Treat income derived from capital as capital in the legacy means tests #1995 floors the counted members' deducted income tax at nil, and this PR subtracts the uncounted rent's tax without earnings; the formula subtracts first and then floors. The two head-alone cases pin the CTR reader, and the adult-son Housing Benefit case and Treat income derived from capital as capital in the legacy means tests #1995's own cases pin the legacy one. No other file changed on both sides.test_a_head_applying_alone_counts_only_her_own_letting_incomeasserted that a head who applies alone keeps the same CTR income whatever rent the benefit unit's claimant and partner receive. Under this PR, their first receipts halve the head's rent-a-room limit, so more of the head's own rent bears income tax, which the scheme deducts. Hypothesis found a head of 65 in the North East with a pension of £13,819.52 and £5,254.85 of rent. When the claimant and partner's rent rose from nil to £1, the head's limit fell to £3,750, and the head's CTR income fell by £300.97, 20% of the £1,504.85 above it.25535f380keeps the property's equalities where the head's taxable rent-a-room income stays the same, adds that their rent never raises the head's CTR income, and pins that household as an example.uc_income_tax_on_earnings, which takes earnings as the lowest slice. The taxable rent raisesearned_taxable_incomeand the income above earnings alike, so the deduction doesn't move, with one exception. The slice adds back the finance-cost reduction in excess ofproperty_income_tax, and the relief's cap includes taxable rent-a-room income. In Scotland, where finance costs exceed property profits and the taxable rent falls in the 19% starter band, the relief rises by 20% of that rent and the tax by 19%, so each £1 of taxable rent lowers UC's tax deduction by 1p. With pay of £13,000, finance costs of £10,000 and a lodger paying £9,500, the deduction falls from £81.70 to £61.70. At rates of 20% or more, the excess doesn't rise.is_non_dependant_of_household_head. The HB and CTR deductions start at 18, so for children the HB change shows up in bedrooms and the shared accommodation rate: in the North West, with rent of £9,000, a lodger's 10-year-old lifts a 30-year-old head's HB from £4,925.44 to £9,000, while the same head on Universal Credit keeps the shared rate and a housing element of £4,938.96 either way.983488065, the fix for LHA size criteria: other families' children, foster placements and the additional bedroom #2011) applies para 9(2)(g) insideLHA_allowed_bedroomsto a child or qualifying young person for whom no one is responsible at all (is_child_for_universal_credit | is_qualifying_young_person_for_universal_credit, lessis_child_or_qualifying_young_person_for_universal_credit), such as one looked after by a local authority, and gives non-dependants' children under 16 bedrooms. This head applies the same paragraph, from the same two inputs, to a child whose family's claimant and partner sit outside the extended benefit unit, in one flag that every UC reader takes.git merge-treeagainst983488065conflicts inLHA_allowed_bedrooms.pyandlha_renter_has_non_dependant.py, both from this head's edits (atf7788dc97it merged cleanly). It also conflicts inshared_accommodation_exception_benefits.yaml, wheremainand Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016 conflict by themselves. On merge, Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016's linenon_dependant = is_non_dependant_of_household_head & ~no_one_responsiblewould readis_uc_non_dependant_of_household_headinstead, so a lodger's children get no bedroom of their own and no shared bedroom with the head's children; Count other families' children and add the foster and overnight-care bedrooms in the LHA size criteria #2016's looked-after rule could then move into the flag.git merge-treeagainst Give benefit-unit members aged 16 or over a bedroom under LHA rules #2010 (2d362d2fc) conflicts in six files, against Fix HB and national CTR non-dependant deductions #2007 (fde435bd3) in three and against Charge non-dependant deductions within the claimant's benefit unit #2017 (b3e0d76b8) in five. Two of them in each,docs/book/programs/gov/dwp/housing-benefit.ipynbandpolicyengine_uk/tests/shard_durations.toml, come frommainat5c7744144, which conflicts with all three in those files by itself. This PR addshousing_benefit_individual_non_dep_deduction_eligible.pywith all three,uc_individual_non_dep_deduction_eligible.pyanduc_non_dep_deductions.pywith Give benefit-unit members aged 16 or over a bedroom under LHA rules #2010 and Charge non-dependant deductions within the claimant's benefit unit #2017, andLHA_allowed_bedrooms.pywith Give benefit-unit members aged 16 or over a bedroom under LHA rules #2010.87cbc397e) and Add the child disability premiums to pensioner Council Tax Reduction #2861 (254fac3c2). Against Deduct only the tax Council Tax Reduction schemes allow #2834 (3589f7ef7) it conflicts incouncil_tax_reduction_applicable_income.py, where both PRs change the tax the formula deducts. Against Give Scotland and Wales working-age CTR their own rules #1966 (a013f520a) it conflicts incouncil_tax_reduction_pensioner.py,test_council_tax_reduction_pension_credit_properties.pyandtest_means_test_income_properties.py, wheremainand Give Scotland and Wales working-age CTR their own rules #1966 conflict by themselves.council_tax_reduction_individual_non_dep_deduction_eligible) and award:test_household_head_agreement_properties.pypins the current rule for every CTR scheme in the model (no one in the head's family is a non-dependant), so this PR leaves it.axiom: TheAxiomFoundation/rulespec-uk#402 queued, with an addendum for person-level commercial liability (TheAxiomFoundation/rulespec-uk#402 (comment)); rulespec-uk already encodes UC reg 66 (uk/regulations/uksi/2013/376/66.test.yaml
rent_from_a_lodger_in_the_home_is_not_unearned_income)Reproducer:
policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/boarders_and_lodgers_non_dependants.yaml::A commercial lodger's qualifying young person gives the householder no Universal Credit bedroom;policyengine_uk/tests/policy/baseline/gov/dwp/legacy_means_tests/boarders_and_lodgers_non_dependants.yaml::A lodger's non-paying adult son is the householder's non-dependant for Housing Benefit🤖 Generated with Claude Code