Skip to content

Give Universal Credit and Housing Benefit their own benefit cap and LHA shared-accommodation rules - #2089

Draft
MaxGhenis wants to merge 5 commits into
uc-reg3-3-single-claimfrom
uc-hb-split-shared-cap-lha-rules
Draft

MaxGhenis wants to merge 5 commits into
uc-reg3-3-single-claimfrom
uc-hb-split-shared-cap-lha-rules

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Stacked on #2084 (UC reg 3(3) single claims; base branch uc-reg3-3-single-claim). Review the commits after 17b9b8a16; the head is 12ac785. GitHub retargets this PR to main when #2084 merges.

What was wrong

One set of variables served both Universal Credit and Housing Benefit although the two schemes' rules differ:

  • Cap rate. is_benefit_cap_single_claimant_rate / benefit_cap used one "single claimant" test. UC Regs 2013 reg 80A(2) and HB Regs 2006 reg 75CA(2) each define it their own way.
  • Cap exceptions. is_benefit_cap_exempt_health_disability, _other and _earnings were the union of both schemes' grounds:
    • UC's earnings exception and LCWRA and carer elements also lifted the HB cap.
    • HB's working tax credit exception also lifted the UC cap.
    • Any member over State Pension age lifted both caps. UC has no age exception, and HB's cap is out of reach only under the pension-age regulations.
  • Cap reduction. benefit_cap_reduction served both, and applied neither UC reg 81 (the childcare costs element comes off) nor HB reg 75D(2) (the 50p weekly minimum stays).
  • LHA shared accommodation rate. is_lha_shared_accommodation_rate_specified_renter set the one category both schemes read. UC Sch 4 paras 27-29 and HB reg 2(1) "young individual" with reg 13D(2)(a)(i) differ: UC has a single claim by a member of a couple and HB does not.

#2084 gated the reg 3(3) consequences in these shared variables on claims_legacy_benefits as a stopgap. That stopgap was wrong for any family whose legacy status did not match the scheme being calculated.

The law

legislation.gov.uk data.xml, current text, fetched 2026-10-02.

Who is a single claimant

  • UC reg 3(3): "A person who is a member of a couple may make a claim as a single person if the other member of the couple— (a) does not meet the basic condition in section 4(1)(a) (at least 18 years old) and is not a person in respect of whom the minimum age specified in regulation 8 applies; ..."
  • UC reg 78(2): "In this Part 'couple' means— (a) joint claimants; or (b) a single claimant who is a member of a couple within the meaning of section 39 of the Act and the other member of that couple".
  • UC reg 80A(2): "(a) £16,967 for a single claimant resident in Greater London who is not responsible for a child or qualifying young person; (b) £25,323 for— (i) joint claimants where either joint claimant is resident in Greater London; (ii) a single claimant resident in Greater London who is responsible for a child or qualifying young person; (c) £14,753 for a single claimant not resident in Greater London who is not responsible for a child or qualifying young person; (d) £22,020 for— (i) joint claimants not resident in Greater London; (ii) a single claimant not resident in Greater London who is responsible for a child or qualifying young person."
  • HB reg 75CA(2): "(a) £16,967 in the case of single claimants resident in Greater London; (b) £25,323 in the case of all other claimants resident in Greater London; (c) £14,753 in the case of single claimants not resident in Greater London; (d) £22,020 in the case of all other claimants not resident in Greater London."
  • HB reg 2(1): "'single claimant' means a claimant who neither has a partner nor is a lone parent"; "'lone parent' means a person who has no partner and who is responsible for and a member of the same household as a child or young person".

Exceptions

  • UC reg 79(1): "Unless regulation 82 or 83 applies, the benefit cap applies where the welfare benefits to which a single person or couple is entitled during the reference period exceed the relevant amount".
  • UC reg 82(1)(a): "the claimant's earned income or, if the claimant is a member of a couple, the couple's combined earned income, is equal to or exceeds [16 hours at the national minimum wage, monthly]".
  • UC reg 83(1): "(a) the LCWRA element is included in the award of universal credit or the claimant is receiving an employment and support allowance that includes the support component; (b) a claimant is receiving industrial injuries benefit; (c) a claimant is receiving attendance allowance; ... (g) a claimant, or a qualifying young person for whom a claimant is responsible, is receiving personal independence payment; ... (i) a claimant, or a qualifying young person for whom a claimant is responsible, is entitled to carer's allowance; ... (j) the carer element is included in the award of universal credit".
  • HB reg 75A: "Unless regulation 75E or 75F applies, a benefit cap applies ...".
  • HB reg 75E(2): "This paragraph applies where the claimant is, or the claimant and the claimant's partner are jointly, entitled to working tax credit."
  • HB reg 75F(1): "(a) the claimant or the claimant's partner is receiving an employment and support allowance ... which includes a support component; (b) the claimant or the claimant's partner is receiving an industrial injuries benefit ...; (c) ... attendance allowance; ... (ea) the claimant, the claimant's partner or a young person for whom the claimant or the claimant's partner is responsible, is receiving a personal independence payment ...; ... (h) ... is entitled to a carer's allowance".
  • HB reg 5: "(1) These Regulations apply to a person who— (a) has not attained the qualifying age for state pension credit; or (b) has attained the qualifying age for state pension credit if he, or if he has a partner, his partner, is a person on universal credit, on income support, on an income-based jobseeker's allowance or on an income-related employment and support allowance. ... (3) Except as provided in paragraph (1), these Regulations shall not apply in relation to any person if he, or if he has a partner, his partner, has attained the qualifying age for state pension credit." The benefit cap is Part 8A of these Regulations. The pension-age regulations (SI 2006/214) have no cap. The pension-age carve-out is reg 5, not reg 75C; reg 75C sets how each welfare benefit is counted.

Reductions

  • UC reg 81: "(1) ... the amount of the award for that period is to be reduced by— (a) the excess; minus (b) any amount included in the award for the childcare costs element in relation to that assessment period. (2) But no reduction is to be applied where the amount of the childcare costs element is greater than the excess."
  • HB reg 75D(2): "Where the reduction would reduce the claimant's housing benefit to less than the minimum amount of housing benefit provided for in regulation 75 (minimum housing benefit), the relevant authority must reduce the claimant's housing benefit by such amount as will leave the claimant entitled to that minimum amount." Reg 75: "... it shall not be payable where the amount to which a person would otherwise be entitled is less than 50 pence per benefit week."

Shared accommodation

  • UC Sch 4 para 28: "(2) The first condition is that the renter is a single person (or a member of a couple claiming as a single person) who— (a) is under 35 years old; and (b) is not an excepted person under paragraph 29. (3) The second condition is that the renter is not responsible for any children or qualifying young persons. (4) The third condition is that no person is a non-dependant in relation to the renter."
  • UC Sch 4 para 29(5): "E is under 35 years old and is in receipt of— (a) the care component of disability living allowance at the middle or highest rate; ... (b) attendance allowance; ... (c) the daily living component of personal independence payment". UC reg 2: "'attendance allowance' means— ... armed forces independence payment under the Armed Forces and Reserve Forces (Compensation Scheme) Order 2011".
  • HB reg 13D(2)(a): "(i) the claimant is a young individual who has no non-dependant residing with him and to whom paragraph 14 of Schedule 3 (severe disability premium) does not apply". HB reg 2(1): "'young individual' means a single claimant who has not attained the age of 35 years, but does not include such a claimant— [care leavers, overnight care, hostels, MAPPA, a qualifying parent or carer, domestic violence, modern slavery ...]".
  • HB Sch 3 para 14(2)(a): "(i) he is in receipt of attendance allowance, the care component of disability living allowance at the highest or middle rate ..., the daily living component of personal independence payment ... or armed forces independence payment; and (ii) ... he has no non-dependants aged 18 or over normally residing with him ...; and (iii) no person is entitled to, and in receipt of, a carer's allowance ... in respect of caring for him".

So Housing Benefit's counterpart to UC's para 29(5) disability exception is the severe disability premium condition. In the model both lists come to the same benefits: attendance allowance, DLA care at the middle or highest rate, PIP daily living and AFIP. Para 14's carer condition (iii) is not observed.

What this PR does

Universal Credit Housing Benefit
Cap uc_benefit_cap (reg 80A) housing_benefit_benefit_cap (reg 75CA)
Single-claimant rate is_uc_benefit_cap_single_claimant_rate: not joint claimants (a reg 3(3) single claim is single), not responsible for a child or QYP is_housing_benefit_benefit_cap_single_claimant_rate: is_single_person (reg 2(1)); a reg 3(3) couple is a couple
Exceptions is_uc_benefit_cap_exempt = _earnings (reg 82) or _specified_benefit (reg 83: LCWRA and carer elements, a claimant's benefits; the reg 3(3) other member is not a claimant). No WTC, no age exception. is_housing_benefit_benefit_cap_exempt = _working_tax_credit (75E) or _specified_benefit (75F: the partner's benefits count) or housing_benefit_pension_age_regulations_apply (reg 5). No earnings, LCWRA or carer-element exception.
Reduction uc_benefit_cap_reduction: excess less the childcare costs element, on an award only (regs 78(1), 81) housing_benefit_benefit_cap_reduction: excess, leaving 50p a week (regs 75, 75D)
Award reads universal_credit, uc_deductions, uc_has_deduction housing_benefit
LHA category LHA_category with is_lha_shared_accommodation_rate_specified_renter (Sch 4 paras 27-29; reg 3(3) without the stopgap; AFIP added per reg 2) housing_benefit_LHA_category with is_housing_benefit_young_individual and housing_benefit_severe_disability_premium_applies (reg 13D(2)(a)(i), Sch 3 para 14)
LHA rate uc_LHA_cap (unchanged) LHA_cap now reads housing_benefit_LHA_rate

Other changes:

  • benefit_cap_welfare_benefits is the welfare benefits total. The model pays a family UC or HB, never both, so one total serves both schemes; a property test checks that no family has both. UC reg 80(2A), which counts HB as nil, and HB reg 75F(1)(g), which exempts a claimant receiving UC, therefore never bind.
  • benefit_cap_reduction remains, as the sum of the two schemes' reductions. Downstream code reads it: uk-data's DWP benefit-cap calibration targets do. A family with neither award now has no reduction. In the Enhanced FRS no family had a reduction without an award, so the targets are unchanged.
  • The claims_legacy_benefits stopgap helpers in utils/uc_work_related_requirements.py are gone.
  • Removed: benefit_cap, is_benefit_cap_exempt, is_benefit_cap_exempt_earnings, is_benefit_cap_exempt_health_disability, is_benefit_cap_exempt_other, is_benefit_cap_single_claimant_rate.

Converging with #2006/#2030. The LHA names come from #2006 so the two branches meet on the same files: housing_benefit_LHA_category, housing_benefit_LHA_rate, is_housing_benefit_young_individual, housing_benefit_severe_disability_premium_applies, the parameter gov.dwp.housing_benefit.severe_disability_premium.qualifying_benefits, lha_rate_for_category and category_maximum(..., category_variable). In #2006, LHA_category stays the UC category. Where #2006 has more (the reg 13D(2)(a)(ii) route, sharers' rent, its own non-dependant tests), its versions supersede these. This PR keeps today's household-composition proxy (lha_renter_has_non_dependant) for both schemes. Both shared-rate tests still read responsibility under either scheme: a dependant under one scheme only is the other scheme's non-dependant, which the proxy does not identify. #2030 replaces both with each scheme's own non-dependant test.

Not modelled (as before): the UC grace period (reg 82(1)(b)), the HB 39-week grace period (75E(3)-(5)), the weekly rounding of HB's relevant amount (75CA(1)), the reg 75 non-payment of HB below 50p, the para 29 / reg 2(1) exceptions other than disability benefits, and Sch 3 para 14(2)(a)(iii).

Impact

Real Enhanced FRS runs, one at a time. Base is #2084's head 17b9b8a; branch is bd9a5a7, and no model code changed after it (git diff bd9a5a76a HEAD -- policyengine_uk/{variables,parameters,utils} is empty). Private copy of enhanced_frs_2024_25.h5, sha256 e433e532…. Weighted £m a year; records are survey records.

Year UC HB Household net income UC benefit units changed of which reg 81 childcare offset (records) UC families capped, base → branch HB families capped (base) UC exemption lost (records) HB exemption lost LHA category changed (UC/HB vs UC) AHC poverty (pp)
2025 +0.00 +0.00 +0.00 0 0 133k → 133k 0 8 (3.5k) 0 0/0 0.0000
2026 +0.14 +0.00 +0.14 2 records (0.6k) 2 267k → 267k 0 8 (3.6k) 0 0/0 0.0000
2027 +0.14 +0.00 +0.14 2 (0.6k) 2 303k → 303k 0 8 (3.6k) 0 0/0 0.0000
2028 +0.14 +0.00 +0.14 2 (0.6k) 2 341k → 341k 0 8 (3.6k) 0 0/0 0.0000
2029 +0.15 +0.00 +0.15 2 (0.6k) 2 358k → 358k 0 8 (3.6k) 0 0/0 0.0000
2030 +1.39 +0.00 +1.39 6 (15.5k) 6 396k → 381k 0 8 (3.6k) 0 0/0 0.0000

Scripts and outputs: impact/ in the handover folder (dataset_impact.py, compare.py, r1/branch_vs_base.json).

Tests

  • New YAML, hand-computed from the law:
    • gov/dwp/benefit_cap_by_scheme.yaml (16 cases). Each scheme's exceptions:
      • UC reg 83(1)(a) LCWRA and (j) carer element, which are not HB exceptions; carer's allowance, which lifts both;
      • UC reg 82 earnings, which is not HB; HB reg 75E WTC, which is not UC;
      • HB reg 5 for a pension-age claimant, a mixed-age couple on UC (capped under both), a mixed-age couple off UC (HB pension-age regulations, no cap), and a partner on income-based JSA (HB Regs 2006 apply).
      • Reductions: UC reg 81 (excess 7,980 less childcare 3,000 = 4,980; childcare above the excess gives 0; no award gives 0); HB reg 75D(1) (HB 10,000 − 7,980 = 2,020); 75D(2) (5,000 → 26); HB below 50p a week (unreduced).
      • A reg 3(3) couple in London: UC 16,967, HB 25,323.
    • housing_benefit/housing_benefit_lha_category.yaml (9 cases):
      • AFIP: excepted under UC Sch 4 para 29(5)(b) with reg 2, and under HB Sch 3 para 14;
      • HB young individual at 30 and at 35;
      • Sch 3 para 14(2)(b): a couple qualifies only if both members do;
      • an adult non-dependant defeats the premium, unless the non-dependant receives a qualifying benefit (para 14(4));
      • another family's claimant in the household;
      • an HB-only young person blocks both shared rates.
  • Rewritten for both schemes:
    • gov/dwp/benefit_cap.yaml (17). The reg 3(3) couple gets UC 14,753 and HB 22,020. The HB-only 19-year-old gives UC 14,753 and HB 22,020.
    • LHA_claimant_composition.yaml (19). The reg 3(3) couple gets UC A and HB B.
    • universal_credit/claims_as_single_person.yaml (27). The other member's PIP lifts the HB cap (75F) but not the UC cap (83). Earnings lift the UC cap but not the HB cap. A legacy-claiming reg 3(3) family is single for UC and a couple for HB.
  • New property tests (test_benefit_cap_lha_scheme_split_properties.py, Hypothesis, derandomised, plus explicit examples of every scheme difference): differential tests against the parent commit's shared formulas. These are re-added verbatim under reference_ names through a structural Reform, so one simulation computes old and new for the same families. Invariants below.
  • Updated:
  • Runs (targeted, one process at a time):
  • Mutation checks: 10 of 10 killed (probes/mutate.py, run against a detached copy of the head). Each mutation was caught by the YAML files above, the split property file, or both:
    • M1: HB rate follows the reg 3(3) single claim (YAML and properties);
    • M2: UC reduction ignores the childcare costs element (YAML and properties);
    • M3: HB exception includes LCWRA (YAML and properties);
    • M4: LHA_cap reads the UC category's rate (properties);
    • M5: HB reduction ignores the 50p minimum (YAML and properties);
    • M6: the UC shared-rate test ignores reg 3(3) (YAML and properties);
    • M7: UC exception includes WTC (YAML);
    • M8: HB cap reaches pension-age claims (YAML);
    • M9: HB shared-rate test ignores the severe disability premium (YAML and properties);
    • M10: UC cap rate reads responsibility under either scheme (YAML and properties).

Invariants

For every generated family and every example:

  1. Cap rate.
  2. Exceptions.
    • With nobody at State Pension age and no reg 3(3) single claim, the old exception is exactly the union of the two schemes' (UC ∪ HB). Wherever they agree, it is their value.
    • For a non-legacy reg 3(3) single claim, the old exception is UC's or HB's WTC exception.
    • The age changes are intended (UC has no age exception; HB reg 5) and are pinned in YAML.
  3. LHA.
    • Without AFIP, the old category is the new category of the scheme the family claims under.
    • With no reg 3(3) single claim, the UC and HB categories are equal.
  4. Reductions.
    • uc_benefit_cap_reduction = max(excess − childcare costs element, 0) on an award, else 0.
    • 0 ≤ the HB reduction ≤ HB's excess.
    • HB after the cap ≥ min(HB before the cap, 50p × 52), and ≤ HB before the cap.
    • benefit_cap_reduction = UC + HB reductions.
    • No family has both UC and HB before the cap.
  5. Awards. Where a scheme's cap equals the old cap, and neither reg 81's offset nor reg 75D(2)'s minimum applies, universal_credit / housing_benefit equal the award under the old shared cap.
  6. LHA rate. LHA_cap = min(rent, housing_benefit_LHA_rate). That rate equals the UC category's BRMA_LHA_rate wherever the categories agree, so it is a differential between the two lookup paths.

test_examples_reach_the_cases checks that each example changes the result it is there for: reg 3(3) under UC and legacy, reg 81, the HB-only young person, AFIP, the mixed-age couple on UC, an HB family with LCWRA, and reg 75D(2).

Coordination

Comments posted on each related PR, with the port each needs:

The landing job (launchd) waits for #2084 to merge, then retargets, merges main, tests, reviews the head and merges on gates.

axiom:

🤖 Generated with Claude Code

MaxGhenis and others added 4 commits October 2, 2026 13:28
…HA shared-accommodation rules

One benefit cap (rate, exceptions, reduction) and one LHA category served
both schemes although the law differs. Each scheme now has its own:

- UC: uc_benefit_cap (reg 80A), is_uc_benefit_cap_single_claimant_rate
  (a reg 3(3) single claim is single), is_uc_benefit_cap_exempt_earnings
  (reg 82), is_uc_benefit_cap_exempt_specified_benefit (reg 83, "a
  claimant"), uc_benefit_cap_reduction (reg 81, less the childcare costs
  element). LHA_category / is_lha_shared_accommodation_rate_specified_renter
  are UC's (Sch 4 paras 27-29).
- HB: housing_benefit_benefit_cap (reg 75CA), single claimant per reg 2(1),
  exceptions 75E (WTC) and 75F (claimant or partner), no cap under the
  pension-age regulations (reg 5), housing_benefit_benefit_cap_reduction
  (75D, keeping the reg 75 minimum). housing_benefit_LHA_category,
  is_housing_benefit_young_individual and housing_benefit_LHA_rate follow
  reg 13D(2)(a)(i), with names and helpers shared with #2006.
- universal_credit and housing_benefit read their own reduction;
  benefit_cap_reduction is their sum. The claims_legacy_benefits stopgap
  from #2084 is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions and LHA category

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…B LHA rate; docs and changelog

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 2, 2026
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
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