Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/uc-claimant-only-income.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Add `is_uc_assessed_claimant`: the single claimant or the two joint claimants whose income a Universal Credit award assesses (`is_uc_claimant`, limited to the two eldest when inputs flag more).
1 change: 1 addition & 0 deletions changelog.d/uc-claimant-only-income.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Count only the claimants' income in Universal Credit (UC Regs 2013 reg. 22(1); WRA 2012 s. 8(4)). `uc_earned_income` and `uc_unearned_income` also counted the claimant's children and qualifying young people, so a dependant's wages, profits or pension reduced the parents' award. The benefit cap earnings exception (reg. 82(1)(a)), the capped benefit total (WRA 2012 s. 96(1)) and the childcare work condition (reg. 32(1)) now read the claimants only, so a dependant's job neither lifts the cap nor meets or blocks the work condition.
2 changes: 1 addition & 1 deletion docs/book/programs/gov/dwp/universal-credit.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
{
"cell_type": "markdown",
"metadata": {},
"source": "## How PolicyEngine computes Universal Credit\n\nPolicyEngine computes Universal Credit at the benefit-unit level in three stages:\n\n1. **Maximum entitlement** (`uc_maximum_amount`): sum the elements the benunit qualifies for — `uc_standard_allowance`, `uc_child_element`, `uc_disability_elements`, `uc_carer_element`, `uc_housing_costs_element`, and `uc_childcare_element`.\n2. **Means test**: each person's earnings (`uc_individual_earned_income`) are net of their own relievable pension contributions and the income tax and National Insurance they pay on that employment or self-employment (UC Regulations 2013 regs 55(5) and 57(2)): `uc_income_tax_on_earnings` treats earnings as the lowest slice of the person's non-savings income, so tax on pensions, property, savings and dividends is never deducted, and one partner's tax never reduces the other's earnings. A claimant with a self-employment profit or loss outside a start-up period is subject to the minimum income floor (reg 62): when their earnings after those deductions are below `uc_minimum_income_floor`, they are treated as having that amount instead. The floor is the minimum wage for their age for 35 hours a week (reg 90(2)), less the income tax and the Class 2 and Class 4 National Insurance a self-employed person would pay on it (reg 62(4)(b) leaves this amount to the Secretary of State; this is the basis of DWP's guidance and figures, and setting the `gov.dwp.universal_credit.means_test.minimum_income_floor.self_employed_national_insurance` parameter to false deducts primary Class 1 instead). A member of a couple is lifted only while the couple's combined earnings are below the couple threshold, the sum of both partners' floors, and never above it (reg 62(3)). The maximum entitlement is then reduced by 55% (the `gov.dwp.universal_credit.means_test.reduction_rate` parameter) of the benunit's combined earnings above its work allowance (`uc_work_allowance`), and by all of its unearned income (`uc_unearned_income`), pound for pound. Unearned income is the list in `gov.dwp.universal_credit.means_test.income_definitions.unearned`: retirement pension income (State Pension and private pensions, UC Regulations 2013 regs 66(1)(a) and 67), Carer's Allowance, carer support payment (up to the Carer's Allowance rate, from November 2023), contribution-based JSA and ESA, maternity allowance, industrial injuries benefit, and the tariff income deemed from capital (reg 72). Actual savings interest, dividends and ordinary rental income are excluded from UC unearned income at every capital level; capital counts through its tariff income instead. Asset rules apply on top of this — capital above the lower threshold deems a tariff income, and capital above the upper threshold disqualifies the benunit entirely.\n3. **Benefit cap**: the post-means-test award (`universal_credit_pre_benefit_cap`) is finally reduced by `benefit_cap_reduction` to produce `universal_credit`. The benefit cap only applies to benunits without a benefit-cap exemption (working enough hours, having a qualifying disability benefit, etc.).\n\nThe take-up step is handled by the input variable `would_claim_uc`, which is populated stochastically when the dataset is built so that PolicyEngine's caseload aggregates match published DWP claimant numbers rather than the full eligible population.\n\nParameters live in `policyengine_uk/parameters/gov/dwp/universal_credit/` and the per-element formulas in `policyengine_uk/variables/gov/dwp/universal_credit/`."
"source": "## How PolicyEngine computes Universal Credit\n\nPolicyEngine computes Universal Credit at the benefit-unit level in three stages:\n\n1. **Maximum entitlement** (`uc_maximum_amount`): sum the elements the benunit qualifies for — `uc_standard_allowance`, `uc_child_element`, `uc_disability_elements`, `uc_carer_element`, `uc_housing_costs_element`, and `uc_childcare_element`.\n2. **Means test**: only the claimants' income counts: the single claimant, or the two joint claimants (`is_uc_assessed_claimant`; UC Regulations 2013 reg 22(1)). The earnings and unearned income of a child, a qualifying young person or anyone else in the benefit unit are theirs, not the claimant's, so the Universal Credit means test does not count them. Who the claimants are comes from `is_uc_claimant` (the claimant and partner); a member flagged there is taken as a claimant whatever their age. Each person's earnings (`uc_individual_earned_income`) are net of their own relievable pension contributions and the income tax and National Insurance they pay on that employment or self-employment (UC Regulations 2013 regs 55(5) and 57(2)): `uc_income_tax_on_earnings` treats earnings as the lowest slice of the person's non-savings income, so tax on pensions, property, savings and dividends is never deducted, and one partner's tax never reduces the other's earnings. A claimant with a self-employment profit or loss outside a start-up period is subject to the minimum income floor (reg 62): when their earnings after those deductions are below `uc_minimum_income_floor`, they are treated as having that amount instead. The floor is the minimum wage for their age for 35 hours a week (reg 90(2)), less the income tax and the Class 2 and Class 4 National Insurance a self-employed person would pay on it (reg 62(4)(b) leaves this amount to the Secretary of State; this is the basis of DWP's guidance and figures, and setting the `gov.dwp.universal_credit.means_test.minimum_income_floor.self_employed_national_insurance` parameter to false deducts primary Class 1 instead). A member of a couple is lifted only while the couple's combined earnings are below the couple threshold, the sum of both partners' floors, and never above it (reg 62(3)). The maximum entitlement is then reduced by 55% (the `gov.dwp.universal_credit.means_test.reduction_rate` parameter) of the claimants' combined earnings above the work allowance (`uc_work_allowance`), and by all of the claimants' unearned income (`uc_unearned_income`), pound for pound. Unearned income is the list in `gov.dwp.universal_credit.means_test.income_definitions.unearned`: retirement pension income (State Pension and private pensions, UC Regulations 2013 regs 66(1)(a) and 67), Carer's Allowance, carer support payment (up to the Carer's Allowance rate, from November 2023), contribution-based JSA and ESA, maternity allowance, industrial injuries benefit, and the tariff income deemed from capital (reg 72). Actual savings interest, dividends and ordinary rental income are excluded from UC unearned income at every capital level; capital counts through its tariff income instead. Asset rules apply on top of this — capital above the lower threshold deems a tariff income, and capital above the upper threshold disqualifies the benunit entirely.\n3. **Benefit cap**: the post-means-test award (`universal_credit_pre_benefit_cap`) is finally reduced by `benefit_cap_reduction` to produce `universal_credit`. The benefit cap only applies to benunits without a benefit-cap exemption (the claimants earning enough, having a qualifying disability benefit, etc.). The earnings exception reads the claimants' earnings only (reg 82(1)(a)), the capped total counts only the claimants' own contributory benefits (WRA 2012 s.96(1)), and the childcare work condition tests only the claimants (reg 32(1)).\n\nThe take-up step is handled by the input variable `would_claim_uc`, which is populated stochastically when the dataset is built so that PolicyEngine's caseload aggregates match published DWP claimant numbers rather than the full eligible population.\n\nParameters live in `policyengine_uk/parameters/gov/dwp/universal_credit/` and the per-element formulas in `policyengine_uk/variables/gov/dwp/universal_credit/`."
},
{
"cell_type": "code",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -511,11 +511,11 @@
members: [first, second, third]
output:
# A couple has two members, so three flagged claimants are a data error,
# not a legal claim. The formula generalises reg. 32(1) as: some claimant
# meets limb (a) and every other claimant meets limb (b).
# not a legal claim. The two eldest are the claimants
# (is_uc_assessed_claimant): one meets limb (a) and the other limb (b).
uc_childcare_work_condition: true

- name: Reg. 32(1) - three flagged claimants, one of whom neither works nor meets an exception
- name: Reg. 32(1) - three flagged claimants; the youngest neither works nor meets an exception
period: 2025
absolute_error_margin: 0
input:
Expand All @@ -538,6 +538,37 @@
household:
members: [first, second, third]
output:
# Three flagged claimants are a data error. The two eldest are the
# claimants (is_uc_assessed_claimant), as for their income, so the
# youngest's work is not tested: one claimant works and the other has
# limited capability for work.
is_uc_assessed_claimant: [true, true, false]
uc_childcare_work_condition: true

- name: Reg. 32(1) - three flagged claimants; the second eldest neither works nor meets an exception
period: 2025
absolute_error_margin: 0
input:
people:
first:
age: 40
is_claimant_or_partner: true
employment_income: 15_000
second:
age: 39
is_claimant_or_partner: true
third:
age: 38
is_claimant_or_partner: true
uc_limited_capability_for_WRA: true
benunits:
benunit:
members: [first, second, third]
households:
household:
members: [first, second, third]
output:
is_uc_assessed_claimant: [true, true, false]
uc_childcare_work_condition: false

- name: Reg. 32(1)(a) - self-employment is paid work
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
# A dependant's income is not the claimant's. Besides the income deducted
# from the award (reg. 22(1): income/uc_earned_income.yaml and
# income/uc_unearned_income.yaml), three other Universal Credit rules read
# members' income or work: the benefit cap's earnings exception (reg.
# 82(1)(a): "the claimant's earned income or, if the claimant is a member of a
# couple, the couple's combined earned income"), the benefit cap total (WRA
# 2012 s. 96(1): "the welfare benefits to which a single person or couple is
# entitled") and the childcare work condition (reg. 32(1): "the claimant is in
# paid work" and, in a couple, "the other member").

- name: A qualifying young person's earnings do not exempt the family from the benefit cap
# Reg. 80A(2)(d)(ii): £22,020 a year outside Greater London for a claimant
# responsible for a child or qualifying young person. Before this was
# fixed the young person's £12,000 met the earnings exception.
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
young_person:
age: 17
current_education: UPPER_SECONDARY
employment_income: 12_000
benunits:
benunit:
members: [parent, young_person]
households:
household:
members: [parent, young_person]
region: NORTH_EAST
output:
is_benefit_cap_exempt_earnings: false
benefit_cap: 22_020

- name: The claimant's own earnings still meet the benefit cap earnings exception
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
employment_income: 12_000
young_person:
age: 17
current_education: UPPER_SECONDARY
benunits:
benunit:
members: [parent, young_person]
households:
household:
members: [parent, young_person]
region: NORTH_EAST
output:
is_benefit_cap_exempt_earnings: true

- name: Joint claimants' combined earnings meet the benefit cap earnings exception
# Neither partner's £6,000 reaches the threshold alone; together they do.
period: 2026
absolute_error_margin: 0
input:
people:
parent_1:
age: 40
is_parent: true
employment_income: 6_000
parent_2:
age: 38
is_parent: true
employment_income: 6_000
child:
age: 5
benunits:
benunit:
members: [parent_1, parent_2, child]
households:
household:
members: [parent_1, parent_2, child]
region: NORTH_EAST
output:
is_benefit_cap_exempt_earnings: true

- name: A dependent 18-year-old's job makes no difference to the childcare work condition
# The working lone parent meets it whether or not the young person works.
# Before this was fixed an 18-year-old without a job blocked it, so their
# taking one switched the childcare costs element on.
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
employment_income: 15_000
young_person:
age: 18
current_education: UPPER_SECONDARY
age_started_or_accepted_current_education_or_training: 17
child:
age: 3
childcare_expenses: 5_000
benunits:
benunit:
members: [parent, young_person, child]
output:
is_uc_claimant: [true, false, false]
uc_childcare_work_condition: true

- name: A dependent 18-year-old's job does not meet the childcare work condition for a parent out of work
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
young_person:
age: 18
current_education: UPPER_SECONDARY
age_started_or_accepted_current_education_or_training: 17
employment_income: 5_000
child:
age: 3
childcare_expenses: 5_000
benunits:
benunit:
members: [parent, young_person, child]
output:
uc_childcare_work_condition: false

- name: An adult child flagged as a third claimant by the data neither meets nor blocks the childcare work condition
# Both members of the couple work, so reg. 32(1) is met whether or not
# their adult child does.
period: 2026
absolute_error_margin: 0
input:
people:
parent_1:
is_claimant_or_partner: true
age: 50
employment_income: 15_000
parent_2:
is_claimant_or_partner: true
age: 48
employment_income: 15_000
adult_child:
age: 25
is_claimant_or_partner: true
child:
age: 3
childcare_expenses: 5_000
benunits:
benunit:
members: [parent_1, parent_2, adult_child, child]
output:
is_uc_assessed_claimant: [true, true, false, false]
uc_childcare_work_condition: true

- name: A dependant's contributory benefit is not part of the benefit cap total
# The cap is £22,020 (reg. 80A(2)(d)(ii)). The parent's award before the
# cap is set to £30,000 and Child Benefit to nil, so the excess is 7,980.
# The young person's £5,000 is theirs, not the claimant's (WRA 2012 s.
# 96(1); reg. 80(1)): before this was fixed the excess was 12,980.
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
young_person:
age: 17
current_education: UPPER_SECONDARY
jsa_contrib: 5_000
benunits:
benunit:
members: [parent, young_person]
universal_credit_pre_benefit_cap: 30_000
child_benefit: 0
households:
household:
members: [parent, young_person]
region: NORTH_EAST
output:
benefit_cap: 22_020
benefit_cap_reduction: 30_000 - 22_020

- name: The claimant's own contributory benefit is part of the benefit cap total
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
jsa_contrib: 2_000
young_person:
age: 17
current_education: UPPER_SECONDARY
benunits:
benunit:
members: [parent, young_person]
universal_credit_pre_benefit_cap: 30_000
child_benefit: 0
households:
household:
members: [parent, young_person]
region: NORTH_EAST
output:
benefit_cap: 22_020
benefit_cap_reduction: 30_000 + 2_000 - 22_020
Loading
Loading