From 66afeef13ac656a6e13e7dd6b0f177c45f409a8f Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 27 Oct 2026 16:30:18 -0400 Subject: [PATCH 1/5] Default living_arrangements_allow_for_food_preparation to true The input had no default, so it was false for every household that did not set it, and every aged or disabled California SSI/SSP recipient got the restaurant meals allowance (no-cooking standard). WIC 12200(e) pays the allowance only when the living arrangement prevents meal preparation at home, and POMS SI SF01415.140 requires no adequate cooking and food storage facilities and a signed application. Default the input to true and cite both sources. Add default and no-cooking cases for an aged individual and an aged couple in January 2025, and update the spm_unit_benefits California case to the regular standard (2,879.28 instead of 4,425.72). The partner fixture analytics_coverage/edge_cases/state/ca/state_supplement.yaml is not edited here: three of its cases change and need partner sign-off. Fixes #10296 Co-Authored-By: Claude Opus 5.5 --- ...296-ca-ssp-meal-allowance-default.fixed.md | 1 + ...te_supplement_food_allowance_eligible.yaml | 130 ++++++++++++++++++ .../income/spm_unit/spm_unit_benefits.yaml | 20 +-- ...arrangements_allow_for_food_preparation.py | 13 ++ 4 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 changelog.d/fix-10296-ca-ssp-meal-allowance-default.fixed.md diff --git a/changelog.d/fix-10296-ca-ssp-meal-allowance-default.fixed.md b/changelog.d/fix-10296-ca-ssp-meal-allowance-default.fixed.md new file mode 100644 index 00000000000..43c149cb49b --- /dev/null +++ b/changelog.d/fix-10296-ca-ssp-meal-allowance-default.fixed.md @@ -0,0 +1 @@ +Default living_arrangements_allow_for_food_preparation to true, so California pays the SSI/SSP restaurant meals allowance only when the input says the living arrangement prevents meal preparation at home (WIC 12200(e)), not to every aged or disabled recipient. 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 index 2249a38e698..a19d00f2588 100644 --- 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 @@ -24,3 +24,133 @@ 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/household/income/spm_unit/spm_unit_benefits.yaml b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml index 63f38a2631c..3f0849f633c 100644 --- a/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml +++ b/policyengine_us/tests/policy/baseline/household/income/spm_unit/spm_unit_benefits.yaml @@ -98,13 +98,15 @@ spm_unit_benefits: 4 - name: Benefits include California's SSI state supplement. - # Single aged Californian, no income, 2026. Monthly payment standard is - # 1,233.94 (aged or disabled, single) + 128.87 (food allowance) = 1,362.81. - # Monthly SSI is the 994 federal benefit rate for an individual, and - # countable income is zero, so the monthly supplement is - # 1,362.81 - 994 - 0 = 368.81. Annualised: ssi = 994 * 12 = 11,928 and - # ca_state_supplement = 368.81 * 12 = 4,425.72, summing to 16,353.72, - # which is the annual payment standard. + # Single aged Californian, no income, 2026. The household does not report + # its living arrangement, so it can prepare meals at home and gets no + # restaurant meals allowance (WIC 12200(e) pays it only when the living + # arrangement prevents meal preparation). Monthly payment standard is + # 1,233.94 (aged or disabled, single). Monthly SSI is the 994 federal + # benefit rate for an individual, and countable income is zero, so the + # monthly supplement is 1,233.94 - 994 - 0 = 239.94. Annualised: + # ssi = 994 * 12 = 11,928 and ca_state_supplement = 239.94 * 12 = 2,879.28, + # summing to 14,807.28, which is the annual payment standard. period: 2026 absolute_error_margin: 0.01 input: @@ -122,8 +124,8 @@ state_code: CA output: ssi: 11_928 - ca_state_supplement: 4_425.72 - spm_unit_benefits: 16_353.72 + ca_state_supplement: 2_879.28 + spm_unit_benefits: 14_807.28 - name: Benefits include modeled state unemployment insurance net of the SNAP it reduces. # Low-income Pennsylvania adult with no reported UC and no earnings. Modeled diff --git a/policyengine_us/variables/household/demographic/household/living_arrangements_allow_for_food_preparation.py b/policyengine_us/variables/household/demographic/household/living_arrangements_allow_for_food_preparation.py index 7e828945ead..b0662c30cc6 100644 --- a/policyengine_us/variables/household/demographic/household/living_arrangements_allow_for_food_preparation.py +++ b/policyengine_us/variables/household/demographic/household/living_arrangements_allow_for_food_preparation.py @@ -5,4 +5,17 @@ class living_arrangements_allow_for_food_preparation(Variable): value_type = bool entity = Household label = "Living arrangements allow for food preparation" + documentation = ( + "Whether the household's living arrangement lets its members prepare " + "meals at home, with adequate cooking and food storage facilities. " + "Defaults to true, the common case; set it to false for a household " + "without such facilities, such as a room without a kitchen. California " + "pays the SSI/SSP restaurant meals allowance only to an aged or disabled " + "recipient whose living arrangement prevents meal preparation at home." + ) definition_period = YEAR + default_value = True + reference = [ + "https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=WIC§ionNum=12200", + "https://secure.ssa.gov/poms.nsf/lnx/0501415140SF", + ] From 6f92ff79219c06179ab458681c28f9c36adec543 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 27 Oct 2026 18:41:04 -0400 Subject: [PATCH 2/5] Update the tests that relied on the California restaurant meals allowance With living_arrangements_allow_for_food_preparation defaulting to true, an aged California SSI/SSP recipient who does not report a living arrangement without cooking facilities gets the independent-living standard, not the restaurant meals allowance (WIC 12200(e)). Three non-partner tests relied on the old default. - snap_unearned_income_state_ssi_supplements.yaml: the two California cases have no sign of a home without cooking facilities, so update ca_state_supplement to 239.94 (1,233.94 - 994), SNAP unearned income to 1,233.94 and SNAP to 35, with the calculation in comments. - fy2027_cola.yaml: the California case tests the published FY2027 minimum allotment. At $14,000 of Social Security the household got an SSP and, under the regular standard, SNAP of $26 and $38, above the minimum. Raise the income to $17,000, which is above both California aged standards plus the $20 disregard, so no SSI or SSP is paid and the case again gets the $24 and $25 minimums whatever the input says. - test_social_security_current_law.py: the raw_core_dataset probe route set no state, so its 2026 household was in the default state (CA) and household_net_income@2026 included the California SSP. The differential compares with pinned pre-feature main 8986e05, so the default change showed as a $1,489.44 mismatch (SSP -$1,546.44, SNAP +$57). Put the raw dataset household in Texas in 2024 and 2026, as situation() does; state_code has a formula, so a 2024 input alone does not reach 2026. Co-Authored-By: Claude Opus 5.5 --- .../test_social_security_current_law.py | 6 ++++++ .../baseline/gov/usda/snap/fy2027_cola.yaml | 15 ++++++++++++++- ..._unearned_income_state_ssi_supplements.yaml | 18 +++++++++++++----- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/policyengine_us/tests/microsimulation/test_social_security_current_law.py b/policyengine_us/tests/microsimulation/test_social_security_current_law.py index f07988fd6b2..6bca1a7bdd7 100644 --- a/policyengine_us/tests/microsimulation/test_social_security_current_law.py +++ b/policyengine_us/tests/microsimulation/test_social_security_current_law.py @@ -482,6 +482,12 @@ def record_live_value(route, simulation, variable, year): { "age__2024": [70], "social_security_retirement__2024": [12_000], + # Texas in both snapshot years, as in situation(). state_code has + # a formula, so a 2024 input alone leaves 2026 on the default + # state (CA), where this household's SSI/SSP state supplement + # brings unrelated California law into household_net_income. + "state_code__2024": ["TX"], + "state_code__2026": ["TX"], } ) simulation = CoreSimulation( diff --git a/policyengine_us/tests/policy/baseline/gov/usda/snap/fy2027_cola.yaml b/policyengine_us/tests/policy/baseline/gov/usda/snap/fy2027_cola.yaml index cf34ab69a96..d174747b253 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/snap/fy2027_cola.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/snap/fy2027_cola.yaml @@ -253,7 +253,20 @@ input: age: 65 state_code: CA - social_security_retirement: 14_000 + # $17,000 / 12 = $1,416.67 a month; less the $20 disregard, $1,396.67 is + # above the $994 federal SSI rate and both California aged standards + # ($1,233.94, or $1,362.81 with the WIC 12200(e) restaurant meals + # allowance). No SSI or SSP is paid, so SNAP does not depend on + # living_arrangements_allow_for_food_preparation. At $14,000 the household + # got an SSP and, without the allowance, SNAP of $26 in September and $38 + # from October, above the minimum. + # September: 1,416.67 - 209 = 1,207.67; shelter 663 - 603.83 = 59.17; + # net 1,148.50, rounded to 1,149; 30% = 344.70, rounded up to 345 > $298, + # so the $24 minimum applies. + # October: 1,416.67 - 217 = 1,199.67; shelter 663 - 599.83 = 63.17; + # net 1,136.50, rounded to 1,137; 30% = 341.10, rounded up to 342 > $306, + # so the $25 minimum applies. + social_security_retirement: 17_000 takes_up_snap_if_eligible: true output: snap_max_allotment: 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 1d0a59b185f..aabb7771aee 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 @@ -16,11 +16,18 @@ state_name: CA output: ssi: 994 - ca_state_supplement: 368.81 # 1,233.94 + 128.87 - 994 + # Independent-living standard $1,233.94 - $994 federal SSI. The household + # does not report that its living arrangement prevents meal preparation, so + # it gets no restaurant meals allowance (WIC 12200(e)). + ca_state_supplement: 239.94 # Without the supplement the household's SNAP unearned income would be the # $994 federal SSI benefit alone, and SNAP would be $143. - snap_unearned_income: 1_362.81 - snap: 24 + snap_unearned_income: 1_233.94 # 994 + 239.94 + # 1,233.94 - 209 standard deduction = 1,024.94; excess shelter deduction + # 663 utility allowance - 50% x 1,024.94 = 150.53; net income + # 1,024.94 - 150.53 = 874.41, rounded to 874; 30% x 874 = 262.20, rounded + # up to 263; 298 maximum allotment - 263 = 35. + snap: 35 - name: Massachusetts state supplement counts as SNAP unearned income. period: 2026-01 @@ -62,8 +69,9 @@ members: [person1, person2] state_name: CA output: - ca_state_supplement: 368.81 # 1,233.94 + 128.87 - 994 - snap_unearned_income: 1_362.81 + # $1,233.94 - $994, with no restaurant meals allowance (WIC 12200(e)). + ca_state_supplement: 239.94 + snap_unearned_income: 1_233.94 # 994 + 239.94 # Indiana pays its Residential Care Assistance Program supplement to the # facility as a per diem. 273.9(b)(2)(i) counts assistance "even if provided in From c0b77938e15f779ecdca39283e236ff9221e74d6 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 30 Oct 2026 10:07:50 -0400 Subject: [PATCH 3/5] Update the California SSP partner cases for the new meals allowance default The three aged California cases do not describe a household without a kitchen, so they now get the regular SSI/SSP standard: 2,879.28, 7,293.96 and 2,117.28 for 2026. The partner gate was confirmed by hua7450 (2026-10-29) and Pavel (2026-10-30). Co-Authored-By: Claude Opus 5.5 --- .../edge_cases/state/ca/state_supplement.yaml | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 4e95fb11a6a..18ca49e3d57 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 @@ -1,8 +1,9 @@ # CA SSI State Supplementary Payment (SSP) partner edge cases. # 2026 payment standards (2026-01-01 params): aged/disabled single $1,233.94, # married (both aged/disabled) $2,098.83; food allowance single $128.87, -# married $257.74 (applies when living arrangements do not allow food -# preparation, the model default). 2026 SSI FBR: $994 single, $1,491 couple. +# married $257.74 (applies only when living arrangements do not allow food +# preparation; the model default allows it, so these cases get no food +# allowance). 2026 SSI FBR: $994 single, $1,491 couple. # SSP = payment standard - SSI - SSI countable income. - name: ca_state_supplement_aged_single_no_income_max (ca) period: 2026 @@ -41,9 +42,9 @@ output: spm_units: spm_unit: - # Standard: 1,233.94 + 128.87 food = 1,362.81; SSI = 994 FBR (no income). - # SSP: (1,362.81 - 994) x 12 = 368.81 x 12 = 4,425.72. - ca_state_supplement: 4_425.72 + # Standard: 1,233.94 (no food allowance); SSI = 994 FBR (no income). + # SSP: (1,233.94 - 994) x 12 = 239.94 x 12 = 2,879.28. + ca_state_supplement: 2_879.28 - name: ca_state_supplement_aged_couple_no_income (ca) period: 2026 absolute_error_margin: 0.1 @@ -91,9 +92,9 @@ output: spm_units: spm_unit: - # Both aged: married standard 2,098.83 + married food 257.74 = 2,356.57; - # SSI couple FBR 1,491. SSP: (2,356.57 - 1,491) x 12 = 865.57 x 12 = 10,386.84. - ca_state_supplement: 10_386.84 + # 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 - name: ca_state_supplement_aged_single_earnings_partial (ca) period: 2026 absolute_error_margin: 0.1 @@ -133,8 +134,8 @@ spm_unit: # $2,200/mo earned: SSI countable = (2,200 - 20 - 65) / 2 = 1,057.50 # > 994 FBR -> federal SSI = 0, but SSP standard is higher: - # SSP: (1,362.81 - 0 - 1,057.50) x 12 = 305.31 x 12 = 3,663.72. - ca_state_supplement: 3_663.72 + # SSP: (1,233.94 - 0 - 1,057.50) x 12 = 176.44 x 12 = 2,117.28. + ca_state_supplement: 2_117.28 - name: ca_state_supplement_resources_above_limit_ineligible (ca) period: 2026 absolute_error_margin: 0.1 From f4eeeed87aaaff0b38b26d6e0cf141c6240053fe Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 30 Oct 2026 12:31:49 -0400 Subject: [PATCH 4/5] Update CAPI Case 5 for the new food preparation default PR 10379 (now on main) added CAPI Case 5, which relied on the old default of no food preparation and so expected the no-cooking food allowance. With living arrangements now allowing food preparation by default, Case 5 gets the disabled individual standard alone: 1,233.94 x 12 = 14,807.28. Co-Authored-By: Claude Opus 5.5 --- .../baseline/gov/states/ca/cdss/capi/ca_capi.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 3d9df8abdac..ba3bf69df9c 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 @@ -117,13 +117,13 @@ ca_state_supplement_blind_amount: 0 ca_state_supplement_aged_blind_disabled_amount: 0 ca_state_supplement: 0 - # Disabled individual standard 1,233.94 + no-cooking food allowance - # 128.87 (living arrangements default to no food preparation) = - # 1,362.81 per month with no offset. Earnings of 83.33 per month fall - # within the $20 + $65 exclusions, so countable income is 0 (until PR - # 10240, SSI also zeroes this income for people who fail its noncitizen - # test). 1,362.81 x 12 = 16,353.72. - ca_capi: 16_353.72 + # Disabled individual standard 1,233.94 per month with no offset. Living + # arrangements allow food preparation by default, so no no-cooking food + # allowance applies. Earnings of 83.33 per month fall within the + # $20 + $65 exclusions, so countable income is 0 (until PR 10240, SSI + # also zeroes this income for people who fail its noncitizen test). + # 1,233.94 x 12 = 14,807.28. + ca_capi: 14_807.28 - name: Case 6, mixed couple, only the noncitizen spouse receives CAPI. period: 2026 From 30b0a6a7c2847683df829497370c7912156deb45 Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 30 Oct 2026 12:36:03 -0400 Subject: [PATCH 5/5] Update the CAPI note on the food preparation default The note from PR 10379 said the input had no default, so every aged or disabled person got the no-cooking allowance. The input now defaults to true, so the allowance applies only when the input is set to false. Co-Authored-By: Claude Opus 5.5 --- .../gov/states/ca/cdss/capi/_ca_capi_ssi_ssp_standard.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 1461cb59c89..41408ff9b62 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 @@ -71,10 +71,10 @@ def ca_capi_ssi_ssp_standard(person, period, parameters): aged_or_disabled = (age >= p.aged_or_disabled.age_threshold) | person( "is_ssi_disabled", period.this_year ) - # NOTE: living_arrangements_allow_for_food_preparation has no default - # value and the microdata do not set it, so every aged or disabled - # person gets the no-cooking allowance (+$128.87 a month in 2026, +$257.74 - # for a couple) unless it is set (issue 10296). + # 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 )