diff --git a/changelog.d/ca-ssp-person-level-amounts.fixed.md b/changelog.d/ca-ssp-person-level-amounts.fixed.md new file mode 100644 index 00000000000..2632e1f0ffc --- /dev/null +++ b/changelog.d/ca-ssp-person-level-amounts.fixed.md @@ -0,0 +1 @@ +Compute the California state supplement per person with one standard for each living arrangement, which stops facility residents getting stacked amounts and pays blind children, adult dependents, children in facilities and unrelated people sharing an SPM unit the right levels. `ca_state_supplement_eligible_person` now shows whether a person is paid a supplement, so it is false when income leaves none. diff --git a/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml b/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml index c97d5469501..b944dc07b32 100644 --- a/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/local/ca/sbd/general_relief/income/sources/unearned.yaml @@ -49,7 +49,7 @@ values: # other program's budget covers the recipient, so neither their SSI # nor their other income is charged to the AU. SSP # (ca_state_supplement) and CAPI (ca_capi) recipients are barred the - # same way, so those unit-level benefits never enter AU income either. + # same way, so those benefits never enter AU income either. - ssi metadata: diff --git a/policyengine_us/parameters/gov/states/ca/cdss/state_supplement/payment_standard/allowance/medical_care_facility_couple.yaml b/policyengine_us/parameters/gov/states/ca/cdss/state_supplement/payment_standard/allowance/medical_care_facility_couple.yaml new file mode 100644 index 00000000000..24c0797629a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/cdss/state_supplement/payment_standard/allowance/medical_care_facility_couple.yaml @@ -0,0 +1,34 @@ +description: California adds this state share to the federal payment cap for a couple in a Title XIX medical facility under the State Supplementary Payment program. +metadata: + unit: currency-USD + period: month + label: California state supplement medical care facility couple state share + reference: + - title: California Welfare and Institutions Code Division 9, Part 3, Chapter 3, Article 5, Section 12200 (h) + href: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200 + - title: SSA POMS SI 01415.058 - Federally Administered Optional Supplementary Payment Programs for January 2026, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415058#b2b + - title: SSA POMS SI 01415.057 - Federally Administered Optional Supplementary Payment Programs for January 2025, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415057#b2b + - title: SSA POMS SI 01415.056 - Federally Administered Optional Supplementary Payment Programs for January 2024, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415056#b2b + - title: SSA POMS SI 01415.045 - Federally Administered Optional Supplementary Payment Programs for January 2013, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415045#b2b + - title: SSA POMS SI 01415.049 - Federally Administered Optional Supplementary Payment Programs for January 2017, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415049#b2b + - title: SSA POMS SI 01415.054 - Federally Administered Optional Supplementary Payment Programs for January 2022, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415054#b2b + - title: SSA POMS SI 01415.055 - Federally Administered Optional Supplementary Payment Programs for January 2023, California couple payment levels + href: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415055#b2b + - title: California Department of Social Services, All County Information Notice I-71-22 + href: https://www.cdss.ca.gov/Portals/9/Additional-Resources/Letters-and-Notices/ACINs/2022/I-71_22.pdf#page=5 +values: + 1991-01-01: 24 # $84 - $60 + # Shares for 1992 through 2012 are not added yet, so the 1991 share carries forward (issue 10480). + 2013-01-01: 40 + 2017-01-01: 42 + 2022-01-01: 52 + # The $117 couple total is one dollar less than twice the $59 individual total. + 2023-01-01: 57 + # The share holds for January 2024 through 2026. + 2024-01-01: 64 diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index bd733f830c1..ba253b611bc 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -21,6 +21,8 @@ values: # facility on the recipient's behalf. - ak_ssp - al_ssp + # ca_state_supplement only adds up this person-level variable. + - ca_state_supplement_person # co_oap has an annual definition period; policyengine-core's # calculate_divide converts it to a monthly amount here. - co_oap @@ -74,10 +76,6 @@ values: # special need payments (or_ssp) from SNAP income as reimbursements. Its # nursing facility payment goes to institution residents, who are not SNAP # households under 7 CFR 273.1(b)(7)(vi). - # Listed elsewhere: ca_state_supplement is an SPM unit variable with no - # person-level counterpart. policyengine-core projects a group value onto - # every member, so listing it here would count it once per person in the - # SPM unit. It is listed in unearned_spm_unit.yaml instead. # (ii) - pension_income # Includes annuities. - veterans_benefits diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned_spm_unit.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned_spm_unit.yaml index ccee01cc293..bba0008edf8 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned_spm_unit.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned_spm_unit.yaml @@ -5,16 +5,8 @@ values: # (i) Unit-level assistance payments are counted in full since they # cannot be attributed to an individual ineligible member. - tanf - # (i) California's SSI state supplement is an SPM unit variable with no - # person-level counterpart, so it is counted here rather than in - # unearned.yaml. 273.9(b)(2)(i) counts assistance payments from federally - # aided public assistance programs such as SSI, and Welfare and - # Institutions Code 12200 pays the supplement to the recipient. - - ca_state_supplement metadata: reference: - title: 7 CFR 273.9(b)(2) href: https://www.law.cornell.edu/cfr/text/7/273.9#b_2 - - title: California Welfare and Institutions Code 12200 - href: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 4cb94f1a03b..15c6105f9bd 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1354,7 +1354,7 @@ programs: variable: ca_state_supplement parameter_prefix: gov.states.ca.cdss.state_supplement verified_years: "2025-2026" - notes: Payment standards verified for independent living, no cooking facilities, blind and disabled minor categories. Facility and household-of-another arrangements are not verified (issue 7892). + notes: Payment standards verified against POMS SI 01415.058, except household-of-another levels, children with a non-parent relative or guardian, and private medical facilities, which are not modeled (issue 7892). - state: CT status: complete name: Connecticut SSP diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml index f2420462043..5b413dbdc4b 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.yaml @@ -105,11 +105,11 @@ person1: age: 68 ssi: 0 + # An SSP-only case: a positive state supplement with no federal SSI. + ca_state_supplement_person: 200 spm_units: spm_unit: members: [person1] - # An SSP-only case: a positive state supplement with no federal SSI. - ca_state_supplement: 200 tanf: 0 households: household: @@ -139,8 +139,6 @@ members: [person1] # $2,400 per year is $200 per month of CAPI. ca_capi: 2_400 - # Pin the CA state supplement off so only CAPI is in play. - ca_state_supplement: 0 tanf: 0 households: household: @@ -164,9 +162,6 @@ spm_units: spm_unit: members: [person1] - # A positive computed supplement that is never actually received, - # since the SSI/SSP payment is not taken up. - ca_state_supplement: 200 tanf: 0 households: household: @@ -174,12 +169,13 @@ in_sbd: true state_code: CA output: - # ca_state_supplement is an ungated computed entitlement; with take-up - # declined no SSP check arrives, so the bar lifts like the ssi arm. + # The supplement follows SSI take-up, so with take-up declined no SSP check + # arrives and the bar lifts like the ssi arm. ca_sbd_general_relief_receives_other_cash_assistance: false - name: Case 9, a disabled child with an SSP-only payment is barred, but the parent is not. period: 2026-01 + absolute_error_margin: 0.01 input: people: person1: @@ -193,8 +189,6 @@ spm_units: spm_unit: members: [person1, person2] - # An SSP-only case: a positive state supplement with no federal SSI. - ca_state_supplement: 200 tanf: 0 households: household: @@ -202,6 +196,61 @@ in_sbd: true state_code: CA output: - # The child is eligible for the state supplement as a disabled dependent - # under 18; the parent is not aged, blind or disabled. + # The child takes the 97.27 disabled minor share with no federal SSI; the + # parent is not aged, blind or disabled. + ca_state_supplement_person: [0, 97.27] ca_sbd_general_relief_receives_other_cash_assistance: [false, true] + +- name: Case 10, a disabled child with too much income for SSP is not barred by a grandparent's SSP. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + # $1,250 per month, half of the other parent's $2,500 SSDI benefit. + social_security_dependents: 15_000 + person3: + age: 70 + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + marital_unit3: + members: [person3] + tax_units: + tax_unit1: + members: [person1, person2] + tax_unit2: + members: [person3] + families: + family1: + members: [person1, person2] + family2: + members: [person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: CA + county_str: SAN_BERNARDINO_COUNTY_CA + output: + # The child's countable income, 1,250 - 20 = 1,230, is above their + # 994 + 97.27 = 1,091.27 standard, so they get neither SSI nor SSP. + ssi: [0, 0, 994] + ca_state_supplement_eligible_person: [false, false, true] + # The child's excess income does not reduce the grandparent's supplement. + ca_state_supplement_person: [0, 0, 239.94] + ca_sbd_general_relief_receives_other_cash_assistance: [false, false, true] + # The parent and child stay in the assistance unit. The child's income is + # above the $615 grant for two, so General Relief pays nothing. + ca_sbd_general_relief_assistance_unit_size: 2 + ca_sbd_general_relief_countable_income: 1_250 + ca_sbd_general_relief: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/income/ca_sbd_general_relief_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/income/ca_sbd_general_relief_countable_income.yaml index fbf28cc4a02..5ce4e5ce0b9 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/income/ca_sbd_general_relief_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/income/ca_sbd_general_relief_countable_income.yaml @@ -72,13 +72,12 @@ age: 65 social_security: 3_600 ssi: 0 + # Pin the CA state supplement off: state_code defaults to CA, so it + # would otherwise self-compute for the aged member and bar them. + ca_state_supplement_person: 0 spm_units: spm_unit: members: [person1] - # Pin the CA state supplement off: state_code defaults to CA, so it - # would otherwise self-compute for the aged member and count as - # unit income. - ca_state_supplement: 0 households: household: members: [person1] @@ -167,11 +166,11 @@ self_employment_income: -12_000 social_security: 3_600 ssi: 0 + # Pin the CA state supplement off (see Case 4). + ca_state_supplement_person: 0 spm_units: spm_unit: members: [person1] - # Pin the CA state supplement off (see Case 4). - ca_state_supplement: 0 households: household: members: [person1] @@ -251,8 +250,6 @@ members: [person1] # $2,400 per year is $200 per month of CAPI. ca_capi: 2_400 - # Pin the CA state supplement off (see Case 4). - ca_state_supplement: 0 households: household: members: [person1] @@ -270,11 +267,11 @@ person1: age: 68 ssi: 0 + # $200 per month of state supplement (an SSP-only case). + ca_state_supplement_person: 200 spm_units: spm_unit: members: [person1] - # $200 per month of state supplement (an SSP-only case). - ca_state_supplement: 200 households: household: members: [person1] diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/integration.yaml index c2fc70ad4f4..b3073989bd0 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/sbd/general_relief/integration.yaml @@ -118,14 +118,14 @@ # $5,400 per year is $450 per month of Social Security. social_security: 5_400 ssi: 0 + # Pin the CA state supplement off: state_code defaults to CA, so it + # would otherwise self-compute for the aged member and bar them, + # excluding their income and leaving an empty unit. + ca_state_supplement_person: 0 spm_units: spm_unit: members: [person1] tanf: 0 - # Pin the CA state supplement off: state_code defaults to CA, so it - # would otherwise self-compute for the aged member and bar them, - # excluding their income and leaving an empty unit. - ca_state_supplement: 0 households: household: members: [person1] @@ -148,12 +148,12 @@ age: 65 social_security: 5_400 ssi: 0 + # Pin the CA state supplement off (see Case 4). + ca_state_supplement_person: 0 spm_units: spm_unit: members: [person1] tanf: 0 - # Pin the CA state supplement off (see Case 4). - ca_state_supplement: 0 households: household: members: [person1] @@ -376,6 +376,9 @@ person2: age: 68 ssi: 0 + # $200 per month of state supplement with no federal SSI (an + # SSP-only case). + ca_state_supplement_person: 200 tax_units: tax_unit1: members: [person1] @@ -384,9 +387,6 @@ spm_units: spm_unit: members: [person1, person2] - # $200 per month of state supplement with no federal SSI (an - # SSP-only case). - ca_state_supplement: 200 tanf: 0 households: household: @@ -395,8 +395,8 @@ state_code: CA output: # The aged SSP recipient is barred like an SSI recipient, and a barred - # member's income — including the unit-level supplement that serves - # them — is excluded from AU income entirely. + # member's income, including the supplement that serves them, is excluded + # from AU income entirely. ca_sbd_general_relief_receives_other_cash_assistance: [false, true] ca_sbd_general_relief_eligible_person: [true, false] ca_sbd_general_relief_assistance_unit_size: 1 @@ -466,8 +466,6 @@ members: [person1, person2] # $2,400 per year is $200 per month of CAPI. ca_capi: 2_400 - # Pin the CA state supplement off so only CAPI is in play. - ca_state_supplement: 0 tanf: 0 households: household: diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml index ef3534832d9..b9c9d8714c1 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi.yaml @@ -86,7 +86,6 @@ state_code: CA output: ssi: [11_316, 0] - ca_state_supplement_dependent_amount: 0 # 239.94 * 12. ca_state_supplement: 2_879.28 ca_capi: 0 @@ -113,9 +112,6 @@ output: ssi: [0, 0] ca_state_supplement_eligible_person: [false, false] - ca_state_supplement_aged_disabled_count: 0 - ca_state_supplement_blind_amount: 0 - ca_state_supplement_aged_blind_disabled_amount: 0 ca_state_supplement: 0 # Disabled individual standard 1,233.94 per month with no offset. Living # arrangements allow food preparation by default, so no no-cooking food diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi_person.yaml index 5d896e48077..2fc79a0912a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/capi/ca_capi_person.yaml @@ -194,6 +194,7 @@ # being reworked separately. ssi: 994 ssi_countable_income: 0 + ca_state_supplement_person: 239.94 person2: age: 68 immigration_status: LEGAL_PERMANENT_RESIDENT @@ -208,10 +209,6 @@ marital_units: marital_unit: members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - ca_state_supplement: 239.94 households: household: members: [person1, person2] @@ -372,6 +369,7 @@ pension_income: 5_040 ssi: 594 ssi_countable_income: 4_800 + ca_state_supplement_person: 239.94 person2: age: 68 immigration_status: LEGAL_PERMANENT_RESIDENT @@ -380,10 +378,6 @@ marital_units: marital_unit: members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - ca_state_supplement: 239.94 households: household: members: [person1, person2] @@ -632,3 +626,88 @@ ssi_countable_income: 980 ca_capi_payment_standard: 931.72 ca_capi_person: 0 + +- name: Case 20, disabled noncitizen child of a citizen couple with no marital units is not the couple's partner. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + person3: + age: 10 + is_tax_unit_dependent: true + is_disabled: true + meets_ssi_disability_criteria: true + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + households: + household: + members: [person1, person2, person3] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # With no marital units everyone shares one unit, but the parents' SSI and + # supplement are not spouse income to the child: 994 + 97.27 = 1,091.27. + ca_capi_person: [0, 0, 1_091.27] + +- name: Case 21, CAPI spouse with no marital units does not count a citizen child's SSI and supplement as the spouse's. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + person3: + age: 10 + is_tax_unit_dependent: true + is_disabled: true + meets_ssi_disability_criteria: true + households: + household: + members: [person1, person2, person3] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # Only the citizen spouse's 745.50 SSI and 488.44 supplement count: + # 2,098.83 - 745.50 - 488.44 = 864.89. + ca_capi_person: [0, 864.89, 0] + +- name: Case 22, CAPI child with no marital units is not a second CAPI member of a mixed couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 72 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + person3: + age: 10 + is_tax_unit_dependent: true + is_disabled: true + meets_ssi_disability_criteria: true + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + households: + household: + members: [person1, person2, person3] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # The same amounts as Case 12, which has explicit marital units. + ca_capi_person: [0, 864.89, 1_091.27] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement.yaml index e83be2284e8..195bc6357fb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement.yaml @@ -1,21 +1,3 @@ -- name: Payment standard fully reduced - period: 2024 - input: - ssi: 1_200 - ca_state_supplement_payment_standard: 1_000 - state_code: CA - output: - ca_state_supplement: 0 - -- name: Payment standard partially reduced - period: 2024 - input: - ssi: 1_200 - ca_state_supplement_payment_standard: 2_000 - state_code: CA - output: - ca_state_supplement: 800 - - name: Case 3, disabled SSI recipient receives state supplement. period: 2024 absolute_error_margin: 0.01 @@ -38,8 +20,8 @@ living_arrangements_allow_for_food_preparation: true output: ca_state_supplement_eligible_person: true - # (943 + 239.94) * 12 - 3,458.28. - ca_state_supplement: 10_737 + # 239.94 * 12. + ca_state_supplement: 2_879.28 # 2026: federal SSI is $994 (individual) and $1,491 (couple); the California # payment standard is $1,233.94 (individual) and $2,098.83 (couple), per CDSS, @@ -63,7 +45,6 @@ living_arrangements_allow_for_food_preparation: true output: ssi: 11_928 # 994 * 12 - ca_state_supplement_payment_standard: 14_807.28 # 1,233.94 * 12 ca_state_supplement: 2_879.28 # (1,233.94 - 994) * 12 - name: Case 5, 2026 aged couple living independently with no income. @@ -95,8 +76,9 @@ living_arrangements_allow_for_food_preparation: true output: ssi: [8_946, 8_946] # 1,491 * 12 / 2 - ca_state_supplement_payment_standard: 25_185.96 # 2,098.83 * 12 - ca_state_supplement: 7_293.96 # (2,098.83 - 1,491) * 12 + # (2,098.83 - 1,491) / 2 = 303.915 each, which federal administration + # rounds up to 303.92, or 3,647.04 a year each. + ca_state_supplement: 7_294.08 - name: Case 6, 2026 aged individual with Social Security below the federal benefit rate. period: 2026 @@ -253,8 +235,6 @@ # 995 and 1,362.81 a month. SSI is 994 - 993 = 1 a month for person1 and 0 # for the rest. ssi: [12, 0, 0, 0, 0, 0] - ca_state_supplement_payment_standard: - [14_807.28, 14_807.28, 14_807.28, 14_807.28, 16_353.72, 16_353.72] # The supplement is the standard less SSI and countable income: # 1,233.94 - 1 - 993 = 239.94; 1,233.94 - 994 = 239.94; 1,233.94 - 995 = # 238.94; 1,233.94 - 1,233.94 = 0; 1,362.81 - 995 = 367.81; @@ -351,11 +331,11 @@ # a month, each at or above the 1,491 couple federal benefit rate, so SSI # is 0. ssi: [0, 0, 0, 0, 0, 0, 0, 0] - ca_state_supplement_payment_standard: [25_185.96, 25_185.96, 28_278.84, 28_278.84] # The supplement is the standard less countable income: - # 2,098.83 - 1,491 = 607.83; 2,098.83 - 2,098.83 = 0; - # 2,356.57 - 2,098.83 = 257.74; 2,356.57 - 2,356.57 = 0. - ca_state_supplement: [7_293.96, 0, 3_092.88, 0] + # 2,098.83 - 1,491 = 607.83, half rounded up to 303.92 for each spouse; + # 2,098.83 - 2,098.83 = 0; 2,356.57 - 2,098.83 = 257.74; 2,356.57 - 2,356.57 + # = 0. + ca_state_supplement: [7_294.08, 0, 3_092.88, 0] # A CAPI-eligible member's income does not reduce the state supplement: CAPI # budgets its own members' income (CAPI regulations MPP 49-035), and SSI/SSP @@ -407,7 +387,6 @@ ssi: [5_844, 0] # 487 * 12 # One eligible aged member without cooking facilities, so the standard is # 1,206.94 + 128.87 = 1,335.81. - ca_state_supplement_payment_standard: 16_029.72 # 1,335.81 * 12 # The supplement is 1,335.81 - 487 - 480 = 368.81 a month; person2's 480 # is not counted. ca_state_supplement: 4_425.72 # 368.81 * 12 @@ -464,7 +443,6 @@ ssi: [2_820, 0] # 235 * 12 # One eligible aged member without cooking facilities, so the standard is # 1,206.94 + 128.87 = 1,335.81. - ca_state_supplement_payment_standard: 16_029.72 # 1,335.81 * 12 # The supplement counts the citizen's own 500 - 20 = 480: # 1,335.81 - 235 - 480 = 620.81 a month. ca_state_supplement: 7_449.72 # 620.81 * 12 @@ -508,7 +486,6 @@ # Each has 500 - 20 = 480 a month of countable income. ssi_countable_income: [5_760, 5_760] ssi: [5_844, 0] # 487 * 12 - ca_state_supplement_payment_standard: 16_029.72 # 1,335.81 * 12 # A sibling's income is never deemed to an SSI/SSP recipient # (20 CFR 416.1160(a)), so the supplement stays 1,335.81 - 487 - 480 = # 368.81 a month. @@ -681,6 +658,32 @@ living_arrangements_allow_for_food_preparation: true output: ssi: 12_348 # 1,029 * 12 - ca_state_supplement_payment_standard: 15_227.28 # (1,029 + 239.94) * 12 # CDSS projects the 239.94 share for January 2027 (2026 May Revision, page 27). ca_state_supplement: 2_879.28 # 239.94 * 12 + +- name: Case 18, 2026 mixed couple's supplement rounds up to the next cent like other federal payments. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 72 + immigration_status: CITIZEN + social_security_retirement: 9_601 # 800.0833 a month + person2: + age: 68 + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + pension_income: 9_600 # 800 a month + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # 1,233.94 - 0 - (800.0833 - 20) = 453.8567, which rounds up to 453.86 + # (POMS SI 02001.010 A.2). + ca_state_supplement_person: [453.86, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_blind_disabled_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_blind_disabled_amount.yaml deleted file mode 100644 index 2f69bb37f6b..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_blind_disabled_amount.yaml +++ /dev/null @@ -1,17 +0,0 @@ -- name: Aged disabled amount greater than blind amount - period: 2024 - input: - ca_state_supplement_blind_amount: 1_000 - ca_state_supplement_aged_disabled_amount: 2_000 - state_code: CA - output: - ca_state_supplement_aged_blind_disabled_amount: 2_000 - -- name: Aged disabled amount smaller than blind amount - period: 2024 - input: - ca_state_supplement_blind_amount: 1_800 - ca_state_supplement_aged_disabled_amount: 1_000 - state_code: CA - output: - ca_state_supplement_aged_blind_disabled_amount: 1_800 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_disabled_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_disabled_amount.yaml deleted file mode 100644 index 851bae1877d..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_disabled_amount.yaml +++ /dev/null @@ -1,74 +0,0 @@ -- name: Single aged parent, blind - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - person2: - age: 4 - is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2] - spm_unit_is_married: false - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_aged_disabled_amount: 14_195.28 # (943 + 239.94) * 12 - -- name: Married couple, aged and disabled - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - person2: - age: 64 - is_tax_unit_spouse: true - is_disabled: true - meets_ssi_disability_criteria: true - person3: - age: 4 - is_tax_unit_dependent: true - is_blind: true - spm_units: - spm_unit: - members: [person1, person2, person3] - spm_unit_is_married: true - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_aged_disabled_amount: 24_273.96 # (1,415 + 607.83) * 12 - -- name: Married couple, only one aged and disabled - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - person2: - age: 64 - is_tax_unit_spouse: true - person3: - age: 4 - is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2, person3] - spm_unit_is_married: true - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_aged_disabled_amount: 14_195.28 # (943 + 239.94) * 12 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_disabled_count.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_disabled_count.yaml deleted file mode 100644 index 661e94c67e9..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_aged_disabled_count.yaml +++ /dev/null @@ -1,96 +0,0 @@ -- name: Two aged and disabled people - period: 2024 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - is_disabled: false - person2: - age: 64 - is_tax_unit_spouse: true - is_disabled: true - meets_ssi_disability_criteria: true - person3: - age: 4 - is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2, person3] - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_aged_disabled_count: 2 - -- name: One aged and disabled person - period: 2024 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - is_disabled: false - person2: - age: 64 - is_tax_unit_spouse: false - is_disabled: false - person3: - age: 4 - is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2, person3] - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_aged_disabled_count: 1 - -- name: No aged or disabled head or spouse - period: 2024 - input: - people: - person1: - age: 60 - is_tax_unit_head: true - is_disabled: false - person2: - age: 64 - is_tax_unit_spouse: false - is_disabled: false - person3: - age: 4 - is_tax_unit_dependent: true - is_disabled: true - meets_ssi_disability_criteria: true - spm_units: - spm_unit: - members: [person1, person2, person3] - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_aged_disabled_count: 0 - -- name: Case 4, SSI disability criteria count as disabled. - period: 2024 - input: - people: - person1: - age: 45 - is_tax_unit_head: true - meets_ssi_disability_criteria: true - ssi_engaged_in_sga: false - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - output: - ca_state_supplement_aged_disabled_count: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_blind_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_blind_amount.yaml deleted file mode 100644 index b2f20a1a314..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_blind_amount.yaml +++ /dev/null @@ -1,26 +0,0 @@ -- name: Married couple, one blind - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - is_blind: true - person2: - age: 64 - is_tax_unit_spouse: true - is_blind: true - person3: - age: 4 - is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2, person3] - spm_unit_is_married: true - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_blind_amount: 26_980.2 # (1,415 + 833.35) * 12 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_dependent_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_dependent_amount.yaml deleted file mode 100644 index 2768c18560c..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_dependent_amount.yaml +++ /dev/null @@ -1,152 +0,0 @@ -- name: One eligible dependent - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - is_blind: true - person2: - age: 4 - is_tax_unit_dependent: true - is_blind: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_dependent_amount: 12_483.24 # (943 + 97.27) * 12 - -- name: One eligible dependent, one ineligible - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - is_blind: true - person2: - age: 4 - is_tax_unit_dependent: true - is_blind: true - person3: - age: 4 - is_tax_unit_dependent: true - is_blind: false - spm_units: - spm_unit: - members: [person1, person2, person3] - households: - household: - members: [person1, person2, person3] - state_code: CA - output: - ca_state_supplement_dependent_amount: 12_483.24 # (943 + 97.27) * 12 - -- name: Case 3, SSI disability criteria qualify a dependent. - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - person2: - age: 4 - is_tax_unit_dependent: true - meets_ssi_disability_criteria: true - ssi_engaged_in_sga: false - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_dependent_amount: 12_483.24 # (943 + 97.27) * 12 - -- name: Case 4, disabled noncitizen child who fails SSI's noncitizen test gets CAPI, not the state supplement. - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 40 - immigration_status: LEGAL_PERMANENT_RESIDENT - ssi_qualifying_quarters_earnings: 39 - person2: - age: 10 - is_disabled: true - meets_ssi_disability_criteria: true - immigration_status: LEGAL_PERMANENT_RESIDENT - ssi_qualifying_quarters_earnings: 39 - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - # The child fails SSI's 40-quarter test, so the state supplement leaves - # out the child's standard (WIC 18938, 18941) and CAPI pays the disabled - # minor standard 994 + 97.27 = 1,091.27. - ca_capi_person: [0, 1_091.27] - ca_state_supplement_dependent_amount: 0 - ca_state_supplement: 0 - -- name: Case 5, disabled citizen child keeps the state supplement above SSI. - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 40 - immigration_status: CITIZEN - person2: - age: 10 - is_disabled: true - meets_ssi_disability_criteria: true - immigration_status: CITIZEN - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - # SSI 994; the state supplement tops the child up to the disabled minor - # standard: 1,091.27 - 994 = 97.27. - ssi: [0, 994] - ca_state_supplement: 97.27 - -- name: Case 6, disabled citizen child who fails SSI's resource test gets no state supplement. - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 40 - immigration_status: CITIZEN - person2: - age: 10 - is_disabled: true - meets_ssi_disability_criteria: true - immigration_status: CITIZEN - bank_account_assets: - '2026': 3_000 - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - # The child's 3,000 of countable resources exceed SSI's 2,000 limit (20 - # CFR 416.1205), so the child gets no SSI and no dependent amount. - meets_ssi_resource_test: [true, false] - ssi: [0, 0] - ca_state_supplement_dependent_amount: 0 - ca_state_supplement: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml index 0d53fc82ed2..25cb8d64edb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.yaml @@ -1,97 +1,139 @@ -- name: Eligible citizen - period: 2024 +- name: Case 1, aged citizen with no income is eligible. + period: 2026-01 input: - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: true - is_ssi_qualified_noncitizen: false - immigration_status: CITIZEN - state_code: CA + people: + person1: + age: 70 + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: CA output: ca_state_supplement_eligible_person: true -- name: Ineligible based on immigration status - period: 2024 +- name: Case 2, aged noncitizen who fails SSI's noncitizen test is not eligible. + period: 2026-01 input: - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: true - is_ssi_qualified_noncitizen: false - immigration_status: LEGAL_PERMANENT_RESIDENT - state_code: CA + people: + person1: + age: 70 + is_ssi_qualified_noncitizen: false + immigration_status: LEGAL_PERMANENT_RESIDENT + households: + household: + members: [person1] + state_code: CA output: ca_state_supplement_eligible_person: false -- name: Not aged or disabled - period: 2024 +- name: Case 3, person who is not aged, blind or disabled is not eligible. + period: 2026-01 input: - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: false - is_ssi_qualified_noncitizen: false - immigration_status: CITIZEN - state_code: CA + people: + person1: + age: 40 + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: CA output: ca_state_supplement_eligible_person: false -- name: Does not meet resource test - period: 2024 +- name: Case 4, aged person who fails the resource test is not eligible. + period: 2026-01 input: - meets_ssi_resource_test: false - is_ssi_aged_blind_disabled: true - is_ssi_qualified_noncitizen: false - immigration_status: CITIZEN - state_code: CA + people: + person1: + age: 70 + meets_ssi_resource_test: false + immigration_status: CITIZEN + households: + household: + members: [person1] + state_code: CA output: ca_state_supplement_eligible_person: false -- name: Disabled dependent child below the age limit - period: 2026 +- name: Case 5, disabled dependent under 18 is eligible. + period: 2026-01 input: people: person1: - age: 33 - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: false - immigration_status: CITIZEN + age: 40 + is_tax_unit_head: true person2: - age: 17 - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: true - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] + age: 3 + is_tax_unit_dependent: true + is_disabled: true + meets_ssi_disability_criteria: true households: household: members: [person1, person2] state_code: CA output: - is_tax_unit_dependent: [false, true] ca_state_supplement_eligible_person: [false, true] -- name: Disabled dependent at the age limit - period: 2026 +- name: Case 6, disabled dependent aged 18 is eligible. + period: 2026-01 input: people: person1: - age: 45 - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: false - immigration_status: CITIZEN + age: 50 + is_tax_unit_head: true person2: age: 18 - # Input so the age-ordered fallback does not make them the spouse. is_tax_unit_dependent: true - meets_ssi_resource_test: true - is_ssi_aged_blind_disabled: true - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] + is_disabled: true + meets_ssi_disability_criteria: true households: household: members: [person1, person2] state_code: CA output: - # Known limitation: POMS SI 01415.058 pays a disabled dependent aged 18 or - # older the adult rate, but the model pays them nothing and leaves the - # flag false (issue 10557). - ca_state_supplement_eligible_person: [false, false] + # The supplement has no tax-role condition, so an adult dependent takes the + # individual share. + ca_state_supplement_eligible_person: [false, true] + +- name: Case 7, income above the federal rate but below the California standard leaves the person eligible with no SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + immigration_status: CITIZEN + social_security_retirement: 13_200 # 1,100 a month + households: + household: + members: [person1] + state_code: CA + output: + # Countable income of 1,100 - 20 = 1,080 is above the 994 federal rate but + # below the 1,233.94 standard: 1,233.94 - 1,080 = 153.94. + is_ssi_eligible: true + ssi: 0 + ca_state_supplement_person: 153.94 + ca_state_supplement_eligible_person: true + +- name: Case 8, income above the California standard makes an otherwise SSI-eligible person not eligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + immigration_status: CITIZEN + social_security_retirement: 24_000 # 2,000 a month + households: + household: + members: [person1] + state_code: CA + output: + # is_ssi_eligible has no income test, but countable income of 2,000 - 20 = + # 1,980 is above the 1,233.94 standard, so no supplement is left to pay. + is_ssi_eligible: true + ssi: 0 + ca_state_supplement_person: 0 + ca_state_supplement_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_food_allowance.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_food_allowance.yaml deleted file mode 100644 index adc38888fa3..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_food_allowance.yaml +++ /dev/null @@ -1,262 +0,0 @@ -- name: Married couple, one person aged - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - person2: - age: 40 - is_tax_unit_spouse: true - is_disabled: false - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ca_state_supplement_food_allowance: 1_546.44 # 128.87 * 12 - -- name: Married couple, one person aged, not eligible - period: 2024 - input: - people: - person1: - age: 68 - is_tax_unit_head: true - person2: - age: 40 - is_tax_unit_spouse: true - is_disabled: false - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_food_allowance: 0 - -- name: Married couple, nobody aged or disabled - period: 2024 - input: - people: - person1: - age: 40 - is_tax_unit_head: true - person2: - age: 40 - is_tax_unit_spouse: true - is_disabled: false - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ca_state_supplement_food_allowance: 0 - -- name: Married couple, both disabled - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 40 - is_tax_unit_head: true - is_disabled: true - meets_ssi_disability_criteria: true - person2: - age: 40 - is_tax_unit_spouse: true - is_disabled: true - meets_ssi_disability_criteria: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ca_state_supplement_food_allowance: 3_092.88 # 257.74 * 12 - -- name: Eligible married household with two aged or disabled people - period: 2024 - absolute_error_margin: 0.01 - input: - ca_state_supplement_food_allowance_eligible: true - spm_unit_is_married: true - ca_state_supplement_aged_disabled_count: 2 - state_code: CA - output: - ca_state_supplement_food_allowance: 3_092.88 # 257.74 * 12 - -- name: 2026 couple of an aged person and a blind person under 65 without cooking facilities gets no food allowance - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - person2: - age: 50 - is_tax_unit_spouse: true - is_blind: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - # The couple is paid the one-blind rate (WIC 12200(b)), and 12200(e) - # gives the allowance only under (c) or (d): no food allowance. The - # aged amount with the allowance, 1,233.94 + 128.87 = 1,362.81, is below - # the one-blind couple amount, so the standard is 2,238.44. - ca_state_supplement_food_allowance: 0 - ca_state_supplement_payment_standard: 2_238.44 - -- name: 2026 aged couple with one blind spouse without cooking facilities gets the aged couple amount with the food allowance - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - is_blind: true - person2: - age: 68 - is_tax_unit_spouse: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - # Both spouses are aged, so the couple also qualifies under WIC 12200(d) - # with the (e) allowance: 2,098.83 + 257.74 = 2,356.57, above the - # one-blind rate of 2,238.44. California pays the highest category, so - # the allowance adds 2,356.57 - 2,238.44 = 118.13 to the blind amount. - ca_state_supplement_food_allowance: 118.13 - ca_state_supplement_payment_standard: 2_356.57 - -- name: 2026 single aged and blind person without cooking facilities gets the higher of the blind amount and the aged amount with the food allowance - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - is_blind: true - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - # The aged amount with the (e) allowance, 1,233.94 + 128.87 = 1,362.81, - # is above the blind amount of 1,318.32 (WIC 12200(a), (c), (e)). The - # allowance adds 1,362.81 - 1,318.32 = 44.49 to the blind amount. - ca_state_supplement_food_allowance: 44.49 - ca_state_supplement_payment_standard: 1_362.81 - -- name: 2026 aged couple with both spouses blind without cooking facilities gets the aged couple amount with the food allowance - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - is_blind: true - person2: - age: 68 - is_tax_unit_spouse: true - is_blind: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - # The aged couple amount with the (e) allowance, 2,098.83 + 257.74 = - # 2,356.57, is above the two-blind rate of 2,324.35 (WIC 12200(a), (d), - # (e)). The allowance adds 2,356.57 - 2,324.35 = 32.22. - ca_state_supplement_food_allowance: 32.22 - ca_state_supplement_payment_standard: 2_356.57 - -- name: 2026 couple of a disabled person and a blind person under 65 without cooking facilities gets no food allowance - period: 2026-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 50 - is_tax_unit_head: true - is_disabled: true - meets_ssi_disability_criteria: true - person2: - age: 45 - is_tax_unit_spouse: true - is_blind: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - # As for an aged person: the one-blind couple rate under WIC 12200(b), - # 2,238.44, is above 1,233.94 + 128.87 = 1,362.81, and (e) adds nothing. - ca_state_supplement_food_allowance: 0 - ca_state_supplement_payment_standard: 2_238.44 - -- name: 2025 single aged and blind person without cooking facilities gets the aged amount with the food allowance - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - is_blind: true - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - # 1,206.94 + 128.87 = 1,335.81 is above the 2025 blind amount of 1,291.32, - # so the allowance adds 1,335.81 - 1,291.32 = 44.49. - ca_state_supplement_food_allowance: 44.49 - ca_state_supplement_payment_standard: 1_335.81 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_food_allowance_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_food_allowance_eligible.yaml deleted file mode 100644 index a19d00f2588..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_food_allowance_eligible.yaml +++ /dev/null @@ -1,156 +0,0 @@ -- name: Living arrangements allow for food preparation - period: 2024 - input: - ca_state_supplement_aged_disabled_count: 1 - living_arrangements_allow_for_food_preparation: true - state_code: CA - output: - ca_state_supplement_food_allowance_eligible: false - -- name: Eligible - period: 2024 - input: - ca_state_supplement_aged_disabled_count: 1 - living_arrangements_allow_for_food_preparation: false - state_code: CA - output: - ca_state_supplement_food_allowance_eligible: true - -- name: No aged or disabled people - period: 2024 - input: - ca_state_supplement_aged_disabled_count: 0 - living_arrangements_allow_for_food_preparation: false - state_code: CA - output: - ca_state_supplement_food_allowance_eligible: false - -- name: Food preparation not reported, so the living arrangement allows it by default - period: 2024 - input: - ca_state_supplement_aged_disabled_count: 1 - state_code: CA - output: - living_arrangements_allow_for_food_preparation: true - ca_state_supplement_food_allowance_eligible: false - -# Restaurant meals allowance (WIC 12200(e); SSA POMS SI SF01415.140). The -# allowance is paid only when the living arrangement prevents meal preparation -# at home, so a household without living_arrangements_allow_for_food_preparation -# set gets the regular independent-living standard. January 2025 amounts, per -# SSA POMS SI 01415.057 (California codes A and C): federal SSI $967 -# (individual) and $1,450 (couple); independent living $1,206.94 and $2,057.83; -# without cooking facilities $1,335.81 and $2,315.57. -- name: 2025 aged individual, food preparation not reported, gets the independent-living standard - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - immigration_status: CITIZEN - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - output: - ssi: 967 - ca_state_supplement_food_allowance_eligible: false - ca_state_supplement_food_allowance: 0 - ca_state_supplement_payment_standard: 1_206.94 - ca_state_supplement: 239.94 # 1,206.94 - 967 - -- name: 2025 aged individual whose living arrangement prevents food preparation gets the restaurant meals allowance - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - immigration_status: CITIZEN - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ssi: 967 - ca_state_supplement_food_allowance_eligible: true - ca_state_supplement_food_allowance: 128.87 # 1,335.81 - 1,206.94 - ca_state_supplement_payment_standard: 1_335.81 # 1,206.94 + 128.87 - ca_state_supplement: 368.81 # 1,335.81 - 967 - -- name: 2025 aged couple, food preparation not reported, gets the independent-living standard - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 83 - is_tax_unit_head: true - immigration_status: CITIZEN - person2: - age: 78 - is_tax_unit_spouse: true - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - marital_units: - marital_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ssi: [725, 725] # 1,450 / 2 - ca_state_supplement_food_allowance_eligible: false - ca_state_supplement_food_allowance: 0 - ca_state_supplement_payment_standard: 2_057.83 - ca_state_supplement: 607.83 # 2,057.83 - 1,450 - -- name: 2025 aged couple whose living arrangement prevents food preparation gets the restaurant meals allowance - period: 2025-01 - absolute_error_margin: 0.01 - input: - people: - person1: - age: 83 - is_tax_unit_head: true - immigration_status: CITIZEN - person2: - age: 78 - is_tax_unit_spouse: true - immigration_status: CITIZEN - tax_units: - tax_unit: - members: [person1, person2] - marital_units: - marital_unit: - members: [person1, person2] - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ssi: [725, 725] # 1,450 / 2 - ca_state_supplement_food_allowance_eligible: true - ca_state_supplement_food_allowance: 257.74 # 2,315.57 - 2,057.83 - ca_state_supplement_payment_standard: 2_315.57 # 2,057.83 + 257.74 - ca_state_supplement: 865.57 # 2,315.57 - 1,450 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml deleted file mode 100644 index 135fdf53edd..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_medical_care_facility_amount.yaml +++ /dev/null @@ -1,101 +0,0 @@ -- name: One person in medical care facility - period: 2024 - input: - people: - person1: - ca_in_medical_care_facility: true - ca_state_supplement_eligible_person: true - person2: - ca_in_medical_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_medical_care_facility_amount: 744 # (30 + 32) * 12 - -- name: Nobody in medical care facility - period: 2024 - input: - people: - person1: - ca_in_medical_care_facility: false - ca_state_supplement_eligible_person: true - person2: - ca_in_medical_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_medical_care_facility_amount: 0 - -- name: Ineligible person in medical care facility - period: 2024 - input: - people: - person1: - ca_in_medical_care_facility: true - ca_state_supplement_eligible_person: false - person2: - ca_in_medical_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_medical_care_facility_amount: 0 - -- name: 2026 one person in medical care facility - period: 2026-01 - input: - people: - person1: - ca_in_medical_care_facility: true - ca_state_supplement_eligible_person: true - person2: - ca_in_medical_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_medical_care_facility_amount: 62 - -- name: Dependent child in medical care facility gets no facility allowance - period: 2026-01 - input: - people: - person1: - ca_in_medical_care_facility: false - ca_state_supplement_eligible_person: true - person2: - age: 10 - ca_in_medical_care_facility: true - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - # The model pays a dependent child the dependent amount instead. - ca_state_supplement_medical_care_facility_amount: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml deleted file mode 100644 index 1e51fc2a718..00000000000 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_out_of_home_care_facility_amount.yaml +++ /dev/null @@ -1,102 +0,0 @@ -- name: One person in out of home care facility - period: 2024 - absolute_error_margin: 0.01 - input: - people: - person1: - in_out_of_home_care_facility: true - ca_state_supplement_eligible_person: true - person2: - in_out_of_home_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_out_of_home_care_facility_amount: 13_527.72 # (2 * (943 + 632.07) - (1,415 + 607.83)) * 12 - -- name: Nobody in out of home care facility - period: 2024 - input: - people: - person1: - in_out_of_home_care_facility: false - ca_state_supplement_eligible_person: true - person2: - in_out_of_home_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_out_of_home_care_facility_amount: 0 - -- name: Ineligible person in out of home care facility - period: 2024 - input: - people: - person1: - in_out_of_home_care_facility: true - ca_state_supplement_eligible_person: false - person2: - in_out_of_home_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_out_of_home_care_facility_amount: 0 - -- name: 2026 one person in out of home care facility - period: 2026-01 - input: - people: - person1: - in_out_of_home_care_facility: true - ca_state_supplement_eligible_person: true - person2: - in_out_of_home_care_facility: false - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - ca_state_supplement_out_of_home_care_facility_amount: 1_153.31 # 3,252.14 - 2,098.83 - -- name: Dependent child in out of home care facility gets no facility allowance - period: 2026-01 - input: - people: - person1: - in_out_of_home_care_facility: false - ca_state_supplement_eligible_person: true - person2: - age: 10 - in_out_of_home_care_facility: true - ca_state_supplement_eligible_person: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - output: - # The model pays a dependent child the dependent amount instead. - ca_state_supplement_out_of_home_care_facility_amount: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_person.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_person.yaml new file mode 100644 index 00000000000..d2f3667bd2c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/ca_state_supplement_person.yaml @@ -0,0 +1,921 @@ +- name: Case 1, aged individual living independently takes the code A level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # POMS SI 01415.058 B.2.a: 1,233.94 total less the 994 federal benefit rate. + ssi: 994 + ca_state_supplement_person: 239.94 + ca_state_supplement: 239.94 + +- name: Case 2, aged individual without cooking facilities takes the code C level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # WIC 12200(e): 239.94 + 128.87, the 1,362.81 total in POMS SI 01415.058 B.2.a. + ca_state_supplement_person: 368.81 + +- name: Case 3, blind individual without cooking facilities stays at the code A blind level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_blind: true + is_tax_unit_head: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # WIC 12200(e) gives the allowance only under (c) or (d), not the blind level in (a). + ca_state_supplement_person: 324.32 + +- name: Case 4, aged and blind individual without cooking facilities takes the higher code C level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_blind: true + is_tax_unit_head: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # California pays the highest category (POMS SI 01415.058 B.2.a note): 368.81 is above 324.32. + ca_state_supplement_person: 368.81 + +- name: Case 5, disabled dependent aged 17 takes the disabled minor level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 17 + is_disabled: true + meets_ssi_disability_criteria: true + is_tax_unit_dependent: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(f) and POMS SI 01415.058 code E: 1,091.27 total less 994. + ssi: [0, 994] + ca_state_supplement_person: [0, 97.27] + ca_state_supplement: 97.27 + +- name: Case 6, disabled dependent aged 18 takes the individual level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 18 + is_disabled: true + meets_ssi_disability_criteria: true + is_tax_unit_dependent: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # POMS SI 01415.058 B.1 code A covers a disabled child aged 18 or over living with a parent. + ca_state_supplement_person: [0, 239.94] + +- name: Case 7, blind dependent child takes the blind level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 10 + is_blind: true + is_tax_unit_dependent: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(a) and POMS SI 01415.058 B.1 code A cover a blind child living with a parent. + ca_state_supplement_person: [0, 324.32] + +- name: Case 8, disabled dependent child without cooking facilities gets no allowance. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + is_tax_unit_dependent: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # WIC 12200(e) gives the allowance only under (c) or (d), not the disabled minor level in (f). + ca_state_supplement_person: [0, 97.27] + +- name: Case 9, individual in nonmedical out-of-home care takes the code B level alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + in_out_of_home_care_facility: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(g) and POMS SI 01415.058 code B: 1,626.07 total less 994, not added to the + # independent-living level. + ca_state_supplement_person: 632.07 + +- name: Case 10, dependent child in nonmedical out-of-home care takes the code B level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + is_tax_unit_dependent: true + in_out_of_home_care_facility: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # POMS SI 01415.058 B.1 code B lists children in licensed facilities. + ca_state_supplement_person: [0, 632.07] + +- name: Case 11, Title XIX facility resident takes the code J level alone. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(h) and POMS SI 01415.058 code J: 62 total less the 30 federal payment cap. + ssi: 30 + ca_state_supplement_person: 32 + +- name: Case 12, dependent child in a Title XIX facility takes the code J level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + is_tax_unit_dependent: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + ssi: [0, 30] + ca_state_supplement_person: [0, 32] + +- name: Case 13, aged couple takes half of the couple level each. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(d) and POMS SI 01415.058 B.2.b: 607.83 for the couple. Half is 303.915, which + # federal administration rounds up to the next cent (ssi_state_supplement). + ssi: [745.5, 745.5] + ca_state_supplement_person: [303.92, 303.92] + ca_state_supplement: 607.84 + +- name: Case 14, blind couple takes half of the couple level each. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 50 + is_blind: true + is_tax_unit_head: true + person2: + age: 48 + is_blind: true + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(a): 833.35 / 2 = 416.675, rounded up. + ca_state_supplement_person: [416.68, 416.68] + +- name: Case 15, couple of a blind person and an aged person takes the one-blind level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + is_blind: true + is_tax_unit_head: true + person2: + age: 70 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200(b): 747.44 / 2. + ca_state_supplement_person: [373.72, 373.72] + +- name: Case 16, aged couple without cooking facilities adds the couple allowance. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # WIC 12200(d), (e): 607.83 + 257.74 = 865.57; half is 432.785, rounded up. + ca_state_supplement_person: [432.79, 432.79] + +- name: Case 17, couple of an aged person and a blind person under 65 without cooking facilities gets no allowance. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 50 + is_blind: true + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # The one-blind rate is under WIC 12200(b), and (e) gives the allowance only under (c) or (d). + # POMS code C adds the individual allowance for this couple; PolicyEngine follows the statute + # (ruled 2026-10-29, PR 10379 comment 6509402355). + ca_state_supplement_person: [373.72, 373.72] + +- name: Case 18, aged couple with one blind spouse without cooking facilities takes the higher aged couple level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_blind: true + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: false + output: + # 865.57 for the aged couple with the allowance is above the 747.44 one-blind level. + ca_state_supplement_person: [432.79, 432.79] + +- name: Case 19, couple both in nonmedical out-of-home care takes twice the individual total. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + in_out_of_home_care_facility: true + person2: + age: 68 + is_tax_unit_spouse: true + in_out_of_home_care_facility: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # 2 * 1,626.07 - 1,491 = 1,761.14 for the couple (CDSS 2026 May Revision, page 26, note 2). + ca_state_supplement_person: [880.57, 880.57] + +- name: Case 20, couple with one spouse in nonmedical out-of-home care averages the two couple levels. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + in_out_of_home_care_facility: true + person2: + age: 68 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # (1,761.14 + 607.83) / 2 = 1,184.485 for the couple, as CAPI computes it (MPP 49-050.24); + # half is 592.2425, rounded up. + ca_state_supplement_person: [592.25, 592.25] + +- name: Case 21, couple both in a Title XIX facility takes the code J couple level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 68 + is_tax_unit_spouse: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # POMS SI 01415.058 B.2.b: 64 for the couple. + ssi: [30, 30] + ca_state_supplement_person: [32, 32] + +- name: Case 22, couple with one spouse in a Title XIX facility is computed as two individuals. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 68 + is_tax_unit_spouse: true + 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). + ssi: [30, 994] + ca_state_supplement_person: [32, 239.94] + +- name: Case 23, two unrelated people in one SPM unit each take their own level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 40 + is_blind: true + is_tax_unit_head: true + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2] + spm_units: + spm_unit: + members: [person1, person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 12200 pays each recipient, and an unrelated person's income and SSI do not reduce it. + ssi: [994, 994] + ca_state_supplement_person: [239.94, 324.32] + ca_state_supplement: 564.26 + +- name: Case 24, spouse's deemed income below the couple federal rate leaves the individual level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 50 + employment_income: 24_000 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # (2,000 - 20 - 65) / 2 = 957.50 deemed. POMS SI 01320.430 D: federal min(994, 1,491 - 957.50) = + # 533.50; state min(239.94, 607.83) = 239.94. + ssi: [533.5, 0] + ca_state_supplement_person: [239.94, 0] + +- name: Case 25, spouse's deemed income above the couple total leaves no supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 50 + employment_income: 60_000 + is_tax_unit_spouse: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # (5,000 - 20 - 65) / 2 = 2,457.50 deemed. POMS SI 01320.430 D: state min(239.94, 607.83 - + # (2,457.50 - 1,491)) = 0. + ssi: [0, 0] + ca_state_supplement_person: [0, 0] + +- name: Case 26, person who declines SSI gets no supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + takes_up_ssi_if_eligible: false + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # SSA pays the supplement with SSI (POMS SI 01415.058 A). + ca_state_supplement_eligible_person: false + ssi: 0 + ca_state_supplement_person: 0 + +- name: Case 27, disabled noncitizen child who fails SSI's noncitizen test gets CAPI, not the supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + is_tax_unit_head: true + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 39 + is_tax_unit_dependent: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # WIC 18938, 18941: CAPI pays the disabled minor standard, 994 + 97.27. + ca_state_supplement_person: [0, 0] + ca_capi_person: [0, 1_091.27] + +- name: Case 28, disabled child who fails SSI's resource test gets no supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_tax_unit_head: true + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + is_tax_unit_dependent: true + bank_account_assets: + '2026': 3_000 + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # The child's 3,000 of countable resources exceed SSI's 2,000 limit (20 CFR 416.1205). + meets_ssi_resource_test: [true, false] + ssi: [0, 0] + ca_state_supplement_person: [0, 0] + +- name: Case 29, person in another person's household keeps the independent-living share. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ssi_lives_in_another_persons_household: true + ssi_receives_shelter_from_others_in_household: true + ssi_others_pay_all_meals: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # The household-of-another shares are not modeled, so the regular 239.94 share + # stays on the reduced federal amount. POMS SI 01415.058 code D lists 245.20 + # (issue 7892; us-ca:ssp-household-of-another-share in the source-conflict candidates). + ssi: 662.67 + ca_state_supplement_person: 239.94 + +- name: Case 30, aged person outside California gets no supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + marital_units: + marital_unit: + members: [person1] + households: + household: + members: [person1] + state_code: TX + output: + ssi: 994 + ca_state_supplement_person: 0 + ca_state_supplement_eligible_person: false + +- name: Case 31, couple both in a Title XIX facility in 2023 takes the published couple level, not twice the individual level. + period: 2023-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + person2: + age: 68 + is_tax_unit_spouse: true + ca_in_medical_care_facility: true + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # POMS SI 01415.055 B.2.b: 57 for the couple, or a 117 total with the 60 + # federal amount. The individual share is 29. + ssi: [30, 30] + ca_state_supplement_person: [28.5, 28.5] + +- name: Case 32, couple with only the California input marking one spouse in a Title XIX facility is computed as two individuals. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ca_in_medical_care_facility: true + person2: + age: 68 + is_tax_unit_spouse: true + 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): the facility share for the resident and the + # independent-living share for the other spouse, not an average of the two + # couple levels. + # NOTE: SSI stays joint without the federal facility inputs. + ssi: [745.5, 745.5] + ca_state_supplement_person: [32, 239.94] + +- name: Case 33, married parents who are their child's tax dependents take the individual share. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + employment_income_before_lsr: 100_000 + person2: + age: 70 + is_tax_unit_dependent: true + person3: + age: 68 + is_tax_unit_dependent: true + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2, person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # NOTE: a known limitation. The couple level is 607.83, or 303.92 each, but + # SSI's couple test excludes tax dependents, so SSI and the supplement both + # treat the parents as individuals. When SSI identifies couples by marriage + # (PR 10141), the head-or-spouse guards in CAPI, the supplement and its rates + # must go too, or these parents would get no supplement. + ssi: [0, 994, 994] + ca_state_supplement_person: [0, 239.94, 239.94] + +- name: Case 34, dependent child of an aged couple with no marital units takes their own level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + person3: + age: 10 + is_tax_unit_dependent: true + is_disabled: true + meets_ssi_disability_criteria: true + households: + household: + members: [person1, person2, person3] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + ssi: [745.5, 745.5, 994] + # With no marital units everyone shares one unit, but the child is not part + # of the couple: half of 607.83 rounded up for each spouse, 97.27 for the child. + ca_state_supplement_person: [303.92, 303.92, 97.27] + ca_state_supplement: 705.11 + +- name: Case 35, dependent child in a Title XIX facility with no marital units does not separate the parents. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + person2: + age: 68 + is_tax_unit_spouse: true + person3: + age: 10 + is_tax_unit_dependent: true + is_disabled: true + meets_ssi_disability_criteria: true + ca_in_medical_care_facility: true + households: + household: + members: [person1, person2, person3] + state_code: CA + living_arrangements_allow_for_food_preparation: true + output: + # The 416.414(b)(3) split needs one spouse in the facility, so the parents + # keep half of 607.83 rounded up, and the child takes the code J level. + ca_state_supplement_person: [303.92, 303.92, 32] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/integration.yaml index 24e257f8b2e..46cb1953241 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/cdss/state_supplement/integration.yaml @@ -1,5 +1,5 @@ -- name: Single blind parent with non eligible dependent child - period: 2024 +- name: Case 1, single blind parent with a dependent child who is not eligible. + period: 2026-01 absolute_error_margin: 0.01 input: people: @@ -10,19 +10,25 @@ person2: age: 4 is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] households: household: members: [person1, person2] state_code: CA + living_arrangements_allow_for_food_preparation: true output: - # (943 + 324.32) * 12. - ca_state_supplement_payment_standard: 15_207.84 + ca_state_supplement_eligible_person: [true, false] + ssi: [994, 0] + # 1,318.32 blind total - 994 federal benefit rate. + ca_state_supplement_person: [324.32, 0] + ca_state_supplement: 324.32 -- name: Married household with one blind and one disabled person, with a disabled dependent child, no food preparation and spouse in out of home care - period: 2024-01 +- name: Case 2, aged couple with one blind spouse, one spouse in out-of-home care, a disabled child and no food preparation. + period: 2026-01 absolute_error_margin: 0.01 input: people: @@ -41,52 +47,35 @@ is_tax_unit_dependent: true is_disabled: true meets_ssi_disability_criteria: true - spm_units: - spm_unit: - members: [person1, person2, person3] - spm_unit_is_married: true + marital_units: + marital_unit1: + members: [person1, person2] + marital_unit2: + members: [person3] households: household: members: [person1, person2, person3] state_code: CA living_arrangements_allow_for_food_preparation: false output: - # Both spouses are aged, so the couple takes the higher of the one-blind - # rate, 1,415 + 747.44 = 2,162.44, and the aged couple amount with the food - # allowance, 1,415 + 607.83 + 257.74 = 2,280.57 (WIC 12200(b), (d), (e)). The - # dependent amount is 943 + 97.27 = 1,040.27 and the out-of-home care amount - # is 2 * (943 + 632.07) - (1,415 + 607.83) = 1,127.31: - # 2,280.57 + 1,040.27 + 1,127.31 = 4,448.15. - ca_state_supplement_payment_standard: 4_448.15 + ca_state_supplement_eligible_person: [true, true, true] + ssi: [745.5, 745.5, 994] + # person1 supplies the aged couple level with the allowance, 607.83 + 257.74 + # = 865.57, above the 747.44 one-blind level. person2 supplies the + # out-of-home care couple level, 2 * 1,626.07 - 1,491 = 1,761.14. The couple + # share is (865.57 + 1,761.14) / 2 = 1,313.355, or 656.6775 each, rounded up + # to 656.68. The child takes the disabled minor level, 97.27. + ca_state_supplement_person: [656.68, 656.68, 97.27] + ca_state_supplement: 1_410.63 -- name: Case A ,single disabled parent with non eligible dependent child. - period: 2025-01 - input: - people: - person1: - age: 30 - is_disabled: true - meets_ssi_disability_criteria: true - person2: - age: 4 - is_tax_unit_dependent: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 1_206.94 - -- name: Case A1, single disabled parent with a disabled child. +- name: Case 3, single disabled parent with a disabled child. period: 2025-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 + is_tax_unit_head: true is_disabled: true meets_ssi_disability_criteria: true person2: @@ -94,52 +83,69 @@ is_tax_unit_dependent: true is_disabled: true meets_ssi_disability_criteria: true - spm_units: - spm_unit: - members: [person1, person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] households: household: members: [person1, person2] state_code: CA living_arrangements_allow_for_food_preparation: true output: - ca_state_supplement_payment_standard: 2_271.21 # 1206.94 + 1064.27 + ssi: [967, 967] + # 1,206.94 - 967 and 1,064.27 - 967. + ca_state_supplement_person: [239.94, 97.27] + ca_state_supplement: 337.21 -- name: Case A2, single healthy parent with a disabled child. - period: 2025-01 +- name: Case 4, earning parent with a disabled child, the supplement goes to the child. + period: 2026-01 + absolute_error_margin: 0.01 input: people: person1: - age: 30 + age: 33 is_tax_unit_head: true + employment_income: 12_222 person2: - age: 4 + age: 3 is_tax_unit_dependent: true is_disabled: true meets_ssi_disability_criteria: true - spm_units: - spm_unit: - members: [person1, person2] + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] households: household: members: [person1, person2] state_code: CA living_arrangements_allow_for_food_preparation: true output: - ca_state_supplement_payment_standard: 1_064.27 + ca_state_supplement_eligible_person: [false, true] + ssi: [0, 994] + # The parent is not aged, blind or disabled, and the parent's income leaves + # the child's SSI at 994, so the child takes the full 97.27. + ca_state_supplement_person: [0, 97.27] + ca_state_supplement: 97.27 -- name: Case B ,joint filers, one of them is disabled. +- name: Case 5, couple with one disabled spouse and no income. period: 2025-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 + is_tax_unit_head: true is_disabled: true meets_ssi_disability_criteria: true person2: age: 22 - spm_units: - spm_unit: + is_tax_unit_spouse: true + marital_units: + marital_unit: members: [person1, person2] households: household: @@ -147,197 +153,27 @@ state_code: CA living_arrangements_allow_for_food_preparation: true output: - ca_state_supplement_payment_standard: 1_206.94 + ca_state_supplement_eligible_person: [true, false] + ca_state_supplement_person: [239.94, 0] + ca_state_supplement: 239.94 -- name: Case B1 ,joint filers, both of them are disabled. +- name: Case 6, couple with both spouses disabled and no income. period: 2025-01 + absolute_error_margin: 0.01 input: people: person1: age: 30 + is_tax_unit_head: true is_disabled: true meets_ssi_disability_criteria: true person2: age: 22 - is_disabled: true - meets_ssi_disability_criteria: true - spm_units: - spm_unit: - members: [person1, person2] - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 2_057.83 - -# 2026 payment standards: CDSS, SSI Total Monthly Payment Amounts 2026, and -# SSA POMS SI 01415.058 (California, January 2026). -- name: 2026 single aged person living independently - period: 2026-01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 1_233.94 - -- name: 2026 single aged person living independently without cooking facilities - period: 2026-01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ca_state_supplement_food_allowance: 128.87 - ca_state_supplement_payment_standard: 1_362.81 # 1,233.94 + 128.87 - -- name: 2026 single blind person living independently - period: 2026-01 - input: - people: - person1: - age: 40 - is_tax_unit_head: true - is_blind: true - spm_units: - spm_unit: - members: [person1] - households: - household: - members: [person1] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 1_318.32 - -- name: 2026 aged couple living independently - period: 2026-01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - person2: - age: 68 - is_tax_unit_spouse: true - spm_units: - spm_unit: - members: [person1, person2] - spm_unit_is_married: true - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 2_098.83 - -- name: 2026 aged couple living independently without cooking facilities - period: 2026-01 - input: - people: - person1: - age: 70 - is_tax_unit_head: true - person2: - age: 68 - is_tax_unit_spouse: true - spm_units: - spm_unit: - members: [person1, person2] - spm_unit_is_married: true - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: false - output: - ca_state_supplement_food_allowance: 257.74 - ca_state_supplement_payment_standard: 2_356.57 # 2,098.83 + 257.74 - -- name: 2026 couple, both blind, living independently - period: 2026-01 - input: - people: - person1: - age: 50 - is_tax_unit_head: true - is_blind: true - person2: - age: 48 is_tax_unit_spouse: true - is_blind: true - spm_units: - spm_unit: - members: [person1, person2] - spm_unit_is_married: true - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 2_324.35 - -- name: 2026 blind person with an aged spouse, living independently - period: 2026-01 - input: - people: - person1: - age: 60 - is_tax_unit_head: true - is_blind: true - person2: - age: 70 - is_tax_unit_spouse: true - spm_units: - spm_unit: - members: [person1, person2] - spm_unit_is_married: true - households: - household: - members: [person1, person2] - state_code: CA - living_arrangements_allow_for_food_preparation: true - output: - ca_state_supplement_payment_standard: 2_238.44 - -- name: 2026 single disabled parent with a disabled child - period: 2026-01 - input: - people: - person1: - age: 30 - is_tax_unit_head: true - is_disabled: true - meets_ssi_disability_criteria: true - person2: - age: 4 - is_tax_unit_dependent: true is_disabled: true meets_ssi_disability_criteria: true - spm_units: - spm_unit: + marital_units: + marital_unit: members: [person1, person2] households: household: @@ -345,5 +181,7 @@ state_code: CA living_arrangements_allow_for_food_preparation: true output: - ca_state_supplement_dependent_amount: 1_091.27 - ca_state_supplement_payment_standard: 2_325.21 # 1,233.94 + 1,091.27 + ssi: [725, 725] + # 2,057.83 - 1,450 = 607.83; half is 303.915, rounded up. + ca_state_supplement_person: [303.92, 303.92] + ca_state_supplement: 607.84 diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/income/snap_unearned_income_state_ssi_supplements.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/income/snap_unearned_income_state_ssi_supplements.yaml index aabb7771aee..fed14c1bbd3 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/income/snap_unearned_income_state_ssi_supplements.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/income/snap_unearned_income_state_ssi_supplements.yaml @@ -50,8 +50,8 @@ snap_unearned_income: 1_122.82 snap: 160 -# The California supplement is an SPM unit variable, so it is counted once for -# the unit rather than projected onto each member. +# SNAP counts the person-level California supplement, so the unit total is +# counted once rather than projected onto each member. - name: California state supplement is counted once in a two-person SPM unit. period: 2026-01 absolute_error_margin: 0.01 diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/income/test_snap_child_support_treatment_invariants.py b/policyengine_us/tests/policy/baseline/gov/usda/snap/income/test_snap_child_support_treatment_invariants.py index 58e6b58f926..445bf586210 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/income/test_snap_child_support_treatment_invariants.py +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/income/test_snap_child_support_treatment_invariants.py @@ -386,7 +386,6 @@ def _gross_test_simulation(day: date): }, spm_unit={ "tanf": {str(year): 0 for year in years}, - "ca_state_supplement": _monthly(months, 0), }, ) for state in STATES diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/state/ca/state_supplement.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/state/ca/state_supplement.yaml index 18ca49e3d57..1a8817244f2 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/state/ca/state_supplement.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/state/ca/state_supplement.yaml @@ -93,8 +93,10 @@ spm_units: spm_unit: # Both aged: married standard 2,098.83 (no food allowance); - # SSI couple FBR 1,491. SSP: (2,098.83 - 1,491) x 12 = 607.83 x 12 = 7,293.96. - ca_state_supplement: 7_293.96 + # SSI couple FBR 1,491. State share 2,098.83 - 1,491 = 607.83, or 303.915 + # per spouse, rounded up to 303.92 (POMS SI 02001.010 A.2). + # SSP: 303.92 x 2 x 12 = 7,294.08. + ca_state_supplement: 7_294.08 - name: ca_state_supplement_aged_single_earnings_partial (ca) period: 2026 absolute_error_margin: 0.1 diff --git a/policyengine_us/variables/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.py b/policyengine_us/variables/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.py index f300efb003b..191db128d88 100644 --- a/policyengine_us/variables/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.py +++ b/policyengine_us/variables/gov/local/ca/sbd/general_relief/eligibility/ca_sbd_general_relief_receives_other_cash_assistance.py @@ -19,19 +19,9 @@ def formula(person, period, parameters): # "any other cash assistance program" bar. # SSI is person-level, so only the individual recipient is barred. receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) - # SSP is computed at the SPM-unit level, so unit receipt is projected - # down and intersected with the person-level categorical flag - # (mirroring the SF CAAP CAPI bar): only the aged, blind, or disabled - # member an SSP-only payment serves is barred, not the whole unit. - # ca_state_supplement is an ungated computed entitlement (it grows - # when SSI take-up is declined, since no federal SSI is netted out), - # so the SSI take-up flag stands in for actual SSP receipt — - # declined take-up lifts the bar, matching the ssi arm. - receives_ssp = ( - person("ca_state_supplement_eligible_person", period) - & (person.spm_unit("ca_state_supplement", period) > 0) - & person("takes_up_ssi_if_eligible", period.this_year) - ) + # SSP is person-level too, so only the member an SSP-only payment serves + # is barred. It follows SSI take-up, so declined take-up lifts the bar. + receives_ssp = person("ca_state_supplement_person", period) > 0 # CAPI pays SSI-equivalent cash to aged, blind, or disabled # immigrants barred from federal SSI by immigration status. Like # SSP it is computed at the SPM-unit level, so unit receipt is diff --git a/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py index 5e0c84da3f3..808c8aa3a9d 100644 --- a/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py +++ b/policyengine_us/variables/gov/ssa/ssi/_ssi_state_supplement.py @@ -4,8 +4,26 @@ ) +def federal_supplement_payment(payment, parameters, period): + """Apply SSA's rounding and minimum payment to a federally paid supplement. + + Federal administration discards digits beyond the third decimal place, + rounds up to cents, and pays at least one dollar for a positive amount. + Sources: POMS SI 02001.005 and SI 02001.010. + """ + minimum = parameters(period).gov.ssa.ssi.state_supplement.minimum_payment + rounded = np.ceil(np.floor(payment * 1_000) / 10) / 100 + return where(rounded > 0, max_(rounded, minimum), 0) + + def ssi_state_supplement( - person, period, parameters, individual_rate, couple_rate, federal_payment_rules=True + person, + period, + parameters, + individual_rate, + couple_rate, + federal_payment_rules=True, + joint=None, ): """Apply SSI-based supplement income, couple and spouse-deeming rules. @@ -16,8 +34,10 @@ def ssi_state_supplement( administrators do not inherit the federal rounding or minimum payment. Sources: 20 CFR 416.2025; POMS SI 01320.430 D, SI 02005.030 G, SI 02001.005 and SI 02001.010. Callers apply state-specific eligibility. + Pass joint only where a state's couple test differs from SSI's. """ - joint = person("ssi_couple_computation_applies", period) + if joint is None: + joint = person("ssi_couple_computation_applies", period) couple_total = person.marital_unit.sum(couple_rate / 2) standard = where(joint, couple_total / 2, individual_rate) countable = person("ssi_countable_income", period) @@ -44,10 +64,5 @@ def ssi_state_supplement( eligible = person("is_ssi_eligible", period) & person( "takes_up_ssi_if_eligible", period.this_year ) - # Federal administration discards digits beyond the third decimal place, - # rounds up to cents, and pays at least one dollar for a positive amount. - rounded = np.ceil(np.floor(payment * 1_000) / 10) / 100 - federal_payment = where( - rounded > 0, max_(rounded, ssi.state_supplement.minimum_payment), 0 - ) + federal_payment = federal_supplement_payment(payment, parameters, period) return eligible * where(federal_payment_rules, federal_payment, payment) diff --git a/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py b/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py index 72bd5c40a79..4c7597d171f 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py +++ b/policyengine_us/variables/gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py @@ -1,128 +1,61 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( - SSIFederalLivingArrangement, +from policyengine_us.variables.gov.states.ca.cdss.state_supplement._ca_state_supplement_rates import ( + ca_in_title_xix_facility, + ca_state_supplement_rates, ) -def ca_capi_in_title_xix_facility(person, period): - """Whether a person lives in a Title XIX medical facility (MPP 49-050.26). - - Reads both the California input and SSI's living arrangement. - """ - arrangement = person("ssi_federal_living_arrangement", period) - return person("ca_in_medical_care_facility", period.this_year) | ( - arrangement == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY - ) - - def ca_capi_couple_computation(person, period): - """Whether CAPI computes the person with their spouse as a couple. + """Whether CAPI and SSP compute the person with their spouse as a couple. SSI's couple computation, except that a couple with exactly one spouse in a Title XIX facility is computed separately (20 CFR 416.414(b)(3)), when - only the California facility input marks it. + only the California facility input marks it. Only a head or spouse is in a + couple, because a situation with no marital units puts a dependent in the + couple's unit. """ - in_facility = ca_capi_in_title_xix_facility(person, period) - one_in_facility = person.marital_unit.sum(in_facility) == 1 - return person("ssi_couple_computation_applies", period) & ~one_in_facility + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + in_facility = ca_in_title_xix_facility(person, period) + one_in_facility = person.marital_unit.sum(in_facility & head_or_spouse) == 1 + return ( + person("ssi_couple_computation_applies", period) + & ~one_in_facility + & head_or_spouse + ) def ca_capi_spouse_ssi_ssp(person, period): """Return the SSI and state supplement paid to the person's spouse. - Only a spouse who is not CAPI-eligible counts. ca_state_supplement is an - SPM-unit amount, so as a simplification the spouse's share is pro rata - among the unit's heads and spouses eligible for it; a citizen disabled - child's supplement in the unit is then attributed to the spouse. + Only a head or spouse who is not CAPI-eligible counts. """ - spouse = ~person("ca_capi_eligible_person", period.this_year) - spouse_ssi = person.marital_unit.sum(person("ssi", period) * spouse) - ssp_eligible = person("ca_state_supplement_eligible_person", period) & person( - "is_tax_unit_head_or_spouse", period - ) - spouse_ssp_share = person.marital_unit.sum(ssp_eligible * spouse) / max_( - person.spm_unit.sum(ssp_eligible), 1 - ) - spouse_ssp = spouse_ssp_share * person.spm_unit("ca_state_supplement", period) - return spouse_ssi + spouse_ssp + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + spouse = ~person("ca_capi_eligible_person", period.this_year) & head_or_spouse + payment = add(person, period, ["ssi", "ca_state_supplement_person"]) + return person.marital_unit.sum(payment * spouse) def ca_capi_ssi_ssp_standard(person, period, parameters): """Return a person's monthly SSI/SSP individual and couple standards. - CAPI equals SSI/SSP (WIC 18941), and the living arrangement selects one - standard (MPP 49-050.2; POMS SI 01415.058 B): - - Title XIX medical facility: the facility standard alone (MPP 49-050.26). - - Non-medical out-of-home care: one standard for every category, half the - couple amount per person (WIC 12200(g); MPP 49-050.24). - - Independent living: the highest category the person or couple qualifies - for; the no-cooking allowance goes only with the aged or disabled amount - (WIC 12200(e)), not the one-blind couple rate (12200(b)). - Outside an SSI couple computation the ineligible spouse takes the person's - category (POMS SI 01320.430 C.7). - NOTE: reduced-needs standards (POMS SI 01415.058 code D) are not modeled - (issue 7892). + CAPI equals SSI/SSP (WIC 18941), so each standard is the federal amount for + the living arrangement plus California's share. Each spouse in a joint + computation supplies half of the couple total, half the couple amount per + person in non-medical out-of-home care (MPP 49-050.24). """ - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard fbr = parameters(period).gov.ssa.ssi.amount - age = person("monthly_age", period) - child = person("is_tax_unit_dependent", period.this_year) & ( - age < p.dependent.age_limit - ) - blind = person("is_blind", period.this_year) - aged_or_disabled = (age >= p.aged_or_disabled.age_threshold) | person( - "is_ssi_disabled", period.this_year - ) - # NOTE: living_arrangements_allow_for_food_preparation defaults to true - # and the microdata do not set it, so the no-cooking allowance (+$128.87 - # a month in 2026, +$257.74 for a couple) applies only when the input is - # set to false (issue 10296). - no_cooking = ~person.household( - "living_arrangements_allow_for_food_preparation", period.this_year - ) - medical_facility = ca_capi_in_title_xix_facility(person, period) - out_of_home_care = person("in_out_of_home_care_facility", period.this_year) - # The parameters hold California's share on top of the federal amount. - medical_facility_total = fbr.medical_facility + p.allowance.medical_care_facility - out_of_home_care_total = fbr.individual + p.allowance.out_of_home_care - - community_individual = fbr.individual + max_( - blind * p.blind.single, - aged_or_disabled - * where( - child, - p.dependent.amount, - p.aged_or_disabled.amount.single + no_cooking * p.allowance.food.single, - ), - ) - joint = ca_capi_couple_computation(person, period) - blind_count = where(joint, person.marital_unit.sum(blind), 2 * blind) - aged_or_disabled_count = where( - joint, person.marital_unit.sum(aged_or_disabled), 2 * aged_or_disabled - ) - two_blind = (blind_count > 1) * p.blind.married.two_blind - one_blind = (blind_count == 1) * p.blind.married.one_blind - # NOTE: a couple with one aged or disabled member always has a blind - # member, whose rate is higher, so only two count here. - aged_or_disabled_couple = (aged_or_disabled_count > 1) * ( - p.aged_or_disabled.amount.married + no_cooking * p.allowance.food.married + individual_rate, couple_rate = ca_state_supplement_rates( + person, period, parameters, joint ) - community_couple = fbr.couple + max_( - max_(two_blind, one_blind), aged_or_disabled_couple - ) - + medical_facility = ca_in_title_xix_facility(person, period) # NOTE: the state shares before 2013 are the 1991 totals in WIC 12200 less # the 1991 federal rates (issue 10480). - individual = select( - [medical_facility, out_of_home_care], - [medical_facility_total, out_of_home_care_total], - default=community_individual, + individual = individual_rate + where( + medical_facility, fbr.medical_facility, fbr.individual ) - couple_share = select( - [medical_facility, out_of_home_care], - [medical_facility_total, out_of_home_care_total], - default=community_couple / 2, + couple_federal = where(medical_facility, 2 * fbr.medical_facility, fbr.couple) + couple = couple_federal + where( + joint, person.marital_unit.sum(couple_rate / 2), couple_rate ) - couple = where(joint, person.marital_unit.sum(couple_share), 2 * couple_share) return individual, couple diff --git a/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_payment_standard.py b/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_payment_standard.py index a7a86fb37f2..673cbe09f2c 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_payment_standard.py +++ b/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_payment_standard.py @@ -26,8 +26,9 @@ def formula(person, period, parameters): individual, couple = ca_capi_ssi_ssp_standard(person, period, parameters) p = parameters(period).gov.states.ca.cdss.capi.payment_standard_offset joint = ca_capi_couple_computation(person, period) + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) capi_members = person.marital_unit.sum( - person("ca_capi_eligible_person", period.this_year) + person("ca_capi_eligible_person", period.this_year) & head_or_spouse ) # Each member of a CAPI couple takes one-half (MPP 49-050.12, 49-055.4). both_capi = joint & (capi_members > 1) diff --git a/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py b/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py index 41a276700b5..5286b192c8d 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py +++ b/policyengine_us/variables/gov/states/ca/cdss/capi/ca_capi_person.py @@ -4,10 +4,12 @@ ) from policyengine_us.variables.gov.states.ca.cdss.capi._ca_capi_ssi_ssp_standard import ( ca_capi_couple_computation, - ca_capi_in_title_xix_facility, ca_capi_spouse_ssi_ssp, ca_capi_ssi_ssp_standard, ) +from policyengine_us.variables.gov.states.ca.cdss.state_supplement._ca_state_supplement_rates import ( + ca_in_title_xix_facility, +) class ca_capi_person(Variable): @@ -29,7 +31,9 @@ class ca_capi_person(Variable): def formula(person, period, parameters): # 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)). + # income; each spouse's own income counts (20 CFR 416.414(b)(3)). The + # same goes for a dependent who shares the couple's unit because the + # situation has no marital units. # NOTE: this own income leaves out in-kind support and the student # earned income exclusion, which SSI's joint computation would apply. separated = person( @@ -53,7 +57,7 @@ def formula(person, period, parameters): # Deeming needs an ineligible spouse living in the same household # (20 CFR 416.1160(a)(1)), so a Title XIX facility resident counts # only their own income. - medical_facility = ca_capi_in_title_xix_facility(person, period) + medical_facility = ca_in_title_xix_facility(person, period) income = where(medical_facility, own_income, countable_income) # NOTE: the reduced-needs standards for another person's household are # not modeled (issue 7892), so those recipients get the @@ -67,9 +71,12 @@ def formula(person, period, parameters): # can still pay such a spouse SSI that SSA would not (issue 10481). capi_eligible = person("ca_capi_eligible_person", period.this_year) joint = ca_capi_couple_computation(person, period) - couple_with_spouse = joint & ~(person.marital_unit.sum(capi_eligible) > 1) + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + couple_with_spouse = joint & ~( + person.marital_unit.sum(capi_eligible & head_or_spouse) > 1 + ) spouse_ssi_ssp = ca_capi_spouse_ssi_ssp(person, period) - couple_income = person.marital_unit.sum(countable_income) + couple_income = person.marital_unit.sum(countable_income * head_or_spouse) # 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. diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/_ca_state_supplement_rates.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/_ca_state_supplement_rates.py new file mode 100644 index 00000000000..f418b808487 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/_ca_state_supplement_rates.py @@ -0,0 +1,103 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.status.ssi_federal_living_arrangement import ( + SSIFederalLivingArrangement, +) + + +def ca_in_title_xix_facility(person, period): + """Whether a person lives in a Title XIX medical facility (MPP 49-050.26). + + Reads both the California input and SSI's living arrangement. + """ + arrangement = person("ssi_federal_living_arrangement", period) + return person("ca_in_medical_care_facility", period.this_year) | ( + arrangement == SSIFederalLivingArrangement.MEDICAL_TREATMENT_FACILITY + ) + + +def ca_state_supplement_rates(person, period, parameters, joint): + """Return a person's monthly state shares at the individual and couple rates. + + WIC 12200 sets one standard for each recipient or married couple, and the + living arrangement selects it (MPP 49-050.2; POMS SI 01415.058 B): + - Title XIX medical facility: the facility share alone (WIC 12200(h)). + - Non-medical out-of-home care: one share for every category, including + children (WIC 12200(g)). + - Independent living: the highest category the person or couple qualifies + for (POMS SI 01415.058 B.2 note). A blind child takes the blind share + (WIC 12200(a)), and a disabled child under 18 the disabled minor share + (WIC 12200(f)). The no-cooking allowance goes only with the aged or + disabled share (WIC 12200(e)), not the blind or disabled minor shares. + The couple rate is for the whole couple, and only a head or spouse has one. + Outside a joint computation the ineligible spouse takes the person's + category (POMS SI 01320.430 C.7). + NOTE: the household-of-another shares (POMS SI 01415.058 codes D, F and G) + are not modeled (issue 7892), so those recipients keep these shares. + NOTE: a child in a non-parent relative's home takes the out-of-home care + share (POMS SI 01415.058 B.1 code B) only with in_out_of_home_care_facility. + """ + p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard + fbr = parameters(period).gov.ssa.ssi.amount + age = person("monthly_age", period) + child = person("is_tax_unit_dependent", period.this_year) & ( + age < p.dependent.age_limit + ) + blind = person("is_blind", period.this_year) + aged_or_disabled = (age >= p.aged_or_disabled.age_threshold) | person( + "is_ssi_disabled", period.this_year + ) + # NOTE: living_arrangements_allow_for_food_preparation defaults to true + # and the microdata do not set it, so the no-cooking allowance (+$128.87 + # a month in 2026, +$257.74 for a couple) applies only when the input is + # set to false (issue 10296). + no_cooking = ~person.household( + "living_arrangements_allow_for_food_preparation", period.this_year + ) + medical_facility = ca_in_title_xix_facility(person, period) + out_of_home_care = person("in_out_of_home_care_facility", period.this_year) + + community_individual = max_( + blind * p.blind.single, + aged_or_disabled + * where( + child, + p.dependent.amount, + p.aged_or_disabled.amount.single + no_cooking * p.allowance.food.single, + ), + ) + individual = select( + [medical_facility, out_of_home_care], + [p.allowance.medical_care_facility, p.allowance.out_of_home_care], + default=community_individual, + ) + + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + blind_count = where( + joint, person.marital_unit.sum(blind & head_or_spouse), 2 * blind + ) + aged_or_disabled_count = where( + joint, + person.marital_unit.sum(aged_or_disabled & head_or_spouse), + 2 * aged_or_disabled, + ) + two_blind = (blind_count > 1) * p.blind.married.two_blind + one_blind = (blind_count == 1) * p.blind.married.one_blind + # NOTE: a couple with one aged or disabled member always has a blind + # member, whose rate is higher, so only two count here. That couple gets no + # allowance. POMS code C adds the individual allowance for it; PolicyEngine + # follows the statute (ruled 2026-10-29, PR 10379 comment 6509402355). + aged_or_disabled_couple = (aged_or_disabled_count > 1) * ( + p.aged_or_disabled.amount.married + no_cooking * p.allowance.food.married + ) + community_couple = max_(max_(two_blind, one_blind), aged_or_disabled_couple) + # The couple out-of-home care total is twice the individual total, so its + # share moves with the federal rates (CDSS 2026 May Revision, page 26). + out_of_home_care_couple = ( + 2 * (fbr.individual + p.allowance.out_of_home_care) - fbr.couple + ) + couple = select( + [medical_facility, out_of_home_care], + [p.allowance.medical_care_facility_couple, out_of_home_care_couple], + default=community_couple, + ) + return individual, couple * head_or_spouse diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement.py index ef86e4890a4..39c4ab94aea 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement.py @@ -1,10 +1,4 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import ( - _apply_ssi_exclusions, -) -from policyengine_us.variables.gov.states.ca.cdss.capi._ca_capi_ssi_ssp_standard import ( - ca_capi_ssi_ssp_standard, -) class ca_state_supplement(Variable): @@ -14,80 +8,5 @@ class ca_state_supplement(Variable): unit = USD definition_period = MONTH defined_for = StateCode.CA - reference = ( - "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200", - "https://www.law.cornell.edu/cfr/text/20/416.1160", - "https://www.law.cornell.edu/cfr/text/20/416.1161", - "https://www.law.cornell.edu/cfr/text/20/416.2025", - "https://www.cdss.ca.gov/Portals/9/CAPI/CAPI_Regulations-Accessible.pdf#page=25", - ) - - def formula(spm_unit, period, parameters): - payment_standard = spm_unit("ca_state_supplement_payment_standard", period) - ssi = add(spm_unit, period, ["ssi"]) - person = spm_unit.members - # SSI/SSP counts another member's income only when it is deemed - # (20 CFR 416.1160(a)), and CAPI budgets its own members' income (CAPI - # regulations MPP 49-035), so the income of a member who fails SSI's - # citizen or qualified-noncitizen test is not counted. - 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_ssi_immigration_test = is_citizen | is_qualified_noncitizen - # SSA treats a spouse who fails that test as an ineligible spouse (20 - # CFR 416.1160(d)). If the spouse receives CAPI, none of the income - # counted for CAPI is deemed (20 CFR 416.1161(a)(2)-(3)), so the - # recipient's own income counts, not half of the couple's. Otherwise - # the spouse's income is deemed (20 CFR 416.1163, 416.2025(b)(3)). - # Taking the lesser of the individual and couple totals gives both: - # it equals own income whenever the spouse would receive CAPI. - # NOTE: POMS SI 01320.430 D takes the lesser of each part separately; - # the totals keep CAPI at zero when the spouse's income is deemed. - # NOTE: SSI couple status ignores SSI's noncitizen test, so the - # model's SSI is still the couple computation (issue 10481). - head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) - # The exclusion needs a spouse who can receive CAPI, so key on CAPI - # eligibility rather than on SSI's noncitizen test alone (issue 10482). - capi_eligible = person("ca_capi_eligible_person", period.this_year) - spouse_capi_eligible = ( - person.marital_unit.sum(capi_eligible & head_or_spouse) > 0 - ) - in_mixed_couple = ( - person("ssi_couple_computation_applies", period) - & meets_ssi_immigration_test - & spouse_capi_eligible - ) - earned = max_( - person("ssi_earned_income", period.this_year) - - person( - "ssi_blind_or_disabled_working_student_exclusion", period.this_year - ), - 0, - ) - # NOTE: in-kind support uses the couple's presumed maximum value here, - # because SSI still treats the pair as a couple. - unearned = person("ssi_unearned_income", period.this_year) + person( - "ssi_in_kind_support_and_maintenance", period.this_year - ) - # _apply_ssi_exclusions takes and returns annual amounts. - own_countable_income = ( - _apply_ssi_exclusions(earned, unearned, parameters, period) / MONTHS_IN_YEAR - ) - ssi_countable_income = person("ssi_countable_income", period) - couple_income = person.marital_unit.sum(ssi_countable_income) - individual_standard, couple_standard = ca_capi_ssi_ssp_standard( - person, period, parameters - ) - mixed_countable_income = max_( - own_countable_income, - couple_income - (couple_standard - individual_standard), - ) - person_countable_income = where( - in_mixed_couple, mixed_countable_income, ssi_countable_income - ) - countable_income = spm_unit.sum( - where(meets_ssi_immigration_test, person_countable_income, 0) - ) - return max_(0, payment_standard - ssi - countable_income) + reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" + adds = ["ca_state_supplement_person"] diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py index 6dfe1c4c81d..a4848933c87 100644 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_eligible_person.py @@ -4,33 +4,13 @@ class ca_state_supplement_eligible_person(Variable): value_type = bool entity = Person - label = "California SSI state supplement eligible person" + label = "Receives the California state supplement" definition_period = MONTH defined_for = StateCode.CA - reference = ( - "https://law.justia.com/codes/california/code-wic/division-9/part-3/chapter-3/article-4/", - "https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415058", - ) + reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12150" def formula(person, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - meets_resource_test = person("meets_ssi_resource_test", period) - aged_blind_disabled = person("is_ssi_aged_blind_disabled", period) - is_qualified_noncitizen = person("is_ssi_qualified_noncitizen", period) - immigration_status = person("immigration_status", period.this_year) - is_citizen = immigration_status == immigration_status.possible_values.CITIZEN - # Heads and spouses get the individual, couple and facility amounts. - # The model pays blind or disabled dependents below the age limit the - # dependent amount instead. This simplifies POMS SI 01415.058, which - # pays blind children the blind amount, children in care facilities - # the facility amount and adult dependents an individual amount - # (issue 10557). - is_head_or_spouse = person("is_tax_unit_head_or_spouse", period) - dependent = person("is_tax_unit_dependent", period) - minor = person("monthly_age", period) < p.dependent.age_limit - return ( - meets_resource_test - & aged_blind_disabled - & (is_qualified_noncitizen | is_citizen) - & (is_head_or_spouse | (dependent & minor)) - ) + # True only for a person paid the supplement. is_ssi_eligible has no + # income test, so income that leaves no supplement makes this false, and + # so does not taking up SSI, because the amount requires take-up. + return person("ca_state_supplement_person", period) > 0 diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_person.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_person.py new file mode 100644 index 00000000000..29ac3b40cc5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/ca_state_supplement_person.py @@ -0,0 +1,114 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi._ssi_state_supplement import ( + federal_supplement_payment, + ssi_state_supplement, +) +from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import ( + _apply_ssi_exclusions, +) +from policyengine_us.variables.gov.states.ca.cdss.capi._ca_capi_ssi_ssp_standard import ( + ca_capi_couple_computation, + ca_capi_ssi_ssp_standard, +) +from policyengine_us.variables.gov.states.ca.cdss.state_supplement._ca_state_supplement_rates import ( + ca_state_supplement_rates, +) + + +class ca_state_supplement_person(Variable): + value_type = float + entity = Person + label = "California state supplement per person" + unit = USD + definition_period = MONTH + defined_for = StateCode.CA + reference = ( + "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12150", + "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200", + "https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415058", + "https://www.law.cornell.edu/cfr/text/20/416.1160", + "https://www.law.cornell.edu/cfr/text/20/416.1161", + "https://www.law.cornell.edu/cfr/text/20/416.2025", + "https://www.cdss.ca.gov/Portals/9/CAPI/CAPI_Regulations-Accessible.pdf#page=25", + ) + + def formula(person, period, parameters): + # A couple with one spouse in a Title XIX facility is computed + # separately, including when only the California input marks it (20 CFR + # 416.414(b)(3)). + joint = ca_capi_couple_computation(person, period) + individual_rate, couple_rate = ca_state_supplement_rates( + person, period, parameters, joint + ) + # SSA administers the supplement, so the federal income, couple, + # deeming and rounding rules apply (POMS SI 01415.058 A). + payment = ssi_state_supplement( + person, period, parameters, individual_rate, couple_rate, joint=joint + ) + + # SSA treats a spouse who fails SSI's citizen or qualified-noncitizen + # test as an ineligible spouse (20 CFR 416.1160(d)), but SSI couple + # status ignores that test (issue 10481). So the model's SSI is the + # couple computation, and the supplement makes up the rest of the + # recipient's individual standard. If the spouse receives CAPI, none of + # the income counted for CAPI is deemed (20 CFR 416.1161(a)(2)-(3)), so + # the recipient's own income counts, not half of the couple's. Otherwise + # the spouse's income is deemed (20 CFR 416.1163, 416.2025(b)(3)). + # Taking the lesser of the individual and couple totals gives both: + # it equals own income whenever the spouse would receive CAPI. + # NOTE: POMS SI 01320.430 D takes the lesser of each part separately; + # the totals keep CAPI at zero when the spouse's income is deemed. + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + 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 + ) + fails_test = ~(is_citizen | is_qualified_noncitizen) & head_or_spouse + # The exclusion needs a spouse who can receive CAPI, so key on CAPI + # eligibility rather than on SSI's noncitizen test alone (issue 10482). + capi_eligible = person("ca_capi_eligible_person", period.this_year) + spouse_capi_eligible = joint & ( + person.marital_unit.sum(capi_eligible & head_or_spouse) > 0 + ) + split_couple = spouse_capi_eligible | ( + joint & (person.marital_unit.sum(fails_test) > 0) + ) + earned = max_( + person("ssi_earned_income", period.this_year) + - person( + "ssi_blind_or_disabled_working_student_exclusion", period.this_year + ), + 0, + ) + # NOTE: in-kind support uses the couple's presumed maximum value here, + # because SSI still treats the pair as a couple. + unearned = person("ssi_unearned_income", period.this_year) + person( + "ssi_in_kind_support_and_maintenance", period.this_year + ) + # _apply_ssi_exclusions takes and returns annual amounts. + own_countable_income = ( + _apply_ssi_exclusions(earned, unearned, parameters, period) / MONTHS_IN_YEAR + ) + ssi_countable_income = person("ssi_countable_income", period) + couple_income = person.marital_unit.sum(ssi_countable_income * head_or_spouse) + individual_standard, couple_standard = ca_capi_ssi_ssp_standard( + person, period, parameters + ) + mixed_countable_income = max_( + own_countable_income, + couple_income - (couple_standard - individual_standard), + ) + countable_income = where( + spouse_capi_eligible, mixed_countable_income, ssi_countable_income + ) + split_amount = max_( + individual_standard - person("ssi", period) - countable_income, 0 + ) + split_payment = federal_supplement_payment( + split_amount, parameters, period + ) * person("takes_up_ssi_if_eligible", period.this_year) + # WIC 12150 entitles people who receive SSI or "who but for their + # income" could, which is SSI eligibility without its income test. + eligible = person("is_ssi_eligible", period) + return eligible * where(split_couple, split_payment, payment) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_blind_disabled_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_blind_disabled_amount.py deleted file mode 100644 index f7b5ec961eb..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_blind_disabled_amount.py +++ /dev/null @@ -1,18 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_aged_blind_disabled_amount(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement aged disabled and blind amount" - unit = USD - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - blind_amount = spm_unit("ca_state_supplement_blind_amount", period) - aged_disabled_amount = spm_unit( - "ca_state_supplement_aged_disabled_amount", period - ) - return max_(blind_amount, aged_disabled_amount) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_amount.py deleted file mode 100644 index b5666e4efbb..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_amount.py +++ /dev/null @@ -1,26 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_aged_disabled_amount(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement aged disabled amount" - unit = USD - definition_period = MONTH - defined_for = "ca_state_supplement_aged_disabled_count" - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - p = parameters( - period - ).gov.states.ca.cdss.state_supplement.payment_standard.aged_or_disabled.amount - fbr = parameters(period).gov.ssa.ssi.amount - # Aged or disabled amount - aged_disabled_count = spm_unit( - "ca_state_supplement_aged_disabled_count", period - ) - return select( - [aged_disabled_count > 1, aged_disabled_count == 1], - [fbr.couple + p.married, fbr.individual + p.single], - default=0, - ) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py deleted file mode 100644 index e0a358ffb39..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_aged_disabled_count.py +++ /dev/null @@ -1,23 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_aged_disabled_count(Variable): - value_type = int - entity = SPMUnit - label = "California SSI state supplement aged or disabled count" - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - person = spm_unit.members - # Aged or disabled amount - is_ssi_disabled = person("is_ssi_disabled", period.this_year) - age = person("monthly_age", period) - is_aged = age >= p.aged_or_disabled.age_threshold - aged_or_disabled = is_aged | is_ssi_disabled - eligible = person("ca_state_supplement_eligible_person", period) - # The model pays dependent children the dependent amount instead. - head_or_spouse = person("is_tax_unit_head_or_spouse", period) - return spm_unit.sum(aged_or_disabled * eligible * head_or_spouse) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_blind_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_blind_amount.py deleted file mode 100644 index 780f37186cc..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_blind_amount.py +++ /dev/null @@ -1,34 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_blind_amount(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement blind amount" - unit = USD - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - fbr = parameters(period).gov.ssa.ssi.amount - person = spm_unit.members - head_or_spouse = person("is_tax_unit_head_or_spouse", period) - # Blind amount - blind = person("is_blind", period) * head_or_spouse - eligible = person("ca_state_supplement_eligible_person", period) - blind_count = spm_unit.sum(blind * eligible) - is_married = spm_unit("spm_unit_is_married", period) - blind_married_amount = select( - [blind_count >= 2, blind_count == 1], - [ - fbr.couple + p.blind.married.two_blind, - fbr.couple + p.blind.married.one_blind, - ], - default=0, - ) - total_amount_if_eligible = where( - is_married, blind_married_amount, fbr.individual + p.blind.single - ) - return where(blind_count == 0, 0, total_amount_if_eligible) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py deleted file mode 100644 index 6219e06109e..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py +++ /dev/null @@ -1,25 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_dependent_amount(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement dependent amount" - unit = USD - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - fbr = parameters(period).gov.ssa.ssi.amount - person = spm_unit.members - age = person("monthly_age", period) - dependent = person("is_tax_unit_dependent", period) - dependent_age_eligible = age < p.dependent.age_limit - # The eligible person flag applies the SSI/SSP conditions, including - # being blind or disabled; a child who fails SSI's noncitizen test - # gets CAPI instead (WIC 18938, 18941). - eligible = person("ca_state_supplement_eligible_person", period) - dependent_count = spm_unit.sum(dependent & dependent_age_eligible & eligible) - return dependent_count * (fbr.individual + p.dependent.amount) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance.py deleted file mode 100644 index b7c3e9adeea..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance.py +++ /dev/null @@ -1,49 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_food_allowance(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement food allowance above the blind amount" - documentation = ( - "The part of the no-cooking (restaurant meals) allowance that lifts the " - "aged or disabled amount above the blind amount, since California pays " - "the higher of the two. It is the full allowance unless the unit's blind " - "amount is higher than its aged or disabled amount." - ) - unit = USD - definition_period = MONTH - defined_for = "ca_state_supplement_food_allowance_eligible" - reference = ( - "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200", - "https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415058", - ) - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - is_married = spm_unit("spm_unit_is_married", period) - aged_disabled_count = spm_unit( - "ca_state_supplement_aged_disabled_count", period - ) - # Food allowance amount - allowance = where( - is_married & (aged_disabled_count == 2), - p.allowance.food.married, - p.allowance.food.single, - ) - # WIC 12200(e) adds the allowance only to the aged or disabled amount - # under (c) or (d), not to the blind amounts under (a) or (b), and - # California pays the highest category (POMS SI 01415.058 B.2.a note). - # So the allowance counts only as far as it lifts the aged or disabled - # amount above the blind amount; a couple of an aged person and a blind - # person who is neither aged nor disabled gets none. POMS code C adds - # the individual allowance for that couple; PolicyEngine follows the - # statute (ruled 2026-10-29, PR 10379 comment 6509402355). - aged_disabled_amount = spm_unit( - "ca_state_supplement_aged_disabled_amount", period - ) - # The higher of the blind and the aged or disabled amounts. - aged_blind_disabled_amount = spm_unit( - "ca_state_supplement_aged_blind_disabled_amount", period - ) - return max_(aged_disabled_amount + allowance - aged_blind_disabled_amount, 0) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance_eligible.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance_eligible.py deleted file mode 100644 index d399621b1a7..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_food_allowance_eligible.py +++ /dev/null @@ -1,21 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_food_allowance_eligible(Variable): - value_type = bool - entity = SPMUnit - label = "California SSI state supplement food allowance eligible" - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - living_arrangements_allow_for_food_preparation = spm_unit.household( - "living_arrangements_allow_for_food_preparation", period - ) - aged_disabled_count = spm_unit( - "ca_state_supplement_aged_disabled_count", period - ) - return ( - aged_disabled_count > 0 - ) & ~living_arrangements_allow_for_food_preparation diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py deleted file mode 100644 index 3b279f060cf..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_medical_care_facility_amount.py +++ /dev/null @@ -1,27 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_medical_care_facility_amount(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement medical care facility amount" - unit = USD - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - fbr = parameters(period).gov.ssa.ssi.amount - # Medical care facility amount - person = spm_unit.members - eligible = person("ca_state_supplement_eligible_person", period) - # The model pays dependent children the dependent amount instead. - head_or_spouse = person("is_tax_unit_head_or_spouse", period) - in_medical_care_facility = person("ca_in_medical_care_facility", period) - medical_care_facility_count = spm_unit.sum( - in_medical_care_facility * eligible * head_or_spouse - ) - return medical_care_facility_count * ( - fbr.medical_facility + p.allowance.medical_care_facility - ) diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py deleted file mode 100644 index 22af174daac..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_out_of_home_care_facility_amount.py +++ /dev/null @@ -1,29 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_out_of_home_care_facility_amount(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement out of home care facility amount" - unit = USD - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard - fbr = parameters(period).gov.ssa.ssi.amount - person = spm_unit.members - eligible = person("ca_state_supplement_eligible_person", period) - # The model pays dependent children the dependent amount instead. - head_or_spouse = person("is_tax_unit_head_or_spouse", period) - in_out_of_home_care_facility = person("in_out_of_home_care_facility", period) - out_of_home_care_facility_count = spm_unit.sum( - in_out_of_home_care_facility * eligible * head_or_spouse - ) - # The couple out-of-home care total is twice the individual total, and - # this amount is what it adds to the aged or disabled couple total. - individual_total = fbr.individual + p.allowance.out_of_home_care - aged_or_disabled_couple_total = fbr.couple + p.aged_or_disabled.amount.married - allowance = 2 * individual_total - aged_or_disabled_couple_total - return out_of_home_care_facility_count * allowance diff --git a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_payment_standard.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_payment_standard.py deleted file mode 100644 index c6958e27f3b..00000000000 --- a/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_payment_standard.py +++ /dev/null @@ -1,19 +0,0 @@ -from policyengine_us.model_api import * - - -class ca_state_supplement_payment_standard(Variable): - value_type = float - entity = SPMUnit - label = "California SSI state supplement payment standard" - unit = USD - definition_period = MONTH - defined_for = StateCode.CA - reference = "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200" - - adds = [ - "ca_state_supplement_dependent_amount", - "ca_state_supplement_food_allowance", - "ca_state_supplement_medical_care_facility_amount", - "ca_state_supplement_out_of_home_care_facility_amount", - "ca_state_supplement_aged_blind_disabled_amount", - ] diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index e59be87270a..c27bd7db7a0 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -1412,8 +1412,7 @@ candidates: follows: statute 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 + - policyengine_us/variables/gov/states/ca/cdss/state_supplement/_ca_state_supplement_rates.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/10379 - https://github.com/PolicyEngine/policyengine-us/pull/10546 @@ -1426,9 +1425,49 @@ candidates: https://github.com/PolicyEngine/policyengine-us/pull/10379#issuecomment-6509402355. WIC 12200(e) gives the no-cooking allowance only under (c) and (d), so a couple paid the one-blind rate under (b) gets none, in CAPI and in the state supplement. CAPI (_ca_capi_ssi_ssp_standard.py) and the state supplement - (ca_state_supplement_food_allowance.py) both follow the statute: neither adds a food allowance to the one-blind + (_ca_state_supplement_rates.py) both follow the statute: neither adds a 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.' +- id: us-ca:ssp-household-of-another-share + program: ssi-ssp + years: + from: 2013 + type: calendar + question: Does a California recipient in another person's household keep the regular state share, or take the + separate share POMS lists for that arrangement? + sources: + - kind: statute + citation: Cal. WIC §12200(i) + url: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200 + - kind: statute + citation: Cal. WIC §12200.03 + url: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200.03 + - kind: manual + citation: SSA POMS SI 01415.058 B.1 and B.2, codes D, F and G + url: https://secure.ssa.gov/apps10/poms.nsf/lnx/0501415058 + readings: + statute: Subdivision 12200(i) reduces the grant level under (a) through (d) by the amount of the federal reduction, + which alone keeps the regular state share. Section 12200.03 applies notwithstanding any other law and sets the + payments at the federal minimum, which may change that result. + other: POMS lists separate state shares for recipients with the federal one-third reduction. + example: In January 2026, an aged person with no income in another person's household has a $902.61 total with the + regular share, which PE-US pays ($662.67 federal plus $239.94), and $907.87 under POMS ($662.67 plus $245.20). + pe_us: + follows: not-modelled + code: + - policyengine_us/variables/gov/states/ca/cdss/state_supplement/_ca_state_supplement_rates.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10601 + state: open + note: PE-US has no household-of-another shares, so these recipients keep the regular share on the reduced federal + amount (issue 7892). The January 2026 POMS shares are 245.20 for aged or disabled, 329.58 for blind, 624.40 for + out-of-home care (code F) and 102.53 for a disabled child (code G); the couple shares are 615.70, 841.22 for two + blind, 755.31 for one blind and 1,604.20 for out-of-home care. Subdivision 12200(i) names only (a) through (d), so + it does not decide codes F and G. WIC 12204 keeps a Public Law 93-66 payment and does not explain the difference. + WIC 12200.03 may, since it sets the Section 12200 payments, other than (e), (g) and (h), at the federal minimum and + no lower than the March 1983 standards adjusted under 20 CFR 416.2096(b); that arithmetic has not been checked. + The project lead leans toward POMS because SSA issues the payment from its chart; the model stays as it is until + that is decided. - id: us-ca:ssp-nmohc-couple-standard program: ssi-ssp years: