Repository navigation
Description
When a person on SSI lives with a spouse who isn't eligible, the model counts their income in two parts. In ssi_countable_income it takes the student earned income exclusion off the person's own earnings. It then adds the income it deems from the spouse, which it computes in ssi_income_deemed_from_ineligible_spouse as the couple's countable income less the person's countable income alone. The model builds both of those budgets from ssi_earned_income, before the student exclusion. It therefore spends part or all of the $20 and $65 exclusions on a working student's own earnings in both budgets, and leaves that much less for the spouse's earnings.
For example, a 20-year-old full-time student in Texas who meets SSI's disability criteria earns $800 a month in 2026. They live with their 25-year-old spouse, who isn't disabled and earns $1,500 a month. SSA excludes all $800 of the student's wages, within its 2026 limits of $2,410 a month and $9,730 a year. The spouse's $1,500 exceeds the $497 gap between the couple and individual rates, so SSA treats the two as an eligible couple:
| SSA, under 416.1163(d)(2) | The model | |
|---|---|---|
| Student's own countable income | $0 | $0 |
| Student's countable income alone, inside the deemed amount | none | ($800 − $85) / 2 = $357.50 |
| Couple's countable income | ($1,500 − $85) / 2 = $707.50 | ($2,300 − $85) / 2 = $1,107.50 |
| Countable income | $707.50 | $0 + $1,107.50 − $357.50 = $750 |
| SSI, from the $1,491 couple rate | $783.50 | $741 |
Both amounts stay below the $994 the student would get without deeming, so SSA pays $783.50 a month and the model pays $741. Over 2026 the model pays $8,892, against $9,402 from SSA. With no wages at all, the student gets $783.50 from the model, so the model takes $42.50 a month for $800 of wages that SSA excludes in full.
The model can only overstate countable income this way, and by at most $42.50 a month, half of the $85. For a student with no unearned income who earns between $85 and $810 a month in 2026, SSA excludes all of the earnings. Whenever the model deems income to such a student from a spouse who earns more than $85 a month, it overstates their countable income by the full $42.50. The model miscounts income only for blind or disabled people under 22 who attend school, work and live with a spouse who isn't eligible and whose income exceeds $497 a month after any allocation for children. It also reads ssi_income_deemed_from_ineligible_spouse in SSI's ineligible-parent test, the shared state supplement code, California's CAPI, Kentucky's and Maryland's state supplements, Texas's state supplement eligibility and Medicaid's medically needy spouse income.
SSA builds no such pair of budgets for a child. It adds the parents' deemed income to the child's unearned income under 416.1165(e)(1), and the model takes the exclusion off the child's own earnings.
What the regulations and SSA say
- In 20 CFR 416.1163(d)(2), SSA combines the spouse's remaining income with the eligible person's own, applies "all appropriate income exclusions in §§ 416.1112 and 416.1124", and subtracts the couple's countable income from the couple rate.
- In 416.1112(a), SSA applies the earned income exclusions "in the order listed in paragraph (c)". SSA lists the student exclusion in (c)(3), ahead of the unused part of the $20 in (c)(4), the $65 in (c)(5) and the one-half in (c)(7). SSA gives it to anyone "under age 22 and a student who is regularly attending school", with no condition on marriage.
- In POMS SI 00820.510, SSA gives an eligible student under 22 the exclusion "regardless of marital or head of household status" (section C) and applies it "only to a students own earned income" (B.5). SSA sets the 2026 limits there at $2,410 a month and $9,730 a year.
- Under 416.1163(e)(2), SSA pays the lesser of the couple computation and the individual rate less the person's own countable income. SSA lists 2026 rates of $994 for an individual and $1,491 for a couple in POMS SI 02001.020.
In the code
- In
ssi_countable_income.pyL36-L43, the model takesssi_blind_or_disabled_working_student_exclusionoff the person's earnings. In L86-L95 it addsssi_income_deemed_from_ineligible_spousewhen the couple computation doesn't apply. - In
ssi_income_deemed_from_ineligible_spouse.pyL39-L58, the model buildsalone_countableandcouple_countablefromssi_earned_incomeand deems the difference. - In
uncapped_ssi_without_spousal_deeming.pyL39-L43 and L62-L66, the model keeps the exclusion in the 416.1163(e)(2) limit, so its $994 in the example matches SSA's.
Reproduction
Script and output at 8b2fba3
from policyengine_us import Simulation
def situation(student_wages):
return {
"people": {
"student": {
"age": {"2026": 20},
"meets_ssi_disability_criteria": {"2026": True},
"is_full_time_student": {"2026": True},
"employment_income": {"2026": student_wages},
},
"spouse": {
"age": {"2026": 25},
"employment_income": {"2026": 18_000},
},
},
"tax_units": {"tax_unit": {"members": ["student", "spouse"]}},
"marital_units": {"marital_unit": {"members": ["student", "spouse"]}},
"spm_units": {"spm_unit": {"members": ["student", "spouse"]}},
"families": {"family": {"members": ["student", "spouse"]}},
"households": {
"household": {
"members": ["student", "spouse"],
"state_code": {"2026": "TX"},
}
},
}
VARIABLES = [
("ssi_earned_income", "2026", 12),
("ssi_blind_or_disabled_working_student_exclusion", "2026", 12),
("is_ssi_spousal_deeming_applies", "2026", None),
("ssi_income_deemed_from_ineligible_spouse", "2026", 12),
("ssi_in_kind_support_and_maintenance", "2026-01", 1),
("ssi_countable_income", "2026-01", 1),
("uncapped_ssi", "2026-01", 1),
("uncapped_ssi_without_spousal_deeming", "2026-01", 1),
("ssi", "2026-01", 1),
("ssi", "2026", 1),
]
for label, wages in [("A: student earns $800/month", 9_600), ("B: student earns nothing", 0)]:
sim = Simulation(situation=situation(wages))
print(f"== {label}")
for name, period, per_month in VARIABLES:
value = sim.calculate(name, period)
if per_month in (None, 1):
shown = value
unit = "" if per_month is None else ("" if period == "2026" else " (month)")
else:
shown = value / per_month
unit = " (annual/12)"
print(f" {name} {period}{unit}: student={shown[0]}, spouse={shown[1]}")== A: student earns $800/month
ssi_earned_income 2026 (annual/12): student=800.0, spouse=1500.0
ssi_blind_or_disabled_working_student_exclusion 2026 (annual/12): student=800.0, spouse=0.0
is_ssi_spousal_deeming_applies 2026: student=True, spouse=False
ssi_income_deemed_from_ineligible_spouse 2026 (annual/12): student=750.0, spouse=0.0
ssi_in_kind_support_and_maintenance 2026-01 (month): student=0.0, spouse=0.0
ssi_countable_income 2026-01 (month): student=750.0, spouse=0.0
uncapped_ssi 2026-01 (month): student=741.0, spouse=0.0
uncapped_ssi_without_spousal_deeming 2026-01 (month): student=994.0, spouse=0.0
ssi 2026-01 (month): student=741.0, spouse=0.0
ssi 2026: student=8892.0, spouse=0.0
== B: student earns nothing
ssi_earned_income 2026 (annual/12): student=0.0, spouse=1500.0
ssi_blind_or_disabled_working_student_exclusion 2026 (annual/12): student=0.0, spouse=0.0
is_ssi_spousal_deeming_applies 2026: student=True, spouse=False
ssi_income_deemed_from_ineligible_spouse 2026 (annual/12): student=707.5, spouse=0.0
ssi_in_kind_support_and_maintenance 2026-01 (month): student=0.0, spouse=0.0
ssi_countable_income 2026-01 (month): student=707.5, spouse=0.0
uncapped_ssi 2026-01 (month): student=783.5, spouse=0.0
uncapped_ssi_without_spousal_deeming 2026-01 (month): student=994.0, spouse=0.0
ssi 2026-01 (month): student=783.5, spouse=0.0
ssi 2026: student=9402.0, spouse=0.0
A possible fix
In ssi_income_deemed_from_ineligible_spouse, take the person's ssi_blind_or_disabled_working_student_exclusion off individual_earned, floored at zero, before both _apply_ssi_exclusions calls. The model then starts the alone budget from the same earnings as the personal budget in ssi_countable_income, and applies the student exclusion in the couple budget before the $20, $65 and one-half, in SSA's order under 416.1112(a). In open PR #10837 we move this computation into _deemed_income_without_ism.py and a new monthly variable, both still built on ssi_earned_income, so the same change belongs there.
Related
- SSI spousal deeming does not exclude an ineligible spouse's student earned income (20 CFR 416.1161(a)(27)) #10521: the model takes no student exclusion off an ineligible spouse's own earnings (416.1161(a)(27)).
- SSI couple computation halves a student spouse's earned income exclusion (20 CFR 416.1112(c)(3)) #10456: for two eligible spouses, the model halves a student spouse's exclusion. It also spreads the yearly limit evenly over the year, which changes nothing here because $9,600 of wages stays under the $9,730 limit.
- In Deem SSI parental income from the child's co-resident parents, not the tax unit #10159 we stop the model from taking a child's exclusion off the parents' earnings in parental deeming.
Activity