Skip to content
Draft
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), and the `add_for_members` helper that sums person-level variables over chosen benefit-unit members.
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)): `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. The benefit cap earnings exception (reg. 82(1)(a)) and the childcare work condition (reg. 32(1)) now read the claimants' earnings and work only, so a dependant's job neither lifts the cap nor switches the childcare costs element on.
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**: the maximum entitlement is reduced by the benunit's countable earnings above its work allowance (`uc_work_allowance`) at the published taper rate. 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 combined earnings above the work allowance are then tapered (the `gov.dwp.universal_credit.means_test.reduction_rate` parameter, currently 55%), plus 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, contribution-based JSA, savings, dividend and property income, and the tariff income deemed from capital (reg 72), which replaces the actual yield of the capital it is charged on. 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**: the maximum entitlement is reduced by the claimants' countable earnings above the work allowance (`uc_work_allowance`) at the published taper rate. Only 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, and never reduce the award. 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 combined earnings above the work allowance are then tapered (the `gov.dwp.universal_credit.means_test.reduction_rate` parameter, currently 55%), plus 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, contribution-based JSA, savings, dividend and property income, and the tariff income deemed from capital (reg 72), which replaces the actual yield of the capital it is charged on. 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)), as does the childcare work condition (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
1 change: 1 addition & 0 deletions policyengine_uk/model_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
from policyengine_core import periods
from microdf import MicroSeries, MicroDataFrame
from policyengine_uk.utils.scenario import Scenario
from policyengine_uk.utils.benefit_unit import add_for_members

GBP = "currency-GBP"
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
# 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 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:
age: 50
employment_income: 15_000
parent_2:
age: 48
employment_income: 15_000
adult_child:
age: 25
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
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,116 @@
output:
uc_individual_earned_income: [900, 450]
uc_earned_income: 1_050

# Reg. 22(1)(b) deducts "the claimant's earned income (or, in the case of
# joint claimants, their combined earned income)". A child's or qualifying
# young person's earnings are theirs, not the claimant's.

- name: A qualifying young person's earnings do not reduce a lone parent's Universal Credit
# Standard allowance £424.90 (single, 25 or over) and child element
# £351.88 (first child, born before 6 April 2017) a month: reg. 36 table,
# 2026-27. The parent has no earned income, so nothing is deducted. Before
# this was fixed the child's £12,000 less the £8,520 work allowance was
# tapered: uc_earned_income 3,480, UC £7,407.36.
period: 2026
absolute_error_margin: 0.01
input:
people:
parent:
age: 40
is_parent: true
child:
age: 17
current_education: UPPER_SECONDARY
employment_income: 12_000
benunits:
benunit:
members: [parent, child]
households:
household:
members: [parent, child]
output:
# The child's own earnings are below the personal allowance and the
# primary threshold, so nothing is deducted from them.
uc_individual_earned_income: [0, 12_000]
uc_earned_income: 0
universal_credit: (424.90 + 351.88) * 12

- name: Joint claimants' earnings combine and their qualifying young person's do not
# Higher work allowance £710 a month (responsible for a qualifying young
# person, no housing costs element): reg. 22(2)(a) table, 2026-27. The
# couple's earned income is 10,000 + 5,000 (below the personal allowance
# and primary threshold, so no deductions); less 8,520 is 6,480. Maximum
# amount (666.97 + 351.88) x 12 = 12,226.20, less 55% of 6,480 = 3,564.
period: 2026
absolute_error_margin: 0.01
input:
people:
parent_1:
age: 40
is_parent: true
employment_income: 10_000
parent_2:
age: 38
is_parent: true
employment_income: 5_000
young_person:
age: 18
current_education: UPPER_SECONDARY
age_started_or_accepted_current_education_or_training: 17
employment_income: 8_000
benunits:
benunit:
members: [parent_1, parent_2, young_person]
households:
household:
members: [parent_1, parent_2, young_person]
output:
uc_individual_earned_income: [10_000, 5_000, 8_000]
uc_work_allowance: 710 * 12
uc_earned_income: 10_000 + 5_000 - 710 * 12
universal_credit: (666.97 + 351.88) * 12 - 0.55 * (15_000 - 710 * 12)

- name: An adult child flagged as a third claimant does not add earned income
# Joint claimants with no child or qualifying young person and no limited
# capability for work have no work allowance (reg. 22(1)(b)(i)).
period: 2026
absolute_error_margin: 0
input:
people:
parent_1:
age: 50
employment_income: 10_000
parent_2:
age: 48
adult_child:
age: 25
employment_income: 11_000
benunits:
benunit:
members: [parent_1, parent_2, adult_child]
output:
is_uc_assessed_claimant: [true, true, false]
uc_work_allowance: 0
uc_earned_income: 10_000

- name: A dependant's self-employed profits do not count and get no minimum income floor
# Before this was fixed the child's £12,000 (no tax or Class 4 below
# £12,570) less the £8,520 work allowance counted: 3,480.
period: 2026
absolute_error_margin: 0
input:
people:
parent:
age: 40
is_parent: true
child:
age: 17
current_education: UPPER_SECONDARY
self_employment_income: 12_000
benunits:
benunit:
members: [parent, child]
output:
uc_mif_applies: [false, false]
uc_earned_income: 0
Loading