Skip to content

Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming - #10379

Merged
hua7450 merged 16 commits into
mainfrom
ca-capi-ssi-ssp-standard
Oct 30, 2026
Merged

hua7450 merged 16 commits into
mainfrom
ca-capi-ssi-ssp-standard

Conversation

@hua7450

@hua7450 hua7450 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

California's Cash Assistance Program for Immigrants (CAPI) pays aged, blind or disabled noncitizens who are barred from SSI. Since June 1, 2019, CAPI benefits must equal SSI/SSP benefits (WIC 18941), and the federal and state SSI/SSP laws, including the deeming rules, govern CAPI (WIC 18940). The CAPI regulations are Chapter 49 of the CDSS Eligibility and Assistance Standards (MPP 49, CAPI regulations); page numbers below are PDF pages of that file. The model computed CAPI differently:

Rule Source Before This PR
Payment standard equals the SSI/SSP standard for the person's category and living arrangement WIC 18941; MPP 49-050 (pages 44-46); POMS SI 01415.058; ACIN I-59-25 Federal benefit rate plus the SPM unit's state supplement payment, which is $0 when nobody in the unit gets SSP One SSI/SSP standard per living arrangement: Title XIX medical facility $62; non-medical out-of-home care $1,626.07; independent living, the higher of the blind and aged or disabled amounts, with the no-cooking food allowance only on the aged or disabled amount (WIC 12200(e))
No offset since June 1, 2019 WIC 18941; ACIN I-23-19 $10 or $20 a year $10, $20 or $10 (mixed couple) a month before June 2019 (MPP 49-050.11–.13); $0 from June 2019
Benefit = standard less the individual's or couple's countable income; each member of a CAPI couple gets half MPP 49-055.3–.4 (page 47), 49-035.1 (page 25) One standard and one pooled income for the whole SPM unit; the tax-unit spouse of a noncitizen couple was not eligible Per person (ca_capi_person), summed to the SPM unit; both members of a noncitizen couple, and the noncitizen spouse of a citizen, are eligible
Mixed couple (CAPI spouse married to an SSI/SSP recipient) MPP 49-005(e)(3) (page 3), 49-050.13, 49-035.221, 49-055.32 Not eligible as tax-unit spouse When the spouse is paid SSI/SSP: the couple standard less the couple's countable income and the spouse's SSI/SSP (counted as unearned income). When the spouse is paid neither: the spouse is an ineligible spouse (MPP 49-005(i)(2)) and the couple's income is deemed
Spouse-to-spouse deeming WIC 18940(b); MPP 49-035.71; POMS SI 01320.430 Couple federal rate with no cap Federal and state parts computed as an individual and under deeming; each is the lesser of the two. No deeming for a Title XIX facility resident (20 CFR 416.1160(a)(1))

Example, January 2026, aged individual living independently with cooking facilities and no income: CAPI was $994 × 12 − $10 = $11,918 a year; it is now $1,233.94 a month, or $14,807.28 a year, the CAPI grant in ACIN I-59-25.

Source conflicts

Source conflict us-ca:capi-payment-standard-offset (WIC 18941 against MPP 49-050): ruled: statute (ruling)

Source conflict us-ca:ssp-blind-couple-food-allowance (WIC 12200(e) against POMS SI 01415.058 code C): ruled: statute (ruling); CAPI already follows it here, and #10546 makes the state supplement follow it

Three items added to source_conflicts/candidates.yaml; no # Source conflict markers until the register entries are on rulespec-us main:

  • us-ca:capi-payment-standard-offset: WIC 18941 (2019) makes CAPI equal SSI/SSP from June 1, 2019; MPP 49-050.11–.13 (2003) still says $10/$20/$10 less. The code follows the statute, as CDSS does (ACIN I-23-19, I-59-25). State ruled (2026-10-27, for the statute; ruling record).
  • us-ca:capi-spousal-deeming-method: WIC 18940(b) and 18941 (federal deeming rules; equivalence with SSI/SSP, which SSA computes per POMS SI 01320.430 D) against form SOC 452 (4/99), which takes the smaller of the two totals. The code follows the statute; state unreviewed (statute against a form).
  • us-ca:ssp-blind-couple-food-allowance: WIC 12200(e) gives the no-cooking allowance only to an aged or disabled individual or couple (12200(c), (d)); POMS SI 01415.058 code C adds it for the aged or disabled member of a one-blind couple, and the ACIN I-59-25 table lists no such combination. CAPI follows the statute, but the state supplement for citizens follows POMS (ca_state_supplement_food_allowance.py), so the same couple has a $2,367.31 standard as citizens and $2,238.44 as CAPI recipients. State ruled (2026-10-29, for the statute; ruling record); it keeps follows: conflicting-source until Stop the California state supplement from adding the no-cooking allowance to the blind rates #10546, which makes the state supplement follow the statute, merges and sets it to statute.

Pre-2025 years (stopgap)

The state supplement parameters hold 1991 totals until 2025, below the federal benefit rate from 2008. As a stopgap, the SSI/SSP standards CAPI uses are floored at the federal rate, so pre-2025 CAPI is at least what SSI alone would pay. That still leaves out the whole state supplement: the June 2019 aged or disabled standard was $931.72 (ACIN I-23-19) against the model's $771, and the January 2024 aged standard was $1,182.94 (POMS SI 01415.056) against $943. ca_capi_payment_standard.yaml Cases 14 and 15 and the 2024 case in ca_capi.yaml pin these known-low values. Out-of-home care is also floored (January 2024: $943 against $1,575.07), and the Title XIX standard, which is not floored, is $42 against $62 (POMS SI 01415.056; ACIN I-23-19 gives $51 from June 2019). #10480 backfills the 2008-2024 totals from the CDSS ACINs and POMS SI 01415.05x and then removes the floor (#7787 is the older draft backdating PR).

Relation to #10240

On main, ssi_countable_income is $0 for everyone who fails SSI's noncitizen test, so CAPI ignores their income. #10240 counts that income; its 2026-10-19 review found that, once income counts, CAPI's federal-rate-only standard, its uncapped couple rate under deeming and its SPM-unit pooling change outcomes. This PR fixes them and merges before #10240. Until #10240 merges, CAPI ignores the income of a single person and of the tax-unit head; only the tax-unit spouse's half of a couple's income counts, and deeming from a spouse who is not aged, blind or disabled runs only with pinned inputs, which the tests use and say so. Until then, when the CAPI member is the tax-unit head, the state supplement pays the citizen spouse on half the couple's income, so CAPI uses the mixed-couple computation.

Changes

  • _ca_capi_ssi_ssp_standard.py (shared helpers): individual and couple SSI/SSP standards by living arrangement and category, floored at the federal rate except in a Title XIX facility (WIC 12200(g) for out-of-home care); the Title XIX test, which reads both ca_in_medical_care_facility and SSI's ssi_federal_living_arrangement; CAPI's couple flag, SSI's couple computation except when exactly one spouse is in a Title XIX facility (20 CFR 416.414(b)(3)); and the spouse's SSI and state supplement.
  • ca_capi_payment_standard (new, Person, MONTH): CAPI couple, half the couple standard less the couple offset; mixed couple with a spouse paid SSI/SSP, the couple standard less the mixed offset; otherwise the individual standard less the individual offset. Offsets are $0 from June 2019.
  • ca_capi_person (new, Person, MONTH): standard less own countable income (when only ca_in_medical_care_facility separates a couple that SSI computes jointly, each spouse's own income, not half the couple's: 20 CFR 416.414(b)(3)); mixed couple with a paid spouse, less the couple's countable income and the spouse's SSI and state supplement (the SPM unit's supplement shared pro rata among its SSP-eligible members); with deeming, including from an aged, blind or disabled spouse paid neither, POMS SI 01320.430 D.
  • ca_capi adds ca_capi_person; ca_capi_income_eligible asks whether any member's ca_capi_person is positive; ca_capi_eligible_person no longer excludes is_ssi_eligible_spouse.
  • payment_standard_offset/{single,couple}.yaml: period: month, $0 from 2019-06-01; new mixed_couple.yaml.
  • ca_state_supplement_dependent_amount (state supplement): a disabled or blind child counts only if the child meets SSI's citizen or qualified-noncitizen test and resource test, as adults must. A child who fails it gets CAPI instead (WIC 18938, 18941), so the child is no longer paid twice.

Tests

ca_capi_payment_standard.yaml (20 cases: categories, couples, the mixed couple, Title XIX facility $62, out-of-home care $1,626.07, aged and blind without cooking $1,362.81, an aged couple with one blind member without cooking $2,356.57, disabled and blind children, the 2024 individual, couple and out-of-home care floors, the June 2019 individual, couple and mixed-couple offset changes, and a couple with one spouse in a Title XIX facility), ca_capi_person.yaml (15 cases: couple split, deeming including own income and the May 2019 offset, mixed couples with income on either spouse, an aged citizen spouse paid no SSI/SSP whose income is deemed, a Title XIX resident, a disabled child, a spouse below the deeming threshold, and a couple with one spouse in a Title XIX facility and income on either spouse), three ca_state_supplement_dependent_amount.yaml cases (a noncitizen disabled child gets CAPI, not the supplement; a citizen child keeps it; a citizen child over SSI's resource limit gets neither), ca_capi.yaml, ca_capi_income_eligible.yaml (boundary at $1,233.94) and a couple case in ca_capi_eligible_person.yaml. Expected values are hand-derived from ACIN I-59-25, POMS SI 01415.058 and the federal benefit rates. The CAPI personas are aged lawful permanent residents with 39 qualifying quarters, who are CAPI-eligible under WIC 18938 and MPP 49-020; the model also admits undocumented and TPS people, which #10482 fixes.

No other YAML case changes: San Bernardino general relief and the contrib cases set ca_capi as an input, and Orange County general relief and SF CAAP only test whether CAPI is positive. No partner contract test has an aged, blind or disabled noncitizen in California. Tests were not run locally; CI validates.

Local review (2026-10-26)

Finding Disposition
$10/$20 offset applied although WIC 18941 removed it from June 2019 Fixed; candidates item ruled for the statute
Mixed couple got half the couple standard without counting the spouse's SSI/SSP Fixed
Facility allowances added on top of the community standard Fixed: one standard per arrangement
Pre-2025 CAPI fell below the federal rate (1991 SSP totals) Stopgap: floor at the federal rate; the real fix (backfilled totals) is #10480
Food allowance stacked on blind standards Fixed: individuals, and couples under the one-blind rate, follow WIC 12200(e); candidates item
Deeming with own income and child standards untested Tests added
Reduced-needs (another person's household) standards not applied Not changed; documented (#7892)
Deeming method: POMS vs SOC 452 Documented; candidates item

Review round 1 (2026-10-27)

Item Disposition
C1 mixed-couple computation ran when the spouse is paid no SSI/SSP Fixed: receipt gate; an unpaid spouse's income is deemed; the payment standard follows the same gate
SA1 no-cooking default NOTE and body updated with amounts; #10296 extended to CAPI; no default set here (partner tests)
SA2 state supplement paid a disabled noncitizen child whom CAPI also pays Fixed in ca_state_supplement_dependent_amount; three cases
SA3 couple and mixed-couple offsets, floors, 2019 deeming offset untested Cases added
SA4 mixed-couple income only on the CAPI member Case added
G1, G5 register entries Both programs listed; WIC 12200(g) cited
G2, G3 body Updated
G4 Title XIX inputs Fixed: reads both inputs, and a couple with exactly one spouse in a Title XIX facility is computed as two individuals (20 CFR 416.414(b)(3)); Case 20
G6 shared deeming core Not done: #10146 is rewriting the SSI deeming variables; a shared core belongs after it
G7 guards NOTEs
G8 pre-1998 periods Not done: low impact; a pre-1998 gate can follow
G9 comments and names Shortened; Case N names

Review round 2 (2026-10-29)

Item Disposition
SA5 a couple separated only by ca_in_medical_care_facility was paid on half the couple's income Fixed: each spouse's own countable income (20 CFR 416.414(b)(3)); ca_capi_person.yaml Cases 14 and 15
G10 the receipt gate before #10240 when the CAPI member is the tax-unit head Sentence added under "Relation to #10240"; the swapped-role cases go in #10240
G11 changelog Names the state supplement change; resource-test case added

Not changed

axiom: TheAxiomFoundation/rulespec-us#1939 queued

🤖 Generated with Claude Code

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 3 commits October 26, 2026 16:24
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…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>
hua7450 added a commit that referenced this pull request Oct 27, 2026
…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 added a commit that referenced this pull request Oct 27, 2026
…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>
hua7450 and others added 2 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>
hua7450 added a commit that referenced this pull request Oct 27, 2026
…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

hua7450 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

@PavelMakarchuk Along with the review, one source-conflict sign-off for this PR: us-ca:capi-payment-standard-offset (statute against regulation).

  • WIC 18941 (as amended in 2019): CAPI benefits "shall be equivalent to the benefits provided under the SSI/SSP program", from June 1, 2019.
  • MPP 49-050.11-.13 (2003) still sets the CAPI standard $10 (individual) / $20 (couple) below SSI/SSP.
  • The PR follows the statute, as CDSS's own notices do (ACIN I-23-19, I-59-25): no offset from June 2019.

A one-word answer is enough: "statute" or "regulation". The other two candidates in this PR (us-ca:capi-spousal-deeming-method, us-ca:ssp-blind-couple-food-allowance) are statute against a form or POMS, so they need no ruling.

@hua7450

hua7450 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Ruling on us-ca:capi-payment-standard-offset: statute. I'm the project lead for these Medicaid fixes, so this settles it, and it replaces the sign-off request above.

  • WIC 18941, as amended in 2019, makes CAPI benefits "equivalent to the benefits provided under the SSI/SSP program" from June 1, 2019.
  • So the $10 / $20 offset in MPP 49-050.11-.13 (2003) no longer applies from that date. CDSS's notices ACIN I-23-19 and I-59-25 apply it the same way.
  • The PR already ends the offset on 2019-06-01, so the model needs no change.

The candidate will record this comment as the ruling. The register entry and the code marker follow the merge.

hua7450 and others added 2 commits October 27, 2026 15:17
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 added a commit that referenced this pull request Oct 27, 2026
…countable-income

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in main's CI fix.

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 #10379, "Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming" (hua7450). Round 1, full review.

IDs: C = critical, SA = should address, G = suggestion.

Paths: CAPI/ = policyengine_us/variables/gov/states/ca/cdss/capi/, P = CAPI/ca_capi_person.py, PS = CAPI/ca_capi_payment_standard.py, H = CAPI/_ca_capi_ssi_ssp_standard.py, SSP/ = policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/, T/ = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/, OFF/ = policyengine_us/parameters/gov/states/ca/cdss/capi/payment_standard_offset/, CAND = source_conflicts/candidates.yaml. "MPP" is the CDSS CAPI regulations PDF. Line numbers refer to the reviewed head. Every PDF link uses the file page number.

Source Documents

Changed since the analysis

a13747ee8c moves us-ca:capi-payment-standard-offset (CAND:631-669) to ruled for the statute; the body records it. The two merges of main change no CAPI, CA SSP or SSI file. No item depends on the change: the ruling keeps the offsets before 2019-06-01, so the SA3 cases stay valid.

Branch Status

  • The branch is 9 commits ahead and 6 behind main (8ea43422e6). It is MERGEABLE; only the required review blocks it. The 6 commits (#10365, #10051, #10345 and version bumps) change no CAPI, SSP or SSI file, and a trial merge with main is clean.
  • Merge order: this PR, then #10240. #10240 is stacked on this branch. It makes deeming reachable for noncitizens and counts their income (G3).
  • #7787 (mattunrath) backdates the CA SSP parameters and edits T/ca_capi.yaml (text conflict). It also changes pre-2025 CAPI, so re-check the known-low cases (G2, SA3).
  • Open PRs that change inputs CAPI reads: #10141 (couple status from marriage; joint still works), #10146 (monthly deeming and countable-income variables; then read those at P:24,26,90), #10332, #10382 and #10383 (G4). About nine open PRs also append to CAND: expect append-only conflicts.

What the PR gets right

  • The offsets ($10 / $20 / $10 through May 2019, $0 from 2019-06-01) match MPP 49-050.11-.13 (page 44) and WIC 18941, and the register now records the ruling.
  • Every 2026 standard matches ACIN I-59-25 page 5 and POMS SI 01415.058: $1,233.94, $1,318.32, $1,362.81, $1,091.27, $1,626.07 and $62 for individuals; $2,098.83, $2,356.57, $2,238.44 and $2,324.35 for couples.
  • The per-person benefit with couple halves follows MPP 49-055.3-.4 (page 47), and so does dropping ~is_ssi_eligible_spouse (49-005(e)(3)). With a paid spouse, the mixed-couple total equals the couple standard less the couple's income, and the spouse's SSI/SSP has no $20 exclusion (49-035.221, 49-035.53(m)).
  • Deeming matches POMS SI 01320.430 D.1-D.3, C.4.c and C.7, with no deeming in a Title XIX facility (20 CFR 416.1160(a)(1)).
  • No hard-coded amounts, correct periods, vectorized code (seven household types in one run match seven separate runs).
  • The 48 cases have correct hand calculations and catch 22 of 32 code mutations. The body tracks its limits in issues. No partner test is edited; the changelog fragment is correct.

Critical (Must Fix)

C1. The mixed-couple computation runs when the aged, blind or disabled spouse is paid no SSI/SSP.

  • Where: P:48-50, P:61-63, P:94-97; PS:36.
  • Rule: MPP 49-050.13 (page 44) gives the mixed-couple standard only when the other member "is receiving SSI/SSP", and 49-005(e)(3) (page 3) treats only such a spouse as eligible. A spouse "not eligible for CAPI or SSI/SSP" is an ineligible spouse (49-005(i)(2), page 4; 20 CFR 416.1160(d)), whose income is deemed (WIC 18940(b); MPP 49-035.71; 20 CFR 416.1163).
  • Code: mixed = joint & ~(marital_unit.sum(capi_eligible) > 1) never asks whether the spouse is paid.
  • Evidence (January 2026, aged citizen 72 with Social Security, aged LPR 68 with 39 quarters and no income, cooking facilities):
Citizen's countable income Model SSI / SSP Model CAPI Law CAPI (POMS SI 01320.430 D)
$1,580 ($1,600 Social Security) 0 / 0 $518.83 $239.94
$1,980 ($2,000 Social Security) 0 / 0 $118.83 $118.83

For a spouse countable income C of $1,491 or more, the PR pays 2,098.83 - C and the law pays min(239.94, 2,098.83 - C). The overpayment is 1,858.89 - C: up to $367.89 a month, and $278.89 (+116%) at C = $1,580. The merge base paid this household $0, so the branch is new code.

  • Why this severity: a regulatory mismatch in new code, reachable without pinned inputs. The NOTE at P:41-47 and #10481 concede the rule, and documentation does not save a choice that contradicts a clear rule. SOC 452's lesser-of-totals rule gives the PR's number, but the form's headers send this spouse to deeming, and the PR uses POMS D for deeming: after #10240, a non-ABD spouse with the same income gets $239.94, an ABD spouse $518.83. If us-ca:capi-spousal-deeming-method is ruled for SOC 452, the dollar effect falls to about $0, but the gate is still needed.
  • Fix (ran at the head; P only):
# P:41-47, replace the NOTE with:
        # NOTE: SSI couple status ignores SSI's noncitizen test, so the model
        # can still pay such a spouse SSI that SSA would not (issue 10481).
# P:50
        couple_with_spouse = joint & ~(person.marital_unit.sum(capi_eligible) > 1)
# after P:60 (couple_income = ...)
        # A spouse counts as an eligible spouse only while receiving SSI/SSP
        # (MPP 49-005(e)(3), 49-050.13). A spouse paid neither is an
        # ineligible spouse (MPP 49-005(i)(2)), whose income is deemed.
        spouse_paid = (spouse_ssi + spouse_ssp) > 0
        mixed = couple_with_spouse & spouse_paid
        unpaid_spouse = couple_with_spouse & ~spouse_paid
# P:78
        deeming_income = where(unpaid_spouse, couple_income, countable_income)
        couple_federal = fbr.couple - deeming_income
# P:89-93
        deeming = (
            (person("is_ssi_spousal_deeming_applies", period.this_year) & ~joint)
            | unpaid_spouse
        ) & ~medical_facility

Add to T/ca_capi_person.yaml (the head fails Case 8 by $278.89; the fix passes both):

- name: Case 8, aged citizen spouse with income too high for SSI/SSP is an ineligible spouse, so CAPI deems the spouse's income.
  period: 2026-01
  absolute_error_margin: 0.01
  input:
    people:
      person1:
        age: 72
        immigration_status: CITIZEN
        # 1,600 a month; countable 1,580 after the $20 exclusion.
        social_security: 19_200
      person2:
        age: 68
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
    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 is paid no SSI/SSP, so is an ineligible spouse (MPP
    # 49-005(i)(2)). POMS SI 01320.430 D: federal min(994, 1,491 - 1,580) -> 0;
    # state min(239.94, 607.83 - (1,580 - 1,491)) = 239.94.
    ssi: [0, 0]
    ca_state_supplement: 0
    ca_capi_person: [0, 239.94]

Case 9, "spouse income above the couple state supplement leaves the couple state part", is the same case with social_security: 24_000 (countable 1,980) and only ca_capi_person: [0, 118.83] in the output (state min(239.94, 607.83 - 489)).
Optional: the same gate at PS:36 (no value changes). Below $1,491 the model still pays the citizen joint SSI (#10481), so a step of about $368 remains until #10481 lands.

Should Address

SA1. Every aged or disabled CAPI recipient gets the no-cooking allowance unless the input is set.

  • Where: H:41-46, used at H:61 and H:75-76.
  • Evidence: living_arrangements_allow_for_food_preparation has no formula and no default_value, so it is False. An aged LPR in January 2026 gets $1,362.81 with it omitted and $1,233.94 with it set. CAPI did not read it before, so the bias is new here. The microdata do not set it; #10296 reports 735 of 1,259 California SPM units with a supplement at the no-cooking share (2025 Enhanced CPS).
  • Direction and size: upward, +$128.87 a month per individual (+10.4%) and +$257.74 per couple (+12.3%), for every CAPI unit in microsimulation. Eligibility flips only for countable income from $1,233.94 to $1,362.81. T/ca_capi.yaml:94 pins this default on purpose.
  • Why SA: a biased microsimulation default that does not flip eligibility for a meaningful share.
  • Fix (ran): replace the NOTE at H:41-43, add the same facts to the body's "Not changed" list, and extend #10296 to CAPI.
    # NOTE: living_arrangements_allow_for_food_preparation has no default
    # value and the microdata do not set it, so every aged or disabled
    # person gets the no-cooking allowance (+$128.87 a month in 2026, +$257.74
    # for a couple) unless it is set (issue 10296).

Do not set default_value = True here. That root fix changes 3 partner contract tests in partners/analytics_coverage/edge_cases/state/ca/state_supplement.yaml (aged single, no income: $4,425.72 to $2,879.28 a year). It is partner-facing and belongs with #10296.

SA2. The state supplement pays a disabled noncitizen child whom CAPI now also pays.

  • Where: SSP/ca_state_supplement_dependent_amount.py:23-25 (outside the diff), read by P:55-59.
  • Evidence (January 2026, LPR parent 40, disabled LPR child 10, 39 quarters): the child gets CAPI $1,091.27 and the unit SSP $1,091.27: $2,182.54 against a $1,091.27 standard. An undocumented disabled child also gets the SSP; a citizen child correctly gets $97.27. It also reaches the new mixed branch: a mixed couple with this child has a unit SSP of $1,579.71, all attributed to the spouse, so the CAPI spouse gets $0 instead of $864.89. T/ca_capi_payment_standard.yaml Cases 11 and 12 (lines 234, 264) assert only the payment standard.
  • Why SA: the formula is pre-existing, but it gives a wrong value in a variable this PR adds and pays the child twice the SSI/SSP standard.
  • Fix (ran; whole gov/states/ca/cdss folder passes, no partner change). Do not use ca_state_supplement_eligible_person itself: it requires a tax-unit head or spouse, so it zeroes every child (8 SSP failures).
        # The child must meet the SSI/SSP conditions that
        # ca_state_supplement_eligible_person applies to adults; a child who
        # fails SSI's noncitizen test gets CAPI instead (WIC 18938, 18941).
        immigration_status = person("immigration_status", period.this_year)
        is_citizen = immigration_status == immigration_status.possible_values.CITIZEN
        is_qualified_noncitizen = person("is_ssi_qualified_noncitizen", period.this_year)
        meets_resource_test = person("meets_ssi_resource_test", period)
        eligible = meets_resource_test & (is_citizen | is_qualified_noncitizen)
        dependent_count = spm_unit.sum(
            dependent & dependent_age_eligible & (is_ssi_disabled | blind) & eligible
        )

Tests (the head fails the first and third; the fix passes all three). All three use 2026-01 and cooking facilities.

  1. "Disabled noncitizen child who fails SSI's noncitizen test gets CAPI, not the state supplement": the household of T/ca_capi_payment_standard.yaml Case 11, without its marital units and with living_arrangements_allow_for_food_preparation: true. Output: ca_capi_person: [0, 1_091.27], ca_state_supplement_dependent_amount: 0, ca_state_supplement: 0.
  2. "Disabled citizen child keeps the state supplement above SSI" (SSP folder): the same household with both people CITIZEN and no quarters lines. Output: ssi: [0, 994], ca_state_supplement: 97.27.
  3. "Mixed couple with a disabled noncitizen child, the child's standard does not reduce the CAPI spouse": the T/ca_capi.yaml:127 couple plus the child as person3, with marital units [person1, person2] and [person3]. Output: ca_capi_person: [0, 864.89, 1_091.27].
    With a citizen disabled child, the pro-rata simplification still gives the child's $97.27 SSP to the spouse (CAPI $767.62, not $864.89); say so in the NOTE at P:53-54. If you keep this fix out of the PR, open an issue and add a NOTE next to Cases 11 and 12.

SA3. No test covers the couple and mixed-couple offsets, the couple and out-of-home care floors, or deeming before June 2019.

  • Where: PS:39 (p.couple, p.mixed_couple; values at OFF/couple.yaml:3 and OFF/mixed_couple.yaml:3), H:92,100,102 (floors), P:88 (deeming offset).
  • Evidence: only the individual offset has a boundary case (Case 15). Five code changes survive all 48 cases: the $20 offset on a mixed couple, the $10 offset on a CAPI couple, no couple floor, no out-of-home care floor, no deeming offset before June 2019. Each case below catches one.
  • Why SA: missing edge cases for already-tested variables.
  • Fix (ran: all pass at the head and with the C1 and SA2 fixes; mark them as known-low stopgap values tied to #10480). For T/ca_capi_payment_standard.yaml:
- name: Case 16, CAPI couple, the 20 couple offset applies through May 2019 and ends in June 2019.
  period: 2019
  absolute_error_margin: 0.01
  input:
    people:
      person1:
        age: 72
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
      person2:
        age: 68
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
    marital_units:
      marital_unit:
        members: [person1, person2]
    households:
      household:
        members: [person1, person2]
        state_code: CA
        living_arrangements_allow_for_food_preparation: true
  output:
    # Couple standard max(1,167, 2019 couple FBR 1,157) = 1,167 (known-low,
    # issue 10480). May: (1,167 - 20) / 2 = 573.50 each (MPP 49-050.12).
    # June: 1,167 / 2 = 583.50 each (WIC 18941).
    ca_capi_payment_standard:
      2019-05: [573.5, 573.5]
      2019-06: [583.5, 583.5]

Case 17 (mixed couple) is Case 16 with person1 a CITIZEN without quarters; output 2019-05: [0, 1_157] and 2019-06: [0, 1_167] (1,167 - 10, MPP 49-050.13). Case 18 (couple floor) is Case 16 with period: 2024-01; output [707.5, 707.5] (max(1,167, 1,415) / 2). Case 19 (out-of-home care floor): one LPR aged 70 with 39 quarters, in_out_of_home_care_facility: true, cooking facilities, period: 2024-01; output ca_capi_payment_standard: 943 ((1,167 + 709) / 2 = 938, floored; POMS gives $1,575.07). For T/ca_capi_person.yaml:

- name: Case 10, deeming keeps the 10 individual offset through May 2019.
  period: 2019
  absolute_error_margin: 0.01
  input:
    people:
      person1:
        age: 70
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
        # Supplied as in Case 2. The spouse earns 500 per month; couple
        # countable income (500 - 20 - 65) / 2 = 207.50 per month, all deemed.
        is_ssi_spousal_deeming_applies: true
        ssi_income_deemed_from_ineligible_spouse: 2_490
        ssi_countable_income: 2_490
      person2:
        age: 50
        employment_income: 6_000
    marital_units:
      marital_unit:
        members: [person1, person2]
    households:
      household:
        members: [person1, person2]
        state_code: CA
        living_arrangements_allow_for_food_preparation: true
  output:
    # Standards max(630, 771) = 771 and max(1,167, 1,157) = 1,167 (known-low,
    # issue 10480). Federal min(771, 1,157 - 207.50) = 771; state 0.
    # May: 771 - 10 = 761 (MPP 49-050.11); June: 771 (WIC 18941).
    ca_capi_person:
      2019-05: [761, 0]
      2019-06: [771, 0]

Optional: a direct case for the "one CAPI person, non-ABD spouse below the deeming threshold" branch (LPR 70 with 39 quarters; spouse 50 with employment_income: 3_600; 2026-01; ca_capi_payment_standard and ca_capi_person both [1_233.94, 0]).

SA4. The mixed-couple tests put all income on the CAPI member.

  • Where: P:60-63; T/ca_capi_person.yaml:189 (Case 6) and T/ca_capi.yaml:127.
  • Evidence: in both cases the SSI/SSP spouse has no countable income, so subtracting only the CAPI member's own income gives the same results, and that change survives every case.
  • Why SA: a missing edge case for a tested variable.
  • Fix (ran; passes at the head and with the C1 fix): add "Case 11, mixed couple where the SSI/SSP spouse has the income subtracts the couple's income" to T/ca_capi_person.yaml. It is Case 6 with the pension moved to the citizen: person1 gets pension_income: 5_040, ssi: 594 and ssi_countable_income: 4_800 (994 - 400 SSI); person2 gets only ssi_countable_income: 0; the SPM unit keeps ca_state_supplement: 239.94. Output: ca_capi_person: [0, 864.89] (2,098.83 - 400 - 594 - 239.94).

Suggestions

G1. The one-blind couple standard differs between CAPI and the state supplement, and the register entry does not say so.

  • Where: H:70-80; CAND:1119-1153 (us-ca:ssp-blind-couple-food-allowance).
  • Evidence: an aged and blind couple without cooking (January 2026) has an SSP standard of $2,367.31 as citizens (POMS reading) and a CAPI standard of $2,238.44 as noncitizens (WIC 12200(b), (e)), although WIC 18941 makes them equal. The entry lists only the CAPI helper and asks how the SSP treats them: it adds the allowance.
  • Why a suggestion: the sources leave the rule open, the conflict is recorded, and the effect is small ($128.87 a month).
  • Fix (ran; test_source_conflicts.py 103 passed):
  pe_us:
    follows: conflicting-source
    code:
    - policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py
    - policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance.py
    - policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_payment_standard.py
    prs:
    - https://github.com/PolicyEngine/policyengine-us/pull/10379
  state: unreviewed
  note: 'PE-US is split, although WIC 18941 makes CAPI equal SSI/SSP. CAPI follows the statute:
    _ca_capi_ssi_ssp_standard.py adds no food allowance to the one-blind couple rate, and a couple both aged or
    disabled takes the aged or disabled rate with the couple allowance when that is higher. The state supplement
    follows POMS: ca_state_supplement_food_allowance.py adds the individual allowance for the aged or disabled member,
    so in January 2026 the same couple has a $2,367.31 standard as citizens and $2,238.44 as CAPI recipients. The
    ACIN I-59-25 table lists no such combination. The ruling should set both programs.'

G2. Disclose the other known-low pre-2025 standards.

  • Where: H:82-104; T/ca_capi_payment_standard.yaml:323-370 (Cases 14, 15); T/ca_capi.yaml:202.
  • Evidence: the pinned cases say they are known-low (2024 aged $943 against $1,182.94; May / June 2019 $761 / $771 against $921.72 / $931.72). The body does not name the out-of-home care and Title XIX gaps.
  • Why a suggestion: pre-existing 1991 data, tracked in #10480. Keep the pins: SA3 needs them.
  • Fix: add to the body's "Pre-2025 years" section: "Out-of-home care is also floored (January 2024: $943 against $1,575.07), and the Title XIX standard, which is not floored, is $42 against $62 (POMS SI 01415.056; ACIN I-23-19 gives $51 from June 2019)."

G3. Correct the body on what works before #10240.

  • Where: body sections "Relation to #10240" and "Not changed"; P:24-27,89-93; T/ca_capi.yaml:118-121.
  • Evidence: on this head SSI's countable income is $0 for a person who fails SSI's noncitizen test, except the tax-unit spouse. A single CAPI person with a $520 pension gets $1,233.94 (law $733.94). A CAPI couple with a $420 pension each gets $1,688.84 in all (law $1,278.83), because only the spouse's half counts. Deeming never runs unpinned. The merge base did the same, so this is not a regression. The body's $1,300 example gives SSI $105.50, SSP $488.44 and CAPI $224.89; at this head it is $105.50, $0 and $713.33 (same $818.83 total).
  • Fix: say "Until #10240 merges, CAPI ignores the income of a single person and of the tax-unit head; only the tax-unit spouse's half of a couple's income counts, and deeming runs only with pinned inputs." Correct the $1,300 split, and add a NOTE at P:89 that names #10240. At T/ca_capi.yaml:118-121, add that SSI now zeroes this income for people who fail the noncitizen test.

G4. The Title XIX standard and SSI's couple test read different inputs.

  • Where: H:47-49, P:31; joint comes from ssi_couple_computation_applies, which reads ssi_federal_living_arrangement.
  • Evidence: a CAPI couple with only ca_in_medical_care_facility set on one spouse gets $555.71 each; the law gives $62 + $1,233.94. With both inputs set the result is correct. A NOTE documents this.
  • Fix (not run): also treat ssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY as Title XIX, or follow #10383.

G5. Cite WIC 12200(g) for the out-of-home care amount and link the helper to the open couple-standard conflict.

  • Where: H:12-13,51-53; CAND:1154 (us-ca:ssp-nmohc-couple-standard).
  • Evidence: MPP 49-050.24 (page 45) only defines the arrangement; the amount is WIC 12200(g). The individual standard is half the couple amount, so a $3,239.14 ruling would give $1,619.57, which no source gives.
  • Fix (ran with G1): cite 12200(g) in the docstring, and add the helper path to that entry's pe_us.code and #10379 to its prs.

G6. Share the deeming core and cache the standards.

  • Where: P:65-92 against policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py:7-50; PS:24 and P:73 both call the helper.
  • Evidence: both encode the POMS D lesser-of rule, so a fix there (for example #10146) would not reach CAPI. The helper runs twice per person and is not in a trace.
  • Fix (not run): two Person MONTH standard variables and one ungated deeming core for both programs.

G7. Two guards can never bind.

  • Where: H:73,76 (the one-aged-or-disabled couple branch) and P:81 (max_(..., individual_supplement)).
  • Evidence: such a couple always has a blind member, whose rate is higher, and the couple state part exceeds the individual part in every year. Removing either changes no case.
  • Fix: drop both, or add a one-line NOTE that each is a guard.

G8. OFF/mixed_couple.yaml:3 starts at 1991-01-01.

  • Evidence: CAPI began in 1998 (WIC 18944(b)); 49-050.13 dates from 2003. An aged LPR gets $7,440 of CAPI for 1995. The siblings do the same.
  • Fix: low impact; a pre-1998 gate in a follow-up.

G9. Shorten dated examples in comments and align test names.

  • Where: P:41-47 (C1 removes it), the 25-line docstring at H:5-29; older names in T/ca_capi.yaml and T/eligibility/.
  • Fix: keep one-line NOTEs with the issue number; use the "Case N, description." form.

Investigated and cleared

  • "The divergence appears only when CAPI reaches $0." Rejected: at a spouse income of $1,600 the PR pays $518.83 against $239.94 (C1).
  • SA2 fix with ca_state_supplement_eligible_person. Rejected: it zeroes every child.
  • Drop the known-low pins. Not adopted: SA3 needs them.
  • The second SSI/SSP encoding as should-address. Lowered to G1: the SSP variable is SPM-level; the conflict is recorded.
  • Double counting, resources, children. No double counting while the spouse is paid; no circular dependency; the missing resource gate on ca_capi_person does not affect ca_capi; 867 CA local cases pass. is_tax_unit_dependent is an acceptable proxy for a child living with a parent.
  • Uncaught code changes. One is equivalent, one is the documented pro-rata SSP simplification, two are the G7 guards.

Out of scope / follow-up

  • #10480 (2008-2024 SSP totals, then remove the floor); #10481 (couple status for spouses who fail the noncitizen test); #10482 (undocumented and TPS); #7892 (SSP structure, reduced needs); #10296 (SSP cooking default, partner impact).
  • Sponsor deeming (MPP 49-037); county programs could read ca_capi_person. The microsimulation was not run.

Validation Summary

Check Result
CI f1bed699be: 33 pass, 0 fail (b5dea77577: 33 pass, 3 skipping)
Local tests CAPI folder 48/48 at f1bed699be. At b5dea77577 (same code): CA SSP 57, CA local 867, SSI 243, contrib 12, partner and edge cases (read-only) 115, test_source_conflicts.py 103
Fix runs C1, SA2 and G1/G5 on a copy of f1bed699be: new cases plus gov/states/ca/cdss 443 passed; SSI, CA local, 32 CA partner and edge files, 2 contrib 1,198 passed; register test 103. The head fails the 3 defect cases
Partner contract tests None edited; no fix here changes one (the SA1 default_value root fix changes 3)
References and law All references corroborate; 2026 values and offsets match; C1 contradicts MPP 49-050.13
Code and mutation No hard-coded values; vectorized. 32 mutations: 22 caught, SA3/SA4 catch 6, 4 cleared
Branch 9 ahead / 6 behind main; MERGEABLE; trial merge clean
PR body Accurate except G2 and G3. axiom: line present (process note, not counted)
Other reviews None

Review Severity: REQUEST_CHANGES

One critical item (C1) and four should-address items (SA1-SA4) are open; nine suggestions are open.

Next Steps

To auto-fix issues: run the fix-pr workflow for this PR.

  1. Apply C1 (the receipt gate and deeming from an unpaid spouse) with Cases 8 and 9.
  2. Apply SA2 with its three cases, or open an issue and add the NOTEs.
  3. Add the SA3 and SA4 cases. Update the SA1 NOTE and the body, and extend #10296 to CAPI.
  4. Take the suggestions that you agree with.
  5. Run make format, then gov/states/ca/cdss, gov/ssa/ssi, gov/local/ca and test_source_conflicts.py.
  6. Merge before #10240, then add one unpinned deeming case and one unpinned couple-income case there.

hua7450 and others added 2 commits October 29, 2026 13:44
… gate, offset and floor cases

- C1: the mixed-couple computation needs a spouse paid SSI/SSP (MPP 49-005(e)(3), 49-050.13); otherwise the spouse is an ineligible spouse and CAPI deems the couple's income (49-005(i)(2)); the payment standard follows the same gate; ca_capi_person Cases 8-9
- SA1: no-cooking default NOTE with amounts and issue 10296
- SA2: the state supplement's dependent amount needs the child to meet SSI's immigration and resource conditions; three cases
- SA3/SA4: couple, mixed-couple, floor and 2019 deeming offset cases; mixed couple with the citizen's income
- G1/G5: candidates entries list both programs; WIC 12200(g) cited
- G3/G4/G7/G9: notes, Title XIX reads both inputs, shorter docstring, Case N names

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 added a commit that referenced this pull request Oct 29, 2026
…countable-income

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

# Conflicts:
#	policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml
…individuals; Case N names

- ca_capi_couple_computation: SSI's couple computation, except when exactly one spouse is in a Title XIX facility by either input (20 CFR 416.414(b)(3)); used by the helper, the payment standard and ca_capi_person; Case 20
- ca_state_supplement_dependent_amount.yaml Cases 4 and 5 named

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
hua7450 added a commit that referenced this pull request Oct 29, 2026
…countable-income

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 5675394842. All items are addressed at head 27d605fa4d: fixes in 2b9d5f7c3d and 7df48bb65e, then main merged. Line numbers are at that head.

Paths: P = policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py, PS = .../capi/ca_capi_payment_standard.py, H = .../capi/_ca_capi_ssi_ssp_standard.py, T/ = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/.

Item Status Where
C1 mixed couple with an unpaid spouse Fixed, your code. The spouse's SSI and supplement come from a shared helper (H:30), which the payment standard also uses for the optional gate, so an unpaid spouse's partner gets the individual standard. P:44-56 (couple_with_spouse, spouse_paid, unpaid_spouse), P:69, P:85-89; PS:39-40; T/ca_capi_person.yaml Cases 8 (:274) and 9 (:306). Case 8 also checks the payment standard: [0, 1,233.94].
SA1 no-cooking default Done: your NOTE wording, and the body's "Not changed" list. No default set here. #10296 is extended to CAPI (comment). H:74-77
SA2 disabled noncitizen child paid twice Fixed with your code; all three cases added. The pro-rata note is in the helper docstring (H:30-38). .../state_supplement/payment_standard/ca_state_supplement_dependent_amount.py:23-35; .../state_supplement/ca_state_supplement_dependent_amount.yaml Cases 4 (:72) and 5 (:100); T/ca_capi_person.yaml Case 12 (:402)
SA3 offsets, floors, 2019 deeming offset Added, your values, marked known-low (#10480). I also added your optional "one CAPI person, spouse below the deeming threshold" case. T/ca_capi_payment_standard.yaml Cases 16-19 (:372, :401, :429, :456); T/ca_capi_person.yaml Cases 10 (:333) and 13 (:437)
SA4 mixed couple with the citizen's income Added T/ca_capi_person.yaml Case 11 (:366)
G1 one-blind couple split Done, your entry text: follows: conflicting-source, with both programs' code listed. This is now a question for the user's ruling. source_conflicts/candidates.yaml:1374
G2 other known-low standards Done in the body ("Pre-2025 years (stopgap)") PR body
G3 what works before #10240 Done: your body sentence, the corrected $1,300 split (105.50 / 0 / 713.33), a NOTE naming #10240, and the ca_capi.yaml Case 5 comment P:83-85; T/ca_capi.yaml Case 5 (:94)
G4 Title XIX inputs Fixed two ways. The Title XIX test reads both ca_in_medical_care_facility and SSI's MEDICAL_TREATMENT_FACILITY arrangement (H:7). A couple with exactly one spouse in a Title XIX facility is computed as two individuals (H:18; 20 CFR 416.414(b)(3)), so your example gives [62, 1,233.94], not $555.71 each. H:7-27, used at H:81, H:97, P:34, P:47, PS:28; T/ca_capi_payment_standard.yaml Case 20 (:476)
G5 WIC 12200(g); out-of-home care entry Done H:55; source_conflicts/candidates.yaml:1413 (helper path and this PR added)
G6 shared deeming core Declined for now. #10146 is moving the SSI deeming variables into monthly twins. A shared core for CAPI and _ssi_state_supplement fits better after it lands. —
G7 guards NOTEs added instead of deletion; both keep the legal rule visible H:104-105, P:73-74
G8 pre-1998 periods Declined for now. Low impact: the offsets and standards before 1998 are never reached for CAPI in practice. A pre-1998 gate can follow. —
G9 comments and names Done: shorter docstring and "Case N, description." names in ca_capi.yaml, eligibility/ca_capi_income_eligible.yaml, eligibility/ca_capi_eligible_person.yaml and the new SSP cases H:48-62

Interaction with #10240. #10240 stacks on this branch. With your #10240 SA2 mask, these Cases 8 and 9 would have failed there: excluding the CAPI spouse's half would have paid the citizen a $443.94 supplement, which counts as a paid spouse. #10240 now counts the citizen's own income in a mixed couple instead. That keeps these cases at the law's values; see the reply on #10240.

Tests were not run locally; CI will run them.

@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 #10379, "Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming" (hua7450). Round 2, incremental review of f1bed699be..27d605fa4d.

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

Paths: CAPI/ = policyengine_us/variables/gov/states/ca/cdss/capi/, P = CAPI/ca_capi_person.py, PS = CAPI/ca_capi_payment_standard.py, H = CAPI/_ca_capi_ssi_ssp_standard.py, DEP = policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py, T/ = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/, CAND = source_conflicts/candidates.yaml. Line numbers refer to the reviewed head.

Source Documents

  • Reviewed head SHA: 27d605f
  • Mode: incremental (round 2)
  • Scope: two fix commits, 2b9d5f7c3d (1:44pm EDT, October 29) and 7df48bb65e (2:54pm EDT), and two merges of main (3ec0ddfe86, 27d605fa4d). In scope: 10 files, 502 insertions and 83 deletions (H, P, PS, DEP and six test files), plus two CA entries in CAND. The other ~1,240 changed lines of CAND and the SDI change come from main. The merges change no CAPI, CA SSP or SSI file.
  • Federal: 20 CFR 416.414(b)(3) (eCFR, current): "The benefit payment for each spouse is figured by subtracting each individual's own countable income in the appropriate month ... from his or her portion of the benefit rate."
  • Code read: ssi_couple_computation_applies.py (splits a couple when exactly one spouse has the MEDICAL_TREATMENT_FACILITY arrangement) and ssi_countable_income.py (gives each spouse half the couple's pooled countable income while the couple computation applies).
  • Issues: #10296 comment 6504203437 (1:49pm EDT, October 29); #10146 (still open).
  • Values reused from round 1: ACIN I-59-25 and POMS SI 01415.058 (2026 standards), 2019 and 2024 federal benefit rates, MPP 49-050.11-.13 offsets, POMS SI 01320.430 D. For WIC 12200(g), leginfo and Justia returned 403 or a challenge page this round, so I rely on my round-1 check.

Branch Status

  • The branch is 13 commits ahead and 9 behind main (360f63a443). The 9 commits (#10286 Maine dependent exemption credit, #10503 Virginia TANF standards, version bumps) change no CA, SSI or CAND file. It is MERGEABLE; only the review blocks it.
  • CI at the head, re-checked at 3:44pm EDT: 25 pass, 0 fail, 8 pending (seven contrib shards and Microsimulation, still queued). Not a failure; re-check before merge.
  • Merge order: this PR, then #10240. The #10240 head contains this head (27 ahead, 0 behind). #10240 also edits P, so it must take the SA5 fix. G10 needs a case in #10240.
  • The other open PRs from round 1 (#7787, #10141, #10146, #10332, #10382, #10383) have not merged. Expect append-only conflicts in CAND.

Round 1 items

ID Status Evidence
C1 RESOLVED P:48,54-56 add the receipt gate; P:69 deems the couple's income from an unpaid spouse; P:86-89 deem it. PS:39-40 gives the individual standard in that case. Cases 8 (T/ca_capi_person.yaml:274) and 9 (:306) pass with [0, 239.94] and [0, 118.83], the POMS SI 01320.430 D values, and Case 8 checks the payment standard [0, 1,233.94]. Probe at countable $1,480: SSI pays the citizen $5.50 as a couple, so CAPI is $613.33 against the law's $250.94. That is the #10481 step that "Not changed" describes. See G10 for the case where the CAPI member is the tax-unit head.
SA1 RESOLVED NOTE at H:74-77 with the amounts; the body's "Not changed" list; the #10296 comment extends that issue to CAPI. No default is set, so no partner test changes.
SA2 RESOLVED DEP:23-35 requires the citizen or qualified-noncitizen test and the resource test. SSP Cases 4 (:72) and 5 (:100) and T/ca_capi_person.yaml Case 12 (:402) pass. The pro-rata note is at H:33-36. Probe: a disabled LPR child with 40 quarters still gets SSI $994 and SSP $97.27, and no CAPI.
SA3 RESOLVED T/ca_capi_payment_standard.yaml Cases 16-19 (:372, :401, :429, :456) and T/ca_capi_person.yaml Case 10 (:333) pass, with my values: (1,167 - 20) / 2 = 573.50; 1,167 - 10 = 1,157; max(1,167, 1,415) / 2 = 707.50; max((1,167 + 709) / 2, 943) = 943; 771 - 10 = 761. The optional Case 13 (:437) is also in. Each case is marked known-low (#10480).
SA4 RESOLVED Case 11 (:366): 2,098.83 - 400 - 594 - 239.94 = 864.89. If only the CAPI member's own income is subtracted, the result is $1,264.89, so the case catches that change.
G1 RESOLVED CAND:1374-1412: follows: conflicting-source, all three code paths, and my note text. test_source_conflicts.py passes.
G2 RESOLVED The body's "Pre-2025 years (stopgap)" section has the out-of-home care and Title XIX sentence.
G3 RESOLVED The body's "Relation to #10240" sentence, the corrected $1,300 split (105.50 / 0 / 713.33), the NOTE at P:83-85, and the comment in T/ca_capi.yaml Case 5 (:120-125).
G4 RESOLVED, with a new defect H:7-15 reads both inputs. With only SSI's arrangement set, CAPI now gives [62, 253.94], where round 1 gave [1,233.94, 253.94]. The new split for the California input (H:18-27) uses the wrong income: SA5.
G5 RESOLVED H:55 cites WIC 12200(g). CAND:1413-1452 lists the helper and #10379.
G6 DECLINED (accepted) #10146 is still open and rewrites the SSI deeming variables, so a shared core fits better after it. Suggestion only.
G7 RESOLVED NOTEs at H:104-105 and P:73-74, one of the two options I gave.
G8 DECLINED (accepted) Low impact: CAPI began in 1998. Suggestion only.
G9 RESOLVED The helper docstring (H:48-63) is 16 lines. The test files that this PR changes use "Case N, description." names. Three CAPI test files that the PR does not touch keep their old names; that is out of scope.

New findings

Critical

None.

Should address

SA5. When only the California facility input separates a couple, CAPI pays each spouse on half the couple's income.

  • Where: H:18-27 (ca_capi_couple_computation), used at P:47 and PS:28; the income comes from P:27.
  • Rule: 20 CFR 416.414(b)(3) computes each spouse's payment from "each individual's own countable income". The SSI code applies this through ssi_couple_computation_applies: when SSI's arrangement marks one spouse, ssi_countable_income holds each spouse's own income.
  • Code: ca_capi_couple_computation also splits the couple when only ca_in_medical_care_facility marks one spouse. SSI still computes that couple jointly, so ssi_countable_income (P:27) is personal_countable / 2 of the pooled income for each spouse that SSI counts. CAPI then subtracts that half from each individual standard.
  • Evidence (January 2026, aged LPR couple with 39 quarters each, cooking facilities, $1,000 a month of Social Security on one spouse, countable $980):
Facility input on person1 Income on Round 1 head This head Law, 416.414(b)(3)
ca_in_medical_care_facility person2, at home [555.71, 65.71] [62, 743.94] [62, 253.94]
ca_in_medical_care_facility person1, in the facility [555.71, 65.71] [62, 743.94] [0, 1,233.94]
SSI arrangement (ssi_lives_in_medical_treatment_facility, ssi_medicaid_pays_majority_of_care) person2, at home [1,233.94, 253.94] [62, 253.94] [62, 253.94]

The spouse at home is overpaid by half of their own countable income, up to $616.97 a month (at $1,233.94 countable). When the income belongs to the spouse in the facility, half of it moves to the spouse at home. In the first row, this head is further from the law than round 1: $490 over against $305.48. Case 20 (T/ca_capi_payment_standard.yaml:476) has no income, so no case catches this.

  • Why SA and not C: the path needs the California input without SSI's arrangement. That is the input mismatch that I rated G4 in round 1, and with SSI's arrangement set the result is correct. ca_in_medical_care_facility has no formula, so only a user who sets it reaches this path. But the new code cites 416.414(b)(3) and then applies it with the wrong income, and nothing documents that.
  • Fix (ran on a copy; P only):
# P:1, add
from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import (
    _apply_ssi_exclusions,
)
# P:27, replace `countable_income = person("ssi_countable_income", period)` with
        # When only the California facility input separates a couple that SSI
        # computes jointly, ssi_countable_income holds half the couple's
        # income; each spouse's own income counts (20 CFR 416.414(b)(3)).
        separated = person(
            "ssi_couple_computation_applies", period
        ) & ~ca_capi_couple_computation(person, period)
        own_alone = (
            _apply_ssi_exclusions(
                person("ssi_earned_income", period.this_year),
                person("ssi_unearned_income", period.this_year),
                parameters,
                period.this_year,
            )
            / MONTHS_IN_YEAR
        )
        countable_income = where(
            separated, own_alone, person("ssi_countable_income", period)
        )

Add to T/ca_capi_person.yaml (the head fails both cases; the fix passes both, and gov/states/ca/cdss passes, 444 cases):

- name: Case 14, couple with one spouse in a Title XIX facility, each spouse's own income counts.
  period: 2026-01
  absolute_error_margin: 0.01
  input:
    people:
      person1:
        age: 72
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
        ca_in_medical_care_facility: true
      person2:
        age: 68
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
        # 1,000 a month; countable 980 after the $20 exclusion.
        social_security: 12_000
    marital_units:
      marital_unit:
        members: [person1, person2]
    households:
      household:
        members: [person1, person2]
        state_code: CA
        living_arrangements_allow_for_food_preparation: true
  output:
    # 20 CFR 416.414(b)(3): each spouse's own countable income comes off
    # that spouse's standard: 62 - 0 = 62 and 1,233.94 - 980 = 253.94.
    ca_capi_person: [62, 253.94]

Case 15, "couple with one spouse in a Title XIX facility, the facility resident's income stays with that spouse", is Case 14 with the social_security: 12_000 line moved to person1. Its output is ca_capi_person: [0, 1_233.94] (max(62 - 980, 0) = 0 and 1,233.94 - 0).
This path counts the own income of a tax-unit head who fails SSI's noncitizen test, which the other paths ignore until #10240 (G3). That is the law's value; keep it when #10240 merges.
Alternative: drop the California-only split (ca_capi_couple_computation returns ssi_couple_computation_applies), and add a NOTE that the split follows ssi_federal_living_arrangement (#10383). That brings back round 1's $555.71 each for Case 20, so I prefer the fix above.

Suggestions

G10. Until #10240, the C1 gate gives the law's value only when the CAPI member is the tax-unit spouse.

  • Where: P:54-56, PS:39; the gate reads ssi_countable_income and ca_state_supplement.
  • Evidence (January 2026): Case 8 with the ages swapped, so the CAPI member (72) is the tax-unit head and the citizen (68) the spouse. SSI zeroes the head's half of the couple's income, so ssi_countable_income is [0, 790]. The state supplement then pays the citizen 1,233.94 - 790 = $443.94 (unchanged SSP code). The gate treats the citizen as paid, and CAPI pays 2,098.83 - 790 - 443.94 = $864.89. The law gives no SSP and CAPI of $239.94. With $2,000 of Social Security, the model pays SSP $243.94 and CAPI $864.89, against CAPI of $118.83. Round 1's head gave the same $864.89, so this is not a regression.
  • Why a suggestion: the cause is the documented income gap before #10240 (G3; the body's "Relation to #10240"), and #10240 merges next. You say that #10240 counts the citizen's own income in a mixed couple. I did not run #10240.
  • Fix: in #10240, add the swapped-age twins of Cases 8 and 9 (ssi: [0, 0], ca_state_supplement: 0, ca_capi_person: [239.94, 0] and [118.83, 0]). Here, add one sentence to "Relation to #10240": "Until then, when the CAPI member is the tax-unit head, the state supplement pays the citizen spouse on half the couple's income, so CAPI uses the mixed-couple computation."

G11. The changelog fragment does not name the state supplement change.

  • Where: changelog.d/ca-capi-ssi-ssp-standard.fixed.md; DEP:23-35.
  • Evidence: the SA2 fix stops the state supplement for a disabled or blind child who fails SSI's noncitizen test or resource test. The fragment names only CAPI. No case covers a child who fails only the resource test.
  • Fix: end the fragment with "..., and stop the state supplement's dependent amount for a disabled or blind child who fails SSI's noncitizen or resource test." Optionally add a resource-test case to the SSP file.

Investigated and cleared

  • Vectorization. Five household types (Cases 8 and 12, the SA5 first row, the G10 household, and a single LPR with a pension) in one simulation give the same results as five separate runs.
  • New dependency in PS. The payment standard now reads the spouse's SSI and supplement. There is no circular dependency; all 64 cases pass.
  • Pro-rata supplement and the gate. An unpaid citizen spouse with $2,000 of Social Security, a CAPI spouse and a citizen disabled child: the unit's supplement is $0 (the parents' income absorbs the child's $97.27), so the gate stays closed and CAPI is $118.83, the same as without the child.
  • Case 12 value. $864.89 equals the law's value, although the model pays the citizen couple SSI (#10481): 2,098.83 - 994 - 239.94 is also 864.89.
  • Case 13. It tests the individual-standard branch. Deeming for a CAPI member runs only with supplied inputs until #10240, so the case passes for any spouse earnings. The name states the law correctly. Add the above-threshold twin in #10240 (my round-1 next step 6).
  • Main merges. The SDI change (#10255) and the other merged PRs do not touch CAPI, CA SSP or SSI.

Tests run

  • policyengine-core test T/ policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_dependent_amount.yaml -c policyengine_us: 64 passed.
  • policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement -c policyengine_us: 59 passed.
  • pytest policyengine_us/tests/code_health/test_source_conflicts.py: 103 passed.
  • SA5 fix on a copy of the head: gov/states/ca/cdss 444 passed; Cases 14 and 15 fail at the head (2 failed) and pass with the fix. The fix passes ruff format.
  • Probes: the SA5 table (round-1 CAPI files on a second copy for that column), G10, the C1 boundary at $1,480, a qualified disabled child (SA2), vectorization.
  • Partner contract tests: none edited (no partners/** change against the merge base). The "Household API Partners" CI job passed.

Verdict

REQUEST_CHANGES: SA5 is open. C1 and SA1-SA4 are resolved, and G1-G5, G7 and G9 are done. I accept the reasons for G6 and G8. G10 and G11 are new suggestions.

hua7450 and others added 2 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>
@hua7450

hua7450 commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Reply to review 5704268013. All three items are addressed at head 3b9dd3b34b: the fix is in 5ef420b953, followed by a merge of main. Line numbers are at that head.

Paths: P = policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py, T/ = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/.

Item Status Where
SA5 couple separated only by ca_in_medical_care_facility Fixed with your code: when SSI computes the couple jointly but CAPI splits it, each spouse's own countable income counts (20 CFR 416.414(b)(3)). A NOTE says this own income leaves out in-kind support and the student earned income exclusion, which SSI's joint computation would apply. Both of your cases are added. P:2-4 (import), P:30-49; T/capi/ca_capi_person.yaml Cases 14 (:463, [62, 253.94]) and 15 (:492, [0, 1,233.94])
G10 the receipt gate before #10240 when the CAPI member is the tax-unit head Done: your sentence is now under "Relation to #10240". The role-swapped twins of Cases 8 and 9 are in #10240 (ca_capi_person.yaml Cases 16 and 17: ssi [0, 0], ca_state_supplement 0, CAPI [239.94, 0] and [118.83, 0]). #10240 also has Case 13's above-threshold twin (Case 18, [773.44, 0]). PR body; #10240
G11 changelog Done: the fragment ends with "stop the state supplement's dependent amount for a disabled or blind child who fails SSI's noncitizen or resource test". I also added the optional resource-test case: a citizen child with $3,000 in the bank gets no SSI and no dependent amount. changelog.d/ca-capi-ssi-ssp-standard.fixed.md; T/state_supplement/ca_state_supplement_dependent_amount.yaml Case 6 (:124)

The main merge brings no CAPI, CA SSP or SSI change; source_conflicts/candidates.yaml merged append-only, and the blind-couple food allowance candidate is unchanged while it waits for a ruling. No parameter this PR touches has a breakdown.

Tests were not run locally; CI will run them.

@hua7450

hua7450 commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator Author

Ruling (project lead), 2026-10-29: for us-ca:ssp-blind-couple-food-allowance, WIC 12200 governs over POMS SI 01415.058 code C.

Subdivision (e) gives the no-cooking allowance only to an aged or disabled individual under (c) and to a couple both aged or disabled under (d). A couple with one blind member is paid the (b) rate, so neither CAPI nor the state supplement adds a meals allowance. CAPI in this PR already follows the statute. The state supplement change will follow in a separate PR.

Set us-ca:ssp-blind-couple-food-allowance to state: ruled with the ruling
record (PR comment 6509402355, 2026-10-29). CAPI follows the statute; the state
supplement follows POMS until PR 10546 merges.

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 #10379, "Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming" (hua7450). Round 3, incremental review of 27d605fa4d..7c380f66d6.

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

Paths: CAPI/ = policyengine_us/variables/gov/states/ca/cdss/capi/, P = CAPI/ca_capi_person.py, PS = CAPI/ca_capi_payment_standard.py, H = CAPI/_ca_capi_ssi_ssp_standard.py, DEP = policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py, T/ = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/, TDEP = policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_dependent_amount.yaml, CAND = source_conflicts/candidates.yaml. Line numbers refer to the reviewed head.

Source Documents

  • Reviewed head SHA: 7c380f6
  • Mode: incremental (round 3)
  • Scope: three commits since 27d605fa4d. 5ef420b953 (5:46pm EDT, October 29) changes P (+23/-1), adds Cases 14 and 15 to T/ca_capi_person.yaml (+57), adds Case 6 to TDEP (+28) and extends the changelog fragment. 3b9dd3b34b merges main (#10364, #10363, #10360, #10286, #10499-#10503, #10518, #10539, #10541 and version bumps); it changes no CAPI, CA SSP or SSI file, and its CAND hunks (IL MSP, MO MHABD, NH FANF) come from main. 7c380f66d6 (6:22pm EDT) changes only the us-ca:ssp-blind-couple-food-allowance entry in CAND (+15/-7). The PR body adds a "Review round 2" table, the G10 sentence and the ruling.
  • Federal (eCFR, fetched this round): 20 CFR 416.414(b)(3): "The benefit payment for each spouse is figured by subtracting each individual's own countable income in the appropriate month ... from his or her portion of the benefit rate." 20 CFR 416.1140(a)(1): the presumed maximum value of in-kind shelter "is one-third of your Federal benefit rate plus the amount of the general income exclusion". 20 CFR 416.1112(c)(3): the student exclusion applies "If you are under age 22 and a student", with no marriage condition. 20 CFR 416.1205(c): $2,000 individual resource limit from January 1, 1989.
  • California: WIC 12200. leginfo still returns 403, so I read a Wayback id_ capture. Subdivision (e): "For an aged or disabled applicant or recipient under subdivision (c) or for a married couple under subdivision (d) whose living arrangement prevents preparation of his or her or their meals at home shall be entitled to an allowance ...". Subdivision (b) is the one-blind couple rate.
  • Ruling: PR comment 6509402355 (6:05pm EDT): "for us-ca:ssp-blind-couple-food-allowance, WIC 12200 governs over POMS SI 01415.058 code C." I treat it as settled.
  • Stacked PR: #10240 at 2467454e79, read through the GitHub compare and contents APIs. I did not run it.

Branch Status

  • The branch is 16 commits ahead and 1 behind main (d983c32370, a version bump only). It is MERGEABLE; only the review blocks it.
  • CI at the head, re-checked at 7:22am EDT: 34 pass, 0 fail.
  • Merge order: this PR, then #10240. #10240 merged 3b9dd3b34b at 36cb52f932, so it already carries the SA5 fix and Cases 14 and 15. It lacks only 7c380f66d6, and it does not edit CAND after that merge, so its next merge is clean. Its P change removes only the NOTE at P:105-107 and keeps the separated path. Nothing in this round changes what #10240 must carry. If you take G12, #10240 must take the same change, and the new case number collides with its Cases 16-18.
  • #10546 (the state supplement side of the ruling) is listed in the CAND entry. I did not review it.

Round 2 items

ID Status Evidence
C1 RESOLVED Resolved in round 2; the code is unchanged. Cases 8 (T/ca_capi_person.yaml:274) and 9 (:306) pass.
SA1 RESOLVED Resolved in round 2; the NOTE at H:74-77 is unchanged.
SA2 RESOLVED Resolved in round 2; DEP:23-35 is unchanged. Case 6 now covers the resource test (G11).
SA3 RESOLVED Resolved in round 2; T/ca_capi_payment_standard.yaml Cases 15-19 pass.
SA4 RESOLVED Resolved in round 2; Case 11 (:366) passes.
SA5 RESOLVED P:35-49 is my round-2 code word for word, with a NOTE at P:33-34. Cases 14 (:463) and 15 (:492) are my YAML. Hand check: 62 - 0 = 62 and 1,233.94 - (1,000 - 20) = 253.94; max(62 - 980, 0) = 0 and 1,233.94 - 0 = 1,233.94. If P:47-49 goes back to ssi_countable_income, both cases fail. The probes give the law's value for earnings and Social Security on both spouses. The NOTE's gap is G12.
G1 RESOLVED Resolved in round 2.
G2 RESOLVED Resolved in round 2; the body section is unchanged.
G3 RESOLVED Resolved in round 2.
G4 RESOLVED The defect that round 2 found in the new split (SA5) is fixed.
G5 RESOLVED Resolved in round 2.
G6 DECLINED (accepted) #10146 is still open. Suggestion only.
G7 RESOLVED Resolved in round 2.
G8 DECLINED (accepted) Low impact. Suggestion only.
G9 RESOLVED Resolved in round 2; the new cases use "Case N, description." names.
G10 RESOLVED The body's "Relation to #10240" ends with my sentence word for word. #10240 at 2467454e79 has Cases 16 and 17, the role-swapped twins: ssi [0, 0], ca_state_supplement 0, CAPI [239.94, 0] and [118.83, 0]. Hand check: min(239.94, 607.83 - (1,580 - 1,491)) = 239.94; 607.83 - (1,980 - 1,491) = 118.83. It also has Case 18, the above-threshold twin of Case 13: (2,000 - 85) / 2 = 957.50; 1,491 - 957.50 = 533.50; 533.50 + 239.94 = 773.44. I read the cases but did not run #10240.
G11 RESOLVED The fragment ends with "and stop the state supplement's dependent amount for a disabled or blind child who fails SSI's noncitizen or resource test." TDEP Case 6 (:124): the child's $3,000 exceeds $2,000 (20 CFR 416.1205(c)), so SSI, the dependent amount and the state supplement are 0. If DEP:32 drops meets_resource_test, Case 6 fails.

The ruling and the register entry (CAND:1374-1420; new this round):

  • The entry has state: ruled. The ruling: block has by: PolicyEngine (an organisation, as the register header requires for ruling.by), date: '2026-10-29', and record = comment 6509402355. I fetched the comment: same text, posted at 22:05:39Z (6:05pm EDT).
  • prs adds #10546. follows: conflicting-source is still correct at this head, because the state supplement still follows POMS. The note says #10546 sets it to statute.
  • The note's reading matches WIC 12200(e). Its amounts are correct: 2,238.44 + 128.87 = 2,367.31.
  • CAPI follows the ruling (H:102-114). Probe, January 2026: a couple of an aged person (70) and a blind person (50) without cooking facilities has a CAPI standard of [1,119.22, 1,119.22], which is 2,238.44 / 2 with no food allowance. Case 13 (T/ca_capi_payment_standard.yaml:292) pins the reading. If the code adds POMS code C's $128.87 to the one-blind rate, Case 13 fails (1 of 61 cases).
  • The ruling says "A couple with one blind member is paid the (b) rate". Case 13's couple is not affected: both spouses are aged, so they also qualify under (d), and the note keeps the higher-of rule. #10546 should use the same rule so that both programs agree. I did not check #10546.

New findings

Critical

None.

Should address

None.

Suggestions

G12. When only the California facility input separates a couple, the spouse at home loses in-kind support and maintenance (ISM), up to $351.33 a month.

  • Where: P:33-46 (the NOTE and own_alone).
  • Rule: 20 CFR 416.414(b)(3) subtracts "each individual's own countable income". ISM is unearned income at the presumed maximum value, "one-third of your Federal benefit rate plus" $20 (20 CFR 416.1140(a)(1)). The model's SSI path already does this. When SSI's arrangement separates the couple, ssi_countable_income includes ISM at the individual rate.
  • Evidence (January 2026; Case 14's household, with ssi_receives_outside_shelter_support on the spouse at home, person2):
Person2's income Round 2 head (derived) This head SSI arrangement on person1 Law
ISM only [62, 985.44] [62, 1,233.94] [62, 902.61] [62, 902.61]
ISM and $500 of Social Security [62, 735.44] [62, 753.94] [62, 402.61] [62, 402.61]

The round-2 column is 1,233.94 less ssi_countable_income (248.50 and 498.50). The SSI code is unchanged since round 2. This head overpays by the full ISM: $331.33 when ISM is the only income (the $20 exclusion takes part of it) and $351.33 when other unearned income uses the $20. In the first row, this head is further from the law than round 2: $331.33 over against $82.83 over. All other income gives the law's value. With earnings of $500 and $800 a month, CAPI is [0, 876.44]. With Social Security of $300 and $700, it is [0, 553.94].

  • Why a suggestion: the path needs two inputs that only a user sets: ca_in_medical_care_facility without SSI's arrangement, and a shelter-support input on the spouse at home. The NOTE says that ISM is left out, and SSI's arrangement gives the law's value. The gap comes from my round-2 fix, which did not include ISM. The author applied that fix as written and documented the gap.
  • The student exclusion: 416.1112(c)(3) has no marriage condition, so the NOTE is correct that this path loses it too. It applies only to a married blind or disabled CAPI spouse under 22 with earnings, so the NOTE is enough for it.
  • Fix (ran on a copy; P only). With it, gov/states/ca/cdss passes (447 cases), the ISM probes give the SSI-path values, and ruff format is clean:
# P:38, before own_alone
        # In-kind support counts at the individual presumed maximum value
        # (20 CFR 416.1140); a Title XIX facility resident has none.
        p_ssi = parameters(period).gov.ssa.ssi
        pmv = (
            p_ssi.amount.individual * p_ssi.income.ism.pmv_fbr_fraction
            + p_ssi.income.exclusions.general
        ) * MONTHS_IN_YEAR
        actual = person("ssi_shelter_support_value", period.this_year)
        own_ism = (
            person("ssi_pmv_applies", period.this_year)
            & ~ca_capi_in_title_xix_facility(person, period)
        ) * where(actual > 0, min_(pmv, actual), pmv)
# P:41, in own_alone
                person("ssi_unearned_income", period.this_year) + own_ism,

Change the NOTE to "NOTE: this own income leaves out the student earned income exclusion, which SSI's joint computation would apply." Add this case to T/ca_capi_person.yaml. It fails at the head ([62, 1,233.94]) and passes with the fix:

- name: Case 16, couple with one spouse in a Title XIX facility, the spouse at home counts in-kind support at the individual rate.
  period: 2026-01
  absolute_error_margin: 0.01
  input:
    people:
      person1:
        age: 72
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
        ca_in_medical_care_facility: true
      person2:
        age: 68
        immigration_status: LEGAL_PERMANENT_RESIDENT
        ssi_qualifying_quarters_earnings: 39
        ssi_receives_outside_shelter_support: true
    marital_units:
      marital_unit:
        members: [person1, person2]
    households:
      household:
        members: [person1, person2]
        state_code: CA
        living_arrangements_allow_for_food_preparation: true
  output:
    # Presumed maximum value 994 / 3 + 20 = 351.33; 331.33 counts after the
    # $20 exclusion (20 CFR 416.1140): 1,233.94 - 331.33 = 902.61.
    ca_capi_person: [62, 902.61]

#10240 already uses Cases 16-18 in this file. Renumber them there, or add this case to #10240 as Case 19.

  • Alternative: keep the code, and put the amount and the workaround in the NOTE: "NOTE: this own income leaves out in-kind support and maintenance (up to $351.33 a month in 2026) and the student earned income exclusion; set SSI's facility arrangement to count them."

Investigated and cleared

  • Vectorization. I put ten households in one simulation: Cases 14 and 15, earnings, Social Security, ISM with and without SSI's arrangement, and the one-blind couple. The results are the same as ten separate runs.
  • The head who fails SSI's noncitizen test. The separated path counts the head's own income. In the earnings probe, person1 gets 0, which is the law's value. With SSI's arrangement, the model gives 62, which is the documented gap before #10240 (G3). #10240 keeps the separated path.
  • _apply_ssi_exclusions import. Nine other variables import the same private helper (for example CA WDP, MN MSA, OK SSP and VA AG). There is no new dependency cycle, and all 67 cases pass.
  • CAND merge. Against main, the file adds only the three CA entries (+128 lines, append-only).
  • Note wording. "The project lead for the Medicaid fixes" repeats the us-ca:capi-payment-standard-offset note, which rounds 1 and 2 accepted. It quotes the 2026-10-27 ruling comment. This is not a finding.
  • ruling: block. This is the only candidate with the block (1 of 64 ruled entries). The check ignores unknown keys, and the block uses the registered schema's ruling.by, date and record, so it can move to the register as it is.
  • PR body. The case counts are correct: 15 cases in ca_capi_person.yaml, 20 in ca_capi_payment_standard.yaml, and 3 new cases in TDEP. The "Source conflicts" section records the ruling and the follows plan.

Tests run

  • policyengine-core test T/ TDEP -c policyengine_us: 67 passed.
  • policyengine-core test policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement -c policyengine_us: 60 passed.
  • pytest policyengine_us/tests/code_health/test_source_conflicts.py: 103 passed.
  • Mutations, each on a copy that I then deleted:
    • I reverted P:47-49 and dropped the resource test at DEP:32. Cases 14 and 15 and TDEP Case 6 fail (3 failed, 18 passed).
    • I added POMS code C's allowance to the one-blind rate. Only Case 13 fails (1 failed, 60 passed).
    • With the G12 fix, gov/states/ca/cdss passes (447 passed). The proposed case passes with the fix and fails at the head by $331.33.
  • Probes: the ten households above.
  • ruff format --check P: clean.
  • Partner contract tests: none edited (0 of the 18 files against the merge base).

Verdict

APPROVE: no C or SA item is open. The SA5 fix is in, with Cases 14 and 15, and G10 and G11 are done. The register records the 2026-10-29 ruling correctly, and CAPI follows it. G12 is a suggestion.

@hua7450
hua7450 merged commit 7f736e8 into main Oct 30, 2026
34 checks passed
@hua7450
hua7450 deleted the ca-capi-ssi-ssp-standard branch October 30, 2026 14:44
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