Skip to content

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

Open
hua7450 wants to merge 9 commits into
mainfrom
ca-capi-ssi-ssp-standard
Open

hua7450 wants to merge 9 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 Couple standard less the couple's countable income and the spouse's SSI/SSP (counted as unearned income)
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)

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; state unreviewed (statute against a manual).

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. #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, the deeming branch and income-dependent cases are reachable only with pinned inputs, which the tests use and say so.

Changes

  • _ca_capi_ssi_ssp_standard.py (shared helper): individual and couple SSI/SSP standards by living arrangement and category, floored at the federal rate except in a Title XIX facility.
  • ca_capi_payment_standard (new, Person, MONTH): CAPI couple, half the couple standard less the couple offset; mixed couple, 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; mixed couple, 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, 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.

Tests

ca_capi_payment_standard.yaml (15 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 floor and the June 2019 offset change), ca_capi_person.yaml (7 cases: couple split, four deeming cases including own income, a mixed couple with income, a Title XIX resident), 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

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.

This branch has not been deployed

No deployments
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