Model a Universal Credit claim by a member of a couple as a single person (UC Regs 2013 reg 3(3)) - #2084
Model a Universal Credit claim by a member of a couple as a single person (UC Regs 2013 reg 3(3))#2084MaxGhenis wants to merge 4 commits into
Conversation
A member of a couple whose partner cannot be a joint claimant claims as a single person (UC Regs 2013 reg 3(3)); regs 18, 22 and 36 then set the award. - is_uc_single_or_joint_claimant: the WRA 2012 s.40 claimant (claimant or partner, less the partner who cannot be a joint claimant). - uc_member_of_couple_claims_as_single_person: the benefit unit flag. - uc_is_ineligible_partner derives reg 3(3)(a) (under 18, outside reg 8) from meets_uc_minimum_age_condition; (b)-(e) stay inputs. - reg 36(3): single standard allowance at the claimant's own age. - s.4 / reg 3(3): only a claimant can meet the age conditions. - regs 27(1), 29(1): no LCWRA or carer element for the other member. - reg 80A(2): single-claimant cap limits (ADM E5007 note 3). - reg 83(1): the other member's benefits do not lift the cap. - Sch 4 para 28(2): shared accommodation rate on the renter's own age and exceptions (ADM F3213). - reg 32(1): the claimant must be in paid work; the other member is tested as a partner (no change in result). - regs 18(2), 22(3), 82(1)(a): unchanged; the partner's capital, income, LCW for the work allowance and earnings already count. Tests pin them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Seven invariants over generated couples, each calculated as a reg 3(3) single claim, as joint claimants and as the claimant alone: single standard allowance at the claimant's age (reg 36(3)); maximum amount equal to the solo claimant's (regs 27, 29, 36(3), Sch 4 paras 9, 10, 28, 29); deduction equal to the joint claimants' (reg 22(3)); capital equal to the joint claimants' (reg 18(2)); single cap rate exactly when childless and cap exceptions ignoring the other member (regs 80A, 83); reg 3(3)(a) derivation; and a flag marking no single claim leaving the rules Housing Benefit shares unchanged. Mutation-checked: reverting the LCWRA, standard allowance, cap rate or guard change each fails its property. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…y fixtures Main's claimant-or-partner inference (#1896) presumes a member under 20 who is at least 16 years younger than the claimant to be the claimant's child. The work-related group properties generate couples such as 52 and 18 without relationship inputs, so after main was merged in the 18-year-old was read as a child, the reg 3(3) flag landed on someone outside the couple, and test_partner_who_cannot_be_a_joint_claimant failed (it fails the same way on 6db0ab1, before this branch's own changes). Set is_claimant_or_partner from each generated role, as #1949 did for its fixtures in a57caf1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…per properties From the independent review of 649503f (no P1s; three P2s and P3s): - The benefit cap rate and exceptions and the LHA shared accommodation test serve Housing Benefit too, which has no single claim by a member of a couple. A family claiming legacy benefits (claims_legacy_benefits) now keeps the couple rules there; the UC award itself is unchanged. Helpers single_claim_in_rules_shared_with_legacy_benefits and other_member_of_single_claim_in_shared_rules; changelog says so. - uc_member_of_couple_claims_as_single_person requires a claimant who meets the s.4(1)(a) and (b) age conditions, so a claimant over State Pension age with a flagged partner is no single claim (docstring corrected). - Property tests: generate AFCS and contributory ESA (the docstring claimed them); explicit examples, including ADM E2017's Tom and Jane, on every property, and test_examples_reach_the_cases showing each rule changes; property 6 uses the reg 3(3)(a)/reg 8 text as its oracle; the cap-rate oracle reads only families whose children are under 16. - YAML: a legacy-claiming family case; a child in the childcare cases; the reg 82 comment states the model's fixed 10,152 threshold too; the pension-age case asserts no single claim. - is_uc_claimant's docstring points to is_uc_single_or_joint_claimant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Coordination with #2088 (updated for #2088's rename of the offer input), which models UC Regs 2013 reg 32 (the childcare work condition's partner exceptions, reg 32(2) treated-as-working, and offers of paid work). Both PRs edit def formula(benunit, period, parameters):
person = benunit.members
# WRA 2012 s. 40 claimants: a single claimant or each joint claimant.
claimant = person("is_uc_single_or_joint_claimant", period)
# Also the other member of a reg. 3(3) single claim, who is tested
# under reg. 32(1)(b) "whether claiming jointly or as a single person".
claimant_or_partner = person("is_uc_claimant", period)
# Reg. 32(2) treats "a claimant" as in paid work, so not the other
# member of a single claim.
treated = claimant & person("uc_childcare_treated_as_in_paid_work", period)
in_paid_work = person("in_work", period) | treated
meets_claimant_limb = in_paid_work | person(
"uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period",
period,
)
meets_other_member_limb = in_paid_work | person(
"uc_unable_to_provide_childcare", period
)
fails_other_member_limb = claimant_or_partner & ~meets_other_member_limb
others_failing = (
benunit.project(benunit.sum(fails_other_member_limb))
- fails_other_member_limb
)
return benunit.any(claimant & meets_claimant_limb & (others_failing == 0))Your two reg 32 cases in A case worth adding after the merge. In a reg 3(3) single claim, the claimant works and the other member receives SMP (no work, no exception). Expected: #2088's property tests ( 🤖 Generated with Claude Code |
|
#2089 is stacked on this PR. It gives Universal Credit and Housing Benefit their own benefit cap and LHA shared-accommodation variables and drops the
#2089 removes #2089's landing job waits for this PR to merge. |
Summary
When the other member of a couple cannot be a joint Universal Credit claimant, the member who can claims as a single person (UC Regs 2013 reg 3(3)). #2081 added the input
uc_is_ineligible_partnerfor that other member and used it only for the minimum income floor. This PR models the rest of the award. It follows reg 3(3), which says "regulations 18 (capital limit), 36 (amount of elements) and 22 (deduction of income and work allowance) provide for the calculation of the award in such cases":meets_uc_minimum_age_condition). This is ADM E2017's worked example: Jane is 17 and Tom is 19, so "Tom is required to claim for himself as a single person". Limbs (b)-(e) (not in Great Britain, prisoner, reg 19, s.115 IAA 1999) are not observed and stay inputs.Example, 2026-27: two 30-year-olds, no children, no rent. One cannot be a joint claimant, and that member earns £6,000.
Impact: £0 on the Enhanced FRS, as expected. These are real Microsimulation runs on the Enhanced FRS 2024-25 (sha256
e433e532…), one run per package state, every year 2025 to 2030: base6db0ab118against branch649503f7b, then again against17b9b8a16after the review fixes. Both branch runs give the same result.Stack and base
uc-mif-work-related-groups, head94b7129b4). Apply the UC minimum income floor only to claimants subject to all work-related requirements #2081 sits on Apply the UC minimum income floor to net earned income against a net threshold #1973 and Deduct only each person's own tax and NI on earnings from UC earned income #1949.is_claimant_or_partner), which rewrote most of the files here. So this branch mergesorigin/uc-earned-income-own-tax(Deduct only each person's own tax and NI on earnings from UC earned income #1949, which carries main) into Apply the UC minimum income floor only to claimants subject to all work-related requirements #2081 first, at6db0ab118. That merge had two conflicts, both in Apply the UC minimum income floor to net earned income against a net threshold #1973's files:uc_individual_earned_income.py: kept Apply the UC minimum income floor to net earned income against a net threshold #1973's floor formula, and moved Deduct only each person's own tax and NI on earnings from UC earned income #1949's age-75 limit on relievable pension contributions intouc_individual_earned_income_before_mif.py;6db0ab118, so the diff shows only this work. Retarget tomainonce Apply the UC minimum income floor only to claimants subject to all work-related requirements #2081 has merged. CI runs only on PRs intomain.Law (legislation.gov.uk, fetched 2026-10-02)
UC Regs 2013 (https://www.legislation.gov.uk/uksi/2013/376):
Reg 22(1)(b)(i) has no work allowance only "where a single claimant does not have, or neither of joint claimants has, responsibility for a child or qualifying young person or limited capability for work".
Welfare Reform Act 2012 s.40 (https://www.legislation.gov.uk/ukpga/2012/5/section/40): "'claimant' means a single claimant or each of joint claimants".
DWP Advice for Decision Making:
22.yamldoes.Change
New:
is_uc_single_or_joint_claimant(Person). The claimant in WRA s.40's sense:is_uc_claimant(the two eldest), lessuc_is_ineligible_partner.uc_member_of_couple_claims_as_single_person(BenUnit). One member of the couple is the ineligible partner, and the other is a claimant who meets the s.4(1)(a)-(b) age conditions.utils/uc_work_related_requirements.py:other_member_of_single_claim: the partner of such a claimant. A flag with no claimant beside it marks nothing.single_claim_in_rules_shared_with_legacy_benefitsandother_member_of_single_claim_in_shared_rules: the same, for the rules Housing Benefit shares, and false for a family claiming legacy benefits.Changed:
uc_is_ineligible_partner: has a formula for limb (a) (a couple member who failsmeets_uc_minimum_age_condition); still an input for limbs (b)-(e). A member under 16 is treated as within (a) whatever their circumstances. Strictly, reg 3(3)(a) then gives the other member no single claim; the model does not follow that.uc_standard_allowance_claimant_type: counts s.40 claimants and uses their ages (reg 36(3)).is_uc_eligible: the qualifying claimant must be an s.40 claimant.uc_LCWRA_element,uc_carer_element: nothing for the other member of a single claim (regs 27(1), 29(1)). The carer element keeps itsbenunit_has_carerroute.is_benefit_cap_single_claimant_rate: true for a single claim without a child (reg 80A(2)), unless the family claims legacy benefits.is_benefit_cap_exempt_health_disability,is_benefit_cap_exempt_other: the other member's own benefits, LCWRA, AFCS and contributory ESA lift no cap (reg 83(1)), unless the family claims legacy benefits.is_lha_shared_accommodation_rate_specified_renter: applies to a member of a couple claiming as a single person, on the renter's own age and exception (Sch 4 paras 28(2), 29(5)), unless the family claims legacy benefits.is_uc_claimant: docstring only, pointing tois_uc_single_or_joint_claimant.uc_childcare_work_condition: the claimant must be in work and the other member is tested as a partner (reg 32(1)). Same result as before: both members of a couple must work, and the reg 32(1)(b) exceptions are still not modelled.Unchanged and already right, now pinned by tests:
uc_assessable_capitalcounts both members of the couple;uc_earned_income,uc_unearned_incomeandis_uc_work_allowance_eligibleread both members;Two existing tests change expectation. A couple aged 30 and 17 used to be treated as joint claimants, and
benefit_cap.yamlsaid "UC reg 3(3) permits some couples to claim as singles, not modelled here". The 30-year-old now claims as a single person (ADM E2017), so they get the single cap of £14,753 and the shared accommodation rate. A new sibling case in each file gives the 17-year-old a reg 8(1)(c) circumstance (caring); that couple claims jointly, with the couple cap and no shared rate.Modelling choices and limits
claims_legacy_benefits: reported CTC, WTC, HB, income-related ESA, IS or income-based JSA) keeps the couple rules there.claims_legacy_benefits.Tests
claims_as_single_person.yaml(27 cases). Each expected value is hand-computed from the reg 36, 22 and 80A tables in force for 2026-27 (UC Act 2025, SI 2026/113, SI 2026/148) and NMW Regs reg 4 (£12.71). The cases cover:test_uc_single_claim_properties.py, 7 Hypothesis properties. Generated couples are calculated three ways: as a single claim, as joint claimants and as the claimant alone. Each property also runs on explicit example families, including ADM E2017's Tom and Jane.A further test,
test_examples_reach_the_cases, checks that the examples change each rule they target. Mutation-checked: reverting the LCWRA, standard allowance, cap rate or guard change each fails its property.Apply the UC minimum income floor only to claimants subject to all work-related requirements #2081's property fixtures now declare
is_claimant_or_partner, as Deduct only each person's own tax and NI on earnings from UC earned income #1949 did in a57caf1. Main's presumption read a generated 18-year-old partner of a 52-year-old as their child, sotest_partner_who_cannot_be_a_joint_claimantfailed on6db0ab118itself.Targeted runs on this head: the UC YAML folder; the whole
policyengine_uk/tests/policyYAML tree (one process);test_uc_single_claim_properties.py; and these property files: work-related groups, minimum income floor, child and adult definitions, earnings deductions, State Pension, unearned benefits, Lifetime ISA capital, abolish-benefit-cap scenario, UC deductions, rebalancing, Housing Benefit pension age, means-test income and code health. All pass on17b9b8a16:test_uc_single_claim_properties.pyand the code-health tests, 1,851 tests plus 1 test already marked as an expected failure.These were run on a detached copy of the head, so no edit could reach the run.
Coordination with open PRs
is_uc_assessed_claimantkeeps the reg 3(3) partner, which is right for income and capital (regs 18(2), 22(3)). Its docstring should say so, and itsuc_childcare_work_conditionshould keep "the s.40 claimant is in work".other_member_of_single_claim). Its work allowance should keep them, because reg 22(3) is "as if joint claimants".is_claimant_or_partner; for UC reg 83 it needs& ~other_member_of_single_claim_in_shared_rules(person, period). Separately, its pension-age cap exception (has_pensioner, any member) has no basis in UC regs 82-83; that predates this PR.Comments on those PRs say the same.
axiom:
uk/regulations/uksi/2013/376/18,/22,/32,/90andschedule/4/paragraph/28are encoded-correct for this case. Their companion tests are, in order,single_claimant_member_of_couple_includes_other_member_capital,member_of_couple_claiming_as_single_uses_joint_claimant_deduction,couple_claimant_treated_as_paid_work_and_other_member_unable,couple_claiming_as_single_by_regulation_3_3_meets_combined_thresholdandrenter_meets_all_specified_renter_conditions. The rest is queued:All are dispatch-ready.
Review: round 1 (independent Opus review via Subfleet, head
649503f7b) asked for changes, with no P1s; every finding is addressed in17b9b8a16. Round 2 is running.🤖 Generated with Claude Code