From 5ef0be907e616f575d572efcdb52f1a8a5dfe2fc Mon Sep 17 00:00:00 2001 From: Ziming Date: Wed, 20 May 2026 17:19:50 -0400 Subject: [PATCH 1/9] Add San Mateo County General Assistance --- changelog.d/added/8359.md | 1 + .../general_assistance/income/sources.yaml | 23 +++ .../drug_alcohol_treatment_center.yaml | 10 ++ .../payment_standard/independent_living.yaml | 10 ++ .../payment_standard/nmohc_with_referral.yaml | 15 ++ .../nmohc_without_referral.yaml | 10 ++ .../general_assistance/property/limit.yaml | 12 ++ .../general_assistance/property/sources.yaml | 12 ++ .../qualified_immigration_statuses.yaml | 17 +++ .../ca_smc_general_assistance.yaml | 26 ++++ .../ca_smc_general_assistance_eligible.yaml | 39 +++++ ...ce_immigration_status_eligible_person.yaml | 31 ++++ ...mc_general_assistance_income_eligible.yaml | 26 ++++ ..._general_assistance_property_eligible.yaml | 15 ++ .../smc/general_assistance/integration.yaml | 144 ++++++++++++++++++ ...c_general_assistance_payment_standard.yaml | 39 +++++ ...al_assistance_countable_vehicle_value.yaml | 26 ++++ .../baseline/gov/local/ca/smc/in_smc.yaml | 13 ++ .../ca_smc_general_assistance.py | 19 +++ ...c_general_assistance_living_arrangement.py | 19 +++ .../ca_smc_general_assistance_eligible.py | 25 +++ ...ance_immigration_status_eligible_person.py | 18 +++ ..._smc_general_assistance_income_eligible.py | 15 ++ ...mc_general_assistance_property_eligible.py | 19 +++ ...smc_general_assistance_countable_income.py | 13 ++ ...smc_general_assistance_payment_standard.py | 34 +++++ ...c_general_assistance_countable_property.py | 13 ++ ...eral_assistance_countable_vehicle_value.py | 22 +++ .../variables/gov/local/ca/smc/in_smc.py | 11 ++ sources/working_references.md | 42 +++++ 30 files changed, 719 insertions(+) create mode 100644 changelog.d/added/8359.md create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/in_smc.yaml create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py create mode 100644 policyengine_us/variables/gov/local/ca/smc/in_smc.py create mode 100644 sources/working_references.md diff --git a/changelog.d/added/8359.md b/changelog.d/added/8359.md new file mode 100644 index 00000000000..2a961c84193 --- /dev/null +++ b/changelog.d/added/8359.md @@ -0,0 +1 @@ +Add San Mateo County General Assistance. diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml new file mode 100644 index 00000000000..cb76cf32623 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml @@ -0,0 +1,23 @@ +description: San Mateo County counts these income sources under the General Assistance program. +values: + 2025-02-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - unemployment_compensation + - disability_benefits + - ca_state_disability_insurance + - social_security + - ssi + - pension_income + - retirement_distributions + - interest_income + - child_support_received + - alimony_income +metadata: + unit: list + period: year + label: San Mateo County General Assistance income sources + reference: + - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Income Limits for Applicants + href: https://www.smcgov.org/media/153295/download?inline=#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml new file mode 100644 index 00000000000..8833b587eea --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml @@ -0,0 +1,10 @@ +description: San Mateo County provides this amount as the payment standard under the General Assistance program. +values: + 2023-10-01: 732 +metadata: + unit: currency-USD + period: month + label: San Mateo County General Assistance drug and alcohol treatment center payment standard + reference: + - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance + href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml new file mode 100644 index 00000000000..d4e4e4ff788 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml @@ -0,0 +1,10 @@ +description: San Mateo County provides this amount as the payment standard under the General Assistance program. +values: + 2023-10-01: 732 +metadata: + unit: currency-USD + period: month + label: San Mateo County General Assistance independent living payment standard + reference: + - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance + href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml new file mode 100644 index 00000000000..b72e1df5111 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml @@ -0,0 +1,15 @@ +description: San Mateo County provides this amount as the payment standard under the General Assistance program. +values: + 2025-01-01: 1_599.07 + 2026-01-01: 1_626.07 +metadata: + unit: currency-USD + period: month + label: San Mateo County General Assistance NMOHC with BHRS/SMMC referral payment standard + reference: + - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance + href: https://www.smcgov.org/media/156974/download?inline=#page=1 + - title: San Mateo County Board File 26-290, Modification to the General Assistance Program Rules and Regulations + href: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1 + - title: San Mateo County Board File 26-290, Fiscal Impact + href: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml new file mode 100644 index 00000000000..ff6de8f431f --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml @@ -0,0 +1,10 @@ +description: San Mateo County provides this amount as the payment standard under the General Assistance program. +values: + 2023-10-01: 732 +metadata: + unit: currency-USD + period: month + label: San Mateo County General Assistance NMOHC without referral payment standard + reference: + - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance + href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml new file mode 100644 index 00000000000..5651f3d5cde --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml @@ -0,0 +1,12 @@ +description: San Mateo County limits property to this amount under the General Assistance program. +values: + 2023-10-01: 1_464 +metadata: + unit: currency-USD + period: year + label: San Mateo County General Assistance property limit + reference: + - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Property Limits + href: https://www.smcgov.org/media/153295/download?inline=#page=2 + - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance + href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml new file mode 100644 index 00000000000..46d5a619a0a --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml @@ -0,0 +1,12 @@ +description: San Mateo County counts these sources as property under the General Assistance program. +values: + 2025-02-01: + - spm_unit_cash_assets + - ca_smc_general_assistance_countable_vehicle_value +metadata: + unit: list + period: year + label: San Mateo County General Assistance property sources + reference: + - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Property Limits + href: https://www.smcgov.org/media/153295/download?inline=#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml new file mode 100644 index 00000000000..61004dbc807 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml @@ -0,0 +1,17 @@ +description: San Mateo County limits General Assistance to these immigration statuses. +values: + 2025-02-01: + - CITIZEN + - LEGAL_PERMANENT_RESIDENT + - REFUGEE + - ASYLEE + - DEPORTATION_WITHHELD + - CUBAN_HAITIAN_ENTRANT + - CONDITIONAL_ENTRANT +metadata: + unit: list + period: year + label: San Mateo County General Assistance qualified immigration statuses + reference: + - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Immigration Eligibility + href: https://www.smcgov.org/media/153295/download?inline=#page=1 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml new file mode 100644 index 00000000000..ae3f12c615c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml @@ -0,0 +1,26 @@ +- name: Case 1, eligible unit receives standard less countable income. + period: 2026-01 + input: + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 200 + output: + ca_smc_general_assistance: 532 + +- name: Case 2, benefit floors at zero. + period: 2026-01 + input: + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 800 + output: + ca_smc_general_assistance: 0 + +- name: Case 3, ineligible unit receives zero. + period: 2026-01 + input: + ca_smc_general_assistance_eligible: false + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 0 + output: + ca_smc_general_assistance: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml new file mode 100644 index 00000000000..d595f77a1fe --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml @@ -0,0 +1,39 @@ +- name: Case 1, eligible when all modeled tests pass. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_immigration_status_eligible_person: true + ca_smc_general_assistance_income_eligible: true + ca_smc_general_assistance_property_eligible: true + output: + ca_smc_general_assistance_eligible: true + +- name: Case 2, ineligible when immigration test fails. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_immigration_status_eligible_person: false + ca_smc_general_assistance_income_eligible: true + ca_smc_general_assistance_property_eligible: true + output: + ca_smc_general_assistance_eligible: false + +- name: Case 3, ineligible when income test fails. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_immigration_status_eligible_person: true + ca_smc_general_assistance_income_eligible: false + ca_smc_general_assistance_property_eligible: true + output: + ca_smc_general_assistance_eligible: false + +- name: Case 4, ineligible when property test fails. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_immigration_status_eligible_person: true + ca_smc_general_assistance_income_eligible: true + ca_smc_general_assistance_property_eligible: false + output: + ca_smc_general_assistance_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.yaml new file mode 100644 index 00000000000..a8f0c578911 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.yaml @@ -0,0 +1,31 @@ +- name: Case 1, citizen is eligible. + period: 2026 + input: + in_smc: true + immigration_status: CITIZEN + output: + ca_smc_general_assistance_immigration_status_eligible_person: true + +- name: Case 2, legal permanent resident is eligible. + period: 2026 + input: + in_smc: true + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + ca_smc_general_assistance_immigration_status_eligible_person: true + +- name: Case 3, refugee is eligible. + period: 2026 + input: + in_smc: true + immigration_status: REFUGEE + output: + ca_smc_general_assistance_immigration_status_eligible_person: true + +- name: Case 4, undocumented person is ineligible. + period: 2026 + input: + in_smc: true + immigration_status: UNDOCUMENTED + output: + ca_smc_general_assistance_immigration_status_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml new file mode 100644 index 00000000000..18d910f0189 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml @@ -0,0 +1,26 @@ +- name: Case 1, income below payment standard is eligible. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_countable_income: 731 + ca_smc_general_assistance_payment_standard: 732 + output: + ca_smc_general_assistance_income_eligible: true + +- name: Case 2, income at payment standard is eligible. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_countable_income: 732 + ca_smc_general_assistance_payment_standard: 732 + output: + ca_smc_general_assistance_income_eligible: true + +- name: Case 3, income above payment standard is ineligible. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_countable_income: 733 + ca_smc_general_assistance_payment_standard: 732 + output: + ca_smc_general_assistance_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml new file mode 100644 index 00000000000..2620113e850 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml @@ -0,0 +1,15 @@ +- name: Case 1, property below limit is eligible. + period: 2026 + input: + in_smc: true + ca_smc_general_assistance_countable_property: 1_463 + output: + ca_smc_general_assistance_property_eligible: true + +- name: Case 2, property at limit is ineligible. + period: 2026 + input: + in_smc: true + ca_smc_general_assistance_countable_property: 1_464 + output: + ca_smc_general_assistance_property_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml new file mode 100644 index 00000000000..4c2cbc344e0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml @@ -0,0 +1,144 @@ +- name: Case 1, independent living unit with no income receives full standard. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance: 732 + +- name: Case 2, independent living unit with income receives reduced benefit. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 2_400 + immigration_status: CITIZEN + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_countable_income: 200 + ca_smc_general_assistance: 532 + +- name: Case 3, income above independent living standard makes unit ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + employment_income: 8_796 + immigration_status: CITIZEN + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_countable_income: 733 + ca_smc_general_assistance_income_eligible: false + ca_smc_general_assistance: 0 + +- name: Case 4, NMOHC with referral uses 2025 standard. + period: 2025-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: LEGAL_PERMANENT_RESIDENT + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_living_arrangement: NMOHC_WITH_REFERRAL + output: + ca_smc_general_assistance: 1_599.07 + +- name: Case 5, NMOHC with referral uses 2026 standard and offsets income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + employment_income: 3_000 + immigration_status: REFUGEE + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_living_arrangement: NMOHC_WITH_REFERRAL + output: + ca_smc_general_assistance_payment_standard: 1_626.07 + ca_smc_general_assistance_countable_income: 250 + ca_smc_general_assistance: 1_376.07 + +- name: Case 6, property at limit makes unit ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + spm_unit_cash_assets: 1_464 + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_property_eligible: false + ca_smc_general_assistance: 0 + +- name: Case 7, one vehicle is excluded from property. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + households: + household: + members: [person1] + in_smc: true + household_vehicles_owned: 1 + household_vehicles_value: 50_000 + spm_units: + spm_unit: + members: [person1] + spm_unit_cash_assets: 1_463 + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_countable_vehicle_value: 0 + ca_smc_general_assistance_property_eligible: true + ca_smc_general_assistance: 732 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.yaml new file mode 100644 index 00000000000..0aaad92b5ae --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.yaml @@ -0,0 +1,39 @@ +- name: Case 1, independent living standard. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_payment_standard: 732 + +- name: Case 2, drug and alcohol treatment center standard. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_living_arrangement: DRUG_ALCOHOL_TREATMENT_CENTER + output: + ca_smc_general_assistance_payment_standard: 732 + +- name: Case 3, NMOHC without referral standard. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_living_arrangement: NMOHC_WITHOUT_REFERRAL + output: + ca_smc_general_assistance_payment_standard: 732 + +- name: Case 4, NMOHC with referral 2025 standard. + period: 2025-01 + input: + in_smc: true + ca_smc_general_assistance_living_arrangement: NMOHC_WITH_REFERRAL + output: + ca_smc_general_assistance_payment_standard: 1_599.07 + +- name: Case 5, NMOHC with referral 2026 standard. + period: 2026-01 + input: + in_smc: true + ca_smc_general_assistance_living_arrangement: NMOHC_WITH_REFERRAL + output: + ca_smc_general_assistance_payment_standard: 1_626.07 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml new file mode 100644 index 00000000000..227503cc6bd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml @@ -0,0 +1,26 @@ +- name: Case 1, one vehicle is fully excluded. + period: 2026 + input: + in_smc: true + household_vehicles_owned: 1 + household_vehicles_value: 20_000 + output: + ca_smc_general_assistance_countable_vehicle_value: 0 + +- name: Case 2, average value of vehicles beyond the first is countable. + period: 2026 + input: + in_smc: true + household_vehicles_owned: 2 + household_vehicles_value: 20_000 + output: + ca_smc_general_assistance_countable_vehicle_value: 10_000 + +- name: Case 3, no vehicle value is countable when no vehicles are owned. + period: 2026 + input: + in_smc: true + household_vehicles_owned: 0 + household_vehicles_value: 0 + output: + ca_smc_general_assistance_countable_vehicle_value: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/in_smc.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/in_smc.yaml new file mode 100644 index 00000000000..3090f958bac --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/in_smc.yaml @@ -0,0 +1,13 @@ +- name: Case 1, San Mateo County is true. + period: 2026 + input: + county_str: SAN_MATEO_COUNTY_CA + output: + in_smc: true + +- name: Case 2, another county is false. + period: 2026 + input: + county_str: LOS_ANGELES_COUNTY_CA + output: + in_smc: false diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py new file mode 100644 index 00000000000..366af2055e0 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "San Mateo County General Assistance" + definition_period = MONTH + defined_for = "ca_smc_general_assistance_eligible" + reference = ( + "https://www.smcgov.org/media/153295/download?inline=#page=2", + "https://www.smcgov.org/media/156974/download?inline=#page=1", + ) + + def formula(spm_unit, period, parameters): + standard = spm_unit("ca_smc_general_assistance_payment_standard", period) + income = spm_unit("ca_smc_general_assistance_countable_income", period) + return max_(standard - income, 0) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py new file mode 100644 index 00000000000..799bacb478d --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class CaSMCGeneralAssistanceLivingArrangement(Enum): + INDEPENDENT_LIVING = "Independent living" + DRUG_ALCOHOL_TREATMENT_CENTER = "Drug and alcohol treatment center" + NMOHC_WITHOUT_REFERRAL = "Non-medical out-of-home care without BHRS/SMMC referral" + NMOHC_WITH_REFERRAL = "Non-medical out-of-home care with BHRS/SMMC referral" + + +class ca_smc_general_assistance_living_arrangement(Variable): + value_type = Enum + entity = SPMUnit + label = "San Mateo County General Assistance living arrangement" + definition_period = MONTH + defined_for = "in_smc" + possible_values = CaSMCGeneralAssistanceLivingArrangement + default_value = CaSMCGeneralAssistanceLivingArrangement.INDEPENDENT_LIVING + reference = "https://www.smcgov.org/media/156974/download?inline=#page=1" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py new file mode 100644 index 00000000000..b9a4ea908b5 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for San Mateo County General Assistance" + definition_period = MONTH + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=1" + + def formula(spm_unit, period, parameters): + immigration_eligible = ( + add( + spm_unit, + period, + ["ca_smc_general_assistance_immigration_status_eligible_person"], + ) + > 0 + ) + return ( + immigration_eligible + & spm_unit("ca_smc_general_assistance_income_eligible", period) + & spm_unit("ca_smc_general_assistance_property_eligible", period) + ) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.py new file mode 100644 index 00000000000..801b33abe12 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_immigration_status_eligible_person.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_immigration_status_eligible_person(Variable): + value_type = bool + entity = Person + label = "Eligible for San Mateo County General Assistance due to immigration status" + definition_period = MONTH + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=1" + + def formula(person, period, parameters): + p = parameters(period).gov.local.ca.smc.general_assistance + immigration_status = person("immigration_status", period.this_year) + return np.isin( + immigration_status.decode_to_str(), + p.qualified_immigration_statuses, + ) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py new file mode 100644 index 00000000000..f5a689538f8 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for San Mateo County General Assistance due to income" + definition_period = MONTH + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + + def formula(spm_unit, period, parameters): + income = spm_unit("ca_smc_general_assistance_countable_income", period) + standard = spm_unit("ca_smc_general_assistance_payment_standard", period) + return income <= standard diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py new file mode 100644 index 00000000000..7ed5764175c --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_property_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for San Mateo County General Assistance due to property" + definition_period = YEAR + defined_for = "in_smc" + reference = ( + "https://www.smcgov.org/media/153295/download?inline=#page=2", + "https://www.smcgov.org/media/156974/download?inline=#page=1", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.local.ca.smc.general_assistance.property + return ( + spm_unit("ca_smc_general_assistance_countable_property", period) < p.limit + ) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py new file mode 100644 index 00000000000..76dbc2a55e8 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_countable_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "San Mateo County General Assistance countable income" + definition_period = MONTH + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + + adds = "gov.local.ca.smc.general_assistance.income.sources" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py new file mode 100644 index 00000000000..4209104e34c --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_payment_standard(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "San Mateo County General Assistance payment standard" + definition_period = MONTH + defined_for = "in_smc" + reference = ( + "https://www.smcgov.org/media/156974/download?inline=#page=1", + "https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.local.ca.smc.general_assistance.payment_standard + arrangement = spm_unit("ca_smc_general_assistance_living_arrangement", period) + arrangements = arrangement.possible_values + return select( + [ + arrangement == arrangements.INDEPENDENT_LIVING, + arrangement == arrangements.DRUG_ALCOHOL_TREATMENT_CENTER, + arrangement == arrangements.NMOHC_WITHOUT_REFERRAL, + arrangement == arrangements.NMOHC_WITH_REFERRAL, + ], + [ + p.independent_living, + p.drug_alcohol_treatment_center, + p.nmohc_without_referral, + p.nmohc_with_referral, + ], + default=p.independent_living, + ) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py new file mode 100644 index 00000000000..38249aa38ed --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_countable_property(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "San Mateo County General Assistance countable property" + definition_period = YEAR + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + + adds = "gov.local.ca.smc.general_assistance.property.sources" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py new file mode 100644 index 00000000000..38ab04ca31e --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_countable_vehicle_value(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "San Mateo County General Assistance countable vehicle value" + definition_period = YEAR + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + + def formula(spm_unit, period, parameters): + household = spm_unit.household + vehicle_count = household("household_vehicles_owned", period) + vehicle_value = household("household_vehicles_value", period) + average_vehicle_value = where( + vehicle_count > 0, + vehicle_value / vehicle_count, + 0, + ) + return average_vehicle_value * max_(vehicle_count - 1, 0) diff --git a/policyengine_us/variables/gov/local/ca/smc/in_smc.py b/policyengine_us/variables/gov/local/ca/smc/in_smc.py new file mode 100644 index 00000000000..b27806602de --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/in_smc.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class in_smc(Variable): + value_type = bool + entity = Household + definition_period = YEAR + label = "Is in San Mateo County" + + def formula(household, period, parameters): + return household("county_str", period) == "SAN_MATEO_COUNTY_CA" diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..d8e64d97b61 --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,42 @@ +# San Mateo County General Assistance working references + +Program: San Mateo County Human Services Agency General Assistance (GA) + +Variable prefix: `ca_smc_general_assistance` + +Local source copies: +- `/tmp/ca-smc-ga-sources/general_assistance_fact_sheet.pdf` +- `/tmp/ca-smc-ga-sources/standards_of_assistance.pdf` +- `/tmp/ca-smc-ga-sources/nmohc_2026_board_memo.pdf` +- `/tmp/ca-smc-ga-sources/time_limits_2026_resolution.pdf` + +Official source URLs: +- General Assistance program page: https://www.smcgov.org/hsa/general-assistance-ga +- Fact sheet PDF, dated 02.2025: https://www.smcgov.org/media/153295/download?inline=#page=1 +- Standards of Assistance PDF, C-335 Rev. 12.2025: https://www.smcgov.org/media/156974/download?inline=#page=1 +- 2026 NMOHC Board memo, File 26-290, Board date 2026-04-07: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1 +- 2026 time-limit resolution attachment: https://sanmateocounty.legistar.com/View.ashx?G=1088EC25-A43A-408F-A57C-73C0A70269AB&GUID=7A7BFB1E-AD23-4AC9-A6B2-82EAFFEDABC7&ID=15171150&M=F#page=1 + +Extracted rules: +- Purpose and administration: County-funded temporary financial support for low-income San Mateo County residents, paid by EBT, direct deposit, or vendor payments for housing/utilities. Source: fact sheet page 1. +- Eligibility factors: age, county residency, identification, Social Security number, citizenship or permanent residency, income, property, employable/unemployable factors, and application for other potential income/resources. Source: fact sheet page 1. +- Immigration: qualified immigrants may be eligible, including lawful permanent residents, refugees, asylum applicants or asylees, conditional entrants, people granted withholding of deportation/removal, and Cuban/Haitian entrants. Source: fact sheet page 1. +- Work requirement: employable recipients must be available for full-time employment and comply with Vocational Rehabilitation Services unless excepted. Examples include full-time employment, required home care for specified relatives, age 65+, school attendance for high-school diploma, child under 16, limited English proficiency, disability, or approved training/rehabilitation. Source: fact sheet page 1. +- Time limits: the February 2025 fact sheet says no time limit if clients follow requirements and remain eligible. A later Board resolution establishes six months of aid in a twelve-month period for employable GA recipients. Sources: fact sheet page 2; time-limit resolution page 1. +- Counted income: earnings, unemployment benefits, disability benefits, self-employment income, retirement benefits, interest income, child or spousal support, and other means of income or support. Source: fact sheet page 2. +- Income test: applicant countable income is compared with the GA payment standard based on living arrangement. Source: fact sheet page 2. +- Maximum aid payments in current public chart: independent living $732, drug and alcohol treatment center $732, NMOHC without BHRS/SMMC referral $732, NMOHC with BHRS/SMMC referral $1,599.07. Source: standards PDF page 1. +- NMOHC update: Board File 26-290 recommends and documents an increase for SSI-pending NMOHC facility GA recipients with BHRS/SMMC referral from $1,599.07 to $1,626.07 effective 2026-01-01. Source: NMOHC Board memo pages 1-2. +- Property: property such as cash, bank accounts, or a vehicle is considered; property must be under $1,464; one vehicle regardless of value is exempt. Sources: fact sheet page 2; standards PDF page 1. +- Other programs: enrollment in CalFresh, Medi-Cal, or SSI does not automatically preclude GA; the fact sheet says the family may also qualify. Source: fact sheet page 2. +- Verification, interview, QR7, annual renewal, reporting changes within 10 days, application methods, and application processing within 30 days are administrative rules. Source: fact sheet pages 2-3. +- Ordinance authority: the Board memo cites California law requiring counties to support indigent residents who do not qualify for other financial assistance and San Mateo County Ordinance Code Section 2.30.050 as assigning HSA responsibility for GA rules and regulations. Source: NMOHC Board memo page 1. + +Data notes: +- The Standards of Assistance PDF contains scanned/image content; `pdftotext` returned no text. A 300 DPI render was saved as `/tmp/ca-smc-ga-sources/standards_of_assistance-1.png` and visually inspected. +- Every PDF citation above includes `#page=1` or `#page=2`. + +Potential modeling constraints: +- PolicyEngine does not generally know whether a person completed county work activity assignments, has applied for all alternative income, satisfies reporting/verification duties, or has exhausted an employable-recipient time limit. +- Living arrangement and BHRS/SMMC referral status are not standard household variables; modeling all payment standards likely requires new input variables. +- Current public sources list countable income categories but do not give a full GA income disregard schedule beyond broad category examples. From 3311bd824c68cefd6736f1485a3f479b3a43171a Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 21 May 2026 14:41:30 -0400 Subject: [PATCH 2/9] Refine San Mateo GA income sources --- .../smc/general_assistance/income/sources.yaml | 4 +++- ...smc_general_assistance_countable_income.yaml | 17 +++++++++++++++++ sources/working_references.md | 5 ++++- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml index cb76cf32623..045585480cd 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml @@ -8,7 +8,7 @@ values: - disability_benefits - ca_state_disability_insurance - social_security - - ssi + - veterans_benefits - pension_income - retirement_distributions - interest_income @@ -21,3 +21,5 @@ metadata: reference: - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Income Limits for Applicants href: https://www.smcgov.org/media/153295/download?inline=#page=2 + - title: San Mateo County Human Services Agency General Assistance, What do I need to apply? + href: https://www.smcgov.org/hsa/general-assistance-ga diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml new file mode 100644 index 00000000000..07bdb026659 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml @@ -0,0 +1,17 @@ +- name: Case 1, veterans benefits count and SSI does not. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + veterans_benefits: 1_200 + ssi: 1_200 + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + output: + ca_smc_general_assistance_countable_income: 100 diff --git a/sources/working_references.md b/sources/working_references.md index d8e64d97b61..67b3a00f5d6 100644 --- a/sources/working_references.md +++ b/sources/working_references.md @@ -16,6 +16,8 @@ Official source URLs: - Standards of Assistance PDF, C-335 Rev. 12.2025: https://www.smcgov.org/media/156974/download?inline=#page=1 - 2026 NMOHC Board memo, File 26-290, Board date 2026-04-07: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1 - 2026 time-limit resolution attachment: https://sanmateocounty.legistar.com/View.ashx?G=1088EC25-A43A-408F-A57C-73C0A70269AB&GUID=7A7BFB1E-AD23-4AC9-A6B2-82EAFFEDABC7&ID=15171150&M=F#page=1 +- SSA-1696 Appointment of Representative: https://www.ssa.gov/forms/ssa-1696.pdf +- SSP-14 Authorization for Reimbursement of Interim Assistance: https://www.cdss.ca.gov/cdssweb/entres/forms/english/ssp14.pdf Extracted rules: - Purpose and administration: County-funded temporary financial support for low-income San Mateo County residents, paid by EBT, direct deposit, or vendor payments for housing/utilities. Source: fact sheet page 1. @@ -23,7 +25,8 @@ Extracted rules: - Immigration: qualified immigrants may be eligible, including lawful permanent residents, refugees, asylum applicants or asylees, conditional entrants, people granted withholding of deportation/removal, and Cuban/Haitian entrants. Source: fact sheet page 1. - Work requirement: employable recipients must be available for full-time employment and comply with Vocational Rehabilitation Services unless excepted. Examples include full-time employment, required home care for specified relatives, age 65+, school attendance for high-school diploma, child under 16, limited English proficiency, disability, or approved training/rehabilitation. Source: fact sheet page 1. - Time limits: the February 2025 fact sheet says no time limit if clients follow requirements and remain eligible. A later Board resolution establishes six months of aid in a twelve-month period for employable GA recipients. Sources: fact sheet page 2; time-limit resolution page 1. -- Counted income: earnings, unemployment benefits, disability benefits, self-employment income, retirement benefits, interest income, child or spousal support, and other means of income or support. Source: fact sheet page 2. +- Counted income: earnings, unemployment benefits, disability benefits, self-employment income, retirement benefits, interest income, child or spousal support, and other means of income or support. The program page also lists Social Security award letters, child support and alimony, unemployment/disability stubs, and veteran's benefits as examples of proof of income. Sources: fact sheet page 2; General Assistance program page. +- SSI/SSP interim assistance reimbursement: SSP-14 authorizes reimbursement from retroactive SSI/SSP benefits for county interim assistance paid while SSA decides eligibility or reinstatement. This supports an administrative reimbursement rule, not counting current SSI/SSP as ordinary General Assistance income. Source: SSP-14 page 1. - Income test: applicant countable income is compared with the GA payment standard based on living arrangement. Source: fact sheet page 2. - Maximum aid payments in current public chart: independent living $732, drug and alcohol treatment center $732, NMOHC without BHRS/SMMC referral $732, NMOHC with BHRS/SMMC referral $1,599.07. Source: standards PDF page 1. - NMOHC update: Board File 26-290 recommends and documents an increase for SSI-pending NMOHC facility GA recipients with BHRS/SMMC referral from $1,599.07 to $1,626.07 effective 2026-01-01. Source: NMOHC Board memo pages 1-2. From e7689e19cd1986397ad1a9106efcb10d6282adbb Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 21 May 2026 16:22:28 -0400 Subject: [PATCH 3/9] refactor --- .../income/earned_income_deduction_rate.yaml | 10 +++ .../income/earned_sources.yaml | 13 ++++ .../general_assistance/income/sources.yaml | 3 + ...th_referral.yaml => payment_standard.yaml} | 18 +++-- .../drug_alcohol_treatment_center.yaml | 10 --- .../payment_standard/independent_living.yaml | 10 --- .../nmohc_without_referral.yaml | 10 --- ...itional_vehicle_combined_equity_limit.yaml | 10 +++ .../general_assistance/property/limit.yaml | 6 +- .../ca_smc_general_assistance.yaml | 9 +++ .../ca_smc_general_assistance_eligible.yaml | 29 ++++++-- ...mc_general_assistance_eligible_person.yaml | 46 ++++++++++++ ..._general_assistance_property_eligible.yaml | 16 +++++ ...c_general_assistance_countable_income.yaml | 70 +++++++++++++++++++ .../smc/general_assistance/integration.yaml | 22 ++++++ ...al_assistance_countable_vehicle_value.yaml | 18 +++++ .../ca_smc_general_assistance.py | 4 +- ...c_general_assistance_living_arrangement.py | 2 +- .../ca_smc_general_assistance_eligible.py | 13 ++-- ..._smc_general_assistance_eligible_person.py | 22 ++++++ ...mc_general_assistance_property_eligible.py | 8 +-- ...smc_general_assistance_countable_income.py | 12 +++- ...smc_general_assistance_payment_standard.py | 22 ++---- ...c_general_assistance_countable_property.py | 5 +- ...eral_assistance_countable_vehicle_value.py | 13 +++- sources/working_references.md | 45 ------------ 26 files changed, 325 insertions(+), 121 deletions(-) create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_sources.yaml rename policyengine_us/parameters/gov/local/ca/smc/general_assistance/{payment_standard/nmohc_with_referral.yaml => payment_standard.yaml} (54%) delete mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml delete mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml delete mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py delete mode 100644 sources/working_references.md diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml new file mode 100644 index 00000000000..a8900cbf111 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml @@ -0,0 +1,10 @@ +description: San Mateo County deducts this share of earned income from countable income under the General Assistance program, aligning with CalFresh earned income deduction rules. +values: + 2022-03-01: 0.2 +metadata: + unit: /1 + period: year + label: San Mateo County General Assistance earned income deduction rate + reference: + - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item E + href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_sources.yaml new file mode 100644 index 00000000000..370524216b2 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_sources.yaml @@ -0,0 +1,13 @@ +description: San Mateo County treats these income sources as earned income for the CalFresh-aligned earned income deduction under the General Assistance program. +values: + 2022-03-01: + - employment_income + - self_employment_income + - sstb_self_employment_income +metadata: + unit: list + period: year + label: San Mateo County General Assistance earned income sources + reference: + - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item E + href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml index 045585480cd..7132aad076e 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml @@ -5,6 +5,7 @@ values: - self_employment_income - sstb_self_employment_income - unemployment_compensation + - workers_compensation - disability_benefits - ca_state_disability_insurance - social_security @@ -12,6 +13,8 @@ values: - pension_income - retirement_distributions - interest_income + - dividend_income + - rental_income - child_support_received - alimony_income metadata: diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml similarity index 54% rename from policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml rename to policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml index b72e1df5111..79e9f558868 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_with_referral.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml @@ -1,15 +1,21 @@ -description: San Mateo County provides this amount as the payment standard under the General Assistance program. -values: +description: San Mateo County provides this maximum monthly payment under the General Assistance program, based on the recipient's living arrangement. +INDEPENDENT_LIVING: + 2023-10-01: 732 +DRUG_ALCOHOL_TREATMENT_CENTER: + 2023-10-01: 732 +NMOHC_WITHOUT_REFERRAL: + 2023-10-01: 732 +NMOHC_WITH_REFERRAL: 2025-01-01: 1_599.07 2026-01-01: 1_626.07 metadata: unit: currency-USD period: month - label: San Mateo County General Assistance NMOHC with BHRS/SMMC referral payment standard + breakdown: + - ca_smc_general_assistance_living_arrangement + label: San Mateo County General Assistance payment standard reference: - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance - href: https://www.smcgov.org/media/156974/download?inline=#page=1 + href: https://www.smcgov.org/media/156974/download?inline= - title: San Mateo County Board File 26-290, Modification to the General Assistance Program Rules and Regulations href: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1 - - title: San Mateo County Board File 26-290, Fiscal Impact - href: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml deleted file mode 100644 index 8833b587eea..00000000000 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/drug_alcohol_treatment_center.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: San Mateo County provides this amount as the payment standard under the General Assistance program. -values: - 2023-10-01: 732 -metadata: - unit: currency-USD - period: month - label: San Mateo County General Assistance drug and alcohol treatment center payment standard - reference: - - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance - href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml deleted file mode 100644 index d4e4e4ff788..00000000000 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/independent_living.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: San Mateo County provides this amount as the payment standard under the General Assistance program. -values: - 2023-10-01: 732 -metadata: - unit: currency-USD - period: month - label: San Mateo County General Assistance independent living payment standard - reference: - - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance - href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml deleted file mode 100644 index ff6de8f431f..00000000000 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard/nmohc_without_referral.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: San Mateo County provides this amount as the payment standard under the General Assistance program. -values: - 2023-10-01: 732 -metadata: - unit: currency-USD - period: month - label: San Mateo County General Assistance NMOHC without referral payment standard - reference: - - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance - href: https://www.smcgov.org/media/156974/download?inline=#page=1 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml new file mode 100644 index 00000000000..78799e9dba0 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml @@ -0,0 +1,10 @@ +description: San Mateo County exempts the combined equity value of additional vehicles below this amount under the General Assistance program. The amount equals four times the independent living payment standard per Resolution 21-720, Item B(3). +values: + 2023-10-01: 2_928 +metadata: + unit: currency-USD + period: year + label: San Mateo County General Assistance additional vehicle combined equity limit + reference: + - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item B(3) + href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml index 5651f3d5cde..d00b02aa54f 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml @@ -1,4 +1,4 @@ -description: San Mateo County limits property to this amount under the General Assistance program. +description: San Mateo County limits property to this amount under the General Assistance program. The amount equals twice the independent living payment standard per Resolution 21-720, Item B(2). values: 2023-10-01: 1_464 metadata: @@ -9,4 +9,6 @@ metadata: - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Property Limits href: https://www.smcgov.org/media/153295/download?inline=#page=2 - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance - href: https://www.smcgov.org/media/156974/download?inline=#page=1 + href: https://www.smcgov.org/media/156974/download?inline= + - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item B(2) + href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml index ae3f12c615c..d44cde835ad 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml @@ -24,3 +24,12 @@ ca_smc_general_assistance_countable_income: 0 output: ca_smc_general_assistance: 0 + +- name: Case 4, negative countable income floors at zero, benefit caps at standard. + period: 2026-01 + input: + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: -200 + output: + ca_smc_general_assistance: 732 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml index d595f77a1fe..eea5e236711 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.yaml @@ -2,7 +2,7 @@ period: 2026-01 input: in_smc: true - ca_smc_general_assistance_immigration_status_eligible_person: true + ca_smc_general_assistance_eligible_person: true ca_smc_general_assistance_income_eligible: true ca_smc_general_assistance_property_eligible: true output: @@ -12,7 +12,7 @@ period: 2026-01 input: in_smc: true - ca_smc_general_assistance_immigration_status_eligible_person: false + ca_smc_general_assistance_eligible_person: false ca_smc_general_assistance_income_eligible: true ca_smc_general_assistance_property_eligible: true output: @@ -22,7 +22,7 @@ period: 2026-01 input: in_smc: true - ca_smc_general_assistance_immigration_status_eligible_person: true + ca_smc_general_assistance_eligible_person: true ca_smc_general_assistance_income_eligible: false ca_smc_general_assistance_property_eligible: true output: @@ -32,8 +32,29 @@ period: 2026-01 input: in_smc: true - ca_smc_general_assistance_immigration_status_eligible_person: true + ca_smc_general_assistance_eligible_person: true ca_smc_general_assistance_income_eligible: true ca_smc_general_assistance_property_eligible: false output: ca_smc_general_assistance_eligible: false + +- name: Case 5, ineligible when unit includes a minor child. + period: 2026-01 + input: + people: + person1: + age: 30 + ca_smc_general_assistance_eligible_person: true + person2: + age: 5 + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_income_eligible: true + ca_smc_general_assistance_property_eligible: true + output: + ca_smc_general_assistance_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml new file mode 100644 index 00000000000..a680584c099 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml @@ -0,0 +1,46 @@ +- name: Case 1, adult citizen is eligible. + period: 2026-01 + input: + age: 18 + immigration_status: CITIZEN + in_smc: true + output: + ca_smc_general_assistance_eligible_person: true + +- name: Case 2, child citizen is ineligible. + period: 2026-01 + input: + age: 17 + immigration_status: CITIZEN + in_smc: true + output: + ca_smc_general_assistance_eligible_person: false + +- name: Case 3, adult with ineligible immigration status is ineligible. + period: 2026-01 + input: + age: 30 + immigration_status: UNDOCUMENTED + in_smc: true + output: + ca_smc_general_assistance_eligible_person: false + +- name: Case 4, active SSI recipient is ineligible. + period: 2026-01 + input: + age: 30 + immigration_status: CITIZEN + in_smc: true + ssi_reported: 12_000 + output: + ca_smc_general_assistance_eligible_person: false + +- name: Case 5, SSI-pending applicant (eligible category but not yet receiving) remains eligible. + period: 2026-01 + input: + age: 65 + immigration_status: CITIZEN + in_smc: true + ssi_reported: 0 + output: + ca_smc_general_assistance_eligible_person: true diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml index 2620113e850..7686171f80c 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.yaml @@ -13,3 +13,19 @@ ca_smc_general_assistance_countable_property: 1_464 output: ca_smc_general_assistance_property_eligible: false + +- name: Case 3, property clearly above limit is ineligible. + period: 2026 + input: + in_smc: true + ca_smc_general_assistance_countable_property: 5_000 + output: + ca_smc_general_assistance_property_eligible: false + +- name: Case 4, limit derives from 2x independent living grant in earlier years. + period: 2024 + input: + in_smc: true + ca_smc_general_assistance_countable_property: 1_463 + output: + ca_smc_general_assistance_property_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml index 07bdb026659..94db088ae07 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.yaml @@ -15,3 +15,73 @@ members: [person1] output: ca_smc_general_assistance_countable_income: 100 + +- name: Case 2, earned income receives the 20 percent CalFresh-aligned deduction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + employment_income: 12_000 + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + output: + ca_smc_general_assistance_countable_income: 800 + +- name: Case 3, unearned income receives no earned income deduction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + rental_income: 12_000 + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + output: + ca_smc_general_assistance_countable_income: 1_000 + +- name: Case 4, negative self-employment income flows in without inflating the deduction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + self_employment_income: -2_400 + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + output: + ca_smc_general_assistance_countable_income: -200 + +- name: Case 5, peer-convergence sources (workers compensation, rental income, dividend income) count as unearned. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + workers_compensation: 1_200 + rental_income: 1_200 + dividend_income: 1_200 + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + output: + ca_smc_general_assistance_countable_income: 300 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml index 4c2cbc344e0..ffc797d85d7 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml @@ -142,3 +142,25 @@ ca_smc_general_assistance_countable_vehicle_value: 0 ca_smc_general_assistance_property_eligible: true ca_smc_general_assistance: 732 + +- name: Case 8, single parent with a young child is ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 5 + immigration_status: CITIZEN + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_eligible: false + ca_smc_general_assistance: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml index 227503cc6bd..8958e40731e 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml @@ -24,3 +24,21 @@ household_vehicles_value: 0 output: ca_smc_general_assistance_countable_vehicle_value: 0 + +- name: Case 4, additional vehicles with low combined equity are fully exempt. + period: 2026 + input: + in_smc: true + household_vehicles_owned: 2 + household_vehicles_value: 2_000 + output: + ca_smc_general_assistance_countable_vehicle_value: 0 + +- name: Case 5, three low-value vehicles with combined additional equity under the threshold are fully exempt. + period: 2026 + input: + in_smc: true + household_vehicles_owned: 3 + household_vehicles_value: 4_000 + output: + ca_smc_general_assistance_countable_vehicle_value: 0 diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py index 366af2055e0..ef9ff6c7dbb 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py @@ -10,10 +10,10 @@ class ca_smc_general_assistance(Variable): defined_for = "ca_smc_general_assistance_eligible" reference = ( "https://www.smcgov.org/media/153295/download?inline=#page=2", - "https://www.smcgov.org/media/156974/download?inline=#page=1", + "https://www.smcgov.org/media/156974/download?inline=", ) def formula(spm_unit, period, parameters): standard = spm_unit("ca_smc_general_assistance_payment_standard", period) income = spm_unit("ca_smc_general_assistance_countable_income", period) - return max_(standard - income, 0) + return standard - max_(income, 0) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py index 799bacb478d..4a57b7cd61f 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py @@ -16,4 +16,4 @@ class ca_smc_general_assistance_living_arrangement(Variable): defined_for = "in_smc" possible_values = CaSMCGeneralAssistanceLivingArrangement default_value = CaSMCGeneralAssistanceLivingArrangement.INDEPENDENT_LIVING - reference = "https://www.smcgov.org/media/156974/download?inline=#page=1" + reference = "https://www.smcgov.org/media/156974/download?inline=" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py index b9a4ea908b5..13735dd2870 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible.py @@ -7,19 +7,24 @@ class ca_smc_general_assistance_eligible(Variable): label = "Eligible for San Mateo County General Assistance" definition_period = MONTH defined_for = "in_smc" - reference = "https://www.smcgov.org/media/153295/download?inline=#page=1" + reference = ( + "https://www.smcgov.org/media/153295/download?inline=#page=1", + "https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2", + ) def formula(spm_unit, period, parameters): - immigration_eligible = ( + eligible_adult = ( add( spm_unit, period, - ["ca_smc_general_assistance_immigration_status_eligible_person"], + ["ca_smc_general_assistance_eligible_person"], ) > 0 ) + has_minor_child = add(spm_unit, period, ["is_child"]) > 0 return ( - immigration_eligible + eligible_adult + & ~has_minor_child & spm_unit("ca_smc_general_assistance_income_eligible", period) & spm_unit("ca_smc_general_assistance_property_eligible", period) ) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py new file mode 100644 index 00000000000..8d37c18fac1 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_eligible_person(Variable): + value_type = bool + entity = Person + label = "Eligible person for San Mateo County General Assistance" + definition_period = MONTH + defined_for = "in_smc" + reference = ( + "https://www.smcgov.org/hsa/general-assistance-ga", + "https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2", + ) + + def formula(person, period, parameters): + adult = person("age", period.this_year) >= 18 + immigration_eligible = person( + "ca_smc_general_assistance_immigration_status_eligible_person", + period, + ) + not_on_ssi = person("ssi_reported", period.this_year) == 0 + return adult & immigration_eligible & not_on_ssi diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py index 7ed5764175c..38de916cf1b 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py @@ -9,11 +9,11 @@ class ca_smc_general_assistance_property_eligible(Variable): defined_for = "in_smc" reference = ( "https://www.smcgov.org/media/153295/download?inline=#page=2", - "https://www.smcgov.org/media/156974/download?inline=#page=1", + "https://www.smcgov.org/media/156974/download?inline=", + "https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2", ) def formula(spm_unit, period, parameters): p = parameters(period).gov.local.ca.smc.general_assistance.property - return ( - spm_unit("ca_smc_general_assistance_countable_property", period) < p.limit - ) + countable = spm_unit("ca_smc_general_assistance_countable_property", period) + return countable < p.limit diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py index 76dbc2a55e8..a0a100bfe31 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/income/ca_smc_general_assistance_countable_income.py @@ -8,6 +8,14 @@ class ca_smc_general_assistance_countable_income(Variable): label = "San Mateo County General Assistance countable income" definition_period = MONTH defined_for = "in_smc" - reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + reference = ( + "https://www.smcgov.org/media/153295/download?inline=#page=2", + "https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2", + ) - adds = "gov.local.ca.smc.general_assistance.income.sources" + def formula(spm_unit, period, parameters): + p = parameters(period).gov.local.ca.smc.general_assistance.income + total = add(spm_unit, period, p.sources) + earned = add(spm_unit, period, p.earned_sources) + deduction = max_(earned, 0) * p.earned_income_deduction_rate + return total - deduction diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py index 4209104e34c..731c404071c 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/payment/ca_smc_general_assistance_payment_standard.py @@ -9,26 +9,12 @@ class ca_smc_general_assistance_payment_standard(Variable): definition_period = MONTH defined_for = "in_smc" reference = ( - "https://www.smcgov.org/media/156974/download?inline=#page=1", + "https://www.smcgov.org/media/156974/download?inline=", "https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1", ) def formula(spm_unit, period, parameters): - p = parameters(period).gov.local.ca.smc.general_assistance.payment_standard arrangement = spm_unit("ca_smc_general_assistance_living_arrangement", period) - arrangements = arrangement.possible_values - return select( - [ - arrangement == arrangements.INDEPENDENT_LIVING, - arrangement == arrangements.DRUG_ALCOHOL_TREATMENT_CENTER, - arrangement == arrangements.NMOHC_WITHOUT_REFERRAL, - arrangement == arrangements.NMOHC_WITH_REFERRAL, - ], - [ - p.independent_living, - p.drug_alcohol_treatment_center, - p.nmohc_without_referral, - p.nmohc_with_referral, - ], - default=p.independent_living, - ) + return parameters(period).gov.local.ca.smc.general_assistance.payment_standard[ + arrangement + ] diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py index 38249aa38ed..79534df4d2a 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_property.py @@ -8,6 +8,9 @@ class ca_smc_general_assistance_countable_property(Variable): label = "San Mateo County General Assistance countable property" definition_period = YEAR defined_for = "in_smc" - reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + reference = ( + "https://www.smcgov.org/media/153295/download?inline=#page=2", + "https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2", + ) adds = "gov.local.ca.smc.general_assistance.property.sources" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py index 38ab04ca31e..061d0d007b7 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py @@ -8,9 +8,13 @@ class ca_smc_general_assistance_countable_vehicle_value(Variable): label = "San Mateo County General Assistance countable vehicle value" definition_period = YEAR defined_for = "in_smc" - reference = "https://www.smcgov.org/media/153295/download?inline=#page=2" + reference = ( + "https://www.smcgov.org/media/153295/download?inline=#page=2", + "https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2", + ) def formula(spm_unit, period, parameters): + p = parameters(period).gov.local.ca.smc.general_assistance.property household = spm_unit.household vehicle_count = household("household_vehicles_owned", period) vehicle_value = household("household_vehicles_value", period) @@ -19,4 +23,9 @@ def formula(spm_unit, period, parameters): vehicle_value / vehicle_count, 0, ) - return average_vehicle_value * max_(vehicle_count - 1, 0) + additional_vehicle_equity = average_vehicle_value * max_(vehicle_count - 1, 0) + return where( + additional_vehicle_equity < p.additional_vehicle_combined_equity_limit, + 0, + additional_vehicle_equity, + ) diff --git a/sources/working_references.md b/sources/working_references.md deleted file mode 100644 index 67b3a00f5d6..00000000000 --- a/sources/working_references.md +++ /dev/null @@ -1,45 +0,0 @@ -# San Mateo County General Assistance working references - -Program: San Mateo County Human Services Agency General Assistance (GA) - -Variable prefix: `ca_smc_general_assistance` - -Local source copies: -- `/tmp/ca-smc-ga-sources/general_assistance_fact_sheet.pdf` -- `/tmp/ca-smc-ga-sources/standards_of_assistance.pdf` -- `/tmp/ca-smc-ga-sources/nmohc_2026_board_memo.pdf` -- `/tmp/ca-smc-ga-sources/time_limits_2026_resolution.pdf` - -Official source URLs: -- General Assistance program page: https://www.smcgov.org/hsa/general-assistance-ga -- Fact sheet PDF, dated 02.2025: https://www.smcgov.org/media/153295/download?inline=#page=1 -- Standards of Assistance PDF, C-335 Rev. 12.2025: https://www.smcgov.org/media/156974/download?inline=#page=1 -- 2026 NMOHC Board memo, File 26-290, Board date 2026-04-07: https://sanmateocounty.legistar.com/ViewReport.ashx?GID=659&GUID=LATEST&ID=94585&M=R&N=TextL5&Title=Board+Memo#page=1 -- 2026 time-limit resolution attachment: https://sanmateocounty.legistar.com/View.ashx?G=1088EC25-A43A-408F-A57C-73C0A70269AB&GUID=7A7BFB1E-AD23-4AC9-A6B2-82EAFFEDABC7&ID=15171150&M=F#page=1 -- SSA-1696 Appointment of Representative: https://www.ssa.gov/forms/ssa-1696.pdf -- SSP-14 Authorization for Reimbursement of Interim Assistance: https://www.cdss.ca.gov/cdssweb/entres/forms/english/ssp14.pdf - -Extracted rules: -- Purpose and administration: County-funded temporary financial support for low-income San Mateo County residents, paid by EBT, direct deposit, or vendor payments for housing/utilities. Source: fact sheet page 1. -- Eligibility factors: age, county residency, identification, Social Security number, citizenship or permanent residency, income, property, employable/unemployable factors, and application for other potential income/resources. Source: fact sheet page 1. -- Immigration: qualified immigrants may be eligible, including lawful permanent residents, refugees, asylum applicants or asylees, conditional entrants, people granted withholding of deportation/removal, and Cuban/Haitian entrants. Source: fact sheet page 1. -- Work requirement: employable recipients must be available for full-time employment and comply with Vocational Rehabilitation Services unless excepted. Examples include full-time employment, required home care for specified relatives, age 65+, school attendance for high-school diploma, child under 16, limited English proficiency, disability, or approved training/rehabilitation. Source: fact sheet page 1. -- Time limits: the February 2025 fact sheet says no time limit if clients follow requirements and remain eligible. A later Board resolution establishes six months of aid in a twelve-month period for employable GA recipients. Sources: fact sheet page 2; time-limit resolution page 1. -- Counted income: earnings, unemployment benefits, disability benefits, self-employment income, retirement benefits, interest income, child or spousal support, and other means of income or support. The program page also lists Social Security award letters, child support and alimony, unemployment/disability stubs, and veteran's benefits as examples of proof of income. Sources: fact sheet page 2; General Assistance program page. -- SSI/SSP interim assistance reimbursement: SSP-14 authorizes reimbursement from retroactive SSI/SSP benefits for county interim assistance paid while SSA decides eligibility or reinstatement. This supports an administrative reimbursement rule, not counting current SSI/SSP as ordinary General Assistance income. Source: SSP-14 page 1. -- Income test: applicant countable income is compared with the GA payment standard based on living arrangement. Source: fact sheet page 2. -- Maximum aid payments in current public chart: independent living $732, drug and alcohol treatment center $732, NMOHC without BHRS/SMMC referral $732, NMOHC with BHRS/SMMC referral $1,599.07. Source: standards PDF page 1. -- NMOHC update: Board File 26-290 recommends and documents an increase for SSI-pending NMOHC facility GA recipients with BHRS/SMMC referral from $1,599.07 to $1,626.07 effective 2026-01-01. Source: NMOHC Board memo pages 1-2. -- Property: property such as cash, bank accounts, or a vehicle is considered; property must be under $1,464; one vehicle regardless of value is exempt. Sources: fact sheet page 2; standards PDF page 1. -- Other programs: enrollment in CalFresh, Medi-Cal, or SSI does not automatically preclude GA; the fact sheet says the family may also qualify. Source: fact sheet page 2. -- Verification, interview, QR7, annual renewal, reporting changes within 10 days, application methods, and application processing within 30 days are administrative rules. Source: fact sheet pages 2-3. -- Ordinance authority: the Board memo cites California law requiring counties to support indigent residents who do not qualify for other financial assistance and San Mateo County Ordinance Code Section 2.30.050 as assigning HSA responsibility for GA rules and regulations. Source: NMOHC Board memo page 1. - -Data notes: -- The Standards of Assistance PDF contains scanned/image content; `pdftotext` returned no text. A 300 DPI render was saved as `/tmp/ca-smc-ga-sources/standards_of_assistance-1.png` and visually inspected. -- Every PDF citation above includes `#page=1` or `#page=2`. - -Potential modeling constraints: -- PolicyEngine does not generally know whether a person completed county work activity assignments, has applied for all alternative income, satisfies reporting/verification duties, or has exhausted an employable-recipient time limit. -- Living arrangement and BHRS/SMMC referral status are not standard household variables; modeling all payment standards likely requires new input variables. -- Current public sources list countable income categories but do not give a full GA income disregard schedule beyond broad category examples. From 9441c1a0003112cde99c7c2431aa6c88c5b2e72b Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 21 May 2026 16:40:58 -0400 Subject: [PATCH 4/9] fix --- .../smc/general_assistance/minimum_age.yaml | 10 ++ .../ca_smc_general_assistance.yaml | 89 ++++++++-- .../smc/general_assistance/integration.yaml | 161 +++++++++++++++++- ...al_assistance_countable_vehicle_value.yaml | 47 +++++ .../ca_smc_general_assistance.py | 7 +- ...c_general_assistance_living_arrangement.py | 2 +- ..._smc_general_assistance_eligible_person.py | 3 +- ..._smc_general_assistance_income_eligible.py | 6 +- ...mc_general_assistance_property_eligible.py | 6 +- ...eral_assistance_countable_vehicle_value.py | 10 +- 10 files changed, 313 insertions(+), 28 deletions(-) create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/minimum_age.yaml diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/minimum_age.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/minimum_age.yaml new file mode 100644 index 00000000000..2f8819f76ba --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/minimum_age.yaml @@ -0,0 +1,10 @@ +description: San Mateo County requires an applicant to be at least this age under the General Assistance program. +values: + 2023-10-01: 18 +metadata: + unit: year + period: year + label: San Mateo County General Assistance minimum age + reference: + - title: San Mateo County Human Services Agency General Assistance, What do I need to apply? + href: https://www.smcgov.org/hsa/general-assistance-ga diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml index d44cde835ad..22a29789246 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.yaml @@ -1,35 +1,96 @@ -- name: Case 1, eligible unit receives standard less countable income. +- name: Case 1, eligible single adult receives standard less countable income. period: 2026-01 input: - ca_smc_general_assistance_eligible: true - ca_smc_general_assistance_payment_standard: 732 - ca_smc_general_assistance_countable_income: 200 + people: + person1: + ca_smc_general_assistance_eligible_person: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 200 output: ca_smc_general_assistance: 532 -- name: Case 2, benefit floors at zero. +- name: Case 2, benefit floors at zero when income exceeds standard. period: 2026-01 input: - ca_smc_general_assistance_eligible: true - ca_smc_general_assistance_payment_standard: 732 - ca_smc_general_assistance_countable_income: 800 + people: + person1: + ca_smc_general_assistance_eligible_person: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 800 output: ca_smc_general_assistance: 0 - name: Case 3, ineligible unit receives zero. period: 2026-01 input: - ca_smc_general_assistance_eligible: false - ca_smc_general_assistance_payment_standard: 732 - ca_smc_general_assistance_countable_income: 0 + people: + person1: + ca_smc_general_assistance_eligible_person: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_eligible: false + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 0 output: ca_smc_general_assistance: 0 - name: Case 4, negative countable income floors at zero, benefit caps at standard. period: 2026-01 input: - ca_smc_general_assistance_eligible: true - ca_smc_general_assistance_payment_standard: 732 - ca_smc_general_assistance_countable_income: -200 + people: + person1: + ca_smc_general_assistance_eligible_person: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: -200 output: ca_smc_general_assistance: 732 + +- name: Case 5, two eligible adults each receive their own benefit at the SPM unit level. + period: 2026-01 + input: + people: + person1: + ca_smc_general_assistance_eligible_person: true + person2: + ca_smc_general_assistance_eligible_person: true + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance_payment_standard: 732 + ca_smc_general_assistance_countable_income: 400 + output: + ca_smc_general_assistance: 1_064 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml index ffc797d85d7..113586b41bb 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml @@ -18,8 +18,9 @@ ca_smc_general_assistance_eligible: true ca_smc_general_assistance: 732 -- name: Case 2, independent living unit with income receives reduced benefit. +- name: Case 2, independent living unit with earned income receives reduced benefit after the 20 percent deduction. period: 2026-01 + absolute_error_margin: 0.01 input: people: person1: @@ -35,16 +36,16 @@ members: [person1] ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING output: - ca_smc_general_assistance_countable_income: 200 - ca_smc_general_assistance: 532 + ca_smc_general_assistance_countable_income: 160 + ca_smc_general_assistance: 572 -- name: Case 3, income above independent living standard makes unit ineligible. +- name: Case 3, unearned income above independent living standard makes unit ineligible. period: 2026-01 input: people: person1: age: 30 - employment_income: 8_796 + unemployment_compensation: 8_796 immigration_status: CITIZEN households: household: @@ -97,8 +98,8 @@ ca_smc_general_assistance_living_arrangement: NMOHC_WITH_REFERRAL output: ca_smc_general_assistance_payment_standard: 1_626.07 - ca_smc_general_assistance_countable_income: 250 - ca_smc_general_assistance: 1_376.07 + ca_smc_general_assistance_countable_income: 200 + ca_smc_general_assistance: 1_426.07 - name: Case 6, property at limit makes unit ineligible. period: 2026-01 @@ -164,3 +165,149 @@ output: ca_smc_general_assistance_eligible: false ca_smc_general_assistance: 0 + +- name: Case 9, two unrelated adults without children each receive their own benefit. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 28 + immigration_status: CITIZEN + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance: 1_464 + +- name: Case 10, two adults where one receives SSI still qualifies the non-SSI adult via the SPM unit. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + ssi_reported: 0 + person2: + age: 65 + immigration_status: CITIZEN + ssi_reported: 12_000 + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance: 732 + +- name: Case 11, couple where one adult has very high income is ineligible (income deeming via SPM unit aggregation). + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + employment_income: 0 + person2: + age: 32 + immigration_status: CITIZEN + employment_income: 48_000 + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_eligible: false + ca_smc_general_assistance: 0 + +- name: Case 12, both adults already receive SSI so the unit is categorically ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + ssi_reported: 12_000 + person2: + age: 32 + immigration_status: CITIZEN + ssi_reported: 12_000 + households: + household: + members: [person1, person2] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2] + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_eligible: false + ca_smc_general_assistance: 0 + +- name: Case 13, three adults with combined property below the scaled limit and no income each receive their own benefit. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 28 + immigration_status: CITIZEN + person3: + age: 25 + immigration_status: CITIZEN + households: + household: + members: [person1, person2, person3] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 4_000 + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_eligible: true + ca_smc_general_assistance: 2_196 + +- name: Case 14, three adults with combined property above the scaled limit are ineligible. + period: 2026-01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 28 + immigration_status: CITIZEN + person3: + age: 25 + immigration_status: CITIZEN + households: + household: + members: [person1, person2, person3] + in_smc: true + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_cash_assets: 5_000 + ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING + output: + ca_smc_general_assistance_property_eligible: false + ca_smc_general_assistance: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml index 8958e40731e..046b8e7ea9d 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml @@ -42,3 +42,50 @@ household_vehicles_value: 4_000 output: ca_smc_general_assistance_countable_vehicle_value: 0 + +- name: Case 6, two adults with two vehicles each exempt their own; no additional vehicle is countable. + period: 2026 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 28 + immigration_status: CITIZEN + households: + household: + members: [person1, person2] + in_smc: true + household_vehicles_owned: 2 + household_vehicles_value: 20_000 + spm_units: + spm_unit: + members: [person1, person2] + output: + ca_smc_general_assistance_countable_vehicle_value: 0 + +- name: Case 7, three adults with three vehicles each exempt their own; no additional vehicle is countable. + period: 2026 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 28 + immigration_status: CITIZEN + person3: + age: 25 + immigration_status: CITIZEN + households: + household: + members: [person1, person2, person3] + in_smc: true + household_vehicles_owned: 3 + household_vehicles_value: 15_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + output: + ca_smc_general_assistance_countable_vehicle_value: 0 diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py index ef9ff6c7dbb..b9de3c17d91 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance.py @@ -16,4 +16,9 @@ class ca_smc_general_assistance(Variable): def formula(spm_unit, period, parameters): standard = spm_unit("ca_smc_general_assistance_payment_standard", period) income = spm_unit("ca_smc_general_assistance_countable_income", period) - return standard - max_(income, 0) + n_eligible = add( + spm_unit, period, ["ca_smc_general_assistance_eligible_person"] + ) + per_person_income = where(n_eligible > 0, income / n_eligible, 0) + per_person_benefit = max_(standard - max_(per_person_income, 0), 0) + return n_eligible * per_person_benefit diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py index 4a57b7cd61f..4310552fa57 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/ca_smc_general_assistance_living_arrangement.py @@ -16,4 +16,4 @@ class ca_smc_general_assistance_living_arrangement(Variable): defined_for = "in_smc" possible_values = CaSMCGeneralAssistanceLivingArrangement default_value = CaSMCGeneralAssistanceLivingArrangement.INDEPENDENT_LIVING - reference = "https://www.smcgov.org/media/156974/download?inline=" + reference = "https://www.smcgov.org/media/156974/download?inline=#page=2" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py index 8d37c18fac1..4c2cd044ddd 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py @@ -13,7 +13,8 @@ class ca_smc_general_assistance_eligible_person(Variable): ) def formula(person, period, parameters): - adult = person("age", period.this_year) >= 18 + p = parameters(period).gov.local.ca.smc.general_assistance + adult = person("age", period.this_year) >= p.minimum_age immigration_eligible = person( "ca_smc_general_assistance_immigration_status_eligible_person", period, diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py index f5a689538f8..ee655a9ce80 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py @@ -12,4 +12,8 @@ class ca_smc_general_assistance_income_eligible(Variable): def formula(spm_unit, period, parameters): income = spm_unit("ca_smc_general_assistance_countable_income", period) standard = spm_unit("ca_smc_general_assistance_payment_standard", period) - return income <= standard + n_eligible = add( + spm_unit, period, ["ca_smc_general_assistance_eligible_person"] + ) + per_person_income = where(n_eligible > 0, income / n_eligible, 0) + return per_person_income <= standard diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py index 38de916cf1b..b6611c6a204 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py @@ -16,4 +16,8 @@ class ca_smc_general_assistance_property_eligible(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.local.ca.smc.general_assistance.property countable = spm_unit("ca_smc_general_assistance_countable_property", period) - return countable < p.limit + n_eligible = add( + spm_unit, period, ["ca_smc_general_assistance_eligible_person"] + ) + applicants = max_(n_eligible, 1) + return countable < p.limit * applicants diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py index 061d0d007b7..13476089d8a 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py @@ -15,6 +15,10 @@ class ca_smc_general_assistance_countable_vehicle_value(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.local.ca.smc.general_assistance.property + n_eligible = add( + spm_unit, period, ["ca_smc_general_assistance_eligible_person"] + ) + applicants = max_(n_eligible, 1) household = spm_unit.household vehicle_count = household("household_vehicles_owned", period) vehicle_value = household("household_vehicles_value", period) @@ -23,9 +27,11 @@ def formula(spm_unit, period, parameters): vehicle_value / vehicle_count, 0, ) - additional_vehicle_equity = average_vehicle_value * max_(vehicle_count - 1, 0) + additional_vehicle_count = max_(vehicle_count - applicants, 0) + additional_vehicle_equity = average_vehicle_value * additional_vehicle_count return where( - additional_vehicle_equity < p.additional_vehicle_combined_equity_limit, + additional_vehicle_equity + < p.additional_vehicle_combined_equity_limit * applicants, 0, additional_vehicle_equity, ) From 83f4084fe7cf6de18aa1f828fe8ebb5caf7d39e3 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 22 May 2026 12:48:13 -0400 Subject: [PATCH 5/9] property limit --- changelog.d/fixed/8360.md | 1 + .../additional_vehicle_combined_equity_limit.yaml | 2 +- policyengine_us/programs.yaml | 12 +++++++++++- .../ca_smc_general_assistance_eligible_person.yaml | 4 ++-- .../ca/smc/general_assistance/integration.yaml | 14 +++++++------- ...general_assistance_countable_vehicle_value.yaml | 12 ++++++------ .../variables/gov/local/ca/ala/in_ala.py | 2 +- .../ca_smc_general_assistance_eligible_person.py | 2 +- .../ca_smc_general_assistance_property_eligible.py | 6 +----- ...c_general_assistance_countable_vehicle_value.py | 12 +++--------- 10 files changed, 34 insertions(+), 33 deletions(-) create mode 100644 changelog.d/fixed/8360.md diff --git a/changelog.d/fixed/8360.md b/changelog.d/fixed/8360.md new file mode 100644 index 00000000000..d4319ea0c9f --- /dev/null +++ b/changelog.d/fixed/8360.md @@ -0,0 +1 @@ +Fix Alameda County General Assistance county-string check and program registry parameter prefix. diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml index 78799e9dba0..8dcf9ce5fe1 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/additional_vehicle_combined_equity_limit.yaml @@ -1,4 +1,4 @@ -description: San Mateo County exempts the combined equity value of additional vehicles below this amount under the General Assistance program. The amount equals four times the independent living payment standard per Resolution 21-720, Item B(3). +description: San Mateo County excludes this amount of combined equity in additional vehicles from countable property under the General Assistance program. values: 2023-10-01: 2_928 metadata: diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 7d6212eec9a..330cbef3694 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1253,7 +1253,17 @@ programs: status: complete coverage: Alameda County variable: ca_ala_general_assistance - parameter_prefix: gov.local.ca.ala.ga + parameter_prefix: gov.local.ca.ala.general_assistance + + - id: ca_smc_general_assistance + name: San Mateo County General Assistance + full_name: San Mateo County General Assistance + category: Benefits + agency: Local + status: complete + coverage: San Mateo County + variable: ca_smc_general_assistance + parameter_prefix: gov.local.ca.smc.general_assistance - id: nyc_income_tax name: NYC income tax diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml index a680584c099..ce6b8be45a7 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml @@ -31,7 +31,7 @@ age: 30 immigration_status: CITIZEN in_smc: true - ssi_reported: 12_000 + ssi: 12_000 output: ca_smc_general_assistance_eligible_person: false @@ -41,6 +41,6 @@ age: 65 immigration_status: CITIZEN in_smc: true - ssi_reported: 0 + ssi: 0 output: ca_smc_general_assistance_eligible_person: true diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml index 113586b41bb..0011a1820ac 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml @@ -195,11 +195,11 @@ person1: age: 30 immigration_status: CITIZEN - ssi_reported: 0 + ssi: 0 person2: age: 65 immigration_status: CITIZEN - ssi_reported: 12_000 + ssi: 12_000 households: household: members: [person1, person2] @@ -243,11 +243,11 @@ person1: age: 30 immigration_status: CITIZEN - ssi_reported: 12_000 + ssi: 12_000 person2: age: 32 immigration_status: CITIZEN - ssi_reported: 12_000 + ssi: 12_000 households: household: members: [person1, person2] @@ -260,7 +260,7 @@ ca_smc_general_assistance_eligible: false ca_smc_general_assistance: 0 -- name: Case 13, three adults with combined property below the scaled limit and no income each receive their own benefit. +- name: Case 13, three adults with combined property below the flat limit and no income each receive their own benefit. period: 2026-01 input: people: @@ -280,13 +280,13 @@ spm_units: spm_unit: members: [person1, person2, person3] - spm_unit_cash_assets: 4_000 + spm_unit_cash_assets: 1_000 ca_smc_general_assistance_living_arrangement: INDEPENDENT_LIVING output: ca_smc_general_assistance_eligible: true ca_smc_general_assistance: 2_196 -- name: Case 14, three adults with combined property above the scaled limit are ineligible. +- name: Case 14, three adults with combined property above the flat limit are ineligible. period: 2026-01 input: people: diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml index 046b8e7ea9d..15c725c296b 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.yaml @@ -7,14 +7,14 @@ output: ca_smc_general_assistance_countable_vehicle_value: 0 -- name: Case 2, average value of vehicles beyond the first is countable. +- name: Case 2, additional vehicle equity above the combined limit is countable. period: 2026 input: in_smc: true household_vehicles_owned: 2 household_vehicles_value: 20_000 output: - ca_smc_general_assistance_countable_vehicle_value: 10_000 + ca_smc_general_assistance_countable_vehicle_value: 7_072 - name: Case 3, no vehicle value is countable when no vehicles are owned. period: 2026 @@ -43,7 +43,7 @@ output: ca_smc_general_assistance_countable_vehicle_value: 0 -- name: Case 6, two adults with two vehicles each exempt their own; no additional vehicle is countable. +- name: Case 6, two-adult unit with two vehicles exempts one; the additional vehicle equity above the combined limit is countable. period: 2026 input: people: @@ -63,9 +63,9 @@ spm_unit: members: [person1, person2] output: - ca_smc_general_assistance_countable_vehicle_value: 0 + ca_smc_general_assistance_countable_vehicle_value: 7_072 -- name: Case 7, three adults with three vehicles each exempt their own; no additional vehicle is countable. +- name: Case 7, three-adult unit with three vehicles exempts one; the additional vehicle equity above the combined limit is countable. period: 2026 input: people: @@ -88,4 +88,4 @@ spm_unit: members: [person1, person2, person3] output: - ca_smc_general_assistance_countable_vehicle_value: 0 + ca_smc_general_assistance_countable_vehicle_value: 7_072 diff --git a/policyengine_us/variables/gov/local/ca/ala/in_ala.py b/policyengine_us/variables/gov/local/ca/ala/in_ala.py index e53b48c4367..da357b147e2 100644 --- a/policyengine_us/variables/gov/local/ca/ala/in_ala.py +++ b/policyengine_us/variables/gov/local/ca/ala/in_ala.py @@ -9,4 +9,4 @@ class in_ala(Variable): def formula(household, period, parameters): county = household("county_str", period) - return county == "Alameda_COUNTY_CA" + return county == "ALAMEDA_COUNTY_CA" diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py index 4c2cd044ddd..147b9c334b8 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py @@ -19,5 +19,5 @@ def formula(person, period, parameters): "ca_smc_general_assistance_immigration_status_eligible_person", period, ) - not_on_ssi = person("ssi_reported", period.this_year) == 0 + not_on_ssi = person("ssi", period) == 0 return adult & immigration_eligible & not_on_ssi diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py index b6611c6a204..38de916cf1b 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_property_eligible.py @@ -16,8 +16,4 @@ class ca_smc_general_assistance_property_eligible(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.local.ca.smc.general_assistance.property countable = spm_unit("ca_smc_general_assistance_countable_property", period) - n_eligible = add( - spm_unit, period, ["ca_smc_general_assistance_eligible_person"] - ) - applicants = max_(n_eligible, 1) - return countable < p.limit * applicants + return countable < p.limit diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py index 13476089d8a..dd371f4cd10 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/property/ca_smc_general_assistance_countable_vehicle_value.py @@ -15,10 +15,6 @@ class ca_smc_general_assistance_countable_vehicle_value(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.local.ca.smc.general_assistance.property - n_eligible = add( - spm_unit, period, ["ca_smc_general_assistance_eligible_person"] - ) - applicants = max_(n_eligible, 1) household = spm_unit.household vehicle_count = household("household_vehicles_owned", period) vehicle_value = household("household_vehicles_value", period) @@ -27,11 +23,9 @@ def formula(spm_unit, period, parameters): vehicle_value / vehicle_count, 0, ) - additional_vehicle_count = max_(vehicle_count - applicants, 0) + additional_vehicle_count = max_(vehicle_count - 1, 0) additional_vehicle_equity = average_vehicle_value * additional_vehicle_count - return where( - additional_vehicle_equity - < p.additional_vehicle_combined_equity_limit * applicants, + return max_( + additional_vehicle_equity - p.additional_vehicle_combined_equity_limit, 0, - additional_vehicle_equity, ) From 055ee9ba45bc14fb3a5569bbd3bdee28a01306ab Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 22 May 2026 15:30:52 -0400 Subject: [PATCH 6/9] work requirement --- .../income/earned_income_deduction_rate.yaml | 2 + .../general_assistance/income/sources.yaml | 2 +- .../general_assistance/payment_standard.yaml | 1 + .../general_assistance/property/limit.yaml | 6 +- .../general_assistance/property/sources.yaml | 2 +- .../qualified_immigration_statuses.yaml | 2 +- .../senior_exemption_age.yaml | 10 +++ policyengine_us/programs.yaml | 1 + ...mc_general_assistance_income_eligible.yaml | 4 +- ...al_assistance_meets_work_requirements.yaml | 85 +++++++++++++++++++ ..._smc_general_assistance_eligible_person.py | 9 +- ..._smc_general_assistance_income_eligible.py | 2 +- ...eral_assistance_meets_work_requirements.py | 42 +++++++++ .../demographic/person/is_in_work_program.py | 9 ++ 14 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/senior_exemption_age.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml create mode 100644 policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py create mode 100644 policyengine_us/variables/household/demographic/person/is_in_work_program.py diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml index a8900cbf111..7bfd4276a99 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/earned_income_deduction_rate.yaml @@ -8,3 +8,5 @@ metadata: reference: - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item E href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2 + - title: 7 CFR 273.9(d)(2), CalFresh (SNAP) Earned Income Deduction + href: https://www.ecfr.gov/current/title-7/subtitle-B/chapter-II/subchapter-C/part-273/subpart-D/section-273.9#p-273.9(d)(2) diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml index 7132aad076e..4e97b6ff8d5 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/income/sources.yaml @@ -1,6 +1,6 @@ description: San Mateo County counts these income sources under the General Assistance program. values: - 2025-02-01: + 2023-10-01: - employment_income - self_employment_income - sstb_self_employment_income diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml index 79e9f558868..8e227c960a7 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/payment_standard.yaml @@ -6,6 +6,7 @@ DRUG_ALCOHOL_TREATMENT_CENTER: NMOHC_WITHOUT_REFERRAL: 2023-10-01: 732 NMOHC_WITH_REFERRAL: + # Tracks the California SSI NMOHC rate (CDSS-set, annual COLA on Jan 1). Pre-2025 amounts are not in available sources. 2025-01-01: 1_599.07 2026-01-01: 1_626.07 metadata: diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml index d00b02aa54f..18eac70c603 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/limit.yaml @@ -1,4 +1,4 @@ -description: San Mateo County limits property to this amount under the General Assistance program. The amount equals twice the independent living payment standard per Resolution 21-720, Item B(2). +description: San Mateo County limits property to this amount under the General Assistance program. values: 2023-10-01: 1_464 metadata: @@ -6,9 +6,9 @@ metadata: period: year label: San Mateo County General Assistance property limit reference: + - title: San Mateo County Human Services Agency Standards of Assistance Chart (C-335), GA Property Limit + href: https://www.smcgov.org/media/156974/download?inline=#page=1 - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Property Limits href: https://www.smcgov.org/media/153295/download?inline=#page=2 - - title: San Mateo County Human Services Agency Standards of Assistance, General Assistance - href: https://www.smcgov.org/media/156974/download?inline= - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item B(2) href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=2 diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml index 46d5a619a0a..ac1336dd5c3 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/property/sources.yaml @@ -1,6 +1,6 @@ description: San Mateo County counts these sources as property under the General Assistance program. values: - 2025-02-01: + 2023-10-01: - spm_unit_cash_assets - ca_smc_general_assistance_countable_vehicle_value metadata: diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml index 61004dbc807..4677d0eb374 100644 --- a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/qualified_immigration_statuses.yaml @@ -1,6 +1,6 @@ description: San Mateo County limits General Assistance to these immigration statuses. values: - 2025-02-01: + 2023-10-01: - CITIZEN - LEGAL_PERMANENT_RESIDENT - REFUGEE diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/senior_exemption_age.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/senior_exemption_age.yaml new file mode 100644 index 00000000000..448c7f917f2 --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/senior_exemption_age.yaml @@ -0,0 +1,10 @@ +description: San Mateo County exempts people this age or older from the General Assistance work requirement. +values: + 2023-10-01: 65 +metadata: + unit: year + period: year + label: San Mateo County General Assistance work requirement senior exemption age + reference: + - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Work Requirement + href: https://www.smcgov.org/media/153295/download?inline=#page=1 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 330cbef3694..9a8d2224504 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1264,6 +1264,7 @@ programs: coverage: San Mateo County variable: ca_smc_general_assistance parameter_prefix: gov.local.ca.smc.general_assistance + verified_start_year: 2023 - id: nyc_income_tax name: NYC income tax diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml index 18d910f0189..7b0584f4489 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml @@ -7,14 +7,14 @@ output: ca_smc_general_assistance_income_eligible: true -- name: Case 2, income at payment standard is eligible. +- name: Case 2, income at payment standard is ineligible. period: 2026-01 input: in_smc: true ca_smc_general_assistance_countable_income: 732 ca_smc_general_assistance_payment_standard: 732 output: - ca_smc_general_assistance_income_eligible: true + ca_smc_general_assistance_income_eligible: false - name: Case 3, income above payment standard is ineligible. period: 2026-01 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml new file mode 100644 index 00000000000..45288951864 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml @@ -0,0 +1,85 @@ +- name: Case 1, able-bodied English-proficient adult outside any exemption does not meet work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: true + output: + ca_smc_general_assistance_meets_work_requirements: false + +- name: Case 2, adult with earned income meets work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: true + employment_income: 12_000 + output: + ca_smc_general_assistance_meets_work_requirements: true + +- name: Case 3, adult with self-employment income meets work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: true + self_employment_income: 6_000 + output: + ca_smc_general_assistance_meets_work_requirements: true + +- name: Case 4, senior at the exemption age threshold meets work requirements. + period: 2026-01 + input: + age: 65 + in_smc: true + is_english_proficient: true + output: + ca_smc_general_assistance_meets_work_requirements: true + +- name: Case 5, adult just below the senior threshold does not meet work requirements. + period: 2026-01 + input: + age: 64 + in_smc: true + is_english_proficient: true + output: + ca_smc_general_assistance_meets_work_requirements: false + +- name: Case 6, disabled adult meets work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: true + is_disabled: true + output: + ca_smc_general_assistance_meets_work_requirements: true + +- name: Case 7, full-time student meets work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: true + is_full_time_student: true + output: + ca_smc_general_assistance_meets_work_requirements: true + +- name: Case 8, adult with limited English proficiency meets work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: false + output: + ca_smc_general_assistance_meets_work_requirements: true + +- name: Case 9, adult participating in the work program meets work requirements. + period: 2026-01 + input: + age: 30 + in_smc: true + is_english_proficient: true + is_in_work_program: true + output: + ca_smc_general_assistance_meets_work_requirements: true diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py index 147b9c334b8..ac3308a1040 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py @@ -13,6 +13,10 @@ class ca_smc_general_assistance_eligible_person(Variable): ) def formula(person, period, parameters): + # We don't track 15-day county residency, fleeing-felon + # disqualification, or the requirement to apply for other potential + # income at the moment. The SSI gate below captures SSI recipients + # but does not separately exclude CAPI recipients. p = parameters(period).gov.local.ca.smc.general_assistance adult = person("age", period.this_year) >= p.minimum_age immigration_eligible = person( @@ -20,4 +24,7 @@ def formula(person, period, parameters): period, ) not_on_ssi = person("ssi", period) == 0 - return adult & immigration_eligible & not_on_ssi + meets_work_requirements = person( + "ca_smc_general_assistance_meets_work_requirements", period + ) + return adult & immigration_eligible & not_on_ssi & meets_work_requirements diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py index ee655a9ce80..c11bf810248 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py @@ -16,4 +16,4 @@ def formula(spm_unit, period, parameters): spm_unit, period, ["ca_smc_general_assistance_eligible_person"] ) per_person_income = where(n_eligible > 0, income / n_eligible, 0) - return per_person_income <= standard + return per_person_income < standard diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py new file mode 100644 index 00000000000..b5beeac0dd6 --- /dev/null +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py @@ -0,0 +1,42 @@ +from policyengine_us.model_api import * + + +class ca_smc_general_assistance_meets_work_requirements(Variable): + value_type = bool + entity = Person + label = "Meets work requirements for San Mateo County General Assistance" + definition_period = MONTH + defined_for = "in_smc" + reference = "https://www.smcgov.org/media/153295/download?inline=#page=1" + + def formula(person, period, parameters): + # We don't track caregiving for an ill parent/spouse/child/sibling, + # the "child under 16" exemption (moot — minor children disqualify + # the SPM unit), or HSA-approved training/rehabilitation programs at + # the moment. + p = parameters(period).gov.local.ca.smc.general_assistance.work_requirement + is_working = ( + add( + person, + period, + [ + "employment_income", + "self_employment_income", + "sstb_self_employment_income", + ], + ) + > 0 + ) + is_senior = person("age", period.this_year) >= p.senior_exemption_age + is_disabled = person("is_disabled", period) + is_full_time_student = person("is_full_time_student", period) + is_not_english_proficient = ~person("is_english_proficient", period) + is_in_work_program = person("is_in_work_program", period) + return ( + is_working + | is_senior + | is_disabled + | is_full_time_student + | is_not_english_proficient + | is_in_work_program + ) diff --git a/policyengine_us/variables/household/demographic/person/is_in_work_program.py b/policyengine_us/variables/household/demographic/person/is_in_work_program.py new file mode 100644 index 00000000000..6a886e54446 --- /dev/null +++ b/policyengine_us/variables/household/demographic/person/is_in_work_program.py @@ -0,0 +1,9 @@ +from policyengine_us.model_api import * + + +class is_in_work_program(Variable): + value_type = bool + entity = Person + definition_period = MONTH + label = "Is in a work program" + documentation = "Whether the person is participating in a state, county, or federal work program tied to a benefit (for example, a welfare-to-work activity, SNAP Employment and Training, or a county work center)." From c421e6c4dbc3861161b1ec6de8a91b94c3b732c7 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 22 May 2026 16:07:17 -0400 Subject: [PATCH 7/9] minor --- policyengine_us/programs.yaml | 2 +- ...mc_general_assistance_eligible_person.yaml | 3 +- ...mc_general_assistance_income_eligible.yaml | 51 +++++++++++++++---- ...al_assistance_meets_work_requirements.yaml | 14 ++--- .../smc/general_assistance/integration.yaml | 10 ++++ ..._smc_general_assistance_income_eligible.py | 2 +- ...eral_assistance_meets_work_requirements.py | 6 ++- 7 files changed, 63 insertions(+), 25 deletions(-) diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index dcbb65c3611..fe59c90360e 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1277,7 +1277,7 @@ programs: coverage: San Mateo County variable: ca_smc_general_assistance parameter_prefix: gov.local.ca.smc.general_assistance - verified_start_year: 2023 + verified_start_year: 2025 - id: nyc_income_tax name: NYC income tax diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml index ce6b8be45a7..1b35ce6e763 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml @@ -1,9 +1,10 @@ -- name: Case 1, adult citizen is eligible. +- name: Case 1, adult citizen meeting the work requirement is eligible. period: 2026-01 input: age: 18 immigration_status: CITIZEN in_smc: true + is_in_work_program: true output: ca_smc_general_assistance_eligible_person: true diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml index 7b0584f4489..90f334a9335 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.yaml @@ -1,26 +1,59 @@ - name: Case 1, income below payment standard is eligible. period: 2026-01 input: - in_smc: true - ca_smc_general_assistance_countable_income: 731 - ca_smc_general_assistance_payment_standard: 732 + people: + person1: + age: 30 + immigration_status: CITIZEN + is_in_work_program: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_countable_income: 731 + ca_smc_general_assistance_payment_standard: 732 output: ca_smc_general_assistance_income_eligible: true - name: Case 2, income at payment standard is ineligible. period: 2026-01 input: - in_smc: true - ca_smc_general_assistance_countable_income: 732 - ca_smc_general_assistance_payment_standard: 732 + people: + person1: + age: 30 + immigration_status: CITIZEN + is_in_work_program: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_countable_income: 732 + ca_smc_general_assistance_payment_standard: 732 output: ca_smc_general_assistance_income_eligible: false - name: Case 3, income above payment standard is ineligible. period: 2026-01 input: - in_smc: true - ca_smc_general_assistance_countable_income: 733 - ca_smc_general_assistance_payment_standard: 732 + people: + person1: + age: 30 + immigration_status: CITIZEN + is_in_work_program: true + households: + household: + members: [person1] + in_smc: true + spm_units: + spm_unit: + members: [person1] + ca_smc_general_assistance_countable_income: 733 + ca_smc_general_assistance_payment_standard: 732 output: ca_smc_general_assistance_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml index 45288951864..a9621dac755 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml @@ -1,9 +1,8 @@ -- name: Case 1, able-bodied English-proficient adult outside any exemption does not meet work requirements. +- name: Case 1, able-bodied adult outside any exemption does not meet work requirements. period: 2026-01 input: age: 30 in_smc: true - is_english_proficient: true output: ca_smc_general_assistance_meets_work_requirements: false @@ -12,7 +11,6 @@ input: age: 30 in_smc: true - is_english_proficient: true employment_income: 12_000 output: ca_smc_general_assistance_meets_work_requirements: true @@ -22,7 +20,6 @@ input: age: 30 in_smc: true - is_english_proficient: true self_employment_income: 6_000 output: ca_smc_general_assistance_meets_work_requirements: true @@ -32,7 +29,6 @@ input: age: 65 in_smc: true - is_english_proficient: true output: ca_smc_general_assistance_meets_work_requirements: true @@ -41,7 +37,6 @@ input: age: 64 in_smc: true - is_english_proficient: true output: ca_smc_general_assistance_meets_work_requirements: false @@ -50,7 +45,6 @@ input: age: 30 in_smc: true - is_english_proficient: true is_disabled: true output: ca_smc_general_assistance_meets_work_requirements: true @@ -60,17 +54,16 @@ input: age: 30 in_smc: true - is_english_proficient: true is_full_time_student: true output: ca_smc_general_assistance_meets_work_requirements: true -- name: Case 8, adult with limited English proficiency meets work requirements. +- name: Case 8, adult in a non-English-speaking household meets work requirements. period: 2026-01 input: age: 30 in_smc: true - is_english_proficient: false + is_non_english_speaking_home: true output: ca_smc_general_assistance_meets_work_requirements: true @@ -79,7 +72,6 @@ input: age: 30 in_smc: true - is_english_proficient: true is_in_work_program: true output: ca_smc_general_assistance_meets_work_requirements: true diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml index 0011a1820ac..4ddf6e35bc7 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml @@ -5,6 +5,7 @@ person1: age: 30 immigration_status: CITIZEN + is_in_work_program: true households: household: members: [person1] @@ -47,6 +48,7 @@ age: 30 unemployment_compensation: 8_796 immigration_status: CITIZEN + is_in_work_program: true households: household: members: [person1] @@ -68,6 +70,7 @@ person1: age: 30 immigration_status: LEGAL_PERMANENT_RESIDENT + is_in_work_program: true households: household: members: [person1] @@ -128,6 +131,7 @@ person1: age: 30 immigration_status: CITIZEN + is_in_work_program: true households: household: members: [person1] @@ -173,9 +177,11 @@ person1: age: 30 immigration_status: CITIZEN + is_in_work_program: true person2: age: 28 immigration_status: CITIZEN + is_in_work_program: true households: household: members: [person1, person2] @@ -196,6 +202,7 @@ age: 30 immigration_status: CITIZEN ssi: 0 + is_in_work_program: true person2: age: 65 immigration_status: CITIZEN @@ -267,12 +274,15 @@ person1: age: 30 immigration_status: CITIZEN + is_in_work_program: true person2: age: 28 immigration_status: CITIZEN + is_in_work_program: true person3: age: 25 immigration_status: CITIZEN + is_in_work_program: true households: household: members: [person1, person2, person3] diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py index c11bf810248..9cf614041a2 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_income_eligible.py @@ -16,4 +16,4 @@ def formula(spm_unit, period, parameters): spm_unit, period, ["ca_smc_general_assistance_eligible_person"] ) per_person_income = where(n_eligible > 0, income / n_eligible, 0) - return per_person_income < standard + return (n_eligible > 0) & (per_person_income < standard) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py index b5beeac0dd6..93c72f919ac 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py @@ -30,13 +30,15 @@ def formula(person, period, parameters): is_senior = person("age", period.this_year) >= p.senior_exemption_age is_disabled = person("is_disabled", period) is_full_time_student = person("is_full_time_student", period) - is_not_english_proficient = ~person("is_english_proficient", period) + is_lep_household = person.household( + "is_non_english_speaking_home", period.this_year + ) is_in_work_program = person("is_in_work_program", period) return ( is_working | is_senior | is_disabled | is_full_time_student - | is_not_english_proficient + | is_lep_household | is_in_work_program ) From 5a51d79663ab8a60f131c3f6e633baafaf8e4241 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 22 May 2026 16:17:43 -0400 Subject: [PATCH 8/9] work requirement weekly hours --- .../work_requirement/weekly_hours_threshold.yaml | 12 ++++++++++++ ...neral_assistance_meets_work_requirements.yaml | 12 +++++++----- .../ca/smc/general_assistance/integration.yaml | 2 ++ ...general_assistance_meets_work_requirements.py | 16 +++------------- 4 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/weekly_hours_threshold.yaml diff --git a/policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/weekly_hours_threshold.yaml b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/weekly_hours_threshold.yaml new file mode 100644 index 00000000000..7a8b6334eef --- /dev/null +++ b/policyengine_us/parameters/gov/local/ca/smc/general_assistance/work_requirement/weekly_hours_threshold.yaml @@ -0,0 +1,12 @@ +description: San Mateo County exempts individuals working at least this many hours per week from the General Assistance work requirement, interpreting the Fact Sheet "Employed full-time" exemption via the CalWORKs full-time work threshold per Resolution 21-720, Item A. +values: + 2023-10-01: 30 +metadata: + unit: hour + period: week + label: San Mateo County General Assistance work requirement weekly hours threshold + reference: + - title: San Mateo County Human Services Agency General Assistance Program Fact Sheet, Work Requirement + href: https://www.smcgov.org/media/153295/download?inline=#page=1 + - title: San Mateo County Board Resolution 21-720, Modification of GA Rules and Regulations, Item A + href: https://sanmateocounty.legistar.com/View.ashx?GUID=25359405-C9EB-4566-AE97-D927CC455B02&ID=9802358&M=F#page=3 diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml index a9621dac755..21a8df74a7c 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml @@ -3,26 +3,27 @@ input: age: 30 in_smc: true + weekly_hours_worked_before_lsr: 0 output: ca_smc_general_assistance_meets_work_requirements: false -- name: Case 2, adult with earned income meets work requirements. +- name: Case 2, adult working at the full-time threshold meets work requirements. period: 2026-01 input: age: 30 in_smc: true - employment_income: 12_000 + weekly_hours_worked_before_lsr: 30 output: ca_smc_general_assistance_meets_work_requirements: true -- name: Case 3, adult with self-employment income meets work requirements. +- name: Case 3, adult working below the full-time threshold does not meet work requirements. period: 2026-01 input: age: 30 in_smc: true - self_employment_income: 6_000 + weekly_hours_worked_before_lsr: 29 output: - ca_smc_general_assistance_meets_work_requirements: true + ca_smc_general_assistance_meets_work_requirements: false - name: Case 4, senior at the exemption age threshold meets work requirements. period: 2026-01 @@ -37,6 +38,7 @@ input: age: 64 in_smc: true + weekly_hours_worked_before_lsr: 0 output: ca_smc_general_assistance_meets_work_requirements: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml index 4ddf6e35bc7..a06a3c01c5c 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/integration.yaml @@ -28,6 +28,7 @@ age: 30 employment_income: 2_400 immigration_status: CITIZEN + is_in_work_program: true households: household: members: [person1] @@ -91,6 +92,7 @@ age: 30 employment_income: 3_000 immigration_status: REFUGEE + is_in_work_program: true households: household: members: [person1] diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py index 93c72f919ac..577ac2a9b8c 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py @@ -15,18 +15,8 @@ def formula(person, period, parameters): # the SPM unit), or HSA-approved training/rehabilitation programs at # the moment. p = parameters(period).gov.local.ca.smc.general_assistance.work_requirement - is_working = ( - add( - person, - period, - [ - "employment_income", - "self_employment_income", - "sstb_self_employment_income", - ], - ) - > 0 - ) + weekly_hours_worked = person("weekly_hours_worked_before_lsr", period.this_year) + is_working_full_time = weekly_hours_worked >= p.weekly_hours_threshold is_senior = person("age", period.this_year) >= p.senior_exemption_age is_disabled = person("is_disabled", period) is_full_time_student = person("is_full_time_student", period) @@ -35,7 +25,7 @@ def formula(person, period, parameters): ) is_in_work_program = person("is_in_work_program", period) return ( - is_working + is_working_full_time | is_senior | is_disabled | is_full_time_student From ba64d68fe283d9c8725640b398dc0f32570f5435 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 26 May 2026 10:49:01 -0400 Subject: [PATCH 9/9] CAPI gate, k12 school exemption --- .../ca_smc_general_assistance_eligible_person.yaml | 11 +++++++++++ ...general_assistance_meets_work_requirements.yaml | 4 ++-- .../ca_smc_general_assistance_eligible_person.py | 14 +++++++++++--- ...c_general_assistance_meets_work_requirements.py | 4 ++-- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml index 1b35ce6e763..e2dee110ced 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.yaml @@ -45,3 +45,14 @@ ssi: 0 output: ca_smc_general_assistance_eligible_person: true + +- name: Case 6, aged low-quarter LPR (CAPI-eligible) is ineligible for SMC GA. + period: 2026-01 + input: + age: 70 + immigration_status: LEGAL_PERMANENT_RESIDENT + ssi_qualifying_quarters_earnings: 0 + in_smc: true + ssi: 0 + output: + ca_smc_general_assistance_eligible_person: false diff --git a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml index 21a8df74a7c..b1833f18aa5 100644 --- a/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml +++ b/policyengine_us/tests/policy/baseline/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.yaml @@ -51,12 +51,12 @@ output: ca_smc_general_assistance_meets_work_requirements: true -- name: Case 7, full-time student meets work requirements. +- name: Case 7, K-12 student meets work requirements. period: 2026-01 input: age: 30 in_smc: true - is_full_time_student: true + is_in_k12_school: true output: ca_smc_general_assistance_meets_work_requirements: true diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py index ac3308a1040..a600b18458e 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_eligible_person.py @@ -15,8 +15,9 @@ class ca_smc_general_assistance_eligible_person(Variable): def formula(person, period, parameters): # We don't track 15-day county residency, fleeing-felon # disqualification, or the requirement to apply for other potential - # income at the moment. The SSI gate below captures SSI recipients - # but does not separately exclude CAPI recipients. + # income at the moment. SSI and CAPI recipients are excluded because + # GA is interim aid pending those categorical benefits (Board File + # 26-290; SSP-14 IAR framing). p = parameters(period).gov.local.ca.smc.general_assistance adult = person("age", period.this_year) >= p.minimum_age immigration_eligible = person( @@ -24,7 +25,14 @@ def formula(person, period, parameters): period, ) not_on_ssi = person("ssi", period) == 0 + not_capi_eligible = ~person("ca_capi_eligible_person", period.this_year) meets_work_requirements = person( "ca_smc_general_assistance_meets_work_requirements", period ) - return adult & immigration_eligible & not_on_ssi & meets_work_requirements + return ( + adult + & immigration_eligible + & not_on_ssi + & not_capi_eligible + & meets_work_requirements + ) diff --git a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py index 577ac2a9b8c..e7e2d822d8f 100644 --- a/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py +++ b/policyengine_us/variables/gov/local/ca/smc/general_assistance/eligibility/ca_smc_general_assistance_meets_work_requirements.py @@ -19,7 +19,7 @@ def formula(person, period, parameters): is_working_full_time = weekly_hours_worked >= p.weekly_hours_threshold is_senior = person("age", period.this_year) >= p.senior_exemption_age is_disabled = person("is_disabled", period) - is_full_time_student = person("is_full_time_student", period) + is_in_k12_school = person("is_in_k12_school", period.this_year) is_lep_household = person.household( "is_non_english_speaking_home", period.this_year ) @@ -28,7 +28,7 @@ def formula(person, period, parameters): is_working_full_time | is_senior | is_disabled - | is_full_time_student + | is_in_k12_school | is_lep_household | is_in_work_program )