From de7d16b55d3192a94e2f40149761500698c8e905 Mon Sep 17 00:00:00 2001 From: daphnehanse11 <128793799+daphnehanse11@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:07:32 -0500 Subject: [PATCH 01/12] Add Oregon Medicaid for immigrants as separate program Fixes #6366 --- changelog_entry.yaml | 4 + .../eligibility/adult_income_limit.yaml | 13 ++ .../eligibility/child_income_limit.yaml | 13 ++ .../eligibility/child_max_age.yaml | 11 ++ .../eligibility/in_effect.yaml | 14 ++ .../or_healthier_oregon_eligible.yaml | 81 +++++++++++ ...er_oregon_immigration_status_eligible.yaml | 64 +++++++++ .../or/oha/healthier_oregon/integration.yaml | 66 +++++++++ .../gov/territories/pr/tax/income/pr_agi.yaml | 2 +- .../pr/tax/income/pr_agi_person.yaml | 2 +- .../or_healthier_oregon_eligible.py | 39 ++++++ ...hier_oregon_immigration_status_eligible.py | 39 ++++++ .../or_healthier_oregon_income_eligible.py | 39 ++++++ .../or_healthier_oregon_cost.py | 127 ++++++++++++++++++ .../household/healthcare_benefit_value.py | 1 + 15 files changed, 513 insertions(+), 2 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml create mode 100644 policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml create mode 100644 policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.py create mode 100644 policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py create mode 100644 policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py diff --git a/changelog_entry.yaml b/changelog_entry.yaml index e69de29bb2d..bbd717d9a26 100644 --- a/changelog_entry.yaml +++ b/changelog_entry.yaml @@ -0,0 +1,4 @@ +- bump: minor + changes: + added: + - Oregon Healthier Oregon program providing Medicaid-equivalent coverage for undocumented immigrants. diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml new file mode 100644 index 00000000000..6566f54e34d --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -0,0 +1,13 @@ +description: Oregon Healthier Oregon income limit for adults as percentage of FPL +metadata: + unit: /1 + period: year + label: OR Healthier Oregon adult income limit (% FPL) + reference: + - title: Oregon Health Authority - Healthier Oregon + href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx + - title: OPB - Oregon expands health coverage + href: https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/ + +values: + 2023-07-01: 1.38 # 138% FPL for adults diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml new file mode 100644 index 00000000000..ab125429e2d --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -0,0 +1,13 @@ +description: Oregon Healthier Oregon income limit for children as percentage of FPL +metadata: + unit: /1 + period: year + label: OR Healthier Oregon child income limit (% FPL) + reference: + - title: Oregon Health Authority - Healthier Oregon + href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx + - title: OPB - Oregon expands health coverage + href: https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/ + +values: + 2023-07-01: 3.05 # 305% FPL for children diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml new file mode 100644 index 00000000000..4e107dd0d1c --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml @@ -0,0 +1,11 @@ +description: Maximum age to be considered a child for Oregon Healthier Oregon +metadata: + unit: year + period: year + label: OR Healthier Oregon child max age + reference: + - title: Oregon Health Authority - OHP Eligibility + href: https://www.oregon.gov/oha/hsd/ohp/pages/eligibility.aspx + +values: + 2023-07-01: 18 # Children 0-18 diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml new file mode 100644 index 00000000000..5c15a59ea46 --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml @@ -0,0 +1,14 @@ +description: Whether Oregon Healthier Oregon program is in effect (full expansion to all ages) +metadata: + unit: bool + period: year + label: OR Healthier Oregon in effect + reference: + - title: Oregon Health Authority - Healthier Oregon + href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx + - title: Oregon House Bill 3352 + href: https://olis.oregonlegislature.gov/liz/2021R1/Downloads/MeasureDocument/HB3352/Enrolled + +values: + 2020-01-01: false + 2023-07-01: true # Full expansion to all ages effective July 1, 2023 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml new file mode 100644 index 00000000000..d6831ee619a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml @@ -0,0 +1,81 @@ +# Tests for overall Oregon Healthier Oregon eligibility + +- name: Undocumented adult with low income eligible + period: 2024 + input: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.0 # 100% FPL + state_code: OR + output: + or_healthier_oregon_eligible: true + +- name: Undocumented adult with income too high NOT eligible + period: 2024 + input: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.5 # 150% FPL (above 138% limit for adults) + state_code: OR + output: + or_healthier_oregon_eligible: false + +- name: Undocumented child with higher income eligible (305% limit) + period: 2024 + input: + age: 10 + immigration_status: UNDOCUMENTED + medicaid_income_level: 2.5 # 250% FPL (within 305% limit for children) + state_code: OR + output: + or_healthier_oregon_eligible: true + +- name: Undocumented child with income too high NOT eligible + period: 2024 + input: + age: 10 + immigration_status: UNDOCUMENTED + medicaid_income_level: 3.5 # 350% FPL (above 305% limit) + state_code: OR + output: + or_healthier_oregon_eligible: false + +- name: US citizen NOT eligible regardless of income + period: 2024 + input: + age: 30 + immigration_status: CITIZEN + medicaid_income_level: 1.0 # 100% FPL + state_code: OR + output: + or_healthier_oregon_eligible: false + +- name: Program not in effect before July 2023 + period: 2022 + input: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.0 # 100% FPL + state_code: OR + output: + or_healthier_oregon_eligible: false + +- name: DACA recipient with low income eligible + period: 2024 + input: + age: 25 + immigration_status: DACA + medicaid_income_level: 1.0 # 100% FPL + state_code: OR + output: + or_healthier_oregon_eligible: true + +- name: Adult at exactly 138% FPL eligible + period: 2024 + input: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.38 # 138% FPL (exactly at limit) + state_code: OR + output: + or_healthier_oregon_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml new file mode 100644 index 00000000000..4a6f46c1c73 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml @@ -0,0 +1,64 @@ +# Tests for Oregon Healthier Oregon immigration status eligibility + +# Undocumented immigrants are eligible +- name: Undocumented adult eligible + period: 2024 + input: + immigration_status: UNDOCUMENTED + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: true + +# DACA recipients are eligible +- name: DACA recipient eligible + period: 2024 + input: + immigration_status: DACA + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: true + +# TPS holders are eligible +- name: TPS holder eligible + period: 2024 + input: + immigration_status: TPS + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: true + +# Citizens should use regular federal Medicaid +- name: US citizen NOT eligible (uses federal Medicaid) + period: 2024 + input: + immigration_status: CITIZEN + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: false + +# LPRs should use regular federal Medicaid +- name: LPR NOT eligible (uses federal Medicaid) + period: 2024 + input: + immigration_status: LEGAL_PERMANENT_RESIDENT + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: false + +# Refugees should use regular federal Medicaid +- name: Refugee NOT eligible (uses federal Medicaid) + period: 2024 + input: + immigration_status: REFUGEE + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: false + +# Non-OR residents not eligible +- name: Undocumented person in CA not eligible for OR program + period: 2024 + input: + immigration_status: UNDOCUMENTED + state_code: CA + output: + or_healthier_oregon_immigration_status_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml new file mode 100644 index 00000000000..b2f45a05e96 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml @@ -0,0 +1,66 @@ +# Integration tests for Oregon Healthier Oregon with cost calculation + +- name: Undocumented adult gets healthcare benefit value + period: 2024 + absolute_error_margin: 1 + input: + people: + person: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.0 # 100% FPL + households: + household: + members: [person] + state_code: OR + output: + or_healthier_oregon_eligible: [true] + # Cost should be non-zero (Oregon expansion adult rate) + or_healthier_oregon_cost: [7_475] # Oregon expansion adult per capita cost + +- name: Undocumented child gets higher income limit + period: 2024 + input: + people: + child: + age: 10 + immigration_status: UNDOCUMENTED + medicaid_income_level: 2.5 # 250% FPL - within child limit + households: + household: + members: [child] + state_code: OR + output: + or_healthier_oregon_eligible: [true] + +- name: US citizen not eligible - uses federal Medicaid instead + period: 2024 + input: + people: + person: + age: 30 + immigration_status: CITIZEN + medicaid_income_level: 1.0 + households: + household: + members: [person] + state_code: OR + output: + or_healthier_oregon_eligible: [false] + or_healthier_oregon_cost: [0] + +- name: Program not available before July 2023 + period: 2022 + input: + people: + person: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.0 + households: + household: + members: [person] + state_code: OR + output: + or_healthier_oregon_eligible: [false] + or_healthier_oregon_cost: [0] diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi.yaml index c45833f7576..a768c0fce95 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi.yaml @@ -14,4 +14,4 @@ alimony_expense: 10_000 state_code: PR output: - pr_agi: 0 \ No newline at end of file + pr_agi: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi_person.yaml b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi_person.yaml index 6da27d793be..cc7aaab0c93 100644 --- a/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi_person.yaml +++ b/policyengine_us/tests/policy/baseline/gov/territories/pr/tax/income/pr_agi_person.yaml @@ -14,4 +14,4 @@ filing_status: SEPARATE state_code: PR output: - pr_agi_person: 20_000 \ No newline at end of file + pr_agi_person: 20_000 diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.py new file mode 100644 index 00000000000..5bd6e441bd0 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class or_healthier_oregon_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible for Oregon Healthier Oregon" + definition_period = YEAR + defined_for = StateCode.OR + reference = [ + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx", + "https://olis.oregonlegislature.gov/liz/2021R1/Downloads/MeasureDocument/HB3352/Enrolled", + ] + documentation = """ + Oregon's Healthier Oregon program (formerly Cover All People) provides + full Oregon Health Plan benefits to income-eligible residents who are + not eligible for federal Medicaid due to their immigration status. + Effective July 1, 2023 for all ages. + """ + + def formula(person, period, parameters): + p = ( + parameters(period) + .gov.states["or"] + .oha.healthier_oregon.eligibility + ) + + # Program must be in effect + in_effect = p.in_effect + + # Must have non-federally-eligible immigration status + immigration_eligible = person( + "or_healthier_oregon_immigration_status_eligible", period + ) + + # Must meet income requirements + income_eligible = person("or_healthier_oregon_income_eligible", period) + + return in_effect & immigration_eligible & income_eligible diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py new file mode 100644 index 00000000000..9cdec257898 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class or_healthier_oregon_immigration_status_eligible(Variable): + value_type = bool + entity = Person + label = "Has eligible immigration status for Oregon Healthier Oregon" + definition_period = YEAR + defined_for = StateCode.OR + reference = [ + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx", + "https://olis.oregonlegislature.gov/liz/2021R1/Downloads/MeasureDocument/HB3352/Enrolled", + ] + documentation = """ + Oregon's Healthier Oregon program (formerly Cover All People) provides + full OHP benefits to residents who are not eligible for federal Medicaid + due to their immigration status. This includes undocumented immigrants, + DACA recipients, and other non-qualifying immigration statuses. + """ + + def formula(person, period, parameters): + immigration_status = person("immigration_status", period) + + # Oregon covers undocumented immigrants + undocumented = ( + immigration_status + == immigration_status.possible_values.UNDOCUMENTED + ) + + # Oregon also covers DACA and TPS recipients + daca = immigration_status == immigration_status.possible_values.DACA + tps = immigration_status == immigration_status.possible_values.TPS + daca_tps = ( + immigration_status == immigration_status.possible_values.DACA_TPS + ) + + # Only return true for non-federally-eligible statuses + # Citizens, LPRs, refugees use regular federal Medicaid + return undocumented | daca | tps | daca_tps diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py new file mode 100644 index 00000000000..53a2bb08f52 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class or_healthier_oregon_income_eligible(Variable): + value_type = bool + entity = Person + label = "Meets Oregon Healthier Oregon income eligibility" + definition_period = YEAR + defined_for = StateCode.OR + reference = [ + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx", + "https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/", + ] + documentation = """ + Oregon Healthier Oregon has different income limits based on age: + - Adults (19+): Up to 138% FPL + - Children (0-18): Up to 305% FPL + """ + + def formula(person, period, parameters): + p = ( + parameters(period) + .gov.states["or"] + .oha.healthier_oregon.eligibility + ) + income_level = person("medicaid_income_level", period) + + age = person("age", period) + child_max_age = p.child_max_age + is_child = age <= child_max_age + + # Different income limits based on age + income_limit = where( + is_child, + p.child_income_limit, + p.adult_income_limit, + ) + + return income_level <= income_limit diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py new file mode 100644 index 00000000000..c7d633ea7e6 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py @@ -0,0 +1,127 @@ +from policyengine_us.model_api import * + + +class or_healthier_oregon_cost(Variable): + value_type = float + entity = Person + label = "Oregon Healthier Oregon benefit cost" + unit = USD + definition_period = YEAR + defined_for = "or_healthier_oregon_eligible" + reference = [ + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx", + ] + documentation = """ + Oregon Healthier Oregon provides full OHP (Oregon Health Plan) benefits, + equivalent to Medicaid coverage. The cost is calculated using the same + per capita Medicaid costs by eligibility group. + """ + + adds = ["or_healthier_oregon_cost_if_enrolled"] + + +class or_healthier_oregon_cost_if_enrolled(Variable): + value_type = float + entity = Person + label = "Per capita Oregon Healthier Oregon cost by eligibility group" + unit = USD + definition_period = YEAR + defined_for = "or_healthier_oregon_eligible" + reference = ( + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx" + ) + + def formula(person, period, parameters): + from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( + MedicaidGroup, + ) + + state = person.household("state_code", period) + + # Determine group based on demographics + age = person("age", period) + is_pregnant = person("is_pregnant", period) + is_disabled = person("is_ssi_recipient_for_medicaid", period) + + is_child = age < 19 + is_aged_disabled = is_disabled | (age >= 65) + is_non_expansion_adult = is_pregnant & ~is_child & ~is_aged_disabled + is_expansion_adult = ( + ~is_child & ~is_aged_disabled & ~is_non_expansion_adult + ) + + group = select( + [ + is_aged_disabled, + is_child, + is_non_expansion_adult, + is_expansion_adult, + ], + [ + MedicaidGroup.AGED_DISABLED, + MedicaidGroup.CHILD, + MedicaidGroup.NON_EXPANSION_ADULT, + MedicaidGroup.EXPANSION_ADULT, + ], + default=MedicaidGroup.EXPANSION_ADULT, + ) + + # Get per capita costs from Medicaid parameters + p = parameters(period).calibration.gov.hhs.medicaid + + aged_spend = p.spending.by_eligibility_group.aged[state] + disabled_spend = p.spending.by_eligibility_group.disabled[state] + child_spend = p.spending.by_eligibility_group.child[state] + expansion_adult_spend = ( + p.spending.by_eligibility_group.expansion_adults[state] + ) + non_expansion_adult_spend = ( + p.spending.by_eligibility_group.non_expansion_adults[state] + ) + + aged_enroll = p.enrollment.aged[state] + disabled_enroll = p.enrollment.disabled[state] + child_enroll = p.enrollment.child[state] + expansion_adult_enroll = p.enrollment.expansion_adults[state] + non_expansion_adult_enroll = p.enrollment.non_expansion_adults[state] + + aged_disabled_spend = aged_spend + disabled_spend + aged_disabled_enroll = aged_enroll + disabled_enroll + + spend = select( + [ + group == MedicaidGroup.AGED_DISABLED, + group == MedicaidGroup.CHILD, + group == MedicaidGroup.EXPANSION_ADULT, + group == MedicaidGroup.NON_EXPANSION_ADULT, + ], + [ + aged_disabled_spend, + child_spend, + expansion_adult_spend, + non_expansion_adult_spend, + ], + default=0, + ) + + enroll = select( + [ + group == MedicaidGroup.AGED_DISABLED, + group == MedicaidGroup.CHILD, + group == MedicaidGroup.EXPANSION_ADULT, + group == MedicaidGroup.NON_EXPANSION_ADULT, + ], + [ + aged_disabled_enroll, + child_enroll, + expansion_adult_enroll, + non_expansion_adult_enroll, + ], + default=0, + ) + + per_capita = p.totals.per_capita[group] + mask = enroll > 0 + per_capita[mask] = spend[mask] / enroll[mask] + + return per_capita diff --git a/policyengine_us/variables/household/healthcare_benefit_value.py b/policyengine_us/variables/household/healthcare_benefit_value.py index 1e1bc0dd1af..e88602fefcb 100644 --- a/policyengine_us/variables/household/healthcare_benefit_value.py +++ b/policyengine_us/variables/household/healthcare_benefit_value.py @@ -11,4 +11,5 @@ class healthcare_benefit_value(Variable): "medicaid_cost", "per_capita_chip", "aca_ptc", + "or_healthier_oregon_cost", ] From 2f6476e2fc8d912d1f79d4aa02e6e80176b5ad91 Mon Sep 17 00:00:00 2001 From: daphnehanse11 <128793799+daphnehanse11@users.noreply.github.com> Date: Wed, 17 Dec 2025 11:07:34 -0500 Subject: [PATCH 02/12] Add Oregon Medicaid for immigrants as separate program Fixes #6366 --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 0ffb3cb3289..3264345d275 100644 --- a/uv.lock +++ b/uv.lock @@ -1244,7 +1244,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.441.0" +version = "1.449.3" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 7b6244e4743e203cdc8e01a1c938afb1afb7dadb Mon Sep 17 00:00:00 2001 From: daphnehanse11 <128793799+daphnehanse11@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:50:48 -0500 Subject: [PATCH 03/12] Update uv.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index f260826736c..258a9c9c71f 100644 --- a/uv.lock +++ b/uv.lock @@ -1519,7 +1519,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.465.3" +version = "1.465.4" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 92b4a57533b7214b0a7c6838bc0c248b62e6d63e Mon Sep 17 00:00:00 2001 From: Daphne Hansell Date: Mon, 22 Dec 2025 15:46:04 -0500 Subject: [PATCH 04/12] Fix review issues: references, hard-coded values, and tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update child_income_limit.yaml with KFF and healthinsurance.org refs that explicitly corroborate 305% FPL value - Update child_max_age.yaml with OHP Apply page ref (states ages 0-18) - Add healthinsurance.org ref to adult_income_limit.yaml - Replace hard-coded age < 19 with child_max_age parameter in cost file - Add comment explaining federal age 65 threshold - Add income boundary tests (139%, 305%, 306% FPL) - Add age cliff effect tests (18→19 transition) - Add DACA_TPS and ASYLEE immigration status tests 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../eligibility/adult_income_limit.yaml | 2 + .../eligibility/child_income_limit.yaml | 4 + .../eligibility/child_max_age.yaml | 4 +- .../or_healthier_oregon_eligible.yaml | 74 +++++++++++++++++++ ...er_oregon_immigration_status_eligible.yaml | 18 +++++ .../or_healthier_oregon_cost.py | 9 ++- 6 files changed, 108 insertions(+), 3 deletions(-) diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index 6566f54e34d..d73e9c41f50 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -8,6 +8,8 @@ metadata: href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - title: OPB - Oregon expands health coverage href: https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/ + - title: healthinsurance.org - Oregon Medicaid (adults up to 138% FPL) + href: https://www.healthinsurance.org/medicaid/oregon/ values: 2023-07-01: 1.38 # 138% FPL for adults diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml index ab125429e2d..a3161332deb 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -8,6 +8,10 @@ metadata: href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - title: OPB - Oregon expands health coverage href: https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/ + - title: KFF - Medicaid and CHIP Income Eligibility Limits for Children + href: https://www.kff.org/medicaid/state-indicator/medicaid-and-chip-income-eligibility-limits-for-children-as-a-percent-of-the-federal-poverty-level/ + - title: healthinsurance.org - Oregon Medicaid (children up to 305% FPL) + href: https://www.healthinsurance.org/medicaid/oregon/ values: 2023-07-01: 3.05 # 305% FPL for children diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml index 4e107dd0d1c..cd71890112c 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml @@ -4,8 +4,8 @@ metadata: period: year label: OR Healthier Oregon child max age reference: - - title: Oregon Health Authority - OHP Eligibility - href: https://www.oregon.gov/oha/hsd/ohp/pages/eligibility.aspx + - title: Oregon Health Authority - OHP Application (children ages 0-18) + href: https://www.oregon.gov/oha/hsd/ohp/pages/apply.aspx values: 2023-07-01: 18 # Children 0-18 diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml index d6831ee619a..813e927e8b3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_eligible.yaml @@ -79,3 +79,77 @@ state_code: OR output: or_healthier_oregon_eligible: true + +# Income boundary tests + +- name: Boundary - Adult at 139% FPL NOT eligible (just above 138% limit) + period: 2024 + input: + age: 30 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.39 # 139% FPL (just above 138% limit) + state_code: OR + output: + or_healthier_oregon_eligible: false + +- name: Boundary - Child at exactly 305% FPL eligible + period: 2024 + input: + age: 10 + immigration_status: UNDOCUMENTED + medicaid_income_level: 3.05 # 305% FPL (exactly at limit) + state_code: OR + output: + or_healthier_oregon_eligible: true + +- name: Boundary - Child at 306% FPL NOT eligible (just above 305% limit) + period: 2024 + input: + age: 10 + immigration_status: UNDOCUMENTED + medicaid_income_level: 3.06 # 306% FPL (just above 305% limit) + state_code: OR + output: + or_healthier_oregon_eligible: false + +# Age boundary tests (cliff effect at age 18/19) + +- name: Age cliff - Age 18 at 200% FPL eligible (child limit 305%) + period: 2024 + input: + age: 18 + immigration_status: UNDOCUMENTED + medicaid_income_level: 2.0 # 200% FPL (within 305% child limit) + state_code: OR + output: + or_healthier_oregon_eligible: true + +- name: Age cliff - Age 19 at 200% FPL NOT eligible (adult limit 138%) + period: 2024 + input: + age: 19 + immigration_status: UNDOCUMENTED + medicaid_income_level: 2.0 # 200% FPL (above 138% adult limit) + state_code: OR + output: + or_healthier_oregon_eligible: false + +- name: Age cliff - Age 18 at 140% FPL eligible (still a child) + period: 2024 + input: + age: 18 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.4 # 140% FPL (within 305% child limit) + state_code: OR + output: + or_healthier_oregon_eligible: true + +- name: Age cliff - Age 19 at 140% FPL NOT eligible (adult over 138%) + period: 2024 + input: + age: 19 + immigration_status: UNDOCUMENTED + medicaid_income_level: 1.4 # 140% FPL (above 138% adult limit) + state_code: OR + output: + or_healthier_oregon_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml index 4a6f46c1c73..9d8a27850b4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.yaml @@ -27,6 +27,15 @@ output: or_healthier_oregon_immigration_status_eligible: true +# DACA_TPS combined status is eligible +- name: DACA_TPS combined status eligible + period: 2024 + input: + immigration_status: DACA_TPS + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: true + # Citizens should use regular federal Medicaid - name: US citizen NOT eligible (uses federal Medicaid) period: 2024 @@ -54,6 +63,15 @@ output: or_healthier_oregon_immigration_status_eligible: false +# Asylees should use regular federal Medicaid +- name: Asylee NOT eligible (uses federal Medicaid) + period: 2024 + input: + immigration_status: ASYLEE + state_code: OR + output: + or_healthier_oregon_immigration_status_eligible: false + # Non-OR residents not eligible - name: Undocumented person in CA not eligible for OR program period: 2024 diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py index c7d633ea7e6..84584b5b089 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py @@ -43,7 +43,14 @@ def formula(person, period, parameters): is_pregnant = person("is_pregnant", period) is_disabled = person("is_ssi_recipient_for_medicaid", period) - is_child = age < 19 + # Use the Oregon Healthier Oregon child_max_age parameter + p = ( + parameters(period) + .gov.states["or"] + .oha.healthier_oregon.eligibility + ) + is_child = age <= p.child_max_age + # 65 is the standard federal Medicaid aged threshold (42 USC 1382c) is_aged_disabled = is_disabled | (age >= 65) is_non_expansion_adult = is_pregnant & ~is_child & ~is_aged_disabled is_expansion_adult = ( From bb80dce1a1f1f8606a14b4d5cc590e15136ff69a Mon Sep 17 00:00:00 2001 From: Daphne Hansell Date: Mon, 22 Dec 2025 16:18:30 -0500 Subject: [PATCH 05/12] Merge main and upgrade uv.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- uv.lock | 131 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 65 insertions(+), 66 deletions(-) diff --git a/uv.lock b/uv.lock index d5306862320..dfed9cccf48 100644 --- a/uv.lock +++ b/uv.lock @@ -586,7 +586,7 @@ version = "3.15.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4d/6a/0d79de0b025aa85dc8864de8e97659c94cf3d23148394a954dc5ca52f8c8/h5py-3.15.1.tar.gz", hash = "sha256:c86e3ed45c4473564de55aa83b6fc9e5ead86578773dfbd93047380042e26b69", size = 426236, upload-time = "2025-10-16T10:35:27.404Z" } wheels = [ @@ -714,14 +714,14 @@ wheels = [ [[package]] name = "importlib-metadata" -version = "8.7.0" +version = "8.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] [[package]] @@ -1079,7 +1079,7 @@ version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pandas" }, ] sdist = { url = "https://files.pythonhosted.org/packages/31/e9/7f77ee19b2d3dcdb561ceaeb915ef6a944eb315412d0e8065c12817b7ff4/microdf_python-1.1.1.tar.gz", hash = "sha256:97dd0cb8562d98a32bbd35861719ae565544143e2ad8a462d6f6261058d9c469", size = 17290, upload-time = "2025-12-01T14:13:57.131Z" } @@ -1190,11 +1190,11 @@ wheels = [ [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] [[package]] @@ -1203,7 +1203,7 @@ version = "2.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/2f/fdba158c9dbe5caca9c3eca3eaffffb251f2fb8674bf8e2d0aed5f38d319/numexpr-2.14.1.tar.gz", hash = "sha256:4be00b1086c7b7a5c32e31558122b7b80243fe098579b170967da83f3152b48b", size = 119400, upload-time = "2025-10-13T16:17:27.351Z" } wheels = [ @@ -1316,65 +1316,64 @@ wheels = [ [[package]] name = "numpy" -version = "2.3.5" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.12'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a4/7a/6a3d14e205d292b738db449d0de649b373a59edb0d0b4493821d0a3e8718/numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934", size = 20685720, upload-time = "2025-12-20T16:18:19.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/7bae7cbcc2f8132271967aa03e03954fc1e48aa1f3bf32b29ca95fbef352/numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e", size = 16940166, upload-time = "2025-12-20T16:15:43.434Z" }, + { url = "https://files.pythonhosted.org/packages/0f/27/6c13f5b46776d6246ec884ac5817452672156a506d08a1f2abb39961930a/numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db", size = 12641781, upload-time = "2025-12-20T16:15:45.701Z" }, + { url = "https://files.pythonhosted.org/packages/14/1c/83b4998d4860d15283241d9e5215f28b40ac31f497c04b12fa7f428ff370/numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b", size = 5470247, upload-time = "2025-12-20T16:15:47.943Z" }, + { url = "https://files.pythonhosted.org/packages/54/08/cbce72c835d937795571b0464b52069f869c9e78b0c076d416c5269d2718/numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7", size = 6799807, upload-time = "2025-12-20T16:15:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/ff/be/2e647961cd8c980591d75cdcd9e8f647d69fbe05e2a25613dc0a2ea5fb1a/numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548", size = 14701992, upload-time = "2025-12-20T16:15:51.615Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/e1652fb8b6fd91ce6ed429143fe2e01ce714711e03e5b762615e7b36172c/numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346", size = 16646871, upload-time = "2025-12-20T16:15:54.129Z" }, + { url = "https://files.pythonhosted.org/packages/62/23/d841207e63c4322842f7cd042ae981cffe715c73376dcad8235fb31debf1/numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25", size = 16487190, upload-time = "2025-12-20T16:15:56.147Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a0/6a842c8421ebfdec0a230e65f61e0dabda6edbef443d999d79b87c273965/numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a", size = 18580762, upload-time = "2025-12-20T16:15:58.524Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d1/c79e0046641186f2134dde05e6181825b911f8bdcef31b19ddd16e232847/numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53", size = 6233359, upload-time = "2025-12-20T16:16:00.938Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f0/74965001d231f28184d6305b8cdc1b6fcd4bf23033f6cb039cfe76c9fca7/numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479", size = 12601132, upload-time = "2025-12-20T16:16:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/65/32/55408d0f46dfebce38017f5bd931affa7256ad6beac1a92a012e1fbc67a7/numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6", size = 10573977, upload-time = "2025-12-20T16:16:04.77Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ff/f6400ffec95de41c74b8e73df32e3fff1830633193a7b1e409be7fb1bb8c/numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037", size = 16653117, upload-time = "2025-12-20T16:16:06.709Z" }, + { url = "https://files.pythonhosted.org/packages/fd/28/6c23e97450035072e8d830a3c411bf1abd1f42c611ff9d29e3d8f55c6252/numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83", size = 12369711, upload-time = "2025-12-20T16:16:08.758Z" }, + { url = "https://files.pythonhosted.org/packages/bc/af/acbef97b630ab1bb45e6a7d01d1452e4251aa88ce680ac36e56c272120ec/numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344", size = 5198355, upload-time = "2025-12-20T16:16:10.902Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c8/4e0d436b66b826f2e53330adaa6311f5cac9871a5b5c31ad773b27f25a74/numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6", size = 6545298, upload-time = "2025-12-20T16:16:12.607Z" }, + { url = "https://files.pythonhosted.org/packages/ef/27/e1f5d144ab54eac34875e79037011d511ac57b21b220063310cb96c80fbc/numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb", size = 14398387, upload-time = "2025-12-20T16:16:14.257Z" }, + { url = "https://files.pythonhosted.org/packages/67/64/4cb909dd5ab09a9a5d086eff9586e69e827b88a5585517386879474f4cf7/numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63", size = 16363091, upload-time = "2025-12-20T16:16:17.32Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9c/8efe24577523ec6809261859737cf117b0eb6fdb655abdfdc81b2e468ce4/numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95", size = 16176394, upload-time = "2025-12-20T16:16:19.524Z" }, + { url = "https://files.pythonhosted.org/packages/61/f0/1687441ece7b47a62e45a1f82015352c240765c707928edd8aef875d5951/numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6", size = 18287378, upload-time = "2025-12-20T16:16:22.866Z" }, + { url = "https://files.pythonhosted.org/packages/d3/6f/f868765d44e6fc466467ed810ba9d8d6db1add7d4a748abfa2a4c99a3194/numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c", size = 5955432, upload-time = "2025-12-20T16:16:25.06Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b5/94c1e79fcbab38d1ca15e13777477b2914dd2d559b410f96949d6637b085/numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98", size = 12306201, upload-time = "2025-12-20T16:16:26.979Z" }, + { url = "https://files.pythonhosted.org/packages/70/09/c39dadf0b13bb0768cd29d6a3aaff1fb7c6905ac40e9aaeca26b1c086e06/numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667", size = 10308234, upload-time = "2025-12-20T16:16:29.417Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0d/853fd96372eda07c824d24adf02e8bc92bb3731b43a9b2a39161c3667cc4/numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea", size = 16649088, upload-time = "2025-12-20T16:16:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/e3/37/cc636f1f2a9f585434e20a3e6e63422f70bfe4f7f6698e941db52ea1ac9a/numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d", size = 12364065, upload-time = "2025-12-20T16:16:33.491Z" }, + { url = "https://files.pythonhosted.org/packages/ed/69/0b78f37ca3690969beee54103ce5f6021709134e8020767e93ba691a72f1/numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee", size = 5192640, upload-time = "2025-12-20T16:16:35.636Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2a/08569f8252abf590294dbb09a430543ec8f8cc710383abfb3e75cc73aeda/numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e", size = 6541556, upload-time = "2025-12-20T16:16:37.276Z" }, + { url = "https://files.pythonhosted.org/packages/93/e9/a949885a4e177493d61519377952186b6cbfdf1d6002764c664ba28349b5/numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2", size = 14396562, upload-time = "2025-12-20T16:16:38.953Z" }, + { url = "https://files.pythonhosted.org/packages/99/98/9d4ad53b0e9ef901c2ef1d550d2136f5ac42d3fd2988390a6def32e23e48/numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a", size = 16351719, upload-time = "2025-12-20T16:16:41.503Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/5f3711a38341d6e8dd619f6353251a0cdd07f3d6d101a8fd46f4ef87f895/numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681", size = 16176053, upload-time = "2025-12-20T16:16:44.552Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5b/2a3753dc43916501b4183532e7ace862e13211042bceafa253afb5c71272/numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475", size = 18277859, upload-time = "2025-12-20T16:16:47.174Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c5/a18bcdd07a941db3076ef489d036ab16d2bfc2eae0cf27e5a26e29189434/numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344", size = 5953849, upload-time = "2025-12-20T16:16:49.554Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f1/719010ff8061da6e8a26e1980cf090412d4f5f8060b31f0c45d77dd67a01/numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d", size = 12302840, upload-time = "2025-12-20T16:16:51.227Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5a/b3d259083ed8b4d335270c76966cb6cf14a5d1b69e1a608994ac57a659e6/numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d", size = 10308509, upload-time = "2025-12-20T16:16:53.313Z" }, + { url = "https://files.pythonhosted.org/packages/31/01/95edcffd1bb6c0633df4e808130545c4f07383ab629ac7e316fb44fff677/numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6", size = 12491815, upload-time = "2025-12-20T16:16:55.496Z" }, + { url = "https://files.pythonhosted.org/packages/59/ea/5644b8baa92cc1c7163b4b4458c8679852733fa74ca49c942cfa82ded4e0/numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5", size = 5320321, upload-time = "2025-12-20T16:16:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/26/4e/e10938106d70bc21319bd6a86ae726da37edc802ce35a3a71ecdf1fdfe7f/numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3", size = 6641635, upload-time = "2025-12-20T16:16:59.379Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/a8828e3eaf5c0b4ab116924df82f24ce3416fa38d0674d8f708ddc6c8aac/numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d", size = 14456053, upload-time = "2025-12-20T16:17:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/68/a1/17d97609d87d4520aa5ae2dcfb32305654550ac6a35effb946d303e594ce/numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3", size = 16401702, upload-time = "2025-12-20T16:17:04.235Z" }, + { url = "https://files.pythonhosted.org/packages/18/32/0f13c1b2d22bea1118356b8b963195446f3af124ed7a5adfa8fdecb1b6ca/numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa", size = 16242493, upload-time = "2025-12-20T16:17:06.856Z" }, + { url = "https://files.pythonhosted.org/packages/ae/23/48f21e3d309fbc137c068a1475358cbd3a901b3987dcfc97a029ab3068e2/numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c", size = 18324222, upload-time = "2025-12-20T16:17:09.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/52/41f3d71296a3dcaa4f456aaa3c6fc8e745b43d0552b6bde56571bb4b4a0f/numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93", size = 6076216, upload-time = "2025-12-20T16:17:11.437Z" }, + { url = "https://files.pythonhosted.org/packages/35/ff/46fbfe60ab0710d2a2b16995f708750307d30eccbb4c38371ea9e986866e/numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4", size = 12444263, upload-time = "2025-12-20T16:17:13.182Z" }, + { url = "https://files.pythonhosted.org/packages/a3/e3/9189ab319c01d2ed556c932ccf55064c5d75bb5850d1df7a482ce0badead/numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c", size = 10378265, upload-time = "2025-12-20T16:17:15.211Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ef/088e7c7342f300aaf3ee5f2c821c4b9996a1bef2aaf6a49cc8ab4883758e/numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6", size = 16819003, upload-time = "2025-12-20T16:18:03.41Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ce/a53017b5443b4b84517182d463fc7bcc2adb4faa8b20813f8e5f5aeb5faa/numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4", size = 12567105, upload-time = "2025-12-20T16:18:05.594Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/5ff91b161f2ec650c88a626c3905d938c89aaadabd0431e6d9c1330c83e2/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba", size = 5395590, upload-time = "2025-12-20T16:18:08.031Z" }, + { url = "https://files.pythonhosted.org/packages/1d/4e/f1a084106df8c2df8132fc437e56987308e0524836aa7733721c8429d4fe/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d", size = 6709947, upload-time = "2025-12-20T16:18:09.836Z" }, + { url = "https://files.pythonhosted.org/packages/63/09/3d8aeb809c0332c3f642da812ac2e3d74fc9252b3021f8c30c82e99e3f3d/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf", size = 14535119, upload-time = "2025-12-20T16:18:12.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7f/68f0fc43a2cbdc6bb239160c754d87c922f60fbaa0fa3cd3d312b8a7f5ee/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98", size = 16475815, upload-time = "2025-12-20T16:18:14.433Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/edeacba3167b1ca66d51b1a5a14697c2c40098b5ffa01811c67b1785a5ab/numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b", size = 12489376, upload-time = "2025-12-20T16:18:16.524Z" }, ] [[package]] @@ -1401,7 +1400,7 @@ version = "2.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, @@ -1517,7 +1516,7 @@ dependencies = [ { name = "microdf-python" }, { name = "numexpr" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pandas" }, { name = "plotly" }, { name = "psutil" }, @@ -1535,7 +1534,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.465.4" +version = "1.470.0" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 82672f747b826f0ec90c978c57d2e866a9dc3c96 Mon Sep 17 00:00:00 2001 From: Daphne Hansell Date: Tue, 23 Dec 2025 10:06:51 -0500 Subject: [PATCH 06/12] Address PR review comments for Healthier Oregon MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Split or_healthier_oregon_cost.py into separate files (one per variable) - Create or_healthier_oregon_group variable for clarity in cost calculation - Convert immigration status eligibility to use list parameter with np.isin() - Simplify is_child assignment (remove intermediate variable) - Update parameter descriptions to use active voice 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../eligibility/adult_income_limit.yaml | 2 +- .../eligibility/child_income_limit.yaml | 2 +- .../eligibility/child_max_age.yaml | 2 +- .../qualified_immigration_statuses.yaml | 17 +++ ...hier_oregon_immigration_status_eligible.py | 26 ++-- .../or_healthier_oregon_income_eligible.py | 3 +- .../or_healthier_oregon_cost.py | 114 ------------------ .../or_healthier_oregon_cost_if_enrolled.py | 81 +++++++++++++ .../or_healthier_oregon_group.py | 64 ++++++++++ 9 files changed, 176 insertions(+), 135 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml create mode 100644 policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py create mode 100644 policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index d73e9c41f50..1766fee55a0 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -1,4 +1,4 @@ -description: Oregon Healthier Oregon income limit for adults as percentage of FPL +description: Oregon Healthier Oregon sets this income limit for adults as a percentage of FPL metadata: unit: /1 period: year diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml index a3161332deb..69cef66b222 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -1,4 +1,4 @@ -description: Oregon Healthier Oregon income limit for children as percentage of FPL +description: Oregon Healthier Oregon sets this income limit for children as a percentage of FPL metadata: unit: /1 period: year diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml index cd71890112c..bbaa04c1832 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml @@ -1,4 +1,4 @@ -description: Maximum age to be considered a child for Oregon Healthier Oregon +description: Oregon Healthier Oregon considers children up to this age eligible for the higher income limit metadata: unit: year period: year diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml new file mode 100644 index 00000000000..a1f6744c86b --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml @@ -0,0 +1,17 @@ +description: Oregon Healthier Oregon covers immigrants with these statuses who are not eligible for federal Medicaid. +values: + 2023-07-01: + - UNDOCUMENTED + - DACA + - TPS + - DACA_TPS + +metadata: + label: Oregon Healthier Oregon qualified immigration statuses + period: year + unit: list + reference: + - title: Oregon Health Authority - Healthier Oregon + href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx + - title: Oregon HB 3352 - Cover All People Act + href: https://olis.oregonlegislature.gov/liz/2021R1/Downloads/MeasureDocument/HB3352/Enrolled diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py index 9cdec257898..498e7d61583 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_immigration_status_eligible.py @@ -1,4 +1,5 @@ from policyengine_us.model_api import * +import numpy as np class or_healthier_oregon_immigration_status_eligible(Variable): @@ -19,21 +20,14 @@ class or_healthier_oregon_immigration_status_eligible(Variable): """ def formula(person, period, parameters): - immigration_status = person("immigration_status", period) - - # Oregon covers undocumented immigrants - undocumented = ( - immigration_status - == immigration_status.possible_values.UNDOCUMENTED + p = ( + parameters(period) + .gov.states["or"] + .oha.healthier_oregon.eligibility ) - - # Oregon also covers DACA and TPS recipients - daca = immigration_status == immigration_status.possible_values.DACA - tps = immigration_status == immigration_status.possible_values.TPS - daca_tps = ( - immigration_status == immigration_status.possible_values.DACA_TPS + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + return np.isin( + immigration_status_str, + p.qualified_immigration_statuses, ) - - # Only return true for non-federally-eligible statuses - # Citizens, LPRs, refugees use regular federal Medicaid - return undocumented | daca | tps | daca_tps diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py index 53a2bb08f52..cd338f2c436 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py @@ -26,8 +26,7 @@ def formula(person, period, parameters): income_level = person("medicaid_income_level", period) age = person("age", period) - child_max_age = p.child_max_age - is_child = age <= child_max_age + is_child = age <= p.child_max_age # Different income limits based on age income_limit = where( diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py index 84584b5b089..c5091eb4ad6 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost.py @@ -18,117 +18,3 @@ class or_healthier_oregon_cost(Variable): """ adds = ["or_healthier_oregon_cost_if_enrolled"] - - -class or_healthier_oregon_cost_if_enrolled(Variable): - value_type = float - entity = Person - label = "Per capita Oregon Healthier Oregon cost by eligibility group" - unit = USD - definition_period = YEAR - defined_for = "or_healthier_oregon_eligible" - reference = ( - "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx" - ) - - def formula(person, period, parameters): - from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( - MedicaidGroup, - ) - - state = person.household("state_code", period) - - # Determine group based on demographics - age = person("age", period) - is_pregnant = person("is_pregnant", period) - is_disabled = person("is_ssi_recipient_for_medicaid", period) - - # Use the Oregon Healthier Oregon child_max_age parameter - p = ( - parameters(period) - .gov.states["or"] - .oha.healthier_oregon.eligibility - ) - is_child = age <= p.child_max_age - # 65 is the standard federal Medicaid aged threshold (42 USC 1382c) - is_aged_disabled = is_disabled | (age >= 65) - is_non_expansion_adult = is_pregnant & ~is_child & ~is_aged_disabled - is_expansion_adult = ( - ~is_child & ~is_aged_disabled & ~is_non_expansion_adult - ) - - group = select( - [ - is_aged_disabled, - is_child, - is_non_expansion_adult, - is_expansion_adult, - ], - [ - MedicaidGroup.AGED_DISABLED, - MedicaidGroup.CHILD, - MedicaidGroup.NON_EXPANSION_ADULT, - MedicaidGroup.EXPANSION_ADULT, - ], - default=MedicaidGroup.EXPANSION_ADULT, - ) - - # Get per capita costs from Medicaid parameters - p = parameters(period).calibration.gov.hhs.medicaid - - aged_spend = p.spending.by_eligibility_group.aged[state] - disabled_spend = p.spending.by_eligibility_group.disabled[state] - child_spend = p.spending.by_eligibility_group.child[state] - expansion_adult_spend = ( - p.spending.by_eligibility_group.expansion_adults[state] - ) - non_expansion_adult_spend = ( - p.spending.by_eligibility_group.non_expansion_adults[state] - ) - - aged_enroll = p.enrollment.aged[state] - disabled_enroll = p.enrollment.disabled[state] - child_enroll = p.enrollment.child[state] - expansion_adult_enroll = p.enrollment.expansion_adults[state] - non_expansion_adult_enroll = p.enrollment.non_expansion_adults[state] - - aged_disabled_spend = aged_spend + disabled_spend - aged_disabled_enroll = aged_enroll + disabled_enroll - - spend = select( - [ - group == MedicaidGroup.AGED_DISABLED, - group == MedicaidGroup.CHILD, - group == MedicaidGroup.EXPANSION_ADULT, - group == MedicaidGroup.NON_EXPANSION_ADULT, - ], - [ - aged_disabled_spend, - child_spend, - expansion_adult_spend, - non_expansion_adult_spend, - ], - default=0, - ) - - enroll = select( - [ - group == MedicaidGroup.AGED_DISABLED, - group == MedicaidGroup.CHILD, - group == MedicaidGroup.EXPANSION_ADULT, - group == MedicaidGroup.NON_EXPANSION_ADULT, - ], - [ - aged_disabled_enroll, - child_enroll, - expansion_adult_enroll, - non_expansion_adult_enroll, - ], - default=0, - ) - - per_capita = p.totals.per_capita[group] - mask = enroll > 0 - per_capita[mask] = spend[mask] / enroll[mask] - - return per_capita diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py new file mode 100644 index 00000000000..2b8da1c88c2 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py @@ -0,0 +1,81 @@ +from policyengine_us.model_api import * + + +class or_healthier_oregon_cost_if_enrolled(Variable): + value_type = float + entity = Person + label = "Per capita Oregon Healthier Oregon cost by eligibility group" + unit = USD + definition_period = YEAR + defined_for = "or_healthier_oregon_eligible" + reference = ( + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx" + ) + + def formula(person, period, parameters): + from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( + MedicaidGroup, + ) + + state = person.household("state_code", period) + group = person("or_healthier_oregon_group", period) + + # Get per capita costs from Medicaid parameters + p = parameters(period).calibration.gov.hhs.medicaid + + aged_spend = p.spending.by_eligibility_group.aged[state] + disabled_spend = p.spending.by_eligibility_group.disabled[state] + child_spend = p.spending.by_eligibility_group.child[state] + expansion_adult_spend = ( + p.spending.by_eligibility_group.expansion_adults[state] + ) + non_expansion_adult_spend = ( + p.spending.by_eligibility_group.non_expansion_adults[state] + ) + + aged_enroll = p.enrollment.aged[state] + disabled_enroll = p.enrollment.disabled[state] + child_enroll = p.enrollment.child[state] + expansion_adult_enroll = p.enrollment.expansion_adults[state] + non_expansion_adult_enroll = p.enrollment.non_expansion_adults[state] + + aged_disabled_spend = aged_spend + disabled_spend + aged_disabled_enroll = aged_enroll + disabled_enroll + + spend = select( + [ + group == MedicaidGroup.AGED_DISABLED, + group == MedicaidGroup.CHILD, + group == MedicaidGroup.EXPANSION_ADULT, + group == MedicaidGroup.NON_EXPANSION_ADULT, + ], + [ + aged_disabled_spend, + child_spend, + expansion_adult_spend, + non_expansion_adult_spend, + ], + default=0, + ) + + enroll = select( + [ + group == MedicaidGroup.AGED_DISABLED, + group == MedicaidGroup.CHILD, + group == MedicaidGroup.EXPANSION_ADULT, + group == MedicaidGroup.NON_EXPANSION_ADULT, + ], + [ + aged_disabled_enroll, + child_enroll, + expansion_adult_enroll, + non_expansion_adult_enroll, + ], + default=0, + ) + + per_capita = p.totals.per_capita[group] + mask = enroll > 0 + per_capita[mask] = spend[mask] / enroll[mask] + + return per_capita diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py new file mode 100644 index 00000000000..70f2be38442 --- /dev/null +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py @@ -0,0 +1,64 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( + MedicaidGroup, +) + + +class or_healthier_oregon_group(Variable): + """Maps Oregon Healthier Oregon enrollees to Medicaid spending groups. + + Precedence order (highest to lowest): + 1. Aged/Disabled - SSI recipients or age 65+ + 2. Non-Expansion Adult - pregnant adults + 3. Expansion Adult - other adults + 4. Child - age <= child_max_age parameter + """ + + value_type = Enum + possible_values = MedicaidGroup + default_value = MedicaidGroup.NONE + entity = Person + label = "Oregon Healthier Oregon Medicaid spending group" + definition_period = YEAR + defined_for = StateCode.OR + reference = ( + "https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx" + ) + + def formula(person, period, parameters): + age = person("age", period) + is_pregnant = person("is_pregnant", period) + is_disabled = person("is_ssi_recipient_for_medicaid", period) + + # Use the Oregon Healthier Oregon child_max_age parameter + p = ( + parameters(period) + .gov.states["or"] + .oha.healthier_oregon.eligibility + ) + is_child = age <= p.child_max_age + + # 65 is the standard federal Medicaid aged threshold (42 USC 1382c) + is_aged_disabled = is_disabled | (age >= 65) + + is_non_expansion_adult = is_pregnant & ~is_child & ~is_aged_disabled + + is_expansion_adult = ( + ~is_child & ~is_aged_disabled & ~is_non_expansion_adult + ) + + return select( + [ + is_aged_disabled, + is_child, + is_non_expansion_adult, + is_expansion_adult, + ], + [ + MedicaidGroup.AGED_DISABLED, + MedicaidGroup.CHILD, + MedicaidGroup.NON_EXPANSION_ADULT, + MedicaidGroup.EXPANSION_ADULT, + ], + default=MedicaidGroup.EXPANSION_ADULT, + ) From c8ca50234218bfc9c33a971d60ba59ba028fe416 Mon Sep 17 00:00:00 2001 From: Daphne Hansell Date: Tue, 23 Dec 2025 10:37:37 -0500 Subject: [PATCH 07/12] Merge main and upgrade uv.lock MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- uv.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/uv.lock b/uv.lock index dfed9cccf48..c2c7e2219e5 100644 --- a/uv.lock +++ b/uv.lock @@ -1089,19 +1089,19 @@ wheels = [ [[package]] name = "mistune" -version = "3.1.4" +version = "3.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d7/02/a7fb8b21d4d55ac93cdcde9d3638da5dd0ebdd3a4fed76c7725e10b81cbe/mistune-3.1.4.tar.gz", hash = "sha256:b5a7f801d389f724ec702840c11d8fc48f2b33519102fc7ee739e8177b672164", size = 94588, upload-time = "2025-08-29T07:20:43.594Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/f0/8282d9641415e9e33df173516226b404d367a0fc55e1a60424a152913abc/mistune-3.1.4-py3-none-any.whl", hash = "sha256:93691da911e5d9d2e23bc54472892aff676df27a75274962ff9edc210364266d", size = 53481, upload-time = "2025-08-29T07:20:42.218Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, ] [[package]] name = "nbclient" -version = "0.10.3" +version = "0.10.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-client" }, @@ -1109,9 +1109,9 @@ dependencies = [ { name = "nbformat" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8d/f3/1f6cf2ede4b026bc5f0b424cb41adf22f9c804e90a4dbd4fdb42291a35d5/nbclient-0.10.3.tar.gz", hash = "sha256:0baf171ee246e3bb2391da0635e719f27dc77d99aef59e0b04dcb935ee04c575", size = 62564, upload-time = "2025-12-19T15:50:09.331Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9", size = 62554, upload-time = "2025-12-23T07:45:46.369Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/77/0c73678f5260501a271fd7342bee5d639440f2e9e07d590f1100a056d87c/nbclient-0.10.3-py3-none-any.whl", hash = "sha256:39e9bd403504dd2484dd0fd25235bb6a683ce8cd9873356e40d880696adc9e35", size = 25473, upload-time = "2025-12-19T15:50:07.671Z" }, + { url = "https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440", size = 25465, upload-time = "2025-12-23T07:45:44.51Z" }, ] [[package]] @@ -1534,7 +1534,7 @@ wheels = [ [[package]] name = "policyengine-us" -version = "1.470.0" +version = "1.470.1" source = { editable = "." } dependencies = [ { name = "microdf-python" }, From 2f9cc6a61adf020581f063d538218ffe960bad2c Mon Sep 17 00:00:00 2001 From: daphnehanse11 <128793799+daphnehanse11@users.noreply.github.com> Date: Tue, 30 Dec 2025 14:10:06 -0500 Subject: [PATCH 08/12] Refine descriptions and labels for Healthier Oregon eligibility parameters; add per capita cost calculation helper functions. --- .../eligibility/adult_income_limit.yaml | 4 +- .../eligibility/child_income_limit.yaml | 4 +- .../eligibility/child_max_age.yaml | 4 +- .../eligibility/in_effect.yaml | 4 +- .../qualified_immigration_statuses.yaml | 2 +- .../or/oha/healthier_oregon/integration.yaml | 4 +- .../costs/medicaid_cost_if_enrolled.py | 74 +------------ .../medicaid/costs/per_capita_cost_helpers.py | 100 ++++++++++++++++++ .../or_healthier_oregon_cost_if_enrolled.py | 72 ++----------- 9 files changed, 124 insertions(+), 144 deletions(-) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index 1766fee55a0..f56b1615130 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -1,8 +1,8 @@ -description: Oregon Healthier Oregon sets this income limit for adults as a percentage of FPL +description: Oregon limits gross income to this share of the federal poverty level for adults under the Healthier Oregon program. metadata: unit: /1 period: year - label: OR Healthier Oregon adult income limit (% FPL) + label: Oregon Healthier Oregon adult income limit (% FPL) reference: - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml index 69cef66b222..f1cb6c836d9 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -1,8 +1,8 @@ -description: Oregon Healthier Oregon sets this income limit for children as a percentage of FPL +description: Oregon limits gross income to this share of the federal poverty level for children under the Healthier Oregon program. metadata: unit: /1 period: year - label: OR Healthier Oregon child income limit (% FPL) + label: Oregon Healthier Oregon child income limit (% FPL) reference: - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml index bbaa04c1832..ff74212ea61 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml @@ -1,8 +1,8 @@ -description: Oregon Healthier Oregon considers children up to this age eligible for the higher income limit +description: Oregon applies the higher child income limit to individuals up to this age under the Healthier Oregon program. metadata: unit: year period: year - label: OR Healthier Oregon child max age + label: Oregon Healthier Oregon child maximum age reference: - title: Oregon Health Authority - OHP Application (children ages 0-18) href: https://www.oregon.gov/oha/hsd/ohp/pages/apply.aspx diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml index 5c15a59ea46..a878644e84c 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml @@ -1,8 +1,8 @@ -description: Whether Oregon Healthier Oregon program is in effect (full expansion to all ages) +description: Oregon makes the Healthier Oregon program available when this parameter is true. metadata: unit: bool period: year - label: OR Healthier Oregon in effect + label: Oregon Healthier Oregon in effect reference: - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml index a1f6744c86b..16b8027e6d1 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml @@ -1,4 +1,4 @@ -description: Oregon Healthier Oregon covers immigrants with these statuses who are not eligible for federal Medicaid. +description: Oregon provides Healthier Oregon coverage to immigrants with these statuses who are not eligible for federal Medicaid. values: 2023-07-01: - UNDOCUMENTED diff --git a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml index b2f45a05e96..7a9198dedd0 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/or/oha/healthier_oregon/integration.yaml @@ -2,7 +2,7 @@ - name: Undocumented adult gets healthcare benefit value period: 2024 - absolute_error_margin: 1 + absolute_error_margin: 0.1 input: people: person: @@ -16,7 +16,7 @@ output: or_healthier_oregon_eligible: [true] # Cost should be non-zero (Oregon expansion adult rate) - or_healthier_oregon_cost: [7_475] # Oregon expansion adult per capita cost + or_healthier_oregon_cost: [7_475.23] # Oregon expansion adult per capita cost - name: Undocumented child gets higher income limit period: 2024 diff --git a/policyengine_us/variables/gov/hhs/medicaid/costs/medicaid_cost_if_enrolled.py b/policyengine_us/variables/gov/hhs/medicaid/costs/medicaid_cost_if_enrolled.py index f1d04ec1a67..acaaf10253f 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/costs/medicaid_cost_if_enrolled.py +++ b/policyengine_us/variables/gov/hhs/medicaid/costs/medicaid_cost_if_enrolled.py @@ -2,6 +2,9 @@ from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( MedicaidGroup, ) +from policyengine_us.variables.gov.hhs.medicaid.costs.per_capita_cost_helpers import ( + calculate_per_capita_cost, +) class medicaid_cost_if_enrolled(Variable): @@ -13,74 +16,7 @@ class medicaid_cost_if_enrolled(Variable): defined_for = "is_medicaid_eligible" def formula(person, period, parameters): - state = person.household("state_code", period) group = person("medicaid_group", period) - - p = parameters(period).calibration.gov.hhs.medicaid - - # Handle each group type separately - is_aged_disabled = group == MedicaidGroup.AGED_DISABLED - is_child = group == MedicaidGroup.CHILD - is_expansion_adult = group == MedicaidGroup.EXPANSION_ADULT - is_non_expansion_adult = group == MedicaidGroup.NON_EXPANSION_ADULT - - # Calculate spend and enrollment for each group - aged_spend = p.spending.by_eligibility_group.aged[state] - disabled_spend = p.spending.by_eligibility_group.disabled[state] - child_spend = p.spending.by_eligibility_group.child[state] - expansion_adult_spend = ( - p.spending.by_eligibility_group.expansion_adults[state] + return calculate_per_capita_cost( + person, period, parameters, group, MedicaidGroup ) - non_expansion_adult_spend = ( - p.spending.by_eligibility_group.non_expansion_adults[state] - ) - - aged_enroll = p.enrollment.aged[state] - disabled_enroll = p.enrollment.disabled[state] - child_enroll = p.enrollment.child[state] - expansion_adult_enroll = p.enrollment.expansion_adults[state] - non_expansion_adult_enroll = p.enrollment.non_expansion_adults[state] - - # Combine aged and disabled for AGED_DISABLED group - aged_disabled_spend = aged_spend + disabled_spend - aged_disabled_enroll = aged_enroll + disabled_enroll - - # Select the right values based on group - spend = select( - [ - is_aged_disabled, - is_child, - is_expansion_adult, - is_non_expansion_adult, - ], - [ - aged_disabled_spend, - child_spend, - expansion_adult_spend, - non_expansion_adult_spend, - ], - default=0, - ) - - enroll = select( - [ - is_aged_disabled, - is_child, - is_expansion_adult, - is_non_expansion_adult, - ], - [ - aged_disabled_enroll, - child_enroll, - expansion_adult_enroll, - non_expansion_adult_enroll, - ], - default=0, - ) - - # Avoid divide‑by‑zero in non‑expansion states by assigning national average. - per_capita = p.totals.per_capita[group] - mask = enroll > 0 - per_capita[mask] = spend[mask] / enroll[mask] - - return per_capita diff --git a/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py b/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py new file mode 100644 index 00000000000..64937fbd3fd --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py @@ -0,0 +1,100 @@ +"""Helper functions for calculating per capita Medicaid costs. + +This module provides shared logic for calculating per capita costs that is +used by: +- medicaid_cost_if_enrolled (for federal Medicaid) +- or_healthier_oregon_cost_if_enrolled (for Oregon Healthier Oregon) +- Other state Medicaid-like programs +""" + +from policyengine_us.model_api import select + + +def calculate_per_capita_cost( + person, period, parameters, group, MedicaidGroup +): + """Calculate per capita Medicaid cost for a given eligibility group. + + Args: + person: The person entity + period: The calculation period + parameters: The parameters object + group: Array of MedicaidGroup values for each person + MedicaidGroup: The MedicaidGroup enum class + + Returns: + Array of per capita costs for each person based on their group + """ + state = person.household("state_code", period) + + p = parameters(period).calibration.gov.hhs.medicaid + + # Get spending by eligibility group and state + aged_spend = p.spending.by_eligibility_group.aged[state] + disabled_spend = p.spending.by_eligibility_group.disabled[state] + child_spend = p.spending.by_eligibility_group.child[state] + expansion_adult_spend = p.spending.by_eligibility_group.expansion_adults[ + state + ] + non_expansion_adult_spend = ( + p.spending.by_eligibility_group.non_expansion_adults[state] + ) + + # Get enrollment by eligibility group and state + aged_enroll = p.enrollment.aged[state] + disabled_enroll = p.enrollment.disabled[state] + child_enroll = p.enrollment.child[state] + expansion_adult_enroll = p.enrollment.expansion_adults[state] + non_expansion_adult_enroll = p.enrollment.non_expansion_adults[state] + + # Combine aged and disabled for AGED_DISABLED group + aged_disabled_spend = aged_spend + disabled_spend + aged_disabled_enroll = aged_enroll + disabled_enroll + + # Determine group membership + is_aged_disabled = group == MedicaidGroup.AGED_DISABLED + is_child = group == MedicaidGroup.CHILD + is_expansion_adult = group == MedicaidGroup.EXPANSION_ADULT + is_non_expansion_adult = group == MedicaidGroup.NON_EXPANSION_ADULT + + # Select spending based on group + spend = select( + [ + is_aged_disabled, + is_child, + is_expansion_adult, + is_non_expansion_adult, + ], + [ + aged_disabled_spend, + child_spend, + expansion_adult_spend, + non_expansion_adult_spend, + ], + default=0, + ) + + # Select enrollment based on group + enroll = select( + [ + is_aged_disabled, + is_child, + is_expansion_adult, + is_non_expansion_adult, + ], + [ + aged_disabled_enroll, + child_enroll, + expansion_adult_enroll, + non_expansion_adult_enroll, + ], + default=0, + ) + + # Calculate per capita cost + # Use national average as fallback when enrollment is zero + per_capita = p.totals.per_capita[group].copy() + mask = enroll > 0 + per_capita[mask] = spend[mask] / enroll[mask] + + return per_capita diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py index 2b8da1c88c2..80cd6feb49c 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_cost_if_enrolled.py @@ -1,4 +1,10 @@ from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( + MedicaidGroup, +) +from policyengine_us.variables.gov.hhs.medicaid.costs.per_capita_cost_helpers import ( + calculate_per_capita_cost, +) class or_healthier_oregon_cost_if_enrolled(Variable): @@ -13,69 +19,7 @@ class or_healthier_oregon_cost_if_enrolled(Variable): ) def formula(person, period, parameters): - from policyengine_us.variables.gov.hhs.medicaid.costs.medicaid_group import ( - MedicaidGroup, - ) - - state = person.household("state_code", period) group = person("or_healthier_oregon_group", period) - - # Get per capita costs from Medicaid parameters - p = parameters(period).calibration.gov.hhs.medicaid - - aged_spend = p.spending.by_eligibility_group.aged[state] - disabled_spend = p.spending.by_eligibility_group.disabled[state] - child_spend = p.spending.by_eligibility_group.child[state] - expansion_adult_spend = ( - p.spending.by_eligibility_group.expansion_adults[state] + return calculate_per_capita_cost( + person, period, parameters, group, MedicaidGroup ) - non_expansion_adult_spend = ( - p.spending.by_eligibility_group.non_expansion_adults[state] - ) - - aged_enroll = p.enrollment.aged[state] - disabled_enroll = p.enrollment.disabled[state] - child_enroll = p.enrollment.child[state] - expansion_adult_enroll = p.enrollment.expansion_adults[state] - non_expansion_adult_enroll = p.enrollment.non_expansion_adults[state] - - aged_disabled_spend = aged_spend + disabled_spend - aged_disabled_enroll = aged_enroll + disabled_enroll - - spend = select( - [ - group == MedicaidGroup.AGED_DISABLED, - group == MedicaidGroup.CHILD, - group == MedicaidGroup.EXPANSION_ADULT, - group == MedicaidGroup.NON_EXPANSION_ADULT, - ], - [ - aged_disabled_spend, - child_spend, - expansion_adult_spend, - non_expansion_adult_spend, - ], - default=0, - ) - - enroll = select( - [ - group == MedicaidGroup.AGED_DISABLED, - group == MedicaidGroup.CHILD, - group == MedicaidGroup.EXPANSION_ADULT, - group == MedicaidGroup.NON_EXPANSION_ADULT, - ], - [ - aged_disabled_enroll, - child_enroll, - expansion_adult_enroll, - non_expansion_adult_enroll, - ], - default=0, - ) - - per_capita = p.totals.per_capita[group] - mask = enroll > 0 - per_capita[mask] = spend[mask] / enroll[mask] - - return per_capita From e2ccc97c05fd0b8d20a089207dbbdfb02ba9807f Mon Sep 17 00:00:00 2001 From: daphnehanse11 <128793799+daphnehanse11@users.noreply.github.com> Date: Wed, 31 Dec 2025 10:27:01 -0500 Subject: [PATCH 09/12] Update Healthier Oregon eligibility parameters and references; refine child age limit logic --- .../eligibility/adult_income_limit.yaml | 4 ++++ .../eligibility/aged_threshold.yaml | 13 +++++++++++++ .../eligibility/child_income_limit.yaml | 4 ++++ .../healthier_oregon/eligibility/child_max_age.yaml | 6 ++++-- .../eligibility/qualified_immigration_statuses.yaml | 2 ++ .../hhs/medicaid/costs/per_capita_cost_helpers.py | 2 +- .../or_healthier_oregon_income_eligible.py | 2 +- .../healthier_oregon/or_healthier_oregon_group.py | 7 +++---- 8 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/aged_threshold.yaml diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index f56b1615130..d8a9ff6a1c9 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -4,6 +4,10 @@ metadata: period: year label: Oregon Healthier Oregon adult income limit (% FPL) reference: + - title: ORS 414.231(2) - Coverage for noncitizens (adults eligible for medical assistance) + href: https://oregon.public.law/statutes/ors_414.231 + - title: ORS 414.025(3) - Medical assistance eligibility at 138% FPL + href: https://oregon.public.law/statutes/ors_414.025 - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - title: OPB - Oregon expands health coverage diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/aged_threshold.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/aged_threshold.yaml new file mode 100644 index 00000000000..8f1aa583c1f --- /dev/null +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/aged_threshold.yaml @@ -0,0 +1,13 @@ +description: Oregon considers individuals at or above this age as aged for Medicaid spending group classification under the Healthier Oregon program. +metadata: + unit: year + period: year + label: Oregon Healthier Oregon aged threshold + reference: + - title: ORS 414.231 - Coverage for noncitizens + href: https://oregon.public.law/statutes/ors_414.231 + - title: Social Security Act Section 1614(a)(1)(A) - Definition of aged (42 USC 1382c) + href: https://www.ssa.gov/OP_Home/ssact/title16b/1614.htm + +values: + 2023-07-01: 65 # Federal standard aged threshold diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml index f1cb6c836d9..3ecf2639dd3 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -4,6 +4,10 @@ metadata: period: year label: Oregon Healthier Oregon child income limit (% FPL) reference: + - title: ORS 414.231(1) - Coverage for noncitizens (children eligible for CHIP) + href: https://oregon.public.law/statutes/ors_414.231 + - title: ORS 414.231(3) - Coverage for noncitizens (children in families above 305% FPL) + href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - title: OPB - Oregon expands health coverage diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml index ff74212ea61..3d111d91bad 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml @@ -1,11 +1,13 @@ -description: Oregon applies the higher child income limit to individuals up to this age under the Healthier Oregon program. +description: Oregon applies the higher child income limit to individuals under this age under the Healthier Oregon program. metadata: unit: year period: year label: Oregon Healthier Oregon child maximum age reference: + - title: ORS 414.231 - Coverage for noncitizens (defines child as under 19) + href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Authority - OHP Application (children ages 0-18) href: https://www.oregon.gov/oha/hsd/ohp/pages/apply.aspx values: - 2023-07-01: 18 # Children 0-18 + 2023-07-01: 19 # Children under 19 (ages 0-18) diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml index 16b8027e6d1..a09a86a7ce1 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/qualified_immigration_statuses.yaml @@ -11,6 +11,8 @@ metadata: period: year unit: list reference: + - title: ORS 414.231 - Coverage for noncitizens + href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - title: Oregon HB 3352 - Cover All People Act diff --git a/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py b/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py index 64937fbd3fd..25d7bc6a3bf 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py +++ b/policyengine_us/variables/gov/hhs/medicaid/costs/per_capita_cost_helpers.py @@ -7,7 +7,7 @@ - Other state Medicaid-like programs """ -from policyengine_us.model_api import select +from policyengine_us.model_api import * def calculate_per_capita_cost( diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py index cd338f2c436..0c7af7fd940 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/eligibility/or_healthier_oregon_income_eligible.py @@ -26,7 +26,7 @@ def formula(person, period, parameters): income_level = person("medicaid_income_level", period) age = person("age", period) - is_child = age <= p.child_max_age + is_child = age < p.child_max_age # Different income limits based on age income_limit = where( diff --git a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py index 70f2be38442..9ec02880347 100644 --- a/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py +++ b/policyengine_us/variables/gov/states/or/oha/healthier_oregon/or_healthier_oregon_group.py @@ -11,7 +11,7 @@ class or_healthier_oregon_group(Variable): 1. Aged/Disabled - SSI recipients or age 65+ 2. Non-Expansion Adult - pregnant adults 3. Expansion Adult - other adults - 4. Child - age <= child_max_age parameter + 4. Child - age < child_max_age parameter (under 19) """ value_type = Enum @@ -36,10 +36,9 @@ def formula(person, period, parameters): .gov.states["or"] .oha.healthier_oregon.eligibility ) - is_child = age <= p.child_max_age + is_child = age < p.child_max_age - # 65 is the standard federal Medicaid aged threshold (42 USC 1382c) - is_aged_disabled = is_disabled | (age >= 65) + is_aged_disabled = is_disabled | (age >= p.aged_threshold) is_non_expansion_adult = is_pregnant & ~is_child & ~is_aged_disabled From d50b8e41329711e693ba7f5231475e5b579f77aa Mon Sep 17 00:00:00 2001 From: daphnehanse11 <128793799+daphnehanse11@users.noreply.github.com> Date: Fri, 2 Jan 2026 14:43:25 -0500 Subject: [PATCH 10/12] Update Oregon Healthier Oregon eligibility parameters; revise income limit references and child age definition --- .../eligibility/adult_income_limit.yaml | 12 +-- .../eligibility/child_income_limit.yaml | 14 +--- .../eligibility/child_max_age.yaml | 2 - uv.lock | 84 +++++++++++++------ 4 files changed, 62 insertions(+), 50 deletions(-) diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index d8a9ff6a1c9..448c0d498e3 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -4,16 +4,8 @@ metadata: period: year label: Oregon Healthier Oregon adult income limit (% FPL) reference: - - title: ORS 414.231(2) - Coverage for noncitizens (adults eligible for medical assistance) - href: https://oregon.public.law/statutes/ors_414.231 - - title: ORS 414.025(3) - Medical assistance eligibility at 138% FPL - href: https://oregon.public.law/statutes/ors_414.025 - - title: Oregon Health Authority - Healthier Oregon - href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - - title: OPB - Oregon expands health coverage - href: https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/ - - title: healthinsurance.org - Oregon Medicaid (adults up to 138% FPL) - href: https://www.healthinsurance.org/medicaid/oregon/ + - title: Oregon Health Plan (OHP), Health Systems Division (HSD) Medical Programs - 2025 income thresholds (page 11) + href: https://sharedsystems.dhsoha.state.or.us/DHSForms/Served/de5530.pdf values: 2023-07-01: 1.38 # 138% FPL for adults diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml index 3ecf2639dd3..904ca18e8a6 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -4,18 +4,8 @@ metadata: period: year label: Oregon Healthier Oregon child income limit (% FPL) reference: - - title: ORS 414.231(1) - Coverage for noncitizens (children eligible for CHIP) - href: https://oregon.public.law/statutes/ors_414.231 - - title: ORS 414.231(3) - Coverage for noncitizens (children in families above 305% FPL) - href: https://oregon.public.law/statutes/ors_414.231 - - title: Oregon Health Authority - Healthier Oregon - href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - - title: OPB - Oregon expands health coverage - href: https://www.opb.org/article/2023/07/10/oregon-expands-health-coverage-low-income-residents-immigrants/ - - title: KFF - Medicaid and CHIP Income Eligibility Limits for Children - href: https://www.kff.org/medicaid/state-indicator/medicaid-and-chip-income-eligibility-limits-for-children-as-a-percent-of-the-federal-poverty-level/ - - title: healthinsurance.org - Oregon Medicaid (children up to 305% FPL) - href: https://www.healthinsurance.org/medicaid/oregon/ + - title: Oregon Health Plan (OHP), Health Systems Division (HSD) Medical Programs - 2025 income thresholds (page 11) + href: https://sharedsystems.dhsoha.state.or.us/DHSForms/Served/de5530.pdf values: 2023-07-01: 3.05 # 305% FPL for children diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml index 3d111d91bad..7a05a99e2a6 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_max_age.yaml @@ -6,8 +6,6 @@ metadata: reference: - title: ORS 414.231 - Coverage for noncitizens (defines child as under 19) href: https://oregon.public.law/statutes/ors_414.231 - - title: Oregon Health Authority - OHP Application (children ages 0-18) - href: https://www.oregon.gov/oha/hsd/ohp/pages/apply.aspx values: 2023-07-01: 19 # Children under 19 (ages 0-18) diff --git a/uv.lock b/uv.lock index f9d20ef9341..06bf5cb6b5b 100644 --- a/uv.lock +++ b/uv.lock @@ -529,11 +529,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.20.1" +version = "3.20.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/23/ce7a1126827cedeb958fc043d61745754464eb56c5937c35bbf2b8e26f34/filelock-3.20.1.tar.gz", hash = "sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c", size = 19476, upload-time = "2025-12-15T23:54:28.027Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/e0/a75dbe4bca1e7d41307323dad5ea2efdd95408f74ab2de8bd7dba9b51a1a/filelock-3.20.2.tar.gz", hash = "sha256:a2241ff4ddde2a7cebddf78e39832509cb045d18ec1a09d7248d6bfc6bfbbe64", size = 19510, upload-time = "2026-01-02T15:33:32.582Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl", hash = "sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a", size = 16666, upload-time = "2025-12-15T23:54:26.874Z" }, + { url = "https://files.pythonhosted.org/packages/9a/30/ab407e2ec752aa541704ed8f93c11e2a5d92c168b8a755d818b74a3c5c2d/filelock-3.20.2-py3-none-any.whl", hash = "sha256:fbba7237d6ea277175a32c54bb71ef814a8546d8601269e1bfc388de333974e8", size = 16697, upload-time = "2026-01-02T15:33:31.133Z" }, ] [[package]] @@ -563,7 +563,8 @@ dependencies = [ { name = "beautifulsoup4" }, { name = "pygments" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-basic-ng" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ec/20/5f5ad4da6a5a27c80f2ed2ee9aee3f9e36c66e56e21c00fde467b2f8f88f/furo-2025.12.19.tar.gz", hash = "sha256:188d1f942037d8b37cd3985b955839fea62baa1730087dc29d157677c857e2a7", size = 1661473, upload-time = "2025-12-19T17:34:40.889Z" } @@ -1996,11 +1997,11 @@ wheels = [ [[package]] name = "send2trash" -version = "1.8.3" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394, upload-time = "2024-04-07T00:01:09.267Z" } +sdist = { url = "https://files.pythonhosted.org/packages/62/6e/421803dec0c0dfbf5a27e66491ebe6643a461e4f90422f00ea4c68ae24aa/send2trash-2.0.0.tar.gz", hash = "sha256:1761421da3f9930bfe51ed7c45343948573383ad4c27e3acebc91be324e7770d", size = 17206, upload-time = "2025-12-31T04:12:48.664Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072, upload-time = "2024-04-07T00:01:07.438Z" }, + { url = "https://files.pythonhosted.org/packages/1b/5a/f2f2e5eda25579f754acd83399c522ee03d6acbe001dfe53c8a1ec928b44/send2trash-2.0.0-py3-none-any.whl", hash = "sha256:e70d5ce41dbb890882cc78bc25d137478330b39a391e756fadf82e34da4d85b8", size = 17642, upload-time = "2025-12-31T04:12:45.336Z" }, ] [[package]] @@ -2093,40 +2094,71 @@ name = "sphinx" version = "9.0.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.12'", "python_full_version == '3.11.*'", ] dependencies = [ - { name = "alabaster", marker = "python_full_version >= '3.11'" }, - { name = "babel", marker = "python_full_version >= '3.11'" }, - { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, - { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "imagesize", marker = "python_full_version >= '3.11'" }, - { name = "jinja2", marker = "python_full_version >= '3.11'" }, - { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "pygments", marker = "python_full_version >= '3.11'" }, - { name = "requests", marker = "python_full_version >= '3.11'" }, - { name = "roman-numerals", marker = "python_full_version >= '3.11'" }, - { name = "snowballstemmer", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.11'" }, - { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.11'" }, + { name = "alabaster", marker = "python_full_version == '3.11.*'" }, + { name = "babel", marker = "python_full_version == '3.11.*'" }, + { name = "colorama", marker = "python_full_version == '3.11.*' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "imagesize", marker = "python_full_version == '3.11.*'" }, + { name = "jinja2", marker = "python_full_version == '3.11.*'" }, + { name = "packaging", marker = "python_full_version == '3.11.*'" }, + { name = "pygments", marker = "python_full_version == '3.11.*'" }, + { name = "requests", marker = "python_full_version == '3.11.*'" }, + { name = "roman-numerals", marker = "python_full_version == '3.11.*'" }, + { name = "snowballstemmer", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.11.*'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.11.*'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, ] +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", +] +dependencies = [ + { name = "alabaster", marker = "python_full_version >= '3.12'" }, + { name = "babel", marker = "python_full_version >= '3.12'" }, + { name = "colorama", marker = "python_full_version >= '3.12' and sys_platform == 'win32'" }, + { name = "docutils", version = "0.22.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "imagesize", marker = "python_full_version >= '3.12'" }, + { name = "jinja2", marker = "python_full_version >= '3.12'" }, + { name = "packaging", marker = "python_full_version >= '3.12'" }, + { name = "pygments", marker = "python_full_version >= '3.12'" }, + { name = "requests", marker = "python_full_version >= '3.12'" }, + { name = "roman-numerals", marker = "python_full_version >= '3.12'" }, + { name = "snowballstemmer", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-applehelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-devhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-htmlhelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-jsmath", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, + { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + [[package]] name = "sphinx-basic-ng" version = "1.0.0b2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload-time = "2023-07-08T18:40:54.166Z" } wheels = [ From 886090968553ee6f01d633d07cf52f69bda008ec Mon Sep 17 00:00:00 2001 From: Daphne Hansell <128793799+daphnehanse11@users.noreply.github.com> Date: Mon, 5 Jan 2026 11:00:19 -0500 Subject: [PATCH 11/12] Add references for noncitizen coverage to eligibility parameters in Healthier Oregon --- .../or/oha/healthier_oregon/eligibility/adult_income_limit.yaml | 2 ++ .../or/oha/healthier_oregon/eligibility/child_income_limit.yaml | 2 ++ .../states/or/oha/healthier_oregon/eligibility/in_effect.yaml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index 448c0d498e3..914866c1eac 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -4,6 +4,8 @@ metadata: period: year label: Oregon Healthier Oregon adult income limit (% FPL) reference: + - title: ORS 414.231 - Coverage for noncitizens + href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Plan (OHP), Health Systems Division (HSD) Medical Programs - 2025 income thresholds (page 11) href: https://sharedsystems.dhsoha.state.or.us/DHSForms/Served/de5530.pdf diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml index 904ca18e8a6..27da73634a9 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/child_income_limit.yaml @@ -4,6 +4,8 @@ metadata: period: year label: Oregon Healthier Oregon child income limit (% FPL) reference: + - title: ORS 414.231(1)(a) - Coverage for noncitizens (300% FPL for children) + href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Plan (OHP), Health Systems Division (HSD) Medical Programs - 2025 income thresholds (page 11) href: https://sharedsystems.dhsoha.state.or.us/DHSForms/Served/de5530.pdf diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml index a878644e84c..a2b8dfeca08 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/in_effect.yaml @@ -4,6 +4,8 @@ metadata: period: year label: Oregon Healthier Oregon in effect reference: + - title: ORS 414.231 - Coverage for noncitizens + href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Authority - Healthier Oregon href: https://www.oregon.gov/oha/hsd/ohp/pages/healthier-oregon.aspx - title: Oregon House Bill 3352 From 0be8a7f78105b4b2c13199daeae4e4867f796344 Mon Sep 17 00:00:00 2001 From: Daphne Hansell <128793799+daphnehanse11@users.noreply.github.com> Date: Mon, 5 Jan 2026 11:02:08 -0500 Subject: [PATCH 12/12] add section --- .../or/oha/healthier_oregon/eligibility/adult_income_limit.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml index 914866c1eac..2b0ddf34a7a 100644 --- a/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/or/oha/healthier_oregon/eligibility/adult_income_limit.yaml @@ -4,7 +4,7 @@ metadata: period: year label: Oregon Healthier Oregon adult income limit (% FPL) reference: - - title: ORS 414.231 - Coverage for noncitizens + - title: ORS 414.231(4) - Coverage for noncitizens href: https://oregon.public.law/statutes/ors_414.231 - title: Oregon Health Plan (OHP), Health Systems Division (HSD) Medical Programs - 2025 income thresholds (page 11) href: https://sharedsystems.dhsoha.state.or.us/DHSForms/Served/de5530.pdf