Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions changelog_entry.yaml
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
description: Immigration statuses eligible for CA state-funded Medi-Cal (without satisfactory federal immigration status).
values:
2016-01-01:
- UNDOCUMENTED
- DACA
- TPS
- DACA_TPS
# 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.
metadata:
label: CA state-funded Medi-Cal eligible immigration statuses
period: year
unit: list
reference:
- title: California Welfare and Institutions Code Section 14007.8
href: https://california.public.law/codes/welfare_and_institutions_code_section_14007.8
- title: WCLP - Medi-Cal Immigration Changes Practice Tip (Nov 2025)
href: https://wclp.org/wp-content/uploads/2025/11/251113-Medi-Cal-immigration-changes-practice-tip-FINAL.pdf#page=1
- title: Health Provisions in the 2025 Federal Budget Reconciliation Bill | KFF
href: https://www.kff.org/tracking-the-medicaid-provisions-in-the-2025-budget-bill/
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
description: Immigration statuses subject to the CA Medi-Cal enrollment freeze starting January 1, 2026.
values:
2026-01-01:
- UNDOCUMENTED
metadata:
label: CA Medi-Cal enrollment freeze affected statuses
period: year
unit: list
reference:
- title: WCLP - Medi-Cal Immigration Changes Practice Tip (Nov 2025)
href: https://wclp.org/wp-content/uploads/2025/11/251113-Medi-Cal-immigration-changes-practice-tip-FINAL.pdf#page=1
- title: California Welfare and Institutions Code Section 14007.8(b)(1)
href: https://california.public.law/codes/welfare_and_institutions_code_section_14007.8
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -73,26 +78,97 @@
# 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

- name: Case 12, DACA_TPS adult remains eligible in 2026 (not affected by freeze).
period: 2026
input:
age: 40
is_pregnant: false
immigration_status: DACA_TPS
receives_medicaid: false
state_code: CA
output:
is_ca_medicaid_immigration_status_eligible: true

# Immigration statuses NOT covered by CA state-funded program

- name: Case 13, 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 14, 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 15, 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

Original file line number Diff line number Diff line change
Expand Up @@ -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