Skip to content
Open
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
22b049d
Apply 416.1163(e)(2) to deemed SSI and identify couples by marriage
MaxGhenis Oct 12, 2026
2924cd9
Test 416.1163(e)(2) against the 416.1163(g) Smith and Jones examples
MaxGhenis Oct 12, 2026
56579ca
Keep SSI joint claims ABD-only and apply 416.1163(e)(2) in uncapped_ssi
MaxGhenis Oct 12, 2026
f6c19e0
Give each person in the SSI citizenship test their own units
MaxGhenis Oct 12, 2026
49116e9
Combine only the SSI spouses in the Massachusetts and Alaska supplements
MaxGhenis Oct 12, 2026
c124bca
Merge main into ssi-couples-and-deeming-cap
MaxGhenis Oct 28, 2026
22fca6e
Merge remote-tracking branch 'gh/main' into ssi-couples-and-deeming-cap
MaxGhenis Oct 29, 2026
71e9ab8
Isolate state supplement calculations to co-resident spouses
MaxGhenis Oct 29, 2026
07a1f33
Check every state supplement against explicit spouse units
MaxGhenis Oct 29, 2026
df8cbd7
Preserve Colorado OAP spouse rules across households
MaxGhenis Oct 29, 2026
b6b014e
Clarify spouse and SSI inputs in state test fixtures
MaxGhenis Oct 29, 2026
2ea8855
Merge main into SSI couples review branch
MaxGhenis Oct 29, 2026
200a31f
Preserve state supplement spouse budgets across separate households
MaxGhenis Oct 29, 2026
a53311a
Test separated spouses against unrelated household adults
MaxGhenis Oct 29, 2026
37448b7
Merge main into SSI couples and deeming cap review fix
MaxGhenis Oct 30, 2026
6a3d5d2
Preserve Iowa supplement spouse budgets and residential care entry tr…
MaxGhenis Oct 30, 2026
9446b01
Generate separated-spouse supplement budgets and clarify the eligible…
MaxGhenis Oct 30, 2026
3765b00
Merge main into SSI couple and deeming fixes
MaxGhenis Oct 31, 2026
0a79258
Exclude known nonspouses from retained state budgets and pin deeming …
MaxGhenis Oct 31, 2026
ecd9dcb
Limit non-MAGI Medicaid budgets to identified spouses
MaxGhenis Oct 31, 2026
9ee38b7
Align merged California CAPI readers with SSI spouse pairs
MaxGhenis Oct 31, 2026
16ec6c5
Make spouse supplement eligibility explicit in CAPI fixtures
MaxGhenis Oct 31, 2026
4e4136e
Preserve co-resident parent identity in retained spouse checks
MaxGhenis Oct 31, 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
2 changes: 2 additions & 0 deletions changelog.d/ssi-couples-and-deeming-cap.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
SSI under spousal income deeming is now the lesser of the couple computation and the individual Federal benefit rate less the person's own countable income (20 CFR 416.1163(e)(2)), not the couple computation capped at the individual rate; uncapped_ssi applies the same rule, so state supplements that read it see the federal shortfall. SSI couples are now identified by the co-resident spouse test that resource deeming uses rather than by tax-unit head and spouse roles, for joint claims, combined couple income and resources, and income deeming from an ineligible spouse (416.1801(c), 416.1806, 416.1160(d)). State supplement couple rates, income, resources, care categories and spouse allowances now use only the actual spouses when a situation omits marital units and includes a third adult. Colorado OAP retains declared spouses living apart; Missouri retains their combined resources for medical separation, Virginia and South Dakota retain joint care-entry budgets, and Oregon retains the community-care spouse payment across facilities. Iowa pools only the identified spouses across its state supplement paths, retains its prior-SSI residential-care entry budget across facilities, and requires an explicit shared-room input for the same-month entry rule without prior SSI.
Retained state spouse budgets now reject explicit parent links and tax-dependent pairs across households. Non-MAGI Medicaid income, premium, resource and spenddown budgets and California CAPI use only the identified spouses when marital units are omitted. Regressions pin claimant-wage deeming continuity and the 2026 wage/self-employment cases.
1,221 changes: 1,221 additions & 0 deletions policyengine_us/tests/core/test_ssi_spousal_deeming_invariants.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,280 @@
# Omitted marital units form one default group. Only the identified spouses
# may enter these non-MAGI Medicaid budgets; the third adult is unrelated.
- name: California excludes an unrelated adult's premiums from a couple budget.
period: 2026
absolute_error_margin: 0.01
input:
people:
head:
age: 67
is_tax_unit_head: true
pension_income: 36_000
medicare_enrolled: false
spouse:
age: 67
is_tax_unit_spouse: true
pension_income: 24_000
medicare_enrolled: false
third:
age: 67
pension_income: 12_000
health_insurance_premiums: 12_000
medicare_enrolled: false
ssi_federal_living_arrangement:
2026-01: MEDICAL_TREATMENT_FACILITY
tax_units:
couple:
members: [head, spouse]
third:
members: [third]
families:
couple:
members: [head, spouse]
third:
members: [third]
spm_units:
couple:
members: [head, spouse]
third:
members: [third]
households:
household:
members: [head, spouse, third]
state_code: CA
output:
ssi_couple_computation_applies:
2026-01: [true, true, false]
# (36,000 + 24,000 - 240) / 2; the third adult's 12,000 is not deducted.
medicaid_optional_senior_or_disabled_countable_income: [29_880, 29_880, 0]

- name: Optional ABD income and assets exclude an unrelated adult and retain the couple limits.
period: 2026
input:
people:
head:
age: 70
is_tax_unit_head: true
medicaid_optional_senior_or_disabled_countable_income: 8_946
ssi_countable_resources: 1_200
spouse:
age: 68
is_tax_unit_spouse: true
medicaid_optional_senior_or_disabled_countable_income: 8_946
ssi_countable_resources: 1_200
third:
age: 70
medicaid_optional_senior_or_disabled_countable_income: 50_000
ssi_countable_resources: 50_000
tax_units:
couple:
members: [head, spouse]
third:
members: [third]
families:
couple:
members: [head, spouse]
third:
members: [third]
spm_units:
couple:
members: [head, spouse]
third:
members: [third]
households:
household:
members: [head, spouse, third]
state_code: WV
output:
# West Virginia's 2026 annual SSI rates: couple 17,892; individual 11,928.
medicaid_optional_senior_or_disabled_income_limit: [17_892, 17_892, 11_928]
is_optional_senior_or_disabled_income_eligible: [true, true, false]
# Couple assets 2,400 are below 3,000; the third adult's 50,000 is excluded.
is_optional_senior_or_disabled_asset_eligible: [true, true, false]

- name: Section 209b spenddown excludes an unrelated adult's medical expenses.
period: 2026
input:
people:
head:
age: 70
is_tax_unit_head: true
is_optional_senior_or_disabled_income_eligible: false
medicaid_optional_senior_or_disabled_countable_income: 20_000
medicaid_medically_needy_medical_expenses: 5_000
medicaid_optional_senior_or_disabled_income_limit: 25_000
spouse:
age: 68
is_tax_unit_spouse: true
is_optional_senior_or_disabled_income_eligible: false
medicaid_optional_senior_or_disabled_countable_income: 20_000
medicaid_medically_needy_medical_expenses: 5_000
medicaid_optional_senior_or_disabled_income_limit: 25_000
third:
age: 70
is_optional_senior_or_disabled_income_eligible: false
medicaid_optional_senior_or_disabled_countable_income: 0
medicaid_medically_needy_medical_expenses: 12_000
medicaid_optional_senior_or_disabled_income_limit: 25_000
tax_units:
couple:
members: [head, spouse]
third:
members: [third]
families:
couple:
members: [head, spouse]
third:
members: [third]
spm_units:
couple:
members: [head, spouse]
third:
members: [third]
households:
household:
members: [head, spouse, third]
state_code: IL
output:
# 2 x (20,000 - 5,000) = 30,000, above 25,000; subtracting the third
# adult's expenses would incorrectly bring the couple down to 18,000.
is_209b_ssi_recipient_income_eligible_for_medicaid: [false, false, true]

- name: Medically needy income and assets exclude an unrelated adult.
period: 2026
input:
people:
head:
age: 70
is_tax_unit_head: true
is_adult_for_medicaid: false
is_optional_senior_or_disabled_for_medicaid: false
is_ssi_recipient_for_medicaid: false
ssi_countable_income: 10_000
medicaid_medically_needy_medical_expenses: 6_500
ssi_countable_resources: 1_000
spouse:
age: 68
is_tax_unit_spouse: true
is_adult_for_medicaid: false
is_optional_senior_or_disabled_for_medicaid: false
is_ssi_recipient_for_medicaid: false
ssi_countable_income: 10_000
medicaid_medically_needy_medical_expenses: 6_500
ssi_countable_resources: 1_000
third:
age: 70
is_adult_for_medicaid: false
is_optional_senior_or_disabled_for_medicaid: false
is_ssi_recipient_for_medicaid: false
ssi_countable_income: 50_000
ssi_countable_resources: 50_000
tax_units:
couple:
members: [head, spouse]
third:
members: [third]
families:
couple:
members: [head, spouse]
third:
members: [third]
spm_units:
couple:
members: [head, spouse]
third:
members: [third]
households:
household:
members: [head, spouse, third]
state_code: MA
output:
# 7,000 income <= 7,800 couple limit; 2,000 assets <= 3,000. The
# unrelated adult's income and assets do not enter either comparison.
is_medically_needy_for_medicaid: [true, true, false]

- name: Missouri spouse deeming excludes an unrelated third adult's income.
period: 2026
absolute_error_margin: 0.01
input:
people:
head:
age: 70
is_tax_unit_head: true
ssi_unearned_income: 17_400
spouse:
age: 60
is_tax_unit_spouse: true
ssi_earned_income: 4_800
third:
age: 60
ssi_earned_income: 120_000
ssi_unearned_income: 120_000
tax_units:
couple:
members: [head, spouse]
third:
members: [third]
families:
couple:
members: [head, spouse]
third:
members: [third]
spm_units:
couple:
members: [head, spouse]
third:
members: [third]
households:
household:
members: [head, spouse, third]
state_code: MO
output:
# The SSI spouse-status mask already excludes an unrelated singleton.
is_ssi_ineligible_spouse: [false, true, false]
medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse: [2_004, 0, 0]

- name: Missouri spouse deeming excludes another couple's ineligible spouse.
period: 2026
absolute_error_margin: 0.01
input:
people:
head:
age: 70
is_tax_unit_head: true
ssi_unearned_income: 17_400
spouse:
age: 60
is_tax_unit_spouse: true
ssi_earned_income: 4_800
other_head:
age: 70
is_tax_unit_head: true
other_spouse:
age: 60
is_tax_unit_spouse: true
ssi_earned_income: 12_000
ssi_unearned_income: 12_000
tax_units:
couple:
members: [head, spouse]
other_couple:
members: [other_head, other_spouse]
families:
couple:
members: [head, spouse]
other_couple:
members: [other_head, other_spouse]
spm_units:
couple:
members: [head, spouse]
other_couple:
members: [other_head, other_spouse]
households:
household:
members: [head, spouse, other_head, other_spouse]
state_code: MO
output:
is_ssi_ineligible_spouse: [false, true, false, true]
# First couple: floor((400 - 65) / 2 + 1,450 - 20) - 1,430 = 167
# monthly. Second: floor((1,000 - 65) / 2 + 1,000 - 20) = 1,447.
medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse: [2_004, 0, 17_364, 0]
Original file line number Diff line number Diff line change
Expand Up @@ -154,3 +154,43 @@
members: [person1, person2]
output:
ssi_income_deemed_from_ineligible_spouse: [0, 0]

# 416.1160(d): 'Ineligible spouse means someone who lives with you as your
# husband or wife and is not eligible for SSI benefits.' Tax-unit roles do
# not decide it: here the model makes the elder head and the claimant the
# tax-unit spouse, and the claimant's husband a dependent.
# 2026 rates: $994 individual, $1,491 couple.
- name: Income of an ineligible spouse who is a tax-unit dependent is deemed
period: 2026-01
absolute_error_margin: 0.01
input:
people:
elder:
age: 90
social_security_retirement: 900 * 12
claimant:
age: 70
social_security_retirement: 600 * 12
husband:
age: 60
employment_income: 2_000 * 12
tax_units:
tax_unit:
members: [elder, claimant, husband]
marital_units:
elder_unit:
members: [elder]
couple:
members: [claimant, husband]
households:
household:
members: [elder, claimant, husband]
state_code: FL
output:
is_ssi_ineligible_spouse: [false, false, true]
# $2,000 > $497, so income is deemed (416.1163(d)(2)). Couple countable
# income: ($600 - $20) + ($2,000 - $65) / 2 = $1,547.50; alone $580;
# deemed $967.50. $1,547.50 exceeds the $1,491 couple rate, so the
# claimant is ineligible on income.
ssi_income_deemed_from_ineligible_spouse: [0, 967.50, 0]
ssi: [114, 0, 0]
Loading
Loading