From b2c2f5e2729d0ef1cd0d087c961ff2d5b846fcdf Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 30 Oct 2026 18:06:13 -0400 Subject: [PATCH 1/2] Mark disabled dependent children eligible for the CA state supplement ca_state_supplement_eligible_person now covers blind or disabled dependents below the dependent age limit, and the dependent amount reads the flag instead of repeating its checks. The aged or disabled count, the facility amounts and the CAPI spouse share keep the head-or-spouse condition, so payments are unchanged. Fixes #10553 Co-Authored-By: Claude Opus 5.5 --- ...sp-eligible-person-minor-children.fixed.md | 1 + .../ca_state_supplement_eligible_person.yaml | 51 +++++++++++++++++++ .../ca/cdss/capi/_ca_capi_ssi_ssp_standard.py | 8 +-- .../ca_state_supplement_eligible_person.py | 7 ++- ...ca_state_supplement_aged_disabled_count.py | 4 +- .../ca_state_supplement_dependent_amount.py | 22 ++------ ...supplement_medical_care_facility_amount.py | 6 ++- ...lement_out_of_home_care_facility_amount.py | 4 +- 8 files changed, 79 insertions(+), 24 deletions(-) create mode 100644 changelog.d/ca-ssp-eligible-person-minor-children.fixed.md diff --git a/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md b/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md new file mode 100644 index 00000000000..9634f6c4cd6 --- /dev/null +++ b/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md @@ -0,0 +1 @@ +Make ca_state_supplement_eligible_person true for blind or disabled dependent children under 18, who receive California's dependent supplement amount. 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 819986ce413..96616c93b05 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 @@ -41,3 +41,54 @@ state_code: CA output: ca_state_supplement_eligible_person: false + +- name: Disabled dependent child below the age limit + period: 2026 + input: + people: + person1: + age: 33 + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: false + immigration_status: CITIZEN + person2: + age: 17 + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + 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 + input: + people: + person1: + age: 45 + meets_ssi_resource_test: true + is_ssi_aged_blind_disabled: false + immigration_status: CITIZEN + 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] + households: + household: + members: [person1, person2] + state_code: CA + output: + ca_state_supplement_eligible_person: [false, false] 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 41408ff9b62..f3ca99c0fd8 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 @@ -32,12 +32,14 @@ def ca_capi_spouse_ssi_ssp(person, period): 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 members eligible for it; a citizen disabled child's - supplement in the unit is then attributed to the spouse. + 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. """ 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) + 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 ) 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 c4852874796..aa877ef35c0 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 @@ -10,15 +10,20 @@ class ca_state_supplement_eligible_person(Variable): reference = "https://law.justia.com/codes/california/code-wic/division-9/part-3/chapter-3/article-4/" 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 and couple amounts; dependents + # below the age limit get the dependent amount. 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 + & (is_head_or_spouse | (dependent & minor)) ) 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 index ec310240c41..27f19ad9f3d 100644 --- 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 @@ -18,4 +18,6 @@ def formula(spm_unit, period, parameters): 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) - return spm_unit.sum(aged_or_disabled * eligible) + # Dependent children get 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_dependent_amount.py b/policyengine_us/variables/gov/states/ca/cdss/state_supplement/payment_standard/ca_state_supplement_dependent_amount.py index aa37b9ab887..119b64cf2f1 100644 --- 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 @@ -13,24 +13,12 @@ class ca_state_supplement_dependent_amount(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard person = spm_unit.members - # Blind amount - blind = person("is_blind", period) - is_ssi_disabled = person("is_ssi_disabled", period.this_year) age = person("monthly_age", period) - # Dependent amount dependent = person("is_tax_unit_dependent", period) dependent_age_eligible = age < p.dependent.age_limit - # The child must meet the SSI/SSP conditions that - # ca_state_supplement_eligible_person applies to adults; a child who - # fails SSI's noncitizen test gets CAPI instead (WIC 18938, 18941). - immigration_status = person("immigration_status", period.this_year) - is_citizen = immigration_status == immigration_status.possible_values.CITIZEN - is_qualified_noncitizen = person( - "is_ssi_qualified_noncitizen", period.this_year - ) - meets_resource_test = person("meets_ssi_resource_test", period) - eligible = meets_resource_test & (is_citizen | is_qualified_noncitizen) - dependent_count = spm_unit.sum( - dependent & dependent_age_eligible & (is_ssi_disabled | blind) & eligible - ) + # 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 * p.dependent.amount 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 index 7f3943e31c4..537d4145fba 100644 --- 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 @@ -15,6 +15,10 @@ def formula(spm_unit, period, parameters): # Medical care facility amount person = spm_unit.members eligible = person("ca_state_supplement_eligible_person", period) + # Dependent children get 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) + medical_care_facility_count = spm_unit.sum( + in_medical_care_facility * eligible * head_or_spouse + ) return medical_care_facility_count * 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 index ede509980e9..cdc57888a10 100644 --- 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 @@ -14,8 +14,10 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard person = spm_unit.members eligible = person("ca_state_supplement_eligible_person", period) + # Dependent children get 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 + in_out_of_home_care_facility * eligible * head_or_spouse ) return out_of_home_care_facility_count * p.allowance.out_of_home_care From 4664bf5e5e31a22f2591cd366ab0741be7dc712d Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 30 Oct 2026 20:54:03 -0400 Subject: [PATCH 2/2] Cover the CA SSP flag's downstream effects in tests Add cases for the San Bernardino General Relief bar on a child with an SSP-only payment and for the head-or-spouse check in both facility amounts. Describe the dependent amount as a model simplification and point the 18-year-old age-limit case to the follow-up issue. Refs #10557 Co-Authored-By: Claude Opus 5.5 --- ...sp-eligible-person-minor-children.fixed.md | 2 +- ...relief_receives_other_cash_assistance.yaml | 28 +++++++++++++++++++ .../ca_state_supplement_eligible_person.yaml | 3 ++ ...pplement_medical_care_facility_amount.yaml | 22 +++++++++++++++ ...ment_out_of_home_care_facility_amount.yaml | 22 +++++++++++++++ .../ca_state_supplement_eligible_person.py | 13 +++++++-- ...ca_state_supplement_aged_disabled_count.py | 2 +- ...supplement_medical_care_facility_amount.py | 2 +- ...lement_out_of_home_care_facility_amount.py | 2 +- 9 files changed, 89 insertions(+), 7 deletions(-) diff --git a/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md b/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md index 9634f6c4cd6..b55ac214737 100644 --- a/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md +++ b/changelog.d/ca-ssp-eligible-person-minor-children.fixed.md @@ -1 +1 @@ -Make ca_state_supplement_eligible_person true for blind or disabled dependent children under 18, who receive California's dependent supplement amount. +Make ca_state_supplement_eligible_person true for blind or disabled dependents under 18, whom the model pays California's dependent supplement amount. 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 5b4d7a1a12a..f2420462043 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 @@ -177,3 +177,31 @@ # ca_state_supplement is an ungated computed entitlement; with take-up # declined no SSP check arrives, so 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 + input: + people: + person1: + age: 40 + ssi: 0 + person2: + age: 10 + is_disabled: true + meets_ssi_disability_criteria: true + ssi: 0 + 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: + members: [person1, person2] + 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. + ca_sbd_general_relief_receives_other_cash_assistance: [false, true] 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 96616c93b05..0d53fc82ed2 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 @@ -91,4 +91,7 @@ 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] 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 index 54788888e2d..f60f86e39d8 100644 --- 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 @@ -77,3 +77,25 @@ 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 index e5776e8e252..bb23657c64b 100644 --- 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 @@ -77,3 +77,25 @@ 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/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 aa877ef35c0..6dfe1c4c81d 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 @@ -7,7 +7,10 @@ class ca_state_supplement_eligible_person(Variable): label = "California SSI state supplement eligible person" definition_period = MONTH defined_for = StateCode.CA - reference = "https://law.justia.com/codes/california/code-wic/division-9/part-3/chapter-3/article-4/" + 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", + ) def formula(person, period, parameters): p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard @@ -16,8 +19,12 @@ def formula(person, period, parameters): 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 and couple amounts; dependents - # below the age limit get the dependent amount. + # 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 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 index 27f19ad9f3d..e0a358ffb39 100644 --- 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 @@ -18,6 +18,6 @@ def formula(spm_unit, period, parameters): 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) - # Dependent children get the dependent amount instead. + # 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_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 index 537d4145fba..c72962e0b2a 100644 --- 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 @@ -15,7 +15,7 @@ def formula(spm_unit, period, parameters): # Medical care facility amount person = spm_unit.members eligible = person("ca_state_supplement_eligible_person", period) - # Dependent children get the dependent amount instead. + # 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( 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 index cdc57888a10..c224d308335 100644 --- 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 @@ -14,7 +14,7 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.cdss.state_supplement.payment_standard person = spm_unit.members eligible = person("ca_state_supplement_eligible_person", period) - # Dependent children get the dependent amount instead. + # 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(