diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..ba1dfa308d1 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: patch + changes: + fixed: + - Fix CA Medi-Cal immigration eligibility for DACA/TPS holders in 2026. Previously, DACA/TPS holders incorrectly lost eligibility after the January 2026 enrollment freeze. Per WCLP guidance, DACA/TPS holders are not affected by the freeze and can still newly enroll. diff --git a/policyengine_us/parameters/gov/states/ca/chhs/ca_state_funded_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/ca/chhs/ca_state_funded_immigration_statuses.yaml new file mode 100644 index 00000000000..458d80e6d72 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/chhs/ca_state_funded_immigration_statuses.yaml @@ -0,0 +1,23 @@ +description: California includes these immigration statuses as eligible for state-funded coverage under the Medi-Cal program. + +# TODO: After Oct 2026, federal OBBBA removes refugees, asylees, parolees, +# PRUCOL, and others from federal Medicaid funding. Whether CA will cover +# these groups with state funds is uncertain as of Jan 2026: +# - Current state law: keep full-scope Medi-Cal with dental +# - DHCS interpretation: move to Medi-Cal with no dental + premiums +# - Governor's proposed budget (Jan 9, 2026): restricted-scope only +# Update this parameter when legislation clarifies the outcome. + +values: + 2016-01-01: + - UNDOCUMENTED + - DACA + - TPS + +metadata: + unit: list + period: year + label: California Medi-Cal state-funded eligible immigration statuses + reference: + - title: California Welfare and Institutions Code Section 14007.8 + href: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=14007.8.&lawCode=WIC diff --git a/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/affected_statuses.yaml b/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/affected_statuses.yaml new file mode 100644 index 00000000000..f11676557b5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/affected_statuses.yaml @@ -0,0 +1,14 @@ +description: California limits the Medi-Cal enrollment freeze to these immigration statuses under the Medi-Cal program. + +values: + 2016-01-01: [] + 2026-01-01: + - UNDOCUMENTED + +metadata: + unit: list + period: year + label: California Medi-Cal enrollment freeze affected immigration statuses + reference: + - title: California Welfare and Institutions Code Section 14007.8(b)(1) + href: https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=14007.8.&lawCode=WIC diff --git a/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/in_effect.yaml b/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/in_effect.yaml index 71fbcc52085..040d8adca47 100644 --- a/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/in_effect.yaml +++ b/policyengine_us/parameters/gov/states/ca/chhs/medi_cal_enrollment_freeze/in_effect.yaml @@ -6,7 +6,7 @@ values: metadata: unit: bool period: year - label: CA Medi-Cal enrollment freeze in effect + label: California Medi-Cal enrollment freeze in effect reference: - title: California Welfare and Institutions Code Section 14007.8(b)(1) href: https://california.public.law/codes/welfare_and_institutions_code_section_14007.8 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.yaml index 7d639b5b91c..e3fbe452c1b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.yaml @@ -3,52 +3,57 @@ # Age-based eligibility tests (standard pathway) -- name: Case 1, child under 19 is eligible in 2020. +- name: Case 1, undocumented child under 19 is eligible in 2020. period: 2020 input: age: 18 is_pregnant: false + immigration_status: UNDOCUMENTED state_code: CA output: is_ca_medicaid_immigration_status_eligible: true -- name: Case 2, adult 50+ is ineligible in 2020 (before expansion). +- name: Case 2, undocumented adult 50+ is ineligible in 2020 (before expansion). period: 2020 input: age: 50 is_pregnant: false + immigration_status: UNDOCUMENTED state_code: CA output: is_ca_medicaid_immigration_status_eligible: false -- name: Case 3, adult 26+ is ineligible in 2020 (before expansion). +- name: Case 3, undocumented adult 26+ is ineligible in 2020 (before expansion). period: 2020 input: age: 26 is_pregnant: false + immigration_status: UNDOCUMENTED state_code: CA output: is_ca_medicaid_immigration_status_eligible: false -- name: Case 4, pregnant adult is eligible regardless of age. +- name: Case 4, pregnant undocumented adult is eligible regardless of age. period: 2020 input: age: 26 is_pregnant: true + immigration_status: UNDOCUMENTED state_code: CA output: is_ca_medicaid_immigration_status_eligible: true -- name: Case 5, adult 26+ is eligible in 2024 (after expansion). +- name: Case 5, undocumented adult 26+ is eligible in 2024 (after expansion). period: 2024 input: age: 26 is_pregnant: false + immigration_status: UNDOCUMENTED state_code: CA output: is_ca_medicaid_immigration_status_eligible: true -# Continuous coverage tests for 2026 enrollment freeze +# Continuous coverage tests for 2026 enrollment freeze (UNDOCUMENTED only) - name: Case 6, undocumented adult not on Medicaid is ineligible in 2026. period: 2026 @@ -73,26 +78,86 @@ # Existing enrollees without SIS retain coverage per Section 14007.8 is_ca_medicaid_immigration_status_eligible: true -- name: Case 8, child under 19 is still eligible in 2026 (not affected by freeze). +- name: Case 8, undocumented child under 19 is still eligible in 2026 (not affected by freeze). period: 2026 input: age: 10 is_pregnant: false + immigration_status: UNDOCUMENTED receives_medicaid: false state_code: CA output: # Children under 19 remain eligible for new enrollment is_ca_medicaid_immigration_status_eligible: true -- name: Case 9, refugee on Medicaid does not get CA state-funded eligibility. +# DACA/TPS are NOT affected by the enrollment freeze (per WCLP Practice Tip Nov 2025) + +- name: Case 9, DACA adult is eligible in 2024. + period: 2024 + input: + age: 35 + is_pregnant: false + immigration_status: DACA + state_code: CA + output: + is_ca_medicaid_immigration_status_eligible: true + +- name: Case 10, DACA adult remains eligible in 2026 (not affected by freeze). period: 2026 + input: + age: 35 + is_pregnant: false + immigration_status: DACA + receives_medicaid: false + state_code: CA + output: + # Per WCLP: "People with DACA are not impacted by this full-scope Medi-Cal ban" + is_ca_medicaid_immigration_status_eligible: true + +- name: Case 11, TPS adult remains eligible in 2026 (not affected by freeze). + period: 2026 + input: + age: 50 + is_pregnant: false + immigration_status: TPS + receives_medicaid: false + state_code: CA + output: + # TPS holders are not affected by the enrollment freeze + is_ca_medicaid_immigration_status_eligible: true + +# Immigration statuses NOT covered by CA state-funded program + +- name: Case 12, citizen is not eligible for CA state-funded program. + period: 2024 + input: + age: 35 + is_pregnant: false + immigration_status: CITIZEN + state_code: CA + output: + # Citizens use federal Medicaid, not CA state-funded + is_ca_medicaid_immigration_status_eligible: false + +- name: Case 13, LPR is not eligible for CA state-funded program in 2024. + period: 2024 + input: + age: 35 + is_pregnant: false + immigration_status: LEGAL_PERMANENT_RESIDENT + state_code: CA + output: + # LPRs use federal Medicaid, not CA state-funded + is_ca_medicaid_immigration_status_eligible: false + +- name: Case 14, refugee is not eligible for CA state-funded program in 2024. + period: 2024 input: age: 35 is_pregnant: false immigration_status: REFUGEE - receives_medicaid: true state_code: CA output: - # Refugees have satisfactory immigration status - they use federal rules - # CA state-funded program is only for those without SIS + # Before Oct 2026, refugees have federal eligibility is_ca_medicaid_immigration_status_eligible: false + diff --git a/policyengine_us/variables/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.py b/policyengine_us/variables/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.py index 94d2abe2c92..d4a20b03949 100644 --- a/policyengine_us/variables/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/ca/chhs/is_ca_medicaid_immigration_status_eligible.py @@ -13,27 +13,48 @@ class is_ca_medicaid_immigration_status_eligible(Variable): California Welfare and Institutions Code Section 14007.8 provides state-funded Medi-Cal to individuals without satisfactory immigration status based on age brackets. Starting January 1, 2026, new enrollments - for adults 19+ are frozen, but existing enrollees retain coverage. + for adults 19+ are frozen for certain statuses (undocumented), but: + - Existing enrollees retain coverage (continuous coverage) + - DACA/TPS holders are NOT affected by the freeze + - After October 2026, refugees/asylees losing federal coverage are + picked up by CA state-funded coverage """ defined_for = StateCode.CA def formula(person, period, parameters): p = parameters(period).gov.states.ca.chhs + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + + # Check if person has a CA state-funded eligible immigration status + is_ca_state_funded_status = np.isin( + immigration_status_str, p.ca_state_funded_immigration_statuses + ) + age = person("age", period) pregnant = person("is_pregnant", period) # Standard eligibility based on age or pregnancy standard_eligible = ( p.eligible_regardless_of_immigration_status.calc(age) | pregnant ) - # Continuous coverage only applies after enrollment freeze + + # Enrollment freeze logic (effective January 1, 2026) if p.medi_cal_enrollment_freeze.in_effect: + # Check if person's status is affected by the freeze + is_freeze_affected = np.isin( + immigration_status_str, + p.medi_cal_enrollment_freeze.affected_statuses, + ) receives_medicaid = person("receives_medicaid", period) - # Section 14007.8 is specifically for undocumented immigrants - immigration_status = person("immigration_status", period) - undocumented = ( - immigration_status - == immigration_status.possible_values.UNDOCUMENTED + + # Freeze-affected (UNDOCUMENTED): standard age eligibility OR + # continuous coverage (already enrolled) + # Not freeze-affected (DACA/TPS/others): always eligible + # (Health4All covered all ages by 2024, freeze doesn't apply) + return is_ca_state_funded_status & where( + is_freeze_affected, + standard_eligible | receives_medicaid, + True, ) - continuous_coverage = receives_medicaid & undocumented - return standard_eligible | continuous_coverage - return standard_eligible + + return is_ca_state_funded_status & standard_eligible