Skip to content

Count only claimants' income in Universal Credit - #1978

Merged
MaxGhenis merged 10 commits into
mainfrom
uc-claimant-only-income
Oct 5, 2026
Merged

MaxGhenis merged 10 commits into
mainfrom
uc-claimant-only-income

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #1976

Summary

Universal Credit counted the income of the claimant's children and qualifying young people. Since #1896, uc_earned_income and uc_unearned_income sum over the claimant and partner and the programme's own children and young persons ("dropping dependants' own income is a follow-up"). So a dependant's wages, profits or pension still reduced the parents' award. This is that follow-up: the law counts the claimant's income only, or joint claimants' combined income.

A 2026 example on main: a lone parent aged 40 with no income, and a 17-year-old in upper secondary education.

The 17-year-old has main This PR
wages of £12,000 earned income 3,480 counted; UC £7,407.36 nothing counted; UC £9,321.36
a private pension of £12,000 unearned income 12,000 counted; UC £0 nothing counted; UC £9,321.36

£9,321.36 is 12 × (£424.90 + £351.88), the 2026-27 standard allowance and first-child element in the reg 36 table. 3,480 is the £12,000 less the £8,520 work allowance.

Two other rules read every member and are fixed the same way: the benefit cap earnings exception and the benefit cap total. The childcare work condition (#2088) already read the claimant and partner; it now also ignores a third member when inputs flag one.

The impact number needs reading with care. On the Enhanced FRS this raises 2026 UC by £4.98bn, and almost all of it comes from imputed incomes, not from what families told the survey:

See "Impact".

Law (legislation.gov.uk /data.xml, read 2026-09-30)

Welfare Reform Act 2012 s.8(3)-(4), on the amounts deducted from the maximum amount:

(4) In subsection (3)(a) and (b) the references to income are— (a) in the case of a single claimant, to income of the claimant, and (b) in the case of joint claimants, to combined income of the claimants.

s.40: "“claimant” means a single claimant or each of joint claimants". s.2(1): a claim is made by "a single person" or "members of a couple jointly". So a claim has at most two claimants, and a child or qualifying young person is never one of them.

UC Regulations 2013 reg 22(1) deducts:

(a) all of the claimant's unearned income (or in the case of joint claimants all of their combined unearned income) in respect of the assessment period; and
(b) the following amount of the claimant's earned income (or, in the case of joint claimants, their combined earned income) in respect of the assessment period

Reg 22(3) adds one person: where a member of a couple claims as a single person, the deduction is "the same as the amount that would be deducted ... if the couple were joint claimants". No provision brings a child's income in.

Reg 82(1)(a), the benefit cap earnings exception:

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 the amount of earnings that a person would be paid at the hourly rate set out in regulation 4 of the National Minimum Wage Regulations for 16 hours per week

The cap itself applies to "the welfare benefits to which a single person or couple is entitled" (WRA 2012 s.96(1)), and reg 80(1) uses "the amount to which the single person or couple is entitled".

Reg 32(1), the childcare work condition:

(a) the claimant is in paid work or has an offer of paid work ...; 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 ...

Guidance. DWP's Advice for Decision Making says the same of income (E2191: "All of the claimant's unearned income ... should be deducted ... Where the claim is from joint claimants then the deduction is all of their combined unearned income"). It has no paragraph on a child's income, because nothing in the regulations brings it in. It is explicit on capital (H1077: capital owned by "a dependent child or qualifying young person is not to be included in the capital of the claimant").

Contrast with the older benefits. Income Support counted a child's income until 2004 (IS Regs 1987 regs 23 and 44), and Housing Benefit needed an express exclusion (HB Regs 2006 reg 25(3)). Universal Credit never counted it.

Change

  • is_uc_assessed_claimant (new): the single claimant or the two members of the couple whose income counts. It is is_uc_claimant limited to the two eldest. Since Replace generic child and adult flags with each programme's legal definitions #1896 is_uc_claimant flags at most two people unless inputs flag more; the limit is the rule Apply the UC minimum income floor to net earned income against a net threshold #1973's reg 62(3) couple threshold already used. The Act fixes the number of claimants; taking the eldest two of more than two flagged members (and the first entered on a tie in age) is a modelling rule for inputs that flag too many.
  • uc_earned_income: sums the assessed claimants' uc_individual_earned_income, then takes off the work allowance.
  • uc_unearned_income: sums the reg 66 list over the assessed claimants. Benefit-unit sources (uc_tariff_income) are added as they are.
  • is_benefit_cap_exempt_earnings: sums the assessed claimants' earnings. Nothing else in that formula changes.
  • benefit_cap_reduction: person-level benefits in the capped total (contributory JSA and ESA, Incapacity Benefit, Severe Disablement Allowance) count for the assessed claimants only.
  • uc_childcare_work_condition (Apply the UC childcare work condition's partner exceptions and treated-as-working rules (UC Regs 2013 reg 32) #2088's reg 32 formula): tests the assessed claimants. With three flagged members, the youngest's work is no longer tested, consistent with their income not counting.
  • Unchanged awards: uc_individual_earned_income and uc_mif_applies now read is_uc_assessed_claimant instead of computing the same thing inline. No award changes.
  • Docs: the Universal Credit page says whose income counts.

is_benefit_cap_exempt_earnings and benefit_cap_reduction also serve the Housing Benefit cap. Limiting them to the claimant and partner is right there too, provided the claimant and partner are flagged correctly. No Housing Benefit amount moves in the data.

Overlap with open PRs

Tests

Run locally on the merged head: 2,418 YAML policy tests pass, and the 17 Universal Credit property tests pass (this PR's file and the two neighbouring UC property files). CI runs the full suite now that the PR targets main.

YAML tests, expectations computed by hand from regs 22, 36, 80A and 82 (derivations in the comments):

  • is_uc_assessed_claimant.yaml:
    • lone parent and child;
    • couple and qualifying young person;
    • an adult child (not a claimant);
    • an adult child flagged as a claimant by the data;
    • three flagged claimants in any order;
    • a tie in age.
  • income/uc_earned_income.yaml:
    • the example above, with the UC award;
    • joint claimants earning £10,000 and £5,000 with an 18-year-old earning £8,000 (earned income 15,000 − 8,520 = 6,480; UC 12 × (£666.97 + £351.88) − 55% × 6,480 = £8,662.20);
    • a third flagged adult's earnings;
    • a dependant's self-employed profits (no minimum income floor either).
  • income/uc_unearned_income.yaml:
    • a dependant's pension and Carer's Allowance do not count, while the parent's pension does;
    • contributory JSA or ESA supplied for a dependant does not count either (an inconsistent input, since reg 5(5) says a JSA or ESA recipient is not a qualifying young person; the Enhanced FRS gives some synthetic children contributory ESA, though none JSA);
    • the pension example, with the UC award;
    • tariff income still counts with a dependant present.
  • dependants_income.yaml:
    • a young person's £12,000 does not meet the benefit cap earnings exception (cap £22,020, reg 80A(2)(d)(ii));
    • the claimant's own earnings, and joint claimants' combined earnings, still do;
    • a dependant's contributory benefit is not in the cap total, while the claimant's is;
    • an 18-year-old's job, or a third flagged adult's, neither meets nor blocks the childcare work condition.
  • uc_childcare_work_condition_reg_32.yaml (Apply the UC childcare work condition's partner exceptions and treated-as-working rules (UC Regs 2013 reg 32) #2088's): the three-flagged-claimants case now expects the two eldest to be tested, as above, and a new case has the second eldest failing.

Mutation check (before the main merge, on the same code). Each of six changes was undone in turn in a scratch copy, with the copy confirmed on the import path, and the tests run against it. Every mutant failed at least one test.

Change undone Property tests failing YAML cases failing
earned income sums every member 2 4
unearned income sums every member 2 2
cap earnings exception sums every member the forced-cap property (checked separately) 1
childcare work condition reads every adult 1 2
three assessed claimants allowed 2 6
cap total sums every member 1 1

Invariants

The property tests (test_uc_claimant_income_properties.py, Hypothesis) generate single claimants, couples and mixed-age couples, with up to four dependants aged 0 to 19 (in and out of education). Families have rent, childcare costs and capital, in England, Wales and Scotland, for 2020, 2026 and 2027. A third of them are built to be over the benefit cap, and a third to have working claimants paying for childcare.

  1. A dependant's income never changes Universal Credit through the Universal Credit rules. Give every dependant earnings, profits or losses, miscellaneous income, savings interest, dividends, property income, a private pension, contributory JSA or Incapacity Benefit. UC, UC before the cap, the cap reduction, earned income, unearned income and the childcare element stay exactly as they are with no dependant income.
    • A separate property builds only families over the cap, each with a child earning above the exception's threshold, and checks the cap still applies in full.
    • Routes outside this PR, listed under known gaps, include any member's contributory ESA, industrial injuries benefit or Armed Forces Compensation Scheme payment exempting the family from the cap. (Marriage Allowance is switched off in these tests. Since Replace generic child and adult flags with each programme's legal definitions #1896 it pools allowances over the claimant and partner only, so a dependant's earnings no longer change a parent's Marriage Allowance.)
  2. The assessed claimants are the claimant and partner, and nobody else, in every generated family.
  3. Differential against the regulations (2026-27). Take earnings below the personal allowance and primary threshold. Earned income equals the claimants' combined earnings less the reg 22 work allowance (£710 a month, or £427 with the housing costs element, where they are responsible for a child or qualifying young person). Unearned income equals the claimants' private pensions plus, with capital over £6,000, the reg 72 tariff income (£4.35 a month per £250 or part). Savings interest is in no reg 66(1) description, so it counts for nobody. The amounts are written in the test from the regulations, not read from the model.
  4. At most two assessed claimants, however many members are flagged, all of them flagged claimants.
  5. Order does not matter when at most two members are flagged. With more than two flagged and a tie in age, the first entered are taken; a YAML case pins that.

The same invariants hold on the whole Enhanced FRS. The impact scripts check them for every year from 2025 to 2030:

  • Every benefit unit with no dependant income has the same UC, earned income and unearned income before and after.
  • No benefit unit's earned or unearned income rises.
  • On this branch UC is identical for all 61,223 benefit units whether or not under-16s have employment income (the file as built, against a copy with those earnings set to zero). UC, UC before the cap, earned income, unearned income, the cap reduction and the childcare element all match exactly.

Impact (Enhanced FRS, real runs)

Runs.

  • Base: main at 8090f1c19.
  • Branch: the merge commit 06da1e693. Its only uncommitted changes were the two changelog fragments, committed after as 0e74b27d6.
  • Both use a copy of the Enhanced FRS 2024-25 (enhanced_frs_2024_25.h5, sha256 e433e532…), one real Microsimulation per state.
  • Benefit units are in thousands. Brackets give dataset records; most are synthetic records (see below).
Year UC change Units gaining Units losing UC caseload In FRS-origin households In SPI-synthetic households With under-16 earnings zeroed
2025 +£4.67bn 627k (999) 2.2k (2) +200k +£0.08bn +£4.59bn +£0.73bn
2026 +£4.98bn 634k (1,010) 2.2k (2) +201k +£0.08bn +£4.90bn +£0.75bn
2027 +£5.11bn 635k (1,009) 2.2k (2) +205k +£0.08bn +£5.02bn +£0.77bn
2028 +£5.20bn 641k (1,004) 2.2k (2) +209k +£0.08bn +£5.12bn +£0.78bn
2029 +£5.21bn 635k (994) 2.2k (2) +214k +£0.09bn +£5.13bn +£0.81bn
2030 +£5.23bn 636k (986) 2.2k (2) +215k +£0.09bn +£5.14bn +£0.82bn

2026 UC goes from £78.2bn to £83.2bn, and the caseload from 6.40m to 6.60m benefit units. All 201k newly entitled units are in SPI-synthetic households.

Where it comes from (2026). Each benefit unit whose UC changes is assigned to the first source of dependant income it has, in the order below. This attributes each unit to one source; it does not separate the effects of several. The sources UC counts on main come first.

Source UC change Benefit units Dataset records Households
Employment income of a dependant aged under 16 +£4.61bn 530k 936 all SPI-synthetic
Employment income of a dependant aged 16 to 19 +£0.29bn 46k 44 all SPI-synthetic
Miscellaneous income of a dependant +£0.08bn 61k 32 all FRS-origin
Anything else £0 0 0

Why children have earnings and benefits. The Enhanced FRS is the FRS plus a synthetic copy whose incomes are imputed from HMRC's Survey of Personal Incomes, and policyengine-uk-data#504 covers both of the following:

  • Earnings. The imputation predicts income for every person in the copy from age, sex and region, children included. All 7,856 under-16 records in synthetic households have employment income; none of the 12,895 in FRS-origin households does. In 2026 that is £74bn of earnings on 3.7 million children.
  • Benefits. A second imputation then rewrites the benefit _reported columns for the same people. 89 synthetic under-16 records have contributory ESA (none in FRS-origin households), £0.36bn among dependants in 2026.

On main both cut the parents' UC.

The same real runs split by household origin (2026):

FRS-origin households SPI-synthetic households
UC change +£0.08bn +£4.90bn
Benefit units gaining 61k (32 dataset records) 573k (978 dataset records)
Mean gain £1,330 £8,558
Benefit units losing 0 2.2k (2 dataset records)
Dependants' raw source amounts, before any UC rule miscellaneous £0.68bn, dividends £0.43bn employment £81.6bn, ESA £0.36bn, other £1.1bn
UC on main £70.6bn £7.6bn

So the part of this change that rests on what families reported is about £0.08bn a year for 61,000 benefit units. In 2026 that rests on 16 FRS households (15 in later years), each appearing twice in the dataset (the original and its capital-gains clone); the ten largest records account for 94% of it. miscellaneous_income is built in policyengine-uk-data from odd-job income, allowances, royalties and the FRS child fields chamtern and chamttst.

Sensitivity: under-16 earnings zeroed. The last column of the first table repeats both runs on a copy of the data with under-16 employment_income set to zero and nothing else changed (sha256 b34ac1d7…). That change and the main-run change come from different groups, so the column is not an isolated effect of the data error:

  • 2026 split by origin. £0.08bn is in FRS-origin households (the same 32 records) and £0.67bn in synthetic households.
  • Synthetic sources. £0.59bn is in units whose first source is a synthetic 16- to 19-year-old's imputed earnings, and £0.07bn in units with a synthetic child's imputed ESA.
  • Gainers and losers. 168k units gain (198 dataset records) and 12.7k lose (6). The ten largest records account for 53% of the gain.

Benefit cap (2026). 189k benefit units (411 dataset records) no longer meet the earnings exception through a dependant's earnings, and the cap takes £0.21bn more. The two losing records are capped families who were exempt only because of a child's earnings. The change to the cap total moves nothing in the data: every benefit unit's cap reduction is the same with and without it.

Other programmes (2026).

  • Tax-Free Childcare falls £0.07bn, because families newly entitled to UC cannot claim it in the model.
  • Scottish Child Payment rises £0.03bn and the targeted childcare entitlement £0.01bn.
  • Nothing else moves.
  • Household net income rises £4.95bn: 598k households are better off. 38k are worse off: 35.7k through Tax-Free Childcare and 2.2k through the benefit cap.

Poverty (2026). AHC poverty falls 0.13 points and child AHC poverty 0.31 points (BHC: 0.03 and 0.09). With under-16 earnings zeroed the AHC falls are 0.07 and 0.15 points.

What this means for published numbers. The model bug and the data bug offset each other in UC:

  • On main, setting under-16 earnings to zero raises 2026 UC from £78.2bn to £82.5bn.
  • On this branch it is £83.2bn either way.
  • The same fixed-weight sensitivity on main also takes £63bn out of household net income and raises measured child AHC poverty from 23.9% to 29.1% (details in policyengine-uk-data#504). That is a sensitivity on the current weights, not a rebuilt dataset: other imputation fixes and recalibration were not run.
  • Calibration. policyengine-uk-data calibrates its weights against UC targets using the model's own universal_credit (targets/compute/benefits.py). I have not checked which model version built the current weights, or measured the fit to those targets before or after this change.

Known gaps (follow-ups, not in this PR)

  • Dependants' circumstances, not income. uc_carer_element, the LCWRA element and the limited-capability route to the work allowance read every member, so a dependant's caring or disability can add an element. Any member's contributory ESA, industrial injuries benefit or Armed Forces Compensation Scheme payment also exempts the benefit unit from the cap. For a lone parent aged 40 with children aged 5, 7 and 9 and a 17-year-old at school, in council housing in the North East at £20,000 rent, £1,000 of ESA or industrial injuries benefit for the 17-year-old lifts the capped 2026 UC from £17,821.00 to £40,263.20. Give the UC LCWRA and carer elements, the work allowance and the benefit cap exceptions on the claimants' circumstances only #1989, stacked on this PR, limits these exceptions to the claimants.
  • The benefit cap earnings measure still uses a fixed £10,152, deducts all income tax and ignores pension contributions. Fix benefit cap exemption defects (#1818) #1820 dates the threshold, adds pension contributions and narrows the tax to non-savings, non-dividend income (still including tax on pensions).
  • The reg 81(1)(b) childcare offset is not in main's cap reduction. Give Universal Credit and Housing Benefit their own benefit cap and LHA shared-accommodation rules #2089 adds it.
  • A child's capital. It is not the claimant's (s.5, reg 18; ADM H1077), but the model holds capital at household level and cannot tell whose it is.
  • Who the claimants are. A member flagged with is_uc_claimant (from is_claimant_or_partner) is taken as a claimant whatever their age. Datasets that supply roles decide this; the calculator's fallback is Replace generic child and adult flags with each programme's legal definitions #1896's and Presume a much younger member is a flagged parent's child at any age #2040's.
  • Test fixtures. Some generated dependants, and two YAML cases (one in income/uc_unearned_income.yaml, the cap-total case in dependants_income.yaml), are qualifying young persons with contributory JSA or ESA, which reg 5(5) rules out. They test that supplied flags are respected; they are not lawful cases.
  • Tax-Free Childcare is switched off for every family with a UC award, where a real family would choose the better of the two.

Axiom parity

axiom: TheAxiomFoundation/rulespec-uk#397 queued

The Axiom modules for regs 22, 82, 32 and 81 already take claimant-scoped inputs, so no module's logic is wrong. For example, uk/regulations/uksi/2013/376/22.yaml chooses between the claimant's and the joint claimants' income leaves, and nothing sums over members. encoded-correct is still not available, for four reasons read in the code:

  • No dependant case. No companion test has a dependant with income (22.test.yaml, 82.test.yaml and 32.test.yaml have none).
  • Open income leaves. The UC ProgramSpec (uk/programs/universal-credit/fy-2026-27.yaml) leaves reg 22's income leaves as runtime inputs, with only adult_of_benefit_unit and child_of_benefit_unit relations to fill them from.
  • No reg 80. Reg 80, the welfare-benefit total that reg 81 takes as an input, is not encoded; the composed pipeline uses its own UC award as the total.
  • Circular oracle. The Enhanced FRS oracle bridge (axiom_oracles/bridges/efrs_uk.py, project_universal_credit_income_deduction_inputs) fills reg 22's leaves from PolicyEngine's uc_earned_income and uc_unearned_income, then compares Axiom's outputs with the same two variables. That check passed with this bug in place, and will pass after the fix without testing it.

rulespec-uk#397 and its two follow-up comments hold the dispatch-ready work:

  • ten companion cases, covering regs 22, 82, 32 and 81 and the composed award, from the same hand calculations as this PR's YAML tests;
  • the reg 80 encode;
  • a claimant relation for the composition;
  • a non-circular oracle projection;
  • a pasteable review_finding.

Signed encodes are billed to OpenAI, so dispatching them needs Max's approval.

Review

Three independent reviews ran before the main merge: two on the first version (code and tests; law and impact numbers) and a re-review of the fixes. The re-review found the two major findings resolved and asked for four minor changes, all made here:

  • the legal differential no longer counts savings interest;
  • the docs page qualifies its claim;
  • the cap-total disposition was added to rulespec-uk#397;
  • the impact wording was corrected: attribution is not causation, the source amounts are raw, the sensitivity is fixed-weight, and the calibration provenance is unmeasured.

A fourth review, of the merged head 0e74b27d6 (GPT-6.1 Sol), found no blocker or major issue and approved with minor changes, made in 2116a8314 and in this description: the stale Marriage Allowance gap was removed, the ESA example was separated from the lawful cases, four roundings and the 16-household note were corrected, and the #1820 and childcare descriptions were tightened. A fifth, confirming review (Opus) found all six resolved and asked for further description fixes, then approved them, made in 6284e91b1, b186ace32 and here: the industrial injuries cap route is now disclosed beside ESA, and the remaining wording errors were corrected.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits September 30, 2026 23:21
uc_earned_income and uc_unearned_income summed every member of the
benefit unit, so a dependent child's or qualifying young person's wages,
profits, savings interest, dividends, rent or pension reduced the
parents' award. WRA 2012 s. 8(4) and UC Regs 2013 reg. 22(1) deduct the
income of the claimant, or the combined income of joint claimants.

- is_uc_assessed_claimant: the single claimant or the two members of the
  couple whose income counts (is_uc_claimant, limited to the two eldest,
  as the reg. 62(3) couple rule already did).
- uc_earned_income, uc_unearned_income: sum over the assessed claimants.
- is_benefit_cap_exempt_earnings: reg. 82(1)(a) tests the claimant's or
  the couple's earned income, so a dependant's job no longer lifts the cap.
- uc_childcare_work_condition: reg. 32(1) tests the claimant and the other
  member of the couple, not every member aged 18 or over.
- add_for_members: the helper and its import are byte-identical to
  #1896's.

Fixes #1976

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
YAML cases computed by hand from regs 22, 36, 80A and 82, and Hypothesis
properties: a dependant's income never changes UC; earned and unearned
income match the regulation's closed form; at most two assessed
claimants; member order does not matter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 3 commits September 30, 2026 23:48
…; stronger properties

- uc_childcare_work_condition and uc_mif_applies read is_uc_assessed_claimant,
  so a third flagged member's work neither meets nor blocks the condition.
- benefit_cap_reduction counts person-level benefits for the claimants only
  (WRA 2012 s. 96(1), reg. 80(1)).
- Property tests build capped and childcare families, give dependants
  contributory benefits, flag every member as a claimant, and check earned
  and unearned income against the reg. 22 and reg. 72 figures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…eption threshold

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

Copy link
Copy Markdown
Collaborator Author

Coordination with #1999 (fixes #1986), which this PR will meet once both are on main:

  • uc_earned_income no longer sums uc_individual_earned_income itself. It subtracts the work allowance from the new uc_earned_income_before_work_allowance, which the targeted childcare criterion and the local CTR helper also read. The claimant-only sum belongs there.
  • is_benefit_cap_exempt_earnings now compares the new benefit_cap_earned_income (a sum of uc_individual_earned_income_before_mif) with benefit_cap_earnings_threshold. The reg 82(1)(a) claimant restriction belongs in benefit_cap_earned_income.

A test merge of b696f8d01 into this branch conflicts in those files plus uc_individual_earned_income*.py, the UC docs notebook and #1949's property test.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Coordination with #2076, stacked on #2027.

#2076 rewrites benefit_cap_reduction to count only the welfare benefits "to which the single person or couple is entitled" (UC Regs 2013 reg 80(1); HB Regs 2006 reg 75A). That means:

  • the claimant's and partner's own contributory ESA and JSA, incapacity benefit and SDA;
  • claimant_or_partner_esa_income and claimant_or_partner_jsa_income;
  • the family's Child Benefit, CTC, Income Support, UC and HB.

Before, a non-dependent adult's own award reduced the family's UC: with UC of £20,000 before the cap, a non-dependant's £5,000 of ESA cut UC from £14,753 to £9,753. Whichever lands second: keep #2076's claimant-or-partner lists alongside this PR's changes.

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Coordination with #2084 (UC claim by a member of a couple as a single person, UC Regs 2013 reg 3(3)).

There, uc_is_ineligible_partner marks the member of a couple who cannot be a joint claimant, so the other member claims as a single person. is_uc_single_or_joint_claimant is the claimant in WRA 2012 s.40's sense ("a single claimant or each of joint claimants"): is_uc_claimant (two eldest) less that partner.

For this PR: is_uc_assessed_claimant should keep that partner. Their income counts "as if the couple were joint claimants" (reg 22(3)), and their capital counts too (reg 18(2)). It does keep them today, because is_uc_claimant includes them, so nothing needs to change here. Whichever PR lands second should check that the reg 3(3) YAML cases in claims_as_single_person.yaml still pass.

Two more points from that PR's review:

  • Its docstring ("the single claimant ... or one of the two members of the couple") should say the reg 3(3) partner is included.
  • If this PR rewrites uc_childcare_work_condition, it should keep that PR's reading of reg 32(1): the s.40 claimant (is_uc_single_or_joint_claimant) must be in work, and so must the other member, "whether claiming jointly or as a single person".

@MaxGhenis
MaxGhenis changed the base branch from uc-mif-net-floor to main October 4, 2026 18:14
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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 3 commits October 4, 2026 14:55
- Docs: drop the Marriage Allowance route, which #1896 closed.
- Separate the lawful unearned-income case from contributory JSA/ESA
  supplied for a dependant, which reg. 5(5) rules out but the data hold.
- Describe the two assessed claimants in the reg. 32 three-flag case.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 5, 2026 01:21
@MaxGhenis

MaxGhenis commented Oct 5, 2026 •

Copy link
Copy Markdown
Collaborator Author

Hand-off to the UK hub

Head: b186ace32, with main (8090f1c19) merged in, no rebase. Main has not moved since.

Checks: at 2116a8314 every check passed, including Test (43 min), and GitHub reported the PR mergeable and clean. The two commits since change only a YAML test comment and a property-test docstring sentence. At b186ace32, Lint, docs and smoke imports pass and Test is running. The PR is ready for review, not a draft.

Local runs: on the merged code, 2,418 YAML policy tests and the 17 Universal Credit property tests pass. Earlier, a mutation check killed all six mutants.

Reviews: five independent reviews, kept in ~/reviews/uc-claimant-only-income-2026-09-30/review/:

File Head reviewed Verdict
review-code.md first version changes requested; fixed
review-law.md first version changes requested; fixed
rereview.md a8fb8740e majors resolved; four minor requests fixed
review-merged.md 0e74b27d6, the merged head, by GPT-6.1 Sol approve with minor changes; all six fixed in 2116a8314
review-confirm.md 2116a8314, then 6284e91b1 (Opus, in-session; the Codex lanes were held) description fixes requested, then approve. Its two optional suggestions were applied in b186ace32 (docstring) and in the body.

Impact: real Enhanced FRS runs, main against this branch, with every figure in the PR body. In 2026 UC rises by £4.98bn:

This is a law fix that moves aggregates, so it lands on the merge gates. There is no Max decision.

Axiom: TheAxiomFoundation/rulespec-uk#397 (pe-parity, queued), plus two follow-up comments covering the childcare cases and the reg 80 encode for the cap total.

Depends on: nothing open. #1973 has merged.

Coordination: #1999, #2076 and #2084 each left a merge-order note on this PR. The PR body's "Overlap with open PRs" section gives the end state for each, whichever lands second.

Dependants:

Follow-ups owed: none from this PR.

  • Data fixes go in the uk-data batch (d833).
  • Signed Axiom encodes are Max's call.
  • A separate chip covers whether the High Income Child Benefit Charge can fall on a dependant (unverified).

Worktrees:

  • ~/PolicyEngine/_worktrees/pe-uk-uc-claimant-only-income (this branch, clean).
  • ~/PolicyEngine/_worktrees/pe-uk-uc-claimant-base (detached at main, used for the base impact runs). Remove both after merge.

@MaxGhenis
MaxGhenis merged commit 1a18f93 into main Oct 5, 2026
7 checks passed
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged by the UK hub, which took this PR on handoff from local_5af4c464, under the PE-UK merge-on-gates rule.

  • CI: every check passed at b186ace32, and gh pr checks exits 0.

  • Review: independent reviews in ~/reviews/uc-claimant-only-income-2026-09-30/review/:

    • code and law reviews requested changes; fixed;
    • re-review at a8fb8740e;
    • GPT-6.1 Sol APPROVE WITH MINOR CHANGES at the merged head 0e74b27d6; all six fixed in 2116a8314;
    • Opus 5.5 round-2 APPROVE at 6284e91b1 (review-confirm.md).

    The hub confirmed that 6284e91b1..b186ace32 is one commit changing one sentence of a test docstring (test_uc_claimant_income_properties.py).

  • Impact: real Enhanced FRS runs in the PR body show 2026 UC up £4.98bn. Of that, £4.90bn is in SPI-synthetic households, where imputed child income used to cut the parents' UC (tracked on the data side in uk-data#504), and £0.08bn rests on reported income. It is a correction to the law (only the claimant's and partner's income counts), so it lands on the gates.

  • Next: Give the UC LCWRA and carer elements, the work allowance and the benefit cap exceptions on the claimants' circumstances only #1989 is stacked on this branch. Give Universal Credit and Housing Benefit their own benefit cap and LHA shared-accommodation rules #2089 must sum its new cap variables over is_uc_assessed_claimant, whichever lands second (see the comment there).

@MaxGhenis
MaxGhenis deleted the uc-claimant-only-income branch October 5, 2026 02:02
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>
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.

Universal Credit counts dependants' income: a child's or qualifying young person's earnings and unearned income reduce the parents' award

1 participant