Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
613326b
Presume a member 20+ years younger is the claimant's child, without f…
MaxGhenis Oct 2, 2026
dfc53a8
Merge #2040's head c18c836a9 (flag explained by a young child) into c…
MaxGhenis Oct 2, 2026
0448203
Test every unflagged adult pair against the 20-year gap
MaxGhenis Oct 2, 2026
d8fc744
Address review r1: supply roles in wide-gap couple fixtures, fix inva…
MaxGhenis Oct 2, 2026
f43e5ec
Supply roles in couple-generating property tests; correct dataset claims
MaxGhenis Oct 3, 2026
fb4c359
Merge remote-tracking branch 'origin/claimant-partner-adult-child' in…
MaxGhenis Oct 3, 2026
45f3497
Merge #2040's head fd5e9474; restate invariant 4 for the any-age gap
MaxGhenis Oct 3, 2026
d88ac0d
Supply roles in main's 70/50 mixed-age couple fixtures
MaxGhenis Oct 3, 2026
994a829
Merge origin/main (8c82433af) into claimant-partner-unflagged-gap
MaxGhenis Oct 3, 2026
8de59f7
Supply roles in two more couple-generating property tests
MaxGhenis Oct 3, 2026
34c83a9
Merge origin/main (493f0d28, includes #2040) into claimant-partner-un…
MaxGhenis Oct 3, 2026
3c68f09
Merge origin/main (325d585e5) into claimant-partner-unflagged-gap
MaxGhenis Oct 3, 2026
73a7b90
Supply roles in the CTR pensioner earnings disregard generator
MaxGhenis Oct 3, 2026
12962b0
Supply roles in the Pension Credit carer income generator
MaxGhenis Oct 3, 2026
ece21bc
Merge origin/main into claimant-partner-unflagged-gap
MaxGhenis Oct 21, 2026
37f9d59
Supply roles to main's couples 20+ years apart
MaxGhenis Oct 22, 2026
313cf9f
Supply roles to the remaining couple generators 20+ years apart
MaxGhenis Oct 22, 2026
71666c9
Merge origin/main into claimant-partner-unflagged-gap
MaxGhenis Oct 22, 2026
60dbff6
Supply roles to main's new 76/40 benefit cap couple
MaxGhenis Oct 22, 2026
916ea84
Close r6's findings: wide-gap couples in the remaining property tests
MaxGhenis Oct 22, 2026
4e88f38
Merge main d1cbf3d9d into claimant-partner-unflagged-gap
MaxGhenis Oct 24, 2026
22d449b
Supply claimant roles in main's wide-gap couple tests
MaxGhenis Oct 24, 2026
fd9a9e9
Supply claimant roles in the Pension Credit statutory pay properties
MaxGhenis Oct 24, 2026
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/2039-unflagged-gap.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
- Without any parent flag, a member at least 20 years younger than the claimant is now presumed to be their child at any age (`presumed_child.minimum_age_gap_at_any_age`), so ages 50 and 25 entered without relationships are a single claimant and an adult child, not a couple. Members 16 to 19 years younger stay partners from age 20. The presumption only applies where `is_claimant_or_partner` is not supplied: a dataset that carries it (such as policyengine-uk-data's enhanced FRS, which has supplied the FRS roles since 1.58.0) is unaffected, while datasets without it are not.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
description: Age below which a benefit-unit member much younger than the claimant is presumed to be the claimant's child rather than their partner, when relationships are not supplied. The limit does not apply when the claimant is flagged as a parent and no member under it, at least the minimum age gap younger, explains the flag. This is a PolicyEngine modelling presumption, not a statutory rule.
description: Age below which a benefit-unit member much younger than the claimant is presumed to be the claimant's child rather than their partner, when relationships are not supplied. The limit does not apply when the claimant is flagged as a parent and no member under it, at least the minimum age gap younger, explains the flag, nor to a member younger by at least the minimum age gap at any age. This is a PolicyEngine modelling presumption, not a statutory rule.
values:
0001-01-01: 20
metadata:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
description: Minimum age gap below the claimant at which a younger member is presumed to be the claimant's child rather than their partner, when relationships are not supplied. It applies at any age when the claimant is flagged as a parent and no younger member under the presumed child age limit explains the flag, and otherwise only under that limit. This is a PolicyEngine modelling presumption, not a statutory rule.
description: Minimum age gap below the claimant at which a younger member is presumed to be the claimant's child rather than their partner, when relationships are not supplied. It applies at any age when the claimant is flagged as a parent and no younger member under the presumed child age limit explains the flag, and otherwise only under that limit; a larger gap (the minimum age gap at any age) applies at any age. This is a PolicyEngine modelling presumption, not a statutory rule.
values:
0001-01-01: 16
metadata:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
description: Minimum age gap below the claimant at which a younger member is presumed to be the claimant's child rather than their partner at any age, even when the claimant is not flagged as a parent, when relationships are not supplied. A member flagged as a parent can still be the partner. This is a PolicyEngine modelling presumption, not a statutory rule.
values:
0001-01-01: 20
metadata:
unit: year
label: presumed child minimum age gap at any age
Original file line number Diff line number Diff line change
Expand Up @@ -481,8 +481,10 @@
people:
claimant:
age: 70
is_claimant_or_partner: true
partner:
age: 50
is_claimant_or_partner: true
employment_income: 3_000
benunits:
benunit:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,10 +214,12 @@
age: 80
months_since_last_birthday: 4.1613
is_male: true
is_claimant_or_partner: true
younger:
age: 60
months_since_last_birthday: 9.1613
is_male: false
is_claimant_or_partner: true
benunits:
benunit:
members: [older, younger]
Expand All @@ -227,6 +229,7 @@
housing_benefit_pension_age_regulations_apply: true
benefits_premiums: 0
output:
relation_type: COUPLE
housing_benefit_attained_pension_age_before_cutoff: true
housing_benefit_applicable_amount: 383.35 * 52 # para 1(2)(b), older attained 1 June 2011, younger attained 1 January 2033

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -249,9 +249,11 @@
age: 70
private_pension_income: 5_000
housing_benefit_reported: 1
is_claimant_or_partner: true
partner:
age: 40
employment_income: 2_000
is_claimant_or_partner: true
benunits:
benunit:
members: [claimant, partner]
Expand All @@ -266,6 +268,7 @@
rent: 5_720
savings: 9_000
output:
relation_type: COUPLE
housing_benefit_pension_age_regulations_apply: false
housing_benefit_on_passporting_benefit: true
housing_benefit_applicable_income_disregard: 2_000
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,9 +289,11 @@
claimant:
age: {2026: 50}
is_disabled_for_benefits: {2026: true}
is_claimant_or_partner: true
partner:
age: {2026: 70}
state_pension: {2026: 3_000}
is_claimant_or_partner: true
benunits:
benunit:
members: [claimant, partner]
Expand All @@ -303,6 +305,7 @@
rent: {2026: 6_240}
council_tax: {2026: 2_000}
output:
relation_type: COUPLE
is_uc_entitled: true
housing_benefit_pension_age_regulations_apply: false
council_tax_reduction_pensioner: false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,21 @@
is_parent: false
is_disabled_for_benefits: false
working_tax_credit_reported: 1
is_claimant_or_partner: true
adult_1:
age: 40
hours_worked: 1040
employment_income: 5000
is_parent: false
is_disabled_for_benefits: false
is_claimant_or_partner: true
benunits:
family:
members:
- adult_0
- adult_1
output:
relation_type: COUPLE
working_tax_credit: 0
is_WTC_eligible: false
- name: A worker aged sixty qualifies on their own sixteen hours
Expand All @@ -39,18 +42,21 @@
is_parent: false
is_disabled_for_benefits: false
working_tax_credit_reported: 1
is_claimant_or_partner: true
adult_1:
age: 40
hours_worked: 0
employment_income: 0
is_parent: false
is_disabled_for_benefits: false
is_claimant_or_partner: true
benunits:
family:
members:
- adult_0
- adult_1
output:
relation_type: COUPLE
is_WTC_eligible: true
working_tax_credit: 4935
- name: A thirty hour worker cannot borrow a partners age twenty five
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,13 @@
older:
age: 70
self_employment_income: 3_000
is_claimant_or_partner: true
younger:
age: 40
self_employment_income: 3_000
is_claimant_or_partner: true
output:
relation_type: COUPLE
uc_mif_applies: [false, true]

- name: A partner who cannot be a joint claimant is not a claimant
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -531,15 +531,18 @@
age: 70
employment_income: 6_000
would_claim_marriage_allowance: false
is_claimant_or_partner: true
self_employed:
age: 40
self_employment_income: 3_600
would_claim_marriage_allowance: false
is_claimant_or_partner: true
households:
household:
members: [older, self_employed]
region: NORTH_EAST
output:
relation_type: COUPLE
uc_mif_applies: [false, true]
uc_minimum_income_floor: [0, 20_386.03]
# 20,386.03 - 6,000.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,11 @@
pensioner:
age: 70
state_pension: 16_000
is_claimant_or_partner: true
partner:
age: 45
employment_income: 13_000
is_claimant_or_partner: true
benunits:
benunit:
members: [pensioner, partner]
Expand All @@ -117,6 +119,7 @@
tenure_type: RENT_FROM_COUNCIL
rent: 20_000
output:
relation_type: COUPLE
# Pensioner: (16,000 - 12,570) x 20% = 686, on State Pension.
# Partner: (13,000 - 12,570) x 20% = 86 and (13,000 - 12,569.96) x 8%
# = 34.40. Both are above the personal allowance, so there is no
Expand Down Expand Up @@ -304,16 +307,19 @@
employment_income: 20_000
married_couples_allowance: 11_000
would_claim_marriage_allowance: false
is_claimant_or_partner: true
partner:
age: 45
would_claim_marriage_allowance: false
is_claimant_or_partner: true
benunits:
benunit:
members: [older, partner]
households:
household:
members: [older, partner]
output:
relation_type: COUPLE
# Married couple's allowance reduction: 10% x 11,000 = 1,100.
capped_mcad: [1_100, 0]
# (20,000 - 12,570) x 20% = 1,486, less 1,100.
Expand All @@ -331,16 +337,19 @@
private_pension_income: 5_000
married_couples_allowance: 11_000
would_claim_marriage_allowance: false
is_claimant_or_partner: true
partner:
age: 45
would_claim_marriage_allowance: false
is_claimant_or_partner: true
benunits:
benunit:
members: [older, partner]
households:
household:
members: [older, partner]
output:
relation_type: COUPLE
# 1,486 on earnings + 5,000 x 20% on the pension - 1,100.
income_tax: [1_386, 0]
# The reduction still comes off the earnings slice: 1,486 - 1,100.
Expand All @@ -359,16 +368,19 @@
unused_pension_annual_allowance: 0
married_couples_allowance: 11_000
would_claim_marriage_allowance: false
is_claimant_or_partner: true
partner:
age: 45
would_claim_marriage_allowance: false
is_claimant_or_partner: true
benunits:
benunit:
members: [older, partner]
households:
household:
members: [older, partner]
output:
relation_type: COUPLE
# Contributions of 65,000 exceed the 60,000 annual allowance by 5,000,
# charged at the basic rate: 1,000.
personal_pension_contributions_tax: [1_000, 0]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,12 @@
people:
older:
age: 70
is_claimant_or_partner: true
younger:
age: 40
is_claimant_or_partner: true
output:
relation_type: COUPLE
uc_work_related_group_apart_from_earnings: [NO_REQUIREMENTS, ALL_REQUIREMENTS]

# Reg. 89(1)(a) reads "the qualifying age for state pension credit": State
Expand Down Expand Up @@ -163,10 +166,13 @@
age: 64
months_since_last_birthday: 6
gender: MALE
is_claimant_or_partner: true
younger:
age: 40
gender: FEMALE
is_claimant_or_partner: true
output:
relation_type: COUPLE
has_attained_state_pension_credit_qualifying_age: [true, false]
is_SP_age: [false, false]
uc_work_related_group_apart_from_earnings: [NO_REQUIREMENTS, ALL_REQUIREMENTS]
Expand All @@ -181,10 +187,13 @@
age: 63
months_since_last_birthday: 4
gender: MALE
is_claimant_or_partner: true
younger:
age: 40
gender: FEMALE
is_claimant_or_partner: true
output:
relation_type: COUPLE
has_attained_state_pension_credit_qualifying_age: [false, false]
is_SP_age: [false, false]
uc_work_related_group_apart_from_earnings: [ALL_REQUIREMENTS, ALL_REQUIREMENTS]
Expand All @@ -197,10 +206,13 @@
age: 64
months_since_last_birthday: 4
gender: MALE
is_claimant_or_partner: true
younger:
age: 41
gender: FEMALE
is_claimant_or_partner: true
output:
relation_type: COUPLE
has_attained_state_pension_credit_qualifying_age: [true, false]
is_SP_age: [false, false]
uc_work_related_group_apart_from_earnings: [NO_REQUIREMENTS, ALL_REQUIREMENTS]
Expand All @@ -215,10 +227,13 @@
age: 64
months_since_last_birthday: 6
gender: FEMALE
is_claimant_or_partner: true
younger:
age: 40
gender: MALE
is_claimant_or_partner: true
output:
relation_type: COUPLE
has_attained_state_pension_credit_qualifying_age: [true, false]
is_SP_age: [true, false]
uc_work_related_group_apart_from_earnings: [NO_REQUIREMENTS, ALL_REQUIREMENTS]
Expand All @@ -234,10 +249,13 @@
age: 64
months_since_last_birthday: 10
gender: MALE
is_claimant_or_partner: true
younger:
age: 40
gender: FEMALE
is_claimant_or_partner: true
output:
relation_type: COUPLE
has_attained_state_pension_credit_qualifying_age: [false, false]
is_SP_age: [false, false]
uc_work_related_group_apart_from_earnings: [ALL_REQUIREMENTS, ALL_REQUIREMENTS]
Expand All @@ -253,10 +271,13 @@
months_since_last_birthday: 6
gender: MALE
self_employment_income: 5_000
is_claimant_or_partner: true
younger:
age: 40
gender: FEMALE
is_claimant_or_partner: true
output:
relation_type: COUPLE
uc_is_in_gainful_self_employment: [true, false]
uc_work_related_group_apart_from_earnings: [NO_REQUIREMENTS, ALL_REQUIREMENTS]
uc_mif_applies: [false, false]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,9 +245,11 @@
people:
person1:
age: 70
is_claimant_or_partner: true
state_pension_reported: 10_000
person2:
age: 40
is_claimant_or_partner: true
person3:
age: 2
benunits:
Expand Down Expand Up @@ -401,9 +403,11 @@
people:
person1:
age: 80
is_claimant_or_partner: true
state_pension_reported: 10_000
person2:
age: 40
is_claimant_or_partner: true
person3:
age: 2
benunits:
Expand Down
Loading
Loading