Repository navigation
Conversation
HB Regs 2006 reg 75F(1)(a) and UC Regs 2013 reg 83(1)(a) lift the cap where "the claimant or the claimant's partner is receiving an employment and support allowance ... which includes a support component". The model lifted it for any income-related ESA of the claimant or partner and for any member's contributory ESA, in both is_benefit_cap_exempt_health_disability and is_benefit_cap_exempt_other. Add has_own_esa_award (Person): the person claims ESA themselves (a reported contributory or income-related award, or a directly entered income-related award attributed to the claimant who heads the benefit unit). Add esa_includes_support_component (Person): whether that ESA includes the support component (WRA 2007 ss.2(2), 4(4)). Datasets or users can supply it; otherwise it is assumed for anyone with an ESA award of their own, as for about nine in ten ESA recipients in the Family Resources Survey 2024-25. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HB Regs 2006 reg 75F(1) and UC Regs 2013 reg 83(1) name, for each benefit, whose receipt lifts the cap. is_benefit_cap_exempt_health_disability summed every benefit-unit member's attendance allowance, DLA, PIP, industrial injuries benefit, Carer's Allowance and Carer Support Payment, and is_benefit_cap_exempt_other exempted any member's armed forces compensation. Any member with the LCWRA flag or caring responsibilities also lifted it. Now: - the claimant or partner only: attendance allowance, industrial injuries benefit and armed forces compensation (75F(1)(b)-(d); 83(1)(b)-(e)); - also a child or young person they are responsible for: DLA (75F(1)(e); 83(1)(f)); - also a young person: PIP, Carer's Allowance and Carer Support Payment (75F(1)(ea), (h), (ha); 83(1)(g), (i), (ia)); armed forces independence payment for a Housing Benefit young person (75F(1)(ea); UC reg 2 counts it as attendance allowance); - the UC LCWRA and carer elements: a claimant with limited capability or caring responsibilities (83(1)(a), (j); regs 27(1), 29(1)), or an element entered directly. The cap serves both schemes, so a child or young person under either scheme's definition counts. A 16-year-old who receives benefits in their own right or is looked after counts for neither (UC regs 4(6), 5(5); HB reg 19(2)). Datasets flag every ESA recipient as disabled, so the LCWRA exception lifted the cap for every ESA recipient whatever their ESA group. Universal Credit takes the ESA assessment (UC Regs 2013 reg 40(1)(a)(ii)), so for a person with an ESA award of their own uc_limited_capability_for_WRA is now inferred from the support component. The work allowance and the reduced minimum age need only limited capability for work (regs 8(1)(a), 22, 39), which an ESA award carries, so they read the new uc_limited_capability_for_work. is_benefit_cap_exempt_earnings and is_benefit_cap_exempt_other lose their unused benefit sums and keep their results. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Inferring limited capability for work-related activity from the ESA support component in both directions gave a non-dependant's own ESA an LCWRA element in the family's Universal Credit, because uc_LCWRA_element and the work allowance still read every member of the benefit unit (#2027's legacy-award invariance test caught it). Now a person whose own ESA lacks the support component is taken not to have LCWRA (UC Regs 2013 reg 40(1)(a)(ii)), and otherwise uc_limited_capability_for_WRA keeps its is_disabled_for_benefits default. uc_limited_capability_for_work is LCWRA or the disability flag, so the work allowance and reduced minimum age are as before for every input that does not set the new variables. The cap property's family-rate reference now counts any 16-year-old, as the family-rate helper does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ut record The Universal Credit reform hook calculates uc_LCWRA_element while the simulation is being built, and uc_limited_capability_for_WRA now reads has_own_esa_award. That went through claimant_or_partner_esa_income and so entered_directly, which read Simulation._user_input_keys before any input had created it (test_child_and_adult_definitions_properties builds its situations without inputs). has_own_esa_award now takes an income-related award with no member's report behind it as entered for the family, and entered_directly treats a simulation with no recorded inputs as having none. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efit-cap-75f-claimant-partner #2027 now leaves the benefit cap to this branch and deletes utils/inputs.py (entered_directly), deciding a directly entered award by value. Conflicts: - is_benefit_cap_exempt_health_disability.py: keep this branch's version; an entered UC LCWRA or carer element is now recognised by value (positive although no member's circumstances give it) instead of entered_directly. - passports.yaml: keep this branch's support-component cap cases. - utils/inputs.py: deleted, as on #2027. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UC Regs 2013 reg 80(1) caps "the amount to which the single person or couple is entitled", and HB Regs 2006 reg 75A the welfare benefits to which the claimant or couple is entitled. benefit_cap_reduction summed every benefit-unit member's contributory ESA and JSA, incapacity benefit and SDA, and the whole unit's income-related ESA and income-based JSA, so another member's own award reduced the family's Universal Credit or Housing Benefit: with UC of 20,000 before the cap, a non-dependent adult's 5,000 of ESA cut the family's UC from 14,753 to 9,753 (#2027 review r2). The capped total now takes the claimant's and partner's person-level awards, claimant_or_partner_esa_income, claimant_or_partner_jsa_income, and the family's Child Benefit, CTC, Income Support, UC and Housing Benefit. Household income keeps the full awards. YAML tests check UC and Housing Benefit amounts; the non-dependant invariance property now also covers benefit_cap_reduction and universal_credit, with JSA, incapacity benefit and SDA among the circumstances. #2027's legacy-award invariance reads the benefit cap exemption again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The non-dependent adult's support component cannot lift the family's cap, so the two cases do not need the input and now also run on the base package, where they fail on value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efit-cap-75f-claimant-partner #2027 makes "on" a legacy award payee-only: of the claimant and partner, only the one the award is payable to (who reports it, or the claimant who heads the family when it is entered directly) is on it (HB Regs 2006 reg 2(1), (3), (3A)). The cap's ESA head reads is_on_income_related_esa for receipt, so a partner who does not hold the couple's award no longer receives it. Two YAML cases now expect the payee only, and the property reference counts an income-related award as received by its reporter. The direct-entry attribution in has_own_esa_award already picks the same person. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…efit-cap-75f-claimant-partner #2027 now puts a member outside the couple on an income-related award only when the award on their own report alone is positive. The cap's ESA head reads is_on_income_related_esa only for the claimant and partner, so the exemption is unchanged; the cap YAML and the single-head table pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Coordination with #2084 (UC claim by a member of a couple as a single person, UC Regs 2013 reg 3(3)). This PR counts That PR edits main's versions of Whichever PR lands second should make the claimant set in the rewritten file A separate point from that PR's review, not caused by either PR: |
|
Coordination with #2088, which models the UC childcare work condition's partner exceptions (UC Regs 2013 reg 32(1)(b)). Limb (i) is "has limited capability for work". On main the only LCW proxy is What changes once both merge. Under this PR, an ESA award without the support component removes LCWRA but not LCW. So whichever of the two merges second should switch limb (i) in If this PR merges first, I'll make the switch in #2088. If #2088 merges first, please switch it here when you merge main. Tests to add with the switch. A working claimant whose partner has
🤖 Generated with Claude Code |
|
Coordination with #2089 (each scheme its own benefit cap and LHA shared-accommodation rules), which is stacked on #2084. #2089 deletes the shared exception files this PR rewrites,
Porting this PR onto the split (whichever of the two merges second):
I will push a pre-resolved composition of the two branches, |
…late example cases From the independent review of 17b9b8a (no P1s; two P2s, two P3s): - P2: the shared-rules gate read only claims_legacy_benefits, so a family that reports Housing Benefit but is calculated on Universal Credit (would_claim_uc) lost the UC rules in the LHA category, the UC housing costs element and the cap. The gate is now stays_on_legacy_benefits = claims_legacy_benefits & ~would_claim_uc, the route housing_benefit_eligible gives a continuing working-age HB award. YAML pairs: reports HB but claims UC (single cap, no exception for the partner's PIP, shared rate) and stays on legacy (couple rate, partner's PIP lifts the cap per HB reg 75F(1)(ea), no shared rate). - P2: the examples gave LCWRA and caring to the same person and asserted a carer element, against reg 29(4). LCWRA and caring are now in separate example families. - P3: AFCS and contributory ESA examples isolated, with positive joint and claimant controls on both cap exceptions; the capital property is now a differential against each member calculated alone; docstring notes the model's ESA-amount proxy for the support component and the under-16 scope of the cap-rate oracle. - P3: the changelog no longer says every cap exception is gone for the other member (an older partner still lifts it, pre-existing; #2076). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
The pre-resolved composition of this PR with #2089 is pushed: branch
Checked on this branch, one process at a time:
Whichever of #2076 and #2089 merges second can take these files as they are. |
|
#2088 has merged to main (99d0448), ahead of this PR. As my earlier comment said, the switch now falls to this PR: when you merge main, change limb (i) in The test to add with the switch: a working claimant whose partner has 🤖 Generated with Claude Code |
vahid-ahmadi
left a comment
There was a problem hiding this comment.
Thanks Max. The scoping is right, and the tests support it. I reviewed head e648b2db5 against #2027 (b8b4d7b50).
What I checked:
- Law. I pulled HB Regs 2006 regs 75A, 75E and 75F, UC Regs 2013 regs 39, 40, 79, 80, 80A and 83, and WRA 2007 s.2(2) from legislation.gov.uk. Your quotes match the current text. The person scopes match the 75F/83 wording head by head, including AFIP: UC treats it as attendance allowance (claimant only), and HB 75F(1)(ea) also covers a young person.
- Tests. All passed:
- YAML (303):
gov/dwp/benefit_cap/,benefit_cap.yaml,legacy_award_readers/andfinance/benefit/family/universal_credit/. test_benefit_cap_specified_benefits_properties.py: 6 passed.test_legacy_award_readers_properties.py: 10 passed.
- YAML (303):
- Probes (2025, North East), main / #2027 base / this PR:
- A non-dependant with £5,000 of income-related ESA, and UC of £20,000 before the cap: UC goes from £20,000 (exempt) to £14,753, a reduction of £5,247. That matches the PR body.
- The claimant's own contributory ESA without the support component, flagged disabled, rent £9,000, earnings £3,000: no LCWRA element, the £4,932 work allowance is kept, and UC is capped at £9,753. With the support component, the LCWRA element is £5,079.24 and the family is exempt.
- Cases that are exempt on all three: the claimant's LCWRA flag without ESA, a 10-year-old's DLA, and the claimant's attendance allowance on HB only.
- A 17-year-old in FE with PIP: capped on main and the base (reduction £4,334.60), exempt here. That is a real fix.
- Breaking-change check. A single ESA claimant entered as
esa_contrib_reported+is_disabled_for_benefitswith no support-component input gives the same result here as on the base: UC £18,880.92, LCWRA element kept, exempt. Calculator users who don't set the new variables keep the LCWRA element.
Findings:
-
Should fix.
uc_limited_capability_for_work.py:29-30changes results for inputs that set none of the new variables. The body says the opposite ("results are as before for every input that does not set the new variables"). Take someone withuc_limited_capability_for_WRA: falseset explicitly,is_disabled_for_benefits: trueand £6,000 of earnings, rent £9,000. They now get the work allowance: £0 → £4,932, and UC goes from £10,501.68 to £13,214.28. Before, setting LCWRA to false removed the work allowance. Fix: only add back what the ESA inference took away, e.g.uc_limited_capability_for_WRA | (is_disabled_for_benefits & has_own_esa_award & ~esa_includes_support_component)(reg 39(1)(a): ESA's own LCW determination). Then add a YAML case for the explicit-false input. If you'd rather keep the wider rule, say so in the changelog. -
Should fix (when you resolve against main). Main has changed all three cap files since this branch's base:
- The carer test reads
is_entitled_to_carer_benefit(378a248, 607a815). benefit_cap_reductionsums overis_uc_assessed_claimant(de51949, c8f3902).is_benefit_cap_exempt_otheris the pension-age HB / reg 60C test (a2bd3c4, efd9dd7).
The body's "Review of the other exceptions" and "Coordination" sections still describe #1994 and #1944 as pending. When you resolve:
is_benefit_cap_exempt_health_disability.py:29-31should listis_entitled_to_carer_benefit, not thecarers_allowance/carer_support_paymentamounts. Otherwise a claimant whose Carer's Allowance is overlapped to nil stops lifting the cap again, a regression against main. Add a YAML case for it.benefit_cap_reduction.py:46should combine your claimant-or-partner lists withis_uc_assessed_claimant.- Keep main's age test and drop only the
afcs/esa_contribterms.
Please also refresh those two body sections.
- The carer test reads
-
Should fix (PR body). The Enhanced FRS section describes a cell of fewer than 10 records together with its members' characteristics. Please change it to "fewer than 10", as #2082 does. The other counts are ≥10 and are aggregates.
-
Nit.
is_benefit_cap_exempt_health_disability.py:138-141: take a non-dependant flagged disabled. They still add the £5,079.24 LCWRA element to the family's UC, becauseuc_LCWRA_elementreads every member, but the family is now capped (UC £18,880.92 → £14,753). Capping is the right direction in law. Until #1989 makes the element claimant-only, though, the award "includes the LCWRA element" (reg 83(1)(a)) and is capped at the same time. A one-line note in the docstring would help, or a YAML case pinning it as a known limitation. -
Nit.
benefit_cap_reduction.py:22cites UC reg 80 while countinghousing_benefit_pre_benefit_cap. Reg 80(2A) counts HB as nil for the UC cap, and HB reg 75F(1)(g) switches the HB cap off when the claimant gets UC. This is pre-existing and belongs in your "split the exceptions by scheme" follow-up. It would be worth naming 80(2A) there.
Mergeability: the branch merges cleanly into #2027's current head (fc1ff55d1, one commit ahead of the version merged here). As part of the stack it conflicts with main in the cap files above. Other open PRs editing the same files: #2089, #2084, #1989, #1820, #1999, #1965, #2066, #2085.
|
#2081 has merged to main ( On main,
After the switch, a claimant flagged |
…1994) into benefit-cap-75f-claimant-partner Conflicts resolved, keeping main's rules and this branch's person scopes, ESA support-component test and capped total: - benefit_cap_reduction: this branch's claimant-or-partner lists, counted for is_claimant_or_partner | is_uc_assessed_claimant (#1978's claimant set; the two are the same unless is_uc_claimant is entered). That set includes the other member of a reg 3(3) single claim (UC Regs 2013 reg 78(2)). - is_benefit_cap_exempt_health_disability: this branch's scopes, with #2084's reg 3(3) exclusion (other_member_of_single_claim_in_shared_rules) on "a claimant", and #1994's is_entitled_to_carer_benefit in YOUNG_PERSON_BENEFITS. - is_benefit_cap_exempt_other: #1944's Housing Benefit pension-age test; the AFCS and ESA terms stay moved, scoped, into the health and disability file. - is_benefit_cap_exempt_earnings: #1978's claimant-only earnings, without the dead LCWRA and carer sums. - UC notebook: main's means-test text with this branch's cap sentence, without the State Pension age exception #1944 removed. test_benefit_cap_specified_benefits_properties: the reference reads entitlement to a carer benefit for the young-person heads, as #1994's is_entitled_to_carer_benefit does (75F(1)(h)-(ha); 83(1)(i)-(ia)), and invariant 1 now also draws a non-dependant over State Pension age or with earnings, which main's age and earnings exceptions no longer count. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e childcare exception The two switches #2081 and #2088 left to this branch, which lands after them (comments on #2076, 2026-10-03 and 2026-10-05): - Welfare Reform Act 2012 s.21(1)(a): uc_work_related_group_apart_from_ earnings reads uc_limited_capability_for_work. The input uc_has_limited_capability_for_work, which defaulted to false, is removed; its test inputs move to uc_limited_capability_for_work. - UC Regs 2013 reg 32(1)(b)(i): uc_unable_to_provide_childcare reads uc_limited_capability_for_work, and its documentation says so. An ESA award without the support component removes limited capability for work-related activity but not for work (UC Regs 2013 regs 39, 40), so such a claimant falls within section 21, outside the minimum income floor, and as a partner still meets the childcare exception. New YAML cases pin both, and the minimum income floor case. Changelog fragments updated for these and for main's age and earnings exceptions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…le, migrated single-claim properties Review job 20261010-122211-benefit-cap-75f-review-after-merge on a6100a7 (REQUEST_CHANGES): 1. An entered LCWRA or carer element lifted the cap only if no member had the matching circumstance, so a non-dependant's flag or caring cancelled it. UC reg 83(1)(a), (j) asks whether the award includes the element. An element supplied as an input (utils/supplied_inputs.supplied_input; both elements registered) now lifts the cap whatever the members' circumstances; the by-value reading stays for reforms that replace the formula. 2. With entered is_uc_claimant identities the capped total mixed two couples: person-level benefits for the union of is_claimant_or_partner and is_uc_assessed_claimant, income-based JSA and ESA for the claimant and partner only. The cap now reads one couple, the scheme's (utils/benefit_cap.benefit_cap_couple): a family on Universal Credit, its claimants (reg 78(2)); otherwise Housing Benefit's claimant and partner (HB reg 75A). The exceptions read the same couple. Income-based JSA and ESA are scoped by it through award_of_members, the reading claimant_or_partner_esa_income and _jsa_income already used, now one helper in utils/benefit_unit.py that both readers call unchanged. 3. test_uc_single_claim_properties (#2084) still read the AFCS and ESA heads in is_benefit_cap_exempt_other. They now check that variable against the pension-age route alone and the claimant's AFCS or ESA against is_benefit_cap_exempt_health_disability, which holds them. Tests: YAML cases for both entered elements beside a non-dependant's circumstance, a non-dependant's own limited capability, a non-dependant over State Pension age or with earnings, and the scheme's couple on UC and on Housing Benefit (four of these fail on a6100a7). The cap property test now also draws entered elements, which invariant 1 would have caught. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ple; entered and reform elements by value Review job 20261010-134818-benefit-cap-75f-review-after-merge-r2 on a6a3073 (REQUEST_CHANGES): 1. The ESA head read is_on_income_related_esa, whose award and payee are Housing Benefit's claimant and partner, while the capped total read the scheme's couple. The head now takes the couple's income-related award from their reports (award_of_members, as the total does) and its payee within that couple (is_payee_of_couple_award, which now accepts a couple mask; its default is unchanged). 2. is_benefit_cap_single_claimant_rate counted is_couple (two of is_claimant_or_partner), so entered joint UC claimants got the single limit. It now counts benefit_cap_couple, which gives is_couple's answer for every family whose is_uc_claimant is not entered (UC Regs 2013 reg 80A(2)(d)). The capped-total fixtures now expect 22,020. 3. An element a reform's formula gives was read through the members' circumstances whenever any member had them. Elements are now decided by value against what their own formula gives: uc_LCWRA_element and uc_carer_element compute through lcwra_element_from_circumstances and carer_element_from_circumstances, which the exception calls too. The formula's amount is a claimant's element when a claimant has the circumstance; any other amount is included when positive. 4. An element entered for the award decides alone: an entry of nil is not included though a claimant has the circumstance (reg 83(1)(a), (j)). The property reference reads entries the same way. 5. No blank line at the end of benefit_cap_capped_total.yaml. Tests: a YAML case for an LCWRA element entered as nil beside the claimant's limited capability; a pytest for each element under a reform that gives 6,000 beside another member's circumstance, and nil beside the claimant's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
The benefit cap lifted in two cases the law does not, and counted benefits it should not:
is_benefit_cap_exempt_other), lifted the cap. HB Regs 2006 reg 75F(1)(a) and UC Regs 2013 reg 83(1)(a) need ESA "which includes a support component".is_benefit_cap_exempt_other), LCWRA flag or caring.benefit_cap_reductionsummed every member's contributory ESA and JSA, incapacity benefit and SDA, and the whole unit's income-related ESA and income-based JSA. UC Regs 2013 reg 80(1) and HB Regs 2006 reg 75A count the benefits "to which the single person or couple is entitled". With UC of £20,000 before the cap, a non-dependent adult's £5,000 of ESA cut the family's UC from £14,753 to £9,753. Count only the claimant's and partner's legacy awards in means tests and passports #2027's review found this, and Count only the claimant's and partner's legacy awards in means tests and passports #2027 now leaves the whole cap to this PR.A third defect hid the first. Datasets set
is_disabled_for_benefits, the default foruc_limited_capability_for_WRA, from receipt of any of ten benefits, ESA included (policyengine-uk-datadisability_benefits.py). So the UC LCWRA exception lifted the cap for every ESA recipient, whatever their ESA group. Universal Credit takes the ESA work capability assessment (UC Regs 2013 reg 40(1)(a)(ii)). So a person whose own ESA lacks the support component is now taken not to have LCWRA, whatever the flag. The work allowance and the reduced minimum age need only limited capability for work, so they get a separateuc_limited_capability_for_work, which such a person keeps.Stacked on #2027 (
legacy-award-readers-claimant-partner, headf551e542b, last merged in at19a13f2c5), which is stacked on #2013, #2001 and #1896.Law
Fetched verbatim from legislation.gov.uk (
/data.xml, current revised text) on 2026-10-02.HB Regs 2006 regs 75A, 75E(2), 75F; UC Regs 2013 regs 2, 40(1), 79(1), 80(1), 83(1); UC (TP) Regs 2014 reg 19(4); WRA 2007 ss.2(2), 4(4); WRA 2012 s.96(10); HB Regs 2006 regs 2(1), 19, 20(1); UC Regs 2013 regs 4(6), 5(5)
HB Regs 2006 (SI 2006/213) reg 75F:
Reg 75E(2):
UC Regs 2013 (SI 2013/376) reg 83(1):
UC Regs 2013 reg 2: "attendance allowance" includes "armed forces independence payment under the Armed Forces and Reserve Forces (Compensation Scheme) Order 2011". WRA 2012 s.40: "claimant" means a single claimant or each of joint claimants.
UC Regs 2013 reg 40(1):
UC (Transitional Provisions) Regs 2014 reg 19(4): where it had been determined that a claimant moving from old style ESA "had limited capability for work-related activity ... (b) the claimant is to be treated as having limited capability for work and work-related activity for the purposes of regulation 27(1)(b) of those Regulations".
Welfare Reform Act 2007 s.2(2) (contributory allowance), and s.4(4) in the same words (income-related allowance):
UC Regs 2013 reg 79(1) and reg 80(1), the capped total:
HB Regs 2006 reg 75A:
Welfare Reform Act 2012 s.96(10): "welfare benefit" means bereavement allowance, child benefit, child tax credit, employment and support allowance (including income-related), housing benefit, incapacity benefit, income support, jobseeker's allowance (including income-based), maternity allowance, severe disablement allowance, universal credit, widow's pension, widowed mother's allowance or widowed parent's allowance.
HB Regs 2006 reg 2(1): "child" means a person under the age of 16. Reg 19(1): a "young person" is a person who falls within the definition of qualifying young person in section 142 of the Act; reg 19(2) excludes a person on income support, income-based JSA or income-related ESA, or entitled to universal credit. Reg 20(1): a person is responsible for a child or young person who is normally living with them. UC Regs 2013 reg 5(5): "A person who is receiving universal credit, an employment and support allowance or a jobseeker's allowance is not a qualifying young person." Reg 4(6): a child or qualifying young person looked after by a local authority is treated as not being anyone's responsibility.
Changes
ESA with the support component
has_own_esa_award(Person): the person claims ESA themselves. That means reported contributory ESA or a reported income-related award. When the family's income-related award is entered directly, the award goes to the claimant or partner who heads the benefit unit (else the eldest), so a couple's award has one recipient.esa_includes_support_component(Person): whether the person's ESA includes the support component (WRA 2007 ss.2(2), 4(4)).is_on_income_related_esa, from Count only the claimant's and partner's legacy awards in means tests and passports #2027).esa_contrib > 0term leavesis_benefit_cap_exempt_other.On the default: policyengine-uk-data also builds
esa_support_group_proxy, from labour-market status (working age, reported status long-term sick or disabled, no hours of work, and its ESA health-condition proxy). It agrees with the survey's own answer for 524 of those 629 records (83%). Assuming the support component agrees for 584 (93%). So the model uses the constant default and does not read the proxy. The survey's own answer is the better source; see the follow-ups.Who counts
is_responsible_for_child_or_young_person_for_uc_or_housing_benefit).is_child_or_young_person_for_legacy_benefits(HB regs 2, 19) oris_child_or_qualifying_young_person_for_universal_credit(UC regs 4-5) counts.uc_limited_capability_for_WRAstill defaults tois_disabled_for_benefits. A person whose own ESA award lacks the support component is now taken not to have LCWRA, whatever the flag. A determination of limited capability for work-related activity is what gives ESA its support component, and Universal Credit takes it (UC Regs 2013 reg 40(1)(a)(ii); UC (TP) Regs 2014 reg 19(4)).uc_LCWRA_element, the cap and thedisability_basic_incomecontrib reform.uc_LCWRA_elementand the work allowance still read every member of the benefit unit: a non-dependant's own ESA would add an LCWRA element to the family's Universal Credit. Count only the claimant's and partner's legacy awards in means tests and passports #2027's legacy-award invariance test caught exactly that. It can follow Give the UC LCWRA and carer elements, the work allowance and the benefit cap exceptions on the claimants' circumstances only #1989's claimant-only element.uc_limited_capability_for_work=uc_limited_capability_for_WRAoris_disabled_for_benefits.esa_income: the element is positive although no member's circumstances give it.is_benefit_cap_exempt_earningsandis_benefit_cap_exempt_otherlose the benefit sums they computed and never used. The earnings test and the State Pension age test return what they returned before. The labels that named the wrong test are corrected.The capped total
benefit_cap_reductionnow counts:claimant_or_partner_esa_incomeandclaimant_or_partner_jsa_income, from Count only the claimant's and partner's legacy awards in means tests and passports #2027);Another member's own award no longer reduces the family's Universal Credit or Housing Benefit.
esa,jsa,household_benefitsand household income keep the full awards. Maternity allowance and the bereavement benefits are welfare benefits too (s.96(10)); they were not in the model's total and are not added here.Review of the other exceptions
is_benefit_cap_exempt_earnings, UC reg 82): unchanged here. Its defects (total income tax, the hard-coded £846 threshold, any member's earnings) are fixed by Use each rule's own Universal Credit earned income in the benefit cap, targeted childcare and local CTR #1999 (on Deduct only each person's own tax and NI on earnings from UC earned income #1949) and Fix benefit cap exemption defects (#1818) #1820.is_benefit_cap_exempt_other): unchanged. It still exempts a family with any member over State Pension age, including a non-dependant. Apply the benefit cap to mixed-age couples on Universal Credit, and keep them off pensioner Council Tax Reduction #1944 replaces it withhousing_benefit_pension_age_regulations_apply(UC regs 79-83 have no age exception; HB (SPC) Regs have no cap), and Use the State Pension Credit qualifying age, and start-of-year status for Class 4 NI #1907 uses the Pension Credit qualifying age.is_entitled_to_carer_benefit.Invariants (property-tested)
test_benefit_cap_specified_benefits_properties.pydraws up to six families per simulation.hypothesis.eventrecords every role and circumstance drawn.is_benefit_cap_exempt_health_disability,is_benefit_cap_exempt_other,is_benefit_cap_exempt,benefit_cap,benefit_cap_reductionoruniversal_credit(with £30,000 of UC before the cap), whatever disability or carer benefits, ESA, JSA, incapacity benefit, SDA, disability flag or caring they have.Properties 1-3 run 40 random examples each. Property 4 is a deterministic table. #2027's legacy-award invariance test reads the cap exemption again (#2027 had dropped it when it handed the cap over). All pass: 16 tests across the two files.
Known violations, out of scope. A non-dependant's age and earnings still lift the cap, through
is_benefit_cap_exempt_other(#1944, #1907) andis_benefit_cap_exempt_earnings(#1999, #1820). The draws keep the non-dependant under State Pension age and without earnings.On the base (
3803dda0d), in the single-head table with the support component left to the default, 60 of the 128 families disagree with the reference. For example:On #2027's earlier head
200a1cdc4, Hypothesis's minimal counterexample for properties 1 and 2 was a 25-year-old claimant whose benefit unit adds a 17-year-old non-dependant receiving attendance allowance: the family became exempt.Tests
YAML:
gov/dwp/benefit_cap/benefit_cap_specified_benefits.yamlhas 56 cases, each hand-computed from the regulation and the 2025-26 caps (UC reg 80A(2), HB reg 75CA). Every head has a case where a non-dependent adult holds the benefit.YAML, the capped total:
gov/dwp/benefit_cap/benefit_cap_capped_total.yamlhas 5 cases on UC and Housing Benefit amounts.Other YAML:
benefit_cap.yaml: a 16-year-old out of education gives the family rate (£22,020). This is unchanged; it pins the reg 5(1)(a) approximation. The family-rate helper does not yet apply reg 5(5), because the LHA non-dependant test shares the rule and must change with it (follow-up).legacy_award_readers/passports.yaml(from Count only the claimant's and partner's legacy awards in means tests and passports #2027): the two benefit cap cases now state the support component.On the base (
3803dda0d):benefit_cap_specified_benefits.yamlfails 36 of 56 cases.benefit_cap_capped_total.yamlfails 3 of 5 cases, all on value. A non-dependant's ESA exempts the whole family there, and a non-dependant's income-based JSA takes £247 off the family's Housing Benefit.Runs:
19a13f2c5:gov/dwpandfinance/benefitYAML, 669 passed; the cap and legacy-award properties, 16 passed.830306211(before the merge off551e542b): YAML 1,635 passed; pytest 2,086 passed, 45 skipped. Full suites on19a13f2c5: running.ruff formatandruff checkare clean.Enhanced FRS impact
Real
Microsimulationruns on a private copy of the Enhanced FRS 2024-25 (sha256e433e532…), one per package state:3803dda0d(Count only the claimant's and partner's legacy awards in means tests and passports #2027's head when this branch merged it);521373814, the exemption changes;830306211, which adds the capped total.Then again on #2027's newer head
f551e542b(payee-only "on") against this branch's19a13f2c5. The results are identical in every aggregate and every benefit array.Aggregates only.
The dataset as it stands: £0 in every year 2025-2030. Every benefit, household total (including
gov_spendingandhbai_household_net_income) and poverty rate is unchanged, and no benefit unit loses the overall exemption.3803dda0d→521373814, andf551e542b→19a13f2c5). Only the component flags move.is_benefit_cap_exempt_otherloses its armed forces and contributory ESA terms. That flips it for 912 records, about 780,000 benefit units weighted. All stay exempt: 845 throughis_benefit_cap_exempt_health_disability, now limited to the claimant and partner, and the other 67 through earnings.is_benefit_cap_exempt_health_disabilityturns false for 69 benefit units, about 27,000 weighted, in every year. All 69 stay exempt through earnings.521373814→830306211). No benefit unit's reduction changes by more than a penny; the largest difference is £0.002, from the order of summation. The dataset has 74 non-dependant records, about 18,000 people weighted, and none reports ESA.Sensitivity: the survey's own ESA group. The same copy, with
esa_includes_support_componenttaken from FRS 2024-25ESAGroupfor the 629 ESA recipients in FRS-sourced records who answered it. Of those, 584 are in the support group. The stacked SPI-synthetic and capital-gains copies do not link back to FRS records and keep the default.Base run on the same copy against the branch (
f551e542b→19a13f2c5;3803dda0d→830306211gives the same table):Axiom
axiom: TheAxiomFoundation/rulespec-uk#425 queued
None of these provisions is in the corpus: HB Regs 2006 regs 75A, 75E and 75F; UC Regs 2013 regs 79, 80 and 83; WRA 2007 ss.2 and 4; WRA 2012 s.96. rulespec-uk encodes UC regs 80A, 81 and 82, and its reg 81 takes the capped total as an input. The issue holds the verbatim law, the required outputs, a pasteable
review_findingand companion tests taken from this PR's YAML. It extends #389 (regs 79/83, the age question) and #416 (reg 75F(1)(a), from #2027).Coordination
is_benefit_cap_exempt_health_disabilityand left the cap to this PR.3803dda0dkeeps this branch's version of that file and of the cap cases inpassports.yaml, and takes Count only the claimant's and partner's legacy awards in means tests and passports #2027's deletion ofutils/inputs.py.f551e542btakes its payee-only "on". The cap's ESA head readsis_on_income_related_esafor receipt, and two YAML cases now expect only the payee to be on the award.benefit_cap_reduction.pytoo. Keep this PR's claimant-or-partner lists when resolving.The same lines are edited by several other open PRs; whichever lands second resolves by hand:
is_uc_assessed_claimantand UC's QYP test, and readsuc_LCWRA_element > 0. It still lets anyesa_incomeor claimantesa_contriblift the cap.is_claimant_or_partneruntil Count only claimants' income in Universal Credit #1978 lands, thenis_claimant_or_partner | is_uc_assessed_claimant.afcsand ESA terms fromis_benefit_cap_exempt_other. Those terms now live, scoped, inis_benefit_cap_exempt_health_disability.is_entitled_to_carer_benefitinYOUNG_PERSON_BENEFITS, and drop its hunks in the deadQUAL_PERSONAL_BENEFITSlists that this PR deletes.Follow-ups
ESAGroup, benefits table VAR3 for BENEFIT 16: 1 work-related activity group, 2 support group, 3 assessment phase). policyengine-uk-data can supply a completeesa_includes_support_componentcolumn from it. Until then, no dataset result depends on the support component.is_responsible_for_child_or_young_person_for_uc_or_housing_benefitandlha_renter_has_non_dependantshould stop counting a 16-year-old who receives benefits in their own right or is looked after. Both have to change together.🤖 Generated with Claude Code