Skip to content

Apply SSI's general exclusion once under spousal deeming - #10837

Merged
MaxGhenis merged 16 commits into
mainfrom
fix-ssi-spousal-general-exclusion
Nov 14, 2026
Merged

MaxGhenis merged 16 commits into
mainfrom
fix-ssi-spousal-general-exclusion

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

This PR applies SSI's $20 general income exclusion once when a claimant receives in-kind support and an ineligible spouse has income. The model now counts that support in both countable-income budgets whose difference gives the deemed amount.

SSA combines the claimant's support with the couple's unearned income under POMS SI 01320.150 B.1.a. SSA then applies one exclusion under SI 01320.400 B.1.e, 20 CFR 416.1163(d)(2) and 416.1124(c)(12).

For example, in January 2026, a claimant receives shelter support at the $258.50 presumed maximum value and an ineligible spouse earns $2,000 monthly. Countable income comes to $1,206: ($258.50 − $20) + ($2,000 − $65) / 2. SSI falls from $295 to $285. The $662.67 individual-only limit remains above that payment.

The model counts the SSI payment as income for other programs, among them SNAP and Oklahoma's State Supplemental Payment, so this PR changes those benefits too. For example, in January 2026, an aged claimant receives shelter support and a 62-year-old spouse receives $700 monthly from Social Security. SSI falls from $572.50 to $552.50: $1,491 − ($258.50 + $700 − $20). The Oklahoma supplement for that couple rises from $21 to $40 because SSI falls by $20. Combined countable income of $1,491 falls $41 short of Oklahoma's $1,532 standard for an individual with an ineligible spouse, and Oklahoma caps the payment at $40 (OKDHS Appendix C-1, Schedule VIII.A).

This addresses the ISM finding in #10243. Its separate spouse-eligibility finding remains open.

Ineligible-parent test

is_ssi_ineligible_parent (#10630) adds a spouse's deemed income to a parent's own income and leaves in-kind support out of that own income. In-kind support depends on the living arrangement, and the living arrangement depends on is_ssi_ineligible_parent. If the test read the new monthly budgets, which count in-kind support, every SSI calculation would raise a cycle error. The test now computes the spouse's deemed amount with main's annual formula, without in-kind support, so its results match main's. It still takes a supplied, neutralized or abolished annual ssi_income_deemed_from_ineligible_spouse.

Invariants and validation

  • With baseline parameters and annual cash inputs, results without ISM match an independent calculation of main's formula within $0.01.
  • With nonnegative income, fixed ISM and active deeming, combined countable income never falls when any claimant or spouse income rises.
  • SSA reduces combined countable income by at most $20 monthly through the general exclusion.
  • SSI never exceeds the individual-only payment limit in 416.1163(e)(2).
  • Computed annual deemed income equals the sum of monthly budgets. Calculated annual aggregates cannot replace a month's budget, and supplied legacy annual inputs retain their units.
  • is_ssi_ineligible_parent reads the same incomes as on main, and main's 27 cases for it pass unchanged.
  • A supplied annual deemed amount decides is_ssi_ineligible_parent, including on a branch that supplies it after the simulation has calculated the test.

Pull request run 43624137892 at 1a83b5ce4d passed all 37 jobs on GitHub's merge with main 99d740496b.

test_ssi_spousal_ism_invariants.py checks the first five properties with generated vectorized households. It also checks that a branch override replaces cached monthly budgets and a cached ineligible-parent result, and that the input adapter honors dated abolition switches. The new monthly deemed-income YAML covers cash-income combinations, both sides of the $20 exclusion, and one-month support. Two new cases in is_ssi_ineligible_parent.yaml compute SSI for a parent with shelter support, an earning spouse and a disabled child, and for a parent whose supplied deemed amount fails the test. Case 16 in Oklahoma's ssp/integration.yaml now expects $552.50 of SSI, $1,491 of combined countable income and a $40 supplement.

Methodology choices

  • Preserve the existing annual public variable and add a derived monthly variable. Monthly readers use the monthly value; annual readers receive the sum. The new derived amount defaults to zero.
  • Reuse the annual-input adapter pattern from Limit SSI ineligible-child allocations to co-resident children and compute SSI and Medicaid deeming by month #10146 for supplied-input provenance, cache dependencies and neutralization. Preserve monthly abolition switches on the annual name as well.
  • Include claimant ISM in both budgets at the deeming PMV. SSA uses the regular individual PMV for the separate no-deeming limit under POMS SI 01320.150 B.1.b.
  • Treat spouse unearned-income cases as intended corrections when the claimant's cash unearned income leaves some general exclusion unused. Claimant cash unearned income of at least $20 preserves existing results.
  • Hold ISM and deeming status fixed for income monotonicity. The existing PMV changes when deeming begins; this PR preserves that threshold treatment.
  • Sum monthly budgets for annual totals, including dated reforms. Retain the existing annual allocation and deeming-status inputs. This change does not revise spouse eligibility, allocations or retrospective income timing.
  • Leave in-kind support out of both halves of the ineligible-parent income test, as main does. For example, a parent with no cash income receives shelter support all year and the spouse earns $36,700. The model counts $1,735.17 a month toward the parent's SSI, above the $1,491 couple rate, and pays the parent nothing. The parent test counts ($36,700 − $240 − $780) / 2 = $17,840 a year, within $17,892, so the model treats the parent as eligible and deems nothing to a disabled child. Under 20 CFR 416.1166(e)(2), SSA deems the spouse's remaining income to the child when the parent does not qualify. Main has the same gap.
  • Follow the agreeing regulation and SSA instructions. No source conflict requires a register entry.

State readers and merge coordination

Monthly readers include SSI countable income, the individual-only limit, the shared supplement helper, California CAPI, Kentucky SSP, Maryland imputed SSI and Texas supplement eligibility.

Three other formulas on main read the annual name. Maryland's PAA countable income and Medicaid's medically needy spouse adjustment (#10640) still read it and receive the sum of the monthly budgets. is_ssi_ineligible_parent (#10630) computes its own amount without in-kind support.

Where a state budgets a couple together, the medically needy adjustment swaps SSI's deemed amount for its own, which leaves out in-kind support. Those budgets keep main's values, so they still apply a second $20 exclusion when the claimant's cash unearned income leaves some of the first unused. #10935 tracks that second exclusion. A couple split by a facility counts no spouse income, and other states read ssi_countable_income unadjusted, so both apply one exclusion.

The shared helper serves California, Iowa, Montana, Nevada, New Jersey, New York, Pennsylvania, Rhode Island and Vermont. Colorado uses separate deeming calculations and still offsets supplements by federal SSI.

Coordinate overlapping work in #10146, #10532 and #10382. Retain this ISM addition when incorporating #10146's broader monthly deeming changes. #10809 changes adjacent California and Maryland ISM readers.

Microsimulation impact

We estimate that this branch changes no SSI or state supplement payment in 2026 on the default dataset: SSI totals $56.68bn on both sides, and no record's SSI changes by a cent. Countable income and income deemed from an ineligible spouse move by at most $0.19 per person over the year. The default dataset gives $0 of California's CAPI and of Kentucky's, Maryland's and Texas's supplements on both sides. We compared main at f926615321 with this branch at 1a83b5ce4d.

Output Main total Change Records changed (weighted)
ssi $56.68bn $0 0 (0)
ssi_countable_income $4,304.1bn +$2,324 373 (787,024)
ssi_income_deemed_from_ineligible_spouse $402.5bn +$868 1,239 (2,562,266)
ca_capi $0 $0 0 (0)
ky_ssp $0 $0 0 (0)
md_paa $0 $0 0 (0)
tx_ssi_state_supplement $0 $0 0 (0)
state_income_tax $576.5bn $0 0 (0)
income_tax $2,594.9bn $0 0 (0)
household_benefits $2,060.2bn -$3 0 (0)
household_net_income $17,246.8bn +$22 0 (0)

Axiom parity

axiom: TheAxiomFoundation/rulespec-us#2240 queued (20 CFR 416.1163(d)(2), with POMS SI 01320.150 B.1.a and SI 01320.400 B.1.e: one $20 general exclusion across the couple's unearned income, the claimant's in-kind support included; the pinned corpus release lacks 20 CFR part 416)

🤖 Generated with Claude Code

MaxGhenis and others added 15 commits November 12, 2026 00:58
Include claimant support in both countable-income budgets and retain monthly amounts without changing supplied annual units.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cover cash-income combinations, exclusion boundaries, annual sums, and legacy annual overrides with YAML and generated API checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Honor switches on the annual variable when monthly readers request a later month.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Test parameter lookup dates without constructing another full policy system.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep the individual-only expected payments and show the corrected couple computation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
End the support status in August so the annual test counts one month of support.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Check that a cached branch honors a supplied zero without changing the parent budget.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Supply the monthly variable to the existing direct-formula checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ineligible-parent test from main read the annual spousal deemed
amount, and that amount now sums monthly budgets that count the
claimant's in-kind support. Support depends on the living arrangement,
which reads the ineligible-parent test, so every SSI calculation raised
a CycleError after the merge.

The test now computes the spouse's deemed amount without in-kind
support, as it already does the parent's own income, and still takes a
supplied, neutralized or abolished annual amount. Two cases cover a
parent with shelter support and a parent whose supplied deemed amount
decides the test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Core 3.33.0 and later define the holder's store record, and the package
requires Core 3.33.1 or later, so the hasattr fallback never ran. The
adapter test's holder double now carries the method.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A branch can supply annual deemed income after the simulation has
already tested the parent. The branch then drops that result and tests
the parent on the supplied amount. YAML supplies its inputs before any
calculation, so a Python test covers this.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review November 14, 2026 16:40
SSA adds the claimant's in-kind support to the ineligible spouse's
income and applies one $20 exclusion (POMS SI 01320.150 B.1.a and
SI 01320.400 B.1.e; 20 CFR 416.1163(d)(2)). In Case 16, SSI falls from
$572.50 to $552.50: 1,491 - (258.50 + 700 - 20). Oklahoma's combined
countable income falls from $1,511 to $1,491, and the supplement rises
from $21 to $40: min(1,532 - 1,491, 40).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10837 at 1a83b5ce4dd4c9e01cda9b3137fcc4cb8d30e9cb (squash): Apply SSI's general exclusion once under spousal deeming.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis deleted the fix-ssi-spousal-general-exclusion branch November 14, 2026 20:55
MaxGhenis added a commit that referenced this pull request Nov 14, 2026
Since #10837, ssi_income_deemed_from_ineligible_spouse_monthly holds each
month's income deemed from an ineligible spouse, with the claimant's
in-kind support in both budgets, and SSI's monthly readers read it.
md_paa_countable_income becomes monthly on this branch, so it reads that
month's amount too. It no longer takes one-twelfth of the year's deemed
income.

A new case gives the claimant shelter support in July alone and checks
January, July and the year.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 14, 2026
Resolve ten conflicts with #10837, which applies SSI's $20 general
exclusion once when a claimant with in-kind support has income deemed
from an ineligible spouse:

- Compute each month's deemed amount from that month's deeming status and
  the spouse's income after that month's child allocations, and count the
  claimant's in-kind support in both budgets, as #10837 does.
- Keep ssi_countable_income as the annual sum. Read the month's budget in
  the individual-only limit, the state supplement helper and Texas
  supplement eligibility.
- Take main's annual-input adapter, which honors dated abolition switches.
- Compute the ineligible-parent test's deemed amount without in-kind
  support, as main does, and apply the year's deeming comparison to that
  amount and to the benefit rate.
- Return the annual deeming flag as an array when a reform abolishes it.
- Keep every is_ssi_ineligible_parent case from both sides, main's first,
  and add Cases 32 and 33.
- Assert main's new month cases on the monthly variables.
- Recompute Oklahoma Case 22 with one exclusion: 52.50 of SSI, 1,491 of
  combined countable income and a 40 supplement.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant