Repository: PolicyEngine/policyengine-us

Issue:
Separate CHIP from Medicaid
We currently combine them. Perhaps they should be separate as chip can charge premiums (up to 5% of household income) and has different coverage requirements.

Hints from issue comments:
@PavelMakarchuk: Lets convert this into a discussion and file an issue if we decide to actually separate CHIP @MaxGhenis: I would say the separate premium rules justify it, so we can skip a discussion 

Solution patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a164b91d2a..b3e8847efa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -952,38 +952,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added
 
-- 2
-- 0
-- 2
-- 5
--  
-- S
-- S
-- I
-- ,
--  
-- A
-- N
-- D
-- -
-- C
-- S
-- ,
--  
-- a
-- n
-- d
--  
-- O
-- A
-- P
--  
-- v
-- a
-- l
-- u
-- e
-- s
+- Added 2025 SSI, AND-CS, and OAP values.
 
 ## [1.162.0] - 2024-12-18 02:31:13
 
@@ -3146,7 +3115,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed
 
-- Delaware _joint AGI and deductions variable attribution.
+- Delaware \_joint AGI and deductions variable attribution.
 
 ## [0.733.0] - 2024-04-12 20:25:53
 
@@ -5755,7 +5724,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Added
 
-- Seven empty state ??_income_tax.py variables.
+- Seven empty state ??\_income_tax.py variables.
 - All states to the state_income_taxes.py adds list.
 
 ## [0.506.1] - 2023-10-17 22:47:08
@@ -6858,7 +6827,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 ### Fixed
 
-- Error-prone {short,long}_term_capital_losses variables by removing them.
+- Error-prone {short,long}\_term_capital_losses variables by removing them.
 
 ## [0.390.0] - 2023-07-26 16:33:04
 
@@ -11386,8 +11355,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 - First prototype version with a standard deduction variable.
 
-
-
 [1.251.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.250.0...1.251.0
 [1.250.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.249.0...1.250.0
 [1.249.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.248.2...1.249.0
@@ -13212,4 +13179,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 [0.3.0]: https://github.com/PolicyEngine/policyengine-us/compare/0.2.0...0.3.0
 [0.2.0]: https://github.com/PolicyEngine/policyengine-us/compare/0.1.0...0.2.0
 [0.1.0]: https://github.com/PolicyEngine/policyengine-us/compare/0.0.1...0.1.0
-
diff --git a/changelog_entry.yaml b/changelog_entry.yaml
index e69de29bb2..130ad7664e 100644
--- a/changelog_entry.yaml
+++ b/changelog_entry.yaml
@@ -0,0 +1,4 @@
+- bump: patch
+  changes:
+    added:
+    - Added CHIP as a program seperate from Medicaid. 
diff --git a/policyengine_us/parameters/gov/hhs/chip/child/income_limit.yaml b/policyengine_us/parameters/gov/hhs/chip/child/income_limit.yaml
new file mode 100644
index 0000000000..426e6d10d3
--- /dev/null
+++ b/policyengine_us/parameters/gov/hhs/chip/child/income_limit.yaml
@@ -0,0 +1,112 @@
+description: The US limits the Children's Health Insurance Program for children to families with income below this fraction of the poverty line.
+metadata:
+  unit: /1
+  period: year
+  label: CHIP child income limit
+  breakdown:
+  - state_code
+  reference:
+    - title: Medicaid, Children's Health Insurance Program, & Basic Health Program Eligibility Levels as of December 2023 | CMS
+      href: https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels
+AK:
+  2021-01-01: -.inf
+AL:
+  2021-01-01: 3.17
+AR:
+  2021-01-01: 2.16
+AZ:
+  2021-01-01: 2.05
+CA:
+  2021-01-01: -.inf
+CO:
+  2021-01-01: 2.65
+CT:
+  2021-01-01: 3.23
+DC:
+  2021-01-01: -.inf
+DE:
+  2021-01-01: 2.17
+FL:
+  2021-01-01: 2.15
+GA:
+  2021-01-01: 2.52
+HI:
+  2021-01-01: -.inf
+IA:
+  2021-01-01: 3.07
+ID:
+  2021-01-01: 1.90
+IL:
+  2021-01-01: -.inf
+IN:
+  2021-01-01: 2.55
+KS:
+  2021-01-01: 2.55
+KY:
+  2021-01-01: -.inf
+LA:
+  2021-01-01: 2.55
+MA:
+  2021-01-01: 3.05
+MD:
+  2021-01-01: -.inf
+ME:
+  2021-01-01: -.inf
+MI:
+  2021-01-01: -.inf
+MN:
+  2021-01-01: -.inf
+MO:
+  2021-01-01: 3.05
+MS:
+  2021-01-01: 2.14
+MT:
+  2021-01-01: 2.66
+NC:
+  2021-01-01: -.inf
+ND:
+  2021-01-01: -.inf
+NE:
+  2021-01-01: -.inf
+NH:
+  2021-01-01: -.inf
+NJ:
+  2021-01-01: 3.55
+NM:
+  2021-01-01: -.inf
+NV:
+  2021-01-01: 2.05
+NY:
+  2021-01-01: 4.05
+OH:
+  2021-01-01: -.inf
+OK:
+  2021-01-01: -.inf
+OR:
+  2021-01-01: 3.05
+PA:
+  2021-01-01: 3.19
+RI:
+  2021-01-01: -.inf
+SC:
+  2021-01-01: -.inf
+SD:
+  2021-01-01: 2.09
+TN:
+  2021-01-01: 2.55
+TX:
+  2021-01-01: 2.06
+UT:
+  2021-01-01: 2.05
+VA:
+  2021-01-01: 2.05
+VT:
+  2021-01-01: -.inf
+WA:
+  2021-01-01: 3.17
+WI:
+  2021-01-01: 3.06
+WV:
+  2021-01-01: 3.05
+WY:
+  2021-01-01: -.inf
diff --git a/policyengine_us/parameters/gov/hhs/chip/child/max_age.yaml b/policyengine_us/parameters/gov/hhs/chip/child/max_age.yaml
new file mode 100644
index 0000000000..05ba7151b2
--- /dev/null
+++ b/policyengine_us/parameters/gov/hhs/chip/child/max_age.yaml
@@ -0,0 +1,9 @@
+description: The US limits the Children's Health Insurance Program to children under this age.
+metadata:
+  unit: /1
+  label: Maximum age for CHIP eligibility
+  reference:
+    - title: x #4ec. 2110. [42 U.S.C. 1397jj] (a) Child Health Assistance - c(1)
+      href:  https://www.law.cornell.edu/uscode/text/42/1397jj#c_1
+values:
+  1966-01-01: 19
diff --git a/policyengine_us/parameters/gov/hhs/chip/fcep/income_limit.yaml b/policyengine_us/parameters/gov/hhs/chip/fcep/income_limit.yaml
new file mode 100644
index 0000000000..4e7650e314
--- /dev/null
+++ b/policyengine_us/parameters/gov/hhs/chip/fcep/income_limit.yaml
@@ -0,0 +1,112 @@
+description: State governments limit Children's Health Insurance Program from-conception-to-end-of-pregnancy eligibility to these incomes, as a share of the federal poverty line. 
+metadata:
+  unit: /1
+  period: year
+  label: CHIP FCEP pregnant income limit
+  breakdown:
+  - state_code
+  reference:
+    - title: Medicaid, Children's Health Insurance Program, & Basic Health Program Eligibility Levels as of December 2023 | CMS
+      href: https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels
+AK:
+  2021-01-01: -.inf
+AL:
+  2021-01-01: 3.17
+AR:
+  2021-01-01: 2.14
+AZ:
+  2021-01-01: -.inf
+CA:
+  2021-01-01: 3.22
+CO:
+  2021-01-01: 2.65
+CT:
+  2021-01-01: 2.63
+DC:
+  2021-01-01: 3.24
+DE:
+  2021-01-01: -.inf
+FL:
+  2021-01-01: -.inf
+GA:
+  2021-01-01: -.inf
+HI:
+  2021-01-01: -.inf
+IA:
+  2021-01-01: -.inf
+ID:
+  2021-01-01: -.inf
+IL:
+  2021-01-01: 2.13
+IN:
+  2021-01-01: -.inf
+KS:
+  2021-01-01: -.inf
+KY:
+  2021-01-01: -.inf
+LA:
+  2021-01-01: 2.14
+MA:
+  2021-01-01: 2.05
+MD:
+  2021-01-01: 2.64
+ME:
+  2021-01-01: 2.13
+MI:
+  2021-01-01: 2.0
+MN:
+  2021-01-01: 2.83
+MO:
+  2021-01-01: 3.05
+MS:
+  2021-01-01: -.inf
+MT:
+  2021-01-01: -.inf
+NC:
+  2021-01-01: -.inf
+ND:
+  2021-01-01: -.inf
+NE:
+  2021-01-01: 2.02
+NH:
+  2021-01-01: -.inf
+NJ:
+  2021-01-01: -.inf
+NM:
+  2021-01-01: -.inf
+NV:
+  2021-01-01: -.inf
+NY:
+  2021-01-01: 2.23
+OH:
+  2021-01-01: -.inf
+OK:
+  2021-01-01: 2.1
+OR:
+  2021-01-01: 1.9
+PA:
+  2021-01-01: -.inf
+RI:
+  2021-01-01: 2.58
+SC:
+  2021-01-01: -.inf
+SD:
+  2021-01-01: 1.38
+TN:
+  2021-01-01: 2.55
+TX:
+  2021-01-01: 2.07
+UT:
+  2021-01-01: -.inf
+VA:
+  2021-01-01: 2.05
+VT:
+  2021-01-01: -.inf
+WA:
+  2021-01-01: 2.15
+WI:
+  2021-01-01: 3.06
+WV:
+  2021-01-01: -.inf
+WY:
+  2021-01-01: -.inf
diff --git a/policyengine_us/parameters/gov/hhs/chip/pregnant/income_limit.yaml b/policyengine_us/parameters/gov/hhs/chip/pregnant/income_limit.yaml
new file mode 100644
index 0000000000..83fcc3adde
--- /dev/null
+++ b/policyengine_us/parameters/gov/hhs/chip/pregnant/income_limit.yaml
@@ -0,0 +1,111 @@
+description: State governments limit standard Children's Health Insurance Program pregnancy eligibility to these incomes, as a share of the federal poverty line.  
+metadata:
+  unit: /1
+  label: CHIP pregnant income limit
+  breakdown:
+  - state_code
+  reference:
+    - title: Medicaid, Children's Health Insurance Program, & Basic Health Program Eligibility Levels as of December 2023 | CMS
+      href: https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels
+AK:
+  2021-01-01: -.inf
+AL:
+  2021-01-01: -.inf
+AR:
+  2021-01-01: -.inf
+AZ:
+  2021-01-01: -.inf
+CA:
+  2021-01-01: -.inf
+CO:
+  2021-01-01: 2.60
+CT:
+  2021-01-01: -.inf
+DC:
+  2021-01-01: -.inf
+DE:
+  2021-01-01: -.inf
+FL:
+  2021-01-01: -.inf
+GA:
+  2021-01-01: -.inf
+HI:
+  2021-01-01: -.inf
+IA:
+  2021-01-01: -.inf
+ID:
+  2021-01-01: -.inf
+IL:
+  2021-01-01: -.inf
+IN:
+  2021-01-01: -.inf
+KS:
+  2021-01-01: -.inf
+KY:
+  2021-01-01: 2.13
+LA:
+  2021-01-01: -.inf
+MA:
+  2021-01-01: -.inf
+MD:
+  2021-01-01: -.inf
+ME:
+  2021-01-01: -.inf
+MI:
+  2021-01-01: -.inf
+MN:
+  2021-01-01: -.inf
+MO:
+  2021-01-01: 3.00
+MS:
+  2021-01-01: -.inf
+MT:
+  2021-01-01: -.inf
+NC:
+  2021-01-01: -.inf
+ND:
+  2021-01-01: -.inf
+NE:
+  2021-01-01: -.inf
+NH:
+  2021-01-01: -.inf
+NJ:
+  2021-01-01: 2.00
+NM:
+  2021-01-01: -.inf
+NV:
+  2021-01-01: -.inf
+NY:
+  2021-01-01: -.inf
+OH:
+  2021-01-01: -.inf
+OK:
+  2021-01-01: -.inf
+OR:
+  2021-01-01: -.inf
+PA:
+  2021-01-01: -.inf
+RI:
+  2021-01-01: 2.53
+SC:
+  2021-01-01: -.inf
+SD:
+  2021-01-01: -.inf
+TN:
+  2021-01-01: -.inf
+TX:
+  2021-01-01: -.inf
+UT:
+  2021-01-01: -.inf
+VA:
+  2021-01-01: 2.00
+VT:
+  2021-01-01: -.inf
+WA:
+  2021-01-01: -.inf
+WI:
+  2021-01-01: -.inf
+WV:
+  2021-01-01: 3.00
+WY:
+  2021-01-01: -.inf
diff --git a/policyengine_us/variables/gov/aca/eligibility/is_aca_ptc_eligible.py b/policyengine_us/variables/gov/aca/eligibility/is_aca_ptc_eligible.py
index 7079b0104f..4081434dd6 100644
--- a/policyengine_us/variables/gov/aca/eligibility/is_aca_ptc_eligible.py
+++ b/policyengine_us/variables/gov/aca/eligibility/is_aca_ptc_eligible.py
@@ -21,12 +21,13 @@ class is_aca_ptc_eligible(Variable):
         is_status_eligible = taxpayer_has_itin & ~separate & ~immig_ineligible
 
         # determine coverage eligibility for ACA plan
-        medicaid_coverage = person("is_medicaid_eligible", period)
-        eshi_coverage = person("is_aca_eshi_eligible", period)
-        medicare_coverage = person("is_medicare_eligible", period)
-        is_coverage_eligible = (
-            ~medicaid_coverage & ~eshi_coverage & ~medicare_coverage
-        )
+        INELIGIBLE_COVERAGE = [
+            "is_medicaid_eligible",
+            "is_chip_eligible",
+            "is_aca_eshi_eligible",
+            "is_medicare_eligible",
+        ]
+        is_coverage_eligible = add(person, period, INELIGIBLE_COVERAGE) == 0
 
         # determine income eligibility for ACA PTC
         p = parameters(period).gov.aca
diff --git a/policyengine_us/variables/gov/hhs/chip/chip.py b/policyengine_us/variables/gov/hhs/chip/chip.py
new file mode 100644
index 0000000000..e2ff095667
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/chip.py
@@ -0,0 +1,15 @@
+from policyengine_us.model_api import *
+
+
+class chip(Variable):
+    value_type = float
+    entity = Person
+    label = "CHIP"
+    unit = USD
+    definition_period = YEAR
+
+    def formula(person, period, parameters):
+        eligible = person("is_chip_eligible", period)
+        # Use Medicaid value for now.
+        benefit = person("medicaid_benefit_value", period)
+        return eligible * benefit
diff --git a/policyengine_us/variables/gov/hhs/chip/chip_category.py b/policyengine_us/variables/gov/hhs/chip/chip_category.py
new file mode 100644
index 0000000000..175c14e086
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/chip_category.py
@@ -0,0 +1,48 @@
+from policyengine_us.model_api import *
+
+
+class CHIPCategory(Enum):
+    CHILD = "Child"
+    PREGNANT_STANDARD = "Pregnant - Standard"
+    PREGNANT_FCEP = "Pregnant - FCEP"
+    NONE = "None"
+
+
+class chip_category(Variable):
+    value_type = Enum
+    possible_values = CHIPCategory
+    default_value = CHIPCategory.NONE
+    entity = Person
+    label = "CHIP category"
+    documentation = "Category under which a person is eligible for the Children's Health Insurance Program"
+    definition_period = YEAR
+    reference = (
+        "https://www.ssa.gov/OP_Home/ssact/title21/2110.htm",
+        "https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels",
+        "https://www.kff.org/affordable-care-act/state-indicator/medicaid-and-chip-income-eligibility-limits-for-pregnant-women-as-a-percent-of-the-federal-poverty-level",
+    )
+
+    def formula(person, period, parameters):
+        is_child_eligible = person("is_chip_eligible_child", period)
+        is_chip_eligible_standard_pregnant_person = person(
+            "is_chip_eligible_standard_pregnant_person", period
+        )
+        is_chip_fcep_eligible_person = person(
+            "is_chip_fcep_eligible_person", period
+        )
+
+        # Use select to return the appropriate category
+        # If eligible under multiple categories, prioritize child, then standard pregnant, then FCEP
+        return select(
+            [
+                is_child_eligible,
+                is_chip_eligible_standard_pregnant_person,
+                is_chip_fcep_eligible_person,
+            ],
+            [
+                CHIPCategory.CHILD,
+                CHIPCategory.PREGNANT_STANDARD,
+                CHIPCategory.PREGNANT_FCEP,
+            ],
+            default=CHIPCategory.NONE,
+        )
diff --git a/policyengine_us/variables/gov/hhs/chip/is_chip_eligible.py b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible.py
new file mode 100644
index 0000000000..588303f1e5
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible.py
@@ -0,0 +1,12 @@
+from policyengine_us.model_api import *
+
+
+class is_chip_eligible(Variable):
+    value_type = bool
+    entity = Person
+    label = "CHIP eligible"
+    definition_period = YEAR
+
+    def formula(person, period, parameters):
+        chip_category = person("chip_category", period)
+        return chip_category != chip_category.possible_values.NONE
diff --git a/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_child.py b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_child.py
new file mode 100644
index 0000000000..b4a8d37b6d
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_child.py
@@ -0,0 +1,50 @@
+from policyengine_us.model_api import *
+
+
+class is_chip_eligible_child(Variable):
+    value_type = bool
+    entity = Person
+    label = "Child eligible for CHIP"
+    documentation = "Determines if a child is eligible for the Children's Health Insurance Program"
+    definition_period = YEAR
+    reference = (
+        "https://www.ssa.gov/OP_Home/ssact/title21/2110.htm",
+        "https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels",
+    )
+
+    def formula(person, period, parameters):
+        # Get state code
+        state_code = person.household("state_code", period)
+
+        # Check age eligibility
+        age = person("age", period)
+        p = parameters(period).gov.hhs.chip.child
+
+        is_age_eligible = age < p.max_age
+
+        # Check if state offers CHIP program for children
+        income_limit = p.income_limit[state_code]
+        state_has_chip = income_limit > 0
+
+        # Check immigration status eligibility
+        istatus = person("immigration_status", period)
+        undocumented = istatus == istatus.possible_values.UNDOCUMENTED
+        immigration_eligible = ~undocumented
+
+        # Check income eligibility
+        # CHIP is for children who make too much for Medicaid but below CHIP limits
+        # First, check if not eligible for Medicaid
+        medicaid_eligible = person("is_medicaid_eligible", period)
+
+        # Check if family income is below CHIP threshold
+        # Use medicaid_income_level as the income measure
+        income_ratio = person("medicaid_income_level", period)
+        income_eligible = income_ratio <= income_limit
+
+        return (
+            is_age_eligible
+            & state_has_chip
+            & immigration_eligible
+            & ~medicaid_eligible
+            & income_eligible
+        )
diff --git a/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_pregnant.py b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_pregnant.py
new file mode 100644
index 0000000000..a803cd8694
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_pregnant.py
@@ -0,0 +1,29 @@
+from policyengine_us.model_api import *
+
+
+class is_chip_eligible_pregnant(Variable):
+    value_type = bool
+    entity = Person
+    label = "Pregnant person eligible for CHIP"
+    documentation = "Determines if a pregnant person is eligible for the Children's Health Insurance Program through either the standard pregnant pathway or FCEP"
+    definition_period = YEAR
+    reference = (
+        "https://www.ssa.gov/OP_Home/ssact/title21/2110.htm",
+        "https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels",
+        "https://www.kff.org/affordable-care-act/state-indicator/medicaid-and-chip-income-eligibility-limits-for-pregnant-women-as-a-percent-of-the-federal-poverty-level",
+    )
+
+    def formula(person, period, parameters):
+        # A person is eligible for CHIP as pregnant if they qualify through either
+        # the standard pregnant pathway or the FCEP pathway
+
+        # Check standard pregnant pathway eligibility
+        standard_eligible = person(
+            "is_chip_eligible_standard_pregnant_person", period
+        )
+
+        # Check FCEP pathway eligibility
+        fcep_eligible = person("is_chip_fcep_eligible_person", period)
+
+        # Eligible if either pathway qualifies
+        return standard_eligible | fcep_eligible
diff --git a/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_standard_pregnant_person.py b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_standard_pregnant_person.py
new file mode 100644
index 0000000000..7a49c63d87
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/is_chip_eligible_standard_pregnant_person.py
@@ -0,0 +1,49 @@
+from policyengine_us.model_api import *
+
+
+class is_chip_eligible_standard_pregnant_person(Variable):
+    value_type = bool
+    entity = Person
+    label = "Pregnant person eligible for standard CHIP"
+    documentation = "Determines if a pregnant person is eligible for the standard Children's Health Insurance Program"
+    definition_period = YEAR
+    reference = (
+        "https://www.ssa.gov/OP_Home/ssact/title21/2110.htm",
+        "https://www.medicaid.gov/medicaid/national-medicaid-chip-program-information/medicaid-childrens-health-insurance-program-basic-health-program-eligibility-levels",
+    )
+
+    def formula(person, period, parameters):
+        # Get state code
+        state_code = person.household("state_code", period)
+
+        # Check pregnancy status
+        is_pregnant = person("is_pregnant", period)
+
+        # Check if state offers CHIP program for pregnant women
+        p = parameters(period).gov.hhs.chip.pregnant
+        income_limit = p.income_limit[state_code]
+
+        state_has_pregnant_chip = income_limit > 0
+
+        # Check immigration status eligibility
+        istatus = person("immigration_status", period)
+        undocumented = istatus == istatus.possible_values.UNDOCUMENTED
+        immigration_eligible = ~undocumented
+
+        # Check income eligibility
+        # CHIP is for pregnant women who make too much for Medicaid but below CHIP limits
+        # First, check if not eligible for Medicaid
+        medicaid_eligible = person("is_medicaid_eligible", period)
+
+        # Check if family income is below CHIP threshold
+        # Use medicaid_income_level as the income measure
+        income_ratio = person("medicaid_income_level", period)
+        income_eligible = income_ratio <= income_limit
+
+        return (
+            is_pregnant
+            & state_has_pregnant_chip
+            & immigration_eligible
+            & ~medicaid_eligible
+            & income_eligible
+        )
diff --git a/policyengine_us/variables/gov/hhs/chip/is_chip_fcep_eligible_person.py b/policyengine_us/variables/gov/hhs/chip/is_chip_fcep_eligible_person.py
new file mode 100644
index 0000000000..07bb00ec31
--- /dev/null
+++ b/policyengine_us/variables/gov/hhs/chip/is_chip_fcep_eligible_person.py
@@ -0,0 +1,48 @@
+from policyengine_us.model_api import *
+
+
+class is_chip_fcep_eligible_person(Variable):
+    value_type = bool
+    entity = Person
+    label = "Pregnant person eligible for CHIP through FCEP"
+    documentation = "Determines if a pregnant person is eligible for the Children's Health Insurance Program through the Family Coverage Extension Program"
+    definition_period = YEAR
+    reference = (
+        "https://www.kff.org/affordable-care-act/state-indicator/medicaid-and-chip-income-eligibility-limits-for-pregnant-women-as-a-percent-of-the-federal-poverty-level",
+    )
+
+    def formula(person, period, parameters):
+        # Get state code
+        state_code = person.household("state_code", period)
+
+        # Check pregnancy status
+        is_pregnant = person("is_pregnant", period)
+
+        # Check if state offers FCEP program for pregnant women
+        p = parameters(period).gov.hhs.chip.fcep
+        income_limit = p.income_limit[state_code]
+
+        state_has_fcep = income_limit > 0
+
+        # Check immigration status eligibility
+        istatus = person("immigration_status", period)
+        undocumented = istatus == istatus.possible_values.UNDOCUMENTED
+        immigration_eligible = ~undocumented
+
+        # Check income eligibility
+        # CHIP is for pregnant women who make too much for Medicaid but below CHIP limits
+        # First, check if not eligible for Medicaid
+        medicaid_eligible = person("is_medicaid_eligible", period)
+
+        # Check if family income is below CHIP threshold
+        # Use medicaid_income_level as the income measure
+        income_ratio = person("medicaid_income_level", period)
+        income_eligible = income_ratio <= income_limit
+
+        return (
+            is_pregnant
+            & state_has_fcep
+            & immigration_eligible
+            & ~medicaid_eligible
+            & income_eligible
+        )


Test patch:
diff --git a/policyengine_us/tests/policy/baseline/gov/aca/eligibility/is_aca_ptc_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/aca/eligibility/is_aca_ptc_eligible.yaml
index dd2863293b..c2a51180f3 100644
--- a/policyengine_us/tests/policy/baseline/gov/aca/eligibility/is_aca_ptc_eligible.yaml
+++ b/policyengine_us/tests/policy/baseline/gov/aca/eligibility/is_aca_ptc_eligible.yaml
@@ -4,6 +4,7 @@
     is_medicaid_eligible: false
     is_aca_eshi_eligible: false
     is_medicare_eligible: false
+    is_chip_eligible: false
     aca_magi_fraction: 2.50
   output:
     is_aca_ptc_eligible: true
@@ -14,6 +15,7 @@
     is_medicaid_eligible: false
     is_aca_eshi_eligible: false
     is_medicare_eligible: true
+    is_chip_eligible: false
     aca_magi_fraction: 2.50
   output:
     is_aca_ptc_eligible: false
@@ -24,6 +26,7 @@
     is_medicaid_eligible: true
     is_aca_eshi_eligible: false
     is_medicare_eligible: false
+    is_chip_eligible: false
     aca_magi_fraction: 2.50
   output:
     is_aca_ptc_eligible: false
@@ -44,11 +47,23 @@
     is_medicaid_eligible: false
     is_aca_eshi_eligible: false
     is_medicare_eligible: false
+    is_chip_eligible: false
     aca_magi_fraction: 6.50
   output:
      is_aca_ptc_eligible: true
 
-- name: is_aca_ptc_eligible unit test 6 --- max three children pay ACA premium
+- name: is_aca_ptc_eligible unit test 6 --- income B
+  period: 2022
+  input:
+    is_medicaid_eligible: false
+    is_aca_eshi_eligible: false
+    is_medicare_eligible: false
+    is_chip_eligible: true
+    aca_magi_fraction: 6.50
+  output:
+     is_aca_ptc_eligible: false
+
+- name: is_aca_ptc_eligible unit test 7 --- max three children pay ACA premium
   period: 2022
   input:
     people:
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/chip/chip.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/chip/chip.yaml
new file mode 100644
index 0000000000..25db1bc0ff
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/chip/chip.yaml
@@ -0,0 +1,15 @@
+- name: Eligible with $10,000 value.
+  period: 2022
+  input:
+    is_chip_eligible: true
+    medicaid_benefit_value: 10_000
+  output:
+    chip: 10_000
+
+- name: Ineligible with $10,000 value.
+  period: 2022
+  input:
+    is_chip_eligible: false
+    medicaid_benefit_value: 10_000
+  output:
+    chip: 0
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/chip/chip_category.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/chip/chip_category.yaml
new file mode 100644
index 0000000000..a089ac73ff
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/chip/chip_category.yaml
@@ -0,0 +1,87 @@
+- name: Child CHIP category
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: True
+        is_chip_eligible_standard_pregnant_person: False
+        is_chip_fcep_eligible_person: False
+  output:
+    chip_category: CHILD
+
+- name: Standard pregnant CHIP category
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: False
+        is_chip_eligible_standard_pregnant_person: True
+        is_chip_fcep_eligible_person: False
+  output:
+    chip_category: PREGNANT_STANDARD
+
+- name: FCEP pregnant CHIP category
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: False
+        is_chip_eligible_standard_pregnant_person: False
+        is_chip_fcep_eligible_person: True
+  output:
+    chip_category: PREGNANT_FCEP
+
+- name: Child and Standard pregnant prioritizes child
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: True
+        is_chip_eligible_standard_pregnant_person: True
+        is_chip_fcep_eligible_person: False
+  output:
+    chip_category: CHILD
+
+- name: Child and FCEP pregnant prioritizes child
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: True
+        is_chip_eligible_standard_pregnant_person: False
+        is_chip_fcep_eligible_person: True
+  output:
+    chip_category: CHILD
+
+- name: Standard pregnant and FCEP pregnant prioritizes standard
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: False
+        is_chip_eligible_standard_pregnant_person: True
+        is_chip_fcep_eligible_person: True
+  output:
+    chip_category: PREGNANT_STANDARD
+
+- name: All categories prioritizes child
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: True
+        is_chip_eligible_standard_pregnant_person: True
+        is_chip_fcep_eligible_person: True
+  output:
+    chip_category: CHILD
+
+- name: No eligibility
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_child: False
+        is_chip_eligible_standard_pregnant_person: False
+        is_chip_fcep_eligible_person: False
+  output:
+    chip_category: NONE
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible.yaml
new file mode 100644
index 0000000000..93a6fbd850
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible.yaml
@@ -0,0 +1,13 @@
+- name: Eligible
+  period: 2022
+  input:
+    chip_category: CHILD
+  output:
+    is_chip_eligible: true
+
+- name: Ineligible
+  period: 2022
+  input:
+    chip_category: NONE
+  output:
+    is_chip_eligible: false
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_fcep.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_fcep.yaml
new file mode 100644
index 0000000000..66df5b520a
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_fcep.yaml
@@ -0,0 +1,113 @@
+- name: Pregnant woman eligible for CHIP through FCEP
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 3.00   # Within CA's limit of 3.22
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CA       # California offers FCEP
+        members: [head]
+  output:
+    is_chip_fcep_eligible_person: True
+
+- name: Not pregnant
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: False   # Not pregnant
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 3.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CA
+        members: [head]
+  output:
+    is_chip_fcep_eligible_person: False
+
+- name: Income too high for FCEP
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True # Pregnant
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 3.50   # Above CA limit of 3.22
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CA
+        members: [head]
+  output:
+    is_chip_fcep_eligible_person: False
+
+- name: Already Medicaid eligible
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True    # Pregnant
+        immigration_status: CITIZEN
+        is_medicaid_eligible: True  # Already eligible for Medicaid
+        medicaid_income_level: 3.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CA
+        members: [head]
+  output:
+    is_chip_fcep_eligible_person: False
+
+- name: State without FCEP
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True    # Pregnant
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 3.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: AK       # AK does not offer FCEP
+        members: [head]
+  output:
+    is_chip_fcep_eligible_person: False
+
+- name: Undocumented immigrant not eligible
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True    # Pregnant
+        immigration_status: UNDOCUMENTED
+        is_medicaid_eligible: False
+        medicaid_income_level: 3.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CA
+        members: [head]
+  output:
+    is_chip_fcep_eligible_person: False
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_pregnant.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_pregnant.yaml
new file mode 100644
index 0000000000..be72a71c63
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_pregnant.yaml
@@ -0,0 +1,39 @@
+- name: Pregnant woman eligible for CHIP through standard pathway
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_standard_pregnant_person: True
+        is_chip_fcep_eligible_person: False
+  output:
+    is_chip_eligible_pregnant: True
+
+- name: Pregnant woman eligible for CHIP through FCEP pathway
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_standard_pregnant_person: False
+        is_chip_fcep_eligible_person: True
+  output:
+    is_chip_eligible_pregnant: True
+
+- name: Pregnant woman eligible for CHIP through both pathways
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_standard_pregnant_person: True
+        is_chip_fcep_eligible_person: True
+  output:
+    is_chip_eligible_pregnant: True
+
+- name: Not eligible for CHIP through either pathway
+  period: 2023
+  input:
+    people:
+      head:
+        is_chip_eligible_standard_pregnant_person: False
+        is_chip_fcep_eligible_person: False
+  output:
+    is_chip_eligible_pregnant: False
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_standard_pregnant_person.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_standard_pregnant_person.yaml
new file mode 100644
index 0000000000..eda2150dea
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/chip/is_chip_eligible_standard_pregnant_person.yaml
@@ -0,0 +1,113 @@
+- name: Pregnant woman eligible for standard CHIP
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 2.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CO
+        members: [head]
+  output:
+    is_chip_eligible_standard_pregnant_person: True
+
+- name: Not pregnant
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: False
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 2.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CO
+        members: [head]
+  output:
+    is_chip_eligible_standard_pregnant_person: False
+
+- name: Income too high for standard pregnant woman CHIP
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 3.00  # Above CO limit of 2.65
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CO
+        members: [head]
+  output:
+    is_chip_eligible_standard_pregnant_person: False
+
+- name: Already Medicaid eligible
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True
+        immigration_status: CITIZEN
+        is_medicaid_eligible: True
+        medicaid_income_level: 2.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CO
+        members: [head]
+  output:
+    is_chip_eligible_standard_pregnant_person: False
+
+- name: State without CHIP for pregnant women
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True
+        immigration_status: CITIZEN
+        is_medicaid_eligible: False
+        medicaid_income_level: 2.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: AK  # No standard CHIP program for pregnant women in this state
+        members: [head]
+  output:
+    is_chip_eligible_standard_pregnant_person: False
+
+- name: Undocumented immigrant not eligible
+  period: 2023
+  input:
+    people:
+      head:
+        is_pregnant: True
+        immigration_status: UNDOCUMENTED
+        is_medicaid_eligible: False
+        medicaid_income_level: 2.00
+    tax_units:
+      tax_unit:
+        members: [head]
+    households:
+      household:
+        state_code: CO
+        members: [head]
+  output:
+    is_chip_eligible_standard_pregnant_person: False
diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/medicaid.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/medicaid.yaml
new file mode 100644
index 0000000000..b5de3399cd
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/medicaid.yaml
@@ -0,0 +1,15 @@
+- name: Eligible with $10,000 value.
+  period: 2022
+  input:
+    is_medicaid_eligible: true
+    medicaid_benefit_value: 10_000
+  output:
+    medicaid: 10_000
+
+- name: Ineligible with $10,000 value.
+  period: 2022
+  input:
+    is_medicaid_eligible: false
+    medicaid_benefit_value: 10_000
+  output:
+    medicaid: 0