Skip to content

Add the Housing Benefit earnings disregard for specified or temporary accommodation (Sch 4 para 18, from 5 October 2026) - #2123

Merged
MaxGhenis merged 7 commits into
mainfrom
hb-specified-accommodation-disregard
Oct 4, 2026
Merged

MaxGhenis merged 7 commits into
mainfrom
hb-specified-accommodation-disregard

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 3, 2026 •

Copy link
Copy Markdown
Collaborator

From 5 October 2026, working-age Housing Benefit disregards an extra amount of earnings for claimants in specified or temporary accommodation. This adds it: SI 2006/213 Schedule 4 paragraph 18 and, in Northern Ireland, SR 2006/405 Schedule 5 paragraph 18.

Law

Fetched from legislation.gov.uk CLML on 2026-10-03. The revised SI 2006/213 there does not include paragraph 18 yet, so the text and citations come from the amending instruments.

  • SI 2026/753 (in force 5 October 2026; extends to England and Wales and Scotland):

    • reg 2(2) and (3) add "and 18" to HB regs 36(2) and 38(2), the disregards from net earnings and net profit;
    • reg 2(4) inserts paragraph 18.
  • SI 2026/978 reg 2(2) (in force 2 October 2026) replaced reg 2(4) before it came into force. Its Explanatory Memorandum says the first version wrongly left out lone parents, required "remunerative work" and had no partner rule. The version in force:

    • para 17(3)(a): "paragraphs 3 to 10A" becomes "paragraphs 3 to 10A and 18". The para 18 amount now counts in the £17.10 additional disregard's earnings test. Para 17(1) still adds the £17.10 only to the paras 3 to 10A amount.

    • para 18(1): applies where "(a) the claimant is resident in accommodation specified in paragraph 3A or paragraph 3B of Schedule 1 to the Universal Credit Regulations 2013 … and (b) the claimant, or, if the claimant has a partner, the claimant or their partner, is an employed earner or self-employed earner". For a couple it "shall not apply to their partner except where, and to the extent that, the earnings of the claimant which are to be disregarded under this paragraph are less than" the amount.

    • para 18(2), weekly:

      Claimant Amount
      Single claimant or lone parent under 25 £61.41
      Single claimant or lone parent 25 or over £77.73
      Couple, both under 18 £97.33
      Couple, one 18 or over, both under 25 £61.53
      Couple, one 25 or over £119.70
  • Northern Ireland: SR 2026/157 (in operation 5 October 2026) makes the same amendments to SR 2006/405: regs 33(2) and 35(2), and Sch 5 paras 17(3)(a) and 18. It refers to UC (NI) Regs 2016 Sch 1 paras 4 and 4A. So the rule is UK-wide.

  • Working age only. Neither SI 2006/214 nor SR 2006/406 is amended, and both Explanatory Notes say "These amendments apply to working-age housing benefit only".

  • Not uprated. Nothing uprates the amounts. The SI 2026/753 EM (para 6.2) says they "will be annually reviewed"; any change will come by a new instrument.

  • It stacks with the £5, £10 and £25. No paragraph excludes para 18, and para 18 excludes none: para 10 applies "where none of the paragraphs 3 to 9 applies", and para 10A(2) disapplies only paras 3 to 10. The EM (paras 5.7 to 5.9) sets each amount as the earnings at which the UC standard allowance tapers away, less "the combined value of the basic Housing Benefit earnings disregard and the applicable Housing Benefit personal allowance". With the model's own 2026-27 rates that reproduces both single amounts exactly:

    • 25 or over: £424.90 × 12 / 52 / 0.55 − £5 − £95.55 = £77.73;
    • under 25: £338.58 × 12 / 52 / 0.55 − £5 − £75.65 = £61.41.

Changes

  • in_specified_or_temporary_accommodation: benefit-unit input, default false, with the UC Sch 1 paras 3A and 3B definitions (NI paras 4 and 4A). It has the same name, path, definition and references as the input in Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) #1910. One docstring sentence differs: Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) #1910's says the input protects working-age awards from abolition, which is not true on this branch. If this lands first, Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) #1910 resolves a one-sentence add/add conflict by taking its own sentence plus a mention of para 18.

  • housing_benefit_specified_or_temporary_accommodation_disregard: the full para 18(2) amount, annualised (× 52). It applies where:

    • the input is true;
    • the claimant or partner has earnings: employment income above zero, any self-employment income (a loss still makes them a self-employed earner), or statutory sick or maternity pay;
    • the pension-age Regulations do not apply (housing_benefit_pension_age_regulations_apply).

    The age bands read eldest_claimant_or_partner_age.

  • housing_benefit_applicable_income_disregard:

    • the para 18 amount is added to the £5/£10/£25 and capped at the net earnings those leave;
    • it counts in the £17.10 earnings test (para 17(3)(a));
    • para 12 (all earnings disregarded for those on IS, income-based JSA or income-related ESA) still overrides.

    Combining claimant and partner earnings applies the couple rule: one amount, taken from both.

  • Parameters under gov.dwp.housing_benefit.means_test.income_disregard.specified_or_temporary_accommodation: seven amounts and two age thresholds (18 and 25). The amounts are zero before 2026-10-05 and have no uprating.

  • Fiscal-year reading. The model reads each fiscal year at 30 April. 2026 (2026-27) therefore has no para 18 disregard, although it applies from 5 October 2026, which is 183 of the year's 365 days. 2027 onwards has the full amounts. This is intended and tested. A day-weighted blend would be wrong here: half of each amount for the whole year is not the same as the full amount for half the year, because of the earnings cap and the £17.10 test.

Invariants (property tests in test_housing_benefit_specified_accommodation_disregard_properties.py, 2027)

  1. 0 ≤ para 18 amount ≤ £119.70 × 52, and it is one of the five statutory amounts or zero. 0 ≤ total disregard ≤ min(net earnings, (£25 + £119.70 + £17.10) × 52).

  2. With the input false, there is no para 18 amount, and the total equals the total with that amount forced to zero.

  3. The total disregard is non-decreasing in employment income.

  4. Turning the input on never lowers the disregard or raises applicable income. This is intended: every para 18 amount exceeds the £17.10 it can cost through para 17(3)(a). It is a property of the amounts, not a rule of law.

  5. Differential: the model agrees with a reference written from the statutory text. The reference is independent for the para 18 bands and gates (amounts hard-coded from the instrument; ages, family type, earner and pension-age status from the generated inputs) and for how paras 4, 7, 10, 17 and 18 combine. It takes net earnings, deductible childcare and the para 17(2) work condition from the model, which other tests cover. Explicit examples pin the age boundaries (couples 17/17, 17/18 and 24/25; singles and lone parents at 24 and 25) and two families inside the para 17(3)(a) window, whose earnings cover the £17.10 test without para 18 but not with it.

  6. Scope:

    • pension-age families get no para 18 amount;
    • families in the accommodation with no earner (para 18(1)(b)) get none;
    • a working-age earner in the accommodation gets exactly the statutory amount.

    About half the generated families are drawn without earnings, and others may draw zero incomes.

  7. On Income Support, all net earnings are disregarded.

  8. Dates: zero in every year to 2026 and the same amounts from 2027 to 2035. In each of the seven amount files the first non-zero value takes effect on 2026-10-05, with zero before; the two age-threshold files start on 2026-10-05.

Mutation check: all 12 mutants are killed by both the YAML and the property suites at head a3ee31aa (run_mutants.py, one mutant at a time, restoring the file after each).

Mutant YAML (37 cases) Properties (11 tests)
M1 drop para 18 from the para 17(3)(a) test killed (3 failed) killed (1 failed)
M2 swap couple older and younger amounts killed (6 failed) killed (2 failed)
M3 no pension-age exclusion killed (2 failed) killed (2 failed)
M4 para 18 not capped killed (3 failed) killed (2 failed)
M5 earner condition always true killed (1 failed) killed (2 failed)
M6 strict age-25 threshold killed (2 failed) killed (2 failed)
M7 cap at net earnings, not the remainder killed (2 failed) killed (2 failed)
M8 £119.70 typed as £119.07 killed (4 failed) killed (4 failed)
M9 in force from 6 April 2026 killed (1 failed) killed (2 failed)
M10 lone parent gets the couple amount killed (4 failed) killed (2 failed)
M11 self-employment ignored for the earner test killed (2 failed) killed (1 failed)
M12 para 18 counted twice in the total killed (25 failed) killed (2 failed)

The first run, at 271018f5, had all 12 killed by the YAML suite but M5 (the earner condition made always true) surviving the properties. The no-earner property and the earner-mixed generator fixed that. Mixing in non-earners then left M1 surviving the properties, because no generated family fell inside the para 17(3)(a) window; the window examples fixed that.

Tests

  • New YAML, housing_benefit_specified_or_temporary_accommodation_disregard.yaml, 37 cases hand-computed from the text:

    • every age band and its boundaries (17, 18, 24, 25);
    • the couple rule: one amount, taken from both partners, or from the partner alone;
    • the earnings cap and self-employment;
    • the earner test, the input switched off and its default;
    • Northern Ireland, pension age and the para 12 override;
    • a mixed-age couple under the pension-age Regulations;
    • statutory maternity pay as the only earnings;
    • a self-employment loss (para 18(1)(b) met, nothing to disregard);
    • a pension-age claimant on Income Support (working-age Regulations, where para 12 takes all earnings);
    • the para 17(3)(a) earnings test at exactly, a penny below and well below the threshold, with and without childcare;
    • 2025, 2026 and 2030;
    • an end-to-end entitlement pair, where HB rises by 0.65 × £4,041.96.

    Under-18 couples supply is_claimant_or_partner, because the model otherwise treats a 16- or 17-year-old non-head as a dependent child.

  • Local runs on this head: at 0857ba5c, after merging main: full YAML suite 2,171 passed; full pytest suite 2,781 passed, 34 skipped, 7 xfailed. 9bf692a5 and a3ee31aa change only the property file, whose 11 tests pass at a3ee31aa.

Impact (Enhanced FRS 2024-25, real runs)

Each run used its own copy of the dataset: origin/main 325d585 against this branch, 2026-27 and 2027-28.

  • No change. No benefit unit differs in Housing Benefit, its disregard or applicable income, household net income, or government spending, in either year. No dataset supplies the new input, which defaults to false (policyengine-uk-data has no such column). Model Housing Benefit for specified (supported) and temporary accommodation at any age #1911 tracks populating it.

  • Mechanism check, not a costing. Set the input true for every benefit unit on this branch:

    • 2026-27 is unchanged (the 30 April reading).
    • In 2027-28 the Housing Benefit entitlement rises by £2.31bn. It is computed for every benefit unit, whether or not that unit can receive HB.
    • HB actually paid rises by only £0.87m. The model pays working-age Housing Benefit only to families continuing a reported award who do not claim Universal Credit (housing_benefit_eligible).

    New working-age claims in specified or temporary accommodation come with Abolish working-age Housing Benefit from 1 July 2026 (NI 1 October 2026) #1910.

Reviews

Independent reviews, all through subfleet run --task review. The reports are in the author's review folder, ~/reviews/hb-para18-2026-10-03/review/.

Head Reviewer Verdict Report
271018f5 Opus 5.5, tier standard REQUEST_CHANGES. One should-fix: publish the mutation check, where M5 survived the property tests. Plus nits. review_standard.md
271018f5 GPT-6.1 Sol, tier hard APPROVE, with nits review_hard.md
0857ba5c Opus 5.5, tier standard APPROVE. Description items, an optional test for the para 17(3)(a) window, and a docstring nit. review_delta_standard.md
0857ba5c GPT-6.1 Sol, tier hard APPROVE. Description items, plus a nit: float draws can underflow in float32. review_delta_hard.md
9bf692a5 Opus 5.5, tier standard APPROVE review_delta2_standard.md
a3ee31aa Opus 5.5, tier standard APPROVE review_delta3_standard.md

How the findings were answered:

  • Mutation check: run and published below. M5 and M1 gaps in the property tests are closed with a no-earner property and the para 17(3)(a) window examples.
  • New YAML cases: mixed-age couple, statutory pay only, self-employment loss, pension age on Income Support.
  • Boundary @examples added.
  • The reference's independence is stated exactly.
  • Para 10A and the UC limb of para 12 are documented.
  • A fiscal_year_blend note is in each amount file.
  • Money is drawn in whole pennies, so no draw underflows in float32.
  • Invariant 8 and the impact wording are corrected.

Axiom

axiom: SI 2006/213 Sch 4 para 18 and SR 2006/405 Sch 5 para 18 TheAxiomFoundation/rulespec-uk#375 queued. #375 already covers HB Sch 4 and carries the pe-parity label. The extension comment gives:

  • the verbatim law;
  • the corpus state (no SI 2006/213 Sch 4, UC Sch 1 paras 3A/3B or 2026 amending instruments in axiom-corpus cb34623a2);
  • module paths;
  • a pasteable review_finding;
  • companion tests with the same inputs and numbers as the YAML here.

Not in this PR

🤖 Generated with Claude Code

SI 2006/213 Sch 4 para 18 (NI: SR 2006/405 Sch 5 para 18), in force from
5 October 2026 under SI 2026/753 reg 2(4) as substituted by SI 2026/978
reg 2(2), and NI SR 2026/157 reg 2(4). Adds the dated amounts, the
in_specified_or_temporary_accommodation input (default false, same name and
definition as #1910), the para 18 amount variable with its couple rule and
working-age-only scope, and the para 17(3)(a) change that counts it in the
£17.10 earnings test. YAML and Hypothesis tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 6 commits October 3, 2026 17:53
A mutant that made the earner condition always true survived the property
suite (the YAML caught it). Draw families without earnings half the time,
and add properties that no earner gets no para 18 amount and that a
working-age earner in the accommodation gets exactly the statutory amount.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- YAML: a mixed-age couple under the pension-age Regulations (no para 18),
  statutory maternity pay as the only earnings, a self-employment loss (para
  18(1)(b) met, nothing to disregard), and a pension-age claimant on Income
  Support (working-age Regulations, para 12 takes all earnings).
- Hypothesis: pin the age boundaries (couples 17/17, 17/18, 24/25; singles
  and lone parents 24 and 25) as explicit examples of the differential, and
  say exactly what its reference shares with the model.
- Parameters: note why fiscal_year_blend is not used.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The permitted work disregard (Sch 4 para 10A) replaces paras 3 to 10 but
not para 18, and the universal credit limb of para 12 is left out because
the model does not pay Housing Benefit to a family on Universal Credit.
Neither is new; the review asked for both to be stated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drawing families without earnings half the time (5aaacd8) left the
derandomized property suite without a family whose net earnings cover the
£17.10 test without para 18 but not with it, so it no longer killed a
mutant that drops para 18 from para 17(3)(a); the YAML still did. Add two
such families as explicit examples (single, 30 hours, £5,148; lone parent,
16 hours, £6,000) and state the parameter-date invariant exactly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model stores money as float32, so a tiny positive float drawn by
Hypothesis (say 1e-100) would round to zero there and stop counting as
earnings, while the reference's earner test still counted it. The
derandomized run never drew one, but a larger run could fail spuriously.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Hand-off to the UK hub. Only CI remains.

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Coordination: #2133 (the universal credit limb of the HB passport, fixes #2132) edits the same lines of housing_benefit_applicable_income_disregard.py.

#2133 adds housing_benefit_on_passporting_benefit: Income Support, income-based JSA or income-related ESA (in_receipt_of_income_support_jsa_ib_or_esa_ir), or Universal Credit before the cap (is_uc_entitled, reg 2(3B)). Sch 4 para 12, Sch 5 para 4 and Sch 6 para 5 all read it. In the disregard it replaces the local sum:

on_passporting_benefit = benunit("housing_benefit_on_passporting_benefit", period)
return where(on_passporting_benefit, net_earnings, standard + additional)

This PR changes the same return to add accommodation. Whichever lands second should:

  • keep where(on_passporting_benefit, net_earnings, standard + accommodation + additional);
  • drop this PR's new docstring sentence "Nor is the universal credit limb of para 12: the model does not pay Housing Benefit to a family on Universal Credit.", which would no longer be true.

The rest of this PR's docstring and code merge as they are. Para 18 then reaches only accommodation claimants who are not on Universal Credit, because para 12 already disregards all earnings of those who are.

#2133 also pins would_claim_uc: false on 15 cases in housing_benefit_applicable_income_disregard.yaml. They test a family not on UC, and the default True would make it UC-entitled and so passported.

I merged this head (a3ee31a) with the passport commit locally and resolved the conflict as above. The HB YAML folder then has 13 failures in housing_benefit_specified_or_temporary_accommodation_disregard.yaml, all from the same default:

  • Lone parent aged 24 gets £25 plus £61.41
  • Lone parent aged 30 gets £25 plus £77.73
  • Couple aged 17 and 18 has one member who has attained 18, so £61.53
  • Couple aged 20 and 24 gets £10 plus £61.53
  • Couple aged 24 and 25 has one member who has attained 25, so £119.70
  • Couple whose claimant earns £100 and partner £50 a week has the £129.70 taken from both
  • Statutory maternity pay alone makes the claimant an employed earner
  • Worker aged 30 working 30 hours a penny short of £5, £77.73 and £17.10 loses the £17.10
  • Worker aged 30 working 30 hours earning £99 a week gets £5 and £77.73 but not £17.10
  • The same worker outside specified or temporary accommodation gets £5 and £17.10
  • Lone parent working 16 hours whose earnings cover £25, £77.73 and £17.10 gets all three
  • Childcare charges and the para 18 amount together can take the £17.10 away
  • Couple both aged 17 where one works 16 hours with a child gets £10, £97.33 and £17.10

Adding would_claim_uc: false to each case's benefit unit makes all 37 cases pass with unchanged expected values. Para 18 is for claimants not on UC, so that pin also states what each case means.

On the same merge, test_housing_benefit_specified_accommodation_disregard_properties.py::test_differential_against_the_statutory_reference fails for the same reason. A generated UC-entitled family has all £10,400 of earnings disregarded, while the reference gives £3,719.56. Adding "would_claim_uc": {YEAR: False}, to the benefit unit in situation() makes all 11 properties pass.

I checked both pins on this head alone (a3ee31a): 37 of 37 YAML cases and 11 of 11 properties pass. So they can go in here now, and then neither merge order breaks.

I'll handle the merge on #2133's side if this PR lands first.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis merged commit 1f9d0b3 into main Oct 4, 2026
11 of 12 checks passed
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged by the UK hub, which took this PR on handoff from local_5dfa7203, under the PE-UK merge-on-gates rule. The law is in force from 5 October 2026.

@MaxGhenis
MaxGhenis deleted the hb-specified-accommodation-disregard branch October 4, 2026 13:45
MaxGhenis added a commit that referenced this pull request Oct 4, 2026
…passport

Resolve the Sch 4 para 12 return in the earnings disregard: keep #2123's
para 18 amount and read housing_benefit_on_passporting_benefit; drop its
sentence that the universal credit limb is not modelled. Pin
would_claim_uc: false on the 19 para 18 YAML cases whose families were
UC-entitled (13 failed, 6 passed only because the passport gave the
expected value) and in the para 18 property fixture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant