Skip to content

Apply the UC childcare work condition's partner exceptions and treated-as-working rules (UC Regs 2013 reg 32) - #2088

Merged
MaxGhenis merged 7 commits into
mainfrom
uc-childcare-partner-exceptions
Oct 3, 2026
Merged

MaxGhenis merged 7 commits into
mainfrom
uc-childcare-partner-exceptions

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

uc_childcare_work_condition required every claimant and partner to be in work. Its documentation said the partner exceptions in UC Regs 2013 reg 32(1)(b) and the treated-as-working rules of reg 32(2) were not modelled. This PR models them:

  • Partner exceptions (reg 32(1)(b)). The other member of a couple who is not in paid work no longer blocks the childcare element if they are unable to provide childcare because they
    • (i) have limited capability for work: uc_limited_capability_for_WRA, the approximation main already uses for LCW in the work allowance and the reg 8 minimum age. It defaults to is_disabled_for_benefits (disability benefit receipt), not an observed work capability assessment;
    • (ii) have regular and substantial caring responsibilities for a severely disabled person (defined in reg 30): is_carer_for_benefits, an approximation. It means receipt of Carer's Allowance or Carer Support Payment, or at least 35 hours of care a week. The hours branch doesn't check that the person cared for is severely disabled, or that the carer isn't paid for the caring;
    • (iii) are temporarily absent from the claimant's household: a new input, uc_is_temporarily_absent_from_claimant_household. Nothing in the model observes this.
  • Treated as in paid work (reg 32(2)(b)). A claimant receiving statutory sick pay, statutory maternity pay, statutory paternity pay or maternity allowance is treated as in paid work. The new variable is uc_childcare_treated_as_in_paid_work.
  • Offer of paid work (reg 32(1)(a)). A new input, uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period, meets the claimant's limb only, not the other member's.
  • Pairwise test. Each joint claimant is a claimant (WRA 2012 s.40), so the condition holds when one member meets limb (a) and the other meets limb (b). It does not have to be any particular one. The formula tests exactly that: some claimant meets (a) and no other claimant fails (b). It is not any(a) & all(b), which wrongly fails a claimant with only an offer of work and a working partner. The property tests below include that mutant and kill it.

Example, 2025-26: the claimant earns £15,000, the partner has limited capability for work and doesn't work, and they have one child aged 3 with £5,000 of childcare costs.

main this PR
uc_childcare_work_condition false (the partner is not in work) true (32(1)(b)(i))
uc_childcare_element £0 £4,250 = min(5,000 × 85%, 1,031.88 × 12) (reg 34)

Law

UC Regs 2013 reg 32 (legislation.gov.uk data.xml, current version fetched 2026-10-02):

32(1) The work condition is met in respect of an assessment period if— (a) the claimant is in paid work or has an offer of paid work that is due to start before the end of the next assessment period; and (b) if the claimant is a member of a couple (whether claiming jointly or as a single person), the other member is either in paid work or is unable to provide childcare because that person— (i) has limited capability for work, (ii) has regular and substantial caring responsibilities for a severely disabled person, or (iii) is temporarily absent from the claimant's household.

(2) For the purposes of meeting the work condition in relation to an assessment period a claimant is to be treated as being in paid work if— (a) the claimant has ceased paid work— (i) in that assessment period, (ii) in the previous assessment period, or (iii) if the assessment period in question is the first or second assessment period in relation to an award, in that assessment period or in the month immediately preceding the commencement of the award; or (b) the claimant is receiving statutory sick pay, statutory maternity pay, ... statutory paternity pay, ... statutory adoption pay, statutory shared parental pay, statutory parental bereavement pay, statutory neonatal care pay or a maternity allowance.

Reg 30(1) defines (ii): a person who satisfies the conditions for carer's allowance (or would, but for the earnings limit or Scottish residence), or who is entitled to carer support payment.

ADM chapter F7 agrees:

  • F7012: for a couple, "the claimant can be in paid work, or have an offer of paid work but the other member has to be in paid work, or fall into the exceptions in F7013".
  • F7013: lists the three exceptions. Its example: Ben works two days a week, and Sara cares full time for her disabled mother, who lives with them. "Both Ben and Sara satisfy the paid work test." The YAML tests encode that example; the mother receives the higher rate of attendance allowance, so is a "severely disabled person" (SSCBA 1992 s.70(2)).
  • F7015: lists the reg 32(2) payments.

What is still not modelled

  • Reg 32(2)(b), four payments. The model has no variables for statutory adoption pay, shared parental pay, parental bereavement pay or neonatal care pay. Adding them as income runs across income tax, NI and every means test, so it is a separate piece of work: chip "Add the missing statutory payments".
  • Reg 32(2)(a), ceasing paid work. The model is annual, so this is covered only as far as the in_work proxy covers it: hours or earnings at any point in the year count as paid work.
  • The full legal tests behind the exceptions.

Invariants

These hold for every input in the tested domain, and the tests run them. The domain is single claimants and couples, each with one dependant child or young person. Workers have employment income, self-employment income or hours alone, the three routes into the in_work proxy. The exceptions are the model's approximations above (the reference reads the LCWRA input and care hours ≥ the Carer's Allowance minimum), not the full legal tests.

  1. Differential, exhaustive over route sets. The condition equals a reference transcribed from reg 32 in pairwise form: (a)(A) ∧ (b)(B), or (a)(B) ∧ (b)(A). This is checked for all 6 routes (work, a listed payment, an offer, LCW, carer, absence):

    • every single claimant's route set with each of the four payments and each of the three kinds of work (64 × 4 × 3 = 768 cases);
    • every pair of route sets for a couple (64 × 64 = 4,096), with the payment and the kind of work cycling across pairs. A carer cares for exactly the minimum hours as the first member and 50 as the second, and a non-carer for one hour under the minimum;
    • each of the four payments for a couple where one member has only an offer of work and the other only that payment (8 more), because that is where a payment alone decides limb (b).

    Every family has a dependant: idle in half of them, with a cycling route set of its own in the rest.

  2. Monotonic. Giving any member paid work, a listed payment, an offer or an exception never removes the condition.

  3. A couple both in paid work always meet it.

  4. With no member meeting limb (a), no exception meets it.

  5. Swapping the two members of a couple doesn't change the result.

  6. A dependant's work, payments and circumstances never matter.

  7. The childcare element is never negative, and it is zero whenever the condition fails.

Mutation check. Ten mutants each fail the exhaustive differential test, and the real formula passes:

  • main's formula;
  • any(a) & all(b);
  • dropping the carer limb;
  • dropping the absence limb;
  • dropping maternity allowance;
  • withholding reg 32(2) from the other joint claimant;
  • counting a dependant's failure of limb (b) (dropping claimant &);
  • reading paid work as employment income only;
  • leaving maternity allowance out of the other member's limb only;
  • counting any care hours, not the minimum, as caring.

Three versions of the test let mutants through:

  • the first, random-only version of the test missed two of the first six, which is why the exhaustive test exists;
  • round 1 of the independent review found two more passing the first exhaustive version, which had no dependants and only employed workers;
  • round 2 found the last two: the cycling never paired maternity allowance with an offer-only member, and every non-carer had zero care hours.

The test now builds those cases and kills all of them.

Tests

  • uc_childcare_work_condition_reg_32.yaml: 25 cases worked by hand from reg 32, reg 30 and ADM F7011-F7015.
    • They include the Ben and Sara example (with Sara's mother on the higher rate of attendance allowance), every listed payment the model has, and self-employment as paid work.
    • One case pairs a claimant with only an offer of work and a partner on maternity allowance. It holds because the claimant meets (a) and the partner, treated as in paid work, meets (b); the other pairing fails.
    • They cover the negative cases: the exceptions don't stand in for the claimant's own work, a single claimant has no partner limb, and an offer meets only limb (a).
    • Two cases have three flagged claimants. That is a data error, not a legal couple, and they pin how the formula generalises: some claimant meets (a) and every other claimant meets (b).
  • test_uc_childcare_work_condition_properties.py: invariants 1-7 with Hypothesis, plus the exhaustive test. It runs in about 90 s locally.
  • Existing tests. The existing work-condition tests are unchanged, except that one comment now explains why the 17-year-old partner still fails.
  • Locally: all 44 childcare-element YAML tests pass, as do 211 UC, 181 DfE and 479 other UC-touching YAML tests (HB, CTR, benefit cap, DWP, TFC, Scottish child payment, entitledto integration).

Impact (Enhanced FRS)

These are real Microsimulation runs, one per package state, on the Enhanced FRS 2024-25 (sha256 e433e532…, the same file as the other UC PRs this week), for every year 2025 to 2030. Base is main 6fa14dc0e. The branch is this PR's head, ff075c8fa, which is the PR merged with that main. Both are clean trees. Every figure below is identical, to the £1,000, to the two earlier pairs of runs: main 788d692ea against 634465e29, and main 3c48247eb against db826f6fa.

2025 2026 2027 2028 2029 2030
Universal Credit +£46.3m +£47.5m +£48.7m +£49.8m +£51.1m +£52.3m
Benefit units newly meeting the work condition (weighted) 554k 556k 558k 560k 579k 582k
UC benefit units newly getting the childcare element (weighted) 10.8k 10.8k 10.9k 10.9k 10.9k 11.0k
  • Where the UC change lands. All of it is the childcare element. UC caseload, the benefit cap, HB, CTR and the DfE childcare grant are unchanged. Household net income rises by the same amount (within £70 in every year when summed in float64 from the saved per-record arrays, a local check). Poverty rates (BHC, AHC, children, working age, deep) do not change.
  • No one loses. No benefit unit goes from meeting the condition to failing it.
  • Every newly qualifying unit is a couple. In 2026, 769 records (556k weighted) newly meet the condition:
    • 594 through the partner's limited capability for work;
    • 145 through caring;
    • 30 through both.
  • Two routes never fire in the data.
    • Absence and offers of work are inputs the FRS doesn't supply.
    • Reg 32(2)(b) changes nothing. All 455 records receiving SSP or SMP already have hours or earnings, so in_work already counts them.
  • Most qualifying couples are unaffected. They either have no childcare costs or aren't on UC.
  • The UC figure rests on very few records. In 2026 the change is 6 records in UC (10.8k benefit units weighted), and one benefit unit is 68% of the change. Treat it as an order of magnitude, about £50m a year, not a point estimate.

Interactions with open PRs

axiom: uk/regulation/uksi/2013/376/32 (1)(b)(i) and the (2)(b) SSP limb encoded-correct (32.test.yaml couple_claimant_treated_as_paid_work_and_other_member_unable); TheAxiomFoundation/rulespec-uk#430 queued (reg 32(2) for the other joint claimant, either joint claimant as "the claimant", and companion cases for (b)(ii)-(iii), each payment and offers)

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 2, 2026 13:30
UC Regs 2013 reg 32(1)(b): the other member of a couple who is not in
paid work still lets the claimant meet the work condition if they have
limited capability for work, have regular and substantial caring
responsibilities for a severely disabled person, or are temporarily
absent from the claimant's household. Reg 32(2)(b) treats a claimant
receiving SSP, SMP, SPP or maternity allowance as in paid work, and
reg 32(1)(a) also accepts an offer of paid work for the claimant's limb.

The condition is now pairwise: one claimant meets limb (a) and every
other claimant meets limb (b). Limb (i) uses uc_limited_capability_for_WRA,
(ii) is_carer_for_benefits, (iii) a new input. Adds YAML tests from the
law and ADM F7011-F7015, and property tests including an exhaustive
differential check against a reference transcribed from reg 32.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 4 commits October 2, 2026 22:10
- Describe the limited-capability and caring exceptions as the
  approximations they are. is_carer_for_benefits' hours branch checks
  neither the cared-for person's qualifying benefit (SSCBA 1992 s.70(2),
  imported by reg 30(1)(a)) nor the reg 30(3) paid-care exclusion.
- Rename the offer input to
  uc_has_offer_of_paid_work_starting_by_end_of_next_assessment_period,
  so its name carries reg 32(1)(a)'s deadline.
- Property tests: workers have employment income, self-employment income
  or hours alone, and every exhaustive family has a dependant. This kills
  two mutants the first exhaustive version missed (an unmasked dependant,
  and employment income standing in for in_work).
- YAML: Ben and Sara's case now includes Sara's mother on the higher rate
  of attendance allowance; add three-flagged-claimant cases and a
  self-employment case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The exhaustive test now tries every payment where one member of a couple
has only an offer of work and the other only that payment, and gives
non-carers one hour under the minimum care hours. That kills a limb (b)
that leaves out maternity allowance and a carer test of any care hours.
Adds a YAML case: an offer-only claimant with a partner on maternity
allowance.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The partner on maternity allowance meets both limbs; the condition holds
because the offer-only claimant meets (a) and the partner meets (b).

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

Copy link
Copy Markdown
Collaborator Author

Independent review record (Subfleet review lanes; the reviews are kept locally):

Round Head Reviewer Verdict
1 db826f6fa GPT-6.1 Sol REQUEST_CHANGES
2 634465e29 Opus 5.5 APPROVE
3 6ff7b11d5 Opus 5.5 APPROVE
4 b3caf17e3 Opus 5.5 APPROVE
  • Round 1 asked for three fixes, all made in cf72330f1:
    • P1: describe is_carer_for_benefits as an approximation of reg 30, not "the reg 30 test";
    • P2: the differential test lacked dependants and workers paid other than by employment income;
    • P3: the offer input's name.
  • 634465e29 merges main 788d692ea. The impact was re-run against that main, with figures identical to the £1,000.
  • Rounds 2 and 3 each raised only optional P3s: two more mutants, a test comment and some PR-body wording. All are fixed in 6ff7b11d5 and b3caf17e3.
  • Round 4 approved the current head, b3caf17e3.

🤖 Generated with Claude Code

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

Copy link
Copy Markdown
Collaborator Author

Merge record. ff075c8fa merges main 6fa14dc0e into round 4's approved head b3caf17e3. It was needed because #2115 moved PR CI to Linux; the previous macOS Test run was cancelled at GitHub's 6-hour limit.

  • Review. A merge-only delta review (GPT-6.1 Sol) APPROVEs ff075c8fa with no findings. The PR's diff against main is byte-identical to b3caf17e3's, and no PR file overlaps main's 75 incoming files.
  • Impact. Re-run at this head: main 6fa14dc0e against ff075c8fa. It is identical to the £1,000 to the earlier runs.
  • CI. 6/6 checks green on ff075c8fa.

Merging with a merge commit, pinned to ff075c8fa.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis merged commit 99d0448 into main Oct 3, 2026
6 checks passed
@MaxGhenis
MaxGhenis deleted the uc-childcare-partner-exceptions branch October 3, 2026 16:22
MaxGhenis added a commit that referenced this pull request Oct 4, 2026
Resolves conflicts with #1896 (claimant and partner), #1950 (no capital
income in UC), #1949, #1973 and #2088 (reg. 32 exceptions): the income
sums, the childcare work condition and the minimum income floor read
is_uc_assessed_claimant; fixtures that relied on the old is_uc_claimant
fallback flagging an adult child now supply the roles; the reg. 22
differential expects pensions plus tariff income, since savings interest
is not reg. 66(1) income for anyone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 6, 2026
…-3-single-claim

#2081, #1973 and #1949 have merged, so main now carries this PR's base.
Conflicts and their resolutions:

- uc_individual_earned_income_before_mif.py: main's version (the age-75
  pension contribution limit as #1949 landed it). uc_individual_earned_income.py
  and test_uc_earnings_deductions_properties.py merged cleanly and equal
  main's; so does test_uc_work_related_groups_properties.py, which now
  declares is_claimant_or_partner itself.
- utils/uc_work_related_requirements.py: main's claimants() (it reads
  is_uc_assessed_claimant, which replaced couple_members() with the same
  formula), plus this PR's single-claim helpers.
- uc_member_of_couple_claims_as_single_person.py and
  uc_is_ineligible_partner.py read is_uc_assessed_claimant instead of the
  removed couple_members(); no output changes.
- is_uc_eligible.py: both docstrings' sentences.
- uc_childcare_work_condition.py: #2088's reg 32 formula with this PR's
  reg 3(3) split, as posted on #2084: limb (a) for the s.40 claimant
  (is_uc_single_or_joint_claimant), limb (b) for every other member of the
  couple (is_uc_assessed_claimant), and reg 32(2) treatment only for a
  claimant.
- is_benefit_cap_exempt_other.py merged without a conflict but lost
  `person = benunit.members`, which main removed and this PR's reg 83 line
  reads; restored.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 6, 2026
…igible does

- claims_as_single_person.yaml: five cases for the childcare work condition
  after #2088: the other member's reg 32(1)(b) exception applies on a single
  claim; their statutory maternity pay does not treat them as in paid work
  (reg 32(2) reads "a claimant"), against a joint-claim control; only the
  claimant can meet limb (a), against a joint-claim control.
- uc_member_of_couple_claims_as_single_person: the claimant's pension-age
  test reads has_attained_state_pension_credit_qualifying_age, as main's
  is_uc_eligible now does for WRA 2012 s.4(1)(b). The two differ only for
  men born before 6 December 1953.
- Changelog: main's cap now has only the reg 60C pension-age exception, so
  an older partner no longer lifts a UC single claimant's cap; the note that
  it did is dropped, and the reg 32 change is described.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 10, 2026
…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>
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