Repository navigation
Pay California CAPI from the SSI/SSP standard per person, with spouse-to-spouse deeming - #10379
Conversation
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>
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>
…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
…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>
…-2025 floor a stopgap; LPR test personas - One-blind couple rate adds no food allowance (WIC 12200(b), (e)); candidates item us-ca:ssp-blind-couple-food-allowance (unreviewed) - Floor comment and pinned pre-2025 cases say the values are known-low; issue 10480 backfills the totals - Mixed-couple note gives the ineligible-spouse example (issue 10481) - CAPI test personas are aged permanent residents with 39 quarters (issue 10482) - PDF page comments without spaces Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…barred SSI reporters in Maryland PAA - Resolve the CAPI test conflicts with this branch's versions and switch their personas to permanent residents with 39 quarters - md_paa_imputed_federal_ssi: for a person who fails SSI's noncitizen test but reports SSI, impute the individual rate for the arrangement, or under deeming the lesser of the couple and individual computations (20 CFR 416.1163(d)-(e)); md_paa.yaml Case 13 gives $511 - CA state supplement Case 11 and the CAPI mixed-couple case use a permanent resident with 39 quarters Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@PavelMakarchuk Along with the review, one source-conflict sign-off for this PR:
A one-word answer is enough: "statute" or "regulation". The other two candidates in this PR ( |
|
Ruling on
The candidate will record this comment as the ruling. The register entry and the code marker follow the merge. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…countable-income Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in main's CI fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
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
- Reviewed head SHA: f1bed69
- Mode: full
- Scope: 16 files, 1,289 insertions and 89 deletions against the merge base
4a1a3cdeb7. The full analysis ran atb5dea77577. The only later change in scope isa13747ee8c(CANDonly; see "Changed since the analysis"). - California statute: WIC 12200, 18938, 18940, 18941.
- CDSS: PDF MPP Chapter 49, CAPI regulations (pages 3-4, 10, 25, 28, 30, 32, 44-47). PDF ACIN I-23-19 (pages 2, 4). PDF ACIN I-59-25 (pages 3, 5). Form SOC 452 (4/99), column headers and line C (link at
CAND:692). - SSA: POMS SI 01415.058 (2026), SI 01415.057 (2025), SI 01415.056 (2024), SI 01320.430 (C-D).
- Federal: 20 CFR 416.1160, 416.1161, 416.1163, 416.414.
- Issues: #10296, #10480, #10481, #10482, #7892; the ruling record in PR comment 6451310006.
- Year: target 2026. Values checked for 2019, 2024, 2025 and 2026.
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 withmainis 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;
jointstill works), #10146 (monthly deeming and countable-income variables; then read those atP:24,26,90), #10332, #10382 and #10383 (G4). About nine open PRs also append toCAND: 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-47and #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. Ifus-ca:capi-spousal-deeming-methodis ruled for SOC 452, the dollar effect falls to about $0, but the gate is still needed. - Fix (ran at the head;
Ponly):
# 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_facilityAdd 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 atH:61andH:75-76. - Evidence:
living_arrangements_allow_for_food_preparationhas no formula and nodefault_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:94pins 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 byP: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.yamlCases 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/cdssfolder passes, no partner change). Do not useca_state_supplement_eligible_personitself: 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.
- "Disabled noncitizen child who fails SSI's noncitizen test gets CAPI, not the state supplement": the household of
T/ca_capi_payment_standard.yamlCase 11, without its marital units and withliving_arrangements_allow_for_food_preparation: true. Output:ca_capi_person: [0, 1_091.27],ca_state_supplement_dependent_amount: 0,ca_state_supplement: 0. - "Disabled citizen child keeps the state supplement above SSI" (SSP folder): the same household with both people
CITIZENand no quarters lines. Output:ssi: [0, 994],ca_state_supplement: 97.27. - "Mixed couple with a disabled noncitizen child, the child's standard does not reduce the CAPI spouse": the
T/ca_capi.yaml:127couple plus the child asperson3, 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 atP: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 atOFF/couple.yaml:3andOFF/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) andT/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:person1getspension_income: 5_040,ssi: 594andssi_countable_income: 4_800(994 - 400 SSI);person2gets onlyssi_countable_income: 0; the SPM unit keepsca_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.py103 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:89that names #10240. AtT/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;jointcomes fromssi_couple_computation_applies, which readsssi_federal_living_arrangement. - Evidence: a CAPI couple with only
ca_in_medical_care_facilityset 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_FACILITYas 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.codeand #10379 to itsprs.
G6. Share the deeming core and cache the standards.
- Where:
P:65-92againstpolicyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py:7-50;PS:24andP:73both 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) andP: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 atH:5-29; older names inT/ca_capi.yamlandT/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_persondoes not affectca_capi; 867 CA local cases pass.is_tax_unit_dependentis 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.
- Apply C1 (the receipt gate and deeming from an unpaid spouse) with Cases 8 and 9.
- Apply SA2 with its three cases, or open an issue and add the NOTEs.
- Add the SA3 and SA4 cases. Update the SA1 NOTE and the body, and extend #10296 to CAPI.
- Take the suggestions that you agree with.
- Run
make format, thengov/states/ca/cdss,gov/ssa/ssi,gov/local/caandtest_source_conflicts.py. - Merge before #10240, then add one unpinned deeming case and one unpinned couple-income case there.
… 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>
…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>
…countable-income Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Reply to review 5675394842. All items are addressed at head Paths:
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
left a comment
There was a problem hiding this comment.
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) and7df48bb65e(2:54pm EDT), and two merges ofmain(3ec0ddfe86,27d605fa4d). In scope: 10 files, 502 insertions and 83 deletions (H, P, PS, DEP and six test files), plus two CA entries inCAND. The other ~1,240 changed lines ofCANDand the SDI change come frommain. 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 theMEDICAL_TREATMENT_FACILITYarrangement) andssi_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 orCANDfile. 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 atP:47andPS:28; the income comes fromP: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_incomeholds each spouse's own income. - Code:
ca_capi_couple_computationalso splits the couple when onlyca_in_medical_care_facilitymarks one spouse. SSI still computes that couple jointly, sossi_countable_income(P:27) ispersonal_countable / 2of 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_facilityhas 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;
Ponly):
# 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 readsssi_countable_incomeandca_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_incomeis [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/cdss444 passed; Cases 14 and 15 fail at the head (2 failed) and pass with the fix. The fix passesruff 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.
…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>
|
Reply to review 5704268013. All three items are addressed at head Paths:
The Tests were not run locally; CI will run them. |
|
Ruling (project lead), 2026-10-29: for 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
left a comment
There was a problem hiding this comment.
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) changesP(+23/-1), adds Cases 14 and 15 toT/ca_capi_person.yaml(+57), adds Case 6 toTDEP(+28) and extends the changelog fragment.3b9dd3b34bmergesmain(#10364, #10363, #10360, #10286, #10499-#10503, #10518, #10539, #10541 and version bumps); it changes no CAPI, CA SSP or SSI file, and itsCANDhunks (IL MSP, MO MHABD, NH FANF) come frommain.7c380f66d6(6:22pm EDT) changes only theus-ca:ssp-blind-couple-food-allowanceentry inCAND(+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
3b9dd3b34bat36cb52f932, so it already carries the SA5 fix and Cases 14 and 15. It lacks only7c380f66d6, and it does not editCANDafter that merge, so its next merge is clean. ItsPchange removes only the NOTE atP:105-107and 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
CANDentry. 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. Theruling:block hasby: PolicyEngine(an organisation, as the register header requires forruling.by),date: '2026-10-29', andrecord= comment 6509402355. I fetched the comment: same text, posted at 22:05:39Z (6:05pm EDT). prsadds #10546.follows: conflicting-sourceis still correct at this head, because the state supplement still follows POMS. The note says #10546 sets it tostatute.- 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 andown_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_incomeincludes ISM at the individual rate. - Evidence (January 2026; Case 14's household, with
ssi_receives_outside_shelter_supporton 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_facilitywithout 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;
Ponly). With it,gov/states/ca/cdsspasses (447 cases), the ISM probes give the SSI-path values, andruff formatis 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_exclusionsimport. 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.CANDmerge. Againstmain, 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-offsetnote, 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'sruling.by,dateandrecord, 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 inca_capi_payment_standard.yaml, and 3 new cases inTDEP. The "Source conflicts" section records the ruling and thefollowsplan.
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-49and dropped the resource test atDEP:32. Cases 14 and 15 andTDEPCase 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/cdsspasses (447 passed). The proposed case passes with the fix and fails at the head by $331.33.
- I reverted
- 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.
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:
ca_capi_person), summed to the SPM unit; both members of a noncitizen couple, and the noncitizen spouse of a citizen, are eligibleExample, 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 itThree items added to
source_conflicts/candidates.yaml; no# Source conflictmarkers until the register entries are on rulespec-usmain: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). Stateruled(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; stateunreviewed(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. Stateruled(2026-10-29, for the statute; ruling record); it keepsfollows: conflicting-sourceuntil 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 tostatute.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.yamlCases 14 and 15 and the 2024 case inca_capi.yamlpin 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_incomeis $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 bothca_in_medical_care_facilityand SSI'sssi_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 onlyca_in_medical_care_facilityseparates 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_capiaddsca_capi_person;ca_capi_income_eligibleasks whether any member'sca_capi_personis positive;ca_capi_eligible_personno longer excludesis_ssi_eligible_spouse.payment_standard_offset/{single,couple}.yaml:period: month, $0 from 2019-06-01; newmixed_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), threeca_state_supplement_dependent_amount.yamlcases (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 inca_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_capias 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)
Review round 1 (2026-10-27)
ca_state_supplement_dependent_amount; three casesReview round 2 (2026-10-29)
ca_in_medical_care_facilitywas paid on half the couple's incomeca_capi_person.yamlCases 14 and 15Not changed
ssi_claim_is_joint) ignores SSI's noncitizen test, so the model can still pay the citizen joint SSI that SSA would not. CAPI uses the mixed-couple computation only while the spouse is paid SSI/SSP; once the citizen's countable income reaches $1,491 the model pays nothing and CAPI deems. Below that a step remains. Example, January 2026: a citizen with $1,300 a month of Social Security and a CAPI spouse with no income get $818.83 a month in the model (SSI $105.50, state supplement $0, CAPI $713.33); the law gives CAPI of $450.94 and nothing else. Treat an aged, blind or disabled spouse who fails SSI's noncitizen test as an ineligible spouse, and base CAPI's mixed couple on actual SSI/SSP receipt #10481 tracks the fix.living_arrangements_allow_for_food_preparationhas no default value and the microdata do not set it, so every aged or disabled CAPI recipient gets the no-cooking allowance (+$128.87 a month in 2026, +$257.74 for a couple) unless it is set. Setting a default changes partner contract tests and belongs with California SSP: every aged or disabled recipient gets the restaurant-meal allowance by default #10296 (and Pay California's SSI/SSP restaurant meals allowance only when the living arrangement prevents cooking #10519).ca_capi_personhas no resource gate; the SPM-unit resource test applies throughca_capi_eligibleonca_capi.ca_capi; they could readca_capi_personin a follow-up.axiom: TheAxiomFoundation/rulespec-us#1939 queued
🤖 Generated with Claude Code