Skip to content

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

Open
MaxGhenis wants to merge 6 commits into
mainfrom
uc-childcare-partner-exceptions
Open

MaxGhenis wants to merge 6 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 788d692ea (after #1950 and #1881 merged). The branch is 634465e29, this PR merged with that main. Both are clean trees. Later commits change only tests, so these runs stand for the PR head. Every figure below is identical, to the £1,000, to the earlier runs of main 3c48247eb against this PR's first head 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

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