Skip to content

Use each rule's own Universal Credit earned income in the benefit cap, targeted childcare and local CTR - #1999

Draft
MaxGhenis wants to merge 19 commits into
mainfrom
uc-earned-income-consumers-1986
Draft

MaxGhenis wants to merge 19 commits into
mainfrom
uc-earned-income-consumers-1986

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Three rules outside the Universal Credit award test a UC claimant's earned income, and each read the wrong figure. Fixes #1986.

  1. Benefit cap earnings exception (is_benefit_cap_exempt_earnings). It took every member's employment and self-employment income less every member's income tax on all income and all NI, including voluntary Class 3. It deducted no pension contributions and compared the result with £10,152 a year hard-coded. It also excepted Housing Benefit awards, since HB shares the cap. Now it uses:
    • earned income (benefit_cap_earned_income): each person's earnings less their own income tax and NI on those earnings and their relievable pension contributions, summed over the unit, without the minimum income floor (reg 82(4));
    • the threshold (benefit_cap_earnings_threshold): 16 hours a week at the national living wage, × 52 / 12, rounded down to whole pounds (reg 6(1A)(za)), × 12. That is £846 a month in 2025-26 and £881 in 2026-27, the figures GOV.UK publishes. It was £430 a month before 1 April 2017.
    • a UC award: reg 82 applies "to an award of universal credit". The income test is uc_benefit_cap_earnings_threshold_met, and the exception also needs UC before the cap. HB awards keep their own exception (HB Regs reg 75E, Working Tax Credit entitlement), which the model already applies.
  2. Targeted (two-year-old) childcare, UC route. The model compared uc_earned_income, which is after the work allowance, with the £15,400 limit. SI 2014/2147 defines earned income by UC Regs Part 6 Chapter 2, which comes before the work allowance. It now uses uc_earned_income_before_work_allowance.
  3. Kingston upon Thames, Merton, Newham and Westminster CTR. For a UC award the schemes take the Secretary of State's calculation of income plus the award; the model's figure was after the work allowance. The shared helper now uses earnings before the work allowance.

The model is missing the 2023-24 minimum wage rates (S.I. 2023/354), so 2023 uses 2022-23's. #2053 adds them. Until it merges, this threshold for 2023-24 is £658 a month instead of DWP's £722, and every other year is right.

The #1986 counterexamples, now pinned as YAML tests:

Case Before After (= law)
London couple (Inner North London rents), four children, private rent £36,000, 2025. One partner earns £10,300; the other pays £923 of Class 3 not exempt; cap reduction £16,809.36; UC £21,277.40 exempt (10,300 ≥ 846 × 12 = 10,152); cap reduction 0; UC £38,086.76
Single parent 30, child aged 2, earns £17,000, council rent £9,600, 2026 criterion met: 10,635.60 after the work allowance ≤ 15,400 not met: earned income 17,000 − 886 − 354.40 = 15,759.60 > 15,400
London single parent, child aged 6, earns £12,000, council rent £9,600, council tax £1,800, 2026: Merton, Kingston, Westminster CTR £1,181.16 CTR £156.36 = 1,800 − 20% × (12,000 + award − maximum)
Same in Newham, earning £4,000 CTR £1,260.00 CTR £260.00 = 70% × 1,800 − 25% × 4,000

On the Enhanced FRS, in real runs of #1949's head against this branch, the change cuts 2026 UC by £18.3m. Six benefit-unit records (6.1k units) lose the earnings exception and are capped, and no unit gains. Both the earned income measure (chiefly pension contributions now deducted) and the 2026-27 threshold of £881 a month in place of £846 contribute. Two records with a child aged 2 lose the targeted childcare offer; the amount is withheld because it rests on two records. Housing Benefit and CTR amounts do not change.

Stacked on #1949 (which includes #1943 and main up to #1896). The PR targets main so CI runs, and its diff includes #1949's commits until it merges.

Law (legislation.gov.uk /data.xml, read 2026-10-01)

UC Regs 2013 reg 82 (https://www.legislation.gov.uk/uksi/2013/376/regulation/82):

(1) The benefit cap does not apply to an award of universal credit in relation to an assessment period where— (a) 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, converted to a monthly amount by multiplying by 52 and dividing by 12; …

(4) "Earned income" for the purposes of this regulation does not include income a person is treated as having by virtue of regulation 62 (minimum income floor).

UC Regs 2013 reg 6(1A) (https://www.legislation.gov.uk/uksi/2013/376/regulation/6):

Where the calculation of an amount for the purposes of the following provisions results in a fraction of a pound, that fraction is to be disregarded— (za) regulation 82(1)(a) (exceptions – earnings); …

So 12.71 × 16 × 52 / 12 = 881.23 is £881. The issue's £10,574.72 a year leaves out this rounding.

Before 1 April 2017 reg 82(1)(a) read "is equal to or exceeds £430". S.I. 2017/138 reg 2(3)(a) substituted the hours formula from that date (https://www.legislation.gov.uk/uksi/2017/138/made).

National Minimum Wage Regulations 2015 reg 4 sets "the national living wage rate", the top age band of gov.hmrc.minimum_wage.non_apprentice in every year since 2016 (point-in-time texts checked for each April from 2016 to 2026).

The Local Authority (Duty to Secure Early Years Provision Free of Charge) Regulations 2014 (S.I. 2014/2147) reg 1 (https://www.legislation.gov.uk/uksi/2014/2147/regulation/1). An eligible child includes one whose parent is entitled to "universal credit where that parent had, in the relevant assessment period, earned income not exceeding the applicable amount", and:

(3) For the purposes of paragraph (a)(vii) of the definition of an eligible child— (a) "earned income" means income for the purposes of Chapter 2 of Part 6 of the Universal Credit Regulations 2013; … (c) where the parent is— (i) a member of a couple who have jointly made a claim for, and are entitled to, universal credit; … references to applicable amounts … are to be read as references to the combined income of the couple.

Part 6 Chapter 2 is regs 52-64 (earned income, its deductions, and the minimum income floor). The work allowance is in reg 22, in Part 3 (awards).

Council Tax Reduction Schemes (Default Scheme) (England) Regulations 2012, Schedule para 37 (https://www.legislation.gov.uk/uksi/2012/2886/schedule/paragraph/37):

(1) In determining the income of an applicant— (a) who has, or (b) who (jointly with his partner) has, an award of universal credit the authority must … use the calculation or estimate of the amount of the income of the applicant, or the applicant and his partner jointly (as the case may be), made by the Secretary of State for the purpose of determining the award of universal credit. …
(3) The authority may only adjust the amount of the income … so far as necessary to take into account— (a) the amount of the award of universal credit …

I re-read the four schemes the model cites:

  • Kingston upon Thames 2026-27 and Merton 2026 reproduce para 37 word for word.
  • Newham 2026 para 37(1) says the authority must "refer to a calculation or estimate of the amount of the income … made by the Secretary of State for the purpose of determining entitlement to universal credit".
  • Westminster 2026/27's scheme summary says the maximum UC rate "is compared to the actual universal credit award plus any other income and earnings received".

None of the four subtracts a work allowance, which is a step in the award (reg 22(1)(b)), not in income.

Change

  • benefit_cap_earned_income (new, BenUnit): sums uc_individual_earned_income_before_mif, each person's earnings less their own relievable pension contributions, uc_income_tax_on_earnings and uc_national_insurance_on_earnings, before the minimum income floor.
  • benefit_cap_earnings_threshold (new, BenUnit): 12 × (gov.dwp.universal_credit.benefit_cap.earnings_exception.monthly_amount + floor(NLW × weekly_hours × 52 / 12)).
    • The NLW is the top band of gov.hmrc.minimum_wage.non_apprentice, which equals the reg 4 rate in every year since 2016.
    • The two new parameters date the 2017 switch: £430 and 0 hours to 31 March 2017, then £0 and 16 hours.
  • uc_benefit_cap_earnings_threshold_met (new, BenUnit): earned income ≥ threshold.
  • is_benefit_cap_exempt_earnings: the income test and universal_credit_pre_benefit_cap > 0. The award after the cap would be circular. The dead copy-pasted code is gone from this file. The same dead blocks remain in is_benefit_cap_exempt_health_disability and _other; Fix benefit cap exemption defects (#1818) #1820 removes them and Apply the benefit cap to mixed-age couples on Universal Credit, and keep them off pensioner Council Tax Reduction #1944 rewrites _other, so I left both alone.
  • uc_earned_income_before_work_allowance (new, BenUnit): the sum of uc_individual_earned_income, the UC Part 6 Chapter 2 figure (with the floor). uc_earned_income now subtracts the work allowance from it, so there is one sum.
  • meets_universal_credit_criteria_for_targeted_childcare_entitlement and legacy_council_tax_reduction read uc_earned_income_before_work_allowance.
  • Docs: the UC page gets a benefit cap earnings exception cell; the targeted childcare page states the earned income definition.

Not modelled, as before:

  • the nine-month grace period (reg 82(1)(b));
  • the two- and three-period look-back in SI 2014/2147 reg 1(5)-(6), since the model tests a year's earned income against 12 × the monthly limit;
  • national living wage rates after 2026-27. The parameter stops at £12.71, so the threshold stays £881 a month from 2027.

Tests

YAML, hand-computed from the law (benefit_cap_earnings_exception.yaml, meets_universal_credit_criteria_for_targeted_childcare_entitlement.yaml, additions to council_tax_reduction.yaml and minimum_wage.yaml):

  • Threshold. Thresholds for 2016-17 (£430), 2017, 2020, 2022, 2024, 2025 and 2026. Also a claimant aged 19, since the reg 4 rate applies whatever the age.
  • The rounding edge. £10,572 exactly meets the 2026 threshold, and so does £10,573, which would not without rounding; £10,571 does not.
  • The deductions. Net of own tax and NI (£14,000 → £13,599.60). Pension contributions deducted at 74 but not at 75. Class 3 not deducted. Neither the person's own tax on property income nor a partner's. A couple combined.
  • The floor. Floor income does not count (reg 82(4)).
  • UC only. A 2024 Housing Benefit family with no UC or WTC, earning £9,600 (over the £9,516 UC threshold), is not excepted and stays capped at £25,323. This is the review's regression case, moved to 2024.
  • The Benefit cap, targeted childcare and local CTR use the wrong UC earned income figure #1986 counterexample.
  • Childcare. The counterexample, £16,500 (£15,399.60, met) and £16,501 (£15,400.32, not met), a couple at exactly £15,400 (met), a couple combined, pension contributions, and no UC.
    • One case has a self-employed partner under the minimum income floor: their floor income counts (Part 6 Chapter 2 includes reg 62), though actual earnings are £3,000.
  • CTR. The CTR counterexamples in all four boroughs. The three existing cases that input uc_earned_income now input uc_earned_income_before_work_allowance (same expected values).

Property tests (test_uc_earned_income_consumers_properties.py, Hypothesis, families of one or two adults with earnings, self-employment, pension contributions, Class 3 and four kinds of unearned income, in 2020, 2024, 2025 and 2026). Invariants:

  1. Tax or NI not on earnings never moves the test. Adding Class 3 (£500-950) or £2,000-9,000 of unearned income to one adult in every family leaves benefit_cap_earned_income and the income test unchanged, and the exception too wherever there is a UC award both ways. Families include earners just above the threshold.
  2. Differential against the means test: benefit_cap_earned_income equals uc_earned_income_before_work_allowance where no floor applies and never exceeds it. Switching every floor off never changes it. The exception equals the income test and a UC award.
  3. The threshold is 12 × floor(NLW × 16 × 52 / 12) for every family, and £10,572 in 2026.
  4. Monotone: the income test never falls, and the childcare criterion never rises, with more employment income.
    • A fixed example crosses the childcare limit (£16,500 → £16,501 of pay) with UC throughout. The random draws never crossed it, as the review showed.
    • Families with a floor are left out of the childcare half. On this base the floor stands in for gross earnings while actual tax and NI are still deducted, so more pay can lower earned income (the review executed such a case); Apply the UC minimum income floor to net earned income against a net threshold #1973 nets the floor.
  5. Differential against the formulas this replaces: the UC award is unchanged, the childcare criterion now implies the old one, and local CTR is never higher.
  6. Differential against a reference: for a UC award in the four boroughs, council_tax_reduction equals the scheme formula recomputed from the model's own maximum, award and earned income.

Mutation check: each mutant restores one piece of old behaviour, and all fail tests:

  • the old cap formula;
  • no rounding;
  • floor income counted;
  • childcare after the work allowance;
  • CTR after the work allowance;
  • a reversed childcare inequality, caught by the fixed crossing example.

The tests reviewer also killed a mutant of each of the seven properties independently.

The first version of invariant 1 did not catch the old cap formula, because Hypothesis drew tiny bumps that crossed no threshold. Realistic bump sizes and near-threshold earners fixed that; it now fails against the old formula.

Local:

Impact (Enhanced FRS, real runs)

Runs on a private copy of enhanced_frs_2024_25.h5 (sha256 e433e532…), one Microsimulation per package state: #1949 at a57caf1dd (base, which includes main with #1896) against this branch at 9709b9bc.

  • Each figure is from a real run. Counts are benefit-unit records in the dataset, with weighted units in brackets. Any cell under three records is a count only.
  • No measure-versus-threshold split is published. In several years one part rests on two records, and the total would let it be recovered.
  • Totals are float64 sums of per-unit differences.
Year UC (£m) HB (£m) Records losing UC (units) UC units losing the exception gaining it
2025-26 0 0 0 16 (16.4k) 12 (12.4k)
2026-27 −18.3 0 6 (6.1k) 54 (57.5k) 12 (12.5k)
2027-28 −12.6 0 4 (4.8k) 28 (28.4k) 14 (18.5k)
2028-29 −15.3 0 4 (5.2k) 25 (22.0k) 14 (18.6k)
2029-30 −25.1 0 17 (17.3k) 178 (143.7k) 12 (17.9k)
2030-31 −28.8 0 15 (14.5k) 167 (135.9k) 12 (18.0k)
  • Benefit cap. No unit gains UC.
    • Gains. Every unit that gains the exception (12-14 records a year) already had another exemption, or UC under the cap. Those gains come from the new earned income measure.
    • Losses. The losses come from deducting pension contributions and, from 2026, from the higher threshold. The old test also counted no floor income, so the floor is not a cause here.
    • 2029. Exception losses jump from 25 records in 2028 to 178. From April 2029 the model sends salary sacrifice above £2,000 into employment income and employee pension contributions (the Autumn Budget 2025 cap, salary_sacrifice_returned_to_income). The old formula counted that pay as earnings without deducting the contribution; reg 55(5)(a) deducts it. In units with UC before the cap, pension contributions go from £2.3bn in 2028 to £6.2bn in 2029.
    • Later years. The NLW parameter stops at £12.71, so the threshold stays £881 a month from 2027.
  • Housing Benefit. No HB amount changes in any year. Applying reg 82 only to UC awards matters for household calculations (see the HB test case).
  • Miscellaneous income. 62 UC records (88k units) have some. A run that drops it from the cap's earned income (keeping any tax on it deducted, so an overstatement) removes the exception from 4-6 records a year and changes no UC amount. The classification does not move these numbers.
  • Targeted childcare.
    • Who loses. In 2026, 264 records (580k units) no longer meet the UC criterion, and 65 records (186k units) lose targeted eligibility.
    • The offer itself. Of the 11 records (24k units) with a child aged 2 that lose the criterion, 9 were not eligible before: they are outside England, would not claim, or qualify for the working-parent offer, which excludes the targeted one. The other 2 lose the offer in every year from 2025. On this base (after Replace generic child and adult flags with each programme's legal definitions #1896) they have no qualifying legacy benefit, so the UC route was their only one. The amount is withheld because it rests on two records.
  • Local CTR. The dataset has no households in Kingston upon Thames, Merton, Newham or Westminster, so all four local CTR variables are £0 before and after. The fix moves household calculations only.
  • Household net income falls by the UC change plus the childcare offer of the 2 records above. No UC amount changes by more than 1p except through the cap. uc_earned_income moves by about 3p for some units, because the new intermediate sum is stored in float32.
  • Poverty. Rates move by at most 0.01 percentage points (deep poverty AHC, 2026), from the same few records.
  • Base dependence. This PR's UC effect is the same on Deduct only each person's own tax and NI on earnings from UC earned income #1949's earlier head (b8555a2d0, before Replace generic child and adult flags with each programme's legal definitions #1896): −£18.3m in 2026. On that base the 2 childcare records kept the offer through a legacy benefit.

Scripts and outputs (aggregates only): ~/reviews/uc-earned-income-consumers-1986-2026-10-01/impact/ (dataset_impact.py, compare_impact.py, childcare_mechanism.py, compare_v4_pr.json, childcare_mechanism_v4_2026.txt).

Axiom

  • axiom: uk:regulations/uksi/2013/376/82 TheAxiomFoundation/rulespec-uk#399 queued. The module takes earned income excluding the floor (reg 82(4)) correctly. Its threshold leaves out the reg 6(1A)(za) whole-pound rounding (£881.23 against £881 in 2026-27), and no case can show it because every test uses a rate of £12.00. It is also undated: £430 before April 2017.

  • axiom: uk:regulations/uksi/2015/621/4 TheAxiomFoundation/rulespec-uk#399 queued. Only the 2026-27 rate is encoded; Bump version #399 adds 2016-2025, including 2023-24's £10.42.

  • axiom: uk:regulations/uksi/2014/2147/1 TheAxiomFoundation/rulespec-uk#400 queued. Not encoded.

  • axiom: uk-{kingston-upon-thames,merton,newham,westminster}:policies/*/council-tax-reduction TheAxiomFoundation/rulespec-uk#401 queued. The modules take UC-award income as one opaque input; Stamp duty fixes #401 derives it from para 37 (earnings before the work allowance plus the award).

  • axiom: uk:regulations/uksi/2006/213/75E TheAxiomFoundation/rulespec-uk#57 queued. The HB cap's own earnings exception (Working Tax Credit entitlement and the 39-week grace period) is not encoded. Since this PR stops applying UC reg 82 to HB, the extension on Metadata improvements and poverty gap additions #57 specifies reg 75E with companion cases, one matching the HB YAML case here.

Each has the verbatim law, required outputs, a pasteable review_finding and companion tests from the same ground truth as the YAML here.

Review

Two independent Subfleet reviews of b696f8d0 both requested changes. Everything they raised is fixed in 4f9f8d8e or answered here.

  • Legal and code (standard tier).
    • Unearned miscellaneous income now grants the exception. Kept, documented and bounded: the cap counts what the UC award counts. FRS miscellaneous income is mostly odd-job pay, which is earned. A run treating it as unearned changes no UC amount. The reg 66(1)(m) split will move both together.
    • The UC threshold newly excepts Housing Benefit claimants. Fixed: reg 82 now needs a UC award, the review's HB case is a YAML test, and Metadata improvements and poverty gap additions #57 is extended for reg 75E.
    • Verified: the legal readings (reg 6(1A)(za), the reg 4 rate whatever the age, the 2017 switch, Part 6 Chapter 2, the four schemes), the NLW in every year 2016-2026, all 42 YAML expectations and the coordination notes.
  • Tests, impact and claims (hard tier).
    • Small-cell disclosure. The measure-versus-threshold columns included two-record cells, and with the total they could be recovered. They are removed.
    • Pension totals and the floor. Pension totals are restated as £2.3bn and £6.2bn, for units with UC before the cap. Floor income is no longer given as a cause of losses against the base.
    • Precision. Totals are now float64 sums of differences. Wording is "no UC change over 1p outside the cap" and "about 3p".
    • Childcare coverage. The fixed crossing example covers the childcare monotonicity gap, and new YAML pins cover the boundaries the review listed (£10,572, £15,400, ages 74/75, a floor-dependent childcare case).
    • London case. It now uses a London rent area. The table figures above are from that run.

Coordination

🤖 Generated with Claude Code

MaxGhenis and others added 11 commits September 30, 2026 14:25
…ncome

uc_earned_income subtracted benunit_tax, the whole benefit unit's income
tax and NI on all income, from the unit's gross earnings. UC Regs 2013
reg. 55(5)(b) and reg. 57(2) step 3 deduct only tax and NI paid by the
person in respect of their employment or trade.

- uc_income_tax_on_earnings: income tax on the person's earnings, taken
  as the lowest slice of their non-savings income after their allowances
  (savings and dividends sit above it under ITA 2007 s. 16, property
  income above it in the engine and under s. 16A from 2027-28).
- uc_national_insurance_on_earnings: Class 1 employee, Class 2, Class 4.
- uc_individual_earned_income: gross earnings less the person's own
  pension contributions, tax and NI, floored at nil.
- uc_earned_income: sum over the unit, less the work allowance.

Fixes #1942.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test_uc_earnings_deductions_properties.py: unearned income never
  changes earned income; UC is non-increasing in every kind of unearned
  income; the tax deducted equals the tax on earnings alone; earned
  income is never lower, and UC never higher, than under the pre-fix
  formula.
- test_uc_state_pension_properties.py: the #1942 strict xfail now passes
  and loses its marker; pound-for-pound and the property-income
  equivalence cover families with earnings; a new strict xfail pins the
  Marriage Allowance transfer, which the model books on the recipient as
  the transferor's unused allowance (ITA 2007 s. 55B gives a fixed
  reduction).
- Document the earnings deductions in the UC docs page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… at #1947

The docs edit left 'plus all of its unearned income' hanging off the
earnings taper, which read as if unearned income were tapered. State the
two deductions separately. The strict xfail's reason and the module
docstring now cite #1947.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ldcare and local CTR

Fixes #1986.

- Benefit cap earnings exception (UC Regs 2013 reg 82): earned income is
  each person's earnings less their own tax, NI and pension contributions,
  summed over the unit, without the minimum income floor (reg 82(4)). The
  threshold is 16 hours a week at the national living wage, x 52 / 12, in
  whole pounds (reg 6(1A)(za)), x 12; GBP 430 a month before 1 April 2017.
- Targeted childcare (SI 2014/2147 reg 1(3)(a)) and the Kingston, Merton,
  Newham and Westminster CTR schemes (Default Scheme para 37) read earned
  income before the work allowance, the new
  uc_earned_income_before_work_allowance, which uc_earned_income now uses.
- uc_individual_earned_income_before_mif is copied unchanged from #1973 so
  the two PRs add identical files.
- Adds the missing 2023-24 minimum wage rates (SI 2023/354).

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

# Conflicts:
#	docs/book/programs/gov/dwp/universal-credit.ipynb
…able pension contributions

Review of #1949 found two defects in the new deductions.

- uc_income_tax_on_earnings capped the tax on the earnings slice at the
  person's income_tax. When a tax reduction (the married couple's
  allowance) made that cap bind, the pension annual allowance charge and
  the High Income Child Benefit Charge raised the deduction, and so did
  more pension income. Reductions now come off the earnings slice first,
  as allowances do, so the deduction never includes a charge and does not
  move with other income.
- uc_individual_earned_income deducted every pension contribution.
  Contributions paid after 75 are not relievable (Finance Act 2004
  s. 188(3)(a)), so reg. 55(5)(a) does not deduct them.

Adds YAML cases for both, draws a married couple's allowance in the
property tests, and says in the test docstring that payroll giving
(reg. 55(5)(c)) is not modelled.

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

The random generator rarely produced an earner old enough for the married
couple's allowance, so the properties did not exercise tax reductions.
A dedicated family shape now does. With it, restoring the old
min(tax, income_tax) cap fails both the invariance and the differential
property.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
uc_income_tax_on_earnings hard-coded savings, dividends and property as
the incomes outside earned_taxable_income. A reform that adds another
income to gov.hmrc.income_tax.earned_taxable_income_exclusions, such as
one exempting pensions, then had that income subtracted twice, and the
tax on earnings fell to nil. The formula now reads the list.

Adds a YAML case with the reform as a parameter input.

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

- The Class 3 and unearned income property now bumps one adult in every
  family by a realistic amount and mixes in earners just above the
  threshold, so it fails against the pre-#1986 formula (it did not before).
- Adds a reg 82(4) property: switching every minimum income floor off never
  changes benefit cap earned income.
- Moves the benefit cap earnings exception docs into a separate notebook
  cell, leaving the means-test cell that #1973 also edits untouched.

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

Follows #1949's f333e17: contributions paid after 75 are not relievable
(Finance Act 2004 s. 188(3)(a)), so reg 55(5)(a) does not deduct them.
uc_individual_earned_income_before_mif now matches uc_individual_earned_income
apart from the minimum income floor. #1973 carries the same file without
this change; whichever merges second takes this version.

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

Copy link
Copy Markdown
Collaborator Author

Heads-up on an overlap: #2053 (fixes #2044) adds the same 1 April 2023 minimum wage rates as a standalone fix, cites the S.I. and regulation for every dated rate, and adds a pytest transcribed from the S.I.s.

Once #2053 merges, this PR should drop its two gov/hmrc/minimum_wage parameter hunks and the uc-earned-income-consumers-1986-nmw-2023.fixed.md fragment when it rebases; both parameter files will conflict otherwise. The five 2023 cases in tests/policy/baseline/finance/income/minimum_wage.yaml are copied verbatim into #2053 (minus a trailing blank line), so that hunk should merge with at most a trivial end-of-file conflict. The benefit cap threshold here depends on the 2023 rate, which #2053 provides.

🤖 Generated with Claude Code

MaxGhenis and others added 2 commits October 2, 2026 09:32
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Independent review of b696f8d (legal/code and tests/impact lanes):

- The benefit cap is shared with Housing Benefit, so the UC earnings
  exception also excepted HB claimants; with the NLW-based threshold that
  newly excepted some in years when the threshold was under 10,152. Reg
  82(1) applies "to an award of universal credit"; HB has its own
  exceptions (HB Regs 2006 regs 75E and 75F, WTC entitlement already in
  is_benefit_cap_exempt_health_disability). The income test is now
  uc_benefit_cap_earnings_threshold_met, and the exception needs a UC award
  before the cap as well. Adds the reviewer's HB regression.
- Documents that the cap counts miscellaneous_income as the UC award does
  (FRS misc is mainly odd-job pay, reg 52(a)(iii)); the reg 66(1)(m)
  royalties split will move both together.
- Tests: exact pins at 10,572 and 15,400, ages 74/75 for relievable
  contributions, a London BRMA in the counterexample, a floor-dependent
  childcare case, and a fixed 16,500 -> 16,501 childcare crossing in the
  monotonicity property (it kills a reversed-inequality mutant the random
  draws missed). Property 1 compares the income test, and the exception
  where there is a UC award both ways.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2053 adds the same S.I. 2023/354 rates with regulation-level citations
and tests, so #1999 no longer carries them and the two do not conflict.
The benefit cap's 2023-24 threshold follows once #2053 merges (722 a
month; 658 until then). The 2023 benefit cap cases move to 2024-25
(793 a month = 9,516 a year): the 9,520/9,500 pair and the Housing Benefit
regression (9,600 earnings, cap 25,323). The property tests sample 2024
instead of 2023.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis and others added 4 commits October 2, 2026 10:15
…iew's counterexamples

- test_uc_unearned_benefits_properties.py (added on main by #1958) had a
  strict xfail pinned to #1942, which this fix turns into a pass. Remove it
  and widen the earnings-free invariants to all families, with Marriage
  Allowance off as in the State Pension file (#1947).
- The tests review found that random draws missed two mutations. Pin its
  minimized counterexamples as @example cases: a pound of State Pension
  for a pensioner just above the personal allowance with an earning
  partner, and a pound of pension for an earner just above it.

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

# Conflicts:
#	policyengine_uk/tests/policy/baseline/finance/benefit/family/universal_credit/income/uc_earned_income.yaml
#	policyengine_uk/tests/test_uc_unearned_benefits_properties.py
#	policyengine_uk/variables/gov/dwp/universal_credit/income/uc_earned_income.py
… property fixtures

#1896 presumes that a member under 20 who is at least 16 years younger
than the claimant is the claimant's child. The State Pension and earnings
property tests generate couples such as 67 and 18 without relationship
inputs, so the presumption would read them as a parent and child and the
tests would pass without exercising a couple (including the tests
review's pinned 67-and-18 example). Set is_claimant_or_partner from each
generated role, as #1896 did for main's fixtures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…c-earned-income-consumers-1986

# Conflicts:
#	policyengine_uk/variables/gov/dwp/universal_credit/income/uc_earned_income.py
After #1896, is_claimant_or_partner is inferred when not given, and an
adult under 20 who is 16+ years younger than the other can be presumed a
child. The generated families have at most two adults, both claimants, as
#1949's fixtures now declare.

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

Copy link
Copy Markdown
Collaborator Author

Coordination with #2089 (each scheme its own benefit cap), stacked on #2084.

#2089 moves the reg 82 earnings exception to is_uc_benefit_cap_exempt_earnings (UC only) and deletes is_benefit_cap_exempt_earnings.py. HB has its own exceptions (75E working tax credit, 75F), so this PR's "and UC before the cap" gate is no longer needed: is_uc_benefit_cap_exempt_earnings only reaches UC through uc_benefit_cap.

Whichever lands second: put this PR's benefit_cap_earned_income and benefit_cap_earnings_threshold test into policyengine_uk/variables/gov/dwp/universal_credit/benefit_cap/is_uc_benefit_cap_exempt_earnings.py, without the UC-award condition.

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.

Benefit cap, targeted childcare and local CTR use the wrong UC earned income figure

1 participant