Skip to content

Count income of aged, blind, or disabled people who fail SSI's noncitizen test - #10240

Merged
hua7450 merged 39 commits into
mainfrom
medicaid-abd-noncitizen-countable-income
Nov 2, 2026
Merged

hua7450 merged 39 commits into
mainfrom
medicaid-abd-noncitizen-countable-income

Conversation

@hua7450

@hua7450 hua7450 commented Oct 15, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

medicaid_optional_senior_or_disabled_countable_income and ssi_countable_income returned $0 for anyone who was not is_ssi_eligible_individual or is_ssi_eligible_spouse. is_ssi_eligible_individual includes SSI's citizen and qualified-noncitizen test, including the 40-quarter rule for lawful permanent residents. An aged, blind, or disabled person who failed only that test therefore had all income ignored by every program that reuses SSI methodology.

Examples on main (2025):

Household main This PR
MA, age 70, LPR, 10 years since entry, 20 SSI quarters, $60,000 pension countable income $0, is_medicaid_eligible true $59,760, ineligible (same as with 40 quarters)
DC, age 70, undocumented, $60,000 pension countable income $0, eligible $59,760, ineligible
CA, age 68, TPS, $24,000 pension (SF CAAP Case 15) CAPI paid regardless of income CAPI $0

Fix

The zero was meant for the deeming role: a spouse who is not aged, blind, or disabled has their income deemed to the other spouse (20 CFR 416.1163), so their own countable income must be zero to avoid counting it twice. This PR gates that zero on is_ssi_aged_blind_disabled instead of SSI eligibility status:

  • medicaid_optional_senior_or_disabled_countable_income: Medicaid's ABD financial methodology follows SSI's (42 CFR 435.601) and counts the applicant's own income whether or not they meet SSI's noncitizen rules.
  • ssi_countable_income: the medically needy path (is_medically_needy_for_medicaid) reads this variable, so it had the same bypass.
  • defined_for on is_ssi_spousal_deeming_applies, ssi_income_deemed_from_ineligible_spouse and medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse moves from is_ssi_eligible_individual to is_ssi_aged_blind_disabled. Without this, a noncitizen married to a working spouse who is not aged, blind, or disabled would have the spouse's income ignored.

For citizens and qualified noncitizens nothing changes: the old and new gates differ only for aged, blind, or disabled people who fail SSI's noncitizen test. This PR does not touch any income limit or limit parameter.

Downstream effects

  • SSI: unchanged. uncapped_ssi is defined_for = "is_ssi_eligible", which still applies the noncitizen test. ssi_amount_if_eligible and ssi_pmv_amount change for this group, but ssi does not. New SSI-based supplements on main (the shared _ssi_state_supplement helper for Ohio, Oklahoma and New Jersey, and Maryland MEAP) gate on SSI eligibility or receipt and are unchanged.
  • Medicaid: optional ABD, medically needy, 209(b) spenddown and the MS Healthier Mississippi Waiver now count the income of these noncitizens.
  • CA CAPI: CAPI serves exactly this population, so on main its income test never reduces the benefit. With this PR it counts income; Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming #10379 makes CAPI's standard, couples and deeming match the law first.
  • CA state supplement: the countable income of a member who fails SSI's citizen or qualified-noncitizen test is left out of the supplement's SPM-unit income sum. SSI/SSP counts another member's income only when it is deemed (20 CFR 416.1160(a)), so a sibling's or a CAPI couple's income no longer reduces the supplement (Cases 10, 12 and 13). In an SSI couple computation with a spouse who fails the test, SSA treats that spouse as an ineligible spouse. If the spouse can receive CAPI (ca_capi_eligible_person; WIC 18938 bars undocumented people and TPS holders, Exclude undocumented and TPS immigrants from California CAPI eligibility (WIC 18938, MPP 49-020) #10482) and does, none of the CAPI-counted income is deemed (20 CFR 416.1161(a)(2)-(3)), so the supplement counts the recipient's own countable income rather than half of the couple's. If the spouse's income leaves no CAPI, it is deemed and the supplement is the lesser of the individual and couple totals (Case 15). POMS SI 01320.430 D compares the federal and state parts separately; the totals keep CAPI at zero there, so only the split between the supplement and CAPI can differ. A spouse who cannot receive CAPI gets no exclusion, so that spouse's income is deemed (Case 16). This gives SSA's totals in Cases 11, 14 and 15 and in Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming #10379's Cases 8 and 9, where the citizen's own income leaves no supplement and CAPI deems. The model's SSI is still the couple computation (Treat an aged, blind or disabled spouse who fails SSI's noncitizen test as an ineligible spouse, and base CAPI's mixed couple on actual SSI/SSP receipt #10481).
  • Maryland PAA: for people who fail SSI's citizen or qualified-noncitizen test, PAA imputes no federal SSI and counts only their own income (COMAR 07.03.07.07, 07.03.07.09A), and no spouse income is deemed to them. A person who reports SSI receipt (receives_ssi, for example under an exception the model does not encode) gets the SSI that SSA pays: the individual rate for the living arrangement less own income, and under spouse deeming the lesser of that and the couple computation (20 CFR 416.1163(d)-(e)). In another person's household the one-third reduction applies to the couple rate as well as the individual rate (20 CFR 416.1131; POMS SI 01320.400 B.1.e), and a medical treatment facility resident gets the $30 rate. Their PAA is unchanged from main ($511 a month in the test cases with and without a working spouse). Unchanged for citizens and qualified noncitizens.
  • Other SSI-methodology readers for noncitizens who fail the SSI test: MSP spousal deeming and SC SSP now see the person's income. CA WDP's intermediate deeming flags change, but WDP eligibility does not, because WDP applies SSI's noncitizen test itself. CO OAP reads the deeming flag only through ssi_in_kind_support_and_maintenance, for SSI reporters. CA San Bernardino and Orange County general relief read whether ca_capi > 0. CO SSP (clients outside an SSI couple computation), Idaho AABD, NE AABD, TX SSP, and Indiana RCAP and SAPN read ssi_countable_income but require SSI receipt (ssi > 0 or receives_ssi; Indiana RCAP also admits Medicaid enrollment, and SAPN requires both). They change only for a person who reports SSI receipt while failing the model's noncitizen test: that person's own countable income now reduces the payment. Indiana RCAP also admits Medicaid-enrolled noncitizens, whose payment can fall (in one review example from $1,501.06 to $1,021.06 a month). No YAML or partner case has such a person.

Merge order and overlaps

Tests

Regression cases in the variable-named files:

  • medicaid_optional_senior_or_disabled_countable_income.yaml: single LPR with 20 quarters; mixed couple with deemed spouse wages
  • medicaid_optional_senior_or_disabled_income_deemed_from_ineligible_spouse.yaml: mixed couple
  • ssi_countable_income.yaml: single LPR (SSI stays $0); mixed couple
  • ssi_income_deemed_from_ineligible_spouse.yaml: deeming applies to the noncitizen spouse
  • is_medically_needy_for_medicaid.yaml: an over-limit case, a case that qualifies after spenddown, and a noncitizen dependent parent's pension that does not count against the head
  • is_medicaid_eligible.yaml Cases 21-23: the MA and DC examples above, plus a low-income LPR who stays eligible
  • ca_capi.yaml: an aged LPR without 40 quarters whose $24,000 pension leaves no CAPI; a mixed couple with income whose CAPI the model now computes ($479.76 a month in 2025)
  • ca_capi_person.yaml Cases 16 and 17: Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming #10379's Cases 8 and 9 with the CAPI member as tax-unit head; the supplement counts the citizen's own income, so the citizen is paid nothing and CAPI deems ($239.94 and $118.83 a month); Case 18: a spouse who is not aged, blind or disabled earns $2,000 a month, above the deeming threshold, so CAPI is $773.44
  • msp_countable_income.yaml Case 20: spouse wages are deemed to a permanent resident without 40 quarters; SC OSS integration.yaml Case 8: a counted pension above the net income limit
  • ca_state_supplement.yaml Case 10: an aged citizen SSI recipient sharing an SPM unit with a CAPI-eligible sibling keeps the citizen-alone supplement ($368.81 a month in 2025); Case 11: an aged citizen married to a CAPI-eligible spouse, the citizen's own income counted ($620.81 a month); Case 12: an undocumented sibling who is not CAPI-eligible does not reduce the supplement; Case 13: nor does a married CAPI couple in the unit; Case 14: a mixed couple where both have income ($453.94 supplement, $64.89 CAPI); Case 15: a CAPI spouse whose $2,000 pension leaves no CAPI, so it is deemed ($118.83 supplement); Case 16: an undocumented spouse who cannot receive CAPI, whose $700 pension is deemed ($488.44 supplement)
  • md_paa.yaml Case 11: an aged LPR without 40 quarters in CARE Home Level D with a working spouse gets $998 a month ($1,478 need less the person's own $480); Case 12: the same person reporting SSI receipt, with no spouse, gets the imputed SSI ($967 − $480 = $487; PAA $511); Case 13: with a working spouse, SSA pays min($1,450 − $947.50, $967 − $480) = $487, so PAA stays $511; Cases 14-16: the couple computation binds ($2.50 imputed), the one-third reduction on the couple rate ($509.17), and the $30 medical-facility rate
  • The CAPI-eligible personas in the CAPI and California supplement cases are aged permanent residents with 39 quarters, who stay eligible once Exclude undocumented and TPS immigrants from California CAPI eligibility (WIC 18938, MPP 49-020) #10482 excludes undocumented people and TPS holders from CAPI.
  • CAPI tests from Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming #10379: the pinned ssi_countable_income and deeming inputs this PR now computes are removed where the case has the underlying income; the remaining pins say they isolate the CAPI formula

ca_sf_caap.yaml Case 15 is updated to the expectations its own comment predicted once CAPI counted income (budget unit size 2, countable income $2,000, grant $0).

No partner contract test (tests/policy/baseline/partners/**) is affected. I did not run the tests locally; CI will validate them.

Local reviews

The 2026-10-19 review found six critical downstream defects that the old $0 had masked; a second review on 2026-10-26 checked the fixes and the main merge.

Finding Disposition
CA state supplement subtracts a CAPI-eligible relative's income from an SSI recipient's supplement Fixed here (ca_state_supplement.py)
Maryland PAA deems spouse income and imputes SSI to people SSI bars Fixed here; people who report SSI receipt get the SSI SSA pays (capped under deeming) and no spouse deeming (COMAR counts own income)
Medically needy test sums income over the tax unit Fixed in #10370, which must merge first
CAPI standard leaves out the state supplement portion #10379
CAPI applies the couple rate under deeming without the 416.1163(e)(2) cap #10379 (POMS SI 01320.430)
CAPI pools income across unmarried members of the SPM unit #10379 (per-person CAPI)
#10146 port list incomplete Listed above
CO OAP and CA WDP claims overstated Corrected above
Mixed-couple supplement case missing Added (Case 11)

Review round 1 (2026-10-27)

Item Disposition
C1 MD PAA: no one-third reduction on the couple rate Fixed; Cases 15 and 16
SA1 medically needy tax-unit sum Resolved by #10370 (on main, merged here); Case 13
SA2 state supplement masked by CAPI eligibility Mask on SSI's noncitizen test, plus, in a mixed SSI couple computation, the citizen's own income when the spouse receives CAPI and deeming when not (see above), so #10379's unpaid-spouse deeming (its C1) still applies; Cases 11-15
SA3 MSP and MD deeming cap untested MSP Case 6 (now Case 20, after #10360's cases), MD Case 14, SC Case 8
G1 MD PAA comment Fixed; #10544 for the citizen case
G2 Case 11 benchmark NOTE and body use the public income-maintenance exclusion; #10481 updated
G3 parent deeming Known limitations; #10243 extended
G4, G5, G6 body Updated
G7 shared immigration test KY: SSI's gate kept with a NOTE (aligning it broke KY Case 5, which supplies SSI eligibility); a shared variable across about a dozen files is left for a follow-up
SC OSS immigration test #10545
#10379 review round 2: G10 role-swapped twins and Case 13's above-threshold twin ca_capi_person.yaml Cases 16-18

Review round 2 (2026-10-30)

Item Disposition
SA4 the mixed-couple branch assumed a spouse who fails the test can receive CAPI Fixed: keyed on the spouse's ca_capi_eligible_person; ca_state_supplement.yaml Case 16
G8 cite 416.1161 and 416.2025 Added to ca_state_supplement's references
#10379's G12 (in-kind support on the separated path) Tracked in #10549
Merge with #10519 and #10546 (2026-10-30) ca_capi.yaml Case 5 takes #10519's $14,807.28 (cooking facilities by default); ca_capi.yaml Case 10 and ca_state_supplement.yaml Cases 10-13 set living_arrangements_allow_for_food_preparation: false, keeping their no-cooking values

Known limitations (not changed here)

axiom: TheAxiomFoundation/rulespec-us#1940 queued

🤖 Generated with Claude Code

medicaid_optional_senior_or_disabled_countable_income and
ssi_countable_income zeroed income for anyone who was not an SSI-eligible
individual or spouse, and that status includes SSI's citizen and
qualified-noncitizen test. Aged, blind, or disabled people who fail only
that test (for example, LPRs with fewer than 40 quarters, or undocumented
residents of states that cover them) therefore passed the optional ABD and
medically needy Medicaid income tests, and CAPI, regardless of income.

Gate the zero, and the spousal-deeming variables, on aged, blind, or
disabled status instead. The zero still applies to a spouse who is not
aged, blind, or disabled, whose income is deemed to the other spouse.
SSI benefits are unchanged because is_ssi_eligible still applies the
noncitizen test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 and others added 2 commits October 21, 2026 18:22
…n status

Counting the own income of aged, blind or disabled people who fail SSI's
noncitizen test exposed two downstream defects found in the 2026-10-19
review:

- The California state supplement summed ssi_countable_income over the whole
  SPM unit, so a CAPI-eligible relative's income reduced an SSI recipient's
  supplement. CAPI budgets its own members' income (MPP 49-035), and SSI/SSP
  counts another member's income only when it is deemed (20 CFR
  416.1160(a)), so CAPI-eligible members are left out of the sum.
- Maryland PAA deemed spouse income and imputed federal SSI to people SSA
  cannot pay. For people who fail SSI's citizen or qualified-noncitizen
  test, PAA now counts only their own income and imputes no SSI (COMAR
  07.03.07.07 and 07.03.07.09A).

The CAPI test that encoded the federal-benefit-only standard is replaced
with an over-income case that holds before and after the CAPI rework.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CAPI payment standards equal the SSI/SSP payment standards less $10 for an
individual and $20 for a couple (MPP 49-050.1, .11-.13). The model instead
used the federal benefit rate plus the SPM unit's state supplement
payment, pooled every CAPI-eligible member's income against one unit
standard, applied the $10/$20 offset once a year, and left the tax-unit
spouse of a noncitizen couple out.

- ca_capi_payment_standard: the SSI/SSP standard for an individual, or half
  the couple standard, built from the state supplement parameters, less the
  monthly offset.
- ca_capi_person: the standard less the person's own countable income
  (MPP 49-055.3), with spouse-to-spouse deeming computed as POMS SI
  01320.430 D prescribes (federal and state parts each the lesser of the
  individual and deeming amounts).
- ca_capi sums ca_capi_person; ca_capi_income_eligible asks whether any
  member's income is below their standard (MPP 49-035.1).
- Both members of a noncitizen couple, and the noncitizen spouse of a
  citizen, are CAPI-eligible (MPP 49-055.4, 49-050.13).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 and others added 2 commits October 26, 2026 16:24
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 and others added 3 commits October 26, 2026 21:04
…uples, one standard per arrangement

- Offsets are $0 from June 1, 2019 (WIC 18941; ACIN I-23-19); new mixed-couple offset (MPP 49-050.13) before then
- Mixed couple: couple standard less the couple's countable income and the spouse's SSI/SSP (MPP 49-005(e)(3), 49-035.221)
- Title XIX facility $62 and non-medical out-of-home care $1,626.07 replace the community standard; no-cooking allowance only on the aged or disabled amount
- Floor the standards at the federal benefit rate while the CA SSP parameters hold 1991 totals (issue 7787)
- No deeming for a Title XIX facility resident (20 CFR 416.1160(a)(1))
- candidates.yaml: us-ca:capi-payment-standard-offset (open, Pavel's sign-off) and us-ca:capi-spousal-deeming-method (unreviewed)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…countable-income

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml
hua7450 and others added 3 commits October 26, 2026 21:39
…tests, CAPI test pins

- Maryland PAA keeps imputed SSI and spouse deeming for people who report SSI receipt
- CA state supplement: mixed-couple case and the matching computed CAPI case; comment and reference fixes
- CAPI tests from #10379: drop pins this PR now computes, keep the rest with accurate comments

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…alien status

COMAR 07.03.07.07 counts the individual's own income; only the imputed SSI keeps the receipt exception. Drop md_paa.yaml Case 13, which codified the deeming.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 and others added 3 commits October 26, 2026 22:52
…-2025 floor a stopgap; LPR test personas

- One-blind couple rate adds no food allowance (WIC 12200(b), (e)); candidates item us-ca:ssp-blind-couple-food-allowance (unreviewed)
- Floor comment and pinned pre-2025 cases say the values are known-low; issue 10480 backfills the totals
- Mixed-couple note gives the ineligible-spouse example (issue 10481)
- CAPI test personas are aged permanent residents with 39 quarters (issue 10482)
- PDF page comments without spaces

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…barred SSI reporters in Maryland PAA

- Resolve the CAPI test conflicts with this branch's versions and switch their personas to permanent residents with 39 quarters
- md_paa_imputed_federal_ssi: for a person who fails SSI's noncitizen test but reports SSI, impute the individual rate for the arrangement, or under deeming the lesser of the couple and individual computations (20 CFR 416.1163(d)-(e)); md_paa.yaml Case 13 gives $511
- CA state supplement Case 11 and the CAPI mixed-couple case use a permanent resident with 39 quarters

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 marked this pull request as ready for review October 27, 2026 02:56
hua7450 and others added 5 commits October 29, 2026 15:18
…es CAPI; otherwise deem

The 416.1161(a)(2)-(3) exclusion covers income counted for a CAPI payment the spouse receives. When the spouse's income leaves no CAPI, it is deemed and the supplement is the lesser of the individual and couple computations (416.1163). The spouse test uses the tax-unit head or spouse. Case 15.

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>
…als; cite POMS SI 01320.430 D

The CAPI-receipt branch always equalled the deemed lesser-of, so it is dropped; results are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450

hua7450 commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Reply to review 5675568106. All items are addressed at head e3b765b1ce. That head merges #10379 at 27d605fa4d, which brings main with #10370; the fixes are in 91898a0659, 59a97d8c96, c4542119b5, f4e10a9d7a and c065a35bee. Line numbers are at that head.

Paths: V/ = policyengine_us/variables/gov/, T/ = policyengine_us/tests/policy/baseline/gov/.

Item Status Where
C1 MD PAA: no one-third reduction on the couple rate Fixed, your code; POMS SI 01320.400 added to the references V/states/md/dhs/fia/paa/md_paa_imputed_federal_ssi.py:47-60; T/states/md/dhs/fia/paa/md_paa.yaml Cases 15 (:397, 509.17 / 968.83) and 16 (:440, 30 / 72)
SA1 medically needy tax-unit sum Resolved: #10370 is on main and merged here. Your case is Case 13, after #10370's Cases 3-10 and this PR's former Cases 3-4 (now 11-12). T/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml:372
SA2 state supplement masked by CAPI eligibility Fixed, with one change (below): your immigration-test mask, plus the citizen's own income in a mixed SSI couple computation V/states/ca/cdss/state_supplement/ca_state_supplement.py:27-88; T/states/ca/cdss/state_supplement/ca_state_supplement.yaml Cases 11-15 (:424, :469, :513, :560, :594); T/states/ca/cdss/capi/ca_capi.yaml Case 10 (:246)
SA3 MSP and MD deeming cap Added MSP Case 6, MD Case 14 and the optional SC Case 8 T/hhs/medicare/savings_programs/income/msp_countable_income.yaml:117; md_paa.yaml:356; T/states/sc/scdhhs/ssi_state_supplement/integration.yaml:203
G1 MD PAA comment Done, your text. Issue for the citizen case: #10544 ($28 vs $511) V/states/md/dhs/fia/paa/md_paa_countable_income.py:48-54
G2 Case 11 benchmark Done: the NOTE and the body use the public income-maintenance exclusion ($855.81). #10481 is updated (comment). ca_state_supplement.yaml:413-424; ca_capi.yaml Case 10
G3 parent-to-child deeming Done: added to Known limitations, and #10243 extended (comment) PR body
G4 body Done: the --ours step names #10379's head 27d605fa4d, #10364 is 45120fa173, and the downstream list now covers IN RCAP, NE AABD, TX SSP, SBD and OC General Relief, CO OAP through ISM, and ssi_amount_if_eligible / ssi_pmv_amount PR body
G5 #10332 Done in the merge section PR body
G6 #10379 fragment Noted in the merge section: delete changelog.d/ca-capi-ssi-ssp-standard.fixed.md here after #10379 lands, if it is still present PR body
G7 shared test; KY Partly. KY keeps SSI's gate with a NOTE. Aligning the gate broke ky_ssp_countable_income.yaml Case 5, which supplies is_ssi_eligible_individual and no age. A shared immigration-test variable would touch about a dozen files, so I left it for a follow-up. V/states/ky/dcbs/ssp/ky_ssp_countable_income.py:40-42
Out of scope: SC OSS immigration test Issue #10545 —

The SA2 change. Your mask leaves out the CAPI spouse's half of a couple's income, but in the model the citizen's own ssi_countable_income is only the other half. Combined with #10379's C1 (CAPI deems from a spouse paid no SSI or supplement), this goes wrong in #10379's ca_capi_person.yaml Case 8: a citizen with $1,600 of Social Security and a CAPI spouse with none.

  • The mask pays the citizen a supplement of 1,233.94 − 790 = $443.94. That counts as a paid spouse, so CAPI stays on the mixed path, and the couple gets $518.83 against the law's $239.94.

So for a citizen in an SSI couple computation with a spouse who fails the test (ca_state_supplement.py:37-84), SSA treats the spouse as ineligible (20 CFR 416.1160(d)):

  • If the spouse receives CAPI, none of the CAPI-counted income is deemed (416.1161(a)(2)-(3)), so the supplement counts the citizen's own countable income, with SSI's exclusions applied to it.
  • If the spouse's own income leaves no CAPI, the income is deemed (416.1163, 416.2025(b)(3)).

The code takes max(own income, couple income − (couple standard − individual standard)). That is the lesser of the individual and couple totals, which equals own income whenever the spouse would receive CAPI. POMS SI 01320.430 D takes the lesser of each part separately. Using totals keeps CAPI at zero when the spouse's income is deemed, so only the SSI/supplement versus CAPI split can differ, not the couple's total; the code says so in a NOTE.

The results:

Household Citizen SSI + supplement CAPI Law
#10379 Case 8 (citizen $1,600, spouse $0) 0 + 0 239.94 0 / 239.94
#10379 Case 9 (citizen $2,000, spouse $0) 0 + 0 118.83 0 / 118.83
Case 11 (each $500, 2025) 235 + 620.81 = 855.81 479.76 487 + 368.81 = 855.81 / 479.76
Case 14 (each $800, 2026) 0 + 453.94 64.89 214 + 239.94 = 453.94 / 64.89
Case 15 (citizen $0, spouse $2,000, 2026) 0 + 118.83 0 min(1,233.94, 2,098.83 − 1,980) = 118.83 / 0

Your Case 12 (undocumented sibling) and a new Case 13 (a married CAPI couple in the citizen's SPM unit) keep the $368.81 supplement. Only the SSI-supplement split in Case 11 still differs from SSA's; that is the joint-SSI part of #10481.

Tests were not run locally; CI will run them.

hua7450 and others added 4 commits October 29, 2026 17:46
…t separates a CAPI couple

Apply Pavel's SA5 fix (20 CFR 416.414(b)(3)) with Cases 14 and 15, name the
state supplement change in the changelog (G11), and add a resource-test case
for the dependent amount.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-countable-income

# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml
#	policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_countable_income.yaml
#	policyengine_us/variables/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.py
…ng case for CAPI

Pavel's G10 on PR 10379: with the CAPI member as tax-unit head, the state
supplement counts the citizen's own income, so CAPI deems (Cases 16 and 17).
Case 18 is Case 13 above the deeming threshold.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@PavelMakarchuk PavelMakarchuk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Program Review

PR #10240, "Count income of aged, blind, or disabled people who fail SSI's noncitizen test" (hua7450). Round 2, incremental review of 77a9e5c9bc..2467454e79.

IDs: C = critical, SA = should address, G = suggestion. New items continue the numbering after the highest prior ID in each class.

Paths: V/ = policyengine_us/variables/gov/, T/ = policyengine_us/tests/policy/baseline/gov/, SSP = V/states/ca/cdss/state_supplement/ca_state_supplement.py, SSPT = T/states/ca/cdss/state_supplement/ca_state_supplement.yaml, CPT = T/states/ca/cdss/capi/ca_capi_person.yaml. Line numbers refer to the reviewed head.

Source Documents

  • Reviewed head SHA: 2467454
  • Mode: incremental (round 2)
  • Scope: I isolated this PR's own work with git diff 3b9dd3b34b HEAD (3b9dd3b34b, #10379's head, is an ancestor of the head) and compared it with the same diff at round 1 (f1bed699be..77a9e5c9bc). The PR's own work changed in 13 files:
    • Code: SSP (+75: an immigration-test mask and a mixed-couple branch), md_paa_imputed_federal_ssi.py (C1), md_paa_countable_income.py (G1), ky_ssp_countable_income.py (a NOTE), and ca_capi_person.py, where only a stale 3-line NOTE is removed.
    • Tests: SSPT Cases 11-15, T/states/ca/cdss/capi/ca_capi.yaml Cases 9-10, CPT Cases 16-18, md_paa.yaml Cases 14-16, MSP Case 20, SC Case 8, medically needy Case 13, and one comment in is_optional_senior_or_disabled_for_medicaid.yaml.
    • Also the changelog fragment and the PR body.
    • Main merges: e3b765b1ce and 5add59c8f0. Through #10379's merges, the branch also brings #10370, #10364, #10360, #10361, #10363 and #10373 from main.
  • SSI law: 20 CFR 416.1161 (a)(2)-(3). Fetched this round: the exclusion covers public income-maintenance payments that the ineligible spouse "receives", and the income counted in figuring them. Also 416.2025 (b)(3), fetched: under deeming, the state supplement uses "the higher of the State supplementary rates for an eligible couple or an eligible individual". Also 416.1131, 416.1160(a), (d), 416.1163(d)-(e), 416.414(b)(3).
  • POMS: SI 01320.400 B.1.e, SI 01320.430 D, SI 01320.141 A (checked in round 1).
  • California: WIC 18938 (from #10482's text); CAPI MPP 49-005, 49-035, 49-055.32.
  • Issues and comments: #10544 and #10545 (both opened 2026-10-29), the #10481 comment 6504203775, the #10243 comment 6504203026, and #10482 (body read; it does not mention SSP).

Branch Status

  • 36 commits ahead of main (d983c32370) and 1 behind. The missing commit is a release commit (CHANGELOG.md, pyproject.toml, uv.lock and three other PRs' fragments), so it has no overlap. The PR is MERGEABLE; the requested changes block it.
  • CI at the head: 33 pass, 1 pending (Contrib tests / Full Suite - Contrib (other-shard-1)). Wait for it or re-run it before merge.
  • #10379 moved after this head. Its head is now 7c380f66d6 (6:22pm EDT), one commit past 3b9dd3b34b, and that commit changes only source_conflicts/candidates.yaml. The body's own rule applies: merge #10379's final head here before the --ours step. This is a process step, not a finding.
  • The #10379 fragment (changelog.d/ca-capi-ssi-ssp-standard.fixed.md) is still here, and #10379 is still open, so the G6 step still applies at merge time.

Round 1 items

ID Status Evidence
C1 RESOLVED md_paa_imputed_federal_ssi.py:50-60 applies vtr_factor to both the individual and the couple rate, as suggested, and :19 cites POMS SI 01320.400. md_paa.yaml Case 15 (:397): min(1,450 x 2/3 - 457.50, 967 x 2/3) = 509.17, PAA 1,478 - 509.17 = 968.83. Case 16 (:440): $30 imputed, PAA 102 - 30 = 72. Both pass.
SA1 RESOLVED #10370 is on main (e7f041c334) and merged here. Case 13 (is_medically_needy_for_medicaid.yaml:372) pins ssi_countable_income: [19_760, 29_760] (this PR's gate) and [true, false]. It passes.
SA2 RESOLVED (author's correction accepted) SSP:31-36, 85-87 masks the SPM-unit sum on SSI's immigration test. Case 12 (SSPT:469), the round-1 case unchanged, passes. The author is right that the round-1 fix alone was incomplete once #10379's unpaid-spouse rule landed: with only the mask, CPT Case 8 gives a supplement of $443.94 against $0, a mutation confirms it, and I withdraw that part of the suggested fix. The new mixed-couple branch (SSP:37-84) gives SSA's totals in SSPT Cases 11, 14 and 15 and in ca_capi.yaml Case 10 (hand-checked below). The author's claim holds: the lesser of the totals, min(I - own, C - couple), equals own income exactly when CAPI = C - I - spouse income > 0. Only the split between SSI and the supplement can differ from POMS D, not the couple's total. One gap in the branch's gate is new item SA4.
SA3 RESOLVED MSP Case 20 (msp_countable_income.yaml:431): 980 + (1,666.67 - 65)/2 = 1,780.83. MD Case 14 (md_paa.yaml:356): min(2.50, 487) = 2.50, PAA 995.50. SC Case 8 (integration.yaml:203): 23,760 > 1,804 x 12 = 21,648. All pass.
G1 RESOLVED md_paa_countable_income.py:48-54 has the suggested comment. #10544 is open with the $28 / $511 case.
G2 RESOLVED The NOTE at SSPT:413-423 and the ca_capi.yaml Case 10 NOTE use 416.1161(a)(2)-(3) and $855.81. The #10481 comment says the same.
G3 RESOLVED The body's Known limitations has the parent-deeming item. The #10243 comment has the TX example.
G4 RESOLVED The body names #10379 at 3b9dd3b34b (correct at this head; see Branch Status), #10364 as merged, and the full downstream list (IN RCAP, NE AABD, TX SSP, SBD and OC General Relief, CO OAP through ISM, and ssi_amount_if_eligible / ssi_pmv_amount).
G5 RESOLVED The merge section names #10332 with the period.this_year rule.
G6 RESOLVED The merge section says to delete the #10379 fragment after #10379 lands.
G7 DEFERRED (accepted) KY: the NOTE at ky_ssp_countable_income.py:40-42 is accurate, because ky_ssp_claim_type.py:30-34 requires is_ssi_eligible. KY passes 417/417. The shared immigration-test variable is left for a follow-up, with no issue number. That is acceptable for a suggestion. This round adds a third inline copy (SSP:31-36), so a tracking issue would help.
SC OSS (out of scope) DEFERRED #10545 is open.

New findings

Critical

None.

Should address

SA4. The CA supplement's mixed-couple branch assumes that a spouse who fails SSI's noncitizen test can receive CAPI.

  • Where: SSP:49-56. spouse_fails_test uses ~meets_ssi_immigration_test. When the spouse's income leaves room for CAPI, the branch then counts only the citizen's own income.
  • Rule: the branch's own comment (SSP:37-43) cites 20 CFR 416.1161(a)(2)-(3). That exclusion covers a public income-maintenance payment that the ineligible spouse "receives". A spouse who cannot receive CAPI gets no exclusion, and the spouse's income is deemed under 416.1163 and 416.2025(b)(3). WIC 18938 bars undocumented people and TPS holders from CAPI (#10482).
  • Evidence (CA, January 2026; aged citizen with Social Security of $320 a month; aged undocumented spouse with a pension of $700 a month):
Code Citizen SSI + supplement Spouse CAPI
Head (model's current CAPI eligibility) 245.50 + 688.44 = 933.94 164.89
Head, spouse ca_capi_eligible_person: false (as after #10482) 245.50 + 688.44 = 933.94 0
Fix below, same input 245.50 + 488.44 = 733.94 0
#10379 head 3b9dd3b34b, same input 245.50 + 0 = 245.50 0
Law: 700 > 497, so the income is deemed. SSI = min(994 - 300, 1,491 - 1,000) = 491; supplement = min(239.94, 607.83) = 239.94 730.94 0
  • Today, ca_capi_eligible_person (V/states/ca/cdss/capi/eligibility/ca_capi_eligible_person.py:15-22) is the same set as "aged, blind or disabled and fails the test". So the branch agrees with the model's own CAPI, and the couple's total ($1,098.83) is the same at both heads.
  • Once #10482 lands, the branch still excludes the spouse's income. The citizen is then overpaid $203 a month in this household, and by up to about $368 a month in general.
  • The fix brings the citizen to $733.94. The $3 gap that remains is the joint SSI (#10481).
  • #10482's proposed fix does not mention SSP.
  • The microsimulation reach is zero today: round 1 found no CA residents in the group that fails the test.
  • Why SA: the code uses a proxy for the legal test that its own comment states, and a tracked change turns the proxy into a wrong value. This is the same reason that made round-1 SA2 an SA.
  • Fix (ran on a copy of the head: T/states/ca/cdss 459/459 with the new case, T/local/ca 867/867, ruff format --check passes; no current case changes). Replace SSP:49-56 with:
        # The exclusion needs a spouse who can receive CAPI, so key on CAPI
        # eligibility rather than on SSI's noncitizen test alone (issue 10482).
        capi_eligible = person("ca_capi_eligible_person", period.this_year)
        spouse_capi_eligible = (
            person.marital_unit.sum(capi_eligible & head_or_spouse) > 0
        )
        in_mixed_couple = (
            person("ssi_couple_computation_applies", period)
            & meets_ssi_immigration_test
            & spouse_capi_eligible
        )

This adds no dependency cycle: the round-1 head read ca_capi_eligible_person in SSP. Append to SSPT (the head fails it with 688.44; the fix passes):

- name: Case 16, 2026 citizen married to an aged spouse who fails SSI's noncitizen test and cannot receive CAPI, so the spouse's income is not excluded.
  period: 2026-01
  absolute_error_margin: 0.01
  input:
    people:
      person1:
        age: 72
        immigration_status: CITIZEN
        social_security: 3_840 # 320 a month
      person2:
        age: 70
        immigration_status: UNDOCUMENTED
        pension_income: 8_400 # 700 a month
        # WIC 18938 bars undocumented people from CAPI (#10482).
        ca_capi_eligible_person: false
    marital_units:
      marital_unit:
        members: [person1, person2]
    households:
      household:
        members: [person1, person2]
        state_code: CA
        living_arrangements_allow_for_food_preparation: true
  output:
    # The spouse receives no CAPI, so 20 CFR 416.1161(a)(2)-(3) does not
    # apply and the spouse's 700 a month, above the 1,491 - 994 = 497
    # threshold, is deemed (20 CFR 416.1163). The model's joint SSI gives each
    # spouse (320 + 700 - 20) / 2 = 500: SSI 745.50 - 500 = 245.50 and a
    # supplement of 1,233.94 - 245.50 - 500 = 488.44, 733.94 in all.
    # NOTE: SSA pays min(994 - 300, 1,491 - 1,000) = 491 of SSI and 239.94 of
    # supplement, 730.94 in all; the gap is the joint SSI (#10481).
    ssi: [245.50, 0]
    ca_state_supplement: 488.44
    ca_capi_person: [0, 0]

Alternative that also closes SA4: add SSP's mixed-couple gate to #10482's proposed fix list and put a NOTE at SSP:49.

Suggestions

G8. Cite the rules that the new branch applies.

  • Where: SSP:17-21. The tuple cites WIC 12200, 20 CFR 416.1160 and CAPI MPP 49-035. The branch also relies on 416.1161 (the exclusion) and 416.2025 (the supplement under deeming), which its comments name.
  • Fix: add "https://www.law.cornell.edu/cfr/text/20/416.1161" and "https://www.law.cornell.edu/cfr/text/20/416.2025" to the tuple. Both resolve, and the second is "Optional supplementation: Countable income".

Investigated and cleared

  • #10379's SA5 fix is carried correctly and is neither undone nor doubled. ca_capi_person.py:30-49 is the same as at 3b9dd3b34b; this PR removes only the stale NOTE that was at the #10379 version's lines 105-107.
    • The separated path computes own_alone from ssi_earned_income and ssi_unearned_income. It never reads the ssi_countable_income that this PR un-zeroes.
    • ssi_income_deemed_from_ineligible_spouse stays 0 for an aged, blind or disabled couple, because is_ssi_spousal_deeming_applies is false for both spouses.
    • Probes give the same CAPI at both heads. #10379 Case 14 gives [62, 253.94]. A citizen with Social Security of $800 and an LPR spouse with a pension of $40 in a CA Title XIX facility gives [0, 42].
    • In that second household, the citizen's total at the head (335.50 + 118.44 = 453.94) equals the law's 214 + 239.94. At #10379 it was 413.94. With a high-income facility spouse, the supplement is $0 at both heads, because the federal SSI ignores the CA-only facility input. That gap predates this PR.
  • Role symmetry. SSPT Case 14 with the LPR as tax-unit head gives the same 453.94 / 64.89 as Case 14 itself. At #10379 the swap gave 443.94 / 864.89, and CPT Cases 16-17 pin the swap.
  • New cases are functional. Three mutations:
    • Dropping the mixed-couple branch fails 8 cases: CPT 8, 9, 16 and 17, SSPT 11, 14 and 15, and ca_capi.yaml 10.
    • Using own income only fails SSPT Case 15.
    • Restoring the old deeming defined_for fails CPT Cases 2-5, 7 and 18 and one ca_capi_income_eligible.yaml case.
  • Periods in SSP. YEAR booleans and enums are read with period.this_year. ssi_countable_income is read with period (÷12). The YEAR inputs passed to _apply_ssi_exclusions are annual, and the result is divided by 12. ssi_couple_computation_applies is MONTH. There are no hard-coded values.
  • Partner contract tests. None is edited, and 623/623 pass at the head.

Hand-checks of new cases (2026 FBR 994 / 1,491; SSI/SSP 1,233.94 / 2,098.83; state parts 239.94 / 607.83)

  • CPT Case 16: the joint SSI is 1,491 - 1,580 < 0, so SSI is 0. The citizen's own 1,580 exceeds 1,233.94, so the supplement is 0. The unpaid citizen is an ineligible spouse, so the income is deemed. Federal min(994, -89) gives 0. State min(239.94, 607.83 - 89) = 239.94. This matches the law: the LPR has no income to deem, and the citizen's own income bars SSI/SSP.
  • CPT Case 17: state min(239.94, 607.83 - 489) = 118.83.
  • CPT Case 18: (2,000 - 20 - 65)/2 = 957.50 is deemed, because 2,000 > 497. Federal min(994, 533.50) + state 239.94 = 773.44.
  • SSPT Case 11: 1,335.81 - 235 - 480 = 620.81 (x 12 = 7,449.72). The law gives 487 + 368.81, the same 855.81 in all.
  • SSPT Cases 12 and 13: 1,335.81 - 487 - 480 = 368.81 (x 12 = 4,425.72).
  • SSPT Case 14: 1,233.94 - 780 = 453.94; SSA gives 214 + 239.94. CAPI: 2,098.83 - 1,580 - 453.94 = 64.89.
  • SSPT Case 15: max(0, 1,980 - 864.89) = 1,115.11, so the supplement is 118.83. The law gives federal 0 and state min(239.94, 118.83) = 118.83. CAPI is 0.
  • ca_capi.yaml Case 10: 2,057.83 + 257.74 = 2,315.57 (x 12 = 27,786.84). CAPI: 2,315.57 - 980 - 855.81 = 479.76 (x 12 = 5,757.12).

Tests run

All at the head (2467454e79), one folder at a time, with the snapshot package confirmed on the import path:

  • T/ssa/ssi: 246 passed.
  • T/states/ca/cdss: 458 passed.
  • T/hhs/medicaid: 835 passed.
  • T/hhs/medicare/savings_programs: 92 passed.
  • T/states/md/dhs: 129 passed.
  • T/states/sc/scdhhs: 32 passed.
  • T/states/ky/dcbs: 417 passed.
  • T/local/ca: 867 passed.
  • tests/policy/baseline/partners: 623 passed.
  • SA4 fix on a copy: T/states/ca/cdss 459 passed (with Case 16), T/local/ca 867 passed. The head fails Case 16 (688.44 against 488.44).
  • Mutations: 3 runs; results under Investigated and cleared. All copies are deleted. The probe scripts are in b3-pr10240-ssi-noncitizen-income-scratch/probes/.

Verdict

REQUEST_CHANGES: ten of the eleven round-1 items are resolved, including C1 and SA1-SA3, and G7 is acceptably deferred. One new should-address item is open (SA4, the mixed-couple gate on CAPI eligibility). Either the one-line fix with Case 16, or a #10482 entry with a NOTE, closes it. G8 is optional.

hua7450 and others added 2 commits October 30, 2026 10:48
…izen-countable-income

# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/is_medicaid_eligible.yaml
#	policyengine_us/tests/policy/baseline/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml
#	policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml
#	policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi_person.yaml
#	policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/eligibility/ca_capi_income_eligible.yaml
#	policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py
#	source_conflicts/candidates.yaml
…ibility; cite 416.1161 and 416.2025

Pavel's SA4 on PR 10240: the 416.1161(a)(2)-(3) exclusion needs a spouse who
can receive CAPI, so a spouse who fails SSI's noncitizen test but is barred
from CAPI (WIC 18938) has income deemed (Case 16). G8 adds the two rules the
branch applies to the reference tuple.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450

hua7450 commented Oct 30, 2026 •

Copy link
Copy Markdown
Collaborator Author

Reply to review 5711668382. Both items are addressed at head df7b398834: 0b909d0d77 merges main (with #10379, squash-merged as 7f736e8f3a), and df7b398834 has the fixes. Line numbers are at that head.

Paths: SSP = policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement.py, SSPT = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement.yaml.

Item Status Where
SA4 the mixed-couple branch assumes a spouse who fails the test can receive CAPI Fixed with your one-line fix: the branch now keys on the spouse's ca_capi_eligible_person (head or spouse in the marital unit), with your comment citing #10482. Your Case 16 is added as written: ssi [245.50, 0], ca_state_supplement 488.44, CAPI [0, 0], with the NOTE that SSA pays 491 + 239.94 and the $3 gap is the joint SSI (#10481). SSP:51-61; SSPT Case 16 (:625)
G8 cite the rules the branch applies Done: 20 CFR 416.1161 and 416.2025 added to the reference tuple. SSP:17-23

The main merge.

The merge needs no --ours step any more. #10379's G12 (in-kind support on the separated path) is tracked in #10549; when it is fixed, its new ca_capi_person.yaml case goes after this PR's Cases 16-18.

Tests were not run locally; CI will run them.

Update (head c1602d488f): merged main with #10519 (cooking facilities now the default) and #10546: ca_capi.yaml Case 5 takes #10519's $14,807.28, and the five cases here that meant no cooking (ca_capi.yaml Case 10, ca_state_supplement.yaml Cases 10-13) now set living_arrangements_allow_for_food_preparation: false, so their values are unchanged.

…izen-countable-income

# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml

@PavelMakarchuk PavelMakarchuk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Program Review

PR #10240, "Count income of aged, blind, or disabled people who fail SSI's noncitizen test" (hua7450). Round 3, incremental review of 2467454e79..c1602d488f.

IDs: C = critical, SA = should address, G = suggestion. New items continue the numbering after the highest prior ID in each class.

Paths: V/ = policyengine_us/variables/gov/, T/ = policyengine_us/tests/policy/baseline/gov/, SSP = V/states/ca/cdss/state_supplement/ca_state_supplement.py, SSPT = T/states/ca/cdss/state_supplement/ca_state_supplement.yaml, CAPIT = T/states/ca/cdss/capi/ca_capi.yaml, CPT = T/states/ca/cdss/capi/ca_capi_person.yaml. Line numbers refer to the reviewed head.

Source Documents

  • Reviewed head SHA: c1602d4
  • Mode: incremental (round 3)
  • Scope: #10379 is now on main, so git diff 5a23581cca HEAD (the merge base) is the PR's own work. I compared it with the round-2 own diff (3b9dd3b34b..2467454e79). The PR's own work changed in these places:
    • SSP: two references (:20-21) and the mixed-couple gate (:51-61).
    • SSPT: new Case 16 (:629); living_arrangements_allow_for_food_preparation: false in Cases 10-13 (:398, :454, :505, :555); the "defaults to false" comments in Cases 10 and 11 now say "without cooking facilities".
    • CAPIT: the same input in Case 10 (:275). Case 5 now has main's #10519 value and comment, less the obsolete "(until PR 10240 ...)" clause.
    • T/hhs/medicaid/eligibility/is_medicaid_eligible.yaml: this PR's Cases 17-19 are now Cases 21-23.
    • changelog.d/ca-capi-ssi-ssp-standard.fixed.md is deleted (round-1 G6).
    • The PR body: the SA4 text, the merge section and a "Review round 2" table.
    • Main merges: 0b909d0d77 (with #10379 as 7f736e8f3a, #10386 and #10391) and c1602d488f (with #10519 and #10546).
  • SSI law, fetched this round: 20 CFR 416.1161(a)(2) excludes "public income-maintenance payments" that the ineligible spouse receives, and the income counted in figuring them. 20 CFR 416.2025(b)(3): under deeming, the excess income comes off "the higher of the State supplementary rates for an eligible couple or an eligible individual", capped at the individual amount. Also 416.1163 (deeming) and the POMS SI 01320.400 threshold, as in round 2.
  • California: WIC 18938 (through #10482); 2025-2026 SSP standards in policyengine_us/parameters/gov/states/ca/cdss/state_supplement/payment_standard/ (aged_or_disabled/amount/*, allowance/food/*).
  • Issues and PRs: #10482, #10481, #10549, #10544 and #10545 are open. #10146 is an open PR that changes SSP and ca_capi_person.py.

Branch Status

  • The PR is 39 commits ahead of main (7a58b4fa2e) and 34 behind. The 34 commits change no PR-scope file and no file under V/states/ca or V/ssa/ssi, so they cannot conflict. GitHub reports MERGEABLE. The merge is blocked only by the changes-requested review.
  • CI at the head: 33 pass. The last check finished on 2026-10-30 at 5:58pm EDT.
  • Merge order: #10146 rewrites the SSP countable-income line that this PR changes. The PR body names it. Whichever PR merges second must re-merge main.

Round 2 items

ID Status Evidence
SA4 RESOLVED SSP:51-61 is the suggested fix word for word. It reads ca_capi_eligible_person with period.this_year, sums it over head and spouse in the marital unit, and gates in_mixed_couple on it. SSPT Case 16 (:629) is the suggested case, as written, and it passes. A mutation that restores the old ~meets_ssi_immigration_test gate fails only Case 16 (688.44 against 488.44; 469 others pass). Probe on the round-2 household: with the model's own CAPI eligibility, the citizen still gets 245.50 + 688.44 and the spouse gets CAPI of 164.89 (couple total 1,098.83, as at the prior head). With the spouse's ca_capi_eligible_person: false, the citizen gets 245.50 + 488.44 and CAPI is 0. The body now explains the CAPI-eligibility key and Case 16.
G8 RESOLVED SSP:20-21 add the Cornell 416.1161 and 416.2025 links. Both return 200. Their titles are "Income of an ineligible spouse, ineligible parent, and essential person for deeming purposes" and "Optional supplementation: Countable income". The quoted text above supports the branch.
G7 (round 1) DEFERRED (accepted) No change. SSP:33-38 is still an inline copy of SSI's immigration test, and no tracking issue exists. It is a suggestion, so it does not block.
SC OSS (round 1, out of scope) DEFERRED #10545 is open.

Round-1 items C1, SA1-SA3 and G1-G6 were resolved in round 2. The own-diff comparison shows that the code and cases that they cover are unchanged at this head. The only exception is G6, which is now complete (the fragment is deleted).

New findings

Critical

None.

Should address

None.

Suggestions

G9. CAPIT Case 9 still describes the no-cooking standard, but the case now uses the cooking default.

  • Where: CAPIT:242-243, "which is at most the 1,335.81 SSI/SSP no-cooking standard". The case sets no living_arrangements_allow_for_food_preparation, so after #10519 the standard is 1,206.94 a month.
  • The expected value (ca_capi: 0) is right either way, because 1,980 exceeds both standards. The words "at most" keep the comment true, but a reader can think that the no-cooking standard applies. Case 9 is the only case added by this PR that relies on the default.
  • Fix (optional): "1,980 a month exceeds CAPI's individual payment standard, the 1,206.94 SSI/SSP standard with cooking facilities (1,335.81 without), so CAPI pays nothing."

Investigated and cleared

  • The merge results.
    • 0b909d0d77: the four #10379 files that this PR changes (CAPIT, CPT, eligibility/ca_capi_income_eligible.yaml, ca_capi_person.py) kept this PR's side. Their main versions equal 3b9dd3b34b (git diff 3b9dd3b34b 7f736e8f3a on those four files is empty), so the author's claim holds. source_conflicts/candidates.yaml equals main. The two Medicaid test files keep all of main's cases, and this PR's cases moved without other changes.
    • c1602d488f: the one conflict, CAPIT Case 5, takes main's 14,807.28 (1,233.94 x 12) and #10519's comment. The PR removes the "(until PR 10240, SSI also zeroes this income ...)" clause. That is correct, because this PR un-zeroes that income, and $83.33 a month of earnings is still within the $20 + $65 exclusions. SSPT merged without a conflict, with the four new inputs and two comment rewrites.
  • The five cases that relied on the old cooking default. The author pinned all five to false, and each pin is needed. A copy without the pins fails each of them (and main's Cases 8 and 9, which also set false):
    • SSPT Cases 10, 11 and 12: payment standard 14,483.28 against 16,029.72.
    • SSPT Case 13: supplement 2,879.28 against 4,425.72.
    • CAPIT Case 10: supplement 5,903.28 against 7,449.72.
    • Values: 2025 aged individual 1,206.94 + 128.87 = 1,335.81, and couple 2,057.83 + 257.74 = 2,315.57, from the parameter files. With the pin, every expected value is the same as at round 2, where I hand-checked it. The comments now say "without cooking facilities" and no longer name a default.
    • The #10519 PR body, written against this PR's older head 77a9e5c9bc, lists four affected cases and 7,329.72 to 5,783.28 for this case. At this head, CAPIT Case 10's supplement is 7,449.72 (620.81 x 12). Without the pin, the model gives 5,903.28 (491.94 x 12), and CAPI 4,210.68 (2,057.83 - 980 - 235 - 491.94 = 350.89 a month). SSPT Cases 12 and 13 move too, so five cases move.
  • #10546 (blind rates): no case added by this PR has a blind person without cooking facilities. The blind cases in CPT set true. So #10546 changes no value in this PR.
  • _ca_capi_ssi_ssp_standard.py changed on main (#10519's NOTE and #10546's blind couple rate). SSP's mixed-couple branch reads it through ca_capi_ssi_ssp_standard. The aged and disabled amounts that the PR's cases use are unchanged, and T/states/ca/cdss passes.
  • The new gate.
    • ca_capi_eligible_person reads only is_ssi_aged_blind_disabled, immigration_status and is_ssi_qualified_noncitizen, so it adds no cycle.
    • It is false for a citizen or a qualified noncitizen, so the marital-unit sum counts only the spouse.
    • With default inputs, an aged, blind or disabled spouse who fails the test is CAPI-eligible. So the gate selects the same people as the old one, and the microsimulation effect is zero today.
    • When #10482 bars undocumented people and TPS holders, those spouses move to the deeming path with no further edit.
    • ruff format --check passes on SSP.
  • Case 16 hand-check (2026: FBR 994 / 1,491; aged individual SSP standard 1,233.94; state parts 239.94 / 607.83). Joint SSI: (320 + 700 - 20) / 2 = 500 each, so SSI is 745.50 - 500 = 245.50. The spouse is not CAPI-eligible, so the citizen's countable income is 500, and the spouse's income is left out of the sum. Supplement: 1,233.94 - 245.50 - 500 = 488.44. CAPI is [0, 0]. The NOTE's SSA amounts are right: federal min(994 - 300, 1,491 - 1,000) = 491, and state min(239.94, 607.83) = 239.94, so 730.94 in all. The $3 gap is the joint SSI (#10481).
  • Partner contract tests: this PR edits none, and 623/623 pass at the head.

Tests run

All tests ran at the head (c1602d488f), one process at a time. The snapshot package was confirmed on the import path.

  • policyengine-core 3.33.2, from the snapshot's uv.lock.
  • T/states/ca/cdss (CA state supplement and CAPI): 470 passed.
  • T/ssa/ssi: 246 passed.
  • T/usda/snap/income/snap_unearned_income_state_ssi_supplements.yaml: 4 passed.
  • tests/core/test_ssi_state_supplement_couple_invariants.py and test_ssi_state_supplement_medicaid_dependency.py (pytest): 29 passed.
  • T/local/ca: 867 passed.
  • The three Medicaid files that changed through the merges (is_optional_senior_or_disabled_for_medicaid.yaml, is_medicaid_eligible.yaml, medicaid_optional_senior_or_disabled_countable_income.yaml): 98 passed.
  • tests/policy/baseline/partners: 623 passed.
  • Mutations on copies, now deleted:
    • The old gate: 1 failed (Case 16), 469 passed.
    • The five pins removed: 7 failed (the five PR cases and main's SSPT Cases 8 and 9).

Verdict

APPROVE: SA4 is resolved with the suggested gate and Case 16, and G8 is resolved. The merges with #10379, #10519 and #10546 keep every expected value correct, and all five no-cooking cases are pinned correctly. No critical or should-address item is open. G9 (one stale comment in CAPIT Case 9) is optional, and G7 stays acceptably deferred.

@hua7450
hua7450 merged commit 1f994b3 into main Nov 2, 2026
33 checks passed
@hua7450
hua7450 deleted the medicaid-abd-noncitizen-countable-income branch November 2, 2026 15:23
hua7450 added a commit to hua7450/policyengine-us that referenced this pull request Nov 2, 2026
…0240 and PolicyEngine#10378) into ca-medi-cal-asset-limit-2027

Resolves the conflicts from PolicyEngine#10374's squash: keeps main's medically needy files, adds this PR's SB 164 references and 2027-07-01 rows to the asset limits, and appends this PR's medically needy cases as Cases 31-36. medicaid_medically_needy_income_limit.yaml is main's, so it leaves this PR's diff.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 2, 2026
Main's #10240 and this branch each appended cases to the end of two
Medicaid YAML files. Keep both sets of cases.

Co-Authored-By: Claude Opus 5.5 <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.

2 participants