From 2173631a882520735621c7d14b21dbab89853a16 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 30 Jul 2026 23:17:24 -0400 Subject: [PATCH 01/34] Add Medicaid LTSS financial eligibility chassis --- .../financial/de/csra/state_minimum.yaml | 11 +++ .../de/income/general_disregard.yaml | 13 +++ .../financial/de/resources/couple.yaml | 13 +++ .../financial/de/resources/individual.yaml | 13 +++ .../de/special_income_limit/couple.yaml | 13 +++ .../de/special_income_limit/individual.yaml | 13 +++ .../financial/federal/csra/maximum.yaml | 11 +++ .../financial/federal/csra/minimum.yaml | 11 +++ .../federal/home_equity/maximum.yaml | 11 +++ .../federal/home_equity/minimum.yaml | 11 +++ .../financial/federal/mmmna/maximum.yaml | 11 +++ .../financial/federal/mmmna/minimum.yaml | 11 +++ .../federal/mmmna/shelter_threshold_rate.yaml | 11 +++ .../financial/federal/resources/couple.yaml | 11 +++ .../federal/resources/individual.yaml | 11 +++ .../federal/special_income_limit/maximum.yaml | 11 +++ .../financial/federal/ssi_fbr/couple.yaml | 11 +++ .../financial/federal/ssi_fbr/individual.yaml | 11 +++ .../financial/tx/csra/state_minimum.yaml | 11 +++ .../financial/tx/home_equity/limit.yaml | 11 +++ .../financial/tx/resources/couple.yaml | 11 +++ .../financial/tx/resources/individual.yaml | 11 +++ .../tx/special_income_limit/couple.yaml | 11 +++ .../tx/special_income_limit/individual.yaml | 11 +++ .../financial/wa/csra/state_minimum.yaml | 11 +++ .../financial/wa/home_equity/limit.yaml | 11 +++ .../wa/medically_needy/income_level.yaml | 11 +++ .../financial/wa/resources/individual.yaml | 11 +++ .../wa/special_income_limit/individual.yaml | 11 +++ .../financial/wa/waivers/copes/enabled.yaml | 11 +++ .../wa/waivers/new_freedom/enabled.yaml | 11 +++ .../financial/wa/waivers/rsw/enabled.yaml | 11 +++ ...icaid_ltss_financial_threshold_eligible.py | 28 ++++++ .../is_medicaid_ltss_income_eligible.py | 91 +++++++++++++++++++ .../medicaid_ltss_assistance_unit_size.py | 16 ++++ ...ss_community_spouse_countable_resources.py | 18 ++++ ..._ltss_community_spouse_shelter_expenses.py | 16 ++++ .../financial/medicaid_ltss_cost_of_care.py | 22 +++++ .../medicaid_ltss_countable_resources.py | 22 +++++ ...resources_at_first_institutionalization.py | 19 ++++ .../medicaid_ltss_csra_resource_eligible.py | 87 ++++++++++++++++++ .../medicaid_ltss_financial_pathway.py | 79 ++++++++++++++++ .../medicaid_ltss_has_community_spouse.py | 15 +++ .../medicaid_ltss_home_encumbrances.py | 17 ++++ .../medicaid_ltss_home_equity_eligible.py | 64 +++++++++++++ ...dicaid_ltss_home_equity_hardship_waiver.py | 15 +++ .../medicaid_ltss_home_market_value.py | 17 ++++ ...ome_occupied_by_blind_or_disabled_child.py | 16 ++++ ...id_ltss_home_occupied_by_child_under_21.py | 15 +++ .../medicaid_ltss_home_occupied_by_spouse.py | 15 +++ .../medicaid_ltss_home_ownership_share.py | 16 ++++ .../medicaid_ltss_medically_needy_expenses.py | 22 +++++ .../financial/medicaid_ltss_mmmna.py | 45 +++++++++ .../medicaid_ltss_needs_based_income.py | 20 ++++ .../medicaid_ltss_qit_adjusted_income.py | 22 +++++ .../financial/medicaid_ltss_setting.py | 26 ++++++ .../financial/medicaid_ltss_waiver.py | 30 ++++++ 57 files changed, 1115 insertions(+) create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_shelter_expenses.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_cost_of_care.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_has_community_spouse.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_encumbrances.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_hardship_waiver.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_market_value.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_blind_or_disabled_child.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_child_under_21.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_spouse.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml new file mode 100644 index 00000000000..24ba770f1e6 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml @@ -0,0 +1,11 @@ +description: Delaware uses this minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 25_000 + +metadata: + unit: currency-USD + period: month + label: Delaware minimum Medicaid LTSS community spouse resource allowance + reference: + - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml new file mode 100644 index 00000000000..d7c5cab22ee --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml @@ -0,0 +1,13 @@ +description: Delaware disregards up to this amount of monthly general income when applying the Medicaid LTSS special income limit. +values: + 2026-01-01: 20 + +metadata: + unit: currency-USD + period: month + label: Delaware Medicaid LTSS general income disregard + reference: + - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf + - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml new file mode 100644 index 00000000000..6de58cb4b34 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml @@ -0,0 +1,13 @@ +description: Delaware limits countable resources to this amount for a couple using the Medicaid LTSS financial screen. +values: + 2026-01-01: 3_000 + +metadata: + unit: currency-USD + period: month + label: Delaware Medicaid LTSS resource limit for a couple + reference: + - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf + - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml new file mode 100644 index 00000000000..e6fc806aa7b --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml @@ -0,0 +1,13 @@ +description: Delaware limits countable resources to this amount for an individual using the Medicaid LTSS financial screen. +values: + 2026-01-01: 2_000 + +metadata: + unit: currency-USD + period: month + label: Delaware Medicaid LTSS resource limit for an individual + reference: + - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf + - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml new file mode 100644 index 00000000000..61cc3149af9 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml @@ -0,0 +1,13 @@ +description: Delaware limits monthly income before its applicable general disregard to this amount for a couple using the Medicaid LTSS special income pathway. +values: + 2026-01-01: 3_727.50 + +metadata: + unit: currency-USD + period: month + label: Delaware Medicaid LTSS special income limit for a couple + reference: + - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf + - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml new file mode 100644 index 00000000000..8728334b764 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml @@ -0,0 +1,13 @@ +description: Delaware limits monthly income before its applicable general disregard to this amount for an individual using the Medicaid LTSS special income pathway. +values: + 2026-01-01: 2_485 + +metadata: + unit: currency-USD + period: month + label: Delaware Medicaid LTSS special income limit for an individual + reference: + - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf + - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml new file mode 100644 index 00000000000..457ba158cb0 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml @@ -0,0 +1,11 @@ +description: The federal maximum community spouse resource allowance for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 162_660 + +metadata: + unit: currency-USD + period: month + label: Federal maximum Medicaid LTSS community spouse resource allowance + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml new file mode 100644 index 00000000000..ba0c34fb8f9 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml @@ -0,0 +1,11 @@ +description: The federal minimum community spouse resource allowance for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 32_532 + +metadata: + unit: currency-USD + period: month + label: Federal minimum Medicaid LTSS community spouse resource allowance + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml new file mode 100644 index 00000000000..5c1b238fcb0 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml @@ -0,0 +1,11 @@ +description: The federal maximum state home equity limit for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 1_130_000 + +metadata: + unit: currency-USD + period: month + label: Federal maximum Medicaid LTSS home equity limit + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml new file mode 100644 index 00000000000..0aff7b8c326 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml @@ -0,0 +1,11 @@ +description: The federal minimum state home equity limit for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 752_000 + +metadata: + unit: currency-USD + period: month + label: Federal minimum Medicaid LTSS home equity limit + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml new file mode 100644 index 00000000000..f9e2df5c4a1 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml @@ -0,0 +1,11 @@ +description: The federal maximum monthly maintenance needs allowance for a community spouse. +values: + 2026-01-01: 4_066.50 + +metadata: + unit: currency-USD + period: month + label: Federal maximum Medicaid LTSS monthly maintenance needs allowance + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml new file mode 100644 index 00000000000..6120ed808d0 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml @@ -0,0 +1,11 @@ +description: The federal minimum monthly maintenance needs allowance for a community spouse in the contiguous states and District of Columbia. +values: + 2026-07-01: 2_705 + +metadata: + unit: currency-USD + period: month + label: Federal minimum Medicaid LTSS monthly maintenance needs allowance + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml new file mode 100644 index 00000000000..63f0355ae07 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml @@ -0,0 +1,11 @@ +description: The share of the minimum monthly maintenance needs allowance used as the community spouse excess shelter expense threshold. +values: + 2026-07-01: 0.30 + +metadata: + unit: /1 + period: month + label: Medicaid LTSS community spouse shelter expense threshold rate + reference: + - title: 42 USC 1396r-5 - Treatment of income and resources for certain institutionalized spouses + href: https://www.law.cornell.edu/uscode/text/42/1396r-5 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml new file mode 100644 index 00000000000..ae177cfefd6 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml @@ -0,0 +1,11 @@ +description: The federal Supplemental Security Income resource standard for a couple used in the Medicaid LTSS financial chassis. +values: + 2026-01-01: 3_000 + +metadata: + unit: currency-USD + period: month + label: Federal Medicaid LTSS resource standard for a couple + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml new file mode 100644 index 00000000000..286799a4568 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml @@ -0,0 +1,11 @@ +description: The federal Supplemental Security Income resource standard for an individual used in the Medicaid LTSS financial chassis. +values: + 2026-01-01: 2_000 + +metadata: + unit: currency-USD + period: month + label: Federal Medicaid LTSS resource standard for an individual + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml new file mode 100644 index 00000000000..036bdae49d4 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml @@ -0,0 +1,11 @@ +description: The federal maximum monthly special income level for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 2_982 + +metadata: + unit: currency-USD + period: month + label: Federal maximum Medicaid LTSS special income level + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml new file mode 100644 index 00000000000..ef56fd8f430 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml @@ -0,0 +1,11 @@ +description: The federal monthly Supplemental Security Income benefit rate for an eligible couple used in the Medicaid LTSS financial chassis. +values: + 2026-01-01: 1_491 + +metadata: + unit: currency-USD + period: month + label: Federal Medicaid LTSS SSI benefit rate for a couple + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml new file mode 100644 index 00000000000..74b41cd3875 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml @@ -0,0 +1,11 @@ +description: The federal monthly Supplemental Security Income benefit rate for an eligible individual used in the Medicaid LTSS financial chassis. +values: + 2026-01-01: 994 + +metadata: + unit: currency-USD + period: month + label: Federal Medicaid LTSS SSI benefit rate for an individual + reference: + - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml new file mode 100644 index 00000000000..126a4c45c75 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml @@ -0,0 +1,11 @@ +description: Texas uses this minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 32_532 + +metadata: + unit: currency-USD + period: month + label: Texas minimum Medicaid LTSS community spouse resource allowance + reference: + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml new file mode 100644 index 00000000000..392a27f0346 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml @@ -0,0 +1,11 @@ +description: Texas limits home equity to this amount for Medicaid LTSS financial eligibility unless an exception applies. +values: + 2026-01-01: 752_000 + +metadata: + unit: currency-USD + period: month + label: Texas Medicaid LTSS home equity limit + reference: + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml new file mode 100644 index 00000000000..8f73c02bfe2 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml @@ -0,0 +1,11 @@ +description: Texas limits countable resources to this amount for a couple using the Medicaid LTSS financial screen. +values: + 2026-01-01: 3_000 + +metadata: + unit: currency-USD + period: month + label: Texas Medicaid LTSS resource limit for a couple + reference: + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml new file mode 100644 index 00000000000..ce2114b5496 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml @@ -0,0 +1,11 @@ +description: Texas limits countable resources to this amount for an individual using the Medicaid LTSS financial screen. +values: + 2026-01-01: 2_000 + +metadata: + unit: currency-USD + period: month + label: Texas Medicaid LTSS resource limit for an individual + reference: + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml new file mode 100644 index 00000000000..9333a3f154e --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml @@ -0,0 +1,11 @@ +description: Texas limits monthly income to this amount for a couple using the Medicaid LTSS special income pathway. +values: + 2026-01-01: 5_964 + +metadata: + unit: currency-USD + period: month + label: Texas Medicaid LTSS special income limit for a couple + reference: + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml new file mode 100644 index 00000000000..63da01823ea --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml @@ -0,0 +1,11 @@ +description: Texas limits monthly income to this amount for an individual using the Medicaid LTSS special income pathway. +values: + 2026-01-01: 2_982 + +metadata: + unit: currency-USD + period: month + label: Texas Medicaid LTSS special income limit for an individual + reference: + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml new file mode 100644 index 00000000000..4a42c07e146 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml @@ -0,0 +1,11 @@ +description: Washington uses this minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +values: + 2026-01-01: 72_529 + +metadata: + unit: currency-USD + period: month + label: Washington minimum Medicaid LTSS community spouse resource allowance + reference: + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml new file mode 100644 index 00000000000..f9043549bab --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml @@ -0,0 +1,11 @@ +description: Washington limits home equity to this amount for Medicaid LTSS financial eligibility unless an exception applies. +values: + 2026-01-01: 1_130_000 + +metadata: + unit: currency-USD + period: month + label: Washington Medicaid LTSS home equity limit + reference: + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml new file mode 100644 index 00000000000..ff24723a8db --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -0,0 +1,11 @@ +description: Washington uses this monthly income level for a single person in the institutional medically needy pathway. +values: + 2026-01-01: 994 + +metadata: + unit: currency-USD + period: month + label: Washington institutional medically needy income level for a single person + reference: + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml new file mode 100644 index 00000000000..88b908e2eca --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml @@ -0,0 +1,11 @@ +description: Washington limits countable resources to this amount for an individual using the Medicaid LTSS financial screen. +values: + 2026-01-01: 2_000 + +metadata: + unit: currency-USD + period: month + label: Washington Medicaid LTSS resource limit for an individual + reference: + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml new file mode 100644 index 00000000000..1c817a72154 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml @@ -0,0 +1,11 @@ +description: Washington limits monthly income to this amount for an individual using the Medicaid LTSS special income pathway. +values: + 2026-01-01: 2_982 + +metadata: + unit: currency-USD + period: month + label: Washington Medicaid LTSS special income limit for an individual + reference: + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml new file mode 100644 index 00000000000..e91598a3c11 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml @@ -0,0 +1,11 @@ +description: Washington models COPES as a named Home and Community Services Medicaid HCBS waiver for the LTSS financial screen. +values: + 2026-01-01: true + +metadata: + unit: bool + period: month + label: Washington Medicaid LTSS COPES waiver enabled + reference: + - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services + href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml new file mode 100644 index 00000000000..3a3de9ea2d4 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml @@ -0,0 +1,11 @@ +description: Washington models New Freedom as a named Home and Community Services Medicaid HCBS waiver for the LTSS financial screen. +values: + 2026-01-01: true + +metadata: + unit: bool + period: month + label: Washington Medicaid LTSS New Freedom waiver enabled + reference: + - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services + href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml new file mode 100644 index 00000000000..296823f5f09 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml @@ -0,0 +1,11 @@ +description: Washington models RSW as a named Home and Community Services Medicaid HCBS waiver for the LTSS financial screen. +values: + 2026-01-01: true + +metadata: + unit: bool + period: month + label: Washington Medicaid LTSS RSW waiver enabled + reference: + - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services + href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.py new file mode 100644 index 00000000000..89f34df447e --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class is_medicaid_ltss_financial_threshold_eligible(Variable): + value_type = bool + entity = Person + label = "Meets modeled Medicaid LTSS financial thresholds" + definition_period = MONTH + documentation = ( + "is_medicaid_ltss_financial_threshold_eligible models selected state " + "and waiver financial thresholds only. It does not determine actual " + "Medicaid LTSS eligibility, service entitlement, or benefit amount." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.236", + "https://www.law.cornell.edu/uscode/text/42/1396p", + "https://www.law.cornell.edu/uscode/text/42/1396r-5", + ) + + def formula_2026_01_01(person, period, parameters): + pathway = person("medicaid_ltss_financial_pathway", period) + pathways = pathway.possible_values + return ( + (pathway != pathways.UNMODELED) + & person("is_medicaid_ltss_income_eligible", period) + & person("medicaid_ltss_csra_resource_eligible", period) + & person("medicaid_ltss_home_equity_eligible", period) + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py new file mode 100644 index 00000000000..3cd1b10210f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -0,0 +1,91 @@ +from policyengine_us.model_api import * + + +class is_medicaid_ltss_income_eligible(Variable): + value_type = bool + entity = Person + label = "Meets modeled Medicaid LTSS income threshold" + definition_period = MONTH + documentation = ( + "Tests only the income threshold for the selected modeled Medicaid " + "LTSS financial pathway. QIT-adjusted income and Washington medically " + "needy expenses and cost of care are trusted inputs; this variable " + "does not validate a trust, expense, service, or facility rate. The " + "Washington institutional branch models the WAC 182-513-1395(4) " + "payment threshold; it does not model the separate three- or " + "six-month spenddown process in subsection (5)." + ) + reference = ( + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + states = state.possible_values + setting = person("medicaid_ltss_setting", period) + settings = setting.possible_values + pathway = person("medicaid_ltss_financial_pathway", period) + pathways = pathway.possible_values + assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) + income = person("medicaid_ltss_qit_adjusted_income", period) + + special_income_limit = select( + [ + (state == states.TX) & (assistance_unit_size == 1), + (state == states.TX) & (assistance_unit_size == 2), + (state == states.DE) & (assistance_unit_size == 1), + (state == states.DE) & (assistance_unit_size == 2), + (state == states.WA) & (assistance_unit_size == 1), + ], + [ + p.tx.special_income_limit.individual, + p.tx.special_income_limit.couple, + p.de.special_income_limit.individual, + p.de.special_income_limit.couple, + p.wa.special_income_limit.individual, + ], + default=0, + ) + + needs_based_income = min_( + person("medicaid_ltss_needs_based_income", period), + income, + ) + non_needs_based_income = max_(income - needs_based_income, 0) + delaware_disregard = min_( + non_needs_based_income, + p.de.income.general_disregard, + ) + income_after_disregard = where( + state == states.DE, + max_(income - delaware_disregard, 0), + income, + ) + special_income_eligible = income_after_disregard <= special_income_limit + + medically_needy_expenses = person( + "medicaid_ltss_medically_needy_expenses", period + ) + cost_of_care = person("medicaid_ltss_cost_of_care", period) + washington_institutional_mn_eligible = (setting == settings.INSTITUTIONAL) & ( + max_(income - medically_needy_expenses, 0) <= cost_of_care + ) + washington_hcbs_mn_eligible = (setting == settings.HCBS) & ( + max_( + income - medically_needy_expenses - cost_of_care, + 0, + ) + <= p.wa.medically_needy.income_level + ) + + return ((pathway == pathways.SPECIAL_INCOME) & special_income_eligible) | ( + (pathway == pathways.INSTITUTIONAL_MEDICALLY_NEEDY) + & (state == states.WA) + & (washington_institutional_mn_eligible | washington_hcbs_mn_eligible) + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py new file mode 100644 index 00000000000..7bae076b926 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_assistance_unit_size(Variable): + value_type = int + entity = Person + label = "Medicaid LTSS assistance unit size" + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit size of the assistance unit used by the Medicaid LTSS " + "financial threshold screen. It is not inferred from a tax unit, " + "household, or marital unit. Zero is unsupported and therefore " + "fail-closed." + ) + reference = "https://www.law.cornell.edu/cfr/text/42/435.601" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py new file mode 100644 index 00000000000..e7ff04d8b62 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_community_spouse_countable_resources(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS community spouse countable resources" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted current comprehensive LTSS countable resources allocated to " + "the community spouse after applicable ownership and exclusion " + "rules. Court orders, fair-hearing adjustments, and legal ownership " + "determinations are not modeled." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_shelter_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_shelter_expenses.py new file mode 100644 index 00000000000..af4d8ae1d7b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_shelter_expenses.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_community_spouse_shelter_expenses(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS community spouse shelter expenses" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted monthly shelter expenses of the community spouse that are " + "allowable for the minimum monthly maintenance needs allowance. The " + "model does not determine which housing or utility costs qualify." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_cost_of_care.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_cost_of_care.py new file mode 100644 index 00000000000..5d167fc17e4 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_cost_of_care.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_cost_of_care(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS cost of care" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit Washington medically needy threshold input. For a medical " + "institution it is the applicable state-contracted daily rate " + "multiplied by covered days; for a named HCS waiver it is the " + "applicable average monthly state nursing-facility rate. It is " + "trusted rather than derived and does not represent a Medicaid " + "benefit amount or patient liability." + ) + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py new file mode 100644 index 00000000000..5c0e9994ce0 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_countable_resources(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS countable resources" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted comprehensive LTSS countable-resource input for the " + "applicant or applicant assistance unit after applicable state " + "exclusions, disregards, and ownership rules. When the applicant has " + "a community spouse, this input excludes resources allocated to that " + "spouse, which are supplied separately. It is not calculated from " + "PolicyEngine's narrower SSI asset inputs. The user must perform the " + "resource inventory and legal classification before supplying this " + "value." + ) + reference = "https://www.law.cornell.edu/cfr/text/42/435.601" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py new file mode 100644 index 00000000000..a0c08115554 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_couple_countable_resources_at_first_institutionalization(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS couple countable resources at first institutionalization" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted historical snapshot of the couple's total countable " + "resources at the beginning of the first continuous period of " + "institutionalization. The same snapshot should be supplied in each " + "modeled month. The model does not reconstruct or adjudicate the " + "snapshot." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py new file mode 100644 index 00000000000..5481866e8f7 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -0,0 +1,87 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_csra_resource_eligible(Variable): + value_type = bool + entity = Person + label = "Meets modeled Medicaid LTSS resource threshold after CSRA" + definition_period = MONTH + documentation = ( + "Tests trusted comprehensive LTSS countable-resource inputs. For an " + "applicant with a community spouse, the initial CSRA is the greater " + "of the applicable state/federal floor or one-half of the couple's " + "snapshot resources, capped at the federal maximum. Court and fair-" + "hearing adjustments, resource-hardship overrides, and detailed " + "state asset exclusions are not modeled." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396r-5", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + states = state.possible_values + pathway = person("medicaid_ltss_financial_pathway", period) + pathways = pathway.possible_values + assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) + resources = person("medicaid_ltss_countable_resources", period) + + resource_limit = select( + [ + (state == states.TX) & (assistance_unit_size == 1), + (state == states.TX) & (assistance_unit_size == 2), + (state == states.DE) & (assistance_unit_size == 1), + (state == states.DE) & (assistance_unit_size == 2), + (state == states.WA) & (assistance_unit_size == 1), + ], + [ + p.tx.resources.individual, + p.tx.resources.couple, + p.de.resources.individual, + p.de.resources.couple, + p.wa.resources.individual, + ], + default=0, + ) + no_community_spouse_eligible = resources <= resource_limit + + state_csra_minimum = select( + [ + state == states.TX, + state == states.DE, + state == states.WA, + ], + [ + max_(p.tx.csra.state_minimum, p.federal.csra.minimum), + max_(p.de.csra.state_minimum, p.federal.csra.minimum), + max_(p.wa.csra.state_minimum, p.federal.csra.minimum), + ], + default=0, + ) + snapshot_resources = person( + "medicaid_ltss_couple_countable_resources_at_first_institutionalization", + period, + ) + csra = min_( + max_(snapshot_resources / 2, state_csra_minimum), + p.federal.csra.maximum, + ) + current_couple_resources = resources + person( + "medicaid_ltss_community_spouse_countable_resources", + period, + ) + has_community_spouse = person("medicaid_ltss_has_community_spouse", period) + community_spouse_eligible = (assistance_unit_size == 1) & ( + current_couple_resources <= csra + resource_limit + ) + modeled_pathway = pathway != pathways.UNMODELED + + return modeled_pathway & where( + has_community_spouse, + community_spouse_eligible, + no_community_spouse_eligible, + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py new file mode 100644 index 00000000000..47fa0239f3c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -0,0 +1,79 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSFinancialPathway(Enum): + UNMODELED = "Unmodeled" + SPECIAL_INCOME = "Special income" + INSTITUTIONAL_MEDICALLY_NEEDY = "Institutional medically needy" + + +class medicaid_ltss_financial_pathway(Variable): + value_type = Enum + possible_values = MedicaidLTSSFinancialPathway + default_value = MedicaidLTSSFinancialPathway.UNMODELED + entity = Person + label = "Medicaid LTSS financial pathway" + definition_period = MONTH + documentation = ( + "Identifies the modeled financial pathway for the opt-in Medicaid " + "long-term services and supports threshold screen. Institutional " + "pathways are modeled for Texas, Delaware, and Washington. HCBS " + "pathways are modeled only for Washington's source-named COPES, New " + "Freedom, and Residential Support waivers. All other states, settings, " + "waivers, and unsupported assistance-unit sizes are unmodeled." + ) + reference = ( + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", + "https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + states = state.possible_values + setting = person("medicaid_ltss_setting", period) + settings = setting.possible_values + waiver = person("medicaid_ltss_waiver", period) + waivers = waiver.possible_values + assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) + income = person("medicaid_ltss_qit_adjusted_income", period) + + institutional = (setting == settings.INSTITUTIONAL) & (waiver == waivers.NONE) + washington_hcbs = (setting == settings.HCBS) & ( + ((waiver == waivers.WA_COPES) & p.wa.waivers.copes.enabled) + | ((waiver == waivers.WA_NEW_FREEDOM) & p.wa.waivers.new_freedom.enabled) + | ((waiver == waivers.WA_RSW) & p.wa.waivers.rsw.enabled) + ) + + texas_or_delaware_institutional = ( + institutional + & ((state == states.TX) | (state == states.DE)) + & ((assistance_unit_size == 1) | (assistance_unit_size == 2)) + ) + washington_modeled_setting = ( + (state == states.WA) + & (institutional | washington_hcbs) + & (assistance_unit_size == 1) + ) + washington_special_income = washington_modeled_setting & ( + income <= p.wa.special_income_limit.individual + ) + washington_medically_needy = washington_modeled_setting & ( + income > p.wa.special_income_limit.individual + ) + + return select( + [ + texas_or_delaware_institutional, + washington_special_income, + washington_medically_needy, + ], + [ + MedicaidLTSSFinancialPathway.SPECIAL_INCOME, + MedicaidLTSSFinancialPathway.SPECIAL_INCOME, + MedicaidLTSSFinancialPathway.INSTITUTIONAL_MEDICALLY_NEEDY, + ], + default=MedicaidLTSSFinancialPathway.UNMODELED, + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_has_community_spouse.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_has_community_spouse.py new file mode 100644 index 00000000000..adc4c96fb3d --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_has_community_spouse.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_has_community_spouse(Variable): + value_type = bool + entity = Person + label = "Has a community spouse for Medicaid LTSS" + definition_period = MONTH + default_value = False + documentation = ( + "Explicit indication that the LTSS applicant has a community spouse " + "for spousal-impoverishment protections. It is not inferred from a " + "tax, household, or marital unit." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_encumbrances.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_encumbrances.py new file mode 100644 index 00000000000..a1195000747 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_encumbrances.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_encumbrances(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS home encumbrances" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit current enforceable debt secured by the home and deducted " + "from market value before applying the applicant's ownership share " + "in the Medicaid LTSS home-equity payment-bar calculation." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py new file mode 100644 index 00000000000..6a31d7dc243 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -0,0 +1,64 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_equity_eligible(Variable): + value_type = bool + entity = Person + label = "Meets modeled Medicaid LTSS home-equity threshold" + definition_period = MONTH + documentation = ( + "Models the separate LTSS home-equity payment bar from explicit home " + "value, encumbrance, fractional-ownership, resident-exception, and " + "hardship inputs. Texas and Washington have sourced 2026 caps. " + "Delaware remains unmodeled because the cited sources do not establish " + "a state-issued numeric 2026 cap." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396p", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + states = state.possible_values + pathway = person("medicaid_ltss_financial_pathway", period) + pathways = pathway.possible_values + + home_equity_limit = select( + [state == states.TX, state == states.WA], + [p.tx.home_equity.limit, p.wa.home_equity.limit], + default=0, + ) + home_cap_is_modeled = (state == states.TX) | (state == states.WA) + home_value = person("medicaid_ltss_home_market_value", period) + encumbrances = person("medicaid_ltss_home_encumbrances", period) + ownership_share = person("medicaid_ltss_home_ownership_share", period) + valid_ownership_share = (ownership_share >= 0) & (ownership_share <= 1) + applicant_home_equity = max_(home_value - encumbrances, 0) * ownership_share + exception = ( + person("medicaid_ltss_home_occupied_by_spouse", period) + | person( + "medicaid_ltss_home_occupied_by_child_under_21", + period, + ) + | person( + "medicaid_ltss_home_occupied_by_blind_or_disabled_child", + period, + ) + | person( + "medicaid_ltss_home_equity_hardship_waiver", + period, + ) + ) + + return ( + (pathway != pathways.UNMODELED) + & valid_ownership_share + & ( + exception + | (home_cap_is_modeled & (applicant_home_equity <= home_equity_limit)) + ) + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_hardship_waiver.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_hardship_waiver.py new file mode 100644 index 00000000000..d494dcb3586 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_hardship_waiver.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_equity_hardship_waiver(Variable): + value_type = bool + entity = Person + label = "Medicaid LTSS home-equity hardship waiver" + definition_period = MONTH + default_value = False + documentation = ( + "Trusted indication that the administering agency has granted an " + "undue-hardship waiver of the Medicaid LTSS home-equity payment bar. " + "The model does not apply hardship criteria or adjudicate the waiver." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f_4" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_market_value.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_market_value.py new file mode 100644 index 00000000000..d2e1bbccb45 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_market_value.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_market_value(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS home market value" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit current market value of the home used in the separate " + "Medicaid LTSS home-equity payment-bar calculation. Home equity is " + "not treated as an ordinary countable resource by this input." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_blind_or_disabled_child.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_blind_or_disabled_child.py new file mode 100644 index 00000000000..73a56cf80e9 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_blind_or_disabled_child.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_occupied_by_blind_or_disabled_child(Variable): + value_type = bool + entity = Person + label = "Medicaid LTSS home occupied by blind or disabled child" + definition_period = MONTH + default_value = False + documentation = ( + "Explicit indication that the applicant's blind or disabled child " + "lawfully resides in the home for the Medicaid LTSS home-equity " + "exception. The model does not adjudicate disability, relationship, " + "or residence." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f_2" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_child_under_21.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_child_under_21.py new file mode 100644 index 00000000000..c7b64ab45af --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_child_under_21.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_occupied_by_child_under_21(Variable): + value_type = bool + entity = Person + label = "Medicaid LTSS home occupied by child under age 21" + definition_period = MONTH + default_value = False + documentation = ( + "Explicit indication that the applicant's child under age 21 " + "lawfully resides in the home for the Medicaid LTSS home-equity " + "exception. The model does not infer the relationship or residence." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f_2" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_spouse.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_spouse.py new file mode 100644 index 00000000000..7cafa295b19 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_occupied_by_spouse.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_occupied_by_spouse(Variable): + value_type = bool + entity = Person + label = "Medicaid LTSS home occupied by spouse" + definition_period = MONTH + default_value = False + documentation = ( + "Explicit indication that the applicant's spouse lawfully resides in " + "the home for the Medicaid LTSS home-equity exception. The model does " + "not infer residence from household membership." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f_2" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py new file mode 100644 index 00000000000..11f6893f472 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_ownership_share(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS home ownership share" + unit = "/1" + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit fractional share of the home's equity owned by the LTSS " + "applicant, from zero to one. Zero is the safe default. The model does " + "not determine title, jointly owned shares, or legal ownership." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py new file mode 100644 index 00000000000..f8fee6bb58d --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_medically_needy_expenses(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS medically needy expenses" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit monthly exclusions, post-eligibility deductions, and " + "incurred medical expenses used to derive Washington remaining or " + "net available income. This trusted input must already reflect the " + "applicable expense categories, ordering, and documentation; the " + "model does not adjudicate expenses or calculate a spenddown budget " + "period." + ) + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py new file mode 100644 index 00000000000..0bbea57e10c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_mmmna(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS minimum monthly maintenance needs allowance" + unit = USD + definition_period = MONTH + documentation = ( + "Calculates the federal MMMNA standard from the July 2026 minimum, " + "allowable community-spouse shelter expenses supplied as an explicit " + "input, and the federal maximum. It is a post-eligibility spousal " + "protection standard, not an applicant income-eligibility deduction. " + "The January-through-June 2026 minimum is left unmodeled." + ) + reference = ( + "https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf", + "https://www.law.cornell.edu/uscode/text/42/1396r-5", + ) + + def formula_2026_07_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + pathway = person("medicaid_ltss_financial_pathway", period) + pathways = pathway.possible_values + has_community_spouse = person("medicaid_ltss_has_community_spouse", period) + shelter_expenses = person( + "medicaid_ltss_community_spouse_shelter_expenses", + period, + ) + + excess_shelter_expenses = max_( + shelter_expenses + - (p.federal.mmmna.minimum * p.federal.mmmna.shelter_threshold_rate), + 0, + ) + mmmna = min_( + p.federal.mmmna.minimum + excess_shelter_expenses, + p.federal.mmmna.maximum, + ) + return where( + (pathway != pathways.UNMODELED) & has_community_spouse, + mmmna, + 0, + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py new file mode 100644 index 00000000000..77faf850fe9 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_needs_based_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS needs-based income" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted portion of QIT-adjusted income that comes from needs-based " + "sources. The Delaware general income disregard is not applied to " + "this portion. The model does not classify or allocate income " + "sources." + ) + reference = ( + "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py new file mode 100644 index 00000000000..9d23cd68038 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS QIT-adjusted income" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted monthly income input after any qualified income trust " + "treatment and applicant/spouse ownership allocation. The model does " + "not validate trust legality, irrevocability, funding, payback terms, " + "or which income was validly deposited. The user must perform those " + "determinations before supplying this value." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py new file mode 100644 index 00000000000..2b131adedb4 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSSetting(Enum): + UNKNOWN = "Unknown" + INSTITUTIONAL = "Institutional" + HCBS = "Home and community-based services" + + +class medicaid_ltss_setting(Variable): + value_type = Enum + possible_values = MedicaidLTSSSetting + default_value = MedicaidLTSSSetting.UNKNOWN + entity = Person + label = "Medicaid LTSS setting" + definition_period = MONTH + documentation = ( + "Explicit setting input for the opt-in Medicaid LTSS financial " + "threshold screen. UNKNOWN is fail-closed. This input does not " + "establish institutional level of care, functional eligibility, " + "service authorization, or receipt of services." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.236", + "https://www.law.cornell.edu/cfr/text/42/435.217", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py new file mode 100644 index 00000000000..34cb11f03dc --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSWaiver(Enum): + NONE = "None" + WA_COPES = "Washington COPES" + WA_NEW_FREEDOM = "Washington New Freedom" + WA_RSW = "Washington Residential Support Waiver" + UNKNOWN = "Unknown" + + +class medicaid_ltss_waiver(Variable): + value_type = Enum + possible_values = MedicaidLTSSWaiver + default_value = MedicaidLTSSWaiver.NONE + entity = Person + label = "Medicaid LTSS waiver" + definition_period = MONTH + documentation = ( + "Explicit named-waiver input for the opt-in Medicaid LTSS financial " + "threshold screen. UNKNOWN and unsupported waiver selections are " + "unmodeled and fail closed; they never inherit a generic statewide " + "HCBS rule. This input does not establish waiver enrollment, a slot, " + "level of care, or service authorization." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.217", + "https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", + ) From c4f7736e4f4be9c1f96f34b3fb103449d1305eff Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 30 Jul 2026 23:29:33 -0400 Subject: [PATCH 02/34] Test Medicaid LTSS financial eligibility screen --- ...aid_ltss_financial_threshold_eligible.yaml | 163 +++++++ .../is_medicaid_ltss_income_eligible.yaml | 440 ++++++++++++++++++ .../medicaid_ltss_csra_resource_eligible.yaml | 246 ++++++++++ .../medicaid_ltss_financial_pathway.yaml | 132 ++++++ .../medicaid_ltss_home_equity_eligible.yaml | 212 +++++++++ .../financial/medicaid_ltss_mmmna.yaml | 59 +++ 6 files changed, 1252 insertions(+) create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml new file mode 100644 index 00000000000..c383d17317a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -0,0 +1,163 @@ +- name: MMMNA does not convert above-SIL applicant income into eligibility. + period: 2026-07 + absolute_error_margin: 0.01 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 3_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 0 + medicaid_ltss_community_spouse_shelter_expenses: 3_000 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + medicaid_ltss_mmmna: 4_066.50 + is_medicaid_ltss_income_eligible: false + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Identical facts produce state-specific TX, DE, and WA home-equity results. + period: 2026-07 + input: + people: + texas: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_home_market_value: 800_000 + medicaid_ltss_home_ownership_share: 1 + delaware: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_home_market_value: 800_000 + medicaid_ltss_home_ownership_share: 1 + washington: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_home_market_value: 800_000 + medicaid_ltss_home_ownership_share: 1 + tax_units: + texas: + members: [texas] + delaware: + members: [delaware] + washington: + members: [washington] + marital_units: + texas: + members: [texas] + delaware: + members: [delaware] + washington: + members: [washington] + spm_units: + texas: + members: [texas] + delaware: + members: [delaware] + washington: + members: [washington] + households: + texas: + members: [texas] + state_code: + 2026: TX + delaware: + members: [delaware] + state_code: + 2026: DE + washington: + members: [washington] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] + is_medicaid_ltss_income_eligible: [true, true, true] + medicaid_ltss_csra_resource_eligible: [true, true, true] + medicaid_ltss_home_equity_eligible: [false, false, true] + is_medicaid_ltss_financial_threshold_eligible: [false, false, true] + +- name: Vectorized assistance units and explicit ownership inputs remain separate. + period: 2026-07 + input: + people: + single: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_home_market_value: 900_000 + medicaid_ltss_home_encumbrances: 200_000 + medicaid_ltss_home_ownership_share: 1 + couple: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 5_000 + medicaid_ltss_countable_resources: 3_000 + medicaid_ltss_home_market_value: 1_600_000 + medicaid_ltss_home_ownership_share: 0.5 + community_spouse: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_countable_resources: 50_000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_home_market_value: 1_500_000 + medicaid_ltss_home_ownership_share: 0.5 + tax_units: + single: + members: [single] + couple: + members: [couple] + community_spouse: + members: [community_spouse] + marital_units: + single: + members: [single] + couple: + members: [couple] + community_spouse: + members: [community_spouse] + spm_units: + single: + members: [single] + couple: + members: [couple] + community_spouse: + members: [community_spouse] + households: + single: + members: [single] + state_code: + 2026: TX + couple: + members: [couple] + state_code: + 2026: TX + community_spouse: + members: [community_spouse] + state_code: + 2026: TX + output: + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] + is_medicaid_ltss_income_eligible: [true, true, true] + medicaid_ltss_csra_resource_eligible: [true, true, true] + medicaid_ltss_home_equity_eligible: [true, false, true] + is_medicaid_ltss_financial_threshold_eligible: [true, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml new file mode 100644 index 00000000000..7bee7e22677 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -0,0 +1,440 @@ +- name: Case 1, Texas special income limit includes the exact monthly limit. + period: 2026-07 + input: + people: + below_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_981 + at_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_982 + above_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_983 + couple_below_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 5_963 + couple_at_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 5_964 + couple_above_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 5_965 + tax_units: + tax_unit_below_limit: + members: [below_limit] + tax_unit_at_limit: + members: [at_limit] + tax_unit_above_limit: + members: [above_limit] + tax_unit_couple_below_limit: + members: [couple_below_limit] + tax_unit_couple_at_limit: + members: [couple_at_limit] + tax_unit_couple_above_limit: + members: [couple_above_limit] + marital_units: + marital_unit_below_limit: + members: [below_limit] + marital_unit_at_limit: + members: [at_limit] + marital_unit_above_limit: + members: [above_limit] + marital_unit_couple_below_limit: + members: [couple_below_limit] + marital_unit_couple_at_limit: + members: [couple_at_limit] + marital_unit_couple_above_limit: + members: [couple_above_limit] + spm_units: + spm_unit_below_limit: + members: [below_limit] + spm_unit_at_limit: + members: [at_limit] + spm_unit_above_limit: + members: [above_limit] + spm_unit_couple_below_limit: + members: [couple_below_limit] + spm_unit_couple_at_limit: + members: [couple_at_limit] + spm_unit_couple_above_limit: + members: [couple_above_limit] + households: + household_below_limit: + members: [below_limit] + state_code: + 2026: TX + household_at_limit: + members: [at_limit] + state_code: + 2026: TX + household_above_limit: + members: [above_limit] + state_code: + 2026: TX + household_couple_below_limit: + members: [couple_below_limit] + state_code: + 2026: TX + household_couple_at_limit: + members: [couple_at_limit] + state_code: + 2026: TX + household_couple_above_limit: + members: [couple_above_limit] + state_code: + 2026: TX + output: + is_medicaid_ltss_income_eligible: + [true, true, false, true, true, false] + +- name: Case 2, Texas valid QIT is sufficient when trusted adjusted income is at the limit. + period: 2026-07 + input: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_982 + state_code: + 2026: TX + output: + is_medicaid_ltss_income_eligible: true + +- name: Case 3, Texas valid QIT is insufficient when trusted adjusted income remains above the limit. + period: 2026-07 + input: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_983 + state_code: + 2026: TX + output: + is_medicaid_ltss_income_eligible: false + +- name: Case 4, Delaware needs-based income receives no general disregard. + period: 2026-07 + input: + people: + below_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_484 + medicaid_ltss_needs_based_income: 2_484 + at_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_485 + medicaid_ltss_needs_based_income: 2_485 + above_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_486 + medicaid_ltss_needs_based_income: 2_486 + couple_below_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 3_727 + medicaid_ltss_needs_based_income: 3_727 + couple_at_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 3_727.50 + medicaid_ltss_needs_based_income: 3_727.50 + couple_above_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 3_728 + medicaid_ltss_needs_based_income: 3_728 + tax_units: + tax_unit_below_limit: + members: [below_limit] + tax_unit_at_limit: + members: [at_limit] + tax_unit_above_limit: + members: [above_limit] + tax_unit_couple_below_limit: + members: [couple_below_limit] + tax_unit_couple_at_limit: + members: [couple_at_limit] + tax_unit_couple_above_limit: + members: [couple_above_limit] + marital_units: + marital_unit_below_limit: + members: [below_limit] + marital_unit_at_limit: + members: [at_limit] + marital_unit_above_limit: + members: [above_limit] + marital_unit_couple_below_limit: + members: [couple_below_limit] + marital_unit_couple_at_limit: + members: [couple_at_limit] + marital_unit_couple_above_limit: + members: [couple_above_limit] + spm_units: + spm_unit_below_limit: + members: [below_limit] + spm_unit_at_limit: + members: [at_limit] + spm_unit_above_limit: + members: [above_limit] + spm_unit_couple_below_limit: + members: [couple_below_limit] + spm_unit_couple_at_limit: + members: [couple_at_limit] + spm_unit_couple_above_limit: + members: [couple_above_limit] + households: + household_below_limit: + members: [below_limit] + state_code: + 2026: DE + household_at_limit: + members: [at_limit] + state_code: + 2026: DE + household_above_limit: + members: [above_limit] + state_code: + 2026: DE + household_couple_below_limit: + members: [couple_below_limit] + state_code: + 2026: DE + household_couple_at_limit: + members: [couple_at_limit] + state_code: + 2026: DE + household_couple_above_limit: + members: [couple_above_limit] + state_code: + 2026: DE + output: + is_medicaid_ltss_income_eligible: + [true, true, false, true, true, false] + +- name: Case 5, Delaware applies the general disregard to ordinary income. + period: 2026-07 + input: + people: + below_limit_after_disregard: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_504 + medicaid_ltss_needs_based_income: 0 + at_limit_after_disregard: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_505 + medicaid_ltss_needs_based_income: 0 + above_limit_after_disregard: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_506 + medicaid_ltss_needs_based_income: 0 + couple_below_limit_after_disregard: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 3_747 + medicaid_ltss_needs_based_income: 0 + couple_at_limit_after_disregard: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 3_747.50 + medicaid_ltss_needs_based_income: 0 + couple_above_limit_after_disregard: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_qit_adjusted_income: 3_748 + medicaid_ltss_needs_based_income: 0 + tax_units: + tax_unit_below_limit_after_disregard: + members: [below_limit_after_disregard] + tax_unit_at_limit_after_disregard: + members: [at_limit_after_disregard] + tax_unit_above_limit_after_disregard: + members: [above_limit_after_disregard] + tax_unit_couple_below_limit_after_disregard: + members: [couple_below_limit_after_disregard] + tax_unit_couple_at_limit_after_disregard: + members: [couple_at_limit_after_disregard] + tax_unit_couple_above_limit_after_disregard: + members: [couple_above_limit_after_disregard] + marital_units: + marital_unit_below_limit_after_disregard: + members: [below_limit_after_disregard] + marital_unit_at_limit_after_disregard: + members: [at_limit_after_disregard] + marital_unit_above_limit_after_disregard: + members: [above_limit_after_disregard] + marital_unit_couple_below_limit_after_disregard: + members: [couple_below_limit_after_disregard] + marital_unit_couple_at_limit_after_disregard: + members: [couple_at_limit_after_disregard] + marital_unit_couple_above_limit_after_disregard: + members: [couple_above_limit_after_disregard] + spm_units: + spm_unit_below_limit_after_disregard: + members: [below_limit_after_disregard] + spm_unit_at_limit_after_disregard: + members: [at_limit_after_disregard] + spm_unit_above_limit_after_disregard: + members: [above_limit_after_disregard] + spm_unit_couple_below_limit_after_disregard: + members: [couple_below_limit_after_disregard] + spm_unit_couple_at_limit_after_disregard: + members: [couple_at_limit_after_disregard] + spm_unit_couple_above_limit_after_disregard: + members: [couple_above_limit_after_disregard] + households: + household_below_limit_after_disregard: + members: [below_limit_after_disregard] + state_code: + 2026: DE + household_at_limit_after_disregard: + members: [at_limit_after_disregard] + state_code: + 2026: DE + household_above_limit_after_disregard: + members: [above_limit_after_disregard] + state_code: + 2026: DE + household_couple_below_limit_after_disregard: + members: [couple_below_limit_after_disregard] + state_code: + 2026: DE + household_couple_at_limit_after_disregard: + members: [couple_at_limit_after_disregard] + state_code: + 2026: DE + household_couple_above_limit_after_disregard: + members: [couple_above_limit_after_disregard] + state_code: + 2026: DE + output: + is_medicaid_ltss_income_eligible: + [true, true, false, true, true, false] + +- name: Case 6, Delaware does not disregard needs-based income above the limit. + period: 2026-07 + input: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_505 + medicaid_ltss_needs_based_income: 2_505 + state_code: + 2026: DE + output: + is_medicaid_ltss_income_eligible: false + +- name: Case 7, Washington switches to medically needy above the special income limit. + period: 2026-07 + input: + people: + below_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_981 + at_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_982 + above_limit: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_983 + tax_units: + tax_unit_below_limit: + members: [below_limit] + tax_unit_at_limit: + members: [at_limit] + tax_unit_above_limit: + members: [above_limit] + marital_units: + marital_unit_below_limit: + members: [below_limit] + marital_unit_at_limit: + members: [at_limit] + marital_unit_above_limit: + members: [above_limit] + spm_units: + spm_unit_below_limit: + members: [below_limit] + spm_unit_at_limit: + members: [at_limit] + spm_unit_above_limit: + members: [above_limit] + households: + household_below_limit: + members: [below_limit] + state_code: + 2026: WA + household_at_limit: + members: [at_limit] + state_code: + 2026: WA + household_above_limit: + members: [above_limit] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, INSTITUTIONAL_MEDICALLY_NEEDY] + is_medicaid_ltss_income_eligible: [true, true, false] + +- name: Case 8, Washington institutional medically needy income can equal cost of care. + period: 2026-07 + input: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 3_500 + state_code: + 2026: WA + output: + is_medicaid_ltss_income_eligible: true + +- name: Case 9, Washington institutional medically needy income above cost of care fails. + period: 2026-07 + input: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 3_499 + state_code: + 2026: WA + output: + is_medicaid_ltss_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml new file mode 100644 index 00000000000..8994ef1e694 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -0,0 +1,246 @@ +- name: Case 1, Texas individual resource limit includes the exact boundary. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 1_999 + at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 2_000 + above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 2_001 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + below_household: + members: [below] + state_code: + 2026: TX + at_household: + members: [at] + state_code: + 2026: TX + above_household: + members: [above] + state_code: + 2026: TX + output: + medicaid_ltss_csra_resource_eligible: [true, true, false] + +- name: Case 2, Texas couple resource limit includes the exact boundary. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 2_999 + at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_000 + above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_001 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + below_household: + members: [below] + state_code: + 2026: TX + at_household: + members: [at] + state_code: + 2026: TX + above_household: + members: [above] + state_code: + 2026: TX + output: + medicaid_ltss_csra_resource_eligible: [true, true, false] + +- name: Case 3, Delaware couple resource limit includes the exact boundary. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 2_999 + at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_000 + above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_001 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + below_household: + members: [below] + state_code: + 2026: DE + at_household: + members: [at] + state_code: + 2026: DE + above_household: + members: [above] + state_code: + 2026: DE + output: + medicaid_ltss_csra_resource_eligible: [true, true, false] + +- name: Case 4, Washington assistance unit of two is unmodeled and fails closed. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 0 + output: + medicaid_ltss_financial_pathway: UNMODELED + medicaid_ltss_csra_resource_eligible: false + +- name: Case 5, the CSRA floor controls when half of snapshot resources is lower. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 60_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 32_532 + output: + medicaid_ltss_csra_resource_eligible: true + +- name: Case 6, half of snapshot resources controls between the CSRA bounds. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 50_000 + output: + medicaid_ltss_csra_resource_eligible: true + +- name: Case 7, the federal CSRA maximum controls when half of snapshot resources is higher. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_660 + output: + medicaid_ltss_csra_resource_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml new file mode 100644 index 00000000000..aafed5a7e82 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -0,0 +1,132 @@ +- name: Texas institutional assistance unit of one uses the special income pathway. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Delaware institutional assistance unit of one uses the special income pathway. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Washington institutional income at the special income limit uses that pathway. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_982 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Washington institutional income above the special income limit uses medically needy. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_983 + output: + medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY + +- name: Washington COPES income at the special income limit uses that pathway. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: HCBS + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_982 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Washington named HCBS waivers vectorize across the income pathway boundary. + period: 2026-07 + input: + people: + new_freedom_applicant: + medicaid_ltss_setting: HCBS + medicaid_ltss_waiver: WA_NEW_FREEDOM + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_982 + rsw_applicant: + medicaid_ltss_setting: HCBS + medicaid_ltss_waiver: WA_RSW + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_983 + families: + new_freedom_family: + members: [new_freedom_applicant] + rsw_family: + members: [rsw_applicant] + marital_units: + new_freedom_marital_unit: + members: [new_freedom_applicant] + rsw_marital_unit: + members: [rsw_applicant] + tax_units: + new_freedom_tax_unit: + members: [new_freedom_applicant] + rsw_tax_unit: + members: [rsw_applicant] + spm_units: + new_freedom_spm_unit: + members: [new_freedom_applicant] + rsw_spm_unit: + members: [rsw_applicant] + households: + new_freedom_household: + members: [new_freedom_applicant] + state_code: + 2026: WA + rsw_household: + members: [rsw_applicant] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: + - SPECIAL_INCOME + - INSTITUTIONAL_MEDICALLY_NEEDY + +- name: Washington unknown HCBS waiver is unmodeled and fails every financial screen. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: HCBS + medicaid_ltss_waiver: UNKNOWN + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_income_eligible: false + medicaid_ltss_csra_resource_eligible: false + medicaid_ltss_home_equity_eligible: false + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Texas HCBS cannot use a Washington named waiver pathway. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: HCBS + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml new file mode 100644 index 00000000000..5b9f64e07ea --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml @@ -0,0 +1,212 @@ +- name: Case 1, Texas home-equity cap includes the exact boundary. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 751_999 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + below_household: + members: [below] + state_code: + 2026: TX + at_household: + members: [at] + state_code: + 2026: TX + above_household: + members: [above] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [true, true, false] + +- name: Case 2, Washington home-equity cap includes the exact boundary. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 1_129_999 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 1_130_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 1_130_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + below_household: + members: [below] + state_code: + 2026: WA + at_household: + members: [at] + state_code: + 2026: WA + above_household: + members: [above] + state_code: + 2026: WA + output: + medicaid_ltss_home_equity_eligible: [true, true, false] + +- name: Case 3, a resident spouse exception applies above the Texas cap. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + medicaid_ltss_home_occupied_by_spouse: true + output: + medicaid_ltss_home_equity_eligible: true + +- name: Case 4, a resident child under age 21 exception applies above the Texas cap. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + medicaid_ltss_home_occupied_by_child_under_21: true + output: + medicaid_ltss_home_equity_eligible: true + +- name: Case 5, a resident blind or disabled child exception applies above the Texas cap. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + medicaid_ltss_home_occupied_by_blind_or_disabled_child: true + output: + medicaid_ltss_home_equity_eligible: true + +- name: Case 6, a granted hardship waiver applies above the Texas cap. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + medicaid_ltss_home_equity_hardship_waiver: true + output: + medicaid_ltss_home_equity_eligible: true + +- name: Case 7, Delaware remains fail-closed without a modeled numeric home-equity cap. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + medicaid_ltss_home_equity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml new file mode 100644 index 00000000000..5c23ce6048c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -0,0 +1,59 @@ +- name: Federal July 2026 MMMNA uses the base, shelter threshold, and maximum. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + base: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 0 + shelter_threshold: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 811.50 + maximum: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 2_173 + tax_units: + base: + members: [base] + shelter_threshold: + members: [shelter_threshold] + maximum: + members: [maximum] + marital_units: + base: + members: [base] + shelter_threshold: + members: [shelter_threshold] + maximum: + members: [maximum] + spm_units: + base: + members: [base] + shelter_threshold: + members: [shelter_threshold] + maximum: + members: [maximum] + households: + base: + members: [base] + state_code: + 2026: TX + shelter_threshold: + members: [shelter_threshold] + state_code: + 2026: TX + maximum: + members: [maximum] + state_code: + 2026: TX + output: + medicaid_ltss_mmmna: [2_705, 2_705, 4_066.50] From c6b63e31a63a3ab32a3faecbf900830d39cc6486 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 30 Jul 2026 23:29:44 -0400 Subject: [PATCH 03/34] Add LTSS eligibility changelog fragment --- changelog.d/ltss-financial-eligibility.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/ltss-financial-eligibility.added.md diff --git a/changelog.d/ltss-financial-eligibility.added.md b/changelog.d/ltss-financial-eligibility.added.md new file mode 100644 index 00000000000..1e43eadfa4f --- /dev/null +++ b/changelog.d/ltss-financial-eligibility.added.md @@ -0,0 +1 @@ +Add an opt-in 2026 Medicaid LTSS financial-threshold screen for selected institutional and named-waiver pathways in Texas, Delaware, and Washington. From 733bb99ff25bd5583d435d623611c79c099d8329 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 30 Jul 2026 23:35:28 -0400 Subject: [PATCH 04/34] Complete LTSS resource boundary coverage --- .../medicaid_ltss_csra_resource_eligible.yaml | 143 ++++++++++++++++-- 1 file changed, 132 insertions(+), 11 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 8994ef1e694..8120f663032 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -124,7 +124,7 @@ output: medicaid_ltss_csra_resource_eligible: [true, true, false] -- name: Case 3, Delaware couple resource limit includes the exact boundary. +- name: Case 3, Delaware individual and couple resource limits include their exact boundaries. period: 2026-07 input: people: @@ -143,6 +143,21 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 3_001 + individual_below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 1_999 + individual_at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 2_000 + individual_above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 2_001 tax_units: below_tax_unit: members: [below] @@ -150,6 +165,12 @@ members: [at] above_tax_unit: members: [above] + individual_below_tax_unit: + members: [individual_below] + individual_at_tax_unit: + members: [individual_at] + individual_above_tax_unit: + members: [individual_above] families: below_family: members: [below] @@ -157,6 +178,12 @@ members: [at] above_family: members: [above] + individual_below_family: + members: [individual_below] + individual_at_family: + members: [individual_at] + individual_above_family: + members: [individual_above] spm_units: below_spm_unit: members: [below] @@ -164,6 +191,12 @@ members: [at] above_spm_unit: members: [above] + individual_below_spm_unit: + members: [individual_below] + individual_at_spm_unit: + members: [individual_at] + individual_above_spm_unit: + members: [individual_above] marital_units: below_marital_unit: members: [below] @@ -171,6 +204,12 @@ members: [at] above_marital_unit: members: [above] + individual_below_marital_unit: + members: [individual_below] + individual_at_marital_unit: + members: [individual_at] + individual_above_marital_unit: + members: [individual_above] households: below_household: members: [below] @@ -184,21 +223,103 @@ members: [above] state_code: 2026: DE + individual_below_household: + members: [individual_below] + state_code: + 2026: DE + individual_at_household: + members: [individual_at] + state_code: + 2026: DE + individual_above_household: + members: [individual_above] + state_code: + 2026: DE output: - medicaid_ltss_csra_resource_eligible: [true, true, false] + medicaid_ltss_csra_resource_eligible: + [true, true, false, true, true, false] -- name: Case 4, Washington assistance unit of two is unmodeled and fails closed. +- name: Case 4, Washington individual resource boundary is inclusive and assistance unit of two fails closed. period: 2026-07 input: - state_code: - 2026: WA - medicaid_ltss_setting: INSTITUTIONAL - medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 0 + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 1_999 + at: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 2_000 + above: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_countable_resources: 2_001 + unsupported_couple: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 0 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + unsupported_couple_tax_unit: + members: [unsupported_couple] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + unsupported_couple_family: + members: [unsupported_couple] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + unsupported_couple_spm_unit: + members: [unsupported_couple] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + unsupported_couple_marital_unit: + members: [unsupported_couple] + households: + below_household: + members: [below] + state_code: + 2026: WA + at_household: + members: [at] + state_code: + 2026: WA + above_household: + members: [above] + state_code: + 2026: WA + unsupported_couple_household: + members: [unsupported_couple] + state_code: + 2026: WA output: - medicaid_ltss_financial_pathway: UNMODELED - medicaid_ltss_csra_resource_eligible: false + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, UNMODELED] + medicaid_ltss_csra_resource_eligible: [true, true, false, false] - name: Case 5, the CSRA floor controls when half of snapshot resources is lower. period: 2026-07 From 02a7c0b95d5a555bf84d0d1c08f12e046eec535e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 30 Jul 2026 23:39:02 -0400 Subject: [PATCH 05/34] Harden LTSS source and pathway coverage --- .../wa/medically_needy/income_level.yaml | 4 ++ .../financial/wa/resources/individual.yaml | 4 ++ .../wa/special_income_limit/individual.yaml | 4 ++ .../financial/wa/waivers/copes/enabled.yaml | 2 + .../wa/waivers/new_freedom/enabled.yaml | 2 + .../financial/wa/waivers/rsw/enabled.yaml | 2 + .../medicaid_ltss_csra_resource_eligible.yaml | 57 +++++++++++++++---- .../medicaid_ltss_financial_pathway.yaml | 5 +- 8 files changed, 69 insertions(+), 11 deletions(-) diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml index ff24723a8db..2b8db723ac4 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -9,3 +9,7 @@ metadata: reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 + - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml index 88b908e2eca..7364d2ee3e6 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml @@ -9,3 +9,7 @@ metadata: reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 + - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml index 1c817a72154..8ee274f6f59 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml @@ -9,3 +9,7 @@ metadata: reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 + - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml index e91598a3c11..4999614e36c 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml @@ -9,3 +9,5 @@ metadata: reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs + - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml index 3a3de9ea2d4..fa791e639d4 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml @@ -9,3 +9,5 @@ metadata: reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs + - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml index 296823f5f09..ac41ceba3ec 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml @@ -9,3 +9,5 @@ metadata: reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs + - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 8120f663032..7d02bb3a77f 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -354,14 +354,51 @@ - name: Case 7, the federal CSRA maximum controls when half of snapshot resources is higher. period: 2026-07 input: - state_code: - 2026: TX - medicaid_ltss_setting: INSTITUTIONAL - medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_660 + people: + at_maximum: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_660 + above_maximum: + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_661 + tax_units: + at_maximum_tax_unit: + members: [at_maximum] + above_maximum_tax_unit: + members: [above_maximum] + families: + at_maximum_family: + members: [at_maximum] + above_maximum_family: + members: [above_maximum] + spm_units: + at_maximum_spm_unit: + members: [at_maximum] + above_maximum_spm_unit: + members: [above_maximum] + marital_units: + at_maximum_marital_unit: + members: [at_maximum] + above_maximum_marital_unit: + members: [above_maximum] + households: + at_maximum_household: + members: [at_maximum] + state_code: + 2026: TX + above_maximum_household: + members: [above_maximum] + state_code: + 2026: TX output: - medicaid_ltss_csra_resource_eligible: true + medicaid_ltss_csra_resource_eligible: [true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index aafed5a7e82..1a16d2021b2 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -69,7 +69,9 @@ medicaid_ltss_setting: HCBS medicaid_ltss_waiver: WA_RSW medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_983 + medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 2_506 families: new_freedom_family: members: [new_freedom_applicant] @@ -103,6 +105,7 @@ medicaid_ltss_financial_pathway: - SPECIAL_INCOME - INSTITUTIONAL_MEDICALLY_NEEDY + is_medicaid_ltss_income_eligible: [true, true] - name: Washington unknown HCBS waiver is unmodeled and fails every financial screen. period: 2026-07 From e1ccdd5aa951423e2d35a626352fd8217d03bd15 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 19 Aug 2026 20:56:58 -0400 Subject: [PATCH 06/34] Address DTrim99 review: DE home-equity cap, state MMMNA regimes, ABD gate - Give Delaware the CPI-indexed federal-minimum home-equity cap (DSSM 20320.7.B/E) via a new long_term_care/home_equity/minimum_limit parameter; Texas reads the same minimum and Washington reads the existing tracked maximum-tier limit (WAC 182-513-1350(8)(c)). - Pass zero-equity applicants everywhere (42 USC 1396p(f)(1)(A)); unmodeled states pass at or below the federal minimum and fail closed above it. - Pay the Texas MMMNA as the flat federal maximum (Appendix XXXI; MEPD J-7200); Delaware and Washington keep the federal formula (DSSM 20910.4-.6; WAC 182-513-1385). - Gate the SSI-related pathways on is_ssi_aged_blind_disabled (42 CFR 435.236, 435.1005). - Delete the seven orphan federal parameters and the parallel home-equity parameter tree; cross-reference the annual chassis. - Sharpen references (CIB subject lines and page anchors, DSSM section titles, TX revision stamp, WA odd-year note, 1396r-5(d)(4), canonical WAC links) and grow the suite from 35 to 59 tests. Co-Authored-By: Claude Fable 5 --- .../financial/de/csra/state_minimum.yaml | 4 +- .../de/income/general_disregard.yaml | 4 +- .../financial/de/resources/couple.yaml | 4 +- .../financial/de/resources/individual.yaml | 4 +- .../de/special_income_limit/couple.yaml | 4 +- .../de/special_income_limit/individual.yaml | 4 +- .../financial/federal/csra/maximum.yaml | 4 +- .../financial/federal/csra/minimum.yaml | 4 +- .../federal/home_equity/maximum.yaml | 11 - .../federal/home_equity/minimum.yaml | 11 - .../financial/federal/mmmna/maximum.yaml | 4 +- .../financial/federal/mmmna/minimum.yaml | 4 +- .../federal/mmmna/shelter_threshold_rate.yaml | 6 +- .../financial/federal/resources/couple.yaml | 11 - .../federal/resources/individual.yaml | 11 - .../federal/special_income_limit/maximum.yaml | 11 - .../financial/federal/ssi_fbr/couple.yaml | 11 - .../financial/federal/ssi_fbr/individual.yaml | 11 - .../financial/tx/csra/state_minimum.yaml | 4 +- .../financial/tx/home_equity/limit.yaml | 11 - .../financial/tx/resources/couple.yaml | 2 +- .../financial/tx/resources/individual.yaml | 2 +- .../tx/special_income_limit/couple.yaml | 2 +- .../tx/special_income_limit/individual.yaml | 2 +- .../financial/wa/csra/state_minimum.yaml | 4 +- .../financial/wa/home_equity/limit.yaml | 11 - .../wa/medically_needy/income_level.yaml | 2 +- .../financial/wa/resources/individual.yaml | 2 +- .../wa/special_income_limit/individual.yaml | 4 +- .../financial/wa/waivers/copes/enabled.yaml | 2 +- .../wa/waivers/new_freedom/enabled.yaml | 2 +- .../financial/wa/waivers/rsw/enabled.yaml | 2 +- .../home_equity/minimum_limit.yaml | 16 ++ ...aid_ltss_financial_threshold_eligible.yaml | 137 +++++++++ .../is_medicaid_ltss_income_eligible.yaml | 164 +++++++++++ .../medicaid_ltss_csra_resource_eligible.yaml | 213 ++++++++++++++ .../medicaid_ltss_financial_pathway.yaml | 78 ++++- .../medicaid_ltss_home_equity_eligible.yaml | 268 +++++++++++++++++- .../financial/medicaid_ltss_mmmna.yaml | 209 +++++++++++++- ...aid_long_term_care_home_equity_eligible.py | 7 + .../is_medicaid_ltss_income_eligible.py | 10 +- .../medicaid_ltss_csra_resource_eligible.py | 15 +- .../medicaid_ltss_financial_pathway.py | 19 +- .../medicaid_ltss_home_equity_eligible.py | 47 ++- .../financial/medicaid_ltss_mmmna.py | 36 ++- .../medicaid_ltss_qit_adjusted_income.py | 9 +- .../financial/medicaid_ltss_waiver.py | 2 +- 47 files changed, 1211 insertions(+), 194 deletions(-) delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml index 24ba770f1e6..4b782bae9c2 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml @@ -1,4 +1,4 @@ -description: Delaware uses this minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +description: Delaware uses this state spousal share as the minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility, though the higher federal minimum resource allowance supersedes it. values: 2026-01-01: 25_000 @@ -7,5 +7,5 @@ metadata: period: month label: Delaware minimum Medicaid LTSS community spouse resource allowance reference: - - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + - title: DSSM 20910.10 - Community Spouse Resource Allowance, 16 DE Admin Code 20000 href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml index d7c5cab22ee..981e43e2ace 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml @@ -7,7 +7,7 @@ metadata: period: month label: Delaware Medicaid LTSS general income disregard reference: - - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + - title: DSSM 20240.1 - Gross Income; DSSM 20990 - Income Rules, 16 DE Admin Code 20000 href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml index 6de58cb4b34..a4cb5a10530 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml @@ -7,7 +7,7 @@ metadata: period: month label: Delaware Medicaid LTSS resource limit for a couple reference: - - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml index e6fc806aa7b..5e6e59d2648 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml @@ -7,7 +7,7 @@ metadata: period: month label: Delaware Medicaid LTSS resource limit for an individual reference: - - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml index 61cc3149af9..cdbeb1a6da0 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml @@ -7,7 +7,7 @@ metadata: period: month label: Delaware Medicaid LTSS special income limit for a couple reference: - - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml index 8728334b764..e178d502a0f 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml @@ -7,7 +7,7 @@ metadata: period: month label: Delaware Medicaid LTSS special income limit for an individual reference: - - title: Delaware 2026 SSI Related Income Standards and Medicare Premiums + - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: Delaware Administrative Code, Title 16, Division of Social Services Manual - Long-Term Care + - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml index 457ba158cb0..12b6946e953 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Federal maximum Medicaid LTSS community spouse resource allowance reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml index ba0c34fb8f9..b5d68d2555d 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Federal minimum Medicaid LTSS community spouse resource allowance reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml deleted file mode 100644 index 5c1b238fcb0..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/maximum.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal maximum state home equity limit for Medicaid LTSS financial eligibility. -values: - 2026-01-01: 1_130_000 - -metadata: - unit: currency-USD - period: month - label: Federal maximum Medicaid LTSS home equity limit - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml deleted file mode 100644 index 0aff7b8c326..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/home_equity/minimum.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal minimum state home equity limit for Medicaid LTSS financial eligibility. -values: - 2026-01-01: 752_000 - -metadata: - unit: currency-USD - period: month - label: Federal minimum Medicaid LTSS home equity limit - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml index f9e2df5c4a1..c790d4c9206 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Federal maximum Medicaid LTSS monthly maintenance needs allowance reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml index 6120ed808d0..1f10aa6411c 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Federal minimum Medicaid LTSS monthly maintenance needs allowance reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml index 63f0355ae07..e7cf752b7e3 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml @@ -1,11 +1,11 @@ description: The share of the minimum monthly maintenance needs allowance used as the community spouse excess shelter expense threshold. values: - 2026-07-01: 0.30 + 2026-07-01: 0.3 metadata: unit: /1 period: month label: Medicaid LTSS community spouse shelter expense threshold rate reference: - - title: 42 USC 1396r-5 - Treatment of income and resources for certain institutionalized spouses - href: https://www.law.cornell.edu/uscode/text/42/1396r-5 + - title: 42 USC 1396r-5(d)(4) - Excess shelter allowance + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#d_4 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml deleted file mode 100644 index ae177cfefd6..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/couple.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal Supplemental Security Income resource standard for a couple used in the Medicaid LTSS financial chassis. -values: - 2026-01-01: 3_000 - -metadata: - unit: currency-USD - period: month - label: Federal Medicaid LTSS resource standard for a couple - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml deleted file mode 100644 index 286799a4568..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/resources/individual.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal Supplemental Security Income resource standard for an individual used in the Medicaid LTSS financial chassis. -values: - 2026-01-01: 2_000 - -metadata: - unit: currency-USD - period: month - label: Federal Medicaid LTSS resource standard for an individual - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml deleted file mode 100644 index 036bdae49d4..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/special_income_limit/maximum.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal maximum monthly special income level for Medicaid LTSS financial eligibility. -values: - 2026-01-01: 2_982 - -metadata: - unit: currency-USD - period: month - label: Federal maximum Medicaid LTSS special income level - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml deleted file mode 100644 index ef56fd8f430..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/couple.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal monthly Supplemental Security Income benefit rate for an eligible couple used in the Medicaid LTSS financial chassis. -values: - 2026-01-01: 1_491 - -metadata: - unit: currency-USD - period: month - label: Federal Medicaid LTSS SSI benefit rate for a couple - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml deleted file mode 100644 index 74b41cd3875..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/ssi_fbr/individual.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: The federal monthly Supplemental Security Income benefit rate for an eligible individual used in the Medicaid LTSS financial chassis. -values: - 2026-01-01: 994 - -metadata: - unit: currency-USD - period: month - label: Federal Medicaid LTSS SSI benefit rate for an individual - reference: - - title: CMS Informational Bulletin - 2026 SSI and Spousal Impoverishment Standards - href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml index 126a4c45c75..b1732279992 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml @@ -1,4 +1,4 @@ -description: Texas uses this minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +description: Texas adopts the minimum resource amount set by federal law when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. values: 2026-01-01: 32_532 @@ -7,5 +7,5 @@ metadata: period: month label: Texas minimum Medicaid LTSS community spouse resource allowance reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml deleted file mode 100644 index 392a27f0346..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/home_equity/limit.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Texas limits home equity to this amount for Medicaid LTSS financial eligibility unless an exception applies. -values: - 2026-01-01: 752_000 - -metadata: - unit: currency-USD - period: month - label: Texas Medicaid LTSS home equity limit - reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart - href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml index 8f73c02bfe2..831836ceb54 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Texas Medicaid LTSS resource limit for a couple reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml index ce2114b5496..d384fc1047c 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Texas Medicaid LTSS resource limit for an individual reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml index 9333a3f154e..914ca528c88 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Texas Medicaid LTSS special income limit for a couple reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml index 63da01823ea..85b720d7385 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml @@ -7,5 +7,5 @@ metadata: period: month label: Texas Medicaid LTSS special income limit for an individual reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml index 4a42c07e146..6b08d4f3bb7 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml @@ -1,4 +1,4 @@ -description: Washington uses this minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +description: Washington uses this minimum, which its standards chart stamps July 1, 2025 and revises on a July odd-year cycle, when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. values: 2026-01-01: 72_529 @@ -8,4 +8,4 @@ metadata: label: Washington minimum Medicaid LTSS community spouse resource allowance reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 - href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml deleted file mode 100644 index f9043549bab..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/home_equity/limit.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Washington limits home equity to this amount for Medicaid LTSS financial eligibility unless an exception applies. -values: - 2026-01-01: 1_130_000 - -metadata: - unit: currency-USD - period: month - label: Washington Medicaid LTSS home equity limit - reference: - - title: Washington Apple Health Income and Resource Standards, January 1, 2026 - href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml index 2b8db723ac4..0f45b42b6df 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -8,7 +8,7 @@ metadata: label: Washington institutional medically needy income level for a single person reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 - href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml index 7364d2ee3e6..d05d92e4cb7 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml @@ -8,7 +8,7 @@ metadata: label: Washington Medicaid LTSS resource limit for an individual reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 - href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml index 8ee274f6f59..c45c7d2beda 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml @@ -8,8 +8,10 @@ metadata: label: Washington Medicaid LTSS special income limit for an individual reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 - href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 + - title: WAC 182-513-1100 - Definitions, special income level (SIL) + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1100 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml index 4999614e36c..b5e00fc0169 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml @@ -8,6 +8,6 @@ metadata: label: Washington Medicaid LTSS COPES waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services - href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml index fa791e639d4..94eb5aeb959 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml @@ -8,6 +8,6 @@ metadata: label: Washington Medicaid LTSS New Freedom waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services - href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml index ac41ceba3ec..de59dd39a59 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml @@ -8,6 +8,6 @@ metadata: label: Washington Medicaid LTSS RSW waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services - href: https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml new file mode 100644 index 00000000000..c1112208424 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml @@ -0,0 +1,16 @@ +description: The Department of Health and Human Services applies this federal minimum limit on home equity for Medicaid long-term care eligibility in states that do not elect a higher limit. +values: + 2025-01-01: 730_000 + 2026-01-01: 752_000 + +metadata: + unit: currency-USD + period: year + label: Medicaid long-term care federal minimum home equity limit + reference: + - title: 42 USC 1396p(f)(1)(A) and (C) - Disqualification for long-term care assistance for individuals with substantial home equity + href: https://www.law.cornell.edu/uscode/text/42/1396p#f_1 + - title: Updated 2025 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, May 28, 2025 + href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib05282025.pdf#page=2 + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index c383d17317a..258a05eb8c8 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -5,6 +5,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 3_000 @@ -24,6 +26,8 @@ people: texas: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_500 @@ -32,6 +36,8 @@ medicaid_ltss_home_ownership_share: 1 delaware: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_500 @@ -40,6 +46,8 @@ medicaid_ltss_home_ownership_share: 1 washington: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_500 @@ -94,6 +102,8 @@ people: single: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_000 @@ -103,6 +113,8 @@ medicaid_ltss_home_ownership_share: 1 couple: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 5_000 @@ -111,6 +123,8 @@ medicaid_ltss_home_ownership_share: 0.5 community_spouse: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_000 @@ -161,3 +175,126 @@ medicaid_ltss_csra_resource_eligible: [true, true, true] medicaid_ltss_home_equity_eligible: [true, false, true] is_medicaid_ltss_financial_threshold_eligible: [true, false, true] + +- name: A Delaware non-homeowner with qualifying income and resources passes end to end. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_400 + medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true + medicaid_ltss_csra_resource_eligible: true + medicaid_ltss_home_equity_eligible: true + is_medicaid_ltss_financial_threshold_eligible: true + +- name: A non-aged-blind-disabled applicant with qualifying finances is unmodeled end to end. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: false + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_400 + medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Identical above-SIL facts diverge across TX, DE, and WA income pathways. + period: 2026-07 + input: + people: + texas: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 3_100 + medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + delaware: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 3_100 + medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + washington: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 3_100 + medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + tax_units: + texas: + members: [texas] + delaware: + members: [delaware] + washington: + members: [washington] + marital_units: + texas: + members: [texas] + delaware: + members: [delaware] + washington: + members: [washington] + spm_units: + texas: + members: [texas] + delaware: + members: [delaware] + washington: + members: [washington] + households: + texas: + members: [texas] + state_code: + 2026: TX + delaware: + members: [delaware] + state_code: + 2026: DE + washington: + members: [washington] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, INSTITUTIONAL_MEDICALLY_NEEDY] + is_medicaid_ltss_income_eligible: [false, false, true] + medicaid_ltss_csra_resource_eligible: [true, true, true] + medicaid_ltss_home_equity_eligible: [true, true, true] + is_medicaid_ltss_financial_threshold_eligible: [false, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 7bee7e22677..b98f99838d6 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -4,31 +4,43 @@ people: below_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_981 at_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_982 above_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_983 couple_below_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 5_963 couple_at_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 5_964 couple_above_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 5_965 @@ -104,6 +116,8 @@ period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_982 @@ -116,6 +130,8 @@ period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_983 @@ -130,36 +146,48 @@ people: below_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_484 medicaid_ltss_needs_based_income: 2_484 at_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_485 medicaid_ltss_needs_based_income: 2_485 above_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_486 medicaid_ltss_needs_based_income: 2_486 couple_below_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 3_727 medicaid_ltss_needs_based_income: 3_727 couple_at_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 3_727.50 medicaid_ltss_needs_based_income: 3_727.50 couple_above_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 3_728 @@ -238,36 +266,48 @@ people: below_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_504 medicaid_ltss_needs_based_income: 0 at_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_505 medicaid_ltss_needs_based_income: 0 above_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_506 medicaid_ltss_needs_based_income: 0 couple_below_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 3_747 medicaid_ltss_needs_based_income: 0 couple_at_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 3_747.50 medicaid_ltss_needs_based_income: 0 couple_above_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_qit_adjusted_income: 3_748 @@ -344,6 +384,8 @@ period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_505 @@ -359,16 +401,22 @@ people: below_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_981 at_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_982 above_limit: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_983 @@ -415,6 +463,8 @@ period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 4_000 @@ -429,6 +479,8 @@ period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 4_000 @@ -438,3 +490,115 @@ 2026: WA output: is_medicaid_ltss_income_eligible: false + +- name: Case 10, zero income is eligible on the special income pathway. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 0 + output: + is_medicaid_ltss_income_eligible: true + +- name: Case 11, the Delaware disregard binds at an interior mixed-income value. + period: 2026-07 + input: + people: + passes_with_partial_disregard: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_480 + medicaid_ltss_needs_based_income: 2_470 + fails_with_partial_disregard: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_496 + medicaid_ltss_needs_based_income: 2_486 + tax_units: + passes_with_partial_disregard_tax_unit: + members: [passes_with_partial_disregard] + fails_with_partial_disregard_tax_unit: + members: [fails_with_partial_disregard] + marital_units: + passes_with_partial_disregard_marital_unit: + members: [passes_with_partial_disregard] + fails_with_partial_disregard_marital_unit: + members: [fails_with_partial_disregard] + spm_units: + passes_with_partial_disregard_spm_unit: + members: [passes_with_partial_disregard] + fails_with_partial_disregard_spm_unit: + members: [fails_with_partial_disregard] + households: + passes_with_partial_disregard_household: + members: [passes_with_partial_disregard] + state_code: + 2026: DE + fails_with_partial_disregard_household: + members: [fails_with_partial_disregard] + state_code: + 2026: DE + output: + is_medicaid_ltss_income_eligible: [true, false] + +- name: Case 12, Washington HCBS medically needy net income brackets the income level. + period: 2026-07 + input: + people: + at_income_level: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 2_506 + above_income_level: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 2_505 + tax_units: + at_income_level_tax_unit: + members: [at_income_level] + above_income_level_tax_unit: + members: [above_income_level] + marital_units: + at_income_level_marital_unit: + members: [at_income_level] + above_income_level_marital_unit: + members: [above_income_level] + spm_units: + at_income_level_spm_unit: + members: [at_income_level] + above_income_level_spm_unit: + members: [above_income_level] + households: + at_income_level_household: + members: [at_income_level] + state_code: + 2026: WA + above_income_level_household: + members: [above_income_level] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: + [INSTITUTIONAL_MEDICALLY_NEEDY, INSTITUTIONAL_MEDICALLY_NEEDY] + is_medicaid_ltss_income_eligible: [true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 7d02bb3a77f..5ee601cb61d 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -4,16 +4,22 @@ people: below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 1_999 at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 2_000 above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 2_001 @@ -67,16 +73,22 @@ people: below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 2_999 at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 3_000 above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 3_001 @@ -130,31 +142,43 @@ people: below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 2_999 at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 3_000 above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 3_001 individual_below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 1_999 individual_at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 2_000 individual_above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 2_001 @@ -245,21 +269,29 @@ people: below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 1_999 at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 2_000 above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_countable_resources: 2_001 unsupported_couple: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_countable_resources: 0 @@ -327,6 +359,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true @@ -342,6 +376,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true @@ -357,6 +393,8 @@ people: at_maximum: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true @@ -365,6 +403,8 @@ medicaid_ltss_community_spouse_countable_resources: 162_660 above_maximum: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true @@ -402,3 +442,176 @@ 2026: TX output: medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 8, a couple assistance unit with a community spouse flag fails closed. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_countable_resources: 0 + medicaid_ltss_community_spouse_countable_resources: 0 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 0 + output: + medicaid_ltss_csra_resource_eligible: false + +- name: Case 9, one dollar above the CSRA floor allowance fails. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 60_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 32_533 + output: + medicaid_ltss_csra_resource_eligible: false + +- name: Case 10, one dollar above the half-of-snapshot allowance fails. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 50_001 + output: + medicaid_ltss_csra_resource_eligible: false + +- name: Case 11, half of snapshot resources ties the Washington state minimum. + period: 2026-07 + input: + people: + at_tie: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 145_058 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_529 + above_tie: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 145_058 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_530 + tax_units: + at_tie_tax_unit: + members: [at_tie] + above_tie_tax_unit: + members: [above_tie] + families: + at_tie_family: + members: [at_tie] + above_tie_family: + members: [above_tie] + spm_units: + at_tie_spm_unit: + members: [at_tie] + above_tie_spm_unit: + members: [above_tie] + marital_units: + at_tie_marital_unit: + members: [at_tie] + above_tie_marital_unit: + members: [above_tie] + households: + at_tie_household: + members: [at_tie] + state_code: + 2026: WA + above_tie_household: + members: [above_tie] + state_code: + 2026: WA + output: + medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 12, a genuine two-person institutionalized couple uses the couple limit. + period: 2026-07 + input: + people: + first_spouse_at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_000 + second_spouse_at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_000 + first_spouse_above: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_001 + second_spouse_above: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_countable_resources: 3_001 + tax_units: + couple_at_tax_unit: + members: [first_spouse_at, second_spouse_at] + couple_above_tax_unit: + members: [first_spouse_above, second_spouse_above] + families: + couple_at_family: + members: [first_spouse_at, second_spouse_at] + couple_above_family: + members: [first_spouse_above, second_spouse_above] + spm_units: + couple_at_spm_unit: + members: [first_spouse_at, second_spouse_at] + couple_above_spm_unit: + members: [first_spouse_above, second_spouse_above] + marital_units: + couple_at_marital_unit: + members: [first_spouse_at, second_spouse_at] + couple_above_marital_unit: + members: [first_spouse_above, second_spouse_above] + households: + couple_at_household: + members: [first_spouse_at, second_spouse_at] + state_code: + 2026: TX + couple_above_household: + members: [first_spouse_above, second_spouse_above] + state_code: + 2026: TX + output: + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] + medicaid_ltss_csra_resource_eligible: [true, true, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index 1a16d2021b2..261eb234bed 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -4,6 +4,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 output: @@ -15,6 +17,8 @@ state_code: 2026: DE medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 output: @@ -26,6 +30,8 @@ state_code: 2026: WA medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_982 @@ -38,6 +44,8 @@ state_code: 2026: WA medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_983 @@ -50,6 +58,8 @@ state_code: 2026: WA medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: WA_COPES medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_982 @@ -62,11 +72,15 @@ people: new_freedom_applicant: medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: WA_NEW_FREEDOM medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_982 rsw_applicant: medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: WA_RSW medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 4_000 @@ -107,19 +121,22 @@ - INSTITUTIONAL_MEDICALLY_NEEDY is_medicaid_ltss_income_eligible: [true, true] -- name: Washington unknown HCBS waiver is unmodeled and fails every financial screen. +- name: Washington unknown HCBS waiver is unmodeled and fails the composite screen. period: 2026-07 input: state_code: 2026: WA medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: UNKNOWN medicaid_ltss_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_income_eligible: false medicaid_ltss_csra_resource_eligible: false - medicaid_ltss_home_equity_eligible: false + # The home-equity bar cannot attach to a person with no equity interest. + medicaid_ltss_home_equity_eligible: true is_medicaid_ltss_financial_threshold_eligible: false - name: Texas HCBS cannot use a Washington named waiver pathway. @@ -128,8 +145,65 @@ state_code: 2026: TX medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: WA_COPES medicaid_ltss_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false + +- name: A non-aged-blind-disabled applicant is unmodeled. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: false + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: An unknown setting is unmodeled. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: UNKNOWN + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + +- name: An unsupported state is unmodeled. + period: 2026-07 + input: + state_code: + 2026: CA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: An assistance unit size of zero is unmodeled. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 0 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml index 5b9f64e07ea..f55493e160c 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml @@ -4,6 +4,8 @@ people: below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 751_999 @@ -11,6 +13,8 @@ medicaid_ltss_home_ownership_share: 1 at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_000 @@ -18,6 +22,8 @@ medicaid_ltss_home_ownership_share: 1 above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 @@ -73,6 +79,8 @@ people: below: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_129_999 @@ -80,6 +88,8 @@ medicaid_ltss_home_ownership_share: 1 at: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_130_000 @@ -87,6 +97,8 @@ medicaid_ltss_home_ownership_share: 1 above: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_130_001 @@ -142,6 +154,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 @@ -157,6 +171,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 @@ -172,6 +188,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 @@ -187,6 +205,8 @@ state_code: 2026: TX medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 @@ -196,12 +216,91 @@ output: medicaid_ltss_home_equity_eligible: true -- name: Case 7, Delaware remains fail-closed without a modeled numeric home-equity cap. +- name: Case 7, Delaware applies the federal-minimum cap at the exact boundary. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 751_999 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + above: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + tax_units: + below_tax_unit: + members: [below] + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + below_family: + members: [below] + at_family: + members: [at] + above_family: + members: [above] + spm_units: + below_spm_unit: + members: [below] + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + below_marital_unit: + members: [below] + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + below_household: + members: [below] + state_code: + 2026: DE + at_household: + members: [at] + state_code: + 2026: DE + above_household: + members: [above] + state_code: + 2026: DE + output: + medicaid_ltss_financial_pathway: + [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] + medicaid_ltss_home_equity_eligible: [true, true, false] + +- name: Case 8, a Delaware non-homeowner passes the home-equity screen. period: 2026-07 input: state_code: 2026: DE medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 0 @@ -209,4 +308,169 @@ medicaid_ltss_home_ownership_share: 1 output: medicaid_ltss_financial_pathway: SPECIAL_INCOME - medicaid_ltss_home_equity_eligible: false + medicaid_ltss_home_equity_eligible: true + +- name: Case 9, encumbrances and ownership share land exactly at the Texas cap. + period: 2026-07 + input: + people: + at: + medicaid_ltss_home_market_value: 1_000_000 + medicaid_ltss_home_encumbrances: 248_000 + medicaid_ltss_home_ownership_share: 1 + above: + medicaid_ltss_home_market_value: 1_000_001 + medicaid_ltss_home_encumbrances: 248_000 + medicaid_ltss_home_ownership_share: 1 + tax_units: + at_tax_unit: + members: [at] + above_tax_unit: + members: [above] + families: + at_family: + members: [at] + above_family: + members: [above] + spm_units: + at_spm_unit: + members: [at] + above_spm_unit: + members: [above] + marital_units: + at_marital_unit: + members: [at] + above_marital_unit: + members: [above] + households: + at_household: + members: [at] + state_code: + 2026: TX + above_household: + members: [above] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [true, false] + +- name: Case 10, invalid ownership shares fail closed. + period: 2026-07 + input: + people: + share_above_one: + medicaid_ltss_home_market_value: 100_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1.5 + negative_share: + medicaid_ltss_home_market_value: 100_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: -0.5 + tax_units: + share_above_one_tax_unit: + members: [share_above_one] + negative_share_tax_unit: + members: [negative_share] + families: + share_above_one_family: + members: [share_above_one] + negative_share_family: + members: [negative_share] + spm_units: + share_above_one_spm_unit: + members: [share_above_one] + negative_share_spm_unit: + members: [negative_share] + marital_units: + share_above_one_marital_unit: + members: [share_above_one] + negative_share_marital_unit: + members: [negative_share] + households: + share_above_one_household: + members: [share_above_one] + state_code: + 2026: TX + negative_share_household: + members: [negative_share] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [false, false] + +- name: Case 11, an unmodeled state passes at the federal minimum and fails closed above it. + period: 2026-07 + input: + people: + no_home: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 0 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + at_federal_minimum: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + above_federal_minimum: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 752_001 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 1 + tax_units: + no_home_tax_unit: + members: [no_home] + at_federal_minimum_tax_unit: + members: [at_federal_minimum] + above_federal_minimum_tax_unit: + members: [above_federal_minimum] + families: + no_home_family: + members: [no_home] + at_federal_minimum_family: + members: [at_federal_minimum] + above_federal_minimum_family: + members: [above_federal_minimum] + spm_units: + no_home_spm_unit: + members: [no_home] + at_federal_minimum_spm_unit: + members: [at_federal_minimum] + above_federal_minimum_spm_unit: + members: [above_federal_minimum] + marital_units: + no_home_marital_unit: + members: [no_home] + at_federal_minimum_marital_unit: + members: [at_federal_minimum] + above_federal_minimum_marital_unit: + members: [above_federal_minimum] + households: + no_home_household: + members: [no_home] + state_code: + 2026: CA + at_federal_minimum_household: + members: [at_federal_minimum] + state_code: + 2026: CA + above_federal_minimum_household: + members: [above_federal_minimum] + state_code: + 2026: CA + output: + medicaid_ltss_financial_pathway: [UNMODELED, UNMODELED, UNMODELED] + medicaid_ltss_home_equity_eligible: [true, true, false] + is_medicaid_ltss_financial_threshold_eligible: [false, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml index 5c23ce6048c..c952f7900d6 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -1,22 +1,94 @@ -- name: Federal July 2026 MMMNA uses the base, shelter threshold, and maximum. +- name: Case 1, Texas pays the federal maximum flat regardless of shelter expenses. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + no_shelter: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 0 + at_shelter_threshold: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 811.50 + high_shelter: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 2_173 + tax_units: + no_shelter: + members: [no_shelter] + at_shelter_threshold: + members: [at_shelter_threshold] + high_shelter: + members: [high_shelter] + marital_units: + no_shelter: + members: [no_shelter] + at_shelter_threshold: + members: [at_shelter_threshold] + high_shelter: + members: [high_shelter] + spm_units: + no_shelter: + members: [no_shelter] + at_shelter_threshold: + members: [at_shelter_threshold] + high_shelter: + members: [high_shelter] + households: + no_shelter: + members: [no_shelter] + state_code: + 2026: TX + at_shelter_threshold: + members: [at_shelter_threshold] + state_code: + 2026: TX + high_shelter: + members: [high_shelter] + state_code: + 2026: TX + output: + medicaid_ltss_mmmna: [4_066.50, 4_066.50, 4_066.50] + +- name: Case 2, the Delaware federal formula uses the base, shelter threshold, and maximum. period: 2026-07 absolute_error_margin: 0.01 input: people: base: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 0 shelter_threshold: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 811.50 maximum: medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true @@ -46,14 +118,143 @@ base: members: [base] state_code: - 2026: TX + 2026: DE shelter_threshold: members: [shelter_threshold] state_code: - 2026: TX + 2026: DE maximum: members: [maximum] state_code: - 2026: TX + 2026: DE output: medicaid_ltss_mmmna: [2_705, 2_705, 4_066.50] + +- name: Case 3, the Washington formula adds interior excess shelter above the threshold. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + interior_excess: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 1_811.50 + cent_below_threshold: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 811.49 + tax_units: + interior_excess: + members: [interior_excess] + cent_below_threshold: + members: [cent_below_threshold] + marital_units: + interior_excess: + members: [interior_excess] + cent_below_threshold: + members: [cent_below_threshold] + spm_units: + interior_excess: + members: [interior_excess] + cent_below_threshold: + members: [cent_below_threshold] + households: + interior_excess: + members: [interior_excess] + state_code: + 2026: WA + cent_below_threshold: + members: [cent_below_threshold] + state_code: + 2026: WA + output: + medicaid_ltss_mmmna: [3_705, 2_705] + +- name: Case 4, no community spouse produces no allowance. + period: 2026-07 + absolute_error_margin: 0.01 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: false + medicaid_ltss_community_spouse_shelter_expenses: 2_000 + output: + medicaid_ltss_mmmna: 0 + +- name: Case 5, an unmodeled pathway produces no allowance. + period: 2026-07 + absolute_error_margin: 0.01 + input: + state_code: + 2026: CA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 2_000 + output: + medicaid_ltss_financial_pathway: UNMODELED + medicaid_ltss_mmmna: 0 + +- name: Case 6, mixed Texas and Delaware spouses diverge in one simulation. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + texas_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 1_000 + delaware_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 1_000 + tax_units: + texas_spouse: + members: [texas_spouse] + delaware_spouse: + members: [delaware_spouse] + marital_units: + texas_spouse: + members: [texas_spouse] + delaware_spouse: + members: [delaware_spouse] + spm_units: + texas_spouse: + members: [texas_spouse] + delaware_spouse: + members: [delaware_spouse] + households: + texas_spouse: + members: [texas_spouse] + state_code: + 2026: TX + delaware_spouse: + members: [delaware_spouse] + state_code: + 2026: DE + output: + medicaid_ltss_mmmna: [4_066.50, 2_893.50] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py index 48f29565fed..3ea0af76f60 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py @@ -6,6 +6,13 @@ class is_medicaid_long_term_care_home_equity_eligible(Variable): entity = Person label = "Medicaid long-term care home equity eligible" definition_period = YEAR + documentation = ( + "Annual home-equity test using the national limit, the agricultural " + "limit, and household-derived family exceptions. The opt-in monthly " + "LTSS screen models the same 42 USC 1396p(f) bar separately with " + "state-elected limits and explicit inputs in " + "medicaid_ltss_home_equity_eligible." + ) reference = "https://www.congress.gov/bill/119th-congress/house-bill/1/text" def formula(person, period, parameters): diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py index 3cd1b10210f..1367a6c6507 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -12,8 +12,14 @@ class is_medicaid_ltss_income_eligible(Variable): "needy expenses and cost of care are trusted inputs; this variable " "does not validate a trust, expense, service, or facility rate. The " "Washington institutional branch models the WAC 182-513-1395(4) " - "payment threshold; it does not model the separate three- or " - "six-month spenddown process in subsection (5)." + "payment threshold using income only: the excess-resources term in " + "subsection (4)(a) is unmodeled (slightly lenient; resources are " + "screened separately), as are the three- or six-month spenddown " + "process in subsection (5) and the WAC 182-515-1507 categorically " + "needy route that bypasses the special income limit. The Delaware " + "special income limit is 250% of the SSI standard (DSSM 20100.2.2), " + "and its $20 disregard with the needs-based carve-out follows DSSM " + "20240.1 and 20990." ) reference = ( "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index 5481866e8f7..56516fa3e51 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -9,16 +9,19 @@ class medicaid_ltss_csra_resource_eligible(Variable): documentation = ( "Tests trusted comprehensive LTSS countable-resource inputs. For an " "applicant with a community spouse, the initial CSRA is the greater " - "of the applicable state/federal floor or one-half of the couple's " - "snapshot resources, capped at the federal maximum. Court and fair-" - "hearing adjustments, resource-hardship overrides, and detailed " - "state asset exclusions are not modeled." + "of the applicable state/federal floor or the fixed statutory " + "one-half of the couple's snapshot resources under 42 USC " + "1396r-5(f)(2)(A), capped at the federal maximum. Delaware's " + "$25,000 state spousal share (DSSM 20910.10) sits below the federal " + "minimum, which therefore governs. Court and fair-hearing " + "adjustments, resource-hardship overrides, and detailed state asset " + "exclusions are not modeled." ) reference = ( - "https://www.law.cornell.edu/uscode/text/42/1396r-5", + "https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", - "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf", + "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", ) def formula_2026_01_01(person, period, parameters): diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py index 47fa0239f3c..bae82229d37 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -16,17 +16,23 @@ class medicaid_ltss_financial_pathway(Variable): definition_period = MONTH documentation = ( "Identifies the modeled financial pathway for the opt-in Medicaid " - "long-term services and supports threshold screen. Institutional " - "pathways are modeled for Texas, Delaware, and Washington. HCBS " - "pathways are modeled only for Washington's source-named COPES, New " - "Freedom, and Residential Support waivers. All other states, settings, " + "long-term services and supports threshold screen. Every modeled " + "route is SSI-related, so a person who is not aged, blind, or " + "disabled is unmodeled (42 CFR 435.236; 42 CFR 435.1005). " + "Institutional pathways are modeled for Texas, Delaware, and " + "Washington. HCBS pathways are modeled only for Washington's " + "source-named COPES, New Freedom, and Residential Support waivers; " + "their enabled flags exist for reform analysis, so the disabled " + "branch is reform-only-reachable. All other states, settings, " "waivers, and unsupported assistance-unit sizes are unmodeled." ) reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.236", + "https://www.law.cornell.edu/cfr/text/42/435.1005", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", - "https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505", ) def formula_2026_01_01(person, period, parameters): @@ -39,6 +45,7 @@ def formula_2026_01_01(person, period, parameters): waivers = waiver.possible_values assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) income = person("medicaid_ltss_qit_adjusted_income", period) + aged_blind_disabled = person("is_ssi_aged_blind_disabled", period.this_year) institutional = (setting == settings.INSTITUTIONAL) & (waiver == waivers.NONE) washington_hcbs = (setting == settings.HCBS) & ( @@ -49,11 +56,13 @@ def formula_2026_01_01(person, period, parameters): texas_or_delaware_institutional = ( institutional + & aged_blind_disabled & ((state == states.TX) | (state == states.DE)) & ((assistance_unit_size == 1) | (assistance_unit_size == 2)) ) washington_modeled_setting = ( (state == states.WA) + & aged_blind_disabled & (institutional | washington_hcbs) & (assistance_unit_size == 1) ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py index 6a31d7dc243..8edcaff376f 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -4,35 +4,39 @@ class medicaid_ltss_home_equity_eligible(Variable): value_type = bool entity = Person - label = "Meets modeled Medicaid LTSS home-equity threshold" + label = "Meets Medicaid LTSS home-equity threshold" definition_period = MONTH documentation = ( - "Models the separate LTSS home-equity payment bar from explicit home " - "value, encumbrance, fractional-ownership, resident-exception, and " - "hardship inputs. Texas and Washington have sourced 2026 caps. " - "Delaware remains unmodeled because the cited sources do not establish " - "a state-issued numeric 2026 cap." + "Applies the 42 USC 1396p(f) substantial home equity payment bar " + "from explicit home value, encumbrance, fractional-ownership, " + "resident-exception, and hardship inputs. Washington elects the " + "federal maximum limit (WAC 182-513-1350(8)(c)); Texas and Delaware " + "apply the CPI-indexed federal minimum (TX Appendix XXXI; DSSM " + "20320.7.B and 20320.7.E). Elections in other states are unmodeled: " + "equity at or below the federal minimum passes, because no state " + "may bar payment below that amount, and higher equity fails closed. " + "A person with no equity interest always passes. The agricultural-" + "land limit in the separate annual " + "is_medicaid_long_term_care_home_equity_eligible chassis is not " + "modeled here." ) reference = ( - "https://www.law.cornell.edu/uscode/text/42/1396p", + "https://www.law.cornell.edu/uscode/text/42/1396p#f", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", - "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", + "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", ) def formula_2026_01_01(person, period, parameters): - p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care state = person.household("state_code", period) states = state.possible_values - pathway = person("medicaid_ltss_financial_pathway", period) - pathways = pathway.possible_values - - home_equity_limit = select( - [state == states.TX, state == states.WA], - [p.tx.home_equity.limit, p.wa.home_equity.limit], - default=0, + home_equity_limit = where( + state == states.WA, + p.home_equity.limit, + p.home_equity.minimum_limit, ) - home_cap_is_modeled = (state == states.TX) | (state == states.WA) home_value = person("medicaid_ltss_home_market_value", period) encumbrances = person("medicaid_ltss_home_encumbrances", period) ownership_share = person("medicaid_ltss_home_ownership_share", period) @@ -54,11 +58,6 @@ def formula_2026_01_01(person, period, parameters): ) ) - return ( - (pathway != pathways.UNMODELED) - & valid_ownership_share - & ( - exception - | (home_cap_is_modeled & (applicant_home_equity <= home_equity_limit)) - ) + return valid_ownership_share & ( + exception | (applicant_home_equity <= home_equity_limit) ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py index 0bbea57e10c..afb0af4f1a0 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py @@ -8,19 +8,34 @@ class medicaid_ltss_mmmna(Variable): unit = USD definition_period = MONTH documentation = ( - "Calculates the federal MMMNA standard from the July 2026 minimum, " - "allowable community-spouse shelter expenses supplied as an explicit " - "input, and the federal maximum. It is a post-eligibility spousal " - "protection standard, not an applicant income-eligibility deduction. " - "The January-through-June 2026 minimum is left unmodeled." + "Calculates the community spouse minimum monthly maintenance needs " + "allowance standard for the modeled states. Texas pays the federal " + "maximum as a flat spousal allowance (TX Appendix XXXI; MEPD " + "J-7200). Delaware and Washington use the federal formula: the July " + "2026 minimum plus allowable community-spouse shelter expenses " + "above the excess-shelter threshold, supplied as an explicit input, " + "capped at the federal maximum (DSSM 20910.4 through 20910.6; WAC " + "182-513-1385(3)(a) and (4)). It is a post-eligibility spousal " + "protection standard, not an applicant income-eligibility " + "deduction; the WAC 182-513-1385(3)(b) offset for the community " + "spouse's own income belongs to the allocation, which is unmodeled. " + "The whole variable is unmodeled before July 2026, when the " + "effective-dated federal minimum begins; this also defers the Texas " + "flat maximum, which is otherwise effective January 1, 2026." ) reference = ( - "https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf", - "https://www.law.cornell.edu/uscode/text/42/1396r-5", + "https://www.law.cornell.edu/uscode/text/42/1396r-5#d", + "https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/j-7200-spousal-co-payment", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385", ) def formula_2026_07_01(person, period, parameters): p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + states = state.possible_values pathway = person("medicaid_ltss_financial_pathway", period) pathways = pathway.possible_values has_community_spouse = person("medicaid_ltss_has_community_spouse", period) @@ -34,10 +49,15 @@ def formula_2026_07_01(person, period, parameters): - (p.federal.mmmna.minimum * p.federal.mmmna.shelter_threshold_rate), 0, ) - mmmna = min_( + formula_mmmna = min_( p.federal.mmmna.minimum + excess_shelter_expenses, p.federal.mmmna.maximum, ) + mmmna = where( + state == states.TX, + p.federal.mmmna.maximum, + formula_mmmna, + ) return where( (pathway != pathways.UNMODELED) & has_community_spouse, mmmna, diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py index 9d23cd68038..15f14dd4595 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py @@ -10,10 +10,11 @@ class medicaid_ltss_qit_adjusted_income(Variable): default_value = 0 documentation = ( "Trusted monthly income input after any qualified income trust " - "treatment and applicant/spouse ownership allocation. The model does " - "not validate trust legality, irrevocability, funding, payback terms, " - "or which income was validly deposited. The user must perform those " - "determinations before supplying this value." + "treatment and applicant/spouse ownership allocation (TX MEPD " + "F-6800; DSSM 20400.11). The model does not validate trust " + "legality, irrevocability, funding, payback terms, or which income " + "was validly deposited. The user must perform those determinations " + "before supplying this value." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py index 34cb11f03dc..3ccb9132bbf 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py @@ -25,6 +25,6 @@ class medicaid_ltss_waiver(Variable): ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.217", - "https://www.hca.wa.gov/free-or-low-cost-health-care/i-help-others-apply-and-access-apple-health/wac-182-515-1505-home-and-community-based-hcb-waiver-services-authorized-home-and-community-services-hcs", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505", "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", ) From 7cee6cd97e24f6a0b18bd119ddf213d08fe69fca Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 20 Aug 2026 00:02:23 -0400 Subject: [PATCH 07/34] Keep the chassis home-equity variable untouched The docstring-only edit pulled the file into the selective-coverage report without its tests, tripping codecov/project; the LTSS screen's docstring carries the cross-reference instead. Co-Authored-By: Claude Fable 5 --- .../is_medicaid_long_term_care_home_equity_eligible.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py index 3ea0af76f60..48f29565fed 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/is_medicaid_long_term_care_home_equity_eligible.py @@ -6,13 +6,6 @@ class is_medicaid_long_term_care_home_equity_eligible(Variable): entity = Person label = "Medicaid long-term care home equity eligible" definition_period = YEAR - documentation = ( - "Annual home-equity test using the national limit, the agricultural " - "limit, and household-derived family exceptions. The opt-in monthly " - "LTSS screen models the same 42 USC 1396p(f) bar separately with " - "state-elected limits and explicit inputs in " - "medicaid_ltss_home_equity_eligible." - ) reference = "https://www.congress.gov/bill/119th-congress/house-bill/1/text" def formula(person, period, parameters): From dd679e82a2d7b514968af3314f28c8ffc90872ea Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 6 Oct 2026 09:15:33 -0400 Subject: [PATCH 08/34] Address Pavel's and DTrim99's review of the LTSS financial screens Recovered unchanged from hub backup 49b18313f53eb7a8b2db0f000fa3b72807a6d26a (owner session b1291f8d's uncommitted reviewer fixes, tree identical). - Apply the January CMS maximum and prior-July minimum MMMNA before July instead of returning zero. - Derive TX/DE/WA special income limits from the canonical SSI federal benefit rate and drop the duplicated SIL/resource parameters. - Add CSRA floor/half-snapshot/cap boundary cases, sole-resource composite failure, MMMNA cap and unsupported-period cases. - Let statutory home-equity exceptions bypass invalid ownership shares and floor negative equity; index the minimum equity limit by CPI-U. - Document trusted input units and add property-based invariants. Co-Authored-By: Claude Opus 5.5 --- .../financial/de/csra/state_minimum.yaml | 10 +- .../de/income/general_disregard.yaml | 10 +- .../financial/de/resources/individual.yaml | 13 - .../de/special_income_limit/couple.yaml | 13 - .../de/special_income_limit/individual.yaml | 13 - .../rate.yaml} | 16 +- .../financial/federal/csra/maximum.yaml | 6 +- .../financial/federal/csra/minimum.yaml | 6 +- .../financial/federal/mmmna/maximum.yaml | 6 +- .../financial/federal/mmmna/minimum.yaml | 7 +- .../federal/mmmna/shelter_threshold_rate.yaml | 10 +- .../financial/tx/csra/state_minimum.yaml | 11 - .../financial/tx/resources/couple.yaml | 11 - .../financial/tx/resources/individual.yaml | 11 - .../tx/special_income_limit/couple.yaml | 11 - .../couple_multiplier.yaml | 15 + .../tx/special_income_limit/individual.yaml | 11 - .../tx/special_income_limit/rate.yaml | 15 + .../financial/wa/csra/state_minimum.yaml | 8 +- .../wa/medically_needy/income_level.yaml | 4 +- .../financial/wa/resources/individual.yaml | 12 +- .../wa/special_income_limit/individual.yaml | 17 - .../wa/special_income_limit/rate.yaml | 13 + .../financial/wa/waivers/copes/enabled.yaml | 4 +- .../wa/waivers/new_freedom/enabled.yaml | 4 +- .../financial/wa/waivers/rsw/enabled.yaml | 6 +- .../home_equity/minimum_limit.yaml | 16 + ...test_medicaid_ltss_financial_invariants.py | 367 ++++++++++++++++++ ...aid_ltss_financial_threshold_eligible.yaml | 143 ++++++- .../is_medicaid_ltss_income_eligible.yaml | 6 +- .../medicaid_ltss_csra_resource_eligible.yaml | 192 +++++++++ .../medicaid_ltss_financial_pathway.yaml | 103 ++++- .../medicaid_ltss_home_equity_eligible.yaml | 68 +++- .../financial/medicaid_ltss_mmmna.yaml | 133 ++++++- .../medicaid_ltss_special_income_limit.yaml | 66 ++++ .../is_medicaid_ltss_income_eligible.py | 54 +-- .../medicaid_ltss_assistance_unit_size.py | 17 +- .../medicaid_ltss_countable_resources.py | 22 +- .../medicaid_ltss_csra_resource_eligible.py | 45 ++- .../medicaid_ltss_financial_pathway.py | 17 +- .../medicaid_ltss_home_equity_eligible.py | 59 +-- .../financial/medicaid_ltss_mmmna.py | 35 +- .../medicaid_ltss_needs_based_income.py | 4 +- .../medicaid_ltss_qit_adjusted_income.py | 15 +- .../financial/medicaid_ltss_setting.py | 10 +- .../medicaid_ltss_special_income_limit.py | 51 +++ .../financial/medicaid_ltss_waiver.py | 2 +- 47 files changed, 1388 insertions(+), 300 deletions(-) delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml rename policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/{resources/couple.yaml => special_income_limit/rate.yaml} (53%) delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml create mode 100644 policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml index 4b782bae9c2..c1588160347 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml @@ -1,11 +1,13 @@ -description: Delaware uses this state spousal share as the minimum when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility, though the higher federal minimum resource allowance supersedes it. +description: Delaware sets this state spousal share as the minimum community spouse resource allowance under Medicaid long-term services and supports. values: - 2026-01-01: 25_000 + 1993-10-01: 25_000 metadata: unit: currency-USD - period: month + period: year label: Delaware minimum Medicaid LTSS community spouse resource allowance reference: - title: DSSM 20910.10 - Community Spouse Resource Allowance, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69 + - title: DSSM 20950 - Resource Eligibility for Institutionalized Spouse, 16 DE Admin Code 20000 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=70 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml index 981e43e2ace..d0347cd6a4d 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml @@ -1,4 +1,4 @@ -description: Delaware disregards up to this amount of monthly general income when applying the Medicaid LTSS special income limit. +description: Delaware disregards up to this amount of monthly income when applying the special income limit under Medicaid long-term services and supports. values: 2026-01-01: 20 @@ -8,6 +8,8 @@ metadata: label: Delaware Medicaid LTSS general income disregard reference: - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums - href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: DSSM 20240.1 - Gross Income; DSSM 20990 - Income Rules, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1 + - title: DSSM 20240.1 - Gross Income, 16 DE Admin Code 20000 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9 + - title: DSSM 20990 - Income Rules, 16 DE Admin Code 20000 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml deleted file mode 100644 index 5e6e59d2648..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/individual.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: Delaware limits countable resources to this amount for an individual using the Medicaid LTSS financial screen. -values: - 2026-01-01: 2_000 - -metadata: - unit: currency-USD - period: month - label: Delaware Medicaid LTSS resource limit for an individual - reference: - - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums - href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml deleted file mode 100644 index cdbeb1a6da0..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/couple.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: Delaware limits monthly income before its applicable general disregard to this amount for a couple using the Medicaid LTSS special income pathway. -values: - 2026-01-01: 3_727.50 - -metadata: - unit: currency-USD - period: month - label: Delaware Medicaid LTSS special income limit for a couple - reference: - - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums - href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml deleted file mode 100644 index e178d502a0f..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/individual.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: Delaware limits monthly income before its applicable general disregard to this amount for an individual using the Medicaid LTSS special income pathway. -values: - 2026-01-01: 2_485 - -metadata: - unit: currency-USD - period: month - label: Delaware Medicaid LTSS special income limit for an individual - reference: - - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums - href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml similarity index 53% rename from policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml rename to policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml index a4cb5a10530..11de5d36428 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/resources/couple.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml @@ -1,13 +1,13 @@ -description: Delaware limits countable resources to this amount for a couple using the Medicaid LTSS financial screen. +description: Delaware sets the special income limit at this multiple of the Supplemental Security Income federal benefit rate for an individual or couple under Medicaid long-term services and supports. values: - 2026-01-01: 3_000 + 1994-10-01: 2.5 metadata: - unit: currency-USD - period: month - label: Delaware Medicaid LTSS resource limit for a couple + unit: /1 + period: year + label: Delaware Medicaid LTSS special income limit rate reference: - - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums - href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf - title: DSSM 20100.2.2 - Individuals Whose Income is 250% of SSI, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1 + - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums + href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml index 12b6946e953..6244daea003 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml @@ -1,11 +1,13 @@ -description: The federal maximum community spouse resource allowance for Medicaid LTSS financial eligibility. +description: The Department of Health and Human Services limits the community spouse resource allowance to this amount under Medicaid long-term services and supports. values: 2026-01-01: 162_660 metadata: unit: currency-USD - period: month + period: year label: Federal maximum Medicaid LTSS community spouse resource allowance reference: - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 + - title: 42 USC 1396r-5(f)(2)(A)(ii)(II) and (g) - Community spouse resource allowance and indexing + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml index b5d68d2555d..68694bd706a 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml @@ -1,11 +1,13 @@ -description: The federal minimum community spouse resource allowance for Medicaid LTSS financial eligibility. +description: The Department of Health and Human Services sets this minimum community spouse resource allowance under Medicaid long-term services and supports. values: 2026-01-01: 32_532 metadata: unit: currency-USD - period: month + period: year label: Federal minimum Medicaid LTSS community spouse resource allowance reference: - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 + - title: 42 USC 1396r-5(f)(2)(A)(i) and (g) - Community spouse resource allowance and indexing + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml index c790d4c9206..9fc9d1d9fd8 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml @@ -1,6 +1,6 @@ -description: The federal maximum monthly maintenance needs allowance for a community spouse. +description: The Department of Health and Human Services limits the community spouse monthly maintenance needs allowance to this amount under Medicaid long-term services and supports. values: - 2026-01-01: 4_066.50 + 2026-01-01: 4_066.5 metadata: unit: currency-USD @@ -9,3 +9,5 @@ metadata: reference: - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 + - title: 42 USC 1396r-5(d)(3)(C) and (g) - Cap on minimum monthly maintenance needs allowance and indexing + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#d_3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml index 1f10aa6411c..ba8ac4b68d8 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml @@ -1,5 +1,6 @@ -description: The federal minimum monthly maintenance needs allowance for a community spouse in the contiguous states and District of Columbia. +description: The Department of Health and Human Services sets this minimum monthly maintenance needs allowance for a community spouse in the contiguous states and the District of Columbia under Medicaid long-term services and supports. values: + 2025-07-01: 2_643.75 2026-07-01: 2_705 metadata: @@ -7,5 +8,9 @@ metadata: period: month label: Federal minimum Medicaid LTSS monthly maintenance needs allowance reference: + - title: Updated 2025 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, May 28, 2025 + href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib05282025.pdf#page=2 - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 + - title: 42 USC 1396r-5(d)(3)(A)(i) - Minimum monthly maintenance needs allowance + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#d_3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml index e7cf752b7e3..654c97041dc 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml @@ -1,11 +1,13 @@ -description: The share of the minimum monthly maintenance needs allowance used as the community spouse excess shelter expense threshold. +description: The Department of Health and Human Services uses this share of the minimum monthly maintenance needs allowance as the community spouse excess shelter threshold under Medicaid long-term services and supports. values: - 2026-07-01: 0.3 + 1989-10-01: 0.3 metadata: unit: /1 - period: month - label: Medicaid LTSS community spouse shelter expense threshold rate + period: year + label: Medicaid LTSS community spouse excess shelter threshold rate reference: - title: 42 USC 1396r-5(d)(4) - Excess shelter allowance href: https://www.law.cornell.edu/uscode/text/42/1396r-5#d_4 + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml deleted file mode 100644 index b1732279992..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/csra/state_minimum.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Texas adopts the minimum resource amount set by federal law when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. -values: - 2026-01-01: 32_532 - -metadata: - unit: currency-USD - period: month - label: Texas minimum Medicaid LTSS community spouse resource allowance - reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 - href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml deleted file mode 100644 index 831836ceb54..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/couple.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Texas limits countable resources to this amount for a couple using the Medicaid LTSS financial screen. -values: - 2026-01-01: 3_000 - -metadata: - unit: currency-USD - period: month - label: Texas Medicaid LTSS resource limit for a couple - reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 - href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml deleted file mode 100644 index d384fc1047c..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/resources/individual.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Texas limits countable resources to this amount for an individual using the Medicaid LTSS financial screen. -values: - 2026-01-01: 2_000 - -metadata: - unit: currency-USD - period: month - label: Texas Medicaid LTSS resource limit for an individual - reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 - href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml deleted file mode 100644 index 914ca528c88..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Texas limits monthly income to this amount for a couple using the Medicaid LTSS special income pathway. -values: - 2026-01-01: 5_964 - -metadata: - unit: currency-USD - period: month - label: Texas Medicaid LTSS special income limit for a couple - reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 - href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml new file mode 100644 index 00000000000..175671d774a --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml @@ -0,0 +1,15 @@ +description: Texas sets the couple special income limit at this multiple of the individual special income limit under Medicaid long-term services and supports. +values: + 2009-09-01: 2 + +metadata: + unit: /1 + period: year + label: Texas Medicaid LTSS couple special income limit multiplier + reference: + - title: 1 TAC 358.433 - Special income limit + href: https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-433 + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, G-6200 - Special Income Limit Eligibility Budget + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/g-6200-special-income-limit-eligibility-budget + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2 + href: https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml deleted file mode 100644 index 85b720d7385..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/individual.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Texas limits monthly income to this amount for an individual using the Medicaid LTSS special income pathway. -values: - 2026-01-01: 2_982 - -metadata: - unit: currency-USD - period: month - label: Texas Medicaid LTSS special income limit for an individual - reference: - - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2, Effective June 1, 2026 - href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml new file mode 100644 index 00000000000..df5bc9ac011 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml @@ -0,0 +1,15 @@ +description: Texas sets the individual special income limit at this multiple of the individual Supplemental Security Income federal benefit rate under Medicaid long-term services and supports. +values: + 2009-09-01: 3 + +metadata: + unit: /1 + period: year + label: Texas Medicaid LTSS special income limit rate + reference: + - title: 1 TAC 358.433 - Special income limit + href: https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-433 + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, G-6200 - Special Income Limit Eligibility Budget + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/g-6200-special-income-limit-eligibility-budget + - title: Texas Medicaid for the Elderly and People with Disabilities Handbook, Appendix XXXI - Budget Reference Chart, Revision 26-2 + href: https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml index 6b08d4f3bb7..c7f7e11e7c3 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml @@ -1,11 +1,13 @@ -description: Washington uses this minimum, which its standards chart stamps July 1, 2025 and revises on a July odd-year cycle, when calculating the community spouse resource allowance for Medicaid LTSS financial eligibility. +description: Washington sets this state spousal resource standard as the minimum community spouse resource allowance under Medicaid long-term services and supports. values: - 2026-01-01: 72_529 + 2025-07-01: 72_529 metadata: unit: currency-USD - period: month + period: year label: Washington minimum Medicaid LTSS community spouse resource allowance reference: + - title: WAC 182-513-1100 - Definitions, state spousal resource standard + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1100 - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml index 0f45b42b6df..7abca607a4d 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -1,11 +1,11 @@ -description: Washington uses this monthly income level for a single person in the institutional medically needy pathway. +description: Washington uses this monthly medically needy income level for a single person under Medicaid long-term services and supports. values: 2026-01-01: 994 metadata: unit: currency-USD period: month - label: Washington institutional medically needy income level for a single person + label: Washington Medicaid LTSS medically needy income level for a single person reference: - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml index d05d92e4cb7..c2128aefaaf 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml @@ -1,15 +1,15 @@ -description: Washington limits countable resources to this amount for an individual using the Medicaid LTSS financial screen. +description: Washington limits countable resources to this amount for a single person or an institutionalized spouse under Medicaid long-term services and supports. values: 2026-01-01: 2_000 metadata: unit: currency-USD - period: month + period: year label: Washington Medicaid LTSS resource limit for an individual reference: + - title: WAC 182-513-1350(2)(a) - Resource standard for long-term services and supports + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350 + - title: WAC 182-513-1395(3)(a) - Institutional SSI-related medically needy resource eligibility + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility - href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules - href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml deleted file mode 100644 index c45c7d2beda..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/individual.yaml +++ /dev/null @@ -1,17 +0,0 @@ -description: Washington limits monthly income to this amount for an individual using the Medicaid LTSS special income pathway. -values: - 2026-01-01: 2_982 - -metadata: - unit: currency-USD - period: month - label: Washington Medicaid LTSS special income limit for an individual - reference: - - title: Washington Apple Health Income and Resource Standards, January 1, 2026 - href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility - href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules - href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 - - title: WAC 182-513-1100 - Definitions, special income level (SIL) - href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1100 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml new file mode 100644 index 00000000000..4f2bac530a5 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml @@ -0,0 +1,13 @@ +description: Washington sets the special income level at this multiple of the Supplemental Security Income federal benefit rate under Medicaid long-term services and supports. +values: + 2026-01-01: 3 + +metadata: + unit: /1 + period: year + label: Washington Medicaid LTSS special income level rate + reference: + - title: WAC 182-513-1100 - Definitions, special income level (SIL) + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1100 + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml index b5e00fc0169..9f8ba9351df 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml @@ -1,10 +1,10 @@ -description: Washington models COPES as a named Home and Community Services Medicaid HCBS waiver for the LTSS financial screen. +description: Washington models the COPES home and community-based services waiver under Medicaid long-term services and supports if this is true. values: 2026-01-01: true metadata: unit: bool - period: month + period: year label: Washington Medicaid LTSS COPES waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml index 94eb5aeb959..ff376afb21c 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml @@ -1,10 +1,10 @@ -description: Washington models New Freedom as a named Home and Community Services Medicaid HCBS waiver for the LTSS financial screen. +description: Washington models the New Freedom home and community-based services waiver under Medicaid long-term services and supports if this is true. values: 2026-01-01: true metadata: unit: bool - period: month + period: year label: Washington Medicaid LTSS New Freedom waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml index de59dd39a59..0209acf057f 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml @@ -1,11 +1,11 @@ -description: Washington models RSW as a named Home and Community Services Medicaid HCBS waiver for the LTSS financial screen. +description: Washington models the Residential Support Waiver home and community-based services waiver under Medicaid long-term services and supports if this is true. values: 2026-01-01: true metadata: unit: bool - period: month - label: Washington Medicaid LTSS RSW waiver enabled + period: year + label: Washington Medicaid LTSS Residential Support Waiver waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml index c1112208424..950a7992ab9 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml @@ -7,6 +7,20 @@ metadata: unit: currency-USD period: year label: Medicaid long-term care federal minimum home equity limit + # 42 USC 1396p(f)(1)(C) increases the limit from year to year by CPI-U, + # rounded to the nearest $1,000. CMS applies the September-to-September + # change each January 1, which reproduces the published 2026 value from + # 2025. From 2028 the consuming formula caps the result at the + # non-agricultural maximum under P.L. 119-21 section 71108. + uprating: + parameter: gov.bls.cpi.cpi_u + at_defined_interval: + start: "0001-09-01" + end: "0002-09-01" + enactment: "0003-01-01" + rounding: + type: nearest + interval: 1_000 reference: - title: 42 USC 1396p(f)(1)(A) and (C) - Disqualification for long-term care assistance for individuals with substantial home equity href: https://www.law.cornell.edu/uscode/text/42/1396p#f_1 @@ -14,3 +28,5 @@ metadata: href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib05282025.pdf#page=2 - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 + - title: CMCS Informational Bulletin, November 18, 2025, Section 71108 - Revising Home Equity Limit + href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib11182025.pdf#page=9 diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py new file mode 100644 index 00000000000..4abd54a62e0 --- /dev/null +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -0,0 +1,367 @@ +"""Property checks for the opt-in Medicaid LTSS financial-threshold screen. + +The screen's YAML tests pin boundaries for hand-built households. These tests +check properties that must hold for every input, over a seeded random +population evaluated in one vectorized simulation, and check that the derived +limits agree with the parameters they are derived from. +""" + +import numpy as np +import pytest + +from policyengine_us import Simulation +from policyengine_us.system import system + +PERIOD = "2026-07" +YEAR = "2026" +STATES = ["TX", "DE", "WA", "CA"] +PEOPLE_PER_STATE = 120 +SEED = 9184 + +FINANCIAL = system.parameters.gov.hhs.medicaid.eligibility.long_term_care.financial +HOME_EQUITY = system.parameters.gov.hhs.medicaid.eligibility.long_term_care.home_equity +SSI = system.parameters.gov.ssa.ssi +CPI_U = system.parameters.gov.bls.cpi.cpi_u + +OUTPUTS = [ + "medicaid_ltss_financial_pathway", + "medicaid_ltss_special_income_limit", + "is_medicaid_ltss_income_eligible", + "medicaid_ltss_csra_resource_eligible", + "medicaid_ltss_home_equity_eligible", + "medicaid_ltss_mmmna", + "is_medicaid_ltss_financial_threshold_eligible", +] + + +def _random_people(rng): + people = [] + for state in STATES: + for _ in range(PEOPLE_PER_STATE): + setting = rng.choice( + ["INSTITUTIONAL", "HCBS", "UNKNOWN"], p=[0.6, 0.3, 0.1] + ) + waiver = rng.choice( + ["NONE", "WA_COPES", "WA_NEW_FREEDOM", "WA_RSW", "UNKNOWN"], + p=[0.5, 0.15, 0.1, 0.1, 0.15], + ) + market_value = float(rng.choice([0, rng.uniform(0, 2_500_000)])) + people.append( + dict( + state=state, + setting=str(setting), + waiver=str(waiver), + aged_blind_disabled=bool(rng.random() < 0.9), + unit_size=int(rng.choice([0, 1, 1, 1, 2, 3])), + income=float(rng.uniform(0, 8_000)), + needs_based_income=float(rng.choice([0, rng.uniform(0, 500)])), + medically_needy_expenses=float(rng.uniform(0, 2_000)), + cost_of_care=float(rng.uniform(0, 12_000)), + resources=float(rng.uniform(0, 6_000)), + has_community_spouse=bool(rng.random() < 0.4), + snapshot=float(rng.uniform(0, 500_000)), + spouse_resources=float(rng.uniform(0, 250_000)), + shelter=float(rng.uniform(0, 5_000)), + market_value=market_value, + encumbrances=float(rng.uniform(0, 1.2) * market_value), + ownership_share=float( + rng.choice([0, 0.5, 1, rng.uniform(-0.5, 1.5)]) + ), + spouse_in_home=bool(rng.random() < 0.1), + child_under_21=bool(rng.random() < 0.05), + disabled_child=bool(rng.random() < 0.05), + hardship=bool(rng.random() < 0.05), + ) + ) + return people + + +def month(value): + return {PERIOD: value} + + +def _situation(people, **overrides): + situation = {"people": {}, "households": {}} + for state in STATES: + situation["households"][state] = { + "members": [], + "state_code": {YEAR: state}, + } + for index, person in enumerate(people): + person = {**person, **{k: v[index] for k, v in overrides.items()}} + name = f"person_{index}" + situation["households"][person["state"]]["members"].append(name) + situation["people"][name] = { + "is_ssi_aged_blind_disabled": {YEAR: person["aged_blind_disabled"]}, + "medicaid_ltss_setting": month(person["setting"]), + "medicaid_ltss_waiver": month(person["waiver"]), + "medicaid_ltss_assistance_unit_size": month(person["unit_size"]), + "medicaid_ltss_qit_adjusted_income": month(person["income"]), + "medicaid_ltss_needs_based_income": month(person["needs_based_income"]), + "medicaid_ltss_medically_needy_expenses": month( + person["medically_needy_expenses"] + ), + "medicaid_ltss_cost_of_care": month(person["cost_of_care"]), + "medicaid_ltss_countable_resources": month(person["resources"]), + "medicaid_ltss_has_community_spouse": month(person["has_community_spouse"]), + "medicaid_ltss_couple_countable_resources_at_first_institutionalization": month( + person["snapshot"] + ), + "medicaid_ltss_community_spouse_countable_resources": month( + person["spouse_resources"] + ), + "medicaid_ltss_community_spouse_shelter_expenses": month(person["shelter"]), + "medicaid_ltss_home_market_value": month(person["market_value"]), + "medicaid_ltss_home_encumbrances": month(person["encumbrances"]), + "medicaid_ltss_home_ownership_share": month(person["ownership_share"]), + "medicaid_ltss_home_occupied_by_spouse": month(person["spouse_in_home"]), + "medicaid_ltss_home_occupied_by_child_under_21": month( + person["child_under_21"] + ), + "medicaid_ltss_home_occupied_by_blind_or_disabled_child": month( + person["disabled_child"] + ), + "medicaid_ltss_home_equity_hardship_waiver": month(person["hardship"]), + } + # Households list members in state order, which matches `people` order. + return situation + + +def _calculate(people, **overrides): + simulation = Simulation(situation=_situation(people, **overrides)) + results = {} + for variable in OUTPUTS: + values = simulation.calculate(variable, PERIOD) + if variable == "medicaid_ltss_financial_pathway": + values = np.asarray(values.decode_to_str()) + results[variable] = np.asarray(values) + return results + + +@pytest.fixture(scope="module") +def population(): + rng = np.random.default_rng(SEED) + people = _random_people(rng) + + def column(key): + return np.array([person[key] for person in people]) + + base = _calculate(people) + deltas = rng.uniform(0.01, 3_000, len(people)) + shifted = { + "income": _calculate(people, income=column("income") + deltas), + "resources": _calculate(people, resources=column("resources") + deltas), + "spouse_resources": _calculate( + people, spouse_resources=column("spouse_resources") + deltas + ), + "market_value": _calculate( + people, market_value=column("market_value") + 100 * deltas + ), + "shelter": _calculate(people, shelter=column("shelter") + deltas), + } + return people, column, base, shifted + + +def test_population_exercises_every_branch(population): + _, column, base, _ = population + pathway = base["medicaid_ltss_financial_pathway"] + assert {"SPECIAL_INCOME", "INSTITUTIONAL_MEDICALLY_NEEDY", "UNMODELED"} <= set( + pathway + ) + composite = base["is_medicaid_ltss_financial_threshold_eligible"] + assert composite.any() and not composite.all() + assert (column("has_community_spouse") & (pathway != "UNMODELED")).any() + + +def test_composite_is_the_conjunction_of_the_screens(population): + _, _, base, _ = population + expected = ( + (base["medicaid_ltss_financial_pathway"] != "UNMODELED") + & base["is_medicaid_ltss_income_eligible"] + & base["medicaid_ltss_csra_resource_eligible"] + & base["medicaid_ltss_home_equity_eligible"] + ) + np.testing.assert_array_equal( + base["is_medicaid_ltss_financial_threshold_eligible"], expected + ) + + +def test_unmodeled_pathway_fails_closed(population): + _, column, base, _ = population + unmodeled = base["medicaid_ltss_financial_pathway"] == "UNMODELED" + assert unmodeled.any() + for variable in [ + "is_medicaid_ltss_income_eligible", + "medicaid_ltss_csra_resource_eligible", + "is_medicaid_ltss_financial_threshold_eligible", + ]: + assert not base[variable][unmodeled].any(), variable + assert (base["medicaid_ltss_mmmna"][unmodeled] == 0).all() + assert ( + base["medicaid_ltss_financial_pathway"][column("state") == "CA"] == "UNMODELED" + ).all() + + +def test_mmmna_stays_within_federal_bounds(population): + _, column, base, _ = population + mmmna = base["medicaid_ltss_mmmna"] + minimum = FINANCIAL.federal.mmmna.minimum(f"{PERIOD}-01") + maximum = FINANCIAL.federal.mmmna.maximum(f"{PERIOD}-01") + receives = (base["medicaid_ltss_financial_pathway"] != "UNMODELED") & column( + "has_community_spouse" + ) + assert ((mmmna == 0) == ~receives).all() + assert (mmmna[receives] >= minimum - 1e-9).all() + assert (mmmna[receives] <= maximum + 1e-9).all() + assert (mmmna[receives & (column("state") == "TX")] == maximum).all() + + +def test_home_equity_floor_and_exceptions_always_pass(population): + _, column, base, _ = population + eligible = base["medicaid_ltss_home_equity_eligible"] + exception = ( + column("spouse_in_home") + | column("child_under_21") + | column("disabled_child") + | column("hardship") + ) + assert eligible[exception].all() + share = column("ownership_share") + equity = np.maximum(column("market_value") - column("encumbrances"), 0) * share + floor = HOME_EQUITY.minimum_limit(f"{YEAR}-01-01") + valid = (share >= 0) & (share <= 1) + assert eligible[valid & (equity <= floor)].all() + assert not eligible[~valid & ~exception].any() + + +@pytest.mark.parametrize( + "shift, variable", + [ + ("income", "is_medicaid_ltss_income_eligible"), + ("resources", "medicaid_ltss_csra_resource_eligible"), + ("spouse_resources", "medicaid_ltss_csra_resource_eligible"), + ("market_value", "medicaid_ltss_home_equity_eligible"), + ("income", "is_medicaid_ltss_financial_threshold_eligible"), + ("resources", "is_medicaid_ltss_financial_threshold_eligible"), + ], +) +def test_screens_never_start_passing_when_a_countable_amount_rises( + population, shift, variable +): + _, _, base, shifted = population + newly_passing = shifted[shift][variable] & ~base[variable] + assert not newly_passing.any(), np.flatnonzero(newly_passing)[:5] + + +def test_mmmna_is_non_decreasing_in_shelter_expenses(population): + _, _, base, shifted = population + assert ( + shifted["shelter"]["medicaid_ltss_mmmna"] >= base["medicaid_ltss_mmmna"] - 1e-9 + ).all() + + +def test_special_income_limit_matches_rate_times_ssi_federal_benefit_rate( + population, +): + _, column, base, _ = population + individual = SSI.amount.individual(f"{PERIOD}-01") + couple = SSI.amount.couple(f"{PERIOD}-01") + instant = f"{PERIOD}-01" + texas = FINANCIAL.tx.special_income_limit.rate(instant) * individual + expected = { + ("TX", 1): texas, + ("TX", 2): texas * FINANCIAL.tx.special_income_limit.couple_multiplier(instant), + ("DE", 1): FINANCIAL.de.special_income_limit.rate(instant) * individual, + ("DE", 2): FINANCIAL.de.special_income_limit.rate(instant) * couple, + ("WA", 1): FINANCIAL.wa.special_income_limit.rate(instant) * individual, + } + actual = base["medicaid_ltss_special_income_limit"] + for index, (state, size) in enumerate(zip(column("state"), column("unit_size"))): + assert actual[index] == pytest.approx(expected.get((state, size), 0)) + # The published 2026 figures (TX Appendix XXXI, DE A-14-2025, WA HCA). + assert texas == 2_982 + assert expected[("DE", 2)] == 3_727.5 + + +@pytest.mark.parametrize("year", [2027, 2030]) +def test_special_income_limit_follows_the_uprated_federal_benefit_rate(year): + period = f"{year}-01" + simulation = Simulation( + situation={ + "people": { + "texas": {"medicaid_ltss_assistance_unit_size": {period: 1}}, + "delaware": {"medicaid_ltss_assistance_unit_size": {period: 2}}, + }, + "households": { + "texas_household": { + "members": ["texas"], + "state_code": {str(year): "TX"}, + }, + "delaware_household": { + "members": ["delaware"], + "state_code": {str(year): "DE"}, + }, + }, + } + ) + instant = f"{period}-01" + limits = simulation.calculate("medicaid_ltss_special_income_limit", period) + assert limits[0] == pytest.approx( + FINANCIAL.tx.special_income_limit.rate(instant) * SSI.amount.individual(instant) + ) + assert limits[1] == pytest.approx( + FINANCIAL.de.special_income_limit.rate(instant) * SSI.amount.couple(instant) + ) + assert SSI.amount.individual(instant) > SSI.amount.individual("2026-01-01") + + +def test_minimum_home_equity_limit_indexes_like_cms(): + # 42 USC 1396p(f)(1)(C): September-to-September CPI-U, rounded to the + # nearest $1,000, effective January 1. Applied to the 2025 value, the rule + # reproduces CMS's published 2026 value. + def indexed(value, year): + change = CPI_U(f"{year - 1}-09-01") / CPI_U(f"{year - 2}-09-01") + return round(value * change / 1_000) * 1_000 + + assert indexed(HOME_EQUITY.minimum_limit("2025-01-01"), 2026) == 752_000 + for year in range(2027, 2036): + prior = HOME_EQUITY.minimum_limit(f"{year - 1}-01-01") + current = HOME_EQUITY.minimum_limit(f"{year}-01-01") + assert current == indexed(prior, year) + assert HOME_EQUITY.minimum_limit(f"{year}-12-01") == current + + +def test_indexed_minimum_home_equity_limit_is_capped_after_2028(): + years = [ + year + for year in range(2028, 2100) + if HOME_EQUITY.minimum_limit(f"{year}-01-01") + > HOME_EQUITY.limit(f"{year}-01-01") + ] + assert years, "the indexed minimum never passes the $1,000,000 cap" + year = years[0] + cap = HOME_EQUITY.limit(f"{year}-01-01") + assert cap == 1_000_000 + period = f"{year}-01" + simulation = Simulation( + situation={ + "people": { + "at_cap": { + "medicaid_ltss_home_market_value": {period: cap}, + "medicaid_ltss_home_ownership_share": {period: 1}, + }, + "above_cap": { + "medicaid_ltss_home_market_value": {period: cap + 1}, + "medicaid_ltss_home_ownership_share": {period: 1}, + }, + }, + "households": { + "household": { + "members": ["at_cap", "above_cap"], + "state_code": {str(year): "TX"}, + } + }, + } + ) + eligible = simulation.calculate("medicaid_ltss_home_equity_eligible", period) + assert eligible.tolist() == [True, False] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index 258a05eb8c8..c91c6ae9b62 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -1,4 +1,4 @@ -- name: MMMNA does not convert above-SIL applicant income into eligibility. +- name: Case 1, MMMNA does not convert above-SIL applicant income into eligibility. period: 2026-07 absolute_error_margin: 0.01 input: @@ -16,11 +16,11 @@ medicaid_ltss_community_spouse_shelter_expenses: 3_000 output: medicaid_ltss_financial_pathway: SPECIAL_INCOME - medicaid_ltss_mmmna: 4_066.50 + medicaid_ltss_mmmna: 4_066.5 is_medicaid_ltss_income_eligible: false is_medicaid_ltss_financial_threshold_eligible: false -- name: Identical facts produce state-specific TX, DE, and WA home-equity results. +- name: Case 2, identical facts produce state-specific TX, DE, and WA home-equity results. period: 2026-07 input: people: @@ -96,7 +96,7 @@ medicaid_ltss_home_equity_eligible: [false, false, true] is_medicaid_ltss_financial_threshold_eligible: [false, false, true] -- name: Vectorized assistance units and explicit ownership inputs remain separate. +- name: Case 3, vectorized assistance units and explicit ownership inputs remain separate. period: 2026-07 input: people: @@ -176,7 +176,7 @@ medicaid_ltss_home_equity_eligible: [true, false, true] is_medicaid_ltss_financial_threshold_eligible: [true, false, true] -- name: A Delaware non-homeowner with qualifying income and resources passes end to end. +- name: Case 4, a Delaware non-homeowner with qualifying income and resources passes end to end. period: 2026-07 input: state_code: @@ -198,7 +198,7 @@ medicaid_ltss_home_equity_eligible: true is_medicaid_ltss_financial_threshold_eligible: true -- name: A non-aged-blind-disabled applicant with qualifying finances is unmodeled end to end. +- name: Case 5, a non-aged-blind-disabled applicant with qualifying finances is unmodeled end to end. period: 2026-07 input: state_code: @@ -217,7 +217,7 @@ medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false -- name: Identical above-SIL facts diverge across TX, DE, and WA income pathways. +- name: Case 6, identical above-SIL facts diverge across TX, DE, and WA income pathways. period: 2026-07 input: people: @@ -298,3 +298,132 @@ medicaid_ltss_csra_resource_eligible: [true, true, true] medicaid_ltss_home_equity_eligible: [true, true, true] is_medicaid_ltss_financial_threshold_eligible: [false, false, true] + +- name: Case 7, the composite fails when the resource screen is the only failing screen. + period: 2026-07 + input: + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_000 + medicaid_ltss_countable_resources: 2_001 + households: + household: + members: [applicant] + state_code: + 2026: TX + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true + medicaid_ltss_csra_resource_eligible: false + medicaid_ltss_home_equity_eligible: true + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 8, a Delaware applicant and community spouse in one household pass end to end. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_400 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 32_532 + medicaid_ltss_home_market_value: 900_000 + medicaid_ltss_home_ownership_share: 0.5 + medicaid_ltss_home_occupied_by_spouse: true + community_spouse: + is_ssi_aged_blind_disabled: + 2026: false + households: + household: + members: [applicant, community_spouse] + state_code: + 2026: DE + output: + medicaid_ltss_financial_pathway: [SPECIAL_INCOME, UNMODELED] + is_medicaid_ltss_income_eligible: [true, false] + medicaid_ltss_csra_resource_eligible: [true, false] + medicaid_ltss_home_equity_eligible: [true, true] + medicaid_ltss_mmmna: [2_705, 0] + is_medicaid_ltss_financial_threshold_eligible: [true, false] + +- name: Case 9, Washington community-spouse applicants bracket the state spousal resource standard end to end. + period: 2026-07 + input: + people: + at_state_standard: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_529 + above_state_standard: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_530 + households: + at_household: + members: [at_state_standard] + state_code: + 2026: WA + above_household: + members: [above_state_standard] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: [SPECIAL_INCOME, SPECIAL_INCOME] + is_medicaid_ltss_income_eligible: [true, true] + medicaid_ltss_csra_resource_eligible: [true, false] + medicaid_ltss_home_equity_eligible: [true, true] + is_medicaid_ltss_financial_threshold_eligible: [true, false] + +- name: Case 10, every screen is unmodeled before 2026. + period: 2025-12 + absolute_error_margin: 0.01 + input: + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2025: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_has_community_spouse: true + households: + household: + members: [applicant] + state_code: + 2025: TX + output: + medicaid_ltss_financial_pathway: UNMODELED + medicaid_ltss_special_income_limit: 0 + is_medicaid_ltss_income_eligible: false + medicaid_ltss_csra_resource_eligible: false + medicaid_ltss_home_equity_eligible: false + medicaid_ltss_mmmna: 0 + is_medicaid_ltss_financial_threshold_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index b98f99838d6..3bfeff53da2 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -182,8 +182,8 @@ 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_727.50 - medicaid_ltss_needs_based_income: 3_727.50 + medicaid_ltss_qit_adjusted_income: 3_727.5 + medicaid_ltss_needs_based_income: 3_727.5 couple_above_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: @@ -302,7 +302,7 @@ 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_747.50 + medicaid_ltss_qit_adjusted_income: 3_747.5 medicaid_ltss_needs_based_income: 0 couple_above_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 5ee601cb61d..ec1f94b98c0 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -615,3 +615,195 @@ medicaid_ltss_financial_pathway: [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] medicaid_ltss_csra_resource_eligible: [true, true, false, false] + +- name: Case 13, the federal minimum governs over the Delaware state spousal share. + period: 2026-07 + input: + people: + at_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 32_532 + above_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 32_533 + households: + household: + members: [at_allowance, above_allowance] + state_code: + 2026: DE + output: + medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 14, half of snapshot resources governs between the Delaware CSRA bounds. + period: 2026-07 + input: + people: + at_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 50_000 + above_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 50_001 + households: + household: + members: [at_allowance, above_allowance] + state_code: + 2026: DE + output: + medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 15, the federal CSRA maximum caps the Delaware allowance. + period: 2026-07 + input: + people: + at_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_660 + above_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_661 + households: + household: + members: [at_allowance, above_allowance] + state_code: + 2026: DE + output: + medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 16, the Washington state spousal resource standard binds above half of snapshot resources. + period: 2026-07 + input: + people: + at_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_529 + above_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_530 + households: + household: + members: [at_allowance, above_allowance] + state_code: + 2026: WA + output: + medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 17, half of snapshot resources governs between the Washington CSRA bounds. + period: 2026-07 + input: + people: + at_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 200_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 100_000 + above_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 200_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 100_001 + households: + household: + members: [at_allowance, above_allowance] + state_code: + 2026: WA + output: + medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 18, the federal CSRA maximum caps the Washington allowance. + period: 2026-07 + input: + people: + at_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_660 + above_allowance: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 162_661 + households: + household: + members: [at_allowance, above_allowance] + state_code: + 2026: WA + output: + medicaid_ltss_csra_resource_eligible: [true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index 261eb234bed..a93db8ddd1d 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -1,4 +1,4 @@ -- name: Texas institutional assistance unit of one uses the special income pathway. +- name: Case 1, Texas institutional assistance unit of one uses the special income pathway. period: 2026-07 input: state_code: @@ -11,7 +11,7 @@ output: medicaid_ltss_financial_pathway: SPECIAL_INCOME -- name: Delaware institutional assistance unit of one uses the special income pathway. +- name: Case 2, Delaware institutional assistance unit of one uses the special income pathway. period: 2026-07 input: state_code: @@ -24,7 +24,7 @@ output: medicaid_ltss_financial_pathway: SPECIAL_INCOME -- name: Washington institutional income at the special income limit uses that pathway. +- name: Case 3, Washington institutional income at the special income limit uses that pathway. period: 2026-07 input: state_code: @@ -38,7 +38,7 @@ output: medicaid_ltss_financial_pathway: SPECIAL_INCOME -- name: Washington institutional income above the special income limit uses medically needy. +- name: Case 4, Washington institutional income above the special income limit uses medically needy. period: 2026-07 input: state_code: @@ -52,7 +52,7 @@ output: medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY -- name: Washington COPES income at the special income limit uses that pathway. +- name: Case 5, Washington COPES income at the special income limit uses that pathway. period: 2026-07 input: state_code: @@ -66,7 +66,7 @@ output: medicaid_ltss_financial_pathway: SPECIAL_INCOME -- name: Washington named HCBS waivers vectorize across the income pathway boundary. +- name: Case 6, Washington named HCBS waivers vectorize across the income pathway boundary. period: 2026-07 input: people: @@ -121,7 +121,7 @@ - INSTITUTIONAL_MEDICALLY_NEEDY is_medicaid_ltss_income_eligible: [true, true] -- name: Washington unknown HCBS waiver is unmodeled and fails the composite screen. +- name: Case 7, Washington unknown HCBS waiver is unmodeled and fails the composite screen. period: 2026-07 input: state_code: @@ -139,7 +139,7 @@ medicaid_ltss_home_equity_eligible: true is_medicaid_ltss_financial_threshold_eligible: false -- name: Texas HCBS cannot use a Washington named waiver pathway. +- name: Case 8, Texas HCBS cannot use a Washington named waiver pathway. period: 2026-07 input: state_code: @@ -153,7 +153,7 @@ medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false -- name: A non-aged-blind-disabled applicant is unmodeled. +- name: Case 9, a non-aged-blind-disabled applicant is unmodeled. period: 2026-07 input: state_code: @@ -167,7 +167,7 @@ medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false -- name: An unknown setting is unmodeled. +- name: Case 10, an unknown setting is unmodeled. period: 2026-07 input: state_code: @@ -180,7 +180,7 @@ output: medicaid_ltss_financial_pathway: UNMODELED -- name: An unsupported state is unmodeled. +- name: Case 11, an unsupported state is unmodeled. period: 2026-07 input: state_code: @@ -194,7 +194,7 @@ medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false -- name: An assistance unit size of zero is unmodeled. +- name: Case 12, an assistance unit size of zero is unmodeled. period: 2026-07 input: state_code: @@ -207,3 +207,82 @@ output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_income_eligible: false + +- name: Case 13, Delaware models institutional couples but no HCBS waiver. + period: 2026-07 + input: + people: + institutional_couple: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + hcbs_named_waiver: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + hcbs_no_waiver: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + households: + household: + members: [institutional_couple, hcbs_named_waiver, hcbs_no_waiver] + state_code: + 2026: DE + output: + medicaid_ltss_financial_pathway: [SPECIAL_INCOME, UNMODELED, UNMODELED] + +- name: Case 14, assistance-unit sizes above two or below zero are unmodeled. + period: 2026-07 + input: + people: + three_person_unit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 3 + negative_unit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: -1 + households: + household: + members: [three_person_unit, negative_unit] + state_code: + 2026: TX + output: + medicaid_ltss_financial_pathway: [UNMODELED, UNMODELED] + +- name: Case 15, disabling the COPES waiver leaves the other named waivers modeled. + period: 2026-07 + input: + gov.hhs.medicaid.eligibility.long_term_care.financial.wa.waivers.copes.enabled: false + people: + copes: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + new_freedom: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_NEW_FREEDOM + medicaid_ltss_assistance_unit_size: 1 + households: + household: + members: [copes, new_freedom] + state_code: + 2026: WA + output: + medicaid_ltss_financial_pathway: [UNMODELED, SPECIAL_INCOME] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml index f55493e160c..5b4af876c38 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml @@ -310,7 +310,7 @@ medicaid_ltss_financial_pathway: SPECIAL_INCOME medicaid_ltss_home_equity_eligible: true -- name: Case 9, encumbrances and ownership share land exactly at the Texas cap. +- name: Case 9, encumbrances land exactly at the Texas cap. period: 2026-07 input: people: @@ -474,3 +474,69 @@ medicaid_ltss_financial_pathway: [UNMODELED, UNMODELED, UNMODELED] medicaid_ltss_home_equity_eligible: [true, true, false] is_medicaid_ltss_financial_threshold_eligible: [false, false, false] + +- name: Case 12, resident exceptions and hardship waivers pass despite an invalid ownership share. + period: 2026-07 + input: + people: + spouse_exception: + medicaid_ltss_home_market_value: 2_000_000 + medicaid_ltss_home_ownership_share: 1.5 + medicaid_ltss_home_occupied_by_spouse: true + hardship_waiver: + medicaid_ltss_home_market_value: 2_000_000 + medicaid_ltss_home_ownership_share: -0.5 + medicaid_ltss_home_equity_hardship_waiver: true + households: + household: + members: [spouse_exception, hardship_waiver] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [true, true] + +- name: Case 13, a zero ownership share and negative equity both pass. + period: 2026-07 + input: + people: + zero_share: + medicaid_ltss_home_market_value: 5_000_000 + medicaid_ltss_home_ownership_share: 0 + negative_equity: + medicaid_ltss_home_market_value: 500_000 + medicaid_ltss_home_encumbrances: 900_000 + medicaid_ltss_home_ownership_share: 1 + households: + household: + members: [zero_share, negative_equity] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [true, true] + +- name: Case 14, resident-child exceptions apply above the Delaware and Washington caps. + period: 2026-07 + input: + people: + delaware_child_under_21: + medicaid_ltss_home_market_value: 2_000_000 + medicaid_ltss_home_ownership_share: 1 + medicaid_ltss_home_occupied_by_child_under_21: true + washington_disabled_child: + medicaid_ltss_home_market_value: 2_000_000 + medicaid_ltss_home_ownership_share: 1 + medicaid_ltss_home_occupied_by_blind_or_disabled_child: true + washington_no_exception: + medicaid_ltss_home_market_value: 2_000_000 + medicaid_ltss_home_ownership_share: 1 + households: + delaware: + members: [delaware_child_under_21] + state_code: + 2026: DE + washington: + members: [washington_disabled_child, washington_no_exception] + state_code: + 2026: WA + output: + medicaid_ltss_home_equity_eligible: [true, true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml index c952f7900d6..0167ae678f2 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -18,7 +18,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_community_spouse_shelter_expenses: 811.50 + medicaid_ltss_community_spouse_shelter_expenses: 811.5 high_shelter: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: @@ -62,7 +62,7 @@ state_code: 2026: TX output: - medicaid_ltss_mmmna: [4_066.50, 4_066.50, 4_066.50] + medicaid_ltss_mmmna: [4_066.5, 4_066.5, 4_066.5] - name: Case 2, the Delaware federal formula uses the base, shelter threshold, and maximum. period: 2026-07 @@ -84,7 +84,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_community_spouse_shelter_expenses: 811.50 + medicaid_ltss_community_spouse_shelter_expenses: 811.5 maximum: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: @@ -128,7 +128,7 @@ state_code: 2026: DE output: - medicaid_ltss_mmmna: [2_705, 2_705, 4_066.50] + medicaid_ltss_mmmna: [2_705, 2_705, 4_066.5] - name: Case 3, the Washington formula adds interior excess shelter above the threshold. period: 2026-07 @@ -142,7 +142,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_community_spouse_shelter_expenses: 1_811.50 + medicaid_ltss_community_spouse_shelter_expenses: 1_811.5 cent_below_threshold: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: @@ -257,4 +257,125 @@ state_code: 2026: DE output: - medicaid_ltss_mmmna: [4_066.50, 2_893.50] + medicaid_ltss_mmmna: [4_066.5, 2_893.5] + +- name: Case 7, the Delaware formula caps above the federal maximum and states without a community spouse pay nothing. + period: 2026-07 + absolute_error_margin: 0.01 + input: + people: + delaware_above_cap: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 3_000 + delaware_cent_above_cap: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 2_173.01 + texas_no_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: false + medicaid_ltss_community_spouse_shelter_expenses: 2_000 + washington_no_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: false + medicaid_ltss_community_spouse_shelter_expenses: 2_000 + households: + delaware: + members: [delaware_above_cap, delaware_cent_above_cap] + state_code: + 2026: DE + texas: + members: [texas_no_spouse] + state_code: + 2026: TX + washington: + members: [washington_no_spouse] + state_code: + 2026: WA + output: + medicaid_ltss_mmmna: [4_066.5, 4_066.5, 0, 0] + +- name: Case 8, January through June 2026 use the July 2025 federal minimum and the January 2026 maximum. + period: 2026-03 + absolute_error_margin: 0.01 + input: + people: + texas: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 0 + delaware_base: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 0 + washington_excess_shelter: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 1_000 + households: + texas: + members: [texas] + state_code: + 2026: TX + delaware: + members: [delaware_base] + state_code: + 2026: DE + washington: + members: [washington_excess_shelter] + state_code: + 2026: WA + output: + # Washington: 2_643.75 + (1_000 - 0.3 * 2_643.75) = 2_850.625. + medicaid_ltss_mmmna: [4_066.5, 2_643.75, 2_850.625] + +- name: Case 9, June 2026 is the last month before the July 2026 federal minimum. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + delaware_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 1_000 + households: + delaware: + members: [delaware_spouse] + state_code: + 2026: DE + output: + # 2_643.75 + (1_000 - 793.125) = 2_850.625; Case 6 gives 2_893.5 for July. + medicaid_ltss_mmmna: 2_850.625 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml new file mode 100644 index 00000000000..b6423607c31 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml @@ -0,0 +1,66 @@ +- name: Case 1, special income limits derive from the SSI federal benefit rate. + period: 2026-07 + input: + people: + texas_individual: + medicaid_ltss_assistance_unit_size: 1 + texas_couple: + medicaid_ltss_assistance_unit_size: 2 + delaware_individual: + medicaid_ltss_assistance_unit_size: 1 + delaware_couple: + medicaid_ltss_assistance_unit_size: 2 + washington_individual: + medicaid_ltss_assistance_unit_size: 1 + washington_couple: + medicaid_ltss_assistance_unit_size: 2 + california_individual: + medicaid_ltss_assistance_unit_size: 1 + households: + texas_individual_household: + members: [texas_individual] + state_code: + 2026: TX + texas_couple_household: + members: [texas_couple] + state_code: + 2026: TX + delaware_individual_household: + members: [delaware_individual] + state_code: + 2026: DE + delaware_couple_household: + members: [delaware_couple] + state_code: + 2026: DE + washington_individual_household: + members: [washington_individual] + state_code: + 2026: WA + washington_couple_household: + members: [washington_couple] + state_code: + 2026: WA + california_individual_household: + members: [california_individual] + state_code: + 2026: CA + output: + # 300% of $994, twice that for a Texas couple, 250% of $994 and $1,491 in Delaware. + medicaid_ltss_special_income_limit: [2_982, 5_964, 2_485, 3_727.5, 2_982, 0, 0] + +- name: Case 2, the special income limit is zero outside the modeled assistance-unit sizes. + period: 2026-07 + input: + people: + no_unit: + medicaid_ltss_assistance_unit_size: 0 + three_person_unit: + medicaid_ltss_assistance_unit_size: 3 + households: + household: + members: [no_unit, three_person_unit] + state_code: + 2026: TX + output: + medicaid_ltss_special_income_limit: [0, 0] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py index 1367a6c6507..3b9a141539b 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -13,19 +13,25 @@ class is_medicaid_ltss_income_eligible(Variable): "does not validate a trust, expense, service, or facility rate. The " "Washington institutional branch models the WAC 182-513-1395(4) " "payment threshold using income only: the excess-resources term in " - "subsection (4)(a) is unmodeled (slightly lenient; resources are " - "screened separately), as are the three- or six-month spenddown " - "process in subsection (5) and the WAC 182-515-1507 categorically " - "needy route that bypasses the special income limit. The Delaware " - "special income limit is 250% of the SSI standard (DSSM 20100.2.2), " - "and its $20 disregard with the needs-based carve-out follows DSSM " - "20240.1 and 20990." + "subsection (4)(a) is unmodeled, which makes this variable slightly " + "lenient on its own, although the composite screen still applies " + "the resource test. The three- or six-month spenddown process in " + "subsection (5) and the WAC 182-515-1507 categorically needy route " + "that bypasses the special income limit are also unmodeled. The " + "Delaware special income limit is 250% of the SSI standard and " + "applies only to nursing facility residents (DSSM 20100.2.2); " + "Delaware's 100%-of-SSI standard for hospital stays is unmodeled, " + "so the institutional setting should not be used for a hospitalized " + "Delaware applicant. Delaware's $20 disregard, with the needs-based " + "carve-out and one disregard per couple, follows DSSM 20240.1 and " + "20990." ) reference = ( - "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://www.law.cornell.edu/cfr/text/42/435.236", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", - "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", ) @@ -38,31 +44,13 @@ def formula_2026_01_01(person, period, parameters): settings = setting.possible_values pathway = person("medicaid_ltss_financial_pathway", period) pathways = pathway.possible_values - assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) income = person("medicaid_ltss_qit_adjusted_income", period) + # The special income limit is zero outside the modeled states and + # assistance-unit sizes; the SPECIAL_INCOME pathway gate below is what + # keeps an unmodeled person from passing with zero income. + special_income_limit = person("medicaid_ltss_special_income_limit", period) - special_income_limit = select( - [ - (state == states.TX) & (assistance_unit_size == 1), - (state == states.TX) & (assistance_unit_size == 2), - (state == states.DE) & (assistance_unit_size == 1), - (state == states.DE) & (assistance_unit_size == 2), - (state == states.WA) & (assistance_unit_size == 1), - ], - [ - p.tx.special_income_limit.individual, - p.tx.special_income_limit.couple, - p.de.special_income_limit.individual, - p.de.special_income_limit.couple, - p.wa.special_income_limit.individual, - ], - default=0, - ) - - needs_based_income = min_( - person("medicaid_ltss_needs_based_income", period), - income, - ) + needs_based_income = person("medicaid_ltss_needs_based_income", period) non_needs_based_income = max_(income - needs_based_income, 0) delaware_disregard = min_( non_needs_based_income, diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py index 7bae076b926..38fe68aaef4 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -10,7 +10,20 @@ class medicaid_ltss_assistance_unit_size(Variable): documentation = ( "Explicit size of the assistance unit used by the Medicaid LTSS " "financial threshold screen. It is not inferred from a tax unit, " - "household, or marital unit. Zero is unsupported and therefore " + "household, or marital unit. Use 2 only when the state budgets " + "both spouses as a couple: in Texas, spouses in the same " + "institutional setting (MEPD G-6120; 1 TAC 358.436); in Delaware, " + "spouses requesting or receiving institutional services in the " + "same facility, who may choose couple or individual budgeting after " + "six months there (DSSM 20810). Otherwise, including an applicant " + "with a community spouse, use 1. At size 2, each spouse's income " + "and resource inputs carry the couple's combined totals, which are " + "compared with the couple limits. Zero and unsupported sizes are " "fail-closed." ) - reference = "https://www.law.cornell.edu/cfr/text/42/435.601" + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.602", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/g-6100-institutional-eligibility-budgets", + "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-436", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py index 5c0e9994ce0..647e2f3fcac 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py @@ -10,13 +10,17 @@ class medicaid_ltss_countable_resources(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Trusted comprehensive LTSS countable-resource input for the " - "applicant or applicant assistance unit after applicable state " - "exclusions, disregards, and ownership rules. When the applicant has " - "a community spouse, this input excludes resources allocated to that " - "spouse, which are supplied separately. It is not calculated from " - "PolicyEngine's narrower SSI asset inputs. The user must perform the " - "resource inventory and legal classification before supplying this " - "value." + "Trusted comprehensive LTSS countable-resource input after " + "applicable state exclusions, disregards, and ownership rules. For " + "an assistance unit of one it is the applicant's resources; for an " + "assistance unit of two it is the couple's combined resources. When " + "the applicant has a community spouse, this input excludes resources " + "allocated to that spouse, which are supplied separately. It is not " + "calculated from PolicyEngine's narrower SSI asset inputs. The user " + "must perform the resource inventory and legal classification " + "before supplying this value." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.601", + "https://www.law.cornell.edu/cfr/text/42/435.602", ) - reference = "https://www.law.cornell.edu/cfr/text/42/435.601" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index 56516fa3e51..69411a0bdcf 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -7,20 +7,27 @@ class medicaid_ltss_csra_resource_eligible(Variable): label = "Meets modeled Medicaid LTSS resource threshold after CSRA" definition_period = MONTH documentation = ( - "Tests trusted comprehensive LTSS countable-resource inputs. For an " - "applicant with a community spouse, the initial CSRA is the greater " - "of the applicable state/federal floor or the fixed statutory " - "one-half of the couple's snapshot resources under 42 USC " - "1396r-5(f)(2)(A), capped at the federal maximum. Delaware's " - "$25,000 state spousal share (DSSM 20910.10) sits below the federal " - "minimum, which therefore governs. Court and fair-hearing " - "adjustments, resource-hardship overrides, and detailed state asset " - "exclusions are not modeled." + "Tests trusted comprehensive LTSS countable-resource inputs. Texas " + "and Delaware use the SSI resource limits (1 TAC 358.323 and " + "358.437; DSSM 20100.2.2 and 20300); Washington uses its own " + "resource standard (WAC 182-513-1350). For an applicant with a " + "community spouse, the initial CSRA is the greater of the applicable " + "floor or the fixed statutory one-half of the couple's snapshot " + "resources under 42 USC 1396r-5(c)(1)(A)(ii) and (f)(2)(A), capped " + "at the federal maximum. Texas uses the federal minimum as its " + "floor; Delaware's $25,000 state spousal share (DSSM 20910.10) sits " + "below the federal minimum, which therefore governs; Washington's " + "state spousal resource standard sits above it. Court and " + "fair-hearing adjustments, resource-hardship overrides, and " + "detailed state asset exclusions are not modeled." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2", - "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-323", + "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", ) @@ -33,19 +40,17 @@ def formula_2026_01_01(person, period, parameters): assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) resources = person("medicaid_ltss_countable_resources", period) + ssi_resource_limit = parameters(period).gov.ssa.ssi.eligibility.resources.limit + texas_or_delaware = (state == states.TX) | (state == states.DE) resource_limit = select( [ - (state == states.TX) & (assistance_unit_size == 1), - (state == states.TX) & (assistance_unit_size == 2), - (state == states.DE) & (assistance_unit_size == 1), - (state == states.DE) & (assistance_unit_size == 2), + texas_or_delaware & (assistance_unit_size == 1), + texas_or_delaware & (assistance_unit_size == 2), (state == states.WA) & (assistance_unit_size == 1), ], [ - p.tx.resources.individual, - p.tx.resources.couple, - p.de.resources.individual, - p.de.resources.couple, + ssi_resource_limit.individual, + ssi_resource_limit.couple, p.wa.resources.individual, ], default=0, @@ -59,7 +64,7 @@ def formula_2026_01_01(person, period, parameters): state == states.WA, ], [ - max_(p.tx.csra.state_minimum, p.federal.csra.minimum), + p.federal.csra.minimum, max_(p.de.csra.state_minimum, p.federal.csra.minimum), max_(p.wa.csra.state_minimum, p.federal.csra.minimum), ], diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py index bae82229d37..264884e5c10 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -2,9 +2,9 @@ class MedicaidLTSSFinancialPathway(Enum): - UNMODELED = "Unmodeled" SPECIAL_INCOME = "Special income" INSTITUTIONAL_MEDICALLY_NEEDY = "Institutional medically needy" + UNMODELED = "Unmodeled" class medicaid_ltss_financial_pathway(Variable): @@ -24,13 +24,17 @@ class medicaid_ltss_financial_pathway(Variable): "source-named COPES, New Freedom, and Residential Support waivers; " "their enabled flags exist for reform analysis, so the disabled " "branch is reform-only-reachable. All other states, settings, " - "waivers, and unsupported assistance-unit sizes are unmodeled." + "waivers, and unsupported assistance-unit sizes are unmodeled. " + "Aged, blind, or disabled status is an annual input, so it cannot " + "change within a year on this monthly screen. The setting input is " + "independent of is_in_medicaid_facility; populating only that " + "variable leaves the setting UNKNOWN and the pathway unmodeled." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.236", "https://www.law.cornell.edu/cfr/text/42/435.1005", - "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505", ) @@ -45,6 +49,7 @@ def formula_2026_01_01(person, period, parameters): waivers = waiver.possible_values assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) income = person("medicaid_ltss_qit_adjusted_income", period) + special_income_limit = person("medicaid_ltss_special_income_limit", period) aged_blind_disabled = person("is_ssi_aged_blind_disabled", period.this_year) institutional = (setting == settings.INSTITUTIONAL) & (waiver == waivers.NONE) @@ -67,10 +72,10 @@ def formula_2026_01_01(person, period, parameters): & (assistance_unit_size == 1) ) washington_special_income = washington_modeled_setting & ( - income <= p.wa.special_income_limit.individual + income <= special_income_limit ) washington_medically_needy = washington_modeled_setting & ( - income > p.wa.special_income_limit.individual + income > special_income_limit ) return select( diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py index 8edcaff376f..2779109652c 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -12,18 +12,26 @@ class medicaid_ltss_home_equity_eligible(Variable): "resident-exception, and hardship inputs. Washington elects the " "federal maximum limit (WAC 182-513-1350(8)(c)); Texas and Delaware " "apply the CPI-indexed federal minimum (TX Appendix XXXI; DSSM " - "20320.7.B and 20320.7.E). Elections in other states are unmodeled: " - "equity at or below the federal minimum passes, because no state " - "may bar payment below that amount, and higher equity fails closed. " - "A person with no equity interest always passes. The agricultural-" - "land limit in the separate annual " + "20320.7.B and 20320.7.E), which from 2028 cannot exceed the " + "$1,000,000 non-agricultural maximum set by P.L. 119-21 section " + "71108. Elections in other states are unmodeled: equity at or below " + "the federal minimum passes, because no state may bar payment below " + "that amount, and higher equity fails closed. This screen is not " + "gated on the financial pathway because the payment bar applies to " + "every long-term care applicant; the composite screen applies the " + "pathway gate. A person with no equity interest always passes, and " + "a resident spouse or child exception or a granted hardship waiver " + "passes regardless of the equity amount or ownership share. The " + "agricultural-land limit in the separate annual " "is_medicaid_long_term_care_home_equity_eligible chassis is not " - "modeled here." + "modeled here; that chassis applies the federal maximum in every " + "state." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#f", - "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://www.medicaid.gov/federal-policy-guidance/downloads/cib11182025.pdf#page=9", + "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", ) @@ -32,32 +40,39 @@ def formula_2026_01_01(person, period, parameters): p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care state = person.household("state_code", period) states = state.possible_values + # The home-equity limits are annual (YEAR) parameters compared with a + # stock of equity in a MONTH formula, so they are read as-is without + # dividing by twelve. + # From 2028, P.L. 119-21 section 71108 deems an indexed + # non-agricultural amount above $1,000,000 equal to $1,000,000, so + # the uprated federal minimum cannot exceed the federal maximum. home_equity_limit = where( state == states.WA, p.home_equity.limit, - p.home_equity.minimum_limit, + min_(p.home_equity.minimum_limit, p.home_equity.limit), ) home_value = person("medicaid_ltss_home_market_value", period) encumbrances = person("medicaid_ltss_home_encumbrances", period) ownership_share = person("medicaid_ltss_home_ownership_share", period) valid_ownership_share = (ownership_share >= 0) & (ownership_share <= 1) applicant_home_equity = max_(home_value - encumbrances, 0) * ownership_share + # 42 USC 1396p(f)(2) and (f)(4) make the payment bar inapplicable + # regardless of the equity amount, so these exceptions do not depend + # on a valid ownership share. exception = ( - person("medicaid_ltss_home_occupied_by_spouse", period) - | person( - "medicaid_ltss_home_occupied_by_child_under_21", - period, - ) - | person( - "medicaid_ltss_home_occupied_by_blind_or_disabled_child", - period, - ) - | person( - "medicaid_ltss_home_equity_hardship_waiver", + add( + person, period, + [ + "medicaid_ltss_home_occupied_by_spouse", + "medicaid_ltss_home_occupied_by_child_under_21", + "medicaid_ltss_home_occupied_by_blind_or_disabled_child", + "medicaid_ltss_home_equity_hardship_waiver", + ], ) + > 0 ) - return valid_ownership_share & ( - exception | (applicant_home_equity <= home_equity_limit) + return exception | ( + valid_ownership_share & (applicant_home_equity <= home_equity_limit) ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py index afb0af4f1a0..7d30c202ab5 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py @@ -7,32 +7,39 @@ class medicaid_ltss_mmmna(Variable): label = "Medicaid LTSS minimum monthly maintenance needs allowance" unit = USD definition_period = MONTH + default_value = 0 documentation = ( "Calculates the community spouse minimum monthly maintenance needs " "allowance standard for the modeled states. Texas pays the federal " "maximum as a flat spousal allowance (TX Appendix XXXI; MEPD " - "J-7200). Delaware and Washington use the federal formula: the July " - "2026 minimum plus allowable community-spouse shelter expenses " - "above the excess-shelter threshold, supplied as an explicit input, " - "capped at the federal maximum (DSSM 20910.4 through 20910.6; WAC " - "182-513-1385(3)(a) and (4)). It is a post-eligibility spousal " - "protection standard, not an applicant income-eligibility " - "deduction; the WAC 182-513-1385(3)(b) offset for the community " - "spouse's own income belongs to the allocation, which is unmodeled. " - "The whole variable is unmodeled before July 2026, when the " - "effective-dated federal minimum begins; this also defers the Texas " - "flat maximum, which is otherwise effective January 1, 2026." + "J-7200). Delaware and Washington use the federal formula: the " + "federal minimum in effect for the month (adjusted each July 1) " + "plus allowable community-spouse shelter expenses above the " + "excess-shelter threshold, supplied as an explicit input, capped at " + "the federal maximum (adjusted each January 1) (DSSM 20910.4 " + "through 20910.6; WAC 182-513-1385(3)(a) and (4)). It is a " + "post-eligibility spousal protection standard, not an applicant " + "income-eligibility deduction, so no eligibility screen reads it; " + "the WAC 182-513-1385(3)(b) offset for the community spouse's own " + "income belongs to the allocation, which is unmodeled. Texas " + "Appendix XXXI labels this $4,066.50 figure the minimum monthly " + "maintenance needs allowance, but it equals the federal maximum. " + "Washington's standards chart rounds the minimum and the shelter " + "threshold up to whole dollars (for example $2,644 and $794 from " + "July 2025); WAC 182-513-1385 states no rounding rule, so the " + "unrounded federal amounts are used." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396r-5#d", + "https://www.medicaid.gov/federal-policy-guidance/downloads/cib05282025.pdf#page=2", "https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2", - "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxxi-budget-reference-chart", + "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/j-7200-spousal-co-payment", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385", ) - def formula_2026_07_01(person, period, parameters): + def formula_2026_01_01(person, period, parameters): p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial state = person.household("state_code", period) states = state.possible_values diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py index 77faf850fe9..b3da418e050 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py @@ -15,6 +15,6 @@ class medicaid_ltss_needs_based_income(Variable): "sources." ) reference = ( - "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py index 15f14dd4595..78ef9b4fb6d 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py @@ -9,9 +9,15 @@ class medicaid_ltss_qit_adjusted_income(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Trusted monthly income input after any qualified income trust " - "treatment and applicant/spouse ownership allocation (TX MEPD " - "F-6800; DSSM 20400.11). The model does not validate trust " + "Trusted monthly countable income after any qualified income trust " + "treatment (TX MEPD F-6800; DSSM 20400.11). For an assistance unit " + "of one, including an applicant with a community spouse, it is the " + "applicant's own income after name-on-the-check and other " + "ownership rules attribute income between the spouses (DSSM " + "20990); for an assistance unit of two, it is the couple's combined " + "income. The Delaware $20 general disregard is applied by the " + "model, but any Delaware earned-income disregards (DSSM 20240.3) " + "must already be reflected. The model does not validate trust " "legality, irrevocability, funding, payback terms, or which income " "was validly deposited. The user must perform those determinations " "before supplying this value." @@ -19,5 +25,6 @@ class medicaid_ltss_qit_adjusted_income(Variable): reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py index 2b131adedb4..0a2a4824476 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py @@ -2,9 +2,9 @@ class MedicaidLTSSSetting(Enum): - UNKNOWN = "Unknown" INSTITUTIONAL = "Institutional" HCBS = "Home and community-based services" + UNKNOWN = "Unknown" class medicaid_ltss_setting(Variable): @@ -16,11 +16,17 @@ class medicaid_ltss_setting(Variable): definition_period = MONTH documentation = ( "Explicit setting input for the opt-in Medicaid LTSS financial " - "threshold screen. UNKNOWN is fail-closed. This input does not " + "threshold screen. INSTITUTIONAL means residence in a nursing " + "facility or other medical institution for at least 30 consecutive " + "days; Delaware applies its 250% standard only to nursing facility " + "residents, so a hospitalized Delaware applicant falls outside the " + "modeled setting (DSSM 20100.2.2). UNKNOWN is fail-closed. This " + "input is independent of is_in_medicaid_facility and does not " "establish institutional level of care, functional eligibility, " "service authorization, or receipt of services." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.236", "https://www.law.cornell.edu/cfr/text/42/435.217", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py new file mode 100644 index 00000000000..abd3d4b5a4b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py @@ -0,0 +1,51 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_special_income_limit(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS special income limit" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Special income limit for the applicant's modeled state and " + "assistance unit, derived from the Supplemental Security Income " + "federal benefit rate. Texas applies 300% of the individual rate, " + "and twice that for a couple (1 TAC 358.433). Delaware applies 250% " + "of the individual or couple rate (DSSM 20100.2.2). Washington " + "applies 300% of the individual rate (WAC 182-513-1100); Washington " + "couples and all other states are unmodeled and receive zero." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.1005", + "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-433", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1100", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + fbr = parameters(period).gov.ssa.ssi.amount + state = person.household("state_code", period) + states = state.possible_values + assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) + texas_individual_limit = p.tx.special_income_limit.rate * fbr.individual + + return select( + [ + (state == states.TX) & (assistance_unit_size == 1), + (state == states.TX) & (assistance_unit_size == 2), + (state == states.DE) & (assistance_unit_size == 1), + (state == states.DE) & (assistance_unit_size == 2), + (state == states.WA) & (assistance_unit_size == 1), + ], + [ + texas_individual_limit, + texas_individual_limit * p.tx.special_income_limit.couple_multiplier, + p.de.special_income_limit.rate * fbr.individual, + p.de.special_income_limit.rate * fbr.couple, + p.wa.special_income_limit.rate * fbr.individual, + ], + default=0, + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py index 3ccb9132bbf..1e814be3b74 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py @@ -2,11 +2,11 @@ class MedicaidLTSSWaiver(Enum): - NONE = "None" WA_COPES = "Washington COPES" WA_NEW_FREEDOM = "Washington New Freedom" WA_RSW = "Washington Residential Support Waiver" UNKNOWN = "Unknown" + NONE = "None" class medicaid_ltss_waiver(Variable): From f6afddd0416174a6b9e872312ade82435a0e0389 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 6 Oct 2026 10:43:03 -0400 Subject: [PATCH 09/34] Add Delaware final-countable-income flag and LTSS registry entry - Add medicaid_ltss_income_disregards_already_applied (Person, MONTH, default false). When true, the supplied income is final countable income and Delaware's $20 general disregard is not subtracted again. DSSM 20240.3 deducts $20 before the $65 and one-half earned-income disregards, so the old contract (pre-apply earned disregards, model subtracts $20) could pass gross earnings of $5,057: (5,057 - 65) / 2 - 20 = 2,476 instead of (5,057 - 20 - 65) / 2 = 2,486 > 2,485. - Document the ordered earned-income calculation, the most-advantageous unearned-first $20, and DSSM 20990's sole $20 deduction for applicants with a community spouse. - Add a partial programs.yaml entry for the financial screen (TX, DE, WA; verified 2026), separate from the Medicaid entry. - Cite the Delaware notice's page 2 for the resource limits. - Reference follow-up issue #9895 for the annual home-equity chassis. - Pin MMMNA Case 8 at January 2026, the formula's first month. - Add property tests: the flag changes nothing outside Delaware and can only remove Delaware's disregard. Co-Authored-By: Claude Opus 5.5 --- policyengine_us/programs.yaml | 46 +++++++++++++++++ ...test_medicaid_ltss_financial_invariants.py | 34 +++++++++++++ .../is_medicaid_ltss_income_eligible.yaml | 51 +++++++++++++++++++ .../financial/medicaid_ltss_mmmna.yaml | 4 +- .../is_medicaid_ltss_income_eligible.py | 12 ++++- .../medicaid_ltss_csra_resource_eligible.py | 1 + .../medicaid_ltss_home_equity_eligible.py | 4 +- ..._ltss_income_disregards_already_applied.py | 30 +++++++++++ .../medicaid_ltss_needs_based_income.py | 5 +- .../medicaid_ltss_qit_adjusted_income.py | 14 +++-- 10 files changed, 191 insertions(+), 10 deletions(-) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index efe44de4602..0a134805b88 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -172,6 +172,52 @@ programs: verified_start_year: 2021 notes: 8 pathways + - id: medicaid_ltss_financial_screen + name: Medicaid LTSS financial screen + full_name: Medicaid long-term services and supports financial-threshold screen + category: Healthcare + agency: HHS + status: partial + coverage: US + has_state_variation: true + variable: is_medicaid_ltss_financial_threshold_eligible + parameter_prefix: gov.hhs.medicaid.eligibility.long_term_care.financial + verified_years: "2026" + notes: >- + Opt-in screen of the financial thresholds for Medicaid long-term + services and supports: the special income limit, qualified income + trusts, Washington's medically needy route, resources, the community + spouse resource allowance, home equity, and the community spouse + maintenance needs allowance. Income and resources are trusted inputs. + The screen does not feed Medicaid eligibility, enrollment, or benefit + values, and states other than Texas, Delaware, and Washington are + unmodeled. + state_implementations: + - state: TX + status: partial + name: Texas Medicaid LTSS financial screen + full_name: Texas Medicaid long-term services and supports financial-threshold screen + variable: is_medicaid_ltss_financial_threshold_eligible + parameter_prefix: gov.hhs.medicaid.eligibility.long_term_care.financial.tx + verified_years: "2026" + notes: Institutional special income limit for individuals and couples; home and community-based waivers are unmodeled. + - state: DE + status: partial + name: Delaware Medicaid LTSS financial screen + full_name: Delaware Medicaid long-term services and supports financial-threshold screen + variable: is_medicaid_ltss_financial_threshold_eligible + parameter_prefix: gov.hhs.medicaid.eligibility.long_term_care.financial.de + verified_years: "2026" + notes: Nursing facility 250% special income limit for individuals and couples; the hospital standard and home and community-based waivers are unmodeled. + - state: WA + status: partial + name: Washington Medicaid LTSS financial screen + full_name: Washington Medicaid long-term services and supports financial-threshold screen + variable: is_medicaid_ltss_financial_threshold_eligible + parameter_prefix: gov.hhs.medicaid.eligibility.long_term_care.financial.wa + verified_years: "2026" + notes: Institutional and COPES, New Freedom, and Residential Support waiver applicants without a spouse in the assistance unit, through the special income level or medically needy route. + - id: chip name: CHIP full_name: Children's Health Insurance Program diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 4abd54a62e0..b75ff9f078b 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -97,6 +97,9 @@ def _situation(people, **overrides): "medicaid_ltss_waiver": month(person["waiver"]), "medicaid_ltss_assistance_unit_size": month(person["unit_size"]), "medicaid_ltss_qit_adjusted_income": month(person["income"]), + "medicaid_ltss_income_disregards_already_applied": month( + bool(person.get("disregards_applied", False)) + ), "medicaid_ltss_needs_based_income": month(person["needs_based_income"]), "medicaid_ltss_medically_needy_expenses": month( person["medically_needy_expenses"] @@ -158,6 +161,9 @@ def column(key): people, market_value=column("market_value") + 100 * deltas ), "shelter": _calculate(people, shelter=column("shelter") + deltas), + "disregards_applied": _calculate( + people, disregards_applied=np.ones(len(people), dtype=bool) + ), } return people, column, base, shifted @@ -253,6 +259,34 @@ def test_screens_never_start_passing_when_a_countable_amount_rises( assert not newly_passing.any(), np.flatnonzero(newly_passing)[:5] +def test_final_income_flag_only_removes_the_delaware_disregard(population): + _, column, base, shifted = population + final = shifted["disregards_applied"] + delaware = column("state") == "DE" + income_screens = [ + "is_medicaid_ltss_income_eligible", + "is_medicaid_ltss_financial_threshold_eligible", + ] + for variable in OUTPUTS: + if variable in income_screens: + # Only Delaware applies a disregard, so the flag changes nothing + # elsewhere, and skipping it can only make the screens harder. + np.testing.assert_array_equal( + final[variable][~delaware], base[variable][~delaware] + ) + assert not (final[variable] & ~base[variable]).any(), variable + else: + np.testing.assert_array_equal(final[variable], base[variable]) + # With the flag, Delaware compares the supplied income itself. + special = delaware & (base["medicaid_ltss_financial_pathway"] == "SPECIAL_INCOME") + assert special.any() + np.testing.assert_array_equal( + final["is_medicaid_ltss_income_eligible"][special], + column("income")[special] + <= base["medicaid_ltss_special_income_limit"][special], + ) + + def test_mmmna_is_non_decreasing_in_shelter_expenses(population): _, _, base, shifted = population assert ( diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 3bfeff53da2..dbcfb68d4ae 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -602,3 +602,54 @@ medicaid_ltss_financial_pathway: [INSTITUTIONAL_MEDICALLY_NEEDY, INSTITUTIONAL_MEDICALLY_NEEDY] is_medicaid_ltss_income_eligible: [true, false] + +- name: Case 13, final Delaware countable income receives no second disregard. + period: 2026-07 + input: + people: + earned_at_limit: + # Gross earnings 5_055: (5_055 - 20 - 65) / 2 = 2_485. + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_485 + medicaid_ltss_income_disregards_already_applied: true + earned_above_limit: + # Gross earnings 5_057: (5_057 - 20 - 65) / 2 = 2_486. Subtracting + # another $20 would give 2_466 and wrongly pass. + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_486 + medicaid_ltss_income_disregards_already_applied: true + community_spouse_case: + # DSSM 20990: gross earnings 5_055 - 20 = 5_035, the sole deduction. + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_qit_adjusted_income: 5_035 + medicaid_ltss_income_disregards_already_applied: true + raw_unearned: + # 2_505 - 20 = 2_485. + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_505 + medicaid_ltss_income_disregards_already_applied: false + households: + delaware: + members: + [earned_at_limit, earned_above_limit, community_spouse_case, raw_unearned] + state_code: + 2026: DE + output: + is_medicaid_ltss_income_eligible: [true, false, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml index 0167ae678f2..758fd436cde 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -312,8 +312,8 @@ output: medicaid_ltss_mmmna: [4_066.5, 4_066.5, 0, 0] -- name: Case 8, January through June 2026 use the July 2025 federal minimum and the January 2026 maximum. - period: 2026-03 +- name: Case 8, January 2026 uses the July 2025 federal minimum and the January 2026 maximum. + period: 2026-01 absolute_error_margin: 0.01 input: people: diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py index 3b9a141539b..97d70146292 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -24,7 +24,12 @@ class is_medicaid_ltss_income_eligible(Variable): "so the institutional setting should not be used for a hospitalized " "Delaware applicant. Delaware's $20 disregard, with the needs-based " "carve-out and one disregard per couple, follows DSSM 20240.1 and " - "20990." + "20990; it is skipped when " + "medicaid_ltss_income_disregards_already_applied marks the income " + "input as final countable income, which earned income of an " + "applicant without a community spouse requires because DSSM 20240.3 " + "deducts the $20 before the $65 and one-half earned-income " + "disregards." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.236", @@ -56,8 +61,11 @@ def formula_2026_01_01(person, period, parameters): non_needs_based_income, p.de.income.general_disregard, ) + disregards_already_applied = person( + "medicaid_ltss_income_disregards_already_applied", period + ) income_after_disregard = where( - state == states.DE, + (state == states.DE) & ~disregards_already_applied, max_(income - delaware_disregard, 0), income, ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index 69411a0bdcf..e878fe85d6b 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -26,6 +26,7 @@ class medicaid_ltss_csra_resource_eligible(Variable): "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-323", "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", + "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=2", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py index 2779109652c..e13bafce371 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -25,7 +25,9 @@ class medicaid_ltss_home_equity_eligible(Variable): "agricultural-land limit in the separate annual " "is_medicaid_long_term_care_home_equity_eligible chassis is not " "modeled here; that chassis applies the federal maximum in every " - "state." + "state, so it passes Texas or Delaware equity between the federal " + "minimum and maximum that this screen bars (follow-up: " + "https://github.com/PolicyEngine/policyengine-us/issues/9895)." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#f", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py new file mode 100644 index 00000000000..6ee30e2beb1 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_income_disregards_already_applied(Variable): + value_type = bool + entity = Person + label = "Medicaid LTSS income input already reflects every income disregard" + definition_period = MONTH + default_value = False + documentation = ( + "Marks medicaid_ltss_qit_adjusted_income as the final countable " + "income after every Delaware income disregard, so the model applies " + "no further disregard. Delaware is the only modeled state with a " + "disregard before the special income limit test, so the flag has no " + "effect elsewhere. When false, the model treats the input as gross " + "income and subtracts the $20 general disregard from its " + "non-needs-based portion (DSSM 20240.1). That is correct for income " + "without earnings, and for any income of an applicant with a " + "community spouse, because DSSM 20990 makes the $20 disregard the " + "sole deduction for that applicant. Earned income of any other " + "applicant needs the final amount: DSSM 20240.3 deducts $20, then " + "$65, then one-half of the remaining gross earnings, and when there " + "is also unearned income the $20 applies to the unearned income " + "first, as the most advantageous order." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py index b3da418e050..8401c7101a6 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py @@ -11,8 +11,9 @@ class medicaid_ltss_needs_based_income(Variable): documentation = ( "Trusted portion of QIT-adjusted income that comes from needs-based " "sources. The Delaware general income disregard is not applied to " - "this portion. The model does not classify or allocate income " - "sources." + "this portion. It has no effect when " + "medicaid_ltss_income_disregards_already_applied is true. The model " + "does not classify or allocate income sources." ) reference = ( "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py index 78ef9b4fb6d..eab065cbb1d 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py @@ -15,9 +15,16 @@ class medicaid_ltss_qit_adjusted_income(Variable): "applicant's own income after name-on-the-check and other " "ownership rules attribute income between the spouses (DSSM " "20990); for an assistance unit of two, it is the couple's combined " - "income. The Delaware $20 general disregard is applied by the " - "model, but any Delaware earned-income disregards (DSSM 20240.3) " - "must already be reflected. The model does not validate trust " + "income. In Delaware, supply either gross income, from which the " + "model subtracts the $20 general disregard, or the final countable " + "income after every disregard with " + "medicaid_ltss_income_disregards_already_applied set to true. Gross " + "income works without earnings, or for an applicant with a community " + "spouse, whose sole deduction is the $20 (DSSM 20990). Other earned " + "income needs the final amount, because DSSM 20240.3 deducts the $20 " + "before the $65 and one-half earned-income disregards: gross " + "earnings of $5,057 count as (5,057 - 20 - 65) / 2 = $2,486, not " + "(5,057 - 65) / 2 - 20 = $2,476. The model does not validate trust " "legality, irrevocability, funding, payback terms, or which income " "was validly deposited. The user must perform those determinations " "before supplying this value." @@ -25,6 +32,7 @@ class medicaid_ltss_qit_adjusted_income(Variable): reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", ) From 42624f99fa01b5cb1ee9db1d0f07c14009eac0db Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:42:56 -0400 Subject: [PATCH 10/34] Add LTSS round-two regressions and initial-determination input --- .../is_medicaid_ltss_income_eligible.yaml | 19 +++ .../medicaid_ltss_csra_resource_eligible.yaml | 108 ++++++++++++++++++ .../medicaid_ltss_home_equity_eligible.yaml | 59 ++++++++++ .../financial/medicaid_ltss_mmmna.yaml | 11 +- ...ss_is_initial_eligibility_determination.py | 24 ++++ 5 files changed, 216 insertions(+), 5 deletions(-) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index dbcfb68d4ae..88c8171b6f3 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -603,6 +603,25 @@ [INSTITUTIONAL_MEDICALLY_NEEDY, INSTITUTIONAL_MEDICALLY_NEEDY] is_medicaid_ltss_income_eligible: [true, false] +- name: Washington COPES medically needy income level follows SSI uprating in 2027. + period: 2027-01 + input: + state_code: + 2027: WA + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2027: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 2_500 + output: + medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY + # Net income 4_000 - 500 - 2_500 = 1_000 exceeds the 2026 standard + # of 994 but is below the uprated one-person SSI federal benefit rate. + is_medicaid_ltss_income_eligible: true + - name: Case 13, final Delaware countable income receives no second disregard. period: 2026-07 input: diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index ec1f94b98c0..bf98e5aa755 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -807,3 +807,111 @@ 2026: WA output: medicaid_ltss_csra_resource_eligible: [true, false] + +- name: Case 19, continuing Delaware eligibility ignores community spouse resources above the initial allowance. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 60_000 + output: + medicaid_ltss_csra_resource_eligible: true + +- name: Case 20, continuing Delaware eligibility cannot shelter excess applicant resources in an unused CSRA. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_community_spouse_countable_resources: 0 + output: + medicaid_ltss_csra_resource_eligible: false + +- name: Case 21, explicit initial Delaware eligibility tests combined current resources after CSRA. + period: 2026-07 + input: + people: + spouse_resources_above_allowance: &initial_applicant + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 60_000 + resources_available_for_transfer: + <<: *initial_applicant + medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_community_spouse_countable_resources: 0 + households: + household: + members: [spouse_resources_above_allowance, resources_available_for_transfer] + state_code: + 2026: DE + output: + medicaid_ltss_csra_resource_eligible: [false, true] + +- name: Case 22, an omitted determination input preserves initial Delaware resource treatment. + period: 2026-07 + input: + people: + spouse_resources_above_allowance: &default_initial_applicant + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 60_000 + resources_available_for_transfer: + <<: *default_initial_applicant + medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_community_spouse_countable_resources: 0 + households: + household: + members: [spouse_resources_above_allowance, resources_available_for_transfer] + state_code: + 2026: DE + output: + medicaid_ltss_is_initial_eligibility_determination: [true, true] + medicaid_ltss_csra_resource_eligible: [false, true] + +- name: Case 23, continuing community spouse eligibility still rejects a couple assistance unit. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_community_spouse_countable_resources: 0 + output: + medicaid_ltss_csra_resource_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml index 5b4af876c38..980bdd0fe45 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml @@ -1,3 +1,62 @@ +- name: Delaware combines married co-owners' interests in their retained home. + period: 2026-07 + input: + people: + million_first: &million_owner + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_home_market_value: 1_000_000 + medicaid_ltss_home_encumbrances: 0 + medicaid_ltss_home_ownership_share: 0.5 + medicaid_ltss_home_occupied_by_spouse: false + medicaid_ltss_home_equity_hardship_waiver: false + million_second: *million_owner + boundary_first: &boundary_owner + <<: *million_owner + medicaid_ltss_home_market_value: 752_000 + boundary_second: *boundary_owner + third_party_first: &third_party_owner + <<: *million_owner + medicaid_ltss_home_market_value: 1_500_000 + medicaid_ltss_home_ownership_share: 0.25 + third_party_second: *third_party_owner + marital_units: + million_couple: + members: [million_first, million_second] + boundary_couple: + members: [boundary_first, boundary_second] + third_party_couple: + members: [third_party_first, third_party_second] + households: + delaware: + members: [million_first, million_second, boundary_first, boundary_second, + third_party_first, third_party_second] + state_code: {2026: DE} + output: + # DSSM 20320.7.C treats spouses as one owner, irrespective of budgeting unit. + # Combined interests are $1m (fail), $752k (pass), and $750k (pass). + medicaid_ltss_home_equity_eligible: [false, false, true, true, true, true] + +- name: Delaware married ownership remains combined under individual budgets. + period: 2026-07 + input: + people: + first: &individual_owner + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_home_market_value: 1_000_000 + medicaid_ltss_home_ownership_share: 0.5 + second: *individual_owner + marital_units: + couple: + members: [first, second] + households: + delaware: + members: [first, second] + state_code: {2026: DE} + output: + medicaid_ltss_home_equity_eligible: [false, false] + - name: Case 1, Texas home-equity cap includes the exact boundary. period: 2026-07 input: diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml index 758fd436cde..26b0c5b2e57 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -130,7 +130,7 @@ output: medicaid_ltss_mmmna: [2_705, 2_705, 4_066.5] -- name: Case 3, the Washington formula adds interior excess shelter above the threshold. +- name: Case 3, Washington uses its published July shelter threshold. period: 2026-07 absolute_error_margin: 0.01 input: @@ -176,7 +176,8 @@ state_code: 2026: WA output: - medicaid_ltss_mmmna: [3_705, 2_705] + # Washington publishes 812, rather than the unrounded federal 811.50. + medicaid_ltss_mmmna: [3_704.5, 2_705] - name: Case 4, no community spouse produces no allowance. period: 2026-07 @@ -312,7 +313,7 @@ output: medicaid_ltss_mmmna: [4_066.5, 4_066.5, 0, 0] -- name: Case 8, January 2026 uses the July 2025 federal minimum and the January 2026 maximum. +- name: Case 8, January 2026 uses the operative federal and published state standards. period: 2026-01 absolute_error_margin: 0.01 input: @@ -355,8 +356,8 @@ state_code: 2026: WA output: - # Washington: 2_643.75 + (1_000 - 0.3 * 2_643.75) = 2_850.625. - medicaid_ltss_mmmna: [4_066.5, 2_643.75, 2_850.625] + # Washington's published values: 2_644 + (1_000 - 794) = 2_850. + medicaid_ltss_mmmna: [4_066.5, 2_643.75, 2_850] - name: Case 9, June 2026 is the last month before the July 2026 federal minimum. period: 2026-06 diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py new file mode 100644 index 00000000000..68589d80e9a --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_is_initial_eligibility_determination(Variable): + value_type = bool + entity = Person + label = "Medicaid LTSS initial eligibility determination" + definition_period = MONTH + default_value = True + documentation = ( + "Whether the modeled month is an initial LTSS eligibility " + "determination. Defaults to initial eligibility, when current " + "resources of both spouses are tested after the community spouse " + "resource allowance. Set false only for months after eligibility " + "was established during the same continuous LTSS period. In those " + "months, community spouse resources are not deemed available and " + "the applicant's own countable resources are tested against the " + "individual resource limit under 42 USC 1396r-5(c)(4). This input " + "affects only applicants with a community spouse." + ) + reference = ( + "https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", + ) From 77c89729a437ad2547d459ae777b0e9cdadd23bf Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:44:00 -0400 Subject: [PATCH 11/34] Combine Delaware spouses home-equity interests --- .../medicaid_ltss_home_equity_eligible.py | 22 ++++++++++++++++++- .../medicaid_ltss_home_ownership_share.py | 17 +++++++++++--- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py index e13bafce371..f3dfeb1bf33 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -19,7 +19,10 @@ class medicaid_ltss_home_equity_eligible(Variable): "that amount, and higher equity fails closed. This screen is not " "gated on the financial pathway because the payment bar applies to " "every long-term care applicant; the composite screen applies the " - "pathway gate. A person with no equity interest always passes, and " + "pathway gate. Delaware treats spouses as one owner (DSSM " + "20320.7.C), so their individual shares in the marital unit are " + "combined even when their income/resources are budgeted separately. " + "A person with no applicable equity interest passes, and " "a resident spouse or child exception or a granted hardship waiver " "passes regardless of the equity amount or ownership share. The " "agricultural-land limit in the separate annual " @@ -57,6 +60,23 @@ def formula_2026_01_01(person, period, parameters): encumbrances = person("medicaid_ltss_home_encumbrances", period) ownership_share = person("medicaid_ltss_home_ownership_share", period) valid_ownership_share = (ownership_share >= 0) & (ownership_share <= 1) + # DSSM 20320.7.C: spouses are one owner. These inputs remain each + # spouse's individual share in the same home, not repeated couple + # totals. Third-party owners' shares are not in the marital unit. + marital_ownership_share = person.marital_unit.sum(ownership_share) + valid_marital_ownership_share = ( + (person.marital_unit.sum(~valid_ownership_share) == 0) + & (marital_ownership_share >= 0) + & (marital_ownership_share <= 1) + ) + valid_ownership_share = where( + state == states.DE, + valid_marital_ownership_share, + valid_ownership_share, + ) + ownership_share = where( + state == states.DE, marital_ownership_share, ownership_share + ) applicant_home_equity = max_(home_value - encumbrances, 0) * ownership_share # 42 USC 1396p(f)(2) and (f)(4) make the payment bar inapplicable # regardless of the equity amount, so these exceptions do not depend diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py index 11f6893f472..6c9c0e94c1c 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py @@ -10,7 +10,18 @@ class medicaid_ltss_home_ownership_share(Variable): default_value = 0 documentation = ( "Explicit fractional share of the home's equity owned by the LTSS " - "applicant, from zero to one. Zero is the safe default. The model does " - "not determine title, jointly owned shares, or legal ownership." + "applicant, from zero to one. For Delaware, supply both spouses' " + "individual shares in the same retained home on their respective " + "Person records in one marital unit, with the same whole-home value " + "and encumbrances. The equity screen sums their shares because DSSM " + "20320.7.C treats spouses as one owner, regardless of their income " + "or resource budgeting unit. Do not repeat a combined couple share " + "on both spouses. Third-party ownership is excluded from that sum. " + "Zero is the default for an individual with no ownership interest. " + "The model does not determine title, individual shares, or legal " + "ownership." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396p#f", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17", ) - reference = "https://www.law.cornell.edu/uscode/text/42/1396p#f" From cbb145281a2ad5459426d5cc3546ae3ee7ace576 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:48:30 -0400 Subject: [PATCH 12/34] Separate initial and continuing LTSS resource eligibility --- ...ss_community_spouse_countable_resources.py | 6 ++++- .../medicaid_ltss_csra_resource_eligible.py | 22 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py index e7ff04d8b62..28f32bbc041 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py @@ -12,7 +12,11 @@ class medicaid_ltss_community_spouse_countable_resources(Variable): documentation = ( "Trusted current comprehensive LTSS countable resources allocated to " "the community spouse after applicable ownership and exclusion " - "rules. Court orders, fair-hearing adjustments, and legal ownership " + "rules. Combined with applicant resources only for an initial " + "eligibility determination. After the eligibility month in the same " + "continuous LTSS period, these resources are not deemed available " + "when medicaid_ltss_is_initial_eligibility_determination is false. " + "Court orders, fair-hearing adjustments, and legal ownership " "determinations are not modeled." ) reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index e878fe85d6b..936d01ee866 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -4,7 +4,7 @@ class medicaid_ltss_csra_resource_eligible(Variable): value_type = bool entity = Person - label = "Meets modeled Medicaid LTSS resource threshold after CSRA" + label = "Meets modeled Medicaid LTSS resource threshold" definition_period = MONTH documentation = ( "Tests trusted comprehensive LTSS countable-resource inputs. Texas " @@ -17,17 +17,26 @@ class medicaid_ltss_csra_resource_eligible(Variable): "at the federal maximum. Texas uses the federal minimum as its " "floor; Delaware's $25,000 state spousal share (DSSM 20910.10) sits " "below the federal minimum, which therefore governs; Washington's " - "state spousal resource standard sits above it. Court and " + "state spousal resource standard sits above it. Initial eligibility " + "tests both spouses' current resources against the CSRA plus the " + "applicant's resource limit. After the eligibility month in the same " + "continuous LTSS period, set " + "medicaid_ltss_is_initial_eligibility_determination to false: only " + "the applicant's resources count against the individual limit, " + "without community spouse resources or a CSRA, under 42 USC " + "1396r-5(c)(4) and DSSM 20980. Court and " "fair-hearing adjustments, resource-hardship overrides, and " "detailed state asset exclusions are not modeled." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2", + "https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm", "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-323", "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=2", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", ) @@ -84,8 +93,13 @@ def formula_2026_01_01(person, period, parameters): period, ) has_community_spouse = person("medicaid_ltss_has_community_spouse", period) - community_spouse_eligible = (assistance_unit_size == 1) & ( - current_couple_resources <= csra + resource_limit + is_initial_determination = person( + "medicaid_ltss_is_initial_eligibility_determination", period + ) + community_spouse_eligible = (assistance_unit_size == 1) & where( + is_initial_determination, + current_couple_resources <= csra + resource_limit, + resources <= resource_limit, ) modeled_pathway = pathway != pathways.UNMODELED From 1925fa6ca27c780316cbbd006179311cb58c0b75 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:54:31 -0400 Subject: [PATCH 13/34] Index Washington LTSS medically needy limit to SSI --- .../financial/wa/medically_needy/income_level.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml index 7abca607a4d..40870ad5440 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -1,12 +1,15 @@ -description: Washington uses this monthly medically needy income level for a single person under Medicaid long-term services and supports. +description: Washington uses this monthly medically needy income level for a single person under Medicaid long-term services and supports, equal to the one-person SSI federal benefit rate and updated each January with the Social Security cost-of-living adjustment. values: 2026-01-01: 994 metadata: + uprating: gov.ssa.ssi.amount.individual unit: currency-USD period: month label: Washington Medicaid LTSS medically needy income level for a single person reference: + - title: WAC 182-519-0050(1) and (5) - Annual COLA and the effective one-person medically needy income level + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-519-0050 - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility From 24711fa628a4e906fa6b73a04f912b3241828544 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:57:05 -0400 Subject: [PATCH 14/34] Use Washington published LTSS maintenance standards --- changelog.d/ltss-financial-round-two.fixed.md | 1 + .../financial/wa/mmmna/minimum.yaml | 16 ++++++++ .../financial/wa/mmmna/shelter_threshold.yaml | 16 ++++++++ .../financial/medicaid_ltss_mmmna.py | 38 ++++++++++++------- 4 files changed, 57 insertions(+), 14 deletions(-) create mode 100644 changelog.d/ltss-financial-round-two.fixed.md create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml diff --git a/changelog.d/ltss-financial-round-two.fixed.md b/changelog.d/ltss-financial-round-two.fixed.md new file mode 100644 index 00000000000..3b127f70c7c --- /dev/null +++ b/changelog.d/ltss-financial-round-two.fixed.md @@ -0,0 +1 @@ +Correct Delaware married home-equity interests and continuing spousal resource eligibility, index Washington's LTSS medically needy income limit to SSI, and use Washington's published maintenance and shelter standards. diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml new file mode 100644 index 00000000000..a40de1892e6 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml @@ -0,0 +1,16 @@ +description: Washington publishes this minimum monthly maintenance needs allowance standard for a community spouse under Medicaid long-term services and supports. +values: + 2025-07-01: 2_644 + 2026-07-01: 2_705 + +metadata: + unit: currency-USD + period: month + label: Washington Medicaid LTSS minimum monthly maintenance needs allowance + reference: + - title: WAC 182-513-1385(2) and (4)(a) - Published community spouse standards and minimum allowance + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385 + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 + - title: Washington Apple Health Income and Resource Standards, July 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf#page=3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml new file mode 100644 index 00000000000..5e11d6c5072 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml @@ -0,0 +1,16 @@ +description: Washington publishes this monthly community spouse shelter threshold under Medicaid long-term services and supports; allowable shelter expenses above this standard increase the maintenance needs allowance. +values: + 2025-07-01: 794 + 2026-07-01: 812 + +metadata: + unit: currency-USD + period: month + label: Washington Medicaid LTSS community spouse shelter threshold + reference: + - title: WAC 182-513-1385(2) and (4)(b) - Published community spouse standards and excess shelter expenses + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385 + - title: Washington Apple Health Income and Resource Standards, January 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 + - title: Washington Apple Health Income and Resource Standards, July 1, 2026 + href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf#page=3 diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py index 7d30c202ab5..30fb901ea37 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py @@ -12,11 +12,12 @@ class medicaid_ltss_mmmna(Variable): "Calculates the community spouse minimum monthly maintenance needs " "allowance standard for the modeled states. Texas pays the federal " "maximum as a flat spousal allowance (TX Appendix XXXI; MEPD " - "J-7200). Delaware and Washington use the federal formula: the " - "federal minimum in effect for the month (adjusted each July 1) " - "plus allowable community-spouse shelter expenses above the " - "excess-shelter threshold, supplied as an explicit input, capped at " - "the federal maximum (adjusted each January 1) (DSSM 20910.4 " + "J-7200). Delaware uses the federal minimum and shelter threshold, " + "while Washington uses its published state standards under WAC " + "182-513-1385(2). The allowance adds allowable community-spouse " + "shelter expenses above the shelter threshold to the minimum in " + "effect for the month (adjusted each July 1), capped at the federal " + "maximum (adjusted each January 1) (DSSM 20910.4 " "through 20910.6; WAC 182-513-1385(3)(a) and (4)). It is a " "post-eligibility spousal protection standard, not an applicant " "income-eligibility deduction, so no eligibility screen reads it; " @@ -24,10 +25,11 @@ class medicaid_ltss_mmmna(Variable): "income belongs to the allocation, which is unmodeled. Texas " "Appendix XXXI labels this $4,066.50 figure the minimum monthly " "maintenance needs allowance, but it equals the federal maximum. " - "Washington's standards chart rounds the minimum and the shelter " - "threshold up to whole dollars (for example $2,644 and $794 from " - "July 2025); WAC 182-513-1385 states no rounding rule, so the " - "unrounded federal amounts are used." + "Washington's published minimum and shelter threshold are $2,644 " + "and $794 through June 2026, then $2,705 and $812 from July 2026. " + "These published standards are used even where they differ from " + "the unrounded federal arithmetic: January 2026 shelter expenses " + "of $1,000 produce $2,850, rather than $2,850.625." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396r-5#d", @@ -37,6 +39,8 @@ class medicaid_ltss_mmmna(Variable): "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/j-7200-spousal-co-payment", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385", + "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", + "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf#page=3", ) def formula_2026_01_01(person, period, parameters): @@ -51,13 +55,19 @@ def formula_2026_01_01(person, period, parameters): period, ) - excess_shelter_expenses = max_( - shelter_expenses - - (p.federal.mmmna.minimum * p.federal.mmmna.shelter_threshold_rate), - 0, + minimum = where( + state == states.WA, + p.wa.mmmna.minimum, + p.federal.mmmna.minimum, + ) + shelter_threshold = where( + state == states.WA, + p.wa.mmmna.shelter_threshold, + p.federal.mmmna.minimum * p.federal.mmmna.shelter_threshold_rate, ) + excess_shelter_expenses = max_(shelter_expenses - shelter_threshold, 0) formula_mmmna = min_( - p.federal.mmmna.minimum + excess_shelter_expenses, + minimum + excess_shelter_expenses, p.federal.mmmna.maximum, ) mmmna = where( From 688f0b4ea35016dc09cd9584b8681f55070c4e5d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 06:58:16 -0400 Subject: [PATCH 15/34] Clarify LTSS couple units and isolate invariant applicants --- .../core/test_medicaid_ltss_financial_invariants.py | 5 ++++- .../financial/medicaid_ltss_assistance_unit_size.py | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index b75ff9f078b..22a58588128 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -81,7 +81,7 @@ def month(value): def _situation(people, **overrides): - situation = {"people": {}, "households": {}} + situation = {"people": {}, "households": {}, "marital_units": {}} for state in STATES: situation["households"][state] = { "members": [], @@ -90,6 +90,9 @@ def _situation(people, **overrides): for index, person in enumerate(people): person = {**person, **{k: v[index] for k, v in overrides.items()}} name = f"person_{index}" + # Each random record is independent; the builder otherwise places + # every person in one default marital unit. + situation["marital_units"][name] = {"members": [name]} situation["households"][person["state"]]["members"].append(name) situation["people"][name] = { "is_ssi_aged_blind_disabled": {YEAR: person["aged_blind_disabled"]}, diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py index 38fe68aaef4..18d49903daa 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -14,11 +14,16 @@ class medicaid_ltss_assistance_unit_size(Variable): "both spouses as a couple: in Texas, spouses in the same " "institutional setting (MEPD G-6120; 1 TAC 358.436); in Delaware, " "spouses requesting or receiving institutional services in the " - "same facility, who may choose couple or individual budgeting after " - "six months there (DSSM 20810). Otherwise, including an applicant " + "same facility must use couple budgeting until they have both " + "resided there for six months, after which they may choose couple " + "or individual budgeting in their best interests (DSSM 20810). " + "Delaware also uses couple standards when both spouses request or " + "receive HCBS at the same address. Otherwise, including an applicant " "with a community spouse, use 1. At size 2, each spouse's income " "and resource inputs carry the couple's combined totals, which are " - "compared with the couple limits. Zero and unsupported sizes are " + "compared with the couple limits. Delaware's home-equity screen " + "combines the spouses' ownership interests independently of this " + "budgeting unit (DSSM 20320.7.C). Zero and unsupported sizes are " "fail-closed." ) reference = ( @@ -26,4 +31,5 @@ class medicaid_ltss_assistance_unit_size(Variable): "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/g-6100-institutional-eligibility-budgets", "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-436", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17", ) From ce76dd46d62ae95ab46567bd854c22a7beb5309e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 07:33:04 -0400 Subject: [PATCH 16/34] Document LTSS round-two evidence and reviewer response --- 9184-r2-body.md | 86 +++++++++++++++++++++++++ 9184-r2-evidence/README.md | 26 ++++++++ 9184-r2-evidence/after-composite.log | 16 +++++ 9184-r2-evidence/after-equity.log | 18 ++++++ 9184-r2-evidence/after-income.log | 16 +++++ 9184-r2-evidence/after-invariants.log | 2 + 9184-r2-evidence/after-mmmna.log | 16 +++++ 9184-r2-evidence/after-pathway.log | 16 +++++ 9184-r2-evidence/after-resources.log | 16 +++++ 9184-r2-evidence/after-sil.log | 16 +++++ 9184-r2-evidence/before-equity.log | 28 ++++++++ 9184-r2-evidence/before-income.log | 23 +++++++ 9184-r2-evidence/before-mmmna.log | 28 ++++++++ 9184-r2-evidence/before-resources.log | 28 ++++++++ 9184-r2-evidence/ci-before.log | 35 ++++++++++ 9184-r2-evidence/ci-model-head.log | 35 ++++++++++ 9184-r2-evidence/dependency-audit.txt | 3 + 9184-r2-evidence/format-contracts.log | 4 ++ 9184-r2-evidence/format-equity.log | 4 ++ 9184-r2-evidence/format-regressions.log | 4 ++ 9184-r2-evidence/format-report.log | 4 ++ 9184-r2-evidence/format-resources.log | 4 ++ 9184-r2-evidence/format-wa-income.log | 4 ++ 9184-r2-evidence/format-wa-mmmna.log | 4 ++ 9184-r2-evidence/push-model.log | 6 ++ 9184-r2-report.md | 36 +++++++++++ 26 files changed, 478 insertions(+) create mode 100644 9184-r2-body.md create mode 100644 9184-r2-evidence/README.md create mode 100644 9184-r2-evidence/after-composite.log create mode 100644 9184-r2-evidence/after-equity.log create mode 100644 9184-r2-evidence/after-income.log create mode 100644 9184-r2-evidence/after-invariants.log create mode 100644 9184-r2-evidence/after-mmmna.log create mode 100644 9184-r2-evidence/after-pathway.log create mode 100644 9184-r2-evidence/after-resources.log create mode 100644 9184-r2-evidence/after-sil.log create mode 100644 9184-r2-evidence/before-equity.log create mode 100644 9184-r2-evidence/before-income.log create mode 100644 9184-r2-evidence/before-mmmna.log create mode 100644 9184-r2-evidence/before-resources.log create mode 100644 9184-r2-evidence/ci-before.log create mode 100644 9184-r2-evidence/ci-model-head.log create mode 100644 9184-r2-evidence/dependency-audit.txt create mode 100644 9184-r2-evidence/format-contracts.log create mode 100644 9184-r2-evidence/format-equity.log create mode 100644 9184-r2-evidence/format-regressions.log create mode 100644 9184-r2-evidence/format-report.log create mode 100644 9184-r2-evidence/format-resources.log create mode 100644 9184-r2-evidence/format-wa-income.log create mode 100644 9184-r2-evidence/format-wa-mmmna.log create mode 100644 9184-r2-evidence/push-model.log create mode 100644 9184-r2-report.md diff --git a/9184-r2-body.md b/9184-r2-body.md new file mode 100644 index 00000000000..a2db575bf8c --- /dev/null +++ b/9184-r2-body.md @@ -0,0 +1,86 @@ +Adds an opt-in Medicaid long-term services and supports (LTSS) financial-eligibility screen: an effective-dated 2026 federal chassis with Texas, Delaware, and Washington parameters covering the special income limit routes (300% of SSI in TX/WA; Delaware's 250% route with the $20-disregard mechanics), qualified income trusts, institutional medically-needy budgeting (WA), initial and continuing resource eligibility, home-equity caps, and spousal impoverishment protections (CSRA floor/half/maximum regimes and MMMNA). + +Twenty-eight new variables — seven computed screens (`medicaid_ltss_financial_pathway`, `is_medicaid_ltss_income_eligible`, `medicaid_ltss_csra_resource_eligible`, `medicaid_ltss_home_equity_eligible`, `medicaid_ltss_mmmna`, `medicaid_ltss_special_income_limit`, `is_medicaid_ltss_financial_threshold_eligible`) plus twenty-one documented trusted-input variables — deliberately **not** integrated into `is_medicaid_eligible`, enrollment/take-up, or Medicaid benefit values. Functional/level-of-care eligibility is out of scope and labeled as such; QIT-adjusted income and countable resources are trusted inputs with the limitation in metadata; unknown HCBS waivers fail closed to `unmodeled` rather than inheriting statewide rules. The modeled routes are SSI-related, so the pathway gates on `is_ssi_aged_blind_disabled` (42 CFR 435.236, 435.1005). + +Home equity follows 42 USC 1396p(f): Washington elects the federal maximum and reads the existing tracked `home_equity.limit` parameter (WAC 182-513-1350(8)(c)); Texas and Delaware apply the CPI-indexed federal minimum via a new `home_equity.minimum_limit` parameter in the same tree, pinned to published CIB values (TX Appendix XXXI; DSSM 20320.7.B/E). A person with no applicable individual or Delaware marital equity interest passes everywhere; unmodeled states pass at or below the federal minimum and fail closed above it. Delaware sums the spouses' individual ownership shares before testing their marital home interest, independent of the income/resource budgeting unit (DSSM 20320.7.C). The community-spouse MMMNA is regime-specific: Texas pays the federal maximum flat (Appendix XXXI; MEPD J-7200); Delaware uses federal minimum-plus-excess-shelter arithmetic (DSSM 20910.4–.6); Washington uses its published rounded minimum and shelter standards (WAC 182-513-1385(2)). + +Every parameter value traces to a cited primary source (Texas HHS Appendix XXXI Rev. 26-2, Delaware's DMMA Administrative Notice A-14-2025 and DSSM sections, Washington's 2026 standards and WACs, and the May 2025 / April 2026 CMS CIBs) with reference URLs and page anchors in the YAML metadata. + +Financial YAML tests cover every SIL/resource/home-equity boundary (including encumbrance/ownership-share arithmetic landing exactly at the cap and invalid-share fail-closure), TX QIT sufficiency both ways, DE's 250% + disregard including an interior partial-disregard bind, WA SIL-failure→institutional-MN and the SSI-indexed one-person HCBS medically-needy income level, all three CSRA control regimes with both-sided ±$1 brackets and the WA half-snapshot tie, per-state MMMNA regimes with the zero branches, the ABD categorical gate, non-homeowner and cross-state comparisons, fail-closed unknown-waiver/unknown-setting/unsupported-state/zero-unit cases, and vectorized cases. + +The reviewer-response table below addresses the substantive findings and optional suggestions from @DTrim99 and Pavel. + +🤖 Generated with [Claude Code](https://claude.com/claude-code) + + +## Fix round 2 (2026-10-07) + +This round fixes Delaware married co-owner equity, distinguishes initial from continuing spousal resource eligibility, indexes Washington's medically needy income level to canonical SSI, and follows Washington's published rounded MMMNA standards. It preserves the recovered canonical SIL/resource parameters, registry entry, effective-date coverage and all ten obsolete parameter deletions. + +### Reviewer response + +| Finding | Resolution and source/test references | +|---|---| +| Delaware married co-owners (round-2 P1) | Retains individual ownership-share inputs and automatically sums the marital unit's shares for Delaware. Callers must supply both spouses in one marital unit, with each spouse's own share and the same whole-home value and encumbrances. Two nursing-facility spouses with 50% shares in a mortgage-free $1,000,000 retained home each fail the $752,000 cap; the same ownership in a $752,000 home passes. This treatment also applies when the couple is budgeted as two individuals. [formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py), [married co-owner regressions](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml), [DSSM §20320.7.C, p17](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17). | +| Initial versus continuing CSRA eligibility (round-2 P2) | Added monthly Person Boolean `medicaid_ltss_is_initial_eligibility_determination`, default true. Initial determinations retain combined current resources and the snapshot-based CSRA. After the eligibility month in the same continuous LTSS period, false tests the applicant's resources alone against the individual limit; community-spouse resources and the CSRA no longer enter this test. A $100,000 snapshot yields a $50,000 CSRA: subsequent applicant $2,000/spouse $60,000 passes; applicant $2,001/spouse $0 fails. Initial/default cases remain covered. [input contract](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py), [regressions](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml), [42 USC §1396r-5(c)(2), (4)](https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm). | +| Washington annual medically needy income level (round-2 P2) | Replaced the frozen $994 future limit with canonical SSI-FBR uprating. Washington updates the effective one-person MNIL each January with SSA's COLA. The 2027 COPES regression has $4,000 income less $500 allowable deductions and $2,500 care cost: $1,000 net passes the projected FBR, rather than failing against 2026's $994. Future amounts are model projections until official values are published. [parameter](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml), [2027 regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml), [WAC 182-515-1508(2)(c)(ii)](https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508), [WAC 182-519-0050(1), (5)](https://app.leg.wa.gov/wac/default.aspx?cite=182-519-0050). | +| Washington published MMMNA standards (round-2 P2) | Uses the agency's January 2026 $2,644 minimum and $794 shelter threshold: shelter expenses of $1,000 yield $2,850. Bare federal arithmetic gave $2,850.625, a $0.625 difference. July 2026 uses the published $2,705/$812 standards, so $1,811.50 shelter yields $3,704.50 rather than $3,705. The agency chart governs the model, following Max's d1011 precedent; this is resolved rather than an unrestricted legal rounding election. Delaware retains its federal arithmetic and Texas its flat maximum; the shared maximum remains $4,066.50. [formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py), [January/July regressions](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml), [WAC 182-513-1385(2)](https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385), [January 2026 chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf), [July 2026 chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf). | +| Impact narrative (round-2 P3) | Removed the contradictory claims that completed impact measurements were missing. The hub's record-by-record 2026/2028 comparison measured exactly zero changes in all five existing Medicaid/household outputs. That result carries over because these fixes alter only the new screens and their inputs/parameters, with no existing consumer. See Impact below. | +| Pre-July MMMNA (Pavel A1; DTrim99) | January–June remain supported: Delaware retains the operative July 2025 federal minimum, $2,643.75, and Texas uses the January federal maximum, $4,066.50. Washington uses its January published $2,644 minimum and $794 shelter threshold. July 2026 changes the minimum to $2,705. A pre-July zero expectation would be incorrect. [MMMNA formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py), [minimum](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml), [January regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml), [June regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml). | +| CSRA and composite coverage (Pavel A2; DTrim99) | Preserved exact Cases 13–18: DE floor $32,532/half-snapshot $50,000/cap $162,660; WA floor $72,529/half-snapshot $100,000/cap $162,660, each with a boundary pass and $1-over failure. [CSRA Cases 13–18](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml). Preserved [sole-resource composite failure](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml), [MMMNA cap](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml), and [December 2025 unsupported period](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml). | +| Program registry (Pavel A3) | Separate partial HHS/Healthcare screen, TX/DE/WA, verified 2026, with its own financial parameter prefix; existing Medicaid status remains complete. [programs.yaml](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/programs.yaml). | +| Annual equity divergence (Pavel A4) | Documented that the annual chassis still uses the federal maximum across states: TX/DE $900,000 equity passes that annual screen but fails this new $752,000 minimum-based screen in 2026. A separate consumer change and impact analysis are tracked in [#9895](https://github.com/PolicyEngine/policyengine-us/issues/9895). [equity documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | +| Standalone equity gate (Pavel A5) | Retained an independent statutory payment-bar screen; the composite applies the modeled-pathway gate. [equity contract](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py), [composite](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.py). | +| Trusted units/couple budgeting (Pavel A6) | AU=2 means combined couple income/resources supplied on each applicant; AU=1/community-spouse cases use separately attributed applicant amounts. Delaware's couple SIL is 250% of couple SSI ($3,727.50), rather than twice the individual SIL. The legal couple-budget requirements and limited post-six-month election are set out below; Delaware's marital home-equity aggregation applies under either budget. [AU documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py), [resource documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py), [income documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py), [SSI-derived SIL](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py). | +| Equity indexing (Pavel A7) | Preserved CPI-U uprating and nearest-$1,000 rounding. The 2028 $1 million non-agricultural ceiling caps the indexed minimum; it does not replace the minimum with $1 million. [minimum_limit.yaml](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml), [ceiling formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | +| Delaware hospitals/scope (Pavel A8; DTrim99 extensions) | Delaware's institutional screen remains limited to nursing facilities; its 100%-SSI hospital route is disclosed as unmodeled. Court/hearing adjustments, agricultural equity, AK/HI, unidentified waivers, and WA excess-resource income/spenddown extensions remain outside this build. WA's composite still applies the resource screen. [income limitations](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py), [resource limitations](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py), [pathway scope](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py). | +| References/evidence (Pavel A9/A12; DTrim99) | Pinned DSSM is the 73-page export: §20300 p10, §20810 p67, §§20910.4–.10 p69, §20990 p71, equity §20320.7 p17, QIT §20400.11 p54. Delaware's 2026 resource notice now cites p2. [resources references](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py), [AU reference](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py), [QIT references](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py), [equity reference](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | +| Canonical parameters/metadata (Pavel A10/A11; DTrim99) | SIL derives from canonical SSI: TX $2,982/$5,964; DE $2,485/$3,727.50; WA $2,982. TX/DE use canonical SSI resource thresholds and TX uses the federal CSRA floor. WA $72,529 starts July 2025. Stocks and rate multipliers are not divided by twelve. [SIL](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py), [resources](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py), [WA effective date](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml), [stock metadata](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py), [annual equity units](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | +| Earlier defects/exception priority (DTrim99) | Preserved DE nonowner/minimum-equity behavior, TX flat-maximum MMMNA, ABD categorization rather than SSI financial eligibility, negative-equity flooring, and invalid-input fail-closure. Statutory resident-family/hardship exceptions take priority even with invalid ownership shares; invalid shares otherwise fail. [ABD gate](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py), [equity formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py), [exception/negative-equity cases](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml). | +| Couple $20 test/disabled waiver (DTrim99) | Existing couple tests already bracket needs-based $3,727/$3,727.50/$3,728 and ordinary $3,747/$3,747.50/$3,748, with one $20 disregard per couple. COPES coverage explicitly disables its parameter while preserving New Freedom. [needs-based couple cases](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml), [ordinary couple cases](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml), [disabled COPES](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml). | +| Earned-income deduction order (DTrim99) | Added monthly Person Boolean medicaid_ltss_income_disregards_already_applied, default false. True marks final countable income and skips any additional Delaware $20 deduction; false preserves raw ordinary-unearned handling. Non-spousal earnings require ordered $20, then $65, then half; mixed income applies the general exclusion to unearned income first. §20990 community-spouse cases use the sole $20 deduction. [flag contract](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py), [income calculation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py), [worked calculation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py). [regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml) verifies final $2,485 pass/$2,486 fail, spousal $5,035 fail, and raw unearned $2,505 pass. | + +| Optional enum/description cosmetics (DTrim99) | Enum defaults remain last. The longer trusted-input descriptions remain because they define ownership, budgeting and fail-closure contracts; shortening them is deferred as a cosmetic change. | +| Optional canonical CIB URL (DTrim99) | Retains equivalent official CMS URL variants: they cite the same source bulletins. URL normalization is deferred as a cosmetic change. | + +### Validation evidence + +Local validation on code head **688f0b4ea3**: all seven financial YAML files ran individually in separate sequential processes; **89 cases passed** (16 equity, 23 resources, 14 income, 9 MMMNA, 15 pathway, 2 SIL, 10 composite). The invariant file ran separately: **18 passed**. No concurrent test processes, heavy-lock microsimulation, or new CI runners were used. + +Before-fix evidence preserved **seven expected failures**: two married-equity cases, the two continuing-resource cases, the 2027 COPES case, and January/July Washington rounding. Initial/default and passing equity controls remained green. Regression commit **42624f99fa** contains the new tests and input schema against the original model formulas. + +`make format` and its lint check passed before each implementation commit. Logs and the zero-existing-consumer dependency audit are saved in `9184-r2-evidence/`. The after-equity test passed all 16 cases; its optional memory-reporting wrapper subsequently failed because sandbox permissions denied `sysctl kern.clockrate`, so peak memory is unavailable. + +CI checked with `gh pr checks` for code head **688f0b4ea3**, [Actions run 37612263818](https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818). At 2026-10-07 11:29 UTC, **Quick Feedback (selective tests and coverage) passed** in 7m44s. Six checks have succeeded, one is running and 28 are queued; no failures are reported. The full pipeline is still in progress. This snapshot verifies the code revision; the subsequent report/body/evidence commit changes no model or test code. + +Before-fix regression runs use formula bodies byte-identical to `b24094b166`. The new determination input schema is registered solely to let the continuing-resource tests supply their flag; the resource formula in those runs remains unchanged. The resulting failures preserve the old behavior before the fixes are applied. + +The invariant fixture now assigns each independent random applicant a singleton marital unit. Core's missing-group default places all people in one unit, which would make the new Delaware marital aggregation combine unrelated records. All existing assertions and the 18-test count are preserved. + +Prior-head Linux CI evidence remains available for **b24094b166**, [Actions run 37504243982](https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982): all 30 checks succeeded, including 81 financial YAML cases, 18 invariants, 620 partner-contract cases and 1,250 baseline HHS cases. Those are prior-head CI results; the round-2 results above identify the local reruns and current-head checks. No partner expected outputs were edited. + +### Impact + +The hub completed a real microsimulation comparing merge base `6b80a8e447` with `b24094b166` on the default dataset `populace_us_2024.h5@populace-us-2024-spm-20260909`, for 2026 and 2028, under the shared heavy lock. It ran once per side and compared every record. + +**Exactly zero measured change** in both years: `is_medicaid_eligible`, `medicaid`, `household_health_benefits`, `household_net_income` and `household_net_income_including_health_benefits` are identical on every record, with zero people or dollars changed. + +That zero result carries over to this round. The fixes change only the new LTSS screen variables and their inputs/parameters; no existing eligibility, benefit or household-income variable consumes them. The existing annual home-equity consumer is untouched and its separate correction remains tracked in [#9895](https://github.com/PolicyEngine/policyengine-us/issues/9895). There is no changed existing consumer for the hub to re-run. + +The new monthly outputs have no main comparator and are not a national LTSS caseload estimate. Default unsupported setting and assistance-unit inputs make the composite false. Supplied-input regressions establish the repaired boundary behavior; MMMNA remains informational and does not feed the composite eligibility screen. + +Future-year scope: this round indexes Washington's one-person MNIL to canonical SSI projections; it does not claim complete verification of 2027 eligibility standards. Federal CSRA/MMMNA allowance leaves and Washington's published MMMNA chart values carry their latest sourced 2026 values into later periods. Later official allowance/chart amounts have not been verified. + +### Methodology choices for Max + +Washington rounding is resolved: follow the [agency's published standards](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf), which [WAC 182-513-1385(2)](https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385) expressly identifies. The January $2,850 allowance differs by $0.625 from bare federal arithmetic; the model discloses that difference and follows Max's d1011 precedent. + +The remaining choices are: + +- **Standalone equity gate.** Choice: retain an independent statutory home-equity payment-bar screen, with the modeled-pathway gate in composite eligibility. Alternative: make the standalone output false whenever the financial pathway is unmodeled. The chosen design preserves a useful equity result independently of which income/resource route is implemented. [42 USC §1396p(f)](https://www.law.cornell.edu/uscode/text/42/1396p#f) fixes the legal payment bar and exceptions; it does not prescribe this software API boundary. This is an API design choice, with no discretion to waive the statutory bar. +- **Delaware couple budgeting.** Choice: the caller supplies the legally permitted unit and its correctly attributed totals. Alternative: infer the unit after adding facility/residence and duration inputs, including an explicit post-six-month election. The trusted-input design avoids inventing those administrative facts. [DSSM §20810, p67](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67) requires a couple budget when both spouses request/receive institutional services at the same facility; only after six months together there does it allow couple or individual budgeting, selected in the couple's best interests. Same-address HCBS couples also use couple standards. The law leaves the post-six-month institutional election open; it does not leave the earlier unit arbitrary. Delaware still combines spouses' home-equity interests under either unit. +- **Earned-income input contract.** Choice: retain `medicaid_ltss_income_disregards_already_applied`, default false; true means final countable income and prevents a second Delaware $20 deduction. Alternative: require separate raw earned/unearned components and compute every exclusion internally. The existing trusted-input API keeps this bounded screen usable while avoiding an incomplete earned-income calculation. The law leaves the API representation open, but the deduction order is mandatory: [DSSM §20240.3, p9](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9) applies $20, then $65, then half to non-spousal earnings; mixed income uses the general exclusion on unearned income first. [§20990, p71](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71) gives community-spouse applicants only the $20 deduction. + +DTrim99's CHANGES_REQUESTED review remains outstanding. Reviewer clearance and Max's remaining API/budgeting decisions are required before merge. This PR has not been merged. + +axiom: needed diff --git a/9184-r2-evidence/README.md b/9184-r2-evidence/README.md new file mode 100644 index 00000000000..b86335512de --- /dev/null +++ b/9184-r2-evidence/README.md @@ -0,0 +1,26 @@ +Round-2 validation evidence for PolicyEngine US PR #9184. + +The affected formula/parameter was unchanged from `b24094b166` when each before-fix regression ran. The new default-true determination input schema was registered solely to accept the new continuing-resource input; the old resource formula ignored it. Initial/default controls and passing equity controls stayed green. + +Before-fix results: equity 2 failed/14 passed; resources 2 failed/21 passed; income 1 failed/13 passed; MMMNA 2 failed/7 passed. These seven failures preserve the defects described in review-r1. + +All tests ran one file at a time, with no concurrent test processes or national microsimulation. The first before-equity run used `policyengine-core test -c policyengine_us`. Other YAML runs used the same Core runner with the country's initialized system, avoiding the CLI's additional model construction: + +```python +from policyengine_us.system import system +from policyengine_core.tools.test_runner import run_tests + +raise SystemExit(run_tests(system, [single_file_path])) +``` + +The invariant file used `python -m pytest policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py -q` in a separate process. The existing assertions and 18-test count are preserved; its independent applicants now have explicit singleton marital units. + +Environment: Python 3.13.9, policyengine-core 3.32.20, NumPy 2.5.3, pandas 3.0.6, pytest 9.1.1, ruff 0.16.10. The prior job's virtual environment was executed read-only, with `PYTHONDONTWRITEBYTECODE=1` and `PYTHONPATH` set to this workspace. Imports were confirmed to resolve to this workspace. + +`make format` ran before every commit, using `UV_NO_SYNC=1`, `UV_PYTHON=3.13`, that existing environment and a workspace-local UV cache. Format logs include the accompanying lint checks. + +The after-equity test itself passed all 16 cases. Its optional `/usr/bin/time -l` wrapper returned 1 after the successful test because sandbox permissions denied `sysctl kern.clockrate`; the log records 137.43 seconds wall time, but peak-memory reporting is unavailable. This instrumentation failure does not indicate a test failure. Remaining validation runs omit that wrapper. + +The dependency audit finds zero existing variable consumers of the 28 new financial screen/input variables. The completed hub microsimulation at merge base `6b80a8e447` versus `b24094b166` found exactly zero change in all five existing Medicaid/household outputs for 2026 and 2028; this carries over because no existing consumer or its parameters changes in round 2. + +No partner contract test files or expected outputs changed. CI snapshots identify the head they verify in the final report and PR body. diff --git a/9184-r2-evidence/after-composite.log b/9184-r2-evidence/after-composite.log new file mode 100644 index 00000000000..1bf1161bee8 --- /dev/null +++ b/9184-r2-evidence/after-composite.log @@ -0,0 +1,16 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 10 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml .......... + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 10 passed, 1 warning in 10.35s ======================== diff --git a/9184-r2-evidence/after-equity.log b/9184-r2-evidence/after-equity.log new file mode 100644 index 00000000000..aace501b812 --- /dev/null +++ b/9184-r2-evidence/after-equity.log @@ -0,0 +1,18 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 16 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml ................ + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 16 passed, 1 warning in 13.50s ======================== + 137.43 real 31.48 user 3.67 sys +time: sysctl kern.clockrate: Operation not permitted diff --git a/9184-r2-evidence/after-income.log b/9184-r2-evidence/after-income.log new file mode 100644 index 00000000000..ee8baa11b24 --- /dev/null +++ b/9184-r2-evidence/after-income.log @@ -0,0 +1,16 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 14 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml .............. + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 14 passed, 1 warning in 24.52s ======================== diff --git a/9184-r2-evidence/after-invariants.log b/9184-r2-evidence/after-invariants.log new file mode 100644 index 00000000000..de8b385e7e9 --- /dev/null +++ b/9184-r2-evidence/after-invariants.log @@ -0,0 +1,2 @@ +.................. [100%] +18 passed in 6.17s diff --git a/9184-r2-evidence/after-mmmna.log b/9184-r2-evidence/after-mmmna.log new file mode 100644 index 00000000000..68d91f4b709 --- /dev/null +++ b/9184-r2-evidence/after-mmmna.log @@ -0,0 +1,16 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 9 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml ......... + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 9 passed, 1 warning in 10.73s ========================= diff --git a/9184-r2-evidence/after-pathway.log b/9184-r2-evidence/after-pathway.log new file mode 100644 index 00000000000..9d53de4febe --- /dev/null +++ b/9184-r2-evidence/after-pathway.log @@ -0,0 +1,16 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 15 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml ............... + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 15 passed, 1 warning in 44.01s ======================== diff --git a/9184-r2-evidence/after-resources.log b/9184-r2-evidence/after-resources.log new file mode 100644 index 00000000000..2c864dc79ee --- /dev/null +++ b/9184-r2-evidence/after-resources.log @@ -0,0 +1,16 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 23 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml ....................... + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 23 passed, 1 warning in 36.30s ======================== diff --git a/9184-r2-evidence/after-sil.log b/9184-r2-evidence/after-sil.log new file mode 100644 index 00000000000..fb4593ba68f --- /dev/null +++ b/9184-r2-evidence/after-sil.log @@ -0,0 +1,16 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 2 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml .. + +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +======================== 2 passed, 1 warning in 13.68s ========================= diff --git a/9184-r2-evidence/before-equity.log b/9184-r2-evidence/before-equity.log new file mode 100644 index 00000000000..af1615910a0 --- /dev/null +++ b/9184-r2-evidence/before-equity.log @@ -0,0 +1,28 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 16 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml FF.............. + +=================================== FAILURES =================================== +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml: + Test 'Delaware combines married co-owners' interests in their retained home.': + medicaid_ltss_home_equity_eligible@2026-07: [1. 1. 1. 1. 1. 1.] differs from [0. 0. 1. 1. 1. 1.] with an absolute margin [1. 1. 0. 0. 0. 0.] > 0.001 +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml: + Test 'Delaware married ownership remains combined under individual budgets.': + medicaid_ltss_home_equity_eligible@2026-07: [1. 1.] differs from [0. 0.] with an absolute margin [1. 1.] > 0.001 +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml:: +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml:: +=================== 2 failed, 14 passed, 1 warning in 36.87s =================== diff --git a/9184-r2-evidence/before-income.log b/9184-r2-evidence/before-income.log new file mode 100644 index 00000000000..65f3a39ab40 --- /dev/null +++ b/9184-r2-evidence/before-income.log @@ -0,0 +1,23 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 14 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml ............F. + +=================================== FAILURES =================================== +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml: + Test 'Washington COPES medically needy income level follows SSI uprating in 2027.': + is_medicaid_ltss_income_eligible@2027-01: [0.] differs from 1.0 with an absolute margin [1.] > 0.001 +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml:: +=================== 1 failed, 13 passed, 1 warning in 14.66s =================== diff --git a/9184-r2-evidence/before-mmmna.log b/9184-r2-evidence/before-mmmna.log new file mode 100644 index 00000000000..f11eb10905e --- /dev/null +++ b/9184-r2-evidence/before-mmmna.log @@ -0,0 +1,28 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 9 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml ..F....F. + +=================================== FAILURES =================================== +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml: + Test 'Case 3, Washington uses its published July shelter threshold.': + medicaid_ltss_mmmna@2026-07: [3705. 2705.] differs from [3704.5 2705. ] with an absolute margin [0.5 0. ] > 0.01 +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml: + Test 'Case 8, January 2026 uses the operative federal and published state standards.': + medicaid_ltss_mmmna@2026-01: [4066.5 2643.75 2850.625] differs from [4066.5 2643.75 2850. ] with an absolute margin [0. 0. 0.625] > 0.01 +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml:: +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml:: +==================== 2 failed, 7 passed, 1 warning in 9.90s ==================== diff --git a/9184-r2-evidence/before-resources.log b/9184-r2-evidence/before-resources.log new file mode 100644 index 00000000000..0a03c950c49 --- /dev/null +++ b/9184-r2-evidence/before-resources.log @@ -0,0 +1,28 @@ +============================= test session starts ============================== +platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 +rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 +configfile: pyproject.toml +plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 +collected 23 items + +policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml ..................FF... + +=================================== FAILURES =================================== +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml: + Test 'Case 19, continuing Delaware eligibility ignores community spouse resources above the initial allowance.': + medicaid_ltss_csra_resource_eligible@2026-07: [0.] differs from 1.0 with an absolute margin [1.] > 0.001 +_________________________________ test session _________________________________ +/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml: + Test 'Case 20, continuing Delaware eligibility cannot shelter excess applicant resources in an unused CSRA.': + medicaid_ltss_csra_resource_eligible@2026-07: [1.] differs from 0.0 with an absolute margin [1.] > 0.001 +=============================== warnings summary =============================== +../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 + /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio + self._mark_plugins_for_rewrite(hook, disable_autoload) + +-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html +=========================== short test summary info ============================ +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml:: +FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml:: +=================== 2 failed, 21 passed, 1 warning in 17.64s =================== diff --git a/9184-r2-evidence/ci-before.log b/9184-r2-evidence/ci-before.log new file mode 100644 index 00000000000..9bb002f4898 --- /dev/null +++ b/9184-r2-evidence/ci-before.log @@ -0,0 +1,35 @@ +Check changelog fragment pass 11s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112473423786 +Check committed registry lock pass 21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112473424109 +Full Suite - Baseline (contrib-hhs) pass 16m38s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089062 +Full Suite - Baseline (household) pass 16m38s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089033 +Full Suite - Baseline (irs) pass 18m21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088909 +Full Suite - Baseline (reform) pass 20m29s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089020 +Full Suite - Baseline (rest-a) pass 8m30s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089099 +Full Suite - Baseline (rest-b) pass 13m43s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089021 +Full Suite - Baseline (ssa-usda) pass 29m41s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088929 +Full Suite - Baseline (states-shard-1) pass 18m33s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088951 +Full Suite - Baseline (states-shard-2) pass 23m13s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088959 +Full Suite - Baseline (states-shard-3) pass 17m30s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088922 +Full Suite - Baseline (states-shard-4) pass 18m51s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089059 +Full Suite - Contrib (congress) pass 18m0s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088988 +Full Suite - Contrib (other-shard-1) pass 34m14s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088975 +Full Suite - Contrib (other-shard-2a) pass 13m49s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089002 +Full Suite - Contrib (other-shard-2b) pass 16m20s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089046 +Full Suite - Contrib (other-shard-3) pass 13m0s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088952 +Full Suite - Contrib (states-shard-1) pass 25m21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089050 +Full Suite - Contrib (states-shard-2) pass 38m1s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088902 +Full Suite - Contrib (states-shard-3) pass 36m1s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088836 +Full Suite - Contrib (states-shard-4) pass 32m52s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089078 +Full Suite - Microsimulation pass 30m19s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088826 +Full Suite - Rest (Python + variables) pass 50m55s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088778 +Household API Partners pass 12m3s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088672 +Install + smoke-import (py3.11) pass 1m6s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088728 +Install + smoke-import (py3.12) pass 1m14s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088713 +Install + smoke-import (py3.13) pass 1m17s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088636 +Install + smoke-import (py3.14) pass 1m43s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088724 +Lint pass 19s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088532 +Quick Feedback (Selective Tests + Coverage) pass 7m43s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088620 +Release lock guard tests pass 21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112473424164 +Unpublished release wheel (final) pass 48s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474254772 +Unpublished release wheel (rc1) pass 51s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474255538 +Validate bundle metadata contract pass 1m14s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088481 diff --git a/9184-r2-evidence/ci-model-head.log b/9184-r2-evidence/ci-model-head.log new file mode 100644 index 00000000000..723e125d18b --- /dev/null +++ b/9184-r2-evidence/ci-model-head.log @@ -0,0 +1,35 @@ +Full Suite - Baseline (contrib-hhs) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329822 +Full Suite - Baseline (household) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329786 +Full Suite - Baseline (irs) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329728 +Full Suite - Baseline (reform) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329914 +Full Suite - Baseline (rest-a) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329849 +Full Suite - Baseline (rest-b) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329781 +Full Suite - Baseline (ssa-usda) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329732 +Full Suite - Baseline (states-shard-1) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329833 +Full Suite - Baseline (states-shard-2) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329990 +Full Suite - Baseline (states-shard-3) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329717 +Full Suite - Baseline (states-shard-4) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329800 +Full Suite - Contrib (congress) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329937 +Full Suite - Contrib (other-shard-1) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329949 +Full Suite - Contrib (other-shard-2a) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329819 +Full Suite - Contrib (other-shard-2b) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765330058 +Full Suite - Contrib (other-shard-3) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329942 +Full Suite - Contrib (states-shard-1) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329888 +Full Suite - Contrib (states-shard-2) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329894 +Full Suite - Contrib (states-shard-3) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329877 +Full Suite - Contrib (states-shard-4) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329961 +Full Suite - Microsimulation pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329506 +Full Suite - Rest (Python + variables) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329677 +Household API Partners pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329502 +Install + smoke-import (py3.11) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329532 +Install + smoke-import (py3.12) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329617 +Install + smoke-import (py3.13) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329628 +Install + smoke-import (py3.14) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329515 +Lint pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329507 +Validate bundle metadata contract pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329419 +Check changelog fragment pass 11s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112762089994 +Check committed registry lock pass 16s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112762090026 +Quick Feedback (Selective Tests + Coverage) pass 7m44s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329423 +Release lock guard tests pass 23s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112762089551 +Unpublished release wheel (final) pass 41s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329449 +Unpublished release wheel (rc1) pass 37s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329544 diff --git a/9184-r2-evidence/dependency-audit.txt b/9184-r2-evidence/dependency-audit.txt new file mode 100644 index 00000000000..f4c5e5bd441 --- /dev/null +++ b/9184-r2-evidence/dependency-audit.txt @@ -0,0 +1,3 @@ +Audited 28 financial screen/input variables against Python variables outside the new financial subtree. +Existing variable consumers: 0 +All round-2 formula/parameter edits are confined to the new financial subtree. diff --git a/9184-r2-evidence/format-contracts.log b/9184-r2-evidence/format-contracts.log new file mode 100644 index 00000000000..b5f101bde3b --- /dev/null +++ b/9184-r2-evidence/format-contracts.log @@ -0,0 +1,4 @@ +uv run ruff format . +6980 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/format-equity.log b/9184-r2-evidence/format-equity.log new file mode 100644 index 00000000000..22662bef46d --- /dev/null +++ b/9184-r2-evidence/format-equity.log @@ -0,0 +1,4 @@ +uv run ruff format . +6979 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/format-regressions.log b/9184-r2-evidence/format-regressions.log new file mode 100644 index 00000000000..22662bef46d --- /dev/null +++ b/9184-r2-evidence/format-regressions.log @@ -0,0 +1,4 @@ +uv run ruff format . +6979 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/format-report.log b/9184-r2-evidence/format-report.log new file mode 100644 index 00000000000..3012f6734a6 --- /dev/null +++ b/9184-r2-evidence/format-report.log @@ -0,0 +1,4 @@ +uv run ruff format . +1 file reformatted, 6981 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/format-resources.log b/9184-r2-evidence/format-resources.log new file mode 100644 index 00000000000..22662bef46d --- /dev/null +++ b/9184-r2-evidence/format-resources.log @@ -0,0 +1,4 @@ +uv run ruff format . +6979 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/format-wa-income.log b/9184-r2-evidence/format-wa-income.log new file mode 100644 index 00000000000..22662bef46d --- /dev/null +++ b/9184-r2-evidence/format-wa-income.log @@ -0,0 +1,4 @@ +uv run ruff format . +6979 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/format-wa-mmmna.log b/9184-r2-evidence/format-wa-mmmna.log new file mode 100644 index 00000000000..b5f101bde3b --- /dev/null +++ b/9184-r2-evidence/format-wa-mmmna.log @@ -0,0 +1,4 @@ +uv run ruff format . +6980 files left unchanged +uv run ruff check . +All checks passed! diff --git a/9184-r2-evidence/push-model.log b/9184-r2-evidence/push-model.log new file mode 100644 index 00000000000..53beba394d2 --- /dev/null +++ b/9184-r2-evidence/push-model.log @@ -0,0 +1,6 @@ +remote: +remote: GitHub found 57 vulnerabilities on PolicyEngine/policyengine-us's default branch (2 critical, 24 high, 28 moderate, 3 low). To find out more, visit: +remote: https://github.com/PolicyEngine/policyengine-us/security/dependabot +remote: +To https://github.com/PolicyEngine/policyengine-us.git + b24094b166..688f0b4ea3 HEAD -> ltss-financial-eligibility diff --git a/9184-r2-report.md b/9184-r2-report.md new file mode 100644 index 00000000000..474e85dc08e --- /dev/null +++ b/9184-r2-report.md @@ -0,0 +1,36 @@ +Implemented the five round-2 requests for [PolicyEngine US #9184](https://github.com/PolicyEngine/policyengine-us/pull/9184), based on `b24094b166`. The implementation commits were fast-forwarded to `ltss-financial-eligibility`; the PR body is updated. No merge or force-push was performed. + +- Delaware sums spouses' individual home-ownership shares within their marital unit. Two 50% owners of a mortgage-free $1,000,000 retained home fail the $752,000 cap; a $752,000 home passes. Individual budgeting does not split that interest. Callers supply both individual shares and the same whole-home value/encumbrances. [DSSM §20320.7.C](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17). +- Added `medicaid_ltss_is_initial_eligibility_determination`, default true. Continuing eligibility tests applicant resources alone: $2,000 with spouse $60,000 passes; $2,001 with spouse $0 fails. Initial/default controls retain CSRA budgeting. [42 USC §1396r-5(c)(4)](https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm). +- Washington MNIL follows canonical SSI uprating. The 2027 COPES case ($4,000 − $500 − $2,500 = $1,000) passes. The annual basis is [WAC 182-519-0050(1), (5)](https://app.leg.wa.gov/wac/default.aspx?cite=182-519-0050). +- Washington MMMNA uses the published $2,644 minimum/$794 shelter threshold in January: $1,000 shelter gives $2,850, versus bare arithmetic's $2,850.625. July uses $2,705/$812. The PR body explains the difference and Max's d1011 precedent. [January chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf), [July chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf). +- Updated reviewer responses, methodology and completed impact evidence. The invariant fixture now gives independent applicants singleton marital units; all existing assertions remain. + +All requested files ran individually, with no concurrent test processes: + +| File | Before fix | After fix | +|---|---:|---:| +| medicaid_ltss_home_equity_eligible.yaml | 2 failed, 14 passed | 16 passed | +| medicaid_ltss_csra_resource_eligible.yaml | 2 failed, 21 passed | 23 passed | +| is_medicaid_ltss_income_eligible.yaml | 1 failed, 13 passed | 14 passed | +| medicaid_ltss_mmmna.yaml | 2 failed, 7 passed | 9 passed | +| medicaid_ltss_financial_pathway.yaml | — | 15 passed | +| medicaid_ltss_special_income_limit.yaml | — | 2 passed | +| is_medicaid_ltss_financial_threshold_eligible.yaml | — | 10 passed | +| test_medicaid_ltss_financial_invariants.py | — | 18 passed | + +The seven expected failures used unchanged `b24094b166` formulas/parameters; only the new input schema was registered to accept the continuing flag. Regression commit `42624f99fa` preserves that failing model. Total: **89 YAML cases and 18 invariants passed**. `make format` and lint passed before every commit. Failure/pass logs and the dependency audit are in `9184-r2-evidence/`. Equity’s tests passed; optional peak-memory instrumentation was denied by the sandbox. + +The hub's real 2026/2028 microsimulation, merge base `6b80a8e447` versus `b24094b166`, measured exactly zero changes in `is_medicaid_eligible`, `medicaid`, `household_health_benefits`, `household_net_income` and `household_net_income_including_health_benefits`. That zero result carries over: the dependency audit found no existing consumers of the 28 financial screen/input variables, and no existing consumer or its parameters changes. The hub has no changed consumer to re-run. + +Max's remaining choices, detailed in the PR body: + +- **Standalone equity:** retain the independent screen and gate the composite. Alternative: gate the standalone result too. Independence preserves the statutory equity information; law fixes the bar/exceptions but leaves API organization open. +- **Couple budgeting:** callers supply the permitted unit/totals. Alternative: derive it from added residence/duration/election inputs. The contract avoids inventing administrative facts. Delaware law requires couple budgeting initially and leaves an individual/couple election open only after six months together in the institution; same-address HCBS couples use couple budgets. +- **Earned income:** retain the final-countable-income flag. Alternative: model separate raw earnings/unearned income and all exclusions. This bounds the trusted-input API. Law leaves representation open; deduction order is mandatory. + +Future MNIL amounts use SSI projections. Federal CSRA/MMMNA and Washington chart amounts beyond their sourced 2026 values remain unverified future standards. + +Six implementation/test commits: `42624f99fa`, `77c89729a4`, `cbb145281a`, `1925fa6ca2`, `24711fa628`, `688f0b4ea3`. Report, PR-body copy and test logs are saved in this workspace. Common Git metadata was read-only, so commits use private `.venv/.git-r2` metadata here; the caller's checkout was not written. **CI:** `gh pr checks` on code head `688f0b4ea3` confirmed Quick Feedback passed (7m44s). At 11:29 UTC, six checks succeeded, one was running and 28 were queued; no failures were reported. [Run 37612263818](https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818). Full CI is still in progress; the final documentation/evidence commit changes no model or test code. + +No partner expected outputs changed. No merge was performed; DTrim99's re-review and Max's remaining choices are still outstanding. From 9d9f411c715a3b2995131c9ed4f7dc79a9823d5a Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 07:36:55 -0400 Subject: [PATCH 17/34] Remove the hub's round-2 evidence files committed by mistake These were working notes and logs from the fix round, not part of the change. They are kept outside the repository. Co-Authored-By: Claude Opus 5.5 --- 9184-r2-body.md | 86 ------------------------- 9184-r2-evidence/README.md | 26 -------- 9184-r2-evidence/after-composite.log | 16 ----- 9184-r2-evidence/after-equity.log | 18 ------ 9184-r2-evidence/after-income.log | 16 ----- 9184-r2-evidence/after-invariants.log | 2 - 9184-r2-evidence/after-mmmna.log | 16 ----- 9184-r2-evidence/after-pathway.log | 16 ----- 9184-r2-evidence/after-resources.log | 16 ----- 9184-r2-evidence/after-sil.log | 16 ----- 9184-r2-evidence/before-equity.log | 28 -------- 9184-r2-evidence/before-income.log | 23 ------- 9184-r2-evidence/before-mmmna.log | 28 -------- 9184-r2-evidence/before-resources.log | 28 -------- 9184-r2-evidence/ci-before.log | 35 ---------- 9184-r2-evidence/ci-model-head.log | 35 ---------- 9184-r2-evidence/dependency-audit.txt | 3 - 9184-r2-evidence/format-contracts.log | 4 -- 9184-r2-evidence/format-equity.log | 4 -- 9184-r2-evidence/format-regressions.log | 4 -- 9184-r2-evidence/format-report.log | 4 -- 9184-r2-evidence/format-resources.log | 4 -- 9184-r2-evidence/format-wa-income.log | 4 -- 9184-r2-evidence/format-wa-mmmna.log | 4 -- 9184-r2-evidence/push-model.log | 6 -- 9184-r2-report.md | 36 ----------- 26 files changed, 478 deletions(-) delete mode 100644 9184-r2-body.md delete mode 100644 9184-r2-evidence/README.md delete mode 100644 9184-r2-evidence/after-composite.log delete mode 100644 9184-r2-evidence/after-equity.log delete mode 100644 9184-r2-evidence/after-income.log delete mode 100644 9184-r2-evidence/after-invariants.log delete mode 100644 9184-r2-evidence/after-mmmna.log delete mode 100644 9184-r2-evidence/after-pathway.log delete mode 100644 9184-r2-evidence/after-resources.log delete mode 100644 9184-r2-evidence/after-sil.log delete mode 100644 9184-r2-evidence/before-equity.log delete mode 100644 9184-r2-evidence/before-income.log delete mode 100644 9184-r2-evidence/before-mmmna.log delete mode 100644 9184-r2-evidence/before-resources.log delete mode 100644 9184-r2-evidence/ci-before.log delete mode 100644 9184-r2-evidence/ci-model-head.log delete mode 100644 9184-r2-evidence/dependency-audit.txt delete mode 100644 9184-r2-evidence/format-contracts.log delete mode 100644 9184-r2-evidence/format-equity.log delete mode 100644 9184-r2-evidence/format-regressions.log delete mode 100644 9184-r2-evidence/format-report.log delete mode 100644 9184-r2-evidence/format-resources.log delete mode 100644 9184-r2-evidence/format-wa-income.log delete mode 100644 9184-r2-evidence/format-wa-mmmna.log delete mode 100644 9184-r2-evidence/push-model.log delete mode 100644 9184-r2-report.md diff --git a/9184-r2-body.md b/9184-r2-body.md deleted file mode 100644 index a2db575bf8c..00000000000 --- a/9184-r2-body.md +++ /dev/null @@ -1,86 +0,0 @@ -Adds an opt-in Medicaid long-term services and supports (LTSS) financial-eligibility screen: an effective-dated 2026 federal chassis with Texas, Delaware, and Washington parameters covering the special income limit routes (300% of SSI in TX/WA; Delaware's 250% route with the $20-disregard mechanics), qualified income trusts, institutional medically-needy budgeting (WA), initial and continuing resource eligibility, home-equity caps, and spousal impoverishment protections (CSRA floor/half/maximum regimes and MMMNA). - -Twenty-eight new variables — seven computed screens (`medicaid_ltss_financial_pathway`, `is_medicaid_ltss_income_eligible`, `medicaid_ltss_csra_resource_eligible`, `medicaid_ltss_home_equity_eligible`, `medicaid_ltss_mmmna`, `medicaid_ltss_special_income_limit`, `is_medicaid_ltss_financial_threshold_eligible`) plus twenty-one documented trusted-input variables — deliberately **not** integrated into `is_medicaid_eligible`, enrollment/take-up, or Medicaid benefit values. Functional/level-of-care eligibility is out of scope and labeled as such; QIT-adjusted income and countable resources are trusted inputs with the limitation in metadata; unknown HCBS waivers fail closed to `unmodeled` rather than inheriting statewide rules. The modeled routes are SSI-related, so the pathway gates on `is_ssi_aged_blind_disabled` (42 CFR 435.236, 435.1005). - -Home equity follows 42 USC 1396p(f): Washington elects the federal maximum and reads the existing tracked `home_equity.limit` parameter (WAC 182-513-1350(8)(c)); Texas and Delaware apply the CPI-indexed federal minimum via a new `home_equity.minimum_limit` parameter in the same tree, pinned to published CIB values (TX Appendix XXXI; DSSM 20320.7.B/E). A person with no applicable individual or Delaware marital equity interest passes everywhere; unmodeled states pass at or below the federal minimum and fail closed above it. Delaware sums the spouses' individual ownership shares before testing their marital home interest, independent of the income/resource budgeting unit (DSSM 20320.7.C). The community-spouse MMMNA is regime-specific: Texas pays the federal maximum flat (Appendix XXXI; MEPD J-7200); Delaware uses federal minimum-plus-excess-shelter arithmetic (DSSM 20910.4–.6); Washington uses its published rounded minimum and shelter standards (WAC 182-513-1385(2)). - -Every parameter value traces to a cited primary source (Texas HHS Appendix XXXI Rev. 26-2, Delaware's DMMA Administrative Notice A-14-2025 and DSSM sections, Washington's 2026 standards and WACs, and the May 2025 / April 2026 CMS CIBs) with reference URLs and page anchors in the YAML metadata. - -Financial YAML tests cover every SIL/resource/home-equity boundary (including encumbrance/ownership-share arithmetic landing exactly at the cap and invalid-share fail-closure), TX QIT sufficiency both ways, DE's 250% + disregard including an interior partial-disregard bind, WA SIL-failure→institutional-MN and the SSI-indexed one-person HCBS medically-needy income level, all three CSRA control regimes with both-sided ±$1 brackets and the WA half-snapshot tie, per-state MMMNA regimes with the zero branches, the ABD categorical gate, non-homeowner and cross-state comparisons, fail-closed unknown-waiver/unknown-setting/unsupported-state/zero-unit cases, and vectorized cases. - -The reviewer-response table below addresses the substantive findings and optional suggestions from @DTrim99 and Pavel. - -🤖 Generated with [Claude Code](https://claude.com/claude-code) - - -## Fix round 2 (2026-10-07) - -This round fixes Delaware married co-owner equity, distinguishes initial from continuing spousal resource eligibility, indexes Washington's medically needy income level to canonical SSI, and follows Washington's published rounded MMMNA standards. It preserves the recovered canonical SIL/resource parameters, registry entry, effective-date coverage and all ten obsolete parameter deletions. - -### Reviewer response - -| Finding | Resolution and source/test references | -|---|---| -| Delaware married co-owners (round-2 P1) | Retains individual ownership-share inputs and automatically sums the marital unit's shares for Delaware. Callers must supply both spouses in one marital unit, with each spouse's own share and the same whole-home value and encumbrances. Two nursing-facility spouses with 50% shares in a mortgage-free $1,000,000 retained home each fail the $752,000 cap; the same ownership in a $752,000 home passes. This treatment also applies when the couple is budgeted as two individuals. [formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py), [married co-owner regressions](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml), [DSSM §20320.7.C, p17](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17). | -| Initial versus continuing CSRA eligibility (round-2 P2) | Added monthly Person Boolean `medicaid_ltss_is_initial_eligibility_determination`, default true. Initial determinations retain combined current resources and the snapshot-based CSRA. After the eligibility month in the same continuous LTSS period, false tests the applicant's resources alone against the individual limit; community-spouse resources and the CSRA no longer enter this test. A $100,000 snapshot yields a $50,000 CSRA: subsequent applicant $2,000/spouse $60,000 passes; applicant $2,001/spouse $0 fails. Initial/default cases remain covered. [input contract](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py), [regressions](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml), [42 USC §1396r-5(c)(2), (4)](https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm). | -| Washington annual medically needy income level (round-2 P2) | Replaced the frozen $994 future limit with canonical SSI-FBR uprating. Washington updates the effective one-person MNIL each January with SSA's COLA. The 2027 COPES regression has $4,000 income less $500 allowable deductions and $2,500 care cost: $1,000 net passes the projected FBR, rather than failing against 2026's $994. Future amounts are model projections until official values are published. [parameter](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml), [2027 regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml), [WAC 182-515-1508(2)(c)(ii)](https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508), [WAC 182-519-0050(1), (5)](https://app.leg.wa.gov/wac/default.aspx?cite=182-519-0050). | -| Washington published MMMNA standards (round-2 P2) | Uses the agency's January 2026 $2,644 minimum and $794 shelter threshold: shelter expenses of $1,000 yield $2,850. Bare federal arithmetic gave $2,850.625, a $0.625 difference. July 2026 uses the published $2,705/$812 standards, so $1,811.50 shelter yields $3,704.50 rather than $3,705. The agency chart governs the model, following Max's d1011 precedent; this is resolved rather than an unrestricted legal rounding election. Delaware retains its federal arithmetic and Texas its flat maximum; the shared maximum remains $4,066.50. [formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py), [January/July regressions](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml), [WAC 182-513-1385(2)](https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385), [January 2026 chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf), [July 2026 chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf). | -| Impact narrative (round-2 P3) | Removed the contradictory claims that completed impact measurements were missing. The hub's record-by-record 2026/2028 comparison measured exactly zero changes in all five existing Medicaid/household outputs. That result carries over because these fixes alter only the new screens and their inputs/parameters, with no existing consumer. See Impact below. | -| Pre-July MMMNA (Pavel A1; DTrim99) | January–June remain supported: Delaware retains the operative July 2025 federal minimum, $2,643.75, and Texas uses the January federal maximum, $4,066.50. Washington uses its January published $2,644 minimum and $794 shelter threshold. July 2026 changes the minimum to $2,705. A pre-July zero expectation would be incorrect. [MMMNA formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py), [minimum](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml), [January regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml), [June regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml). | -| CSRA and composite coverage (Pavel A2; DTrim99) | Preserved exact Cases 13–18: DE floor $32,532/half-snapshot $50,000/cap $162,660; WA floor $72,529/half-snapshot $100,000/cap $162,660, each with a boundary pass and $1-over failure. [CSRA Cases 13–18](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml). Preserved [sole-resource composite failure](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml), [MMMNA cap](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml), and [December 2025 unsupported period](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml). | -| Program registry (Pavel A3) | Separate partial HHS/Healthcare screen, TX/DE/WA, verified 2026, with its own financial parameter prefix; existing Medicaid status remains complete. [programs.yaml](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/programs.yaml). | -| Annual equity divergence (Pavel A4) | Documented that the annual chassis still uses the federal maximum across states: TX/DE $900,000 equity passes that annual screen but fails this new $752,000 minimum-based screen in 2026. A separate consumer change and impact analysis are tracked in [#9895](https://github.com/PolicyEngine/policyengine-us/issues/9895). [equity documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | -| Standalone equity gate (Pavel A5) | Retained an independent statutory payment-bar screen; the composite applies the modeled-pathway gate. [equity contract](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py), [composite](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.py). | -| Trusted units/couple budgeting (Pavel A6) | AU=2 means combined couple income/resources supplied on each applicant; AU=1/community-spouse cases use separately attributed applicant amounts. Delaware's couple SIL is 250% of couple SSI ($3,727.50), rather than twice the individual SIL. The legal couple-budget requirements and limited post-six-month election are set out below; Delaware's marital home-equity aggregation applies under either budget. [AU documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py), [resource documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py), [income documentation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py), [SSI-derived SIL](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py). | -| Equity indexing (Pavel A7) | Preserved CPI-U uprating and nearest-$1,000 rounding. The 2028 $1 million non-agricultural ceiling caps the indexed minimum; it does not replace the minimum with $1 million. [minimum_limit.yaml](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml), [ceiling formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | -| Delaware hospitals/scope (Pavel A8; DTrim99 extensions) | Delaware's institutional screen remains limited to nursing facilities; its 100%-SSI hospital route is disclosed as unmodeled. Court/hearing adjustments, agricultural equity, AK/HI, unidentified waivers, and WA excess-resource income/spenddown extensions remain outside this build. WA's composite still applies the resource screen. [income limitations](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py), [resource limitations](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py), [pathway scope](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py). | -| References/evidence (Pavel A9/A12; DTrim99) | Pinned DSSM is the 73-page export: §20300 p10, §20810 p67, §§20910.4–.10 p69, §20990 p71, equity §20320.7 p17, QIT §20400.11 p54. Delaware's 2026 resource notice now cites p2. [resources references](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py), [AU reference](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py), [QIT references](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py), [equity reference](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | -| Canonical parameters/metadata (Pavel A10/A11; DTrim99) | SIL derives from canonical SSI: TX $2,982/$5,964; DE $2,485/$3,727.50; WA $2,982. TX/DE use canonical SSI resource thresholds and TX uses the federal CSRA floor. WA $72,529 starts July 2025. Stocks and rate multipliers are not divided by twelve. [SIL](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.py), [resources](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py), [WA effective date](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml), [stock metadata](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py), [annual equity units](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py). | -| Earlier defects/exception priority (DTrim99) | Preserved DE nonowner/minimum-equity behavior, TX flat-maximum MMMNA, ABD categorization rather than SSI financial eligibility, negative-equity flooring, and invalid-input fail-closure. Statutory resident-family/hardship exceptions take priority even with invalid ownership shares; invalid shares otherwise fail. [ABD gate](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py), [equity formula](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py), [exception/negative-equity cases](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml). | -| Couple $20 test/disabled waiver (DTrim99) | Existing couple tests already bracket needs-based $3,727/$3,727.50/$3,728 and ordinary $3,747/$3,747.50/$3,748, with one $20 disregard per couple. COPES coverage explicitly disables its parameter while preserving New Freedom. [needs-based couple cases](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml), [ordinary couple cases](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml), [disabled COPES](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml). | -| Earned-income deduction order (DTrim99) | Added monthly Person Boolean medicaid_ltss_income_disregards_already_applied, default false. True marks final countable income and skips any additional Delaware $20 deduction; false preserves raw ordinary-unearned handling. Non-spousal earnings require ordered $20, then $65, then half; mixed income applies the general exclusion to unearned income first. §20990 community-spouse cases use the sole $20 deduction. [flag contract](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py), [income calculation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py), [worked calculation](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py). [regression](https://github.com/PolicyEngine/policyengine-us/blob/ltss-financial-eligibility/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml) verifies final $2,485 pass/$2,486 fail, spousal $5,035 fail, and raw unearned $2,505 pass. | - -| Optional enum/description cosmetics (DTrim99) | Enum defaults remain last. The longer trusted-input descriptions remain because they define ownership, budgeting and fail-closure contracts; shortening them is deferred as a cosmetic change. | -| Optional canonical CIB URL (DTrim99) | Retains equivalent official CMS URL variants: they cite the same source bulletins. URL normalization is deferred as a cosmetic change. | - -### Validation evidence - -Local validation on code head **688f0b4ea3**: all seven financial YAML files ran individually in separate sequential processes; **89 cases passed** (16 equity, 23 resources, 14 income, 9 MMMNA, 15 pathway, 2 SIL, 10 composite). The invariant file ran separately: **18 passed**. No concurrent test processes, heavy-lock microsimulation, or new CI runners were used. - -Before-fix evidence preserved **seven expected failures**: two married-equity cases, the two continuing-resource cases, the 2027 COPES case, and January/July Washington rounding. Initial/default and passing equity controls remained green. Regression commit **42624f99fa** contains the new tests and input schema against the original model formulas. - -`make format` and its lint check passed before each implementation commit. Logs and the zero-existing-consumer dependency audit are saved in `9184-r2-evidence/`. The after-equity test passed all 16 cases; its optional memory-reporting wrapper subsequently failed because sandbox permissions denied `sysctl kern.clockrate`, so peak memory is unavailable. - -CI checked with `gh pr checks` for code head **688f0b4ea3**, [Actions run 37612263818](https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818). At 2026-10-07 11:29 UTC, **Quick Feedback (selective tests and coverage) passed** in 7m44s. Six checks have succeeded, one is running and 28 are queued; no failures are reported. The full pipeline is still in progress. This snapshot verifies the code revision; the subsequent report/body/evidence commit changes no model or test code. - -Before-fix regression runs use formula bodies byte-identical to `b24094b166`. The new determination input schema is registered solely to let the continuing-resource tests supply their flag; the resource formula in those runs remains unchanged. The resulting failures preserve the old behavior before the fixes are applied. - -The invariant fixture now assigns each independent random applicant a singleton marital unit. Core's missing-group default places all people in one unit, which would make the new Delaware marital aggregation combine unrelated records. All existing assertions and the 18-test count are preserved. - -Prior-head Linux CI evidence remains available for **b24094b166**, [Actions run 37504243982](https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982): all 30 checks succeeded, including 81 financial YAML cases, 18 invariants, 620 partner-contract cases and 1,250 baseline HHS cases. Those are prior-head CI results; the round-2 results above identify the local reruns and current-head checks. No partner expected outputs were edited. - -### Impact - -The hub completed a real microsimulation comparing merge base `6b80a8e447` with `b24094b166` on the default dataset `populace_us_2024.h5@populace-us-2024-spm-20260909`, for 2026 and 2028, under the shared heavy lock. It ran once per side and compared every record. - -**Exactly zero measured change** in both years: `is_medicaid_eligible`, `medicaid`, `household_health_benefits`, `household_net_income` and `household_net_income_including_health_benefits` are identical on every record, with zero people or dollars changed. - -That zero result carries over to this round. The fixes change only the new LTSS screen variables and their inputs/parameters; no existing eligibility, benefit or household-income variable consumes them. The existing annual home-equity consumer is untouched and its separate correction remains tracked in [#9895](https://github.com/PolicyEngine/policyengine-us/issues/9895). There is no changed existing consumer for the hub to re-run. - -The new monthly outputs have no main comparator and are not a national LTSS caseload estimate. Default unsupported setting and assistance-unit inputs make the composite false. Supplied-input regressions establish the repaired boundary behavior; MMMNA remains informational and does not feed the composite eligibility screen. - -Future-year scope: this round indexes Washington's one-person MNIL to canonical SSI projections; it does not claim complete verification of 2027 eligibility standards. Federal CSRA/MMMNA allowance leaves and Washington's published MMMNA chart values carry their latest sourced 2026 values into later periods. Later official allowance/chart amounts have not been verified. - -### Methodology choices for Max - -Washington rounding is resolved: follow the [agency's published standards](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf), which [WAC 182-513-1385(2)](https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1385) expressly identifies. The January $2,850 allowance differs by $0.625 from bare federal arithmetic; the model discloses that difference and follows Max's d1011 precedent. - -The remaining choices are: - -- **Standalone equity gate.** Choice: retain an independent statutory home-equity payment-bar screen, with the modeled-pathway gate in composite eligibility. Alternative: make the standalone output false whenever the financial pathway is unmodeled. The chosen design preserves a useful equity result independently of which income/resource route is implemented. [42 USC §1396p(f)](https://www.law.cornell.edu/uscode/text/42/1396p#f) fixes the legal payment bar and exceptions; it does not prescribe this software API boundary. This is an API design choice, with no discretion to waive the statutory bar. -- **Delaware couple budgeting.** Choice: the caller supplies the legally permitted unit and its correctly attributed totals. Alternative: infer the unit after adding facility/residence and duration inputs, including an explicit post-six-month election. The trusted-input design avoids inventing those administrative facts. [DSSM §20810, p67](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67) requires a couple budget when both spouses request/receive institutional services at the same facility; only after six months together there does it allow couple or individual budgeting, selected in the couple's best interests. Same-address HCBS couples also use couple standards. The law leaves the post-six-month institutional election open; it does not leave the earlier unit arbitrary. Delaware still combines spouses' home-equity interests under either unit. -- **Earned-income input contract.** Choice: retain `medicaid_ltss_income_disregards_already_applied`, default false; true means final countable income and prevents a second Delaware $20 deduction. Alternative: require separate raw earned/unearned components and compute every exclusion internally. The existing trusted-input API keeps this bounded screen usable while avoiding an incomplete earned-income calculation. The law leaves the API representation open, but the deduction order is mandatory: [DSSM §20240.3, p9](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9) applies $20, then $65, then half to non-spousal earnings; mixed income uses the general exclusion on unearned income first. [§20990, p71](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71) gives community-spouse applicants only the $20 deduction. - -DTrim99's CHANGES_REQUESTED review remains outstanding. Reviewer clearance and Max's remaining API/budgeting decisions are required before merge. This PR has not been merged. - -axiom: needed diff --git a/9184-r2-evidence/README.md b/9184-r2-evidence/README.md deleted file mode 100644 index b86335512de..00000000000 --- a/9184-r2-evidence/README.md +++ /dev/null @@ -1,26 +0,0 @@ -Round-2 validation evidence for PolicyEngine US PR #9184. - -The affected formula/parameter was unchanged from `b24094b166` when each before-fix regression ran. The new default-true determination input schema was registered solely to accept the new continuing-resource input; the old resource formula ignored it. Initial/default controls and passing equity controls stayed green. - -Before-fix results: equity 2 failed/14 passed; resources 2 failed/21 passed; income 1 failed/13 passed; MMMNA 2 failed/7 passed. These seven failures preserve the defects described in review-r1. - -All tests ran one file at a time, with no concurrent test processes or national microsimulation. The first before-equity run used `policyengine-core test -c policyengine_us`. Other YAML runs used the same Core runner with the country's initialized system, avoiding the CLI's additional model construction: - -```python -from policyengine_us.system import system -from policyengine_core.tools.test_runner import run_tests - -raise SystemExit(run_tests(system, [single_file_path])) -``` - -The invariant file used `python -m pytest policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py -q` in a separate process. The existing assertions and 18-test count are preserved; its independent applicants now have explicit singleton marital units. - -Environment: Python 3.13.9, policyengine-core 3.32.20, NumPy 2.5.3, pandas 3.0.6, pytest 9.1.1, ruff 0.16.10. The prior job's virtual environment was executed read-only, with `PYTHONDONTWRITEBYTECODE=1` and `PYTHONPATH` set to this workspace. Imports were confirmed to resolve to this workspace. - -`make format` ran before every commit, using `UV_NO_SYNC=1`, `UV_PYTHON=3.13`, that existing environment and a workspace-local UV cache. Format logs include the accompanying lint checks. - -The after-equity test itself passed all 16 cases. Its optional `/usr/bin/time -l` wrapper returned 1 after the successful test because sandbox permissions denied `sysctl kern.clockrate`; the log records 137.43 seconds wall time, but peak-memory reporting is unavailable. This instrumentation failure does not indicate a test failure. Remaining validation runs omit that wrapper. - -The dependency audit finds zero existing variable consumers of the 28 new financial screen/input variables. The completed hub microsimulation at merge base `6b80a8e447` versus `b24094b166` found exactly zero change in all five existing Medicaid/household outputs for 2026 and 2028; this carries over because no existing consumer or its parameters changes in round 2. - -No partner contract test files or expected outputs changed. CI snapshots identify the head they verify in the final report and PR body. diff --git a/9184-r2-evidence/after-composite.log b/9184-r2-evidence/after-composite.log deleted file mode 100644 index 1bf1161bee8..00000000000 --- a/9184-r2-evidence/after-composite.log +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 10 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml .......... - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 10 passed, 1 warning in 10.35s ======================== diff --git a/9184-r2-evidence/after-equity.log b/9184-r2-evidence/after-equity.log deleted file mode 100644 index aace501b812..00000000000 --- a/9184-r2-evidence/after-equity.log +++ /dev/null @@ -1,18 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 16 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml ................ - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 16 passed, 1 warning in 13.50s ======================== - 137.43 real 31.48 user 3.67 sys -time: sysctl kern.clockrate: Operation not permitted diff --git a/9184-r2-evidence/after-income.log b/9184-r2-evidence/after-income.log deleted file mode 100644 index ee8baa11b24..00000000000 --- a/9184-r2-evidence/after-income.log +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 14 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml .............. - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 14 passed, 1 warning in 24.52s ======================== diff --git a/9184-r2-evidence/after-invariants.log b/9184-r2-evidence/after-invariants.log deleted file mode 100644 index de8b385e7e9..00000000000 --- a/9184-r2-evidence/after-invariants.log +++ /dev/null @@ -1,2 +0,0 @@ -.................. [100%] -18 passed in 6.17s diff --git a/9184-r2-evidence/after-mmmna.log b/9184-r2-evidence/after-mmmna.log deleted file mode 100644 index 68d91f4b709..00000000000 --- a/9184-r2-evidence/after-mmmna.log +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 9 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml ......... - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 9 passed, 1 warning in 10.73s ========================= diff --git a/9184-r2-evidence/after-pathway.log b/9184-r2-evidence/after-pathway.log deleted file mode 100644 index 9d53de4febe..00000000000 --- a/9184-r2-evidence/after-pathway.log +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 15 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml ............... - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 15 passed, 1 warning in 44.01s ======================== diff --git a/9184-r2-evidence/after-resources.log b/9184-r2-evidence/after-resources.log deleted file mode 100644 index 2c864dc79ee..00000000000 --- a/9184-r2-evidence/after-resources.log +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 23 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml ....................... - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 23 passed, 1 warning in 36.30s ======================== diff --git a/9184-r2-evidence/after-sil.log b/9184-r2-evidence/after-sil.log deleted file mode 100644 index fb4593ba68f..00000000000 --- a/9184-r2-evidence/after-sil.log +++ /dev/null @@ -1,16 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 2 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml .. - -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -======================== 2 passed, 1 warning in 13.68s ========================= diff --git a/9184-r2-evidence/before-equity.log b/9184-r2-evidence/before-equity.log deleted file mode 100644 index af1615910a0..00000000000 --- a/9184-r2-evidence/before-equity.log +++ /dev/null @@ -1,28 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 16 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml FF.............. - -=================================== FAILURES =================================== -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml: - Test 'Delaware combines married co-owners' interests in their retained home.': - medicaid_ltss_home_equity_eligible@2026-07: [1. 1. 1. 1. 1. 1.] differs from [0. 0. 1. 1. 1. 1.] with an absolute margin [1. 1. 0. 0. 0. 0.] > 0.001 -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml: - Test 'Delaware married ownership remains combined under individual budgets.': - medicaid_ltss_home_equity_eligible@2026-07: [1. 1.] differs from [0. 0.] with an absolute margin [1. 1.] > 0.001 -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -=========================== short test summary info ============================ -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml:: -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml:: -=================== 2 failed, 14 passed, 1 warning in 36.87s =================== diff --git a/9184-r2-evidence/before-income.log b/9184-r2-evidence/before-income.log deleted file mode 100644 index 65f3a39ab40..00000000000 --- a/9184-r2-evidence/before-income.log +++ /dev/null @@ -1,23 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 14 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml ............F. - -=================================== FAILURES =================================== -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml: - Test 'Washington COPES medically needy income level follows SSI uprating in 2027.': - is_medicaid_ltss_income_eligible@2027-01: [0.] differs from 1.0 with an absolute margin [1.] > 0.001 -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -=========================== short test summary info ============================ -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml:: -=================== 1 failed, 13 passed, 1 warning in 14.66s =================== diff --git a/9184-r2-evidence/before-mmmna.log b/9184-r2-evidence/before-mmmna.log deleted file mode 100644 index f11eb10905e..00000000000 --- a/9184-r2-evidence/before-mmmna.log +++ /dev/null @@ -1,28 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 9 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml ..F....F. - -=================================== FAILURES =================================== -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml: - Test 'Case 3, Washington uses its published July shelter threshold.': - medicaid_ltss_mmmna@2026-07: [3705. 2705.] differs from [3704.5 2705. ] with an absolute margin [0.5 0. ] > 0.01 -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml: - Test 'Case 8, January 2026 uses the operative federal and published state standards.': - medicaid_ltss_mmmna@2026-01: [4066.5 2643.75 2850.625] differs from [4066.5 2643.75 2850. ] with an absolute margin [0. 0. 0.625] > 0.01 -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -=========================== short test summary info ============================ -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml:: -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml:: -==================== 2 failed, 7 passed, 1 warning in 9.90s ==================== diff --git a/9184-r2-evidence/before-resources.log b/9184-r2-evidence/before-resources.log deleted file mode 100644 index 0a03c950c49..00000000000 --- a/9184-r2-evidence/before-resources.log +++ /dev/null @@ -1,28 +0,0 @@ -============================= test session starts ============================== -platform darwin -- Python 3.13.9, pytest-9.1.1, pluggy-1.6.0 -rootdir: /Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2 -configfile: pyproject.toml -plugins: hypothesis-6.168.5, platformdirs-4.12.3, anyio-4.15.1 -collected 23 items - -policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml ..................FF... - -=================================== FAILURES =================================== -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml: - Test 'Case 19, continuing Delaware eligibility ignores community spouse resources above the initial allowance.': - medicaid_ltss_csra_resource_eligible@2026-07: [0.] differs from 1.0 with an absolute margin [1.] > 0.001 -_________________________________ test session _________________________________ -/Users/maxghenis/.subfleet/worktrees/20261007-061058-hub-fix-9184-r2/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml: - Test 'Case 20, continuing Delaware eligibility cannot shelter excess applicant resources in an unused CSRA.': - medicaid_ltss_csra_resource_eligible@2026-07: [1.] differs from 0.0 with an absolute margin [1.] > 0.001 -=============================== warnings summary =============================== -../20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345 - /Users/maxghenis/.subfleet/worktrees/20261006-084641-hub-fix-9184/.venv/lib/python3.13/site-packages/_pytest/config/__init__.py:1345: PytestAssertRewriteWarning: Module already imported so cannot be rewritten; anyio - self._mark_plugins_for_rewrite(hook, disable_autoload) - --- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html -=========================== short test summary info ============================ -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml:: -FAILED policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml:: -=================== 2 failed, 21 passed, 1 warning in 17.64s =================== diff --git a/9184-r2-evidence/ci-before.log b/9184-r2-evidence/ci-before.log deleted file mode 100644 index 9bb002f4898..00000000000 --- a/9184-r2-evidence/ci-before.log +++ /dev/null @@ -1,35 +0,0 @@ -Check changelog fragment pass 11s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112473423786 -Check committed registry lock pass 21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112473424109 -Full Suite - Baseline (contrib-hhs) pass 16m38s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089062 -Full Suite - Baseline (household) pass 16m38s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089033 -Full Suite - Baseline (irs) pass 18m21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088909 -Full Suite - Baseline (reform) pass 20m29s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089020 -Full Suite - Baseline (rest-a) pass 8m30s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089099 -Full Suite - Baseline (rest-b) pass 13m43s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089021 -Full Suite - Baseline (ssa-usda) pass 29m41s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088929 -Full Suite - Baseline (states-shard-1) pass 18m33s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088951 -Full Suite - Baseline (states-shard-2) pass 23m13s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088959 -Full Suite - Baseline (states-shard-3) pass 17m30s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088922 -Full Suite - Baseline (states-shard-4) pass 18m51s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089059 -Full Suite - Contrib (congress) pass 18m0s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088988 -Full Suite - Contrib (other-shard-1) pass 34m14s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088975 -Full Suite - Contrib (other-shard-2a) pass 13m49s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089002 -Full Suite - Contrib (other-shard-2b) pass 16m20s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089046 -Full Suite - Contrib (other-shard-3) pass 13m0s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088952 -Full Suite - Contrib (states-shard-1) pass 25m21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089050 -Full Suite - Contrib (states-shard-2) pass 38m1s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088902 -Full Suite - Contrib (states-shard-3) pass 36m1s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088836 -Full Suite - Contrib (states-shard-4) pass 32m52s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474089078 -Full Suite - Microsimulation pass 30m19s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088826 -Full Suite - Rest (Python + variables) pass 50m55s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088778 -Household API Partners pass 12m3s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088672 -Install + smoke-import (py3.11) pass 1m6s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088728 -Install + smoke-import (py3.12) pass 1m14s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088713 -Install + smoke-import (py3.13) pass 1m17s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088636 -Install + smoke-import (py3.14) pass 1m43s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088724 -Lint pass 19s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088532 -Quick Feedback (Selective Tests + Coverage) pass 7m43s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088620 -Release lock guard tests pass 21s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112473424164 -Unpublished release wheel (final) pass 48s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474254772 -Unpublished release wheel (rc1) pass 51s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474255538 -Validate bundle metadata contract pass 1m14s https://github.com/PolicyEngine/policyengine-us/actions/runs/37504243982/job/112474088481 diff --git a/9184-r2-evidence/ci-model-head.log b/9184-r2-evidence/ci-model-head.log deleted file mode 100644 index 723e125d18b..00000000000 --- a/9184-r2-evidence/ci-model-head.log +++ /dev/null @@ -1,35 +0,0 @@ -Full Suite - Baseline (contrib-hhs) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329822 -Full Suite - Baseline (household) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329786 -Full Suite - Baseline (irs) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329728 -Full Suite - Baseline (reform) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329914 -Full Suite - Baseline (rest-a) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329849 -Full Suite - Baseline (rest-b) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329781 -Full Suite - Baseline (ssa-usda) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329732 -Full Suite - Baseline (states-shard-1) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329833 -Full Suite - Baseline (states-shard-2) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329990 -Full Suite - Baseline (states-shard-3) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329717 -Full Suite - Baseline (states-shard-4) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329800 -Full Suite - Contrib (congress) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329937 -Full Suite - Contrib (other-shard-1) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329949 -Full Suite - Contrib (other-shard-2a) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329819 -Full Suite - Contrib (other-shard-2b) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765330058 -Full Suite - Contrib (other-shard-3) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329942 -Full Suite - Contrib (states-shard-1) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329888 -Full Suite - Contrib (states-shard-2) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329894 -Full Suite - Contrib (states-shard-3) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329877 -Full Suite - Contrib (states-shard-4) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329961 -Full Suite - Microsimulation pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329506 -Full Suite - Rest (Python + variables) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329677 -Household API Partners pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329502 -Install + smoke-import (py3.11) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329532 -Install + smoke-import (py3.12) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329617 -Install + smoke-import (py3.13) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329628 -Install + smoke-import (py3.14) pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329515 -Lint pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329507 -Validate bundle metadata contract pending 0 https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329419 -Check changelog fragment pass 11s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112762089994 -Check committed registry lock pass 16s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112762090026 -Quick Feedback (Selective Tests + Coverage) pass 7m44s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329423 -Release lock guard tests pass 23s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112762089551 -Unpublished release wheel (final) pass 41s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329449 -Unpublished release wheel (rc1) pass 37s https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818/job/112765329544 diff --git a/9184-r2-evidence/dependency-audit.txt b/9184-r2-evidence/dependency-audit.txt deleted file mode 100644 index f4c5e5bd441..00000000000 --- a/9184-r2-evidence/dependency-audit.txt +++ /dev/null @@ -1,3 +0,0 @@ -Audited 28 financial screen/input variables against Python variables outside the new financial subtree. -Existing variable consumers: 0 -All round-2 formula/parameter edits are confined to the new financial subtree. diff --git a/9184-r2-evidence/format-contracts.log b/9184-r2-evidence/format-contracts.log deleted file mode 100644 index b5f101bde3b..00000000000 --- a/9184-r2-evidence/format-contracts.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -6980 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/format-equity.log b/9184-r2-evidence/format-equity.log deleted file mode 100644 index 22662bef46d..00000000000 --- a/9184-r2-evidence/format-equity.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -6979 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/format-regressions.log b/9184-r2-evidence/format-regressions.log deleted file mode 100644 index 22662bef46d..00000000000 --- a/9184-r2-evidence/format-regressions.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -6979 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/format-report.log b/9184-r2-evidence/format-report.log deleted file mode 100644 index 3012f6734a6..00000000000 --- a/9184-r2-evidence/format-report.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -1 file reformatted, 6981 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/format-resources.log b/9184-r2-evidence/format-resources.log deleted file mode 100644 index 22662bef46d..00000000000 --- a/9184-r2-evidence/format-resources.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -6979 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/format-wa-income.log b/9184-r2-evidence/format-wa-income.log deleted file mode 100644 index 22662bef46d..00000000000 --- a/9184-r2-evidence/format-wa-income.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -6979 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/format-wa-mmmna.log b/9184-r2-evidence/format-wa-mmmna.log deleted file mode 100644 index b5f101bde3b..00000000000 --- a/9184-r2-evidence/format-wa-mmmna.log +++ /dev/null @@ -1,4 +0,0 @@ -uv run ruff format . -6980 files left unchanged -uv run ruff check . -All checks passed! diff --git a/9184-r2-evidence/push-model.log b/9184-r2-evidence/push-model.log deleted file mode 100644 index 53beba394d2..00000000000 --- a/9184-r2-evidence/push-model.log +++ /dev/null @@ -1,6 +0,0 @@ -remote: -remote: GitHub found 57 vulnerabilities on PolicyEngine/policyengine-us's default branch (2 critical, 24 high, 28 moderate, 3 low). To find out more, visit: -remote: https://github.com/PolicyEngine/policyengine-us/security/dependabot -remote: -To https://github.com/PolicyEngine/policyengine-us.git - b24094b166..688f0b4ea3 HEAD -> ltss-financial-eligibility diff --git a/9184-r2-report.md b/9184-r2-report.md deleted file mode 100644 index 474e85dc08e..00000000000 --- a/9184-r2-report.md +++ /dev/null @@ -1,36 +0,0 @@ -Implemented the five round-2 requests for [PolicyEngine US #9184](https://github.com/PolicyEngine/policyengine-us/pull/9184), based on `b24094b166`. The implementation commits were fast-forwarded to `ltss-financial-eligibility`; the PR body is updated. No merge or force-push was performed. - -- Delaware sums spouses' individual home-ownership shares within their marital unit. Two 50% owners of a mortgage-free $1,000,000 retained home fail the $752,000 cap; a $752,000 home passes. Individual budgeting does not split that interest. Callers supply both individual shares and the same whole-home value/encumbrances. [DSSM §20320.7.C](https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17). -- Added `medicaid_ltss_is_initial_eligibility_determination`, default true. Continuing eligibility tests applicant resources alone: $2,000 with spouse $60,000 passes; $2,001 with spouse $0 fails. Initial/default controls retain CSRA budgeting. [42 USC §1396r-5(c)(4)](https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm). -- Washington MNIL follows canonical SSI uprating. The 2027 COPES case ($4,000 − $500 − $2,500 = $1,000) passes. The annual basis is [WAC 182-519-0050(1), (5)](https://app.leg.wa.gov/wac/default.aspx?cite=182-519-0050). -- Washington MMMNA uses the published $2,644 minimum/$794 shelter threshold in January: $1,000 shelter gives $2,850, versus bare arithmetic's $2,850.625. July uses $2,705/$812. The PR body explains the difference and Max's d1011 precedent. [January chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf), [July chart](https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260701.pdf). -- Updated reviewer responses, methodology and completed impact evidence. The invariant fixture now gives independent applicants singleton marital units; all existing assertions remain. - -All requested files ran individually, with no concurrent test processes: - -| File | Before fix | After fix | -|---|---:|---:| -| medicaid_ltss_home_equity_eligible.yaml | 2 failed, 14 passed | 16 passed | -| medicaid_ltss_csra_resource_eligible.yaml | 2 failed, 21 passed | 23 passed | -| is_medicaid_ltss_income_eligible.yaml | 1 failed, 13 passed | 14 passed | -| medicaid_ltss_mmmna.yaml | 2 failed, 7 passed | 9 passed | -| medicaid_ltss_financial_pathway.yaml | — | 15 passed | -| medicaid_ltss_special_income_limit.yaml | — | 2 passed | -| is_medicaid_ltss_financial_threshold_eligible.yaml | — | 10 passed | -| test_medicaid_ltss_financial_invariants.py | — | 18 passed | - -The seven expected failures used unchanged `b24094b166` formulas/parameters; only the new input schema was registered to accept the continuing flag. Regression commit `42624f99fa` preserves that failing model. Total: **89 YAML cases and 18 invariants passed**. `make format` and lint passed before every commit. Failure/pass logs and the dependency audit are in `9184-r2-evidence/`. Equity’s tests passed; optional peak-memory instrumentation was denied by the sandbox. - -The hub's real 2026/2028 microsimulation, merge base `6b80a8e447` versus `b24094b166`, measured exactly zero changes in `is_medicaid_eligible`, `medicaid`, `household_health_benefits`, `household_net_income` and `household_net_income_including_health_benefits`. That zero result carries over: the dependency audit found no existing consumers of the 28 financial screen/input variables, and no existing consumer or its parameters changes. The hub has no changed consumer to re-run. - -Max's remaining choices, detailed in the PR body: - -- **Standalone equity:** retain the independent screen and gate the composite. Alternative: gate the standalone result too. Independence preserves the statutory equity information; law fixes the bar/exceptions but leaves API organization open. -- **Couple budgeting:** callers supply the permitted unit/totals. Alternative: derive it from added residence/duration/election inputs. The contract avoids inventing administrative facts. Delaware law requires couple budgeting initially and leaves an individual/couple election open only after six months together in the institution; same-address HCBS couples use couple budgets. -- **Earned income:** retain the final-countable-income flag. Alternative: model separate raw earnings/unearned income and all exclusions. This bounds the trusted-input API. Law leaves representation open; deduction order is mandatory. - -Future MNIL amounts use SSI projections. Federal CSRA/MMMNA and Washington chart amounts beyond their sourced 2026 values remain unverified future standards. - -Six implementation/test commits: `42624f99fa`, `77c89729a4`, `cbb145281a`, `1925fa6ca2`, `24711fa628`, `688f0b4ea3`. Report, PR-body copy and test logs are saved in this workspace. Common Git metadata was read-only, so commits use private `.venv/.git-r2` metadata here; the caller's checkout was not written. **CI:** `gh pr checks` on code head `688f0b4ea3` confirmed Quick Feedback passed (7m44s). At 11:29 UTC, six checks succeeded, one was running and 28 were queued; no failures were reported. [Run 37612263818](https://github.com/PolicyEngine/policyengine-us/actions/runs/37612263818). Full CI is still in progress; the final documentation/evidence commit changes no model or test code. - -No partner expected outputs changed. No merge was performed; DTrim99's re-review and Max's remaining choices are still outstanding. From 21bca8027f93eb9fca66699158200dd16e9b51c1 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 07:57:25 -0400 Subject: [PATCH 18/34] test: reproduce Washington LTSS re-entry resource snapshot --- .../medicaid_ltss_csra_resource_eligible.yaml | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index bf98e5aa755..1004e41a287 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -915,3 +915,46 @@ medicaid_ltss_community_spouse_countable_resources: 0 output: medicaid_ltss_csra_resource_eligible: false + +- name: Case 24, Washington re-entry uses the July 2026 snapshot after a qualifying break. + period: 2026-09 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + # First episode in 2024; a break of at least 30 consecutive days precedes + # the July 2026 episode, whose beginning-month snapshot is $400,000. + # The old input contract instead requires this first-ever snapshot. + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + # By the September initial determination, lawful depletion leaves these + # current resources. The new period's CSRA is capped at $162,660. + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 98_000 + output: + medicaid_ltss_csra_resource_eligible: true + +- name: Case 25, Washington re-entry control passes even against the earlier snapshot allowance. + period: 2026-09 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + # Same 2024 first episode and July 2026 re-entry as Case 24, with fewer + # community-spouse resources at the September determination. + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_529 + output: + medicaid_ltss_csra_resource_eligible: true From b63a8221da2858bf83c2ed381c86ece5d7fc07d5 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 08:05:24 -0400 Subject: [PATCH 19/34] fix: use Washington most recent LTSS resource snapshot --- .../ltss-financial-wa-reentry.fixed.md | 1 + ...test_medicaid_ltss_financial_invariants.py | 9 ++- ...aid_ltss_financial_threshold_eligible.yaml | 30 +++++++- .../medicaid_ltss_csra_resource_eligible.yaml | 70 ++++++++++++++++--- ...resources_at_first_institutionalization.py | 8 ++- .../medicaid_ltss_csra_resource_eligible.py | 20 ++++-- ...ss_is_initial_eligibility_determination.py | 7 +- ...ces_at_most_recent_institutionalization.py | 34 +++++++++ 8 files changed, 157 insertions(+), 22 deletions(-) create mode 100644 changelog.d/ltss-financial-wa-reentry.fixed.md create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization.py diff --git a/changelog.d/ltss-financial-wa-reentry.fixed.md b/changelog.d/ltss-financial-wa-reentry.fixed.md new file mode 100644 index 00000000000..2308fe4553d --- /dev/null +++ b/changelog.d/ltss-financial-wa-reentry.fixed.md @@ -0,0 +1 @@ +Use Washington's most recent continuous-period resource snapshot for Medicaid LTSS spousal eligibility after re-entry, preserving the first-period snapshot for Texas and Delaware. diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 22a58588128..09c759dc3bc 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -94,6 +94,11 @@ def _situation(people, **overrides): # every person in one default marital unit. situation["marital_units"][name] = {"members": [name]} situation["households"][person["state"]]["members"].append(name) + snapshot_variable = ( + "wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization" + if person["state"] == "WA" + else "medicaid_ltss_couple_countable_resources_at_first_institutionalization" + ) situation["people"][name] = { "is_ssi_aged_blind_disabled": {YEAR: person["aged_blind_disabled"]}, "medicaid_ltss_setting": month(person["setting"]), @@ -110,9 +115,7 @@ def _situation(people, **overrides): "medicaid_ltss_cost_of_care": month(person["cost_of_care"]), "medicaid_ltss_countable_resources": month(person["resources"]), "medicaid_ltss_has_community_spouse": month(person["has_community_spouse"]), - "medicaid_ltss_couple_countable_resources_at_first_institutionalization": month( - person["snapshot"] - ), + snapshot_variable: month(person["snapshot"]), "medicaid_ltss_community_spouse_countable_resources": month( person["spouse_resources"] ), diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index c91c6ae9b62..b0d7216c208 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -370,7 +370,7 @@ medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_500 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_529 above_state_standard: @@ -381,7 +381,7 @@ medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_qit_adjusted_income: 2_500 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_530 households: @@ -427,3 +427,29 @@ medicaid_ltss_home_equity_eligible: false medicaid_ltss_mmmna: 0 is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 11, Washington re-entry passes every financial screen using its new period snapshot. + period: 2026-09 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + # 2024 first episode, followed by a qualifying break and July 2026 re-entry. + # Use July 1 resources, rather than the 2024 or September current resources. + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 98_000 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true + medicaid_ltss_csra_resource_eligible: true + medicaid_ltss_home_equity_eligible: true + is_medicaid_ltss_financial_threshold_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 1004e41a287..3f6c219cec3 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -505,7 +505,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 145_058 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 145_058 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_529 above_tie: @@ -515,7 +515,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 145_058 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 145_058 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_530 tax_units: @@ -723,7 +723,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_529 above_allowance: @@ -733,7 +733,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_530 households: @@ -755,7 +755,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 200_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 200_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 100_000 above_allowance: @@ -765,7 +765,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 200_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 200_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 100_001 households: @@ -787,7 +787,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 162_660 above_allowance: @@ -797,7 +797,7 @@ medicaid_ltss_waiver: NONE medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 162_661 households: @@ -930,8 +930,8 @@ medicaid_ltss_is_initial_eligibility_determination: true # First episode in 2024; a break of at least 30 consecutive days precedes # the July 2026 episode, whose beginning-month snapshot is $400,000. - # The old input contract instead requires this first-ever snapshot. medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 # By the September initial determination, lawful depletion leaves these # current resources. The new period's CSRA is capped at $162,660. medicaid_ltss_countable_resources: 2_000 @@ -954,7 +954,59 @@ # Same 2024 first episode and July 2026 re-entry as Case 24, with fewer # community-spouse resources at the September determination. medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 medicaid_ltss_countable_resources: 2_000 medicaid_ltss_community_spouse_countable_resources: 72_529 output: medicaid_ltss_csra_resource_eligible: true + +- name: Case 26, only Washington replaces the first-period snapshot after re-entry. + period: 2026-09 + input: + people: + at_wa_floor: &wa_reentry_applicant + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + # A smaller snapshot after a qualifying break must also replace + # the earlier snapshot, rather than preserve its larger allowance. + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 72_529 + above_wa_floor: + <<: *wa_reentry_applicant + medicaid_ltss_community_spouse_countable_resources: 72_530 + at_tx_half: &first_period_applicant + <<: *wa_reentry_applicant + # TX/DE keep the first-period snapshot even if a newer one differs. + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 + medicaid_ltss_community_spouse_countable_resources: 50_000 + above_tx_half: + <<: *first_period_applicant + medicaid_ltss_community_spouse_countable_resources: 50_001 + at_de_half: + <<: *first_period_applicant + above_de_half: + <<: *first_period_applicant + medicaid_ltss_community_spouse_countable_resources: 50_001 + households: + wa_household: + members: [at_wa_floor, above_wa_floor] + state_code: + 2026: WA + tx_household: + members: [at_tx_half, above_tx_half] + state_code: + 2026: TX + de_household: + members: [at_de_half, above_de_half] + state_code: + 2026: DE + output: + medicaid_ltss_csra_resource_eligible: [true, false, true, false, true, false] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py index a0c08115554..ffd7b4938fd 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_resources_at_first_institutionalization.py @@ -10,10 +10,12 @@ class medicaid_ltss_couple_countable_resources_at_first_institutionalization(Var definition_period = MONTH default_value = 0 documentation = ( - "Trusted historical snapshot of the couple's total countable " + "Trusted historical snapshot for Texas and Delaware of the couple's total countable " "resources at the beginning of the first continuous period of " "institutionalization. The same snapshot should be supplied in each " - "modeled month. The model does not reconstruct or adjudicate the " - "snapshot." + "modeled month. Washington instead uses " + "wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization, " + "measured for the most recent continuous period. The model does not " + "reconstruct or adjudicate the snapshot." ) reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index 936d01ee866..ac500f115f7 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -14,7 +14,11 @@ class medicaid_ltss_csra_resource_eligible(Variable): "community spouse, the initial CSRA is the greater of the applicable " "floor or the fixed statutory one-half of the couple's snapshot " "resources under 42 USC 1396r-5(c)(1)(A)(ii) and (f)(2)(A), capped " - "at the federal maximum. Texas uses the federal minimum as its " + "at the federal maximum. Texas and Delaware use the first-period " + "snapshot; Washington uses the first day of the beginning month " + "of the most recent continuous period under WAC 182-513-1355(2)-(4), " + "with a new determination after a break of at least 30 consecutive " + "days under WAC 182-513-1350(3)(b)(vi)(A). Texas uses the federal minimum as its " "floor; Delaware's $25,000 state spousal share (DSSM 20910.10) sits " "below the federal minimum, which therefore governs; Washington's " "state spousal resource standard sits above it. Initial eligibility " @@ -38,6 +42,7 @@ class medicaid_ltss_csra_resource_eligible(Variable): "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355", "https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3", ) @@ -80,9 +85,16 @@ def formula_2026_01_01(person, period, parameters): ], default=0, ) - snapshot_resources = person( - "medicaid_ltss_couple_countable_resources_at_first_institutionalization", - period, + snapshot_resources = where( + state == states.WA, + person( + "wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization", + period, + ), + person( + "medicaid_ltss_couple_countable_resources_at_first_institutionalization", + period, + ), ) csra = min_( max_(snapshot_resources / 2, state_csra_minimum), diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py index 68589d80e9a..918f058f0f4 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py @@ -16,9 +16,14 @@ class medicaid_ltss_is_initial_eligibility_determination(Variable): "months, community spouse resources are not deemed available and " "the applicant's own countable resources are tested against the " "individual resource limit under 42 USC 1396r-5(c)(4). This input " - "affects only applicants with a community spouse." + "affects only applicants with a community spouse. In Washington, " + "set true again for a new determination after a break of at least " + "30 consecutive days, and supply the new most-recent-period " + "snapshot under WAC 182-513-1350(3)(b)(vi)(A) and 182-513-1355." ) reference = ( "https://www.govinfo.gov/content/pkg/USCODE-2024-title42/html/USCODE-2024-title42-chap7-subchapXIX-sec1396r-5.htm", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization.py new file mode 100644 index 00000000000..a4c2e38d99f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization( + Variable +): + value_type = float + entity = Person + label = ( + "Washington Medicaid LTSS couple resources at most recent institutionalization" + ) + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Trusted historical snapshot of both spouses' total countable " + "resources on the first day of the month in which the most recent " + "continuous period of institutionalization began, under WAC " + "182-513-1355(2)-(4). A break of at least 30 consecutive days " + "requires a new resource determination under WAC " + "182-513-1350(3)(b)(vi)(A): supply the new period's snapshot after " + "re-entry and repeat it in each modeled month of that period. Set " + "medicaid_ltss_is_initial_eligibility_determination to true for " + "the new determination. Unlike the Texas and Delaware first-period " + "snapshot, this input replaces earlier periods' snapshots. It is " + "not the couple's resources at the application or determination " + "date. The model does not reconstruct institutional history or " + "adjudicate qualifying breaks." + ) + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", + ) From a49c72670b938f68f1a1c5e240c658a9121fc3f5 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 09:38:10 -0400 Subject: [PATCH 20/34] Fix Washington LTSS resource rules for legacy continuous periods --- changelog.d/medicaid-ltss-wa-legacy.fixed.md | 1 + ...aid_ltss_financial_threshold_eligible.yaml | 81 +++++ .../medicaid_ltss_csra_resource_eligible.yaml | 281 ++++++++++++++++++ .../financial/medicaid_ltss_csra.py | 79 +++++ .../medicaid_ltss_csra_resource_eligible.py | 68 +++-- ..._ltss_jointly_owned_countable_resources.py | 24 ++ ...recent_institutionalization_start_month.py | 25 ++ ..._recent_institutionalization_start_year.py | 25 ++ ...d_ltss_solely_owned_countable_resources.py | 24 ++ 9 files changed, 577 insertions(+), 31 deletions(-) create mode 100644 changelog.d/medicaid-ltss-wa-legacy.fixed.md create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py diff --git a/changelog.d/medicaid-ltss-wa-legacy.fixed.md b/changelog.d/medicaid-ltss-wa-legacy.fixed.md new file mode 100644 index 00000000000..fe15ec3b9b7 --- /dev/null +++ b/changelog.d/medicaid-ltss-wa-legacy.fixed.md @@ -0,0 +1 @@ +Select Washington Medicaid LTSS spousal resource rules from the onset of the most recent continuous institutionalization, including the federal-maximum allocation for October 1989 through July 2003 and the pre-October 1989 ownership rule. diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index b0d7216c208..805ffa83474 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -453,3 +453,84 @@ medicaid_ltss_csra_resource_eligible: true medicaid_ltss_home_equity_eligible: true is_medicaid_ltss_financial_threshold_eligible: true + +- name: Case 12, Washington July 2003 legacy period passes all financial screens while the August 1 boundary and modern period fail solely on resources. + period: 2026-09 + input: + people: + applicant_1: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: &id001 + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_countable_resources: 2000 + medicaid_ltss_community_spouse_countable_resources: 98000 + applicant_2: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: *id001 + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 8 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_countable_resources: 2000 + medicaid_ltss_community_spouse_countable_resources: 98000 + applicant_3: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: *id001 + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_qit_adjusted_income: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_countable_resources: 2000 + medicaid_ltss_community_spouse_countable_resources: 98000 + marital_units: + applicant_1: + members: + - applicant_1 + applicant_2: + members: + - applicant_2 + applicant_3: + members: + - applicant_3 + households: + household: + members: + - applicant_1 + - applicant_2 + - applicant_3 + state_code: + 2026: WA + output: + medicaid_ltss_csra: + - 162660 + - 72529 + - 72529 + is_medicaid_ltss_income_eligible: + - true + - true + - true + medicaid_ltss_home_equity_eligible: + - true + - true + - true + medicaid_ltss_csra_resource_eligible: + - true + - false + - false + is_medicaid_ltss_financial_threshold_eligible: + - true + - false + - false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 3f6c219cec3..c9697c08737 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -1010,3 +1010,284 @@ 2026: DE output: medicaid_ltss_csra_resource_eligible: [true, false, true, false, true, false] + +- name: Case 27, Washington continuous July 2003 period receives the federal maximum at a September 2026 initial application. + period: 2026-09 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_community_spouse_countable_resources: 98_000 + output: + medicaid_ltss_csra: 162_660 + medicaid_ltss_csra_resource_eligible: true + +- name: Case 28, Washington applies the modern allocation on August 1 2003 and afterward, and the maximum from October 1 1989. + period: 2026-09 + input: + people: + applicant_1: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 8 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_countable_resources: 2000 + medicaid_ltss_community_spouse_countable_resources: 98000 + applicant_2: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_countable_resources: 2000 + medicaid_ltss_community_spouse_countable_resources: 98000 + applicant_3: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 10 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_countable_resources: 2000 + medicaid_ltss_community_spouse_countable_resources: 98000 + marital_units: + applicant_1: + members: + - applicant_1 + applicant_2: + members: + - applicant_2 + applicant_3: + members: + - applicant_3 + households: + household: + members: + - applicant_1 + - applicant_2 + - applicant_3 + state_code: + 2026: WA + output: + medicaid_ltss_csra: + - 72529 + - 72529 + - 162660 + medicaid_ltss_csra_resource_eligible: + - false + - false + - true + +- name: Case 29, Washington pre-October 1989 periods count half of applicant-sole and jointly titled balances at initial and continuing determinations. + period: 2026-09 + input: + people: + applicant_1: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_countable_resources: 10000 + medicaid_ltss_community_spouse_countable_resources: 900000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 + wa_medicaid_ltss_solely_owned_countable_resources: 4000 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + applicant_2: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_countable_resources: 10000 + medicaid_ltss_community_spouse_countable_resources: 900000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 + wa_medicaid_ltss_solely_owned_countable_resources: 4001 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + applicant_3: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_countable_resources: 10000 + medicaid_ltss_community_spouse_countable_resources: 900000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 + wa_medicaid_ltss_solely_owned_countable_resources: 0 + wa_medicaid_ltss_jointly_owned_countable_resources: 4000 + applicant_4: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_countable_resources: 10000 + medicaid_ltss_community_spouse_countable_resources: 900000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 + wa_medicaid_ltss_solely_owned_countable_resources: 0 + wa_medicaid_ltss_jointly_owned_countable_resources: 4001 + applicant_5: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_countable_resources: 10000 + medicaid_ltss_community_spouse_countable_resources: 900000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 + wa_medicaid_ltss_solely_owned_countable_resources: 2000 + wa_medicaid_ltss_jointly_owned_countable_resources: 2000 + applicant_6: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_countable_resources: 10000 + medicaid_ltss_community_spouse_countable_resources: 900000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 + wa_medicaid_ltss_solely_owned_countable_resources: 2000 + wa_medicaid_ltss_jointly_owned_countable_resources: 2001 + marital_units: + applicant_1: + members: + - applicant_1 + applicant_2: + members: + - applicant_2 + applicant_3: + members: + - applicant_3 + applicant_4: + members: + - applicant_4 + applicant_5: + members: + - applicant_5 + applicant_6: + members: + - applicant_6 + households: + household: + members: + - applicant_1 + - applicant_2 + - applicant_3 + - applicant_4 + - applicant_5 + - applicant_6 + state_code: + 2026: WA + output: + medicaid_ltss_csra: 0 + medicaid_ltss_csra_resource_eligible: + - true + - false + - true + - false + - true + - false + +- name: Case 30, invalid or future Washington onset facts fail closed. + period: 2026-09 + input: + people: + applicant_1: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 0 + applicant_2: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 13 + applicant_3: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 0 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 8 + applicant_4: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2027 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 1 + marital_units: + applicant_1: + members: + - applicant_1 + applicant_2: + members: + - applicant_2 + applicant_3: + members: + - applicant_3 + applicant_4: + members: + - applicant_4 + households: + household: + members: + - applicant_1 + - applicant_2 + - applicant_3 + - applicant_4 + state_code: + 2026: WA + output: + medicaid_ltss_csra_resource_eligible: + - false + - false + - false + - false diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py new file mode 100644 index 00000000000..fc2cb30ac02 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py @@ -0,0 +1,79 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_csra(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS community spouse resource allowance" + unit = USD + quantity_type = STOCK + definition_period = MONTH + documentation = ( + "Modeled community spouse resource allowance before court or " + "fair-hearing adjustments. Texas and Delaware apply their floor, " + "half of the first-period snapshot, and federal cap. Washington " + "selects its statutory branch from the actual year and month in " + "which the most recent continuous institutionalization began: " + "before October 1989 there is no CSRA allocation; October 1989 " + "through July 2003 uses the federal maximum; August 2003 onward " + "uses Washington's floor, half of the beginning-month snapshot, " + "and federal cap. The historical pre-1989 resource counting rule " + "is implemented separately in the resource eligibility screen. " + "The allowance is informational during continuing eligibility, " + "when the modern resource screen tests applicant resources alone." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=69", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + states = state.possible_values + washington = state == states.WA + floor = select( + [state == states.TX, state == states.DE, washington], + [ + p.federal.csra.minimum, + max_(p.de.csra.state_minimum, p.federal.csra.minimum), + max_(p.wa.csra.state_minimum, p.federal.csra.minimum), + ], + default=0, + ) + snapshot = where( + washington, + person( + "wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization", + period, + ), + person( + "medicaid_ltss_couple_countable_resources_at_first_institutionalization", + period, + ), + ) + modern = min_(max_(snapshot / 2, floor), p.federal.csra.maximum) + start_year = person( + "wa_medicaid_ltss_most_recent_institutionalization_start_year", period + ) + start_month = person( + "wa_medicaid_ltss_most_recent_institutionalization_start_month", period + ) + onset = start_year * 100 + start_month + # WAC 182-513-1355(2)(a), (3)(a), and (3)(b). Both statutory + # boundaries are the first day of the month, so year/month suffices. + allowance = select( + [washington & (onset < 198910), washington & (onset < 200308)], + [0, p.federal.csra.maximum], + default=modern, + ) + has_spouse = person("medicaid_ltss_has_community_spouse", period) + supported = (state == states.TX) | (state == states.DE) | washington + valid_onset = ( + (start_year >= 1) + & (start_month >= 1) + & (start_month <= 12) + & (onset <= period.start.year * 100 + period.start.month) + ) + return where(has_spouse & supported & (~washington | valid_onset), allowance, 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index ac500f115f7..c1f267d7b48 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -16,14 +16,22 @@ class medicaid_ltss_csra_resource_eligible(Variable): "resources under 42 USC 1396r-5(c)(1)(A)(ii) and (f)(2)(A), capped " "at the federal maximum. Texas and Delaware use the first-period " "snapshot; Washington uses the first day of the beginning month " - "of the most recent continuous period under WAC 182-513-1355(2)-(4), " - "with a new determination after a break of at least 30 consecutive " + "of the most recent continuous period under WAC 182-513-1355(2)-(4). " + "Washington instead allocates the federal maximum for continuous " + "periods starting October 1989 through July 2003. For pre-October " + "1989 periods there is no CSRA: at both initial and continuing " + "determinations, one-half of the sum of applicant-sole resources " + "and the full jointly titled balance is tested against the individual limit, " + "excluding spouse-sole resources. Those ownership balances are " + "separate leaf inputs because attributed totals do not reveal title. " + "There is a new determination after a break of at least 30 consecutive " "days under WAC 182-513-1350(3)(b)(vi)(A). Texas uses the federal minimum as its " "floor; Delaware's $25,000 state spousal share (DSSM 20910.10) sits " "below the federal minimum, which therefore governs; Washington's " "state spousal resource standard sits above it. Initial eligibility " "tests both spouses' current resources against the CSRA plus the " - "applicant's resource limit. After the eligibility month in the same " + "applicant's resource limit. For periods starting on or after October " + "1989, after the eligibility month in the same " "continuous LTSS period, set " "medicaid_ltss_is_initial_eligibility_determination to false: only " "the applicant's resources count against the individual limit, " @@ -72,34 +80,7 @@ def formula_2026_01_01(person, period, parameters): ) no_community_spouse_eligible = resources <= resource_limit - state_csra_minimum = select( - [ - state == states.TX, - state == states.DE, - state == states.WA, - ], - [ - p.federal.csra.minimum, - max_(p.de.csra.state_minimum, p.federal.csra.minimum), - max_(p.wa.csra.state_minimum, p.federal.csra.minimum), - ], - default=0, - ) - snapshot_resources = where( - state == states.WA, - person( - "wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization", - period, - ), - person( - "medicaid_ltss_couple_countable_resources_at_first_institutionalization", - period, - ), - ) - csra = min_( - max_(snapshot_resources / 2, state_csra_minimum), - p.federal.csra.maximum, - ) + csra = person("medicaid_ltss_csra", period) current_couple_resources = resources + person( "medicaid_ltss_community_spouse_countable_resources", period, @@ -113,6 +94,31 @@ def formula_2026_01_01(person, period, parameters): current_couple_resources <= csra + resource_limit, resources <= resource_limit, ) + start_year = person( + "wa_medicaid_ltss_most_recent_institutionalization_start_year", period + ) + start_month = person( + "wa_medicaid_ltss_most_recent_institutionalization_start_month", period + ) + onset = start_year * 100 + start_month + valid_onset = ( + (start_year >= 1) + & (start_month >= 1) + & (start_month <= 12) + & (onset <= period.start.year * 100 + period.start.month) + ) + # WAC 182-513-1355(2)(a) counts one-half of the sum of applicant-sole + # resources and the full joint balance, excluding spouse-sole resources. This + # rule continues for pre-1989 periods at redeterminations as well. + pre_1989_resources = ( + person("wa_medicaid_ltss_solely_owned_countable_resources", period) + + person("wa_medicaid_ltss_jointly_owned_countable_resources", period) + ) / 2 + community_spouse_eligible = where( + (state == states.WA) & (onset < 198910), + (assistance_unit_size == 1) & (pre_1989_resources <= resource_limit), + community_spouse_eligible, + ) & ((state != states.WA) | valid_onset) modeled_pathway = pathway != pathways.UNMODELED return modeled_pathway & where( diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py new file mode 100644 index 00000000000..4c22be32348 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class wa_medicaid_ltss_jointly_owned_countable_resources(Variable): + value_type = float + entity = Person + label = "Washington Medicaid LTSS applicant jointly owned countable resources" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Current full balance of countable resources held jointly in both spouses' names. " + "This ownership fact is needed for continuous periods beginning " + "before October 1, 1989: WAC 182-513-1355(2)(a) counts half of " + "applicant-sole and jointly held resources, excluding spouse-sole " + "resources. Supply both ownership inputs for that cohort, including " + "the full joint balance rather than the applicant's attributed share. " + "These ownership amounts are separate from the current attributed " + "resource input used for modern periods; the model cannot infer " + "legal title from that input. Applicable asset exclusions remain " + "the caller's resource-inventory responsibility." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py new file mode 100644 index 00000000000..cfcddd6cb8e --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class wa_medicaid_ltss_most_recent_institutionalization_start_month(Variable): + value_type = int + entity = Person + label = "Washington Medicaid LTSS most recent continuous institutionalization start month" + definition_period = MONTH + default_value = 8 + documentation = ( + "Calendar month in which the most recent continuous period of " + "institutionalization began. Together with the corresponding start " + "year, this is the historical onset fact used by WAC " + "182-513-1355(2)-(4), rather than a caller-selected allocation regime. " + "The default year/month is August 2003, which preserves the modern " + "floor/half/cap branch for existing callers who do not report history. " + "Supply the actual onset for legacy continuous periods, and replace " + "it after a break of at least 30 consecutive days. Repeat the onset " + "in each modeled month of the continuous period. The statutory " + "boundaries fall on the first day of a month, so no day input is needed." + ) + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py new file mode 100644 index 00000000000..87510875352 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class wa_medicaid_ltss_most_recent_institutionalization_start_year(Variable): + value_type = int + entity = Person + label = "Washington Medicaid LTSS most recent continuous institutionalization start year" + definition_period = MONTH + default_value = 2003 + documentation = ( + "Calendar year in which the most recent continuous period of " + "institutionalization began. Together with the corresponding start " + "month, this is the historical onset fact used by WAC " + "182-513-1355(2)-(4), rather than a caller-selected allocation regime. " + "The default year/month is August 2003, which preserves the modern " + "floor/half/cap branch for existing callers who do not report history. " + "Supply the actual onset for legacy continuous periods, and replace " + "it after a break of at least 30 consecutive days. Repeat the onset " + "in each modeled month of the continuous period. The statutory " + "boundaries fall on the first day of a month, so no day input is needed." + ) + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1350", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py new file mode 100644 index 00000000000..0b1393cc155 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class wa_medicaid_ltss_solely_owned_countable_resources(Variable): + value_type = float + entity = Person + label = "Washington Medicaid LTSS applicant solely owned countable resources" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "Current countable resources held solely in the institutionalized applicant's name. " + "This ownership fact is needed for continuous periods beginning " + "before October 1, 1989: WAC 182-513-1355(2)(a) counts half of " + "applicant-sole and jointly held resources, excluding spouse-sole " + "resources. Supply both ownership inputs for that cohort, including " + "the full joint balance rather than the applicant's attributed share. " + "These ownership amounts are separate from the current attributed " + "resource input used for modern periods; the model cannot infer " + "legal title from that input. Applicable asset exclusions remain " + "the caller's resource-inventory responsibility." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355" From ed2dbeec3b87b6d237c2228f3f1e5524122e1116 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 10:34:20 -0400 Subject: [PATCH 21/34] Derive LTSS income and Delaware couple budgets from leaf facts --- .../medicaid-ltss-leaf-inputs.changed.md | 1 + .../financial/de/income/earned_disregard.yaml | 11 + .../income/earned_income_countable_rate.yaml | 11 + ...test_medicaid_ltss_financial_invariants.py | 456 ++++++++- ...aid_ltss_financial_threshold_eligible.yaml | 307 +++--- .../is_medicaid_ltss_income_eligible.yaml | 585 ++++++++--- .../medicaid_ltss_assistance_unit_size.yaml | 239 +++++ .../medicaid_ltss_csra_resource_eligible.yaml | 915 ++++++++++++------ .../medicaid_ltss_financial_pathway.yaml | 66 +- .../medicaid_ltss_home_equity_eligible.yaml | 35 +- .../financial/medicaid_ltss_mmmna.yaml | 31 +- .../medicaid_ltss_special_income_limit.yaml | 43 +- .../is_medicaid_ltss_income_eligible.py | 36 +- .../medicaid_ltss_assistance_unit_size.py | 83 +- ...ss_community_spouse_countable_resources.py | 29 +- .../medicaid_ltss_countable_income.py | 27 + .../medicaid_ltss_countable_resources.py | 23 +- .../medicaid_ltss_couple_countable_income.py | 50 + .../medicaid_ltss_csra_resource_eligible.py | 3 +- ...aid_ltss_earned_income_deposited_to_qit.py | 22 + .../medicaid_ltss_gross_earned_income.py | 28 + .../medicaid_ltss_gross_unearned_income.py | 27 + ..._ltss_income_disregards_already_applied.py | 30 - ...dicaid_ltss_individual_countable_income.py | 52 + ...aid_ltss_individual_countable_resources.py | 25 + .../medicaid_ltss_needs_based_income.py | 14 +- ...tss_needs_based_income_deposited_to_qit.py | 23 + ..._ltss_non_delaware_assistance_unit_size.py | 25 + ...re_community_spouse_countable_resources.py | 21 + ...edicaid_ltss_qit_adjusted_earned_income.py | 24 + .../medicaid_ltss_qit_adjusted_income.py | 41 +- ...id_ltss_qit_adjusted_needs_based_income.py | 39 + ...icaid_ltss_qit_adjusted_unearned_income.py | 24 + ...icaid_ltss_reported_gross_earned_income.py | 23 + ...aid_ltss_reported_gross_unearned_income.py | 21 + ...s_months_in_same_institutional_facility.py | 19 + ...sting_or_receiving_hcbs_at_same_address.py | 18 + ...institutional_services_in_same_facility.py | 20 + ...d_ltss_unearned_income_deposited_to_qit.py | 22 + 39 files changed, 2692 insertions(+), 777 deletions(-) create mode 100644 changelog.d/medicaid-ltss-leaf-inputs.changed.md create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py delete mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_resources.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income_deposited_to_qit.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_needs_based_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_months_in_same_institutional_facility.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py diff --git a/changelog.d/medicaid-ltss-leaf-inputs.changed.md b/changelog.d/medicaid-ltss-leaf-inputs.changed.md new file mode 100644 index 00000000000..2b62eb35e3a --- /dev/null +++ b/changelog.d/medicaid-ltss-leaf-inputs.changed.md @@ -0,0 +1 @@ +Compute Medicaid LTSS income exclusions and Delaware couple budgets from each spouse's own gross income, trust deposits, resources, service locations, and duration; select the favorable institutional budget after six months. diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml new file mode 100644 index 00000000000..7396e8c8bba --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml @@ -0,0 +1,11 @@ +description: Delaware disregards this amount of monthly earned income after any unused general income exclusion for Medicaid long-term services and supports applicants without a community spouse. +values: + 2026-01-01: 65 + +metadata: + unit: currency-USD + period: month + label: Delaware Medicaid LTSS earned income disregard + reference: + - title: DSSM 20240.3 - Earned Income, 16 DE Admin Code 20000 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml new file mode 100644 index 00000000000..6dee1f5261c --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml @@ -0,0 +1,11 @@ +description: Delaware counts this share of monthly earned income remaining after the general and earned income exclusions for Medicaid long-term services and supports applicants without a community spouse. +values: + 2026-01-01: 0.5 + +metadata: + unit: /1 + period: month + label: Delaware Medicaid LTSS remaining earned income countable rate + reference: + - title: DSSM 20240.3 - Earned Income, 16 DE Admin Code 20000 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9 diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 09c759dc3bc..ec730188ed4 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -26,6 +26,11 @@ OUTPUTS = [ "medicaid_ltss_financial_pathway", "medicaid_ltss_special_income_limit", + "medicaid_ltss_assistance_unit_size", + "medicaid_ltss_individual_countable_income", + "medicaid_ltss_countable_income", + "medicaid_ltss_countable_resources", + "medicaid_ltss_csra", "is_medicaid_ltss_income_eligible", "medicaid_ltss_csra_resource_eligible", "medicaid_ltss_home_equity_eligible", @@ -53,7 +58,11 @@ def _random_people(rng): waiver=str(waiver), aged_blind_disabled=bool(rng.random() < 0.9), unit_size=int(rng.choice([0, 1, 1, 1, 2, 3])), - income=float(rng.uniform(0, 8_000)), + earned_income=float(rng.uniform(0, 8_000)), + unearned_income=float(rng.uniform(0, 8_000)), + earned_qit=float(rng.choice([0, rng.uniform(0, 2_000)])), + unearned_qit=float(rng.choice([0, rng.uniform(0, 2_000)])), + needs_based_qit=float(rng.choice([0, rng.uniform(0, 100)])), needs_based_income=float(rng.choice([0, rng.uniform(0, 500)])), medically_needy_expenses=float(rng.uniform(0, 2_000)), cost_of_care=float(rng.uniform(0, 12_000)), @@ -61,6 +70,11 @@ def _random_people(rng): has_community_spouse=bool(rng.random() < 0.4), snapshot=float(rng.uniform(0, 500_000)), spouse_resources=float(rng.uniform(0, 250_000)), + initial_determination=bool(rng.random() < 0.5), + wa_start_year=int(rng.choice([1989, 1995, 2003, 2026, 0, 2027])), + wa_start_month=int(rng.choice([0, 1, 7, 8, 9, 10, 13])), + wa_sole_resources=float(rng.uniform(0, 6_000)), + wa_joint_resources=float(rng.uniform(0, 6_000)), shelter=float(rng.uniform(0, 5_000)), market_value=market_value, encumbrances=float(rng.uniform(0, 1.2) * market_value), @@ -73,6 +87,19 @@ def _random_people(rng): hardship=bool(rng.random() < 0.05), ) ) + # Ensure the ownership property covers both determination phases rather + # than allowing chance to omit one phase in the small legacy cohort. + legacy = [ + person + for person in people + if person["state"] == "WA" + and person["has_community_spouse"] + and 1 <= person["wa_start_month"] <= 12 + and 1 <= person["wa_start_year"] + and person["wa_start_year"] * 100 + person["wa_start_month"] < 198910 + ] + for index, person in enumerate(legacy): + person["initial_determination"] = bool(index % 2) return people @@ -82,6 +109,7 @@ def month(value): def _situation(people, **overrides): situation = {"people": {}, "households": {}, "marital_units": {}} + community_spouses = [] for state in STATES: situation["households"][state] = { "members": [], @@ -90,8 +118,8 @@ def _situation(people, **overrides): for index, person in enumerate(people): person = {**person, **{k: v[index] for k, v in overrides.items()}} name = f"person_{index}" - # Each random record is independent; the builder otherwise places - # every person in one default marital unit. + # Independent applicants have no couple-service facts. Delaware's + # actual community spouses carry their own resource inventories. situation["marital_units"][name] = {"members": [name]} situation["households"][person["state"]]["members"].append(name) snapshot_variable = ( @@ -99,26 +127,33 @@ def _situation(people, **overrides): if person["state"] == "WA" else "medicaid_ltss_couple_countable_resources_at_first_institutionalization" ) - situation["people"][name] = { + values = { "is_ssi_aged_blind_disabled": {YEAR: person["aged_blind_disabled"]}, "medicaid_ltss_setting": month(person["setting"]), "medicaid_ltss_waiver": month(person["waiver"]), - "medicaid_ltss_assistance_unit_size": month(person["unit_size"]), - "medicaid_ltss_qit_adjusted_income": month(person["income"]), - "medicaid_ltss_income_disregards_already_applied": month( - bool(person.get("disregards_applied", False)) + "medicaid_ltss_reported_gross_earned_income": month( + person["earned_income"] + ), + "medicaid_ltss_reported_gross_unearned_income": month( + person["unearned_income"] + ), + "medicaid_ltss_earned_income_deposited_to_qit": month(person["earned_qit"]), + "medicaid_ltss_unearned_income_deposited_to_qit": month( + person["unearned_qit"] ), "medicaid_ltss_needs_based_income": month(person["needs_based_income"]), + "medicaid_ltss_needs_based_income_deposited_to_qit": month( + person["needs_based_qit"] + ), "medicaid_ltss_medically_needy_expenses": month( person["medically_needy_expenses"] ), "medicaid_ltss_cost_of_care": month(person["cost_of_care"]), - "medicaid_ltss_countable_resources": month(person["resources"]), "medicaid_ltss_has_community_spouse": month(person["has_community_spouse"]), - snapshot_variable: month(person["snapshot"]), - "medicaid_ltss_community_spouse_countable_resources": month( - person["spouse_resources"] + "medicaid_ltss_is_initial_eligibility_determination": month( + person["initial_determination"] ), + snapshot_variable: month(person["snapshot"]), "medicaid_ltss_community_spouse_shelter_expenses": month(person["shelter"]), "medicaid_ltss_home_market_value": month(person["market_value"]), "medicaid_ltss_home_encumbrances": month(person["encumbrances"]), @@ -132,7 +167,50 @@ def _situation(people, **overrides): ), "medicaid_ltss_home_equity_hardship_waiver": month(person["hardship"]), } - # Households list members in state order, which matches `people` order. + if person["state"] == "DE": + values["medicaid_ltss_individual_countable_resources"] = month( + person["resources"] + ) + if person["has_community_spouse"]: + spouse = f"community_spouse_{index}" + situation["marital_units"][name]["members"].append(spouse) + situation["households"]["DE"]["members"].append(spouse) + community_spouses.append((spouse, person["spouse_resources"])) + else: + # Existing non-Delaware explicit unit guards are still exercised. + values["medicaid_ltss_non_delaware_assistance_unit_size"] = month( + person["unit_size"] + ) + values["medicaid_ltss_individual_countable_resources"] = month( + person["resources"] + ) + values[ + "medicaid_ltss_non_delaware_community_spouse_countable_resources" + ] = month(person["spouse_resources"]) + if person["state"] == "WA": + values.update( + { + "wa_medicaid_ltss_most_recent_institutionalization_start_year": month( + person["wa_start_year"] + ), + "wa_medicaid_ltss_most_recent_institutionalization_start_month": month( + person["wa_start_month"] + ), + "wa_medicaid_ltss_solely_owned_countable_resources": month( + person["wa_sole_resources"] + ), + "wa_medicaid_ltss_jointly_owned_countable_resources": month( + person["wa_joint_resources"] + ), + } + ) + situation["people"][name] = values + # Append spouses after all original records so output slices retain the + # original state/person order regardless of marital-unit membership. + for name, resources in community_spouses: + situation["people"][name] = { + "medicaid_ltss_individual_countable_resources": month(resources), + } return situation @@ -143,7 +221,7 @@ def _calculate(people, **overrides): values = simulation.calculate(variable, PERIOD) if variable == "medicaid_ltss_financial_pathway": values = np.asarray(values.decode_to_str()) - results[variable] = np.asarray(values) + results[variable] = np.asarray(values)[: len(people)] return results @@ -158,7 +236,12 @@ def column(key): base = _calculate(people) deltas = rng.uniform(0.01, 3_000, len(people)) shifted = { - "income": _calculate(people, income=column("income") + deltas), + "earned_income": _calculate( + people, earned_income=column("earned_income") + deltas + ), + "unearned_income": _calculate( + people, unearned_income=column("unearned_income") + deltas + ), "resources": _calculate(people, resources=column("resources") + deltas), "spouse_resources": _calculate( people, spouse_resources=column("spouse_resources") + deltas @@ -167,9 +250,6 @@ def column(key): people, market_value=column("market_value") + 100 * deltas ), "shelter": _calculate(people, shelter=column("shelter") + deltas), - "disregards_applied": _calculate( - people, disregards_applied=np.ones(len(people), dtype=bool) - ), } return people, column, base, shifted @@ -249,11 +329,13 @@ def test_home_equity_floor_and_exceptions_always_pass(population): @pytest.mark.parametrize( "shift, variable", [ - ("income", "is_medicaid_ltss_income_eligible"), + ("earned_income", "is_medicaid_ltss_income_eligible"), + ("unearned_income", "is_medicaid_ltss_income_eligible"), ("resources", "medicaid_ltss_csra_resource_eligible"), ("spouse_resources", "medicaid_ltss_csra_resource_eligible"), ("market_value", "medicaid_ltss_home_equity_eligible"), - ("income", "is_medicaid_ltss_financial_threshold_eligible"), + ("earned_income", "is_medicaid_ltss_financial_threshold_eligible"), + ("unearned_income", "is_medicaid_ltss_financial_threshold_eligible"), ("resources", "is_medicaid_ltss_financial_threshold_eligible"), ], ) @@ -265,32 +347,300 @@ def test_screens_never_start_passing_when_a_countable_amount_rises( assert not newly_passing.any(), np.flatnonzero(newly_passing)[:5] -def test_final_income_flag_only_removes_the_delaware_disregard(population): +def _individual_countable_income(earned, unearned, needs, community_spouse): + # Independent statutory sequence: spend the $20 general exclusion on + # eligible unearned income first, then earnings; next $65, then half. + general_from_unearned = min(max(unearned - needs, 0), 20) + if community_spouse: + return earned + unearned - min(max(earned + unearned - needs, 0), 20) + remaining_general = 20 - general_from_unearned + return ( + unearned - general_from_unearned + max(earned - remaining_general - 65, 0) / 2 + ) + + +def test_raw_components_determine_income_in_the_statutory_order(population): + people, _, base, shifted = population + expected = [] + for person in people: + earned = max(person["earned_income"] - person["earned_qit"], 0) + unearned = max(person["unearned_income"] - person["unearned_qit"], 0) + needs = min(person["needs_based_income"], person["unearned_income"]) + deposited_needs = min( + person["needs_based_qit"], + needs, + person["unearned_qit"], + person["unearned_income"], + ) + needs = min(max(needs - deposited_needs, 0), unearned) + expected.append( + _individual_countable_income( + earned, unearned, needs, person["has_community_spouse"] + ) + if person["state"] == "DE" + else earned + unearned + ) + np.testing.assert_allclose( + base["medicaid_ltss_individual_countable_income"], + expected, + rtol=1e-6, + atol=0.001, + ) + np.testing.assert_array_equal( + base["medicaid_ltss_countable_income"], + base["medicaid_ltss_individual_countable_income"], + ) + for shift in ["earned_income", "unearned_income"]: + assert ( + shifted[shift]["medicaid_ltss_countable_income"] + >= base["medicaid_ltss_countable_income"] - 0.001 + ).all() + + +def test_delaware_independent_applicants_derive_individual_units(population): _, column, base, shifted = population - final = shifted["disregards_applied"] delaware = column("state") == "DE" - income_screens = [ - "is_medicaid_ltss_income_eligible", - "is_medicaid_ltss_financial_threshold_eligible", - ] - for variable in OUTPUTS: - if variable in income_screens: - # Only Delaware applies a disregard, so the flag changes nothing - # elsewhere, and skipping it can only make the screens harder. - np.testing.assert_array_equal( - final[variable][~delaware], base[variable][~delaware] - ) - assert not (final[variable] & ~base[variable]).any(), variable - else: - np.testing.assert_array_equal(final[variable], base[variable]) - # With the flag, Delaware compares the supplied income itself. - special = delaware & (base["medicaid_ltss_financial_pathway"] == "SPECIAL_INCOME") - assert special.any() + assert (base["medicaid_ltss_assistance_unit_size"][delaware] == 1).all() + for results in shifted.values(): + np.testing.assert_array_equal( + results["medicaid_ltss_assistance_unit_size"], + base["medicaid_ltss_assistance_unit_size"], + ) + np.testing.assert_allclose( + base["medicaid_ltss_countable_resources"][delaware], + column("resources")[delaware], + ) + + +def test_washington_dated_allocation_and_ownership_rules(population): + _, column, base, _ = population + washington = column("state") == "WA" + has_spouse = column("has_community_spouse") + onset = column("wa_start_year") * 100 + column("wa_start_month") + valid = ( + (column("wa_start_year") >= 1) + & (column("wa_start_month") >= 1) + & (column("wa_start_month") <= 12) + & (onset <= 202607) + ) + pre_1989 = washington & (onset < 198910) + legacy = washington & (onset >= 198910) & (onset < 200308) + modern = washington & (onset >= 200308) + maximum = FINANCIAL.federal.csra.maximum(f"{PERIOD}-01") + floor = FINANCIAL.wa.csra.state_minimum(f"{PERIOD}-01") + allowance = np.zeros(len(washington)) + allowance[legacy] = maximum + allowance[modern] = np.minimum( + np.maximum(column("snapshot")[modern] / 2, floor), maximum + ) + mask = washington & has_spouse + allowance[~valid | ~has_spouse] = 0 + np.testing.assert_allclose( + base["medicaid_ltss_csra"][mask], allowance[mask], rtol=1e-6, atol=0.01 + ) + assert (pre_1989 & mask & valid & column("initial_determination")).any() + assert (pre_1989 & mask & valid & ~column("initial_determination")).any() + own_half = (column("wa_sole_resources") + column("wa_joint_resources")) / 2 + expected = ( + (base["medicaid_ltss_financial_pathway"] != "UNMODELED") + & (base["medicaid_ltss_assistance_unit_size"] == 1) + & valid + & (own_half <= FINANCIAL.wa.resources.individual(f"{PERIOD}-01")) + ) + mask = pre_1989 & has_spouse np.testing.assert_array_equal( - final["is_medicaid_ltss_income_eligible"][special], - column("income")[special] - <= base["medicaid_ltss_special_income_limit"][special], + base["medicaid_ltss_csra_resource_eligible"][mask], expected[mask] ) + assert not base["medicaid_ltss_csra_resource_eligible"][ + washington & has_spouse & ~valid + ].any() + + +COUPLE_OUTPUTS = [ + "medicaid_ltss_individual_countable_income", + "medicaid_ltss_couple_countable_income", + "medicaid_ltss_assistance_unit_size", + "medicaid_ltss_countable_income", + "medicaid_ltss_countable_resources", + "is_medicaid_ltss_income_eligible", + "is_medicaid_ltss_financial_threshold_eligible", +] + + +def _random_couples(): + rng = np.random.default_rng(SEED + 1) + couples = [] + for index in range(24): + regime = index % 6 + couples.append( + { + "same_facility": regime < 4, + "months": [0, 5, 6, 12, 0, 12][regime], + "same_address_hcbs": regime == 4, + "setting": "HCBS" if regime == 4 else "INSTITUTIONAL", + "earned": rng.uniform(0, 6_000, 2), + "unearned": rng.uniform(0, 1_500, 2), + "resources": rng.uniform(0, 3_000, 2), + "delta": float(rng.uniform(0.01, 3_000)), + } + ) + if regime == 2: + # Random complementary inventories exercise favorable couple + # elections exactly at six completed months, not just ties. + couples[-1].update( + { + "earned": np.array( + [rng.uniform(3_000, 4_000), rng.uniform(0, 500)] + ), + "unearned": rng.uniform(0, 200, 2), + "resources": np.array( + [rng.uniform(2_001, 2_900), rng.uniform(0, 100)] + ), + } + ) + return couples + + +def _couple_results(couples, raised_spouse=None, reverse=False): + situation = {"people": {}, "households": {}, "marital_units": {}} + for index, couple in enumerate(couples): + names = [f"couple_{index}_a", f"couple_{index}_b"] + situation["households"][f"couple_{index}"] = { + "members": names, + "state_code": {YEAR: "DE"}, + } + situation["marital_units"][f"couple_{index}"] = { + "members": list(reversed(names)) if reverse else names, + "medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility": month( + couple["same_facility"] + ), + "medicaid_ltss_spouses_months_in_same_institutional_facility": month( + couple["months"] + ), + "medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address": month( + couple["same_address_hcbs"] + ), + } + for spouse, name in enumerate(names): + situation["people"][name] = { + "is_ssi_aged_blind_disabled": {YEAR: True}, + "medicaid_ltss_setting": month(couple["setting"]), + "medicaid_ltss_reported_gross_earned_income": month( + float(couple["earned"][spouse]) + + (couple["delta"] if spouse == raised_spouse else 0) + ), + "medicaid_ltss_reported_gross_unearned_income": month( + float(couple["unearned"][spouse]) + ), + "medicaid_ltss_individual_countable_resources": month( + float(couple["resources"][spouse]) + ), + } + if reverse: + situation["people"] = dict(reversed(list(situation["people"].items()))) + simulation = Simulation(situation=situation) + results = {} + for variable in reversed(COUPLE_OUTPUTS) if reverse else COUPLE_OUTPUTS: + values = np.asarray(simulation.calculate(variable, PERIOD)) + # Compare by person identity after changing record and spouse order. + results[variable] = values[::-1] if reverse else values + return results + + +@pytest.fixture(scope="module") +def couples(): + people = _random_couples() + return ( + people, + _couple_results(people), + [_couple_results(people, raised_spouse=spouse) for spouse in [0, 1]], + _couple_results(people, reverse=True), + ) + + +def test_couple_budget_is_deterministic_under_role_and_calculation_order(couples): + _, base, _, reversed_results = couples + for variable in COUPLE_OUTPUTS: + np.testing.assert_array_equal( + base[variable], reversed_results[variable], err_msg=variable + ) + units = base["medicaid_ltss_assistance_unit_size"].reshape(-1, 2) + np.testing.assert_array_equal(units[:, 0], units[:, 1]) + + +def test_derived_couple_budget_maximizes_the_number_of_eligible_spouses(couples): + people, base, _, _ = couples + instant = f"{PERIOD}-01" + rate = FINANCIAL.de.special_income_limit.rate(instant) + individual_limit = rate * SSI.amount.individual(instant) + couple_limit = rate * SSI.amount.couple(instant) + expected = [] + elected = [] + individual_incomes = [] + couple_incomes = [] + for couple in people: + individual = [ + _individual_countable_income(earned, unearned, 0, False) + for earned, unearned in zip(couple["earned"], couple["unearned"]) + ] + combined = _individual_countable_income( + sum(couple["earned"]), sum(couple["unearned"]), 0, False + ) + individual_count = sum( + income <= individual_limit and resources <= 2_000 + for income, resources in zip(individual, couple["resources"]) + ) + couple_count = 2 * ( + combined <= couple_limit and sum(couple["resources"]) <= 3_000 + ) + unit = 1 + if couple["same_address_hcbs"] or ( + couple["same_facility"] and couple["months"] < 6 + ): + unit = 2 + elif couple["same_facility"]: + unit = 2 if couple_count > individual_count else 1 + elected.append(unit) + expected.extend([unit, unit]) + individual_incomes.extend(individual) + couple_incomes.extend([combined, combined]) + # Both choices occur after month six, including ties favoring individuals. + assert set(elected) == {1, 2} + np.testing.assert_array_equal(base["medicaid_ltss_assistance_unit_size"], expected) + np.testing.assert_allclose( + base["medicaid_ltss_individual_countable_income"], + individual_incomes, + rtol=1e-6, + atol=0.001, + ) + np.testing.assert_allclose( + base["medicaid_ltss_couple_countable_income"], + couple_incomes, + rtol=1e-6, + atol=0.001, + ) + expected_income = np.where( + np.asarray(expected) == 2, couple_incomes, individual_incomes + ) + np.testing.assert_allclose( + base["medicaid_ltss_countable_income"], expected_income, rtol=1e-6, atol=0.001 + ) + + +@pytest.mark.parametrize("raised_spouse", [0, 1]) +@pytest.mark.parametrize( + "variable", + [ + "is_medicaid_ltss_income_eligible", + "is_medicaid_ltss_financial_threshold_eligible", + ], +) +def test_couple_screens_are_monotonic_in_either_spouses_raw_earnings( + couples, raised_spouse, variable +): + _, base, shifted, _ = couples + newly_passing = shifted[raised_spouse][variable] & ~base[variable] + assert not newly_passing.any(), np.flatnonzero(newly_passing) def test_mmmna_is_non_decreasing_in_shelter_expenses(population): @@ -316,7 +666,9 @@ def test_special_income_limit_matches_rate_times_ssi_federal_benefit_rate( ("WA", 1): FINANCIAL.wa.special_income_limit.rate(instant) * individual, } actual = base["medicaid_ltss_special_income_limit"] - for index, (state, size) in enumerate(zip(column("state"), column("unit_size"))): + for index, (state, size) in enumerate( + zip(column("state"), base["medicaid_ltss_assistance_unit_size"]) + ): assert actual[index] == pytest.approx(expected.get((state, size), 0)) # The published 2026 figures (TX Appendix XXXI, DE A-14-2025, WA HCA). assert texas == 2_982 @@ -329,8 +681,11 @@ def test_special_income_limit_follows_the_uprated_federal_benefit_rate(year): simulation = Simulation( situation={ "people": { - "texas": {"medicaid_ltss_assistance_unit_size": {period: 1}}, - "delaware": {"medicaid_ltss_assistance_unit_size": {period: 2}}, + "texas": { + "medicaid_ltss_non_delaware_assistance_unit_size": {period: 1} + }, + "delaware": {"medicaid_ltss_setting": {period: "HCBS"}}, + "delaware_spouse": {"medicaid_ltss_setting": {period: "HCBS"}}, }, "households": { "texas_household": { @@ -338,10 +693,19 @@ def test_special_income_limit_follows_the_uprated_federal_benefit_rate(year): "state_code": {str(year): "TX"}, }, "delaware_household": { - "members": ["delaware"], + "members": ["delaware", "delaware_spouse"], "state_code": {str(year): "DE"}, }, }, + "marital_units": { + "texas": {"members": ["texas"]}, + "delaware": { + "members": ["delaware", "delaware_spouse"], + "medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address": { + period: True + }, + }, + }, } ) instant = f"{period}-01" diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index 805ffa83474..e98a6fb15c7 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -8,9 +8,9 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 3_000 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 0 medicaid_ltss_community_spouse_shelter_expenses: 3_000 @@ -29,72 +29,97 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_500 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_home_market_value: 800_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_home_market_value: 800000 medicaid_ltss_home_ownership_share: 1 delaware: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_500 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_home_market_value: 800_000 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_home_market_value: 800000 medicaid_ltss_home_ownership_share: 1 washington: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_500 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_home_market_value: 800_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_home_market_value: 800000 medicaid_ltss_home_ownership_share: 1 tax_units: texas: - members: [texas] + members: + - texas delaware: - members: [delaware] + members: + - delaware washington: - members: [washington] + members: + - washington marital_units: texas: - members: [texas] + members: + - texas delaware: - members: [delaware] + members: + - delaware washington: - members: [washington] + members: + - washington spm_units: texas: - members: [texas] + members: + - texas delaware: - members: [delaware] + members: + - delaware washington: - members: [washington] + members: + - washington households: texas: - members: [texas] + members: + - texas state_code: 2026: TX delaware: - members: [delaware] + members: + - delaware state_code: 2026: DE washington: - members: [washington] + members: + - washington state_code: 2026: WA output: medicaid_ltss_financial_pathway: - [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] - is_medicaid_ltss_income_eligible: [true, true, true] - medicaid_ltss_csra_resource_eligible: [true, true, true] - medicaid_ltss_home_equity_eligible: [false, false, true] - is_medicaid_ltss_financial_threshold_eligible: [false, false, true] + - SPECIAL_INCOME + - SPECIAL_INCOME + - SPECIAL_INCOME + is_medicaid_ltss_income_eligible: + - true + - true + - true + medicaid_ltss_csra_resource_eligible: + - true + - true + - true + medicaid_ltss_home_equity_eligible: + - false + - false + - true + is_medicaid_ltss_financial_threshold_eligible: + - false + - false + - true - name: Case 3, vectorized assistance units and explicit ownership inputs remain separate. period: 2026-07 @@ -105,9 +130,9 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_000 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_home_market_value: 900_000 medicaid_ltss_home_encumbrances: 200_000 medicaid_ltss_home_ownership_share: 1 @@ -116,9 +141,9 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 5_000 - medicaid_ltss_countable_resources: 3_000 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 5_000 + medicaid_ltss_individual_countable_resources: 3_000 medicaid_ltss_home_market_value: 1_600_000 medicaid_ltss_home_ownership_share: 0.5 community_spouse: @@ -126,11 +151,11 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_000 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_has_community_spouse: true - medicaid_ltss_community_spouse_countable_resources: 50_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 50_000 medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 medicaid_ltss_home_market_value: 1_500_000 medicaid_ltss_home_ownership_share: 0.5 @@ -185,9 +210,8 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_400 - medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_reported_gross_unearned_income: 2400 + medicaid_ltss_individual_countable_resources: 1500 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -207,9 +231,9 @@ is_ssi_aged_blind_disabled: 2026: false medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_400 - medicaid_ltss_countable_resources: 1_500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_400 + medicaid_ltss_individual_countable_resources: 1_500 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -226,10 +250,10 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 3_100 - medicaid_ltss_countable_resources: 1_500 - medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3100 + medicaid_ltss_individual_countable_resources: 1500 + medicaid_ltss_cost_of_care: 3500 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -238,10 +262,9 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 3_100 - medicaid_ltss_countable_resources: 1_500 - medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_reported_gross_unearned_income: 3100 + medicaid_ltss_individual_countable_resources: 1500 + medicaid_ltss_cost_of_care: 3500 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -250,54 +273,80 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 3_100 - medicaid_ltss_countable_resources: 1_500 - medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3100 + medicaid_ltss_individual_countable_resources: 1500 + medicaid_ltss_cost_of_care: 3500 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 tax_units: texas: - members: [texas] + members: + - texas delaware: - members: [delaware] + members: + - delaware washington: - members: [washington] + members: + - washington marital_units: texas: - members: [texas] + members: + - texas delaware: - members: [delaware] + members: + - delaware washington: - members: [washington] + members: + - washington spm_units: texas: - members: [texas] + members: + - texas delaware: - members: [delaware] + members: + - delaware washington: - members: [washington] + members: + - washington households: texas: - members: [texas] + members: + - texas state_code: 2026: TX delaware: - members: [delaware] + members: + - delaware state_code: 2026: DE washington: - members: [washington] + members: + - washington state_code: 2026: WA output: medicaid_ltss_financial_pathway: - [SPECIAL_INCOME, SPECIAL_INCOME, INSTITUTIONAL_MEDICALLY_NEEDY] - is_medicaid_ltss_income_eligible: [false, false, true] - medicaid_ltss_csra_resource_eligible: [true, true, true] - medicaid_ltss_home_equity_eligible: [true, true, true] - is_medicaid_ltss_financial_threshold_eligible: [false, false, true] + - SPECIAL_INCOME + - SPECIAL_INCOME + - INSTITUTIONAL_MEDICALLY_NEEDY + is_medicaid_ltss_income_eligible: + - false + - false + - true + medicaid_ltss_csra_resource_eligible: + - true + - true + - true + medicaid_ltss_home_equity_eligible: + - true + - true + - true + is_medicaid_ltss_financial_threshold_eligible: + - false + - false + - true - name: Case 7, the composite fails when the resource screen is the only failing screen. period: 2026-07 @@ -308,9 +357,9 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_000 - medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 2_001 households: household: members: [applicant] @@ -333,30 +382,48 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_400 + medicaid_ltss_reported_gross_unearned_income: 2400 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 32_532 - medicaid_ltss_home_market_value: 900_000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_home_market_value: 900000 medicaid_ltss_home_ownership_share: 0.5 medicaid_ltss_home_occupied_by_spouse: true community_spouse: is_ssi_aged_blind_disabled: 2026: false + medicaid_ltss_individual_countable_resources: 32532 households: household: - members: [applicant, community_spouse] + members: + - applicant + - community_spouse state_code: 2026: DE + marital_units: + applicant: + members: + - applicant + - community_spouse output: - medicaid_ltss_financial_pathway: [SPECIAL_INCOME, UNMODELED] - is_medicaid_ltss_income_eligible: [true, false] - medicaid_ltss_csra_resource_eligible: [true, false] - medicaid_ltss_home_equity_eligible: [true, true] - medicaid_ltss_mmmna: [2_705, 0] - is_medicaid_ltss_financial_threshold_eligible: [true, false] + medicaid_ltss_financial_pathway: + - SPECIAL_INCOME + - UNMODELED + is_medicaid_ltss_income_eligible: + - true + - false + medicaid_ltss_csra_resource_eligible: + - true + - false + medicaid_ltss_home_equity_eligible: + - true + - true + medicaid_ltss_mmmna: + - 2705 + - 0 + is_medicaid_ltss_financial_threshold_eligible: + - true + - false - name: Case 9, Washington community-spouse applicants bracket the state spousal resource standard end to end. period: 2026-07 @@ -367,23 +434,23 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_500 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_529 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_529 above_state_standard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_500 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_530 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_530 households: at_household: members: [at_state_standard] @@ -410,9 +477,9 @@ is_ssi_aged_blind_disabled: 2025: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_000 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_has_community_spouse: true households: household: @@ -437,16 +504,16 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_500 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true # 2024 first episode, followed by a qualifying break and July 2026 re-entry. # Use July 1 resources, rather than the 2024 or September current resources. medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 98_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 output: medicaid_ltss_financial_pathway: SPECIAL_INCOME is_medicaid_ltss_income_eligible: true @@ -462,39 +529,39 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: &id001 2026: true - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2000 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 - medicaid_ltss_countable_resources: 2000 - medicaid_ltss_community_spouse_countable_resources: 98000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 applicant_2: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: *id001 - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2000 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 wa_medicaid_ltss_most_recent_institutionalization_start_month: 8 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 - medicaid_ltss_countable_resources: 2000 - medicaid_ltss_community_spouse_countable_resources: 98000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 applicant_3: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: *id001 - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2000 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 - medicaid_ltss_countable_resources: 2000 - medicaid_ltss_community_spouse_countable_resources: 98000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 marital_units: applicant_1: members: diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 88c8171b6f3..6ae6a77c259 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -7,43 +7,43 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_981 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2981 at_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_982 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2982 above_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_983 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2983 couple_below_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 5_963 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 5963 couple_at_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 5_964 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 5964 couple_above_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 5_965 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 5965 tax_units: tax_unit_below_limit: members: [below_limit] @@ -109,36 +109,39 @@ state_code: 2026: TX output: - is_medicaid_ltss_income_eligible: - [true, true, false, true, true, false] + is_medicaid_ltss_income_eligible: [true, true, false, true, true, false] -- name: Case 2, Texas valid QIT is sufficient when trusted adjusted income is at the limit. +- name: Case 2, Texas income after actual QIT deposits can equal the limit. period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_982 + medicaid_ltss_non_delaware_assistance_unit_size: 1 state_code: 2026: TX + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 1018 output: is_medicaid_ltss_income_eligible: true + medicaid_ltss_qit_adjusted_income: 2982 -- name: Case 3, Texas valid QIT is insufficient when trusted adjusted income remains above the limit. +- name: Case 3, Texas income after actual QIT deposits above the limit fails. period: 2026-07 input: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_983 + medicaid_ltss_non_delaware_assistance_unit_size: 1 state_code: 2026: TX + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 1017 output: is_medicaid_ltss_income_eligible: false + medicaid_ltss_qit_adjusted_income: 2983 - name: Case 4, Delaware needs-based income receives no general disregard. period: 2026-07 @@ -149,49 +152,61 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_484 - medicaid_ltss_needs_based_income: 2_484 + medicaid_ltss_needs_based_income: 2484 + medicaid_ltss_reported_gross_unearned_income: 2484 at_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_485 - medicaid_ltss_needs_based_income: 2_485 + medicaid_ltss_needs_based_income: 2485 + medicaid_ltss_reported_gross_unearned_income: 2485 above_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_486 - medicaid_ltss_needs_based_income: 2_486 + medicaid_ltss_needs_based_income: 2486 + medicaid_ltss_reported_gross_unearned_income: 2486 couple_below_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_727 - medicaid_ltss_needs_based_income: 3_727 + medicaid_ltss_needs_based_income: 3727 + medicaid_ltss_reported_gross_unearned_income: 3727 couple_at_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_727.5 - medicaid_ltss_needs_based_income: 3_727.5 + medicaid_ltss_needs_based_income: 3727.5 + medicaid_ltss_reported_gross_unearned_income: 3727.5 couple_above_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_728 - medicaid_ltss_needs_based_income: 3_728 + medicaid_ltss_needs_based_income: 3728 + medicaid_ltss_reported_gross_unearned_income: 3728 + couple_below_limit_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 + couple_at_limit_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 + couple_above_limit_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 tax_units: tax_unit_below_limit: members: [below_limit] @@ -200,11 +215,11 @@ tax_unit_above_limit: members: [above_limit] tax_unit_couple_below_limit: - members: [couple_below_limit] + members: [couple_below_limit, couple_below_limit_spouse] tax_unit_couple_at_limit: - members: [couple_at_limit] + members: [couple_at_limit, couple_at_limit_spouse] tax_unit_couple_above_limit: - members: [couple_above_limit] + members: [couple_above_limit, couple_above_limit_spouse] marital_units: marital_unit_below_limit: members: [below_limit] @@ -213,11 +228,14 @@ marital_unit_above_limit: members: [above_limit] marital_unit_couple_below_limit: - members: [couple_below_limit] + members: [couple_below_limit, couple_below_limit_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true marital_unit_couple_at_limit: - members: [couple_at_limit] + members: [couple_at_limit, couple_at_limit_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true marital_unit_couple_above_limit: - members: [couple_above_limit] + members: [couple_above_limit, couple_above_limit_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true spm_units: spm_unit_below_limit: members: [below_limit] @@ -226,11 +244,11 @@ spm_unit_above_limit: members: [above_limit] spm_unit_couple_below_limit: - members: [couple_below_limit] + members: [couple_below_limit, couple_below_limit_spouse] spm_unit_couple_at_limit: - members: [couple_at_limit] + members: [couple_at_limit, couple_at_limit_spouse] spm_unit_couple_above_limit: - members: [couple_above_limit] + members: [couple_above_limit, couple_above_limit_spouse] households: household_below_limit: members: [below_limit] @@ -245,20 +263,19 @@ state_code: 2026: DE household_couple_below_limit: - members: [couple_below_limit] + members: [couple_below_limit, couple_below_limit_spouse] state_code: 2026: DE household_couple_at_limit: - members: [couple_at_limit] + members: [couple_at_limit, couple_at_limit_spouse] state_code: 2026: DE household_couple_above_limit: - members: [couple_above_limit] + members: [couple_above_limit, couple_above_limit_spouse] state_code: 2026: DE output: - is_medicaid_ltss_income_eligible: - [true, true, false, true, true, false] + is_medicaid_ltss_income_eligible: [true, true, false, true, true, false, true, true, false] - name: Case 5, Delaware applies the general disregard to ordinary income. period: 2026-07 @@ -269,49 +286,61 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_504 medicaid_ltss_needs_based_income: 0 + medicaid_ltss_reported_gross_unearned_income: 2504 at_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_505 medicaid_ltss_needs_based_income: 0 + medicaid_ltss_reported_gross_unearned_income: 2505 above_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_506 medicaid_ltss_needs_based_income: 0 + medicaid_ltss_reported_gross_unearned_income: 2506 couple_below_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_747 medicaid_ltss_needs_based_income: 0 + medicaid_ltss_reported_gross_unearned_income: 3747 couple_at_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_747.5 medicaid_ltss_needs_based_income: 0 + medicaid_ltss_reported_gross_unearned_income: 3747.5 couple_above_limit_after_disregard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_qit_adjusted_income: 3_748 medicaid_ltss_needs_based_income: 0 + medicaid_ltss_reported_gross_unearned_income: 3748 + couple_below_limit_after_disregard_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 + couple_at_limit_after_disregard_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 + couple_above_limit_after_disregard_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 tax_units: tax_unit_below_limit_after_disregard: members: [below_limit_after_disregard] @@ -320,11 +349,11 @@ tax_unit_above_limit_after_disregard: members: [above_limit_after_disregard] tax_unit_couple_below_limit_after_disregard: - members: [couple_below_limit_after_disregard] + members: [couple_below_limit_after_disregard, couple_below_limit_after_disregard_spouse] tax_unit_couple_at_limit_after_disregard: - members: [couple_at_limit_after_disregard] + members: [couple_at_limit_after_disregard, couple_at_limit_after_disregard_spouse] tax_unit_couple_above_limit_after_disregard: - members: [couple_above_limit_after_disregard] + members: [couple_above_limit_after_disregard, couple_above_limit_after_disregard_spouse] marital_units: marital_unit_below_limit_after_disregard: members: [below_limit_after_disregard] @@ -333,11 +362,14 @@ marital_unit_above_limit_after_disregard: members: [above_limit_after_disregard] marital_unit_couple_below_limit_after_disregard: - members: [couple_below_limit_after_disregard] + members: [couple_below_limit_after_disregard, couple_below_limit_after_disregard_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true marital_unit_couple_at_limit_after_disregard: - members: [couple_at_limit_after_disregard] + members: [couple_at_limit_after_disregard, couple_at_limit_after_disregard_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true marital_unit_couple_above_limit_after_disregard: - members: [couple_above_limit_after_disregard] + members: [couple_above_limit_after_disregard, couple_above_limit_after_disregard_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true spm_units: spm_unit_below_limit_after_disregard: members: [below_limit_after_disregard] @@ -346,11 +378,11 @@ spm_unit_above_limit_after_disregard: members: [above_limit_after_disregard] spm_unit_couple_below_limit_after_disregard: - members: [couple_below_limit_after_disregard] + members: [couple_below_limit_after_disregard, couple_below_limit_after_disregard_spouse] spm_unit_couple_at_limit_after_disregard: - members: [couple_at_limit_after_disregard] + members: [couple_at_limit_after_disregard, couple_at_limit_after_disregard_spouse] spm_unit_couple_above_limit_after_disregard: - members: [couple_above_limit_after_disregard] + members: [couple_above_limit_after_disregard, couple_above_limit_after_disregard_spouse] households: household_below_limit_after_disregard: members: [below_limit_after_disregard] @@ -365,20 +397,19 @@ state_code: 2026: DE household_couple_below_limit_after_disregard: - members: [couple_below_limit_after_disregard] + members: [couple_below_limit_after_disregard, couple_below_limit_after_disregard_spouse] state_code: 2026: DE household_couple_at_limit_after_disregard: - members: [couple_at_limit_after_disregard] + members: [couple_at_limit_after_disregard, couple_at_limit_after_disregard_spouse] state_code: 2026: DE household_couple_above_limit_after_disregard: - members: [couple_above_limit_after_disregard] + members: [couple_above_limit_after_disregard, couple_above_limit_after_disregard_spouse] state_code: 2026: DE output: - is_medicaid_ltss_income_eligible: - [true, true, false, true, true, false] + is_medicaid_ltss_income_eligible: [true, true, false, true, true, false, true, true, false] - name: Case 6, Delaware does not disregard needs-based income above the limit. period: 2026-07 @@ -387,11 +418,10 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_505 - medicaid_ltss_needs_based_income: 2_505 + medicaid_ltss_needs_based_income: 2505 state_code: 2026: DE + medicaid_ltss_reported_gross_unearned_income: 2505 output: is_medicaid_ltss_income_eligible: false @@ -404,22 +434,22 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_981 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2981 at_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_982 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2982 above_limit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_983 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2983 tax_units: tax_unit_below_limit: members: [below_limit] @@ -455,8 +485,7 @@ state_code: 2026: WA output: - medicaid_ltss_financial_pathway: - [SPECIAL_INCOME, SPECIAL_INCOME, INSTITUTIONAL_MEDICALLY_NEEDY] + medicaid_ltss_financial_pathway: [SPECIAL_INCOME, SPECIAL_INCOME, INSTITUTIONAL_MEDICALLY_NEEDY] is_medicaid_ltss_income_eligible: [true, true, false] - name: Case 8, Washington institutional medically needy income can equal cost of care. @@ -466,12 +495,12 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_medically_needy_expenses: 500 - medicaid_ltss_cost_of_care: 3_500 + medicaid_ltss_cost_of_care: 3500 state_code: 2026: WA + medicaid_ltss_reported_gross_unearned_income: 4000 output: is_medicaid_ltss_income_eligible: true @@ -482,12 +511,12 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_medically_needy_expenses: 500 - medicaid_ltss_cost_of_care: 3_499 + medicaid_ltss_cost_of_care: 3499 state_code: 2026: WA + medicaid_ltss_reported_gross_unearned_income: 4000 output: is_medicaid_ltss_income_eligible: false @@ -500,8 +529,8 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 0 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 0 output: is_medicaid_ltss_income_eligible: true @@ -514,17 +543,15 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_480 - medicaid_ltss_needs_based_income: 2_470 + medicaid_ltss_needs_based_income: 2470 + medicaid_ltss_reported_gross_unearned_income: 2480 fails_with_partial_disregard: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_496 - medicaid_ltss_needs_based_income: 2_486 + medicaid_ltss_needs_based_income: 2486 + medicaid_ltss_reported_gross_unearned_income: 2496 tax_units: passes_with_partial_disregard_tax_unit: members: [passes_with_partial_disregard] @@ -561,19 +588,19 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_medically_needy_expenses: 500 - medicaid_ltss_cost_of_care: 2_506 + medicaid_ltss_cost_of_care: 2506 + medicaid_ltss_reported_gross_unearned_income: 4000 above_income_level: medicaid_ltss_setting: HCBS is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_medically_needy_expenses: 500 - medicaid_ltss_cost_of_care: 2_505 + medicaid_ltss_cost_of_care: 2505 + medicaid_ltss_reported_gross_unearned_income: 4000 tax_units: at_income_level_tax_unit: members: [at_income_level] @@ -599,8 +626,7 @@ state_code: 2026: WA output: - medicaid_ltss_financial_pathway: - [INSTITUTIONAL_MEDICALLY_NEEDY, INSTITUTIONAL_MEDICALLY_NEEDY] + medicaid_ltss_financial_pathway: [INSTITUTIONAL_MEDICALLY_NEEDY, INSTITUTIONAL_MEDICALLY_NEEDY] is_medicaid_ltss_income_eligible: [true, false] - name: Washington COPES medically needy income level follows SSI uprating in 2027. @@ -612,63 +638,348 @@ is_ssi_aged_blind_disabled: 2027: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_medically_needy_expenses: 500 - medicaid_ltss_cost_of_care: 2_500 + medicaid_ltss_cost_of_care: 2500 + medicaid_ltss_reported_gross_unearned_income: 4000 output: medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY - # Net income 4_000 - 500 - 2_500 = 1_000 exceeds the 2026 standard - # of 994 but is below the uprated one-person SSI federal benefit rate. is_medicaid_ltss_income_eligible: true -- name: Case 13, final Delaware countable income receives no second disregard. +- name: Case 13, Delaware computes ordered exclusions from raw earnings. period: 2026-07 input: people: earned_at_limit: - # Gross earnings 5_055: (5_055 - 20 - 65) / 2 = 2_485. medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_485 - medicaid_ltss_income_disregards_already_applied: true + # (5_055 - 20 - 65) / 2 = 2_485, exactly the individual limit. + medicaid_ltss_reported_gross_earned_income: 5_055 earned_above_limit: - # Gross earnings 5_057: (5_057 - 20 - 65) / 2 = 2_486. Subtracting - # another $20 would give 2_466 and wrongly pass. medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_486 - medicaid_ltss_income_disregards_already_applied: true + # (5_057 - 20 - 65) / 2 = 2_486, above the individual limit. + medicaid_ltss_reported_gross_earned_income: 5_057 community_spouse_case: - # DSSM 20990: gross earnings 5_055 - 20 = 5_035, the sole deduction. medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_qit_adjusted_income: 5_035 - medicaid_ltss_income_disregards_already_applied: true + # DSSM 20990 permits only 5_055 - 20 = 5_035 for a community spouse case. + medicaid_ltss_reported_gross_earned_income: 5_055 raw_unearned: - # 2_505 - 20 = 2_485. medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_505 - medicaid_ltss_income_disregards_already_applied: false + medicaid_ltss_reported_gross_unearned_income: 2505 + community_spouse: + medicaid_ltss_reported_gross_unearned_income: 10000 + households: + delaware: + members: [earned_at_limit, earned_above_limit, community_spouse_case, raw_unearned, community_spouse] + state_code: + 2026: DE + marital_units: + earned_at_limit_unit: + members: [earned_at_limit] + earned_above_limit_unit: + members: [earned_above_limit] + community_spouses: + members: [community_spouse_case, community_spouse] + raw_unearned_unit: + members: [raw_unearned] + output: + is_medicaid_ltss_income_eligible: [true, false, false, true, false] + medicaid_ltss_countable_income: [2485, 2486, 5035, 2485, 9980] + +- name: Delaware excludes ordinary unearned income before halving earnings + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_reported_gross_unearned_income: 100 + medicaid_ltss_needs_based_income: 0 + output: + medicaid_ltss_individual_countable_income: 547.5 + medicaid_ltss_countable_income: 547.5 + is_medicaid_ltss_income_eligible: true + +- name: Delaware carries unused general exclusion to earnings before the earned exclusion + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_reported_gross_unearned_income: 10 + medicaid_ltss_needs_based_income: 0 + output: + medicaid_ltss_individual_countable_income: 462.5 + medicaid_ltss_countable_income: 462.5 + is_medicaid_ltss_income_eligible: true + +- name: Delaware does not apply general exclusion to needs-based unearned income + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_reported_gross_unearned_income: 100 + medicaid_ltss_needs_based_income: 100 + output: + medicaid_ltss_individual_countable_income: 557.5 + medicaid_ltss_countable_income: 557.5 + is_medicaid_ltss_income_eligible: true + +- name: Delaware clips small earnings after ordered exclusions + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 80 + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_needs_based_income: 0 + output: + medicaid_ltss_individual_countable_income: 0 + medicaid_ltss_countable_income: 0 + is_medicaid_ltss_income_eligible: true + +- name: Raw earned and unearned components default to existing annual income sources + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + employment_income: + 2026: 12000 + taxable_pension_income: + 2026: 1200 + output: + medicaid_ltss_gross_earned_income: 1000 + medicaid_ltss_gross_unearned_income: 100 + medicaid_ltss_countable_income: 547.5 + +- name: Source-specific QIT deposits precede Delaware income exclusions + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 2000 + medicaid_ltss_reported_gross_unearned_income: 500 + medicaid_ltss_earned_income_deposited_to_qit: 1000 + medicaid_ltss_unearned_income_deposited_to_qit: 400 + output: + medicaid_ltss_qit_adjusted_income: 1100 + medicaid_ltss_countable_income: 547.5 + +- name: Delaware couple raw earnings include the exact limit after one set of exclusions + period: 2026-07 + input: + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 3770 + medicaid_ltss_reported_gross_unearned_income: 0 + spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 3770 + medicaid_ltss_reported_gross_unearned_income: 0 + marital_units: + couple: + members: [applicant, spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 + households: + household: + members: [applicant, spouse] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [2, 2] + medicaid_ltss_couple_countable_income: [3727.5, 3727.5] + medicaid_ltss_countable_income: [3727.5, 3727.5] + is_medicaid_ltss_income_eligible: [true, true] + +- name: Delaware couple raw earnings above the limit fail after one set of exclusions + period: 2026-07 + input: + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 3771 + medicaid_ltss_reported_gross_unearned_income: 0 + spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 3771 + medicaid_ltss_reported_gross_unearned_income: 0 + marital_units: + couple: + members: [applicant, spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 households: + household: + members: [applicant, spouse] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [2, 2] + # (3_771 + 3_771 - 20 - 65) / 2 = 3_728.5, above the 3_727.5 limit. + medicaid_ltss_couple_countable_income: [3728.5, 3728.5] + medicaid_ltss_countable_income: [3728.5, 3728.5] + is_medicaid_ltss_income_eligible: [false, false] + +- name: Delaware mixed-income couple shares one general and earned exclusion + period: 2026-07 + input: + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 2800 + medicaid_ltss_reported_gross_unearned_income: 500 + spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 2800 + medicaid_ltss_reported_gross_unearned_income: 500 + marital_units: + couple: + members: [applicant, spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 + households: + household: + members: [applicant, spouse] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [2, 2] + medicaid_ltss_couple_countable_income: [3747.5, 3747.5] + medicaid_ltss_countable_income: [3747.5, 3747.5] + is_medicaid_ltss_income_eligible: [false, false] + +- name: Delaware derives remaining needs-based income from raw QIT source deposits + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_reported_gross_unearned_income: 500 + medicaid_ltss_needs_based_income: 300 + medicaid_ltss_unearned_income_deposited_to_qit: 400 + medicaid_ltss_needs_based_income_deposited_to_qit: 250 + output: + medicaid_ltss_qit_adjusted_unearned_income: 100 + medicaid_ltss_qit_adjusted_needs_based_income: 50 + medicaid_ltss_countable_income: 547.5 + +- name: Delaware preserves the needs-based carve-out when QIT classifications are incomplete + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_reported_gross_unearned_income: 500 + medicaid_ltss_needs_based_income: 300 + medicaid_ltss_unearned_income_deposited_to_qit: 400 + medicaid_ltss_needs_based_income_deposited_to_qit: 0 + output: + medicaid_ltss_qit_adjusted_unearned_income: 100 + medicaid_ltss_qit_adjusted_needs_based_income: 100 + medicaid_ltss_countable_income: 557.5 + +- name: Reported monthly income preserves other people's annual-source defaults + period: 2026-07 + input: + people: + delaware_reported: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + employment_income: + 2026: 60_000 + taxable_pension_income: + 2026: 12_000 + medicaid_ltss_reported_gross_earned_income: 5_055 + # An explicit zero overrides this person's annual pension default. + medicaid_ltss_reported_gross_unearned_income: 0 + texas_annual_earned: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + employment_income: + 2026: 36_000 + washington_annual_unearned: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + taxable_pension_income: + 2026: 36_000 + marital_units: delaware: - members: - [earned_at_limit, earned_above_limit, community_spouse_case, raw_unearned] + members: [delaware_reported] + texas: + members: [texas_annual_earned] + washington: + members: [washington_annual_unearned] + households: + delaware: + members: [delaware_reported] state_code: 2026: DE + texas: + members: [texas_annual_earned] + state_code: + 2026: TX + washington: + members: [washington_annual_unearned] + state_code: + 2026: WA output: - is_medicaid_ltss_income_eligible: [true, false, false, true] + medicaid_ltss_gross_earned_income: [5_055, 3_000, 0] + medicaid_ltss_gross_unearned_income: [0, 0, 3_000] + medicaid_ltss_countable_income: [2_485, 3_000, 3_000] + is_medicaid_ltss_income_eligible: [true, false, false] + is_medicaid_ltss_financial_threshold_eligible: [true, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml new file mode 100644 index 00000000000..da2b61d7f71 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml @@ -0,0 +1,239 @@ +- name: Case 1, Delaware institutional units derive from duration and the favorable joint income-resource budget. + period: 2026-09 + input: + people: + five_month_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + five_month_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + six_month_income_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + six_month_income_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + couple_income_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + couple_income_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 500 + individual_resources_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_900 + individual_resources_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_900 + couple_resources_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 2_500 + couple_resources_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 500 + mixed_budget_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + mixed_budget_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 2_500 + reversed_mixed_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 2_500 + reversed_mixed_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + tie_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + tie_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + marital_units: + five_month: + members: [five_month_a, five_month_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 + six_month_income: + members: [six_month_income_a, six_month_income_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + couple_income: + members: [couple_income_a, couple_income_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + individual_resources: + members: [individual_resources_a, individual_resources_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + couple_resources: + members: [couple_resources_a, couple_resources_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + mixed_budget: + members: [mixed_budget_a, mixed_budget_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + reversed_mixed: + members: [reversed_mixed_b, reversed_mixed_a] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + tie: + members: [tie_a, tie_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + households: + delaware: + members: + [five_month_a, five_month_b, six_month_income_a, six_month_income_b, + couple_income_a, couple_income_b, individual_resources_a, + individual_resources_b, couple_resources_a, couple_resources_b, + mixed_budget_a, mixed_budget_b, reversed_mixed_b, reversed_mixed_a, + tie_a, tie_b] + state_code: + 2026: DE + output: + # At five months couple budgeting is compulsory even if both individual + # budgets would pass. At exactly six months the favorable election applies. + medicaid_ltss_assistance_unit_size: + [2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1] + medicaid_ltss_countable_income: + [3_980, 3_980, 1_980, 1_980, 2_980, 2_980, 980, 980, + 1_980, 1_980, 2_980, 2_980, 2_980, 2_980, 980, 980] + medicaid_ltss_countable_resources: + [2_000, 2_000, 1_000, 1_000, 1_000, 1_000, 1_900, 1_900, + 3_000, 3_000, 3_000, 3_000, 3_000, 3_000, 1_000, 1_000] + medicaid_ltss_special_income_limit: + [3_727.5, 3_727.5, 2_485, 2_485, 3_727.5, 3_727.5, 2_485, 2_485, + 3_727.5, 3_727.5, 3_727.5, 3_727.5, 3_727.5, 3_727.5, 2_485, 2_485] + + is_medicaid_ltss_income_eligible: + [false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true] + medicaid_ltss_csra_resource_eligible: + [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true] + is_medicaid_ltss_financial_threshold_eligible: + [false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true] + +- name: Case 2, Delaware same-address HCBS couples use a couple budget regardless of institutional duration. + period: 2026-09 + input: + people: + same_address_a: + medicaid_ltss_setting: HCBS + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + is_ssi_aged_blind_disabled: + 2026: true + same_address_b: + medicaid_ltss_setting: HCBS + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + is_ssi_aged_blind_disabled: + 2026: true + different_address_a: + medicaid_ltss_setting: HCBS + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + is_ssi_aged_blind_disabled: + 2026: true + different_address_b: + medicaid_ltss_setting: HCBS + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + is_ssi_aged_blind_disabled: + 2026: true + marital_units: + same_address: + members: [same_address_a, same_address_b] + medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 12 + different_address: + members: [different_address_a, different_address_b] + medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address: false + households: + delaware: + members: [same_address_a, same_address_b, different_address_a, different_address_b] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [2, 2, 1, 1] + medicaid_ltss_countable_income: [3_980, 3_980, 1_980, 1_980] + medicaid_ltss_countable_resources: [2_000, 2_000, 1_000, 1_000] + # The statutory budget unit does not add Delaware HCBS pathway coverage. + medicaid_ltss_financial_pathway: [UNMODELED, UNMODELED, UNMODELED, UNMODELED] + +- name: Case 3, Delaware defaults to individuals without shared-service facts and cannot create a couple from a single person. + period: 2026-09 + input: + people: + married_a: {} + married_b: {} + single: {} + duration_unspecified_a: {} + duration_unspecified_b: {} + marital_units: + married: + members: [married_a, married_b] + single: + members: [single] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address: true + duration_unspecified: + members: [duration_unspecified_a, duration_unspecified_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + households: + delaware: + members: [married_a, married_b, single, duration_unspecified_a, duration_unspecified_b] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [1, 1, 1, 2, 2] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index c9697c08737..f3708ba7071 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -7,22 +7,22 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 1_999 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_countable_resources: 1_999 at: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_countable_resources: 2_000 above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_countable_resources: 2_001 tax_units: below_tax_unit: members: [below] @@ -76,22 +76,22 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 2_999 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 2_999 at: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_000 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 3_000 above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_001 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 3_001 tax_units: below_tax_unit: members: [below] @@ -145,123 +145,188 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 2_999 + medicaid_ltss_individual_countable_resources: 2999 at: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_000 + medicaid_ltss_individual_countable_resources: 3000 above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_001 + medicaid_ltss_individual_countable_resources: 3001 individual_below: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 1_999 + medicaid_ltss_individual_countable_resources: 1999 individual_at: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_individual_countable_resources: 2000 individual_above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_individual_countable_resources: 2001 + below_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_individual_countable_resources: 0 + at_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_individual_countable_resources: 0 + above_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_individual_countable_resources: 0 tax_units: below_tax_unit: - members: [below] + members: + - below + - below_spouse at_tax_unit: - members: [at] + members: + - at + - at_spouse above_tax_unit: - members: [above] + members: + - above + - above_spouse individual_below_tax_unit: - members: [individual_below] + members: + - individual_below individual_at_tax_unit: - members: [individual_at] + members: + - individual_at individual_above_tax_unit: - members: [individual_above] + members: + - individual_above families: below_family: - members: [below] + members: + - below + - below_spouse at_family: - members: [at] + members: + - at + - at_spouse above_family: - members: [above] + members: + - above + - above_spouse individual_below_family: - members: [individual_below] + members: + - individual_below individual_at_family: - members: [individual_at] + members: + - individual_at individual_above_family: - members: [individual_above] + members: + - individual_above spm_units: below_spm_unit: - members: [below] + members: + - below + - below_spouse at_spm_unit: - members: [at] + members: + - at + - at_spouse above_spm_unit: - members: [above] + members: + - above + - above_spouse individual_below_spm_unit: - members: [individual_below] + members: + - individual_below individual_at_spm_unit: - members: [individual_at] + members: + - individual_at individual_above_spm_unit: - members: [individual_above] + members: + - individual_above marital_units: below_marital_unit: - members: [below] + members: + - below + - below_spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true at_marital_unit: - members: [at] + members: + - at + - at_spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true above_marital_unit: - members: [above] + members: + - above + - above_spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true individual_below_marital_unit: - members: [individual_below] + members: + - individual_below individual_at_marital_unit: - members: [individual_at] + members: + - individual_at individual_above_marital_unit: - members: [individual_above] + members: + - individual_above households: below_household: - members: [below] + members: + - below + - below_spouse state_code: 2026: DE at_household: - members: [at] + members: + - at + - at_spouse state_code: 2026: DE above_household: - members: [above] + members: + - above + - above_spouse state_code: 2026: DE individual_below_household: - members: [individual_below] + members: + - individual_below state_code: 2026: DE individual_at_household: - members: [individual_at] + members: + - individual_at state_code: 2026: DE individual_above_household: - members: [individual_above] + members: + - individual_above state_code: 2026: DE output: medicaid_ltss_csra_resource_eligible: - [true, true, false, true, true, false] + - true + - true + - false + - true + - true + - false + - true + - true + - false - name: Case 4, Washington individual resource boundary is inclusive and assistance unit of two fails closed. period: 2026-07 @@ -272,29 +337,29 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 1_999 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_countable_resources: 1_999 at: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 2_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_countable_resources: 2_000 above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_countable_resources: 2_001 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_countable_resources: 2_001 unsupported_couple: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 0 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 0 tax_units: below_tax_unit: members: [below] @@ -362,11 +427,11 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 60_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 32_532 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 32_532 output: medicaid_ltss_csra_resource_eligible: true @@ -379,11 +444,11 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 50_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 50_000 output: medicaid_ltss_csra_resource_eligible: true @@ -396,21 +461,21 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_660 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 162_660 above_maximum: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_661 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 162_661 tax_units: at_maximum_tax_unit: members: [at_maximum] @@ -452,10 +517,10 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_non_delaware_assistance_unit_size: 2 medicaid_ltss_has_community_spouse: true - medicaid_ltss_countable_resources: 0 - medicaid_ltss_community_spouse_countable_resources: 0 + medicaid_ltss_individual_countable_resources: 0 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 medicaid_ltss_couple_countable_resources_at_first_institutionalization: 0 output: medicaid_ltss_csra_resource_eligible: false @@ -469,11 +534,11 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 60_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 32_533 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 32_533 output: medicaid_ltss_csra_resource_eligible: false @@ -486,11 +551,11 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 50_001 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 50_001 output: medicaid_ltss_csra_resource_eligible: false @@ -503,21 +568,21 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 145_058 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_529 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_529 above_tie: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 145_058 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_530 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_530 tax_units: at_tie_tax_unit: members: [at_tie] @@ -559,62 +624,89 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_000 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 1500.0 second_spouse_at: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_000 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 1500.0 first_spouse_above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_001 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 1500.5 second_spouse_above: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_countable_resources: 3_001 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_countable_resources: 1500.5 tax_units: couple_at_tax_unit: - members: [first_spouse_at, second_spouse_at] + members: + - first_spouse_at + - second_spouse_at couple_above_tax_unit: - members: [first_spouse_above, second_spouse_above] + members: + - first_spouse_above + - second_spouse_above families: couple_at_family: - members: [first_spouse_at, second_spouse_at] + members: + - first_spouse_at + - second_spouse_at couple_above_family: - members: [first_spouse_above, second_spouse_above] + members: + - first_spouse_above + - second_spouse_above spm_units: couple_at_spm_unit: - members: [first_spouse_at, second_spouse_at] + members: + - first_spouse_at + - second_spouse_at couple_above_spm_unit: - members: [first_spouse_above, second_spouse_above] + members: + - first_spouse_above + - second_spouse_above marital_units: couple_at_marital_unit: - members: [first_spouse_at, second_spouse_at] + members: + - first_spouse_at + - second_spouse_at couple_above_marital_unit: - members: [first_spouse_above, second_spouse_above] + members: + - first_spouse_above + - second_spouse_above households: couple_at_household: - members: [first_spouse_at, second_spouse_at] + members: + - first_spouse_at + - second_spouse_at state_code: 2026: TX couple_above_household: - members: [first_spouse_above, second_spouse_above] + members: + - first_spouse_above + - second_spouse_above state_code: 2026: TX output: medicaid_ltss_financial_pathway: - [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] - medicaid_ltss_csra_resource_eligible: [true, true, false, false] + - SPECIAL_INCOME + - SPECIAL_INCOME + - SPECIAL_INCOME + - SPECIAL_INCOME + medicaid_ltss_csra_resource_eligible: + - true + - true + - false + - false - name: Case 13, the federal minimum governs over the Delaware state spousal share. period: 2026-07 @@ -625,28 +717,49 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 32_532 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50000 + medicaid_ltss_individual_countable_resources: 2000 above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 32_533 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 50000 + medicaid_ltss_individual_countable_resources: 2000 + at_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 32532 + above_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 32533 households: household: - members: [at_allowance, above_allowance] + members: + - at_allowance + - above_allowance + - at_allowance_spouse + - above_allowance_spouse state_code: 2026: DE + marital_units: + at_allowance: + members: + - at_allowance + - at_allowance_spouse + above_allowance: + members: + - above_allowance + - above_allowance_spouse output: - medicaid_ltss_csra_resource_eligible: [true, false] + medicaid_ltss_csra_resource_eligible: + - true + - false + - false + - false - name: Case 14, half of snapshot resources governs between the Delaware CSRA bounds. period: 2026-07 @@ -657,28 +770,49 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 50_000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 50_001 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 + at_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 50000 + above_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 50001 households: household: - members: [at_allowance, above_allowance] + members: + - at_allowance + - above_allowance + - at_allowance_spouse + - above_allowance_spouse state_code: 2026: DE + marital_units: + at_allowance: + members: + - at_allowance + - at_allowance_spouse + above_allowance: + members: + - above_allowance + - above_allowance_spouse output: - medicaid_ltss_csra_resource_eligible: [true, false] + medicaid_ltss_csra_resource_eligible: + - true + - false + - false + - false - name: Case 15, the federal CSRA maximum caps the Delaware allowance. period: 2026-07 @@ -689,28 +823,49 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_660 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400000 + medicaid_ltss_individual_countable_resources: 2000 above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_661 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400000 + medicaid_ltss_individual_countable_resources: 2000 + at_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 162660 + above_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 162661 households: household: - members: [at_allowance, above_allowance] + members: + - at_allowance + - above_allowance + - at_allowance_spouse + - above_allowance_spouse state_code: 2026: DE + marital_units: + at_allowance: + members: + - at_allowance + - at_allowance_spouse + above_allowance: + members: + - above_allowance + - above_allowance_spouse output: - medicaid_ltss_csra_resource_eligible: [true, false] + medicaid_ltss_csra_resource_eligible: + - true + - false + - false + - false - name: Case 16, the Washington state spousal resource standard binds above half of snapshot resources. period: 2026-07 @@ -721,21 +876,21 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_529 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_529 above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_530 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_530 households: household: members: [at_allowance, above_allowance] @@ -753,21 +908,21 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 200_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 100_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 100_000 above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 200_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 100_001 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 100_001 households: household: members: [at_allowance, above_allowance] @@ -785,21 +940,21 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_660 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 162_660 above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 162_661 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 162_661 households: household: members: [at_allowance, above_allowance] @@ -811,110 +966,222 @@ - name: Case 19, continuing Delaware eligibility ignores community spouse resources above the initial allowance. period: 2026-07 input: - state_code: - 2026: DE - medicaid_ltss_setting: INSTITUTIONAL - is_ssi_aged_blind_disabled: - 2026: true - medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_has_community_spouse: true - medicaid_ltss_is_initial_eligibility_determination: false - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 60_000 + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 + applicant_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 60000 + households: + household: + members: + - applicant + - applicant_spouse + state_code: + 2026: DE + marital_units: + applicant: + members: + - applicant + - applicant_spouse output: - medicaid_ltss_csra_resource_eligible: true + medicaid_ltss_csra_resource_eligible: + - true + - false - name: Case 20, continuing Delaware eligibility cannot shelter excess applicant resources in an unused CSRA. period: 2026-07 input: - state_code: - 2026: DE - medicaid_ltss_setting: INSTITUTIONAL - is_ssi_aged_blind_disabled: - 2026: true - medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_has_community_spouse: true - medicaid_ltss_is_initial_eligibility_determination: false - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_001 - medicaid_ltss_community_spouse_countable_resources: 0 + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2001 + applicant_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 0 + households: + household: + members: + - applicant + - applicant_spouse + state_code: + 2026: DE + marital_units: + applicant: + members: + - applicant + - applicant_spouse output: - medicaid_ltss_csra_resource_eligible: false + medicaid_ltss_csra_resource_eligible: + - false + - false - name: Case 21, explicit initial Delaware eligibility tests combined current resources after CSRA. period: 2026-07 input: people: - spouse_resources_above_allowance: &initial_applicant + spouse_resources_above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 60_000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 resources_available_for_transfer: - <<: *initial_applicant - medicaid_ltss_countable_resources: 2_001 - medicaid_ltss_community_spouse_countable_resources: 0 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2001 + spouse_resources_above_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 60000 + resources_available_for_transfer_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 0 households: household: - members: [spouse_resources_above_allowance, resources_available_for_transfer] + members: + - spouse_resources_above_allowance + - resources_available_for_transfer + - spouse_resources_above_allowance_spouse + - resources_available_for_transfer_spouse state_code: 2026: DE + marital_units: + spouse_resources_above_allowance: + members: + - spouse_resources_above_allowance + - spouse_resources_above_allowance_spouse + resources_available_for_transfer: + members: + - resources_available_for_transfer + - resources_available_for_transfer_spouse output: - medicaid_ltss_csra_resource_eligible: [false, true] + medicaid_ltss_csra_resource_eligible: + - false + - true + - false + - false - name: Case 22, an omitted determination input preserves initial Delaware resource treatment. period: 2026-07 input: people: - spouse_resources_above_allowance: &default_initial_applicant + spouse_resources_above_allowance: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 60_000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 resources_available_for_transfer: - <<: *default_initial_applicant - medicaid_ltss_countable_resources: 2_001 - medicaid_ltss_community_spouse_countable_resources: 0 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2001 + spouse_resources_above_allowance_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 60000 + resources_available_for_transfer_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 0 households: household: - members: [spouse_resources_above_allowance, resources_available_for_transfer] + members: + - spouse_resources_above_allowance + - resources_available_for_transfer + - spouse_resources_above_allowance_spouse + - resources_available_for_transfer_spouse state_code: 2026: DE + marital_units: + spouse_resources_above_allowance: + members: + - spouse_resources_above_allowance + - spouse_resources_above_allowance_spouse + resources_available_for_transfer: + members: + - resources_available_for_transfer + - resources_available_for_transfer_spouse output: - medicaid_ltss_is_initial_eligibility_determination: [true, true] - medicaid_ltss_csra_resource_eligible: [false, true] + medicaid_ltss_is_initial_eligibility_determination: + - true + - true + - true + - true + medicaid_ltss_csra_resource_eligible: + - false + - true + - false + - false - name: Case 23, continuing community spouse eligibility still rejects a couple assistance unit. period: 2026-07 input: - state_code: - 2026: DE - medicaid_ltss_setting: INSTITUTIONAL - is_ssi_aged_blind_disabled: - 2026: true - medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 - medicaid_ltss_has_community_spouse: true - medicaid_ltss_is_initial_eligibility_determination: false - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_001 - medicaid_ltss_community_spouse_countable_resources: 0 + people: + applicant: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2001 + spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_individual_countable_resources: 0 + households: + household: + members: + - applicant + - spouse + state_code: + 2026: DE + marital_units: + couple: + members: + - applicant + - spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true output: - medicaid_ltss_csra_resource_eligible: false + medicaid_ltss_assistance_unit_size: + - 2 + - 2 + medicaid_ltss_csra_resource_eligible: + - false + - true - name: Case 24, Washington re-entry uses the July 2026 snapshot after a qualifying break. period: 2026-09 @@ -925,7 +1192,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true # First episode in 2024; a break of at least 30 consecutive days precedes @@ -934,8 +1201,8 @@ wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 # By the September initial determination, lawful depletion leaves these # current resources. The new period's CSRA is capped at $162,660. - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 98_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 output: medicaid_ltss_csra_resource_eligible: true @@ -948,15 +1215,15 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true # Same 2024 first episode and July 2026 re-entry as Case 24, with fewer # community-spouse resources at the September determination. medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_529 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_529 output: medicaid_ltss_csra_resource_eligible: true @@ -964,52 +1231,134 @@ period: 2026-09 input: people: - at_wa_floor: &wa_reentry_applicant + at_wa_floor: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true - # A smaller snapshot after a qualifying break must also replace - # the earlier snapshot, rather than preserve its larger allowance. - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 - wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 72_529 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72529 above_wa_floor: - <<: *wa_reentry_applicant - medicaid_ltss_community_spouse_countable_resources: 72_530 - at_tx_half: &first_period_applicant - <<: *wa_reentry_applicant - # TX/DE keep the first-period snapshot even if a newer one differs. - medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 - wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 - medicaid_ltss_community_spouse_countable_resources: 50_000 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 72530 + at_tx_half: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 50000 above_tx_half: - <<: *first_period_applicant - medicaid_ltss_community_spouse_countable_resources: 50_001 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 50001 at_de_half: - <<: *first_period_applicant + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400000 + medicaid_ltss_individual_countable_resources: 2000 above_de_half: - <<: *first_period_applicant - medicaid_ltss_community_spouse_countable_resources: 50_001 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400000 + medicaid_ltss_individual_countable_resources: 2000 + at_de_half_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 50000 + above_de_half_spouse: + is_ssi_aged_blind_disabled: + '2026': false + medicaid_ltss_individual_countable_resources: 50001 households: wa_household: - members: [at_wa_floor, above_wa_floor] + members: + - at_wa_floor + - above_wa_floor state_code: 2026: WA tx_household: - members: [at_tx_half, above_tx_half] + members: + - at_tx_half + - above_tx_half state_code: 2026: TX de_household: - members: [at_de_half, above_de_half] + members: + - at_de_half + - above_de_half + - at_de_half_spouse + - above_de_half_spouse state_code: 2026: DE + marital_units: + at_wa_floor: + members: + - at_wa_floor + above_wa_floor: + members: + - above_wa_floor + at_tx_half: + members: + - at_tx_half + above_tx_half: + members: + - above_tx_half + at_de_half: + members: + - at_de_half + - at_de_half_spouse + above_de_half: + members: + - above_de_half + - above_de_half_spouse output: - medicaid_ltss_csra_resource_eligible: [true, false, true, false, true, false] + medicaid_ltss_csra_resource_eligible: + - true + - false + - true + - false + - true + - false + - false + - false - name: Case 27, Washington continuous July 2003 period receives the federal maximum at a September 2026 initial application. period: 2026-09 @@ -1019,14 +1368,14 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 - medicaid_ltss_countable_resources: 2_000 - medicaid_ltss_community_spouse_countable_resources: 98_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 output: medicaid_ltss_csra: 162_660 medicaid_ltss_csra_resource_eligible: true @@ -1039,38 +1388,38 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 wa_medicaid_ltss_most_recent_institutionalization_start_month: 8 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 - medicaid_ltss_countable_resources: 2000 - medicaid_ltss_community_spouse_countable_resources: 98000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 applicant_2: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 - medicaid_ltss_countable_resources: 2000 - medicaid_ltss_community_spouse_countable_resources: 98000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 applicant_3: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 10 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 - medicaid_ltss_countable_resources: 2000 - medicaid_ltss_community_spouse_countable_resources: 98000 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 marital_units: applicant_1: members: @@ -1107,13 +1456,13 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 - medicaid_ltss_countable_resources: 10000 - medicaid_ltss_community_spouse_countable_resources: 900000 + medicaid_ltss_individual_countable_resources: 10000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 900000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 wa_medicaid_ltss_solely_owned_countable_resources: 4000 wa_medicaid_ltss_jointly_owned_countable_resources: 0 @@ -1121,13 +1470,13 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: false wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 - medicaid_ltss_countable_resources: 10000 - medicaid_ltss_community_spouse_countable_resources: 900000 + medicaid_ltss_individual_countable_resources: 10000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 900000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 wa_medicaid_ltss_solely_owned_countable_resources: 4001 wa_medicaid_ltss_jointly_owned_countable_resources: 0 @@ -1135,13 +1484,13 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 - medicaid_ltss_countable_resources: 10000 - medicaid_ltss_community_spouse_countable_resources: 900000 + medicaid_ltss_individual_countable_resources: 10000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 900000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 wa_medicaid_ltss_solely_owned_countable_resources: 0 wa_medicaid_ltss_jointly_owned_countable_resources: 4000 @@ -1149,13 +1498,13 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: false wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 - medicaid_ltss_countable_resources: 10000 - medicaid_ltss_community_spouse_countable_resources: 900000 + medicaid_ltss_individual_countable_resources: 10000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 900000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 wa_medicaid_ltss_solely_owned_countable_resources: 0 wa_medicaid_ltss_jointly_owned_countable_resources: 4001 @@ -1163,13 +1512,13 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 - medicaid_ltss_countable_resources: 10000 - medicaid_ltss_community_spouse_countable_resources: 900000 + medicaid_ltss_individual_countable_resources: 10000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 900000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 wa_medicaid_ltss_solely_owned_countable_resources: 2000 wa_medicaid_ltss_jointly_owned_countable_resources: 2000 @@ -1177,13 +1526,13 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_is_initial_eligibility_determination: false wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 - medicaid_ltss_countable_resources: 10000 - medicaid_ltss_community_spouse_countable_resources: 900000 + medicaid_ltss_individual_countable_resources: 10000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 900000 wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 1000000 wa_medicaid_ltss_solely_owned_countable_resources: 2000 wa_medicaid_ltss_jointly_owned_countable_resources: 2001 @@ -1235,7 +1584,7 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 wa_medicaid_ltss_most_recent_institutionalization_start_month: 0 @@ -1243,7 +1592,7 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2003 wa_medicaid_ltss_most_recent_institutionalization_start_month: 13 @@ -1251,7 +1600,7 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 0 wa_medicaid_ltss_most_recent_institutionalization_start_month: 8 @@ -1259,7 +1608,7 @@ medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true wa_medicaid_ltss_most_recent_institutionalization_start_year: 2027 wa_medicaid_ltss_most_recent_institutionalization_start_month: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index a93db8ddd1d..338b0575080 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -7,7 +7,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: SPECIAL_INCOME @@ -20,7 +20,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + output: medicaid_ltss_financial_pathway: SPECIAL_INCOME @@ -33,8 +33,8 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_982 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_982 output: medicaid_ltss_financial_pathway: SPECIAL_INCOME @@ -47,8 +47,8 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_983 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_983 output: medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY @@ -61,8 +61,8 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_982 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_982 output: medicaid_ltss_financial_pathway: SPECIAL_INCOME @@ -75,15 +75,15 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_NEW_FREEDOM - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 2_982 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2_982 rsw_applicant: medicaid_ltss_setting: HCBS is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_RSW - medicaid_ltss_assistance_unit_size: 1 - medicaid_ltss_qit_adjusted_income: 4_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 4_000 medicaid_ltss_medically_needy_expenses: 500 medicaid_ltss_cost_of_care: 2_506 families: @@ -130,7 +130,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: UNKNOWN - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_income_eligible: false @@ -148,7 +148,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false @@ -162,7 +162,7 @@ is_ssi_aged_blind_disabled: 2026: false medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false @@ -176,7 +176,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED @@ -189,7 +189,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_financial_threshold_eligible: false @@ -203,7 +203,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 0 + medicaid_ltss_non_delaware_assistance_unit_size: 0 output: medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_income_eligible: false @@ -217,26 +217,38 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 2 hcbs_named_waiver: medicaid_ltss_setting: HCBS is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 hcbs_no_waiver: medicaid_ltss_setting: HCBS is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + institutional_couple_spouse: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 0 households: household: - members: [institutional_couple, hcbs_named_waiver, hcbs_no_waiver] + members: [institutional_couple, hcbs_named_waiver, hcbs_no_waiver, institutional_couple_spouse] state_code: 2026: DE + marital_units: + institutional_couple: + members: [institutional_couple, institutional_couple_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + hcbs_named_waiver: + members: [hcbs_named_waiver] + hcbs_no_waiver: + members: [hcbs_no_waiver] output: - medicaid_ltss_financial_pathway: [SPECIAL_INCOME, UNMODELED, UNMODELED] + medicaid_ltss_financial_pathway: [SPECIAL_INCOME, UNMODELED, UNMODELED, SPECIAL_INCOME] - name: Case 14, assistance-unit sizes above two or below zero are unmodeled. period: 2026-07 @@ -247,13 +259,13 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 3 + medicaid_ltss_non_delaware_assistance_unit_size: 3 negative_unit: medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: -1 + medicaid_ltss_non_delaware_assistance_unit_size: -1 households: household: members: [three_person_unit, negative_unit] @@ -272,13 +284,13 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_COPES - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 new_freedom: medicaid_ltss_setting: HCBS is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: WA_NEW_FREEDOM - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 households: household: members: [copes, new_freedom] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml index 980bdd0fe45..a947a0b1ccd 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml @@ -4,7 +4,6 @@ people: million_first: &million_owner medicaid_ltss_setting: INSTITUTIONAL - medicaid_ltss_assistance_unit_size: 2 medicaid_ltss_home_market_value: 1_000_000 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 0.5 @@ -23,10 +22,13 @@ marital_units: million_couple: members: [million_first, million_second] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true boundary_couple: members: [boundary_first, boundary_second] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true third_party_couple: members: [third_party_first, third_party_second] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true households: delaware: members: [million_first, million_second, boundary_first, boundary_second, @@ -43,7 +45,6 @@ people: first: &individual_owner medicaid_ltss_setting: INSTITUTIONAL - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_000_000 medicaid_ltss_home_ownership_share: 0.5 second: *individual_owner @@ -66,7 +67,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 751_999 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -75,7 +76,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_000 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -84,7 +85,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -141,7 +142,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_129_999 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -150,7 +151,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_130_000 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -159,7 +160,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 1_130_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -216,7 +217,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -233,7 +234,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -250,7 +251,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -267,7 +268,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -284,7 +285,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 751_999 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -293,7 +293,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_000 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -302,7 +301,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -361,7 +359,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -466,7 +463,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 0 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -475,7 +472,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_000 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 @@ -484,7 +481,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_home_market_value: 752_001 medicaid_ltss_home_encumbrances: 0 medicaid_ltss_home_ownership_share: 1 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml index 26b0c5b2e57..28078b98b30 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -8,7 +8,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 0 at_shelter_threshold: @@ -16,7 +16,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 811.5 high_shelter: @@ -24,7 +24,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 2_173 tax_units: @@ -74,7 +74,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 0 shelter_threshold: @@ -82,7 +81,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 811.5 maximum: @@ -90,7 +88,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 2_173 tax_units: @@ -140,7 +137,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 1_811.5 cent_below_threshold: @@ -148,7 +145,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 811.49 tax_units: @@ -189,7 +186,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: false medicaid_ltss_community_spouse_shelter_expenses: 2_000 output: @@ -205,7 +201,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 2_000 output: @@ -222,7 +218,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 1_000 delaware_spouse: @@ -230,7 +226,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 1_000 tax_units: @@ -270,7 +265,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 3_000 delaware_cent_above_cap: @@ -278,7 +272,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 2_173.01 texas_no_spouse: @@ -286,7 +279,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: false medicaid_ltss_community_spouse_shelter_expenses: 2_000 washington_no_spouse: @@ -294,7 +287,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: false medicaid_ltss_community_spouse_shelter_expenses: 2_000 households: @@ -323,7 +316,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 0 delaware_base: @@ -331,7 +324,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 0 washington_excess_shelter: @@ -339,7 +331,7 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 1_000 households: @@ -369,7 +361,6 @@ is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_waiver: NONE - medicaid_ltss_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 1_000 households: diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml index b6423607c31..7238cc75976 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml @@ -3,19 +3,20 @@ input: people: texas_individual: - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 texas_couple: - medicaid_ltss_assistance_unit_size: 2 - delaware_individual: - medicaid_ltss_assistance_unit_size: 1 - delaware_couple: - medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + delaware_individual: {} + delaware_couple: {} washington_individual: - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 washington_couple: - medicaid_ltss_assistance_unit_size: 2 + medicaid_ltss_non_delaware_assistance_unit_size: 2 california_individual: - medicaid_ltss_assistance_unit_size: 1 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + delaware_couple_spouse: + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 0 households: texas_individual_household: members: [texas_individual] @@ -30,7 +31,7 @@ state_code: 2026: DE delaware_couple_household: - members: [delaware_couple] + members: [delaware_couple, delaware_couple_spouse] state_code: 2026: DE washington_individual_household: @@ -45,18 +46,34 @@ members: [california_individual] state_code: 2026: CA + marital_units: + texas_individual: + members: [texas_individual] + texas_couple: + members: [texas_couple] + delaware_individual: + members: [delaware_individual] + delaware_couple: + members: [delaware_couple, delaware_couple_spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + washington_individual: + members: [washington_individual] + washington_couple: + members: [washington_couple] + california_individual: + members: [california_individual] output: # 300% of $994, twice that for a Texas couple, 250% of $994 and $1,491 in Delaware. - medicaid_ltss_special_income_limit: [2_982, 5_964, 2_485, 3_727.5, 2_982, 0, 0] + medicaid_ltss_special_income_limit: [2_982, 5_964, 2_485, 3_727.5, 2_982, 0, 0, 3727.5] - name: Case 2, the special income limit is zero outside the modeled assistance-unit sizes. period: 2026-07 input: people: no_unit: - medicaid_ltss_assistance_unit_size: 0 + medicaid_ltss_non_delaware_assistance_unit_size: 0 three_person_unit: - medicaid_ltss_assistance_unit_size: 3 + medicaid_ltss_non_delaware_assistance_unit_size: 3 households: household: members: [no_unit, three_person_unit] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py index 97d70146292..dc3882451e9 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -8,7 +8,8 @@ class is_medicaid_ltss_income_eligible(Variable): definition_period = MONTH documentation = ( "Tests only the income threshold for the selected modeled Medicaid " - "LTSS financial pathway. QIT-adjusted income and Washington medically " + "LTSS financial pathway. Gross earned and unearned income and QIT " + "deposits determine income after trust treatment; Washington medically " "needy expenses and cost of care are trusted inputs; this variable " "does not validate a trust, expense, service, or facility rate. The " "Washington institutional branch models the WAC 182-513-1395(4) " @@ -22,14 +23,13 @@ class is_medicaid_ltss_income_eligible(Variable): "applies only to nursing facility residents (DSSM 20100.2.2); " "Delaware's 100%-of-SSI standard for hospital stays is unmodeled, " "so the institutional setting should not be used for a hospitalized " - "Delaware applicant. Delaware's $20 disregard, with the needs-based " - "carve-out and one disregard per couple, follows DSSM 20240.1 and " - "20990; it is skipped when " - "medicaid_ltss_income_disregards_already_applied marks the income " - "input as final countable income, which earned income of an " - "applicant without a community spouse requires because DSSM 20240.3 " - "deducts the $20 before the $65 and one-half earned-income " - "disregards." + "Delaware applicant. Delaware computes the $20 general exclusion " + "from non-needs-based unearned income first, carries any unused " + "part to earnings, " + "deducts $65, and counts half the earnings remainder (DSSM " + "20240.1 and 20240.3). There is one exclusion per couple budget. " + "Applicants with a community spouse receive only the eligible " + "$20 deduction (DSSM 20990)." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.236", @@ -37,6 +37,7 @@ class is_medicaid_ltss_income_eligible(Variable): "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", ) @@ -55,21 +56,8 @@ def formula_2026_01_01(person, period, parameters): # keeps an unmodeled person from passing with zero income. special_income_limit = person("medicaid_ltss_special_income_limit", period) - needs_based_income = person("medicaid_ltss_needs_based_income", period) - non_needs_based_income = max_(income - needs_based_income, 0) - delaware_disregard = min_( - non_needs_based_income, - p.de.income.general_disregard, - ) - disregards_already_applied = person( - "medicaid_ltss_income_disregards_already_applied", period - ) - income_after_disregard = where( - (state == states.DE) & ~disregards_already_applied, - max_(income - delaware_disregard, 0), - income, - ) - special_income_eligible = income_after_disregard <= special_income_limit + countable_income = person("medicaid_ltss_countable_income", period) + special_income_eligible = countable_income <= special_income_limit medically_needy_expenses = person( "medicaid_ltss_medically_needy_expenses", period diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py index 18d49903daa..a9bf26a0cf5 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -8,28 +8,75 @@ class medicaid_ltss_assistance_unit_size(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Explicit size of the assistance unit used by the Medicaid LTSS " - "financial threshold screen. It is not inferred from a tax unit, " - "household, or marital unit. Use 2 only when the state budgets " - "both spouses as a couple: in Texas, spouses in the same " - "institutional setting (MEPD G-6120; 1 TAC 358.436); in Delaware, " - "spouses requesting or receiving institutional services in the " - "same facility must use couple budgeting until they have both " - "resided there for six months, after which they may choose couple " - "or individual budgeting in their best interests (DSSM 20810). " - "Delaware also uses couple standards when both spouses request or " - "receive HCBS at the same address. Otherwise, including an applicant " - "with a community spouse, use 1. At size 2, each spouse's income " - "and resource inputs carry the couple's combined totals, which are " - "compared with the couple limits. Delaware's home-equity screen " - "combines the spouses' ownership interests independently of this " - "budgeting unit (DSSM 20320.7.C). Zero and unsupported sizes are " - "fail-closed." + "Delaware's assistance unit is derived from the spouses' service " + "requests or receipt, location, and completed months together in " + "the same institutional facility (DSSM 20810). A two-person marital " + "unit requesting or receiving services in the same facility must " + "use couple budgeting until six completed months there; at six " + "months the model elects whichever budget allows more spouses to " + "pass both income and resource thresholds, choosing individual " + "budgets in a tie. Both spouses receive the same election. HCBS " + "spouses requesting or receiving services at the same address use " + "couple standards without a six-month election. Other Delaware " + "applicants use an individual budget. This derives the budgeting " + "unit independently of whether a financial pathway is modeled. " + "Outside Delaware, supply the separate " + "medicaid_ltss_non_delaware_assistance_unit_size input: use two only " + "where both spouses are budgeted as a couple, including Texas " + "spouses in the same institutional setting, and one for an " + "individual applicant. The outside-Delaware default zero and " + "unsupported sizes fail closed. Income and resources are supplied " + "for each person and combined internally for a couple budget." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.602", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/g-6100-institutional-eligibility-budgets", "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-436", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=17", ) + + def formula_2026_01_01(person, period, parameters): + state = person.household("state_code", period) + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + fbr = parameters(period).gov.ssa.ssi.amount + resources_limit = parameters(period).gov.ssa.ssi.eligibility.resources.limit + + is_couple = person.marital_unit.nb_persons() == 2 + same_facility = is_couple & person.marital_unit( + "medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility", + period, + ) + months_together = person.marital_unit( + "medicaid_ltss_spouses_months_in_same_institutional_facility", period + ) + same_address_hcbs = is_couple & person.marital_unit( + "medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address", + period, + ) + + # The election compares both candidate budgets without reading any + # output dependent on the elected unit, avoiding a calculation cycle. + individual_resources = person( + "medicaid_ltss_individual_countable_resources", period + ) + individual_income = person("medicaid_ltss_individual_countable_income", period) + individual_passes = ( + individual_income <= p.de.special_income_limit.rate * fbr.individual + ) & (individual_resources <= resources_limit.individual) + individual_eligible_spouses = person.marital_unit.sum(individual_passes) + couple_income = person("medicaid_ltss_couple_countable_income", period) + couple_resources = person.marital_unit.sum(individual_resources) + couple_passes = ( + couple_income <= p.de.special_income_limit.rate * fbr.couple + ) & (couple_resources <= resources_limit.couple) + couple_eligible_spouses = 2 * couple_passes + favorable_couple_budget = couple_eligible_spouses > individual_eligible_spouses + institutional_couple = same_facility & ( + (months_together < 6) | favorable_couple_budget + ) + delaware_unit = where(same_address_hcbs | institutional_couple, 2, 1) + return where( + state == state.possible_values.DE, + delaware_unit, + person("medicaid_ltss_non_delaware_assistance_unit_size", period), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py index 28f32bbc041..db8242cf905 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py @@ -10,9 +10,15 @@ class medicaid_ltss_community_spouse_countable_resources(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Trusted current comprehensive LTSS countable resources allocated to " - "the community spouse after applicable ownership and exclusion " - "rules. Combined with applicant resources only for an initial " + "Delaware derives the community spouse's own current countable " + "resources from the other person's resource inventory within their " + "two-person marital unit. Supply each spouse's own " + "medicaid_ltss_individual_countable_resources rather than a " + "pre-attributed community-spouse total. Outside Delaware it reads " + "medicaid_ltss_non_delaware_community_spouse_countable_resources, " + "the spouse's own current comprehensive countable-resource " + "inventory after applicable ownership and exclusion rules. Combined " + "with applicant resources only for an initial " "eligibility determination. After the eligibility month in the same " "continuous LTSS period, these resources are not deemed available " "when medicaid_ltss_is_initial_eligibility_determination is false. " @@ -20,3 +26,20 @@ class medicaid_ltss_community_spouse_countable_resources(Variable): "determinations are not modeled." ) reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" + + def formula_2026_01_01(person, period, parameters): + state = person.household("state_code", period) + own_resources = person("medicaid_ltss_individual_countable_resources", period) + spouse_resources = person.marital_unit.sum(own_resources) - own_resources + has_spouse = person("medicaid_ltss_has_community_spouse", period) + delaware_resources = where( + has_spouse & (person.marital_unit.nb_persons() == 2), spouse_resources, 0 + ) + return where( + state == state.possible_values.DE, + delaware_resources, + person( + "medicaid_ltss_non_delaware_community_spouse_countable_resources", + period, + ), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_income.py new file mode 100644 index 00000000000..0a210eae21c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_income.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_countable_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS countable income" + unit = USD + definition_period = MONTH + documentation = ( + "Income for the selected individual or couple budget after " + "qualified income trust deposits and modeled state income " + "exclusions. Each spouse supplies their own gross source amounts; " + "the model computes the combined budget and its exclusions." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", + ) + + def formula_2026_01_01(person, period, parameters): + return where( + person("medicaid_ltss_assistance_unit_size", period) == 2, + person("medicaid_ltss_couple_countable_income", period), + person("medicaid_ltss_individual_countable_income", period), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py index 647e2f3fcac..4a3211e8d25 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py @@ -10,17 +10,22 @@ class medicaid_ltss_countable_resources(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Trusted comprehensive LTSS countable-resource input after " - "applicable state exclusions, disregards, and ownership rules. For " - "an assistance unit of one it is the applicant's resources; for an " - "assistance unit of two it is the couple's combined resources. When " - "the applicant has a community spouse, this input excludes resources " - "allocated to that spouse, which are supplied separately. It is not " - "calculated from PolicyEngine's narrower SSI asset inputs. The user " - "must perform the resource inventory and legal classification " - "before supplying this value." + "LTSS countable resources derived from each person's own resource " + "inventory. An individual budget uses the applicant's resources; " + "a couple budget combines both spouses' resources within their " + "marital unit. Community spouse allowances are applied by the " + "separate CSRA resource eligibility calculation." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.601", "https://www.law.cornell.edu/cfr/text/42/435.602", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", ) + + def formula_2026_01_01(person, period, parameters): + own_resources = person("medicaid_ltss_individual_countable_resources", period) + return where( + person("medicaid_ltss_assistance_unit_size", period) == 2, + person.marital_unit.sum(own_resources), + own_resources, + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py new file mode 100644 index 00000000000..355c851c3b9 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py @@ -0,0 +1,50 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_couple_countable_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS countable income under a couple budget" + unit = USD + definition_period = MONTH + documentation = ( + "Computes the spouses' combined income budget independently of " + "the assistance-unit election, returning the same combined amount " + "for each spouse. Delaware applies one $20 general exclusion to " + "the couple's non-needs-based unearned income first, then carries " + "the unused exclusion to combined earnings before deducting $65 " + "and counting half the earnings remainder (DSSM 20240.1 and " + "20240.3). Other modeled states use the combined income remaining " + "outside qualified income trusts without exclusions." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + earned = person.marital_unit.sum( + person("medicaid_ltss_qit_adjusted_earned_income", period) + ) + own_unearned = person("medicaid_ltss_qit_adjusted_unearned_income", period) + unearned = person.marital_unit.sum(own_unearned) + needs_based = person.marital_unit.sum( + person("medicaid_ltss_qit_adjusted_needs_based_income", period) + ) + unearned_disregard = min_( + max_(unearned - needs_based, 0), p.de.income.general_disregard + ) + unused_general_disregard = max_( + p.de.income.general_disregard - unearned_disregard, 0 + ) + countable_earned = ( + max_(earned - unused_general_disregard - p.de.income.earned_disregard, 0) + * p.de.income.earned_income_countable_rate + ) + delaware_budget = unearned - unearned_disregard + countable_earned + return where( + state == state.possible_values.DE, delaware_budget, earned + unearned + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index c1f267d7b48..084beee491b 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -7,7 +7,8 @@ class medicaid_ltss_csra_resource_eligible(Variable): label = "Meets modeled Medicaid LTSS resource threshold" definition_period = MONTH documentation = ( - "Tests trusted comprehensive LTSS countable-resource inputs. Texas " + "Tests comprehensive LTSS resources derived from each person's " + "own countable-resource inventory. Texas " "and Delaware use the SSI resource limits (1 TAC 358.323 and " "358.437; DSSM 20100.2.2 and 20300); Washington uses its own " "resource standard (WAC 182-513-1350). For an applicant with a " diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py new file mode 100644 index 00000000000..c90abc98ed1 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_earned_income_deposited_to_qit(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS earned income deposited to a qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Each person's own monthly earned income validly deposited into " + "a qualified income trust. Defaults to no deposits. The model " + "subtracts deposits from gross earned income without allowing a " + "negative remainder. Trust legality, irrevocability, funding, " + "payback terms, and the validity of a deposit are unmodeled." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py new file mode 100644 index 00000000000..fd9a165bbbf --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_gross_earned_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS gross monthly earned income" + unit = USD + definition_period = MONTH + documentation = ( + "Each person's own monthly work income before Medicaid LTSS income " + "exclusions or qualified income trust deposits. Defaults to one " + "twelfth of the existing gross SSI earned-income sources, which " + "include wages and self-employment income without SSI exclusions " + "or spousal deeming. A nonnegative " + "medicaid_ltss_reported_gross_earned_income supplies the actual " + "month's amount for that person, including work income outside " + "those sources. Unspecified people retain the annual-source " + "default independently of other people's monthly reports. Each " + "spouse reports their own income; the model combines it when " + "couple budgeting applies." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" + + def formula(person, period, parameters): + reported = person("medicaid_ltss_reported_gross_earned_income", period) + annual_default = max_(person("ssi_earned_income", period.this_year) / 12, 0) + return where(reported == -1, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py new file mode 100644 index 00000000000..485f71ce009 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_gross_unearned_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS gross monthly unearned income" + unit = USD + definition_period = MONTH + documentation = ( + "Each person's own monthly unearned income before Medicaid LTSS " + "income exclusions or qualified income trust deposits. Defaults " + "to one twelfth of the existing gross SSI unearned-income sources, " + "including pensions and Social Security, without SSI exclusions " + "or spousal deeming. A nonnegative " + "medicaid_ltss_reported_gross_unearned_income supplies the actual " + "month's amount for that person. Unspecified people retain the " + "annual-source default independently of other people's monthly " + "reports. Each spouse reports their own income; the model " + "combines it when couple budgeting applies." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" + + def formula(person, period, parameters): + reported = person("medicaid_ltss_reported_gross_unearned_income", period) + annual_default = max_(person("ssi_unearned_income", period.this_year) / 12, 0) + return where(reported == -1, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py deleted file mode 100644 index 6ee30e2beb1..00000000000 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_income_disregards_already_applied.py +++ /dev/null @@ -1,30 +0,0 @@ -from policyengine_us.model_api import * - - -class medicaid_ltss_income_disregards_already_applied(Variable): - value_type = bool - entity = Person - label = "Medicaid LTSS income input already reflects every income disregard" - definition_period = MONTH - default_value = False - documentation = ( - "Marks medicaid_ltss_qit_adjusted_income as the final countable " - "income after every Delaware income disregard, so the model applies " - "no further disregard. Delaware is the only modeled state with a " - "disregard before the special income limit test, so the flag has no " - "effect elsewhere. When false, the model treats the input as gross " - "income and subtracts the $20 general disregard from its " - "non-needs-based portion (DSSM 20240.1). That is correct for income " - "without earnings, and for any income of an applicant with a " - "community spouse, because DSSM 20990 makes the $20 disregard the " - "sole deduction for that applicant. Earned income of any other " - "applicant needs the final amount: DSSM 20240.3 deducts $20, then " - "$65, then one-half of the remaining gross earnings, and when there " - "is also unearned income the $20 applies to the unearned income " - "first, as the most advantageous order." - ) - reference = ( - "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", - ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py new file mode 100644 index 00000000000..c5e7c574834 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py @@ -0,0 +1,52 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_individual_countable_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS countable income under an individual budget" + unit = USD + definition_period = MONTH + documentation = ( + "Computes each person's individual income budget independently of " + "the assistance-unit election. Delaware applies the $20 general " + "exclusion to non-needs-based unearned income first, then carries " + "the unused exclusion to earnings before deducting $65 and " + "counting half the earnings remainder (DSSM 20240.1 and 20240.3). " + "Applicants with a community spouse receive only the eligible " + "$20 exclusion (DSSM 20990). Other modeled states use income " + "remaining outside the qualified income trust without exclusions." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", + ) + + def formula_2026_01_01(person, period, parameters): + p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + state = person.household("state_code", period) + earned = person("medicaid_ltss_qit_adjusted_earned_income", period) + unearned = person("medicaid_ltss_qit_adjusted_unearned_income", period) + needs_based = person("medicaid_ltss_qit_adjusted_needs_based_income", period) + unearned_disregard = min_( + max_(unearned - needs_based, 0), p.de.income.general_disregard + ) + unused_general_disregard = max_( + p.de.income.general_disregard - unearned_disregard, 0 + ) + countable_earned = ( + max_(earned - unused_general_disregard - p.de.income.earned_disregard, 0) + * p.de.income.earned_income_countable_rate + ) + ordinary_budget = unearned - unearned_disregard + countable_earned + gross = earned + unearned + community_spouse_budget = gross - min_( + max_(gross - needs_based, 0), p.de.income.general_disregard + ) + delaware_budget = where( + person("medicaid_ltss_has_community_spouse", period), + community_spouse_budget, + ordinary_budget, + ) + return where(state == state.possible_values.DE, delaware_budget, gross) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_resources.py new file mode 100644 index 00000000000..6a27640fe5c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_resources.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_individual_countable_resources(Variable): + value_type = float + entity = Person + label = "Individual Medicaid LTSS countable resources" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "The person's own comprehensive LTSS countable-resource inventory " + "after applicable asset exclusions and legal ownership attribution, " + "before assistance-unit aggregation or a community spouse resource " + "allowance. Each spouse supplies their own resources; the model " + "combines them when a couple budget applies. This is not calculated " + "from PolicyEngine's narrower SSI asset inputs. Resource inventory " + "and legal asset classification remain caller-supplied facts." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.601", + "https://www.law.cornell.edu/cfr/text/42/435.602", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py index 8401c7101a6..417015af49f 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py @@ -9,11 +9,15 @@ class medicaid_ltss_needs_based_income(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Trusted portion of QIT-adjusted income that comes from needs-based " - "sources. The Delaware general income disregard is not applied to " - "this portion. It has no effect when " - "medicaid_ltss_income_disregards_already_applied is true. The model " - "does not classify or allocate income sources." + "Each person's own gross monthly unearned income from needs-based " + "sources, before qualified income trust deposits. It is a subset " + "of medicaid_ltss_gross_unearned_income and defaults to zero. " + "The model subtracts the needs-based deposited source component " + "and combines spouses' remaining amounts when couple budgeting " + "applies. The Delaware general income exclusion does not reduce " + "the remaining needs-based income. The existing veterans_benefits " + "variable mixes needs-based pensions and other payments, so " + "it cannot determine this source classification." ) reference = ( "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income_deposited_to_qit.py new file mode 100644 index 00000000000..f8ecf56bd60 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income_deposited_to_qit.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_needs_based_income_deposited_to_qit(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS needs-based unearned income deposited to a qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Each person's own monthly needs-based unearned income validly " + "deposited into a qualified income trust. This source component " + "is part of medicaid_ltss_unearned_income_deposited_to_qit, rather " + "than an additional deposit. Defaults to zero. The model caps it " + "at both gross needs-based income and total unearned deposits " + "when computing the needs-based income remaining outside the " + "trust. Trust and deposit validity are unmodeled." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py new file mode 100644 index 00000000000..a01731f260b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_non_delaware_assistance_unit_size(Variable): + value_type = int + entity = Person + label = "Medicaid LTSS assistance unit size outside Delaware" + definition_period = MONTH + default_value = 0 + documentation = ( + "Explicit assistance-unit size for states outside Delaware. Use two " + "only where the state budgets both spouses as a couple, including " + "Texas spouses in the same institutional setting, and one for an " + "individual applicant. Zero and unsupported sizes fail closed. " + "Delaware ignores this input and derives the unit from the spouses' " + "service, location, and duration facts. A separate input preserves " + "Delaware derivation in mixed-state populations: providing values " + "for some people on a derived variable fills the other people's " + "entries with its default and overrides the formula for everyone." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/42/435.602", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/g-6100-institutional-eligibility-budgets", + "https://www.law.cornell.edu/regulations/texas/1-Tex-Admin-Code-SS-358-436", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py new file mode 100644 index 00000000000..94ac838f385 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_non_delaware_community_spouse_countable_resources(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS community spouse resources outside Delaware" + unit = USD + quantity_type = STOCK + definition_period = MONTH + default_value = 0 + documentation = ( + "The community spouse's own current comprehensive countable-resource " + "inventory for applicants outside Delaware, after applicable ownership " + "and exclusion rules. Delaware instead uses each spouse's own " + "medicaid_ltss_individual_countable_resources in their marital unit. " + "Keeping this input separate from the derived community-spouse " + "resource output permits mixed-state populations without overriding " + "Delaware's calculation." + ) + reference = "https://www.law.cornell.edu/uscode/text/42/1396r-5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py new file mode 100644 index 00000000000..48c46f38187 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_earned_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS earned income remaining outside a qualified income trust" + unit = USD + definition_period = MONTH + documentation = ( + "Each person's own gross earned income less their valid qualified " + "income trust deposits, before Medicaid LTSS income exclusions." + ) + reference = ( + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", + ) + + def formula(person, period, parameters): + income = max_(person("medicaid_ltss_gross_earned_income", period), 0) + deposits = max_( + person("medicaid_ltss_earned_income_deposited_to_qit", period), 0 + ) + return max_(income - deposits, 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py index eab065cbb1d..27b37da0b76 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py @@ -4,35 +4,32 @@ class medicaid_ltss_qit_adjusted_income(Variable): value_type = float entity = Person - label = "Medicaid LTSS QIT-adjusted income" + label = "Medicaid LTSS QIT-adjusted gross income" unit = USD definition_period = MONTH - default_value = 0 documentation = ( - "Trusted monthly countable income after any qualified income trust " - "treatment (TX MEPD F-6800; DSSM 20400.11). For an assistance unit " - "of one, including an applicant with a community spouse, it is the " - "applicant's own income after name-on-the-check and other " - "ownership rules attribute income between the spouses (DSSM " - "20990); for an assistance unit of two, it is the couple's combined " - "income. In Delaware, supply either gross income, from which the " - "model subtracts the $20 general disregard, or the final countable " - "income after every disregard with " - "medicaid_ltss_income_disregards_already_applied set to true. Gross " - "income works without earnings, or for an applicant with a community " - "spouse, whose sole deduction is the $20 (DSSM 20990). Other earned " - "income needs the final amount, because DSSM 20240.3 deducts the $20 " - "before the $65 and one-half earned-income disregards: gross " - "earnings of $5,057 count as (5,057 - 20 - 65) / 2 = $2,486, not " - "(5,057 - 65) / 2 - 20 = $2,476. The model does not validate trust " - "legality, irrevocability, funding, payback terms, or which income " - "was validly deposited. The user must perform those determinations " - "before supplying this value." + "Gross monthly income remaining outside qualified income trusts " + "before Medicaid LTSS income exclusions. The model subtracts each " + "person's earned and unearned trust deposits from their own gross " + "source components and combines the remaining income when the " + "derived assistance unit budgets both spouses as a couple. " + "Trust legality, irrevocability, funding, payback terms, and the " + "validity of deposits are unmodeled. Delaware income exclusions " + "are computed separately in medicaid_ltss_countable_income." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", ) + + def formula(person, period, parameters): + own_income = person( + "medicaid_ltss_qit_adjusted_earned_income", period + ) + person("medicaid_ltss_qit_adjusted_unearned_income", period) + return where( + person("medicaid_ltss_assistance_unit_size", period) == 2, + person.marital_unit.sum(own_income), + own_income, + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_needs_based_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_needs_based_income.py new file mode 100644 index 00000000000..33482d4c060 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_needs_based_income.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_needs_based_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS needs-based unearned income remaining outside a qualified income trust" + unit = USD + definition_period = MONTH + documentation = ( + "Computes each person's own needs-based unearned income outside " + "the qualified income trust from gross needs-based income and " + "its deposited source component. Deposited needs-based income " + "cannot exceed gross needs-based income or total unearned " + "deposits; the remaining needs-based amount cannot exceed " + "remaining unearned income. This preserves the general exclusion " + "carve-out when deposited source classifications are incomplete." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9" + + def formula(person, period, parameters): + gross_unearned = max_(person("medicaid_ltss_gross_unearned_income", period), 0) + gross_needs_based = min_( + max_(person("medicaid_ltss_needs_based_income", period), 0), gross_unearned + ) + unearned_deposits = min_( + max_(person("medicaid_ltss_unearned_income_deposited_to_qit", period), 0), + gross_unearned, + ) + needs_based_deposits = min_( + max_( + person("medicaid_ltss_needs_based_income_deposited_to_qit", period), 0 + ), + min_(gross_needs_based, unearned_deposits), + ) + return min_( + max_(gross_needs_based - needs_based_deposits, 0), + person("medicaid_ltss_qit_adjusted_unearned_income", period), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py new file mode 100644 index 00000000000..aa0947886bb --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_unearned_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS unearned income remaining outside a qualified income trust" + unit = USD + definition_period = MONTH + documentation = ( + "Each person's own gross unearned income less their valid qualified " + "income trust deposits, before Medicaid LTSS income exclusions." + ) + reference = ( + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", + ) + + def formula(person, period, parameters): + income = max_(person("medicaid_ltss_gross_unearned_income", period), 0) + deposits = max_( + person("medicaid_ltss_unearned_income_deposited_to_qit", period), 0 + ) + return max_(income - deposits, 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py new file mode 100644 index 00000000000..aaa066b4b1b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_reported_gross_earned_income(Variable): + value_type = float + entity = Person + label = "Reported Medicaid LTSS gross monthly earned income" + unit = USD + definition_period = MONTH + default_value = -1 + documentation = ( + "Each person's actual monthly work income before Medicaid LTSS " + "income exclusions or qualified income trust deposits. A " + "nonnegative amount, including zero, replaces the equal monthly " + "allocation of existing annual gross SSI earned-income sources. " + "The default -1 means unspecified and preserves that annual-source " + "default for this person, including when other people report " + "actual monthly amounts. Include work income outside those " + "existing sources when reporting the actual month's amount. Each " + "spouse reports their own income; the model combines it when " + "couple budgeting applies." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py new file mode 100644 index 00000000000..1ede106b76b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_reported_gross_unearned_income(Variable): + value_type = float + entity = Person + label = "Reported Medicaid LTSS gross monthly unearned income" + unit = USD + definition_period = MONTH + default_value = -1 + documentation = ( + "Each person's actual monthly unearned income before Medicaid " + "LTSS income exclusions or qualified income trust deposits. A " + "nonnegative amount, including zero, replaces the equal monthly " + "allocation of existing annual gross SSI unearned-income sources. " + "The default -1 means unspecified and preserves that annual-source " + "default for this person, including when other people report " + "actual monthly amounts. Each spouse reports their own income; " + "the model combines it when couple budgeting applies." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_months_in_same_institutional_facility.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_months_in_same_institutional_facility.py new file mode 100644 index 00000000000..51fa6051464 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_months_in_same_institutional_facility.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_spouses_months_in_same_institutional_facility(Variable): + value_type = int + entity = MaritalUnit + label = ( + "Completed months both spouses have resided in the same institutional facility" + ) + definition_period = MONTH + default_value = 0 + documentation = ( + "Number of completed months both spouses have resided together in " + "the same institutional facility. Delaware DSSM 20810 permits the " + "couple to elect individual budgeting after six months. Defaults " + "to zero, treating an unspecified duration as before the election " + "is available. This input does not select the budgeting regime." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address.py new file mode 100644 index 00000000000..6a6b119e840 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address(Variable): + value_type = bool + entity = MaritalUnit + label = "Both spouses request or receive Medicaid LTSS HCBS at the same address" + definition_period = MONTH + default_value = False + documentation = ( + "Whether both spouses request or receive home and community-based " + "services and reside at the same address. This includes a current " + "recipient whose spouse requests HCBS. This is the service and " + "location fact used by Delaware DSSM 20810, independent of financial " + "pathway coverage or service eligibility. Defaults to false when " + "these facts are not supplied." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility.py new file mode 100644 index 00000000000..b130dbe591f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility( + Variable +): + value_type = bool + entity = MaritalUnit + label = "Both spouses request or receive Medicaid LTSS institutional services in the same facility" + definition_period = MONTH + default_value = False + documentation = ( + "Whether both spouses request or receive institutional services and " + "reside, or will reside, in the same facility. This includes a " + "current recipient whose spouse requests services at that facility. " + "It records the service and location facts used by Delaware DSSM " + "20810; it does not choose an assistance unit or establish service " + "eligibility. Defaults to false when these facts are not supplied." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py new file mode 100644 index 00000000000..d9b98d72836 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_unearned_income_deposited_to_qit(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS unearned income deposited to a qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Each person's own monthly unearned income validly deposited " + "into a qualified income trust. Defaults to no deposits. The " + "model subtracts deposits from gross unearned income without " + "allowing a negative remainder. Trust legality, irrevocability, " + "funding, payback terms, and the validity of a deposit are unmodeled." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=54", + ) From b25b44bb71efad54a6e904d9bc428cf14f5b44aa Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 12:45:45 -0400 Subject: [PATCH 22/34] Add LTSS income source facts and round-five regression cases --- .../is_medicaid_ltss_income_eligible.yaml | 131 ++++++++++++++++++ .../medicaid_ltss_financial_pathway.yaml | 21 +++ .../medicaid_ltss_dividend_income.py | 22 +++ ...d_ltss_impairment_related_work_expenses.py | 26 ++++ .../medicaid_ltss_interest_income.py | 20 +++ ...medicaid_ltss_qit_covered_earned_income.py | 20 +++ ...tss_qit_covered_earned_income_deposited.py | 20 +++ ...dicaid_ltss_qit_covered_unearned_income.py | 21 +++ ...s_qit_covered_unearned_income_deposited.py | 20 +++ .../medicaid_ltss_qit_opening_month.py | 17 +++ .../medicaid_ltss_qit_opening_year.py | 17 +++ ...s_qit_subsequent_full_deposits_verified.py | 19 +++ ...eived_disability_payments_before_age_65.py | 18 +++ .../medicaid_ltss_reported_dividend_income.py | 20 +++ .../medicaid_ltss_reported_interest_income.py | 20 +++ .../financial/medicaid_ltss_ssi_income.py | 19 +++ ...te_needs_based_public_assistance_income.py | 21 +++ 17 files changed, 452 insertions(+) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income_deposited.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income_deposited.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_month.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_year.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_received_disability_payments_before_age_65.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_ssi_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_state_needs_based_public_assistance_income.py diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 6ae6a77c259..a5db910a755 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -983,3 +983,134 @@ medicaid_ltss_countable_income: [2_485, 3_000, 3_000] is_medicaid_ltss_income_eligible: [true, false, false] is_medicaid_ltss_financial_threshold_eligible: [true, false, false] + +- name: Delaware deducts impairment-related work expenses before halving earnings + period: 2026-07 + input: + state_code: + 2026: DE + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + output: + # (5,455 - 20 - 65 - 400) / 2 = 2,485, exactly the SIL. + medicaid_ltss_individual_countable_income: 2485 + medicaid_ltss_countable_income: 2485 + is_medicaid_ltss_income_eligible: true + is_medicaid_ltss_financial_threshold_eligible: true + +- name: Delaware combines each disabled spouse's work expenses before halving + period: 2026-07 + input: + people: + applicant: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 3970 + medicaid_ltss_impairment_related_work_expenses: 200 + spouse: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 3970 + medicaid_ltss_impairment_related_work_expenses: 200 + marital_units: + couple: + members: [applicant, spouse] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 + households: + household: + members: [applicant, spouse] + state_code: + 2026: DE + output: + # (7,940 - 20 - 65 - 400) / 2 = 3,727.50, one set of exclusions. + medicaid_ltss_assistance_unit_size: [2, 2] + medicaid_ltss_couple_countable_income: [3727.5, 3727.5] + medicaid_ltss_countable_income: [3727.5, 3727.5] + is_medicaid_ltss_income_eligible: [true, true] + +- name: Texas QIT opening month excludes a covered pension despite a partial deposit + period: 2026-07 + input: + state_code: + 2026: TX + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_non_delaware_assistance_unit_size: 1 + taxable_pension_income: + 2026: 48000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + output: + medicaid_ltss_gross_unearned_income: 4000 + medicaid_ltss_qit_adjusted_unearned_income: 0 + medicaid_ltss_countable_income: 0 + is_medicaid_ltss_income_eligible: true + is_medicaid_ltss_financial_threshold_eligible: true + +- name: Texas QIT later month subtracts actual deposits rather than the whole source + period: 2026-08 + input: + state_code: + 2026: TX + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_non_delaware_assistance_unit_size: 1 + taxable_pension_income: + 2026: 48000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + output: + medicaid_ltss_qit_adjusted_unearned_income: 3500 + medicaid_ltss_countable_income: 3500 + is_medicaid_ltss_income_eligible: false + +- name: Texas QIT opening month also excludes a covered earnings source + period: 2026-07 + input: + state_code: + 2026: TX + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_non_delaware_assistance_unit_size: 1 + employment_income: + 2026: 48000 + medicaid_ltss_earned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_earned_income: 4000 + medicaid_ltss_qit_covered_earned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + output: + medicaid_ltss_gross_earned_income: 4000 + medicaid_ltss_qit_adjusted_earned_income: 0 + medicaid_ltss_countable_income: 0 + is_medicaid_ltss_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index 338b0575080..a1df17d8c55 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -298,3 +298,24 @@ 2026: WA output: medicaid_ltss_financial_pathway: [UNMODELED, SPECIAL_INCOME] + +- name: Case 16, Washington excludes interest before comparing income with the special income limit. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + pension_income: + 2026: 34_800 + taxable_interest_income: + 2026: 1_200 + output: + medicaid_ltss_gross_unearned_income: 3_000 + medicaid_ltss_countable_income: 2_900 + medicaid_ltss_special_income_limit: 2_982 + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py new file mode 100644 index 00000000000..9947c8b6913 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_dividend_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS monthly dividend income" + unit = USD + definition_period = MONTH + documentation = ( + "Each person's dividend income included in gross unearned income. " + "Defaults to annual ordinary_dividend_income divided by twelve, " + "unless that person reports actual monthly dividend receipts." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" + + def formula(person, period, parameters): + reported = person("medicaid_ltss_reported_dividend_income", period) + annual_default = max_( + person("ordinary_dividend_income", period.this_year) / 12, 0 + ) + return where(reported == -1, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py new file mode 100644 index 00000000000..a8093694905 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_impairment_related_work_expenses(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS qualifying impairment-related work expenses" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Expenses paid by this person for items or services necessary to " + "work because of an impairment, qualifying under 20 CFR 416.976. " + "Report reasonable, unreimbursed costs allocated to the month " + "under that section's payment and allocation rules, excluding " + "amounts already deducted as business expenses. This input " + "describes the qualifying costs; the model separately derives " + "the disability, blindness, and age conditions and applies the " + "exclusion in the income-budget sequence. Each spouse reports " + "their own expenses." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm", + "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py new file mode 100644 index 00000000000..dfce746282f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_interest_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS monthly interest income" + unit = USD + definition_period = MONTH + documentation = ( + "Each person's interest income included in gross unearned income. " + "Defaults to annual interest_income divided by twelve, unless " + "that person reports actual monthly interest receipts." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" + + def formula(person, period, parameters): + reported = person("medicaid_ltss_reported_interest_income", period) + annual_default = max_(person("interest_income", period.this_year) / 12, 0) + return where(reported == -1, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income.py new file mode 100644 index 00000000000..d79f34097f2 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_covered_earned_income(Variable): + value_type = float + entity = Person + label = "Monthly earned income from sources covered by the Medicaid LTSS qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Actual monthly earned income from the sources identified in the " + "qualified income trust instrument. This is a source amount before " + "deposits, and a subset of medicaid_ltss_gross_earned_income; it is " + "not a caller-computed exclusion. Texas can exclude these sources " + "in full in the opening month when a partial deposit was made and " + "subsequent full deposits were verified. Report the deposited " + "component separately in medicaid_ltss_qit_covered_earned_income_deposited." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income_deposited.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income_deposited.py new file mode 100644 index 00000000000..7b5e3d1687e --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_earned_income_deposited.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_covered_earned_income_deposited(Variable): + value_type = float + entity = Person + label = "Earned income deposited from sources covered by the Medicaid LTSS qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Actual monthly deposits of the earned sources identified in the " + "qualified income trust instrument. This factual source component " + "is a subset of both medicaid_ltss_qit_covered_earned_income and " + "medicaid_ltss_earned_income_deposited_to_qit. Reporting it separately " + "avoids excluding the same deposited income twice when the Texas " + "opening-month rule excludes the entire covered source. Defaults " + "to no reported covered-source deposits." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py new file mode 100644 index 00000000000..91b57cd5e9b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_covered_unearned_income(Variable): + value_type = float + entity = Person + label = "Monthly unearned income from sources covered by the Medicaid LTSS qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Actual monthly unearned income from the sources identified in the " + "qualified income trust instrument, such as the applicant's private " + "pension. This is a source amount before deposits, and a subset of " + "medicaid_ltss_gross_unearned_income; it is not a caller-computed " + "exclusion. Texas can exclude these sources in full in the opening " + "month when a partial deposit was made and subsequent full deposits " + "were verified. Report the deposited component separately in " + "medicaid_ltss_qit_covered_unearned_income_deposited." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income_deposited.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income_deposited.py new file mode 100644 index 00000000000..0e013c17325 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income_deposited.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_covered_unearned_income_deposited(Variable): + value_type = float + entity = Person + label = "Unearned income deposited from sources covered by the Medicaid LTSS qualified income trust" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Actual monthly deposits of the unearned sources identified in the " + "qualified income trust instrument. This factual source component " + "is a subset of both medicaid_ltss_qit_covered_unearned_income and " + "medicaid_ltss_unearned_income_deposited_to_qit. Reporting it separately " + "avoids excluding the same deposited income twice when the Texas " + "opening-month rule excludes the entire covered source. Defaults " + "to no reported covered-source deposits." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_month.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_month.py new file mode 100644 index 00000000000..f42071d9603 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_month.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_opening_month(Variable): + value_type = int + entity = Person + label = "Calendar month the Medicaid LTSS qualified income trust was opened" + definition_period = MONTH + default_value = 0 + documentation = ( + "Calendar month, from one through twelve, in which the qualified " + "income trust was established. Report this historical fact with " + "medicaid_ltss_qit_opening_year in each modeled month. The default " + "zero means that the opening date has not been reported. The model " + "derives whether the current month is the trust's opening month." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_year.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_year.py new file mode 100644 index 00000000000..8d1fbe81531 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_opening_year.py @@ -0,0 +1,17 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_opening_year(Variable): + value_type = int + entity = Person + label = "Calendar year the Medicaid LTSS qualified income trust was opened" + definition_period = MONTH + default_value = 0 + documentation = ( + "Calendar year in which the qualified income trust was established. " + "Report this historical fact with medicaid_ltss_qit_opening_month " + "in each modeled month. The default zero means that the opening " + "date has not been reported. Texas permits a verified partial " + "deposit to exclude the covered sources only in this opening month." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py new file mode 100644 index 00000000000..23c76b39147 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_subsequent_full_deposits_verified(Variable): + value_type = bool + entity = Person + label = "Subsequent full deposits of Medicaid LTSS qualified income trust covered sources have been verified" + definition_period = MONTH + default_value = False + documentation = ( + "Whether staff verified, before certification, that the entire " + "amounts of the income sources identified in the qualified income " + "trust are deposited in subsequent months. This is a verification " + "fact, not a caller-selected eligibility result. Texas requires " + "this verification for a partial opening-month deposit to exclude " + "the entire covered sources. Trust legality and the validity of " + "reported deposits remain outside this financial screen." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_received_disability_payments_before_age_65.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_received_disability_payments_before_age_65.py new file mode 100644 index 00000000000..7cceb7102ff --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_received_disability_payments_before_age_65.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_received_disability_payments_before_age_65(Variable): + value_type = bool + entity = Person + label = "Received qualifying disability payments before age 65" + definition_period = ETERNITY + default_value = False + documentation = ( + "Whether this person received SSI as a disabled individual, or " + "disability payments under a former State plan, for the month " + "before reaching age 65. This historical receipt fact preserves " + "eligibility for the impairment-related work expense exclusion " + "after age 65 under 20 CFR 416.1112(c)(6); it does not assert " + "current disability or that any particular expense qualifies." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py new file mode 100644 index 00000000000..e702ab7454f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_reported_dividend_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS reported monthly dividend income" + unit = USD + definition_period = MONTH + default_value = -1 + documentation = ( + "Each person's actual dividend receipts in the assessment month, " + "included in their reported gross unearned income. A nonnegative " + "amount replaces that person's annual-source default independently " + "of other people's reports. The -1 sentinel uses annual ordinary " + "dividend income divided by twelve. Washington excludes dividends " + "for an applicant with institutional status; community-spouse " + "dividends remain income of the community spouse." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py new file mode 100644 index 00000000000..d4eeabb5400 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_reported_interest_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS reported monthly interest income" + unit = USD + definition_period = MONTH + default_value = -1 + documentation = ( + "Each person's actual interest receipts in the assessment month, " + "included in their reported gross unearned income. A nonnegative " + "amount replaces that person's annual-source default independently " + "of other people's reports. The -1 sentinel uses annual interest " + "income divided by twelve. Washington excludes this income for " + "an applicant with institutional status; community-spouse interest " + "remains income of the community spouse." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_ssi_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_ssi_income.py new file mode 100644 index 00000000000..38f545d4a6d --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_ssi_income.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_ssi_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS monthly SSI receipts" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Supplemental Security Income receipts included in a person's " + "reported gross monthly unearned income. Washington excludes " + "these receipts under WAC 182-513-1340(1)(f). Defaults to zero " + "because the annual-source gross unearned-income default already " + "omits SSI. Report only amounts also included in gross unearned " + "income, without duplicating state public-assistance receipts." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_state_needs_based_public_assistance_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_state_needs_based_public_assistance_income.py new file mode 100644 index 00000000000..87953575b97 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_state_needs_based_public_assistance_income.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_state_needs_based_public_assistance_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS monthly state needs-based public-assistance receipts" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "State public-assistance receipts based on financial need that " + "qualify under WAC 182-513-1340(1)(f), included in the person's " + "reported gross monthly unearned income. These are factual " + "payments, distinct from the broader needs-based income input " + "used for Delaware's general exclusion. Defaults to zero because " + "the annual-source gross default omits these payments. Report " + "only amounts included in gross unearned income, without " + "duplicating SSI receipts." + ) + reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" From 8de71d130c252fb2b698d01e401a8843cf917077 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 13:04:12 -0400 Subject: [PATCH 23/34] Preserve LTSS exclusion controls and property regressions --- ...test_medicaid_ltss_financial_invariants.py | 164 +++++++++++ .../is_medicaid_ltss_income_eligible.yaml | 275 ++++++++++++++++++ .../medicaid_ltss_financial_pathway.yaml | 71 +++++ ...d_ltss_impairment_related_work_expenses.py | 3 +- 4 files changed, 512 insertions(+), 1 deletion(-) diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index ec730188ed4..375689349d0 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -769,3 +769,167 @@ def test_indexed_minimum_home_equity_limit_is_capped_after_2028(): ) eligible = simulation.calculate("medicaid_ltss_home_equity_eligible", period) assert eligible.tolist() == [True, False] + + +def _income_exclusion_situation(state, values): + """Independent applicants with actual monthly gross and source facts.""" + people = {} + households = {} + marital_units = {} + for index, gross in enumerate(values): + name = f"applicant_{index}" + people[name] = { + "age": {YEAR: 60}, + "meets_ssi_disability_criteria": {YEAR: True}, + "is_ssi_aged_blind_disabled": {YEAR: True}, + "medicaid_ltss_setting": month("INSTITUTIONAL"), + "medicaid_ltss_non_delaware_assistance_unit_size": month(1), + "medicaid_ltss_reported_gross_earned_income": month(float(gross[0])), + "medicaid_ltss_reported_gross_unearned_income": month(float(gross[1])), + "medicaid_ltss_impairment_related_work_expenses": month(400), + "medicaid_ltss_reported_interest_income": month(100), + "medicaid_ltss_reported_dividend_income": month(100), + "medicaid_ltss_ssi_income": month(100), + "medicaid_ltss_state_needs_based_public_assistance_income": month(100), + "medicaid_ltss_qit_opening_year": month(2026), + "medicaid_ltss_qit_opening_month": month(7), + "medicaid_ltss_qit_subsequent_full_deposits_verified": month(True), + "medicaid_ltss_qit_covered_earned_income": month(float(gross[0] / 2)), + "medicaid_ltss_qit_covered_unearned_income": month(float(gross[1] / 2)), + "medicaid_ltss_earned_income_deposited_to_qit": month(float(gross[0] / 8)), + "medicaid_ltss_unearned_income_deposited_to_qit": month( + float(gross[1] / 8) + ), + "medicaid_ltss_qit_covered_earned_income_deposited": month( + float(gross[0] / 8) + ), + "medicaid_ltss_qit_covered_unearned_income_deposited": month( + float(gross[1] / 8) + ), + } + households[name] = {"members": [name], "state_code": {YEAR: state}} + marital_units[name] = {"members": [name]} + return { + "people": people, + "households": households, + "marital_units": marital_units, + } + + +@pytest.mark.parametrize("state", ["DE", "WA", "TX"]) +def test_new_exclusions_keep_countable_income_between_zero_and_gross(state): + rng = np.random.default_rng(SEED + 2) + # Include zero and small incomes to exercise exclusion and deposit caps. + gross = np.vstack(([0, 0], [1, 1], rng.uniform(0, 8_000, (96, 2)))) + simulation = Simulation(situation=_income_exclusion_situation(state, gross)) + income = simulation.calculate("medicaid_ltss_countable_income", PERIOD) + assert (income >= 0).all() + assert (income <= gross.sum(axis=1) + 0.001).all() + for component, limit in [("earned", gross[:, 0]), ("unearned", gross[:, 1])]: + remaining = simulation.calculate( + f"medicaid_ltss_qit_adjusted_{component}_income", PERIOD + ) + assert (remaining >= 0).all() + assert (remaining <= limit + 0.001).all() + + +@pytest.mark.parametrize( + "state, exclusion", + [ + ("DE", "medicaid_ltss_impairment_related_work_expenses"), + ("WA", "medicaid_ltss_reported_interest_income"), + ("WA", "medicaid_ltss_reported_dividend_income"), + ("WA", "medicaid_ltss_ssi_income"), + ("WA", "medicaid_ltss_state_needs_based_public_assistance_income"), + ("TX", "medicaid_ltss_qit_covered_earned_income"), + ("TX", "medicaid_ltss_qit_covered_unearned_income"), + ], +) +def test_each_new_exclusion_is_monotone(state, exclusion): + rng = np.random.default_rng(SEED + 3) + gross = rng.uniform(1, 8_000, (96, 2)) + situation = _income_exclusion_situation(state, gross) + base = Simulation(situation=situation).calculate( + "medicaid_ltss_countable_income", PERIOD + ) + for person in situation["people"].values(): + person[exclusion][PERIOD] += 500 + changed = Simulation(situation=situation).calculate( + "medicaid_ltss_countable_income", PERIOD + ) + assert (changed <= base + 0.001).all() + # Ensure the property covers effective deductions, not just a zero branch. + assert (changed < base - 0.001).any() + + +@pytest.mark.parametrize("spouse", [0, 1]) +def test_delaware_couple_work_expenses_share_exclusions_and_are_monotone(spouse): + rng = np.random.default_rng(SEED + 4) + gross = np.column_stack((rng.uniform(1_000, 6_000, 96), np.zeros(96))) + situation = _income_exclusion_situation("DE", gross) + # Isolate the work-expense ordering from trust deductions. + for person in situation["people"].values(): + person["medicaid_ltss_earned_income_deposited_to_qit"] = month(0) + situation["marital_units"] = {} + for index in range(48): + names = [f"applicant_{2 * index}", f"applicant_{2 * index + 1}"] + situation["marital_units"][f"couple_{index}"] = { + "members": names, + "medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility": month( + True + ), + "medicaid_ltss_spouses_months_in_same_institutional_facility": month(5), + } + base = Simulation(situation=situation).calculate( + "medicaid_ltss_countable_income", PERIOD + ) + combined_gross = gross[:, 0].reshape(-1, 2).sum(axis=1) + expected = np.repeat((combined_gross - 20 - 65 - 800) / 2, 2) + np.testing.assert_allclose(base, expected, rtol=1e-6, atol=0.001) + assert (base <= np.repeat(combined_gross, 2) + 0.001).all() + for index in range(48): + situation["people"][f"applicant_{2 * index + spouse}"][ + "medicaid_ltss_impairment_related_work_expenses" + ][PERIOD] += 500 + changed = Simulation(situation=situation).calculate( + "medicaid_ltss_countable_income", PERIOD + ) + assert (changed <= base + 0.001).all() + np.testing.assert_allclose(changed, base - 250, rtol=1e-6, atol=0.001) + + +@pytest.mark.parametrize("source", ["earned", "unearned"]) +def test_texas_whole_source_exclusion_applies_only_in_the_opening_month(source): + people = {} + observations = [(2026, month_number) for month_number in range(1, 13)] + observations += [(2025, 7), (2027, 7)] + for year, month_number in observations: + period = f"{year}-{month_number:02}" + people[f"month_{year}_{month_number}"] = { + f"medicaid_ltss_reported_gross_{source}_income": {period: 4_000}, + f"medicaid_ltss_{source}_income_deposited_to_qit": {period: 500}, + "medicaid_ltss_qit_opening_year": {period: 2026}, + "medicaid_ltss_qit_opening_month": {period: 7}, + f"medicaid_ltss_qit_covered_{source}_income": {period: 4_000}, + f"medicaid_ltss_qit_covered_{source}_income_deposited": {period: 500}, + "medicaid_ltss_qit_subsequent_full_deposits_verified": {period: True}, + } + names = list(people) + simulation = Simulation( + situation={ + "people": people, + "households": { + "household": { + "members": names, + "state_code": {str(year): "TX" for year in [2025, 2026, 2027]}, + } + }, + "marital_units": {name: {"members": [name]} for name in names}, + } + ) + for index, (year, month_number) in enumerate(observations): + period = f"{year}-{month_number:02}" + income = simulation.calculate( + f"medicaid_ltss_qit_adjusted_{source}_income", period + )[index] + assert income == (0 if (year, month_number) == (2026, 7) else 3_500) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index a5db910a755..112fcea6fd6 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -1114,3 +1114,278 @@ medicaid_ltss_qit_adjusted_earned_income: 0 medicaid_ltss_countable_income: 0 is_medicaid_ltss_income_eligible: true + +- name: Delaware impairment expense applicability follows disability blindness age and community spouse + facts + period: 2026-07 + input: + people: + disabled_under_65: + age: + '2026': 60 + meets_ssi_disability_criteria: + '2026': true + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + aged_without_history: + age: + '2026': 65 + meets_ssi_disability_criteria: + '2026': true + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + aged_with_history: + age: + '2026': 65 + meets_ssi_disability_criteria: + '2026': true + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_received_disability_payments_before_age_65: true + blind: + age: + '2026': 60 + meets_ssi_disability_criteria: + '2026': true + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + is_blind: + '2026': true + not_disabled: + age: + '2026': 60 + meets_ssi_disability_criteria: + '2026': false + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + community_spouse: + age: + '2026': 60 + meets_ssi_disability_criteria: + '2026': true + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_has_community_spouse: true + expense_capped_at_earnings: + age: + '2026': 60 + meets_ssi_disability_criteria: + '2026': true + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 100 + medicaid_ltss_impairment_related_work_expenses: 50000 + medicaid_ltss_reported_gross_unearned_income: 500 + marital_units: + disabled_under_65: + members: [disabled_under_65] + aged_without_history: + members: [aged_without_history] + aged_with_history: + members: [aged_with_history] + blind: + members: [blind] + not_disabled: + members: [not_disabled] + community_spouse: + members: [community_spouse] + expense_capped_at_earnings: + members: [expense_capped_at_earnings] + households: + household: + members: [disabled_under_65, aged_without_history, aged_with_history, blind, not_disabled, community_spouse, + expense_capped_at_earnings] + state_code: + '2026': DE + output: + medicaid_ltss_individual_countable_income: [2485, 2685, 2485, 2685, 2685, 5435, 480] +- name: Texas QIT opening source exclusion requires complete dated and verified facts and avoids overlapping + deposits + period: 2026-07 + input: + people: + unverified: + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: false + no_covered_deposit: + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 0 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + no_actual_deposit: + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 0 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + other_year: + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2025 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + invalid_month: + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 13 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + outside_texas: + medicaid_ltss_reported_gross_unearned_income: 4000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + mixed_sources: + medicaid_ltss_reported_gross_unearned_income: 6000 + medicaid_ltss_unearned_income_deposited_to_qit: 1000 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 4000 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + marital_units: + unverified: + members: [unverified] + no_covered_deposit: + members: [no_covered_deposit] + no_actual_deposit: + members: [no_actual_deposit] + other_year: + members: [other_year] + invalid_month: + members: [invalid_month] + outside_texas: + members: [outside_texas] + mixed_sources: + members: [mixed_sources] + households: + unverified: + members: [unverified] + state_code: + '2026': TX + no_covered_deposit: + members: [no_covered_deposit] + state_code: + '2026': TX + no_actual_deposit: + members: [no_actual_deposit] + state_code: + '2026': TX + other_year: + members: [other_year] + state_code: + '2026': TX + invalid_month: + members: [invalid_month] + state_code: + '2026': TX + outside_texas: + members: [outside_texas] + state_code: + '2026': WA + mixed_sources: + members: [mixed_sources] + state_code: + '2026': TX + output: + medicaid_ltss_qit_adjusted_unearned_income: [3500, 3500, 4000, 3500, 3500, 3500, 1500] +- name: Texas QIT opening exclusion covers both identified sources with one partial source deposit + period: 2026-07 + input: + state_code: + '2026': TX + medicaid_ltss_reported_gross_earned_income: 2000 + medicaid_ltss_reported_gross_unearned_income: 2000 + medicaid_ltss_earned_income_deposited_to_qit: 500 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_earned_income: 2000 + medicaid_ltss_qit_covered_unearned_income: 2000 + medicaid_ltss_qit_covered_earned_income_deposited: 500 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + output: + medicaid_ltss_qit_adjusted_earned_income: 0 + medicaid_ltss_qit_adjusted_unearned_income: 0 + medicaid_ltss_countable_income: 0 +- name: Washington monthly source reports preserve other applicants annual defaults + period: 2026-07 + input: + people: + reported: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + taxable_pension_income: + '2026': 34800 + taxable_interest_income: + '2026': 1200 + ordinary_dividend_income: + '2026': 1200 + medicaid_ltss_reported_gross_unearned_income: 3000 + medicaid_ltss_reported_interest_income: 50 + medicaid_ltss_reported_dividend_income: 50 + annual_defaults: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + taxable_pension_income: + '2026': 34800 + taxable_interest_income: + '2026': 1200 + ordinary_dividend_income: + '2026': 1200 + marital_units: + reported: + members: [reported] + annual_defaults: + members: [annual_defaults] + households: + household: + members: [reported, annual_defaults] + state_code: + '2026': WA + output: + medicaid_ltss_gross_unearned_income: [3000, 3100] + medicaid_ltss_interest_income: [50, 100] + medicaid_ltss_dividend_income: [50, 100] + medicaid_ltss_countable_income: [2900, 2900] + medicaid_ltss_financial_pathway: [SPECIAL_INCOME, SPECIAL_INCOME] + is_medicaid_ltss_income_eligible: [true, true] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index a1df17d8c55..286e0a3e3d2 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -319,3 +319,74 @@ medicaid_ltss_special_income_limit: 2_982 medicaid_ltss_financial_pathway: SPECIAL_INCOME is_medicaid_ltss_income_eligible: true + +- name: Case 17, Washington waiver institutional status excludes dividends before the special income comparison. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_non_delaware_assistance_unit_size: 1 + pension_income: + 2026: 34_800 + ordinary_dividend_income: + 2026: 2_400 + output: + medicaid_ltss_gross_unearned_income: 3_100 + medicaid_ltss_countable_income: 2_900 + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true + +- name: Case 18, Washington medically needy payment threshold uses income after mandatory exclusions. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3_200 + medicaid_ltss_reported_interest_income: 100 + medicaid_ltss_cost_of_care: 3_100 + output: + medicaid_ltss_countable_income: 3_100 + medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY + is_medicaid_ltss_income_eligible: true + +- name: Case 19, Washington excludes identified SSI and state needs-based public-assistance receipts from raw gross income. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3_100 + medicaid_ltss_ssi_income: 100 + medicaid_ltss_state_needs_based_public_assistance_income: 200 + output: + medicaid_ltss_gross_unearned_income: 3_100 + medicaid_ltss_countable_income: 2_800 + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true + +- name: Case 20, a Washington nonapplying community spouse keeps interest and dividends as income. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: UNKNOWN + medicaid_ltss_reported_gross_unearned_income: 300 + medicaid_ltss_reported_interest_income: 100 + medicaid_ltss_reported_dividend_income: 200 + output: + medicaid_ltss_countable_income: 300 + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_income_eligible: false diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py index a8093694905..7ff75712db8 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py @@ -11,7 +11,8 @@ class medicaid_ltss_impairment_related_work_expenses(Variable): documentation = ( "Expenses paid by this person for items or services necessary to " "work because of an impairment, qualifying under 20 CFR 416.976. " - "Report reasonable, unreimbursed costs allocated to the month " + "Report reasonable costs not paid or reimbursable by another " + "source, allocated to the month " "under that section's payment and allocation rules, excluding " "amounts already deducted as business expenses. This input " "describes the qualifying costs; the model separately derives " From 261e18cd71053c8352a1ead3b298b863b75408f5 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 13:23:51 -0400 Subject: [PATCH 24/34] Fix Washington exclusions, Delaware work expenses, and Texas QIT opening income --- .../medicaid-ltss-delaware-irwe.fixed.md | 1 + .../medicaid-ltss-qit-opening-month.fixed.md | 1 + ...ltss-washington-income-exclusions.fixed.md | 1 + .../is_medicaid_ltss_income_eligible.py | 22 +++--- .../medicaid_ltss_couple_countable_income.py | 20 +++++- ...aid_ltss_earned_income_deposited_to_qit.py | 6 +- ...cluded_impairment_related_work_expenses.py | 40 +++++++++++ .../medicaid_ltss_financial_pathway.py | 13 +++- ...dicaid_ltss_individual_countable_income.py | 31 ++++++-- .../medicaid_ltss_medically_needy_expenses.py | 7 +- ...edicaid_ltss_qit_adjusted_earned_income.py | 32 +++++++-- ...icaid_ltss_qit_adjusted_unearned_income.py | 33 +++++++-- ...d_ltss_unearned_income_deposited_to_qit.py | 6 +- .../medicaid_ltss_wa_excluded_income.py | 54 ++++++++++++++ ...tss_qit_opening_month_exclusion_applies.py | 70 +++++++++++++++++++ 15 files changed, 301 insertions(+), 36 deletions(-) create mode 100644 changelog.d/medicaid-ltss-delaware-irwe.fixed.md create mode 100644 changelog.d/medicaid-ltss-qit-opening-month.fixed.md create mode 100644 changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_exclusion_applies.py diff --git a/changelog.d/medicaid-ltss-delaware-irwe.fixed.md b/changelog.d/medicaid-ltss-delaware-irwe.fixed.md new file mode 100644 index 00000000000..c5a098996ec --- /dev/null +++ b/changelog.d/medicaid-ltss-delaware-irwe.fixed.md @@ -0,0 +1 @@ +Apply qualifying Delaware Medicaid LTSS impairment-related work expenses after the $20 and $65 income exclusions and before halving remaining earnings, using reported expense and age-65 disability-payment history facts. diff --git a/changelog.d/medicaid-ltss-qit-opening-month.fixed.md b/changelog.d/medicaid-ltss-qit-opening-month.fixed.md new file mode 100644 index 00000000000..c7dbdce9fc4 --- /dev/null +++ b/changelog.d/medicaid-ltss-qit-opening-month.fixed.md @@ -0,0 +1 @@ +Apply Texas Medicaid LTSS qualified income trust opening-month whole-source exclusions to earned and unearned income after verification of subsequent full deposits, using trust-opening and covered-source facts. diff --git a/changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md b/changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md new file mode 100644 index 00000000000..b83f014970b --- /dev/null +++ b/changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md @@ -0,0 +1 @@ +Apply Washington Medicaid LTSS source income exclusions before the special income limit and medically needy payment thresholds, with monthly interest, dividend, SSI, and state public-assistance receipt facts. diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py index dc3882451e9..2475b75ebbb 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -9,8 +9,11 @@ class is_medicaid_ltss_income_eligible(Variable): documentation = ( "Tests only the income threshold for the selected modeled Medicaid " "LTSS financial pathway. Gross earned and unearned income and QIT " - "deposits determine income after trust treatment; Washington medically " - "needy expenses and cost of care are trusted inputs; this variable " + "deposits determine income after trust treatment; Washington applies " + "the represented WAC 182-513-1340 source exclusions before its " + "special income limit and medically needy payment thresholds. " + "Washington medically needy expenses and cost of care are trusted " + "inputs; this variable " "does not validate a trust, expense, service, or facility rate. The " "Washington institutional branch models the WAC 182-513-1395(4) " "payment threshold using income only: the excess-resources term in " @@ -25,9 +28,10 @@ class is_medicaid_ltss_income_eligible(Variable): "so the institutional setting should not be used for a hospitalized " "Delaware applicant. Delaware computes the $20 general exclusion " "from non-needs-based unearned income first, carries any unused " - "part to earnings, " - "deducts $65, and counts half the earnings remainder (DSSM " - "20240.1 and 20240.3). There is one exclusion per couple budget. " + "part to earnings, deducts $65 and qualifying impairment-related " + "work expenses, then counts half the earnings remainder (DSSM " + "20200.2(f), 20240.1, and 20240.3). There is one general and " + "earned exclusion per couple budget. " "Applicants with a community spouse receive only the eligible " "$20 deduction (DSSM 20990)." ) @@ -36,10 +40,13 @@ class is_medicaid_ltss_income_eligible(Variable): "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", "https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=6", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340", "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508", + "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", ) def formula_2026_01_01(person, period, parameters): @@ -50,14 +57,13 @@ def formula_2026_01_01(person, period, parameters): settings = setting.possible_values pathway = person("medicaid_ltss_financial_pathway", period) pathways = pathway.possible_values - income = person("medicaid_ltss_qit_adjusted_income", period) + income = person("medicaid_ltss_countable_income", period) # The special income limit is zero outside the modeled states and # assistance-unit sizes; the SPECIAL_INCOME pathway gate below is what # keeps an unmodeled person from passing with zero income. special_income_limit = person("medicaid_ltss_special_income_limit", period) - countable_income = person("medicaid_ltss_countable_income", period) - special_income_eligible = countable_income <= special_income_limit + special_income_eligible = income <= special_income_limit medically_needy_expenses = person( "medicaid_ltss_medically_needy_expenses", period diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py index 355c851c3b9..1db2d279453 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py @@ -13,14 +13,19 @@ class medicaid_ltss_couple_countable_income(Variable): "for each spouse. Delaware applies one $20 general exclusion to " "the couple's non-needs-based unearned income first, then carries " "the unused exclusion to combined earnings before deducting $65 " - "and counting half the earnings remainder (DSSM 20240.1 and " - "20240.3). Other modeled states use the combined income remaining " + "and the spouses' qualifying impairment-related work expenses, " + "then counting half the earnings remainder (DSSM 20200.2(f), " + "20240.1 and 20240.3; 20 CFR 416.1112(c)(4)-(7)). Each person's " + "expenses are limited to their own earnings before aggregation. " + "Other modeled states use the combined income remaining " "outside qualified income trusts without exclusions." ) reference = ( "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", ) def formula_2026_01_01(person, period, parameters): @@ -40,8 +45,17 @@ def formula_2026_01_01(person, period, parameters): unused_general_disregard = max_( p.de.income.general_disregard - unearned_disregard, 0 ) + impairment_expenses = person.marital_unit.sum( + person("medicaid_ltss_excluded_impairment_related_work_expenses", period) + ) countable_earned = ( - max_(earned - unused_general_disregard - p.de.income.earned_disregard, 0) + max_( + earned + - unused_general_disregard + - p.de.income.earned_disregard + - impairment_expenses, + 0, + ) * p.de.income.earned_income_countable_rate ) delaware_budget = unearned - unearned_disregard + countable_earned diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py index c90abc98ed1..be903328694 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py @@ -11,8 +11,10 @@ class medicaid_ltss_earned_income_deposited_to_qit(Variable): documentation = ( "Each person's own monthly earned income validly deposited into " "a qualified income trust. Defaults to no deposits. The model " - "subtracts deposits from gross earned income without allowing a " - "negative remainder. Trust legality, irrevocability, funding, " + "excludes these deposits from gross earned income without allowing " + "a negative remainder. The Texas opening-month rule can also " + "exclude an entire identified source after verification of " + "subsequent full deposits. Trust legality, irrevocability, funding, " "payback terms, and the validity of a deposit are unmodeled." ) reference = ( diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py new file mode 100644 index 00000000000..44f9c802630 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py @@ -0,0 +1,40 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_excluded_impairment_related_work_expenses(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS claimant-qualified impairment-related work expenses" + unit = USD + definition_period = MONTH + documentation = ( + "Derives the impairment-related work expenses available for an " + "ordinary Delaware earned-income budget. The person must meet " + "the disability criteria without blindness and either be under " + "65 or have received qualifying disability payments for the " + "month before age 65 (20 CFR 416.1112(c)(6)). Expenses are capped " + "at this person's work income remaining outside a qualified " + "income trust. Individual and couple budgets further cap the " + "deduction at earnings left after the $20 and $65 exclusions; " + "expenses cannot reduce unearned income. Disability, blindness, " + "and age use the existing annual facts." + ) + reference = ( + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", + "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm", + ) + + def formula_2026_01_01(person, period, parameters): + disabled = person("meets_ssi_disability_criteria", period.this_year) + blind = person("is_blind", period.this_year) + under_65 = person("age", period.this_year) < 65 + qualifying_prior_receipt = person( + "medicaid_ltss_received_disability_payments_before_age_65", period + ) + eligible = disabled & ~blind & (under_65 | qualifying_prior_receipt) + expenses = max_( + person("medicaid_ltss_impairment_related_work_expenses", period), 0 + ) + earned = person("medicaid_ltss_qit_adjusted_earned_income", period) + return where(eligible, min_(expenses, earned), 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py index 264884e5c10..c158f7b2be3 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -28,13 +28,18 @@ class medicaid_ltss_financial_pathway(Variable): "Aged, blind, or disabled status is an annual input, so it cannot " "change within a year on this monthly screen. The setting input is " "independent of is_in_medicaid_facility; populating only that " - "variable leaves the setting UNKNOWN and the pathway unmodeled." + "variable leaves the setting UNKNOWN and the pathway unmodeled. " + "Washington applies represented WAC 182-513-1340 source " + "exclusions before comparing income with its special income " + "limit, as required by WAC 182-513-1317(2)." ) reference = ( "https://www.law.cornell.edu/cfr/text/42/435.236", "https://www.law.cornell.edu/cfr/text/42/435.1005", "https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-26-2.pdf#page=465", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=1", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1317", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", "https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505", ) @@ -48,7 +53,11 @@ def formula_2026_01_01(person, period, parameters): waiver = person("medicaid_ltss_waiver", period) waivers = waiver.possible_values assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) - income = person("medicaid_ltss_qit_adjusted_income", period) + income = max_( + person("medicaid_ltss_qit_adjusted_income", period) + - person("medicaid_ltss_wa_excluded_income", period), + 0, + ) special_income_limit = person("medicaid_ltss_special_income_limit", period) aged_blind_disabled = person("is_ssi_aged_blind_disabled", period.this_year) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py index c5e7c574834..552e95f8e17 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py @@ -12,15 +12,22 @@ class medicaid_ltss_individual_countable_income(Variable): "the assistance-unit election. Delaware applies the $20 general " "exclusion to non-needs-based unearned income first, then carries " "the unused exclusion to earnings before deducting $65 and " - "counting half the earnings remainder (DSSM 20240.1 and 20240.3). " + "qualifying impairment-related work expenses, then counting " + "half the earnings remainder (DSSM 20200.2(f), 20240.1 and " + "20240.3; 20 CFR 416.1112(c)(4)-(7)). " "Applicants with a community spouse receive only the eligible " - "$20 exclusion (DSSM 20990). Other modeled states use income " - "remaining outside the qualified income trust without exclusions." + "$20 exclusion (DSSM 20990). Washington removes representable " + "WAC 182-513-1340 source exclusions before the SIL comparison " + "and income budget. Texas uses income remaining outside the " + "qualified income trust." ) reference = ( "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340", ) def formula_2026_01_01(person, period, parameters): @@ -35,8 +42,17 @@ def formula_2026_01_01(person, period, parameters): unused_general_disregard = max_( p.de.income.general_disregard - unearned_disregard, 0 ) + impairment_expenses = person( + "medicaid_ltss_excluded_impairment_related_work_expenses", period + ) countable_earned = ( - max_(earned - unused_general_disregard - p.de.income.earned_disregard, 0) + max_( + earned + - unused_general_disregard + - p.de.income.earned_disregard + - impairment_expenses, + 0, + ) * p.de.income.earned_income_countable_rate ) ordinary_budget = unearned - unearned_disregard + countable_earned @@ -49,4 +65,9 @@ def formula_2026_01_01(person, period, parameters): community_spouse_budget, ordinary_budget, ) - return where(state == state.possible_values.DE, delaware_budget, gross) + washington_excluded = person("medicaid_ltss_wa_excluded_income", period) + return where( + state == state.possible_values.DE, + delaware_budget, + max_(gross - washington_excluded, 0), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py index f8fee6bb58d..36dff59154e 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py @@ -9,12 +9,15 @@ class medicaid_ltss_medically_needy_expenses(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Explicit monthly exclusions, post-eligibility deductions, and " + "Additional monthly exclusions, post-eligibility deductions, and " "incurred medical expenses used to derive Washington remaining or " "net available income. This trusted input must already reflect the " "applicable expense categories, ordering, and documentation; the " "model does not adjudicate expenses or calculate a spenddown budget " - "period." + "period. Omit source receipts already removed by " + "medicaid_ltss_wa_excluded_income, including modeled interest, " + "dividends, SSI, and state public assistance, to avoid a duplicate " + "deduction." ) reference = ( "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py index 48c46f38187..fd15436bab8 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py @@ -4,12 +4,17 @@ class medicaid_ltss_qit_adjusted_earned_income(Variable): value_type = float entity = Person - label = "Medicaid LTSS earned income remaining outside a qualified income trust" + label = "Medicaid LTSS earned income after qualified income trust exclusions" unit = USD definition_period = MONTH documentation = ( - "Each person's own gross earned income less their valid qualified " - "income trust deposits, before Medicaid LTSS income exclusions." + "Each person's own gross earned income after qualified income " + "trust exclusions, before other Medicaid LTSS income exclusions. " + "Actual valid deposits are excluded in ordinary months. Texas " + "excludes entire identified sources in the trust's opening month " + "after a partial covered-source deposit and verification of " + "subsequent full deposits. The deposited covered-source component " + "is subtracted from that extension to avoid a duplicate exclusion." ) reference = ( "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", @@ -18,7 +23,22 @@ class medicaid_ltss_qit_adjusted_earned_income(Variable): def formula(person, period, parameters): income = max_(person("medicaid_ltss_gross_earned_income", period), 0) - deposits = max_( - person("medicaid_ltss_earned_income_deposited_to_qit", period), 0 + deposits = min_( + max_(person("medicaid_ltss_earned_income_deposited_to_qit", period), 0), + income, ) - return max_(income - deposits, 0) + covered = min_( + max_(person("medicaid_ltss_qit_covered_earned_income", period), 0), + income, + ) + covered_deposits = min_( + max_( + person("medicaid_ltss_qit_covered_earned_income_deposited", period), 0 + ), + min_(covered, deposits), + ) + opening_month = person( + "tx_medicaid_ltss_qit_opening_month_exclusion_applies", period + ) + additional_exclusion = where(opening_month, covered - covered_deposits, 0) + return max_(income - deposits - additional_exclusion, 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py index aa0947886bb..8c4e6af5d62 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py @@ -4,12 +4,17 @@ class medicaid_ltss_qit_adjusted_unearned_income(Variable): value_type = float entity = Person - label = "Medicaid LTSS unearned income remaining outside a qualified income trust" + label = "Medicaid LTSS unearned income after qualified income trust exclusions" unit = USD definition_period = MONTH documentation = ( - "Each person's own gross unearned income less their valid qualified " - "income trust deposits, before Medicaid LTSS income exclusions." + "Each person's own gross unearned income after qualified income " + "trust exclusions, before other Medicaid LTSS income exclusions. " + "Actual valid deposits are excluded in ordinary months. Texas " + "excludes entire identified sources in the trust's opening month " + "after a partial covered-source deposit and verification of " + "subsequent full deposits. The deposited covered-source component " + "is subtracted from that extension to avoid a duplicate exclusion." ) reference = ( "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", @@ -18,7 +23,23 @@ class medicaid_ltss_qit_adjusted_unearned_income(Variable): def formula(person, period, parameters): income = max_(person("medicaid_ltss_gross_unearned_income", period), 0) - deposits = max_( - person("medicaid_ltss_unearned_income_deposited_to_qit", period), 0 + deposits = min_( + max_(person("medicaid_ltss_unearned_income_deposited_to_qit", period), 0), + income, ) - return max_(income - deposits, 0) + covered = min_( + max_(person("medicaid_ltss_qit_covered_unearned_income", period), 0), + income, + ) + covered_deposits = min_( + max_( + person("medicaid_ltss_qit_covered_unearned_income_deposited", period), + 0, + ), + min_(covered, deposits), + ) + opening_month = person( + "tx_medicaid_ltss_qit_opening_month_exclusion_applies", period + ) + additional_exclusion = where(opening_month, covered - covered_deposits, 0) + return max_(income - deposits - additional_exclusion, 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py index d9b98d72836..80632d8d30e 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py @@ -11,8 +11,10 @@ class medicaid_ltss_unearned_income_deposited_to_qit(Variable): documentation = ( "Each person's own monthly unearned income validly deposited " "into a qualified income trust. Defaults to no deposits. The " - "model subtracts deposits from gross unearned income without " - "allowing a negative remainder. Trust legality, irrevocability, " + "model excludes these deposits from gross unearned income without " + "allowing a negative remainder. The Texas opening-month rule can " + "also exclude an entire identified source after verification of " + "subsequent full deposits. Trust legality, irrevocability, " "funding, payback terms, and the validity of a deposit are unmodeled." ) reference = ( diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py new file mode 100644 index 00000000000..26042bdb212 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py @@ -0,0 +1,54 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_wa_excluded_income(Variable): + value_type = float + entity = Person + label = "Washington Medicaid LTSS modeled income exclusions" + unit = USD + definition_period = MONTH + documentation = ( + "Derives the WAC 182-513-1340 exclusions represented by the " + "screen's source facts: SSI, qualifying state needs-based public " + "assistance, and the institutionally classified applicant's " + "interest and dividends. Institutional status includes the modeled " + "Washington HCBS waivers under WAC 182-513-1320; investment " + "income remains income of a nonapplying community spouse. " + "These exclusions apply before both the special-income-limit " + "comparison under WAC 182-513-1317(2) and the medically needy " + "income calculation. The total is capped at remaining unearned " + "income. Other source, qualification, or expense distinctions " + "required by WAC 182-513-1340 cannot be inferred from aggregate " + "monthly gross income. Many excluded receipts already lie " + "outside the annual-source gross default." + ) + reference = ( + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1317", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1320", + "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340", + ) + + def formula_2026_01_01(person, period, parameters): + state = person.household("state_code", period) + setting = person("medicaid_ltss_setting", period) + settings = setting.possible_values + waiver = person("medicaid_ltss_waiver", period) + waivers = waiver.possible_values + institutional_status = (setting == settings.INSTITUTIONAL) | ( + (setting == settings.HCBS) + & ( + (waiver == waivers.WA_COPES) + | (waiver == waivers.WA_NEW_FREEDOM) + | (waiver == waivers.WA_RSW) + ) + ) + investment_income = max_( + person("medicaid_ltss_interest_income", period), 0 + ) + max_(person("medicaid_ltss_dividend_income", period), 0) + public_assistance = max_(person("medicaid_ltss_ssi_income", period), 0) + max_( + person("medicaid_ltss_state_needs_based_public_assistance_income", period), + 0, + ) + excluded = public_assistance + where(institutional_status, investment_income, 0) + unearned = max_(person("medicaid_ltss_qit_adjusted_unearned_income", period), 0) + return where(state == state.possible_values.WA, min_(excluded, unearned), 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_exclusion_applies.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_exclusion_applies.py new file mode 100644 index 00000000000..fd2c123da9d --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_exclusion_applies.py @@ -0,0 +1,70 @@ +from policyengine_us.model_api import * + + +class tx_medicaid_ltss_qit_opening_month_exclusion_applies(Variable): + value_type = bool + entity = Person + label = "Texas Medicaid LTSS QIT opening-month whole-source exclusion applies" + definition_period = MONTH + default_value = False + documentation = ( + "Derives the Texas opening-month whole-source income exclusion " + "from the trust's opening year and month, a positive covered-source " + "deposit, and verification of subsequent full deposits. A partial " + "opening deposit can cover multiple identified sources, so the " + "positive deposit condition combines earned and unearned source " + "components. Covered deposited components cannot exceed either " + "the covered source or the actual valid deposits. Other months " + "and states continue to exclude actual valid deposits only." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" + + def formula(person, period, parameters): + state = person.household("state_code", period) + states = state.possible_values + opening_year = person("medicaid_ltss_qit_opening_year", period) + opening_month = person("medicaid_ltss_qit_opening_month", period) + verified = person("medicaid_ltss_qit_subsequent_full_deposits_verified", period) + + earned = max_(person("medicaid_ltss_gross_earned_income", period), 0) + covered_earned = min_( + max_(person("medicaid_ltss_qit_covered_earned_income", period), 0), + earned, + ) + earned_deposits = min_( + max_(person("medicaid_ltss_earned_income_deposited_to_qit", period), 0), + earned, + ) + covered_earned_deposits = min_( + max_( + person("medicaid_ltss_qit_covered_earned_income_deposited", period), 0 + ), + min_(covered_earned, earned_deposits), + ) + + unearned = max_(person("medicaid_ltss_gross_unearned_income", period), 0) + covered_unearned = min_( + max_(person("medicaid_ltss_qit_covered_unearned_income", period), 0), + unearned, + ) + unearned_deposits = min_( + max_(person("medicaid_ltss_unearned_income_deposited_to_qit", period), 0), + unearned, + ) + covered_unearned_deposits = min_( + max_( + person("medicaid_ltss_qit_covered_unearned_income_deposited", period), + 0, + ), + min_(covered_unearned, unearned_deposits), + ) + positive_covered_deposit = ( + covered_earned_deposits + covered_unearned_deposits + ) > 0 + return ( + (state == states.TX) + & (opening_year == period.start.year) + & (opening_month == period.start.month) + & verified + & positive_covered_deposit + ) From bc32649b7f4d61af9eb6458359bc5f2d82063c86 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 15:12:56 -0400 Subject: [PATCH 25/34] Fix Washington LTSS exclusion for legacy dividend inputs --- ...medicaid-ltss-wa-legacy-dividends.fixed.md | 1 + ...test_medicaid_ltss_financial_invariants.py | 31 +++++++++++++++++++ .../medicaid_ltss_financial_pathway.yaml | 22 +++++++++++++ .../medicaid_ltss_dividend_income.py | 7 ++--- 4 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md diff --git a/changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md b/changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md new file mode 100644 index 00000000000..f940358cbf6 --- /dev/null +++ b/changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md @@ -0,0 +1 @@ +Match Washington's LTSS dividend exclusion to the legacy-compatible dividend source included in gross income. diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 375689349d0..fdc8d6ac495 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -933,3 +933,34 @@ def test_texas_whole_source_exclusion_applies_only_in_the_opening_month(source): f"medicaid_ltss_qit_adjusted_{source}_income", period )[index] assert income == (0 if (year, month_number) == (2026, 7) else 3_500) + + +@pytest.mark.parametrize("source", ["ordinary", "legacy", "conflicting"]) +def test_dividend_exclusion_never_exceeds_dividends_counted_in_gross(source): + rng = np.random.default_rng(SEED + 5) + annual_dividends = rng.uniform(0, 12_000, 96) + situation = _income_exclusion_situation("WA", np.zeros((96, 2))) + for index, person in enumerate(situation["people"].values()): + # Keep only annual pension/dividend sources and no other exclusions. + person.pop("medicaid_ltss_reported_gross_unearned_income") + person.pop("medicaid_ltss_reported_dividend_income") + person["medicaid_ltss_reported_interest_income"] = month(0) + person["medicaid_ltss_ssi_income"] = month(0) + person["medicaid_ltss_state_needs_based_public_assistance_income"] = month(0) + person["medicaid_ltss_unearned_income_deposited_to_qit"] = month(0) + person["pension_income"] = {YEAR: 34_800} + variable = ( + "ordinary_dividend_income" if source == "ordinary" else "dividend_income" + ) + person[variable] = {YEAR: float(annual_dividends[index])} + if source == "conflicting": + person["ordinary_dividend_income"] = { + YEAR: float(annual_dividends[index] + 1_200) + } + simulation = Simulation(situation=situation) + counted_dividends = simulation.calculate("dividend_income", YEAR) / 12 + gross = simulation.calculate("medicaid_ltss_gross_unearned_income", PERIOD) + excluded = simulation.calculate("medicaid_ltss_wa_excluded_income", PERIOD) + np.testing.assert_allclose(gross, 2_900 + counted_dividends, atol=0.001) + assert (excluded <= counted_dividends + 0.001).all() + np.testing.assert_allclose(excluded, counted_dividends, atol=0.001) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index 286e0a3e3d2..4ad7dbbcfbb 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -390,3 +390,25 @@ medicaid_ltss_countable_income: 300 medicaid_ltss_financial_pathway: UNMODELED is_medicaid_ltss_income_eligible: false + +- name: Case 21, Washington excludes the legacy dividends counted in gross income. + period: 2026-07 + input: + state_code: + 2026: WA + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + pension_income: + 2026: 34_800 + dividend_income: + 2026: 1_200 + output: + medicaid_ltss_gross_unearned_income: 3_000 + medicaid_ltss_dividend_income: 100 + medicaid_ltss_wa_excluded_income: 100 + medicaid_ltss_countable_income: 2_900 + medicaid_ltss_special_income_limit: 2_982 + medicaid_ltss_financial_pathway: SPECIAL_INCOME + is_medicaid_ltss_income_eligible: true diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py index 9947c8b6913..98b844f4719 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py @@ -9,14 +9,13 @@ class medicaid_ltss_dividend_income(Variable): definition_period = MONTH documentation = ( "Each person's dividend income included in gross unearned income. " - "Defaults to annual ordinary_dividend_income divided by twelve, " + "Defaults to annual dividend_income, the same legacy-compatible " + "source included in gross SSI unearned income, divided by twelve, " "unless that person reports actual monthly dividend receipts." ) reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340" def formula(person, period, parameters): reported = person("medicaid_ltss_reported_dividend_income", period) - annual_default = max_( - person("ordinary_dividend_income", period.this_year) / 12, 0 - ) + annual_default = max_(person("dividend_income", period.this_year) / 12, 0) return where(reported == -1, annual_default, max_(reported, 0)) From cfa416ec5d67795cc940299e3f305fb99430ec88 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 7 Oct 2026 16:33:33 -0400 Subject: [PATCH 26/34] Derive Delaware LTSS work expenses from leaf payment facts --- .../medicaid-ltss-irwe-leaf-payments.fixed.md | 1 + ...test_medicaid_ltss_financial_invariants.py | 77 ++++- .../is_medicaid_ltss_income_eligible.yaml | 266 +++++++++++++++++- ...d_ltss_impairment_related_work_expenses.py | 77 ++++- ...icaid_ltss_irwe_allocate_over_12_months.py | 23 ++ ...aid_ltss_irwe_monthly_business_expenses.py | 24 ++ .../medicaid_ltss_irwe_monthly_payments.py | 26 ++ ...dicaid_ltss_irwe_monthly_reimbursements.py | 24 ++ ...tss_irwe_nonrecurring_business_expenses.py | 23 ++ ...medicaid_ltss_irwe_nonrecurring_payment.py | 32 +++ ...id_ltss_irwe_nonrecurring_reimbursement.py | 23 ++ .../medicaid_ltss_irwe_working_when_paid.py | 25 ++ 12 files changed, 596 insertions(+), 25 deletions(-) create mode 100644 changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py diff --git a/changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md b/changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md new file mode 100644 index 00000000000..3637d8c4ac6 --- /dev/null +++ b/changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md @@ -0,0 +1 @@ +Derive Delaware LTSS impairment-related work expenses from payment and reimbursement facts, business-cost overlap, and the claimant's twelve-month allocation election. diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index fdc8d6ac495..af182120002 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -786,7 +786,8 @@ def _income_exclusion_situation(state, values): "medicaid_ltss_non_delaware_assistance_unit_size": month(1), "medicaid_ltss_reported_gross_earned_income": month(float(gross[0])), "medicaid_ltss_reported_gross_unearned_income": month(float(gross[1])), - "medicaid_ltss_impairment_related_work_expenses": month(400), + "medicaid_ltss_irwe_monthly_payments": month(400), + "medicaid_ltss_irwe_working_when_paid": month(True), "medicaid_ltss_reported_interest_income": month(100), "medicaid_ltss_reported_dividend_income": month(100), "medicaid_ltss_ssi_income": month(100), @@ -836,7 +837,7 @@ def test_new_exclusions_keep_countable_income_between_zero_and_gross(state): @pytest.mark.parametrize( "state, exclusion", [ - ("DE", "medicaid_ltss_impairment_related_work_expenses"), + ("DE", "medicaid_ltss_irwe_monthly_payments"), ("WA", "medicaid_ltss_reported_interest_income"), ("WA", "medicaid_ltss_reported_dividend_income"), ("WA", "medicaid_ltss_ssi_income"), @@ -889,7 +890,7 @@ def test_delaware_couple_work_expenses_share_exclusions_and_are_monotone(spouse) assert (base <= np.repeat(combined_gross, 2) + 0.001).all() for index in range(48): situation["people"][f"applicant_{2 * index + spouse}"][ - "medicaid_ltss_impairment_related_work_expenses" + "medicaid_ltss_irwe_monthly_payments" ][PERIOD] += 500 changed = Simulation(situation=situation).calculate( "medicaid_ltss_countable_income", PERIOD @@ -964,3 +965,73 @@ def test_dividend_exclusion_never_exceeds_dividends_counted_in_gross(source): np.testing.assert_allclose(gross, 2_900 + counted_dividends, atol=0.001) assert (excluded <= counted_dividends + 0.001).all() np.testing.assert_allclose(excluded, counted_dividends, atol=0.001) + + +@pytest.mark.parametrize("reimbursement_share", [0, 0.25, 1, 1.25]) +def test_irwe_twelve_month_allocation_conserves_net_purchase_cost(reimbursement_share): + # Conserve the allocated cost before claimant and earnings-budget caps; + # a month without earnings need not realize the full scheduled deduction. + rng = np.random.default_rng(SEED + 6) + costs = rng.uniform(1, 12_000, 96) + # June through the following May exercises both endpoints and year rollover. + months = [f"2026-{number:02}" for number in range(6, 13)] + months += [f"2027-{number:02}" for number in range(1, 6)] + situation = _income_exclusion_situation("DE", np.zeros((96, 2))) + for index, person in enumerate(situation["people"].values()): + person["medicaid_ltss_irwe_monthly_payments"] = month(0) + person["medicaid_ltss_reported_gross_earned_income"] = { + period: 20_000 for period in months + } + person["medicaid_ltss_irwe_working_when_paid"] = {months[0]: True} + person["medicaid_ltss_irwe_nonrecurring_payment"] = { + months[0]: float(costs[index]) + } + person["medicaid_ltss_irwe_nonrecurring_reimbursement"] = { + months[0]: float(costs[index] * reimbursement_share) + } + person["medicaid_ltss_irwe_allocate_over_12_months"] = {months[0]: True} + simulation = Simulation(situation=situation) + deductions = np.array( + [ + simulation.calculate( + "medicaid_ltss_impairment_related_work_expenses", period + ) + for period in months + ] + ) + net_costs = np.maximum(costs * (1 - reimbursement_share), 0) + np.testing.assert_allclose(deductions.sum(axis=0), net_costs, rtol=1e-6, atol=0.01) + np.testing.assert_allclose( + deductions, + np.broadcast_to(net_costs / 12, deductions.shape), + rtol=1e-6, + atol=0.001, + ) + for outside in ["2026-05", "2027-06"]: + assert ( + simulation.calculate( + "medicaid_ltss_impairment_related_work_expenses", outside + ) + == 0 + ).all() + + +@pytest.mark.parametrize("allocate", [False, True]) +def test_more_nonrecurring_expense_never_raises_countable_income(allocate): + rng = np.random.default_rng(SEED + 7) + gross = np.column_stack((rng.uniform(3_000, 8_000, 96), np.zeros(96))) + situation = _income_exclusion_situation("DE", gross) + costs = rng.uniform(100, 1_000, 96) + for index, person in enumerate(situation["people"].values()): + person["medicaid_ltss_irwe_nonrecurring_payment"] = month(float(costs[index])) + person["medicaid_ltss_irwe_allocate_over_12_months"] = month(allocate) + base = Simulation(situation=situation).calculate( + "medicaid_ltss_countable_income", PERIOD + ) + for person in situation["people"].values(): + person["medicaid_ltss_irwe_nonrecurring_payment"][PERIOD] += 500 + changed = Simulation(situation=situation).calculate( + "medicaid_ltss_countable_income", PERIOD + ) + assert (changed <= base + 0.001).all() + assert (changed < base - 0.001).any() diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 112fcea6fd6..48bed305b64 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -997,7 +997,9 @@ 2026: true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + # Actual monthly payment for non-durable impairment-related supplies. + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true output: # (5,455 - 20 - 65 - 400) / 2 = 2,485, exactly the SIL. medicaid_ltss_individual_countable_income: 2485 @@ -1018,7 +1020,8 @@ 2026: true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 3970 - medicaid_ltss_impairment_related_work_expenses: 200 + medicaid_ltss_irwe_monthly_payments: 200 + medicaid_ltss_irwe_working_when_paid: true spouse: age: 2026: 60 @@ -1028,7 +1031,8 @@ 2026: true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 3970 - medicaid_ltss_impairment_related_work_expenses: 200 + medicaid_ltss_irwe_monthly_payments: 200 + medicaid_ltss_irwe_working_when_paid: true marital_units: couple: members: [applicant, spouse] @@ -1129,7 +1133,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true aged_without_history: age: '2026': 65 @@ -1139,7 +1144,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true aged_with_history: age: '2026': 65 @@ -1149,7 +1155,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true medicaid_ltss_received_disability_payments_before_age_65: true blind: age: @@ -1160,7 +1167,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true is_blind: '2026': true not_disabled: @@ -1172,7 +1180,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true community_spouse: age: '2026': 60 @@ -1182,7 +1191,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 5455 - medicaid_ltss_impairment_related_work_expenses: 400 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true medicaid_ltss_has_community_spouse: true expense_capped_at_earnings: age: @@ -1193,7 +1203,8 @@ '2026': true medicaid_ltss_setting: INSTITUTIONAL medicaid_ltss_reported_gross_earned_income: 100 - medicaid_ltss_impairment_related_work_expenses: 50000 + medicaid_ltss_irwe_monthly_payments: 50000 + medicaid_ltss_irwe_working_when_paid: true medicaid_ltss_reported_gross_unearned_income: 500 marital_units: disabled_under_65: @@ -1389,3 +1400,238 @@ medicaid_ltss_countable_income: [2900, 2900] medicaid_ltss_financial_pathway: [SPECIAL_INCOME, SPECIAL_INCOME] is_medicaid_ltss_income_eligible: [true, true] + + +- name: Delaware derives work expenses from payment facts and the allocation election + period: 2026-07 + input: + people: + elected_allocation: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 5455 + 2026-07: 5455 + # The durable item is paid for in June; there is no July payment. + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 4800 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-06: true + no_allocation_election: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 5455 + 2026-07: 5455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 4800 + medicaid_ltss_irwe_working_when_paid: + 2026-06: true + full_payment_in_current_month: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: 5455 + medicaid_ltss_irwe_nonrecurring_payment: 4800 + medicaid_ltss_irwe_working_when_paid: true + net_both_payment_sources: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 5455 + 2026-07: 5455 + medicaid_ltss_irwe_monthly_payments: 600 + medicaid_ltss_irwe_monthly_reimbursements: 100 + medicaid_ltss_irwe_monthly_business_expenses: 100 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 6000 + medicaid_ltss_irwe_nonrecurring_reimbursement: + 2026-06: 600 + medicaid_ltss_irwe_nonrecurring_business_expenses: + 2026-06: 600 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-06: true + 2026-07: true + fully_reimbursed: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 5455 + 2026-07: 5455 + medicaid_ltss_irwe_monthly_payments: 400 + medicaid_ltss_irwe_monthly_reimbursements: 400 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 4800 + # Reimbursement cannot create a negative allowable expense. + medicaid_ltss_irwe_nonrecurring_reimbursement: + 2026-06: 5000 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-06: true + 2026-07: true + not_working_when_paid: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 5455 + 2026-07: 5455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 4800 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-06: false + no_earnings_received_when_paid: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 0 + 2026-07: 5455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 4800 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-06: true + marital_units: + elected_allocation: + members: [elected_allocation] + no_allocation_election: + members: [no_allocation_election] + full_payment_in_current_month: + members: [full_payment_in_current_month] + net_both_payment_sources: + members: [net_both_payment_sources] + fully_reimbursed: + members: [fully_reimbursed] + not_working_when_paid: + members: [not_working_when_paid] + no_earnings_received_when_paid: + members: [no_earnings_received_when_paid] + households: + household: + members: [elected_allocation, no_allocation_election, full_payment_in_current_month, + net_both_payment_sources, fully_reimbursed, not_working_when_paid, + no_earnings_received_when_paid] + state_code: + 2026: DE + output: + medicaid_ltss_impairment_related_work_expenses: [400, 0, 4800, 800, 0, 0, 0] + # The elected June purchase gives (5,455 - 20 - 65 - 400) / 2 = 2,485. + # The same purchase without an election leaves July's income at 2,685. + medicaid_ltss_countable_income: [2485, 2685, 285, 2285, 2685, 2685, 2685] + is_medicaid_ltss_income_eligible: [true, false, true, true, false, false, false] + + +- name: Delaware allocation crosses years ends after twelve months and combines purchases + period: 2027-06 + input: + people: + twelfth_allocated_month: + age: + 2027: 60 + meets_ssi_disability_criteria: + 2027: true + is_ssi_aged_blind_disabled: + 2027: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-07: 5455 + 2027-06: 5455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-07: 4800 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-07: true + medicaid_ltss_irwe_working_when_paid: + 2026-07: true + allocation_finished: + age: + 2027: 60 + meets_ssi_disability_criteria: + 2027: true + is_ssi_aged_blind_disabled: + 2027: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-06: 5455 + 2027-06: 5455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-06: 4800 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-06: true + overlapping_purchases: + age: + 2027: 60 + meets_ssi_disability_criteria: + 2027: true + is_ssi_aged_blind_disabled: + 2027: true + medicaid_ltss_setting: INSTITUTIONAL + medicaid_ltss_reported_gross_earned_income: + 2026-07: 5455 + 2027-06: 5455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-07: 4800 + 2027-06: 1200 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-07: true + 2027-06: true + medicaid_ltss_irwe_working_when_paid: + 2026-07: true + 2027-06: true + marital_units: + twelfth_allocated_month: + members: [twelfth_allocated_month] + allocation_finished: + members: [allocation_finished] + overlapping_purchases: + members: [overlapping_purchases] + households: + household: + members: [twelfth_allocated_month, allocation_finished, overlapping_purchases] + state_code: + 2027: DE + output: + medicaid_ltss_impairment_related_work_expenses: [400, 0, 500] + medicaid_ltss_countable_income: [2485, 2685, 2435] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py index 7ff75712db8..6ad07a9e3b3 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py @@ -4,24 +4,77 @@ class medicaid_ltss_impairment_related_work_expenses(Variable): value_type = float entity = Person - label = "Medicaid LTSS qualifying impairment-related work expenses" + label = "Medicaid LTSS monthly impairment-related work expenses" unit = USD definition_period = MONTH - default_value = 0 documentation = ( - "Expenses paid by this person for items or services necessary to " - "work because of an impairment, qualifying under 20 CFR 416.976. " - "Report reasonable costs not paid or reimbursable by another " - "source, allocated to the month " - "under that section's payment and allocation rules, excluding " - "amounts already deducted as business expenses. This input " - "describes the qualifying costs; the model separately derives " - "the disability, blindness, and age conditions and applies the " - "exclusion in the income-budget sequence. Each spouse reports " - "their own expenses." + "Derives the monthly expense amount from actual money payments, " + "reimbursements and business-cost facts. Recurring payments are " + "deducted in their payment month. A one-time item or service " + "payment is deducted then, or in twelve equal monthly amounts " + "beginning then if the person elects allocation. Its payment " + "month is the monthly input period, allowing separate purchases " + "in different months to overlap without losing their history. " + "Reimbursed, available-for-reimbursement and already-deducted " + "business costs are removed before allocation. Ordinary timing " + "requires working and receiving earned income in the payment " + "month. Pre-work, deferred first-paycheck, after-work and special " + "downpayment timing need additional facts and elections and are " + "outside this calculation. The reported items or services must " + "be needed and used for work because of the impairment and meet " + "reasonable-charge verification; callers report actual payments, " + "not a qualified or allocated policy amount. Claimant disability, " + "blindness and age conditions, and the income-budget cap and " + "exclusion order, are applied separately by derived outputs." ) reference = ( "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm", "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", ) + + def formula_2026_01_01(person, period, parameters): + working = person("medicaid_ltss_irwe_working_when_paid", period) + monthly = max_( + max_(person("medicaid_ltss_irwe_monthly_payments", period), 0) + - max_(person("medicaid_ltss_irwe_monthly_reimbursements", period), 0) + - max_(person("medicaid_ltss_irwe_monthly_business_expenses", period), 0), + 0, + ) + expenses = person.empty_array() + if (working & (monthly > 0)).any(): + received_earnings = person("medicaid_ltss_gross_earned_income", period) > 0 + expenses = where(working & received_earnings, monthly, 0) + # 416.976(e)(2): payment month plus the following eleven months. + for months_ago in range(12): + paid_month = period.offset(-months_ago) + allocated = person("medicaid_ltss_irwe_allocate_over_12_months", paid_month) + paid_while_working = person( + "medicaid_ltss_irwe_working_when_paid", paid_month + ) + net_payment = max_( + max_(person("medicaid_ltss_irwe_nonrecurring_payment", paid_month), 0) + - max_( + person("medicaid_ltss_irwe_nonrecurring_reimbursement", paid_month), + 0, + ) + - max_( + person( + "medicaid_ltss_irwe_nonrecurring_business_expenses", paid_month + ), + 0, + ), + 0, + ) + applies = paid_while_working & (allocated | (months_ago == 0)) + # No earnings history is needed for months with no usable payment. + if not (applies & (net_payment > 0)).any(): + continue + paid_with_earnings = ( + person("medicaid_ltss_gross_earned_income", paid_month) > 0 + ) + deduction = where( + allocated, net_payment / 12, net_payment if months_ago == 0 else 0 + ) + expenses += where(paid_while_working & paid_with_earnings, deduction, 0) + return expenses diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py new file mode 100644 index 00000000000..0cb2e9db91c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_allocate_over_12_months(Variable): + value_type = bool + entity = Person + label = "Elected 12-month allocation of a Medicaid LTSS impairment-related payment" + definition_period = MONTH + default_value = False + documentation = ( + "Whether this person elects to allocate the nonrecurring impairment-related " + "payment reported in this month over twelve consecutive months beginning " + "with this month. Report the election only in the original payment month. " + "A false election deducts the payment only in that month. This records " + "the person's choice, not a deductible amount or eligibility result. " + "Separate payments made in later months retain their own election." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py new file mode 100644 index 00000000000..cbf4eafe6dc --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_monthly_business_expenses(Variable): + value_type = float + entity = Person + label = "Monthly Medicaid LTSS impairment-related payments already deducted as business expenses" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Actual amount of this person's reported monthly impairment-related " + "payments already deducted in calculating net self-employment income. " + "Report the overlapping cost before applying Medicaid LTSS income rules. " + "The model removes this amount from the expense deduction to avoid " + "deducting the same business cost twice. Exclude amounts also reported " + "as nonrecurring business expenses." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py new file mode 100644 index 00000000000..12d64c631da --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_monthly_payments(Variable): + value_type = float + entity = Person + label = "Monthly payments for Medicaid LTSS impairment-related items and services" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Money this person paid in the modeled month for recurring items or services " + "needed and used to work because of an impairment. Report the actual payments " + "before reimbursement or business-expense deductions. Include monthly " + "installments and rentals, and exclude any amount also reported as a " + "nonrecurring payment. Report cash, check, card, or other money payments, " + "not payments in kind. The model derives the deductible amount, including " + "reimbursement netting and claimant eligibility; this input is not an " + "allocated or policy-qualified deduction." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py new file mode 100644 index 00000000000..d056eb2071e --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_monthly_reimbursements(Variable): + value_type = float + entity = Person + label = "Reimbursements for monthly Medicaid LTSS impairment-related payments" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Amount of this person's reported monthly impairment-related payments " + "paid by another source or reimbursed, available for reimbursement, or " + "expected to be reimbursed. Report the reimbursement against the payment " + "month, even if the reimbursement arrives later. Include private insurance, " + "Medicare, Medicaid, and other sources. The model nets this factual amount " + "against monthly payments rather than asking for an out-of-pocket deduction." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py new file mode 100644 index 00000000000..e0b1098049b --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_nonrecurring_business_expenses(Variable): + value_type = float + entity = Person + label = "Nonrecurring Medicaid LTSS impairment-related payment already deducted as a business expense" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Actual amount of this person's nonrecurring impairment-related payment " + "already deducted in calculating net self-employment income. Report it " + "in the original payment month before applying Medicaid LTSS income rules. " + "The model removes the overlapping amount before allocation to avoid " + "deducting the same business cost twice." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py new file mode 100644 index 00000000000..7461bad4f39 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_nonrecurring_payment(Variable): + value_type = float + entity = Person + label = ( + "Nonrecurring payment for Medicaid LTSS impairment-related items or services" + ) + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "One-time money payments this person made for impairment-related items or services " + "needed and used to work, reported in the month of payment. For a durable " + "item, report the full purchase payment in its actual payment month; unpaid " + "purchase balances are not payments. Multiple payments made in the same " + "month with the same allocation election can be combined. Report the " + "actual amount before reimbursements or business-expense deductions, " + "excluding amounts also reported as monthly payments. Report cash, check, " + "card, or other money payments, not payments in kind. This fact and the " + "payment month's allocation election drive the model's monthly deduction. " + "An ordinary one-time downpayment may be reported separately from monthly " + "installments under 416.976(e)(2). The special combined downpayment-plus-" + "installment allocation election under (e)(3) is outside this input." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py new file mode 100644 index 00000000000..4bb978eb17d --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_nonrecurring_reimbursement(Variable): + value_type = float + entity = Person + label = "Reimbursement for a nonrecurring Medicaid LTSS impairment-related payment" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Amount of this person's nonrecurring impairment-related payment paid " + "by another source or reimbursed, available for reimbursement, or expected " + "to be reimbursed. Report this amount in the original payment month, even " + "if reimbursement arrives later. The model nets this factual amount against " + "the purchase or service payment before applying any allocation election." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py new file mode 100644 index 00000000000..78f00262e89 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_irwe_working_when_paid(Variable): + value_type = bool + entity = Person + label = "Worked when Medicaid LTSS impairment-related payments were made" + definition_period = MONTH + default_value = False + documentation = ( + "Whether this person was working in the month the reported impairment-related " + "payments were made and needed and used the items or services for that work. " + "Report this fact in each payment month, including the original month of a " + "nonrecurring purchase or service payment. The ordinary payment-month rules " + "also require earned income to be received then; the model derives receipt " + "from gross earned income. Payments before work begins, before earned income " + "is first received, or after work stops need separate timing facts and are " + "outside this screen's current expense calculation." + ) + reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" + + def formula(person, period, parameters): + # Transaction facts apply only to the explicitly reported month. + # A zero fallback prevents Core from carrying or uprating past inputs. + return person.empty_array() From d21fd7c22565e1396df511320bfb5679a0c3c50a Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 13:51:33 -0400 Subject: [PATCH 27/34] Add Delaware LTSS budget election leaf and regression coverage --- ...test_medicaid_ltss_financial_invariants.py | 123 +++++- .../medicaid_ltss_assistance_unit_size.yaml | 404 ++++++++++++++++++ ..._ltss_de_post_six_month_budget_election.py | 30 ++ 3 files changed, 554 insertions(+), 3 deletions(-) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index af182120002..b82f27f29cd 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -501,13 +501,13 @@ def _random_couples(): return couples -def _couple_results(couples, raised_spouse=None, reverse=False): +def _couple_results(couples, raised_spouse=None, reverse=False, election=None): situation = {"people": {}, "households": {}, "marital_units": {}} for index, couple in enumerate(couples): names = [f"couple_{index}_a", f"couple_{index}_b"] situation["households"][f"couple_{index}"] = { "members": names, - "state_code": {YEAR: "DE"}, + "state_code": {YEAR: couple.get("state", "DE")}, } situation["marital_units"][f"couple_{index}"] = { "members": list(reversed(names)) if reverse else names, @@ -521,6 +521,10 @@ def _couple_results(couples, raised_spouse=None, reverse=False): couple["same_address_hcbs"] ), } + if election is not None: + situation["marital_units"][f"couple_{index}"][ + "medicaid_ltss_de_post_six_month_budget_election" + ] = month(election) for spouse, name in enumerate(names): situation["people"][name] = { "is_ssi_aged_blind_disabled": {YEAR: True}, @@ -536,8 +540,13 @@ def _couple_results(couples, raised_spouse=None, reverse=False): float(couple["resources"][spouse]) ), } + if couple.get("state", "DE") != "DE": + situation["people"][name][ + "medicaid_ltss_non_delaware_assistance_unit_size" + ] = month(couple["non_delaware_unit"]) if reverse: - situation["people"] = dict(reversed(list(situation["people"].items()))) + for entity in ["people", "households", "marital_units"]: + situation[entity] = dict(reversed(list(situation[entity].items()))) simulation = Simulation(situation=situation) results = {} for variable in reversed(COUPLE_OUTPUTS) if reverse else COUPLE_OUTPUTS: @@ -627,6 +636,114 @@ def test_derived_couple_budget_maximizes_the_number_of_eligible_spouses(couples) ) +@pytest.fixture(scope="module") +def election_couples(): + rng = np.random.default_rng(SEED + 8) + people = [] + for index in range(72): + regime = index % 9 + state = ["DE"] * 6 + ["TX", "WA", "CA"] + couple = { + "state": state[regime], + "same_facility": regime not in [4, 5], + "months": [6, 12, 0, 5, 12, 12, 12, 12, 12][regime], + "same_address_hcbs": regime == 5, + "setting": "HCBS" if regime == 5 else "INSTITUTIONAL", + "earned": rng.uniform(0, 6_000, 2), + "unearned": rng.uniform(0, 1_500, 2), + "resources": rng.uniform(0, 3_000, 2), + "non_delaware_unit": 2 if state[regime] == "TX" else 1, + } + if regime == 0: + # The couple budget admits both; individual budgets admit only + # the spouse whose resource inventory is below $2,000. + couple.update( + earned=rng.uniform(0, 3_000, 2), + unearned=rng.uniform(0, 200, 2), + resources=np.array([rng.uniform(2_001, 2_900), rng.uniform(0, 100)]), + ) + elif regime == 1: + # Both individual budgets pass, but their combined inventory + # exceeds the couple resource limit. + couple.update( + earned=rng.uniform(0, 5_000, 2), + unearned=rng.uniform(0, 200, 2), + resources=rng.uniform(1_501, 2_000, 2), + ) + people.append(couple) + elections = ["INDIVIDUAL", "COUPLE", "NOT_SUPPLIED"] + return ( + people, + _couple_results(people), + { + election: _couple_results(people, election=election) + for election in elections + }, + { + election: _couple_results(people, election=election, reverse=True) + for election in elections + }, + ) + + +@pytest.mark.parametrize("election", ["INDIVIDUAL", "COUPLE", "NOT_SUPPLIED"]) +def test_actual_election_is_deterministic_under_spouse_record_and_calculation_order( + election_couples, election +): + _, _, elected, reversed_results = election_couples + for variable in COUPLE_OUTPUTS: + np.testing.assert_array_equal( + elected[election][variable], + reversed_results[election][variable], + err_msg=variable, + ) + units = elected[election]["medicaid_ltss_assistance_unit_size"].reshape(-1, 2) + np.testing.assert_array_equal(units[:, 0], units[:, 1]) + + +def test_not_supplied_election_reproduces_the_favorable_budget(election_couples): + _, base, elected, _ = election_couples + for variable in COUPLE_OUTPUTS: + np.testing.assert_array_equal( + base[variable], elected["NOT_SUPPLIED"][variable], err_msg=variable + ) + + +@pytest.mark.parametrize("election, unit_size", [("INDIVIDUAL", 1), ("COUPLE", 2)]) +def test_actual_election_changes_outputs_only_in_the_allowed_window( + election_couples, election, unit_size +): + people, base, elected, _ = election_couples + allowed = np.repeat( + [ + couple["state"] == "DE" + and couple["same_facility"] + and couple["months"] >= 6 + for couple in people + ], + 2, + ) + assert allowed.any() and (~allowed).any() + np.testing.assert_array_equal( + elected[election]["medicaid_ltss_assistance_unit_size"], + np.where(allowed, unit_size, base["medicaid_ltss_assistance_unit_size"]), + ) + for variable in COUPLE_OUTPUTS: + np.testing.assert_array_equal( + elected[election][variable][~allowed], + base[variable][~allowed], + err_msg=variable, + ) + # An implementation that ignores every actual election cannot satisfy + # this property: each choice overrides a favorable budget in this cohort. + changed = ( + elected[election]["is_medicaid_ltss_financial_threshold_eligible"] + != base["is_medicaid_ltss_financial_threshold_eligible"] + ) + assert changed[allowed].any() + assert not changed[~allowed].any() + + @pytest.mark.parametrize("raised_spouse", [0, 1]) @pytest.mark.parametrize( "variable", diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml index da2b61d7f71..62832fbcd31 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml @@ -237,3 +237,407 @@ 2026: DE output: medicaid_ltss_assistance_unit_size: [1, 1, 1, 2, 2] + +- name: Case 4, an actual individual election overrides the favorable couple budget independently of spouse order. + period: 2026-09 + input: + people: + high_income: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + low_income: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 500 + reversed_low_income: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 500 + reversed_high_income: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + marital_units: + individual_election: + members: [high_income, low_income] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + reversed_individual_election: + members: [reversed_low_income, reversed_high_income] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + households: + delaware: + members: [high_income, low_income, reversed_low_income, reversed_high_income] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [1, 1, 1, 1] + medicaid_ltss_countable_income: [2_980, 0, 0, 2_980] + medicaid_ltss_countable_resources: [500, 500, 500, 500] + medicaid_ltss_special_income_limit: [2_485, 2_485, 2_485, 2_485] + is_medicaid_ltss_income_eligible: [false, true, true, false] + medicaid_ltss_csra_resource_eligible: [true, true, true, true] + is_medicaid_ltss_financial_threshold_eligible: [false, true, true, false] + +- name: Case 5, an actual couple election overrides individual budgets favored by income, resources, or a tie. + period: 2026-09 + input: + people: + income_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + income_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + resources_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_900 + resources_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_900 + tie_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + tie_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + marital_units: + income: + members: [income_a, income_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + resources: + members: [resources_a, resources_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + tie: + members: [tie_a, tie_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + households: + delaware: + members: [income_a, income_b, resources_a, resources_b, tie_a, tie_b] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [2, 2, 2, 2, 2, 2] + medicaid_ltss_countable_income: [3_980, 3_980, 1_980, 1_980, 1_980, 1_980] + medicaid_ltss_countable_resources: [2_000, 2_000, 3_800, 3_800, 2_000, 2_000] + medicaid_ltss_special_income_limit: [3_727.5, 3_727.5, 3_727.5, 3_727.5, 3_727.5, 3_727.5] + is_medicaid_ltss_income_eligible: [false, false, true, true, true, true] + medicaid_ltss_csra_resource_eligible: [true, true, false, false, true, true] + is_medicaid_ltss_financial_threshold_eligible: [false, false, false, false, true, true] + +- name: Case 6, omitted and explicit not-supplied elections retain favorable budgets and individual budgets on ties. + period: 2026-09 + input: + people: + omitted_couple_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + omitted_couple_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 500 + not_supplied_couple_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 3_000 + medicaid_ltss_individual_countable_resources: 500 + not_supplied_couple_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 0 + medicaid_ltss_individual_countable_resources: 500 + omitted_individual_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + omitted_individual_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + not_supplied_individual_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + not_supplied_individual_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + omitted_tie_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + omitted_tie_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + not_supplied_tie_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + not_supplied_tie_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 1_000 + medicaid_ltss_individual_countable_resources: 1_000 + marital_units: + omitted_couple: + members: [omitted_couple_a, omitted_couple_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + not_supplied_couple: + members: [not_supplied_couple_a, not_supplied_couple_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: NOT_SUPPLIED + omitted_individual: + members: [omitted_individual_a, omitted_individual_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + not_supplied_individual: + members: [not_supplied_individual_a, not_supplied_individual_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: NOT_SUPPLIED + omitted_tie: + members: [omitted_tie_a, omitted_tie_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + not_supplied_tie: + members: [not_supplied_tie_a, not_supplied_tie_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 6 + medicaid_ltss_de_post_six_month_budget_election: NOT_SUPPLIED + households: + delaware: + members: + [omitted_couple_a, omitted_couple_b, not_supplied_couple_a, not_supplied_couple_b, omitted_individual_a, omitted_individual_b, not_supplied_individual_a, not_supplied_individual_b, omitted_tie_a, omitted_tie_b, not_supplied_tie_a, not_supplied_tie_b] + state_code: + 2026: DE + output: + medicaid_ltss_de_post_six_month_budget_election: + [NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED] + medicaid_ltss_assistance_unit_size: [2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1] + medicaid_ltss_countable_income: + [2_980, 2_980, 2_980, 2_980, 1_980, 1_980, 1_980, 1_980, 980, 980, 980, 980] + medicaid_ltss_countable_resources: + [1_000, 1_000, 1_000, 1_000, 1_000, 1_000, 1_000, 1_000, 1_000, 1_000, 1_000, 1_000] + medicaid_ltss_special_income_limit: + [3_727.5, 3_727.5, 3_727.5, 3_727.5, 2_485, 2_485, 2_485, 2_485, 2_485, 2_485, 2_485, 2_485] + is_medicaid_ltss_income_eligible: [true, true, true, true, true, true, true, true, true, true, true, true] + medicaid_ltss_csra_resource_eligible: + [true, true, true, true, true, true, true, true, true, true, true, true] + is_medicaid_ltss_financial_threshold_eligible: + [true, true, true, true, true, true, true, true, true, true, true, true] + +- name: Case 7, elections before six completed months or without supplied duration leave compulsory couple budgets unchanged. + period: 2026-09 + input: + people: + five_month_individual_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + five_month_individual_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + five_month_couple_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + five_month_couple_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + duration_unspecified_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + duration_unspecified_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + marital_units: + five_month_individual: + members: [five_month_individual_a, five_month_individual_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + five_month_couple: + members: [five_month_couple_a, five_month_couple_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 5 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + duration_unspecified: + members: [duration_unspecified_a, duration_unspecified_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + households: + delaware: + members: + [five_month_individual_a, five_month_individual_b, five_month_couple_a, five_month_couple_b, duration_unspecified_a, duration_unspecified_b] + state_code: + 2026: DE + output: + medicaid_ltss_assistance_unit_size: [2, 2, 2, 2, 2, 2] + medicaid_ltss_countable_income: [3_980, 3_980, 3_980, 3_980, 3_980, 3_980] + medicaid_ltss_countable_resources: [2_000, 2_000, 2_000, 2_000, 2_000, 2_000] + is_medicaid_ltss_income_eligible: [false, false, false, false, false, false] + medicaid_ltss_csra_resource_eligible: [true, true, true, true, true, true] + is_medicaid_ltss_financial_threshold_eligible: [false, false, false, false, false, false] + +- name: Case 8, elections cannot alter mandatory HCBS, separate-facility, singleton, or outside-Delaware units. + period: 2026-09 + input: + people: + hcbs_a: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + hcbs_b: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + different_facilities_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + different_facilities_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + single: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + texas_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + texas_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + marital_units: + hcbs: + members: [hcbs_a, hcbs_b] + medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 12 + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + different_facilities: + members: [different_facilities_a, different_facilities_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: false + medicaid_ltss_spouses_months_in_same_institutional_facility: 12 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + single: + members: [single] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 12 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + texas: + members: [texas_a, texas_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 12 + medicaid_ltss_de_post_six_month_budget_election: COUPLE + households: + delaware: + members: [hcbs_a, hcbs_b, different_facilities_a, different_facilities_b, single] + state_code: + 2026: DE + texas: + members: [texas_a, texas_b] + state_code: + 2026: TX + output: + medicaid_ltss_assistance_unit_size: [2, 2, 1, 1, 1, 1, 1] + medicaid_ltss_countable_income: [3_980, 3_980, 1_980, 1_980, 1_980, 2_000, 2_000] + medicaid_ltss_countable_resources: [2_000, 2_000, 1_000, 1_000, 1_000, 1_000, 1_000] + medicaid_ltss_financial_pathway: + [UNMODELED, UNMODELED, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] + is_medicaid_ltss_financial_threshold_eligible: [false, false, true, true, true, true, true] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py new file mode 100644 index 00000000000..2804c0ae6d2 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSDEPostSixMonthBudgetElection(Enum): + NOT_SUPPLIED = "Not supplied" + INDIVIDUAL = "Individual" + COUPLE = "Couple" + + +class medicaid_ltss_de_post_six_month_budget_election(Variable): + value_type = Enum + possible_values = MedicaidLTSSDEPostSixMonthBudgetElection + default_value = MedicaidLTSSDEPostSixMonthBudgetElection.NOT_SUPPLIED + entity = MaritalUnit + label = "Delaware Medicaid LTSS post-six-month budgeting election" + definition_period = MONTH + documentation = ( + "The couple's actual choice to be budgeted as two individuals or " + "as a couple after six completed months together in the same " + "institutional facility (DSSM 20810). This is a reported election, " + "independent of income and resource calculations. NOT_SUPPLIED " + "retains the budget admitting more spouses under both financial " + "thresholds, with individual budgets on a tie. The election has " + "no effect before six completed months, for spouses in different " + "facilities, for same-address HCBS budgeting, for a one-person " + "marital unit, or outside Delaware. In those cases the model " + "continues to derive the mandatory unit from the service and " + "location facts." + ) + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67" From b2e25f32656792a500a71eef9e2808baa402c19d Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 8 Oct 2026 14:01:55 -0400 Subject: [PATCH 28/34] Honor Delaware post-six-month LTSS budgeting elections --- ...aid-ltss-delaware-budget-election.added.md | 1 + .../medicaid-ltss-delaware-irwe.fixed.md | 2 +- .../medicaid_ltss_assistance_unit_size.py | 29 +++++++++++++++---- ..._ltss_de_post_six_month_budget_election.py | 2 +- 4 files changed, 27 insertions(+), 7 deletions(-) create mode 100644 changelog.d/medicaid-ltss-delaware-budget-election.added.md diff --git a/changelog.d/medicaid-ltss-delaware-budget-election.added.md b/changelog.d/medicaid-ltss-delaware-budget-election.added.md new file mode 100644 index 00000000000..35ac1e7dac5 --- /dev/null +++ b/changelog.d/medicaid-ltss-delaware-budget-election.added.md @@ -0,0 +1 @@ +Add a reported individual or couple budgeting election for Delaware Medicaid LTSS couples after six months together in the same facility, retaining favorable-budget selection when unspecified and mandatory budgeting elsewhere. diff --git a/changelog.d/medicaid-ltss-delaware-irwe.fixed.md b/changelog.d/medicaid-ltss-delaware-irwe.fixed.md index c5a098996ec..b55788e0704 100644 --- a/changelog.d/medicaid-ltss-delaware-irwe.fixed.md +++ b/changelog.d/medicaid-ltss-delaware-irwe.fixed.md @@ -1 +1 @@ -Apply qualifying Delaware Medicaid LTSS impairment-related work expenses after the $20 and $65 income exclusions and before halving remaining earnings, using reported expense and age-65 disability-payment history facts. +Apply qualifying Delaware Medicaid LTSS impairment-related work expenses after the $20 and $65 income exclusions and before halving remaining earnings, deriving expenses from payment, reimbursement, business-expense, allocation-election and age-65 disability-payment history facts. diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py index a9bf26a0cf5..deb15d26213 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -13,9 +13,14 @@ class medicaid_ltss_assistance_unit_size(Variable): "the same institutional facility (DSSM 20810). A two-person marital " "unit requesting or receiving services in the same facility must " "use couple budgeting until six completed months there; at six " - "months the model elects whichever budget allows more spouses to " - "pass both income and resource thresholds, choosing individual " - "budgets in a tie. Both spouses receive the same election. HCBS " + "months the couple's reported " + "medicaid_ltss_de_post_six_month_budget_election selects individual " + "or couple budgeting. When that election is NOT_SUPPLIED, the " + "model uses whichever budget allows more spouses to pass both " + "income and resource thresholds, choosing individual budgets in " + "a tie. Outside that same-facility post-six-month window, a " + "reported election has no effect. Both spouses receive the same " + "budget. HCBS " "spouses requesting or receiving services at the same address use " "couple standards without a six-month election. Other Delaware " "applicants use an individual budget. This derives the budgeting " @@ -54,7 +59,7 @@ def formula_2026_01_01(person, period, parameters): period, ) - # The election compares both candidate budgets without reading any + # The fallback compares both candidate budgets without reading any # output dependent on the elected unit, avoiding a calculation cycle. individual_resources = person( "medicaid_ltss_individual_countable_resources", period @@ -71,8 +76,22 @@ def formula_2026_01_01(person, period, parameters): ) & (couple_resources <= resources_limit.couple) couple_eligible_spouses = 2 * couple_passes favorable_couple_budget = couple_eligible_spouses > individual_eligible_spouses + election = person.marital_unit( + "medicaid_ltss_de_post_six_month_budget_election", period + ) + election_values = election.possible_values + elected_couple_budget = select( + [ + election == election_values.INDIVIDUAL, + election == election_values.COUPLE, + ], + [False, True], + default=favorable_couple_budget, + ) + # DSSM 20810 allows an election only after six completed months in + # the same facility; mandatory institutional and HCBS units prevail. institutional_couple = same_facility & ( - (months_together < 6) | favorable_couple_budget + (months_together < 6) | elected_couple_budget ) delaware_unit = where(same_address_hcbs | institutional_couple, 2, 1) return where( diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py index 2804c0ae6d2..f6672a92909 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py @@ -2,9 +2,9 @@ class MedicaidLTSSDEPostSixMonthBudgetElection(Enum): - NOT_SUPPLIED = "Not supplied" INDIVIDUAL = "Individual" COUPLE = "Couple" + NOT_SUPPLIED = "Not supplied" class medicaid_ltss_de_post_six_month_budget_election(Variable): From 659efb4f669cd09dd5d1435abd3fcdbd43285337 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 14 Oct 2026 20:48:54 -0400 Subject: [PATCH 29/34] Exclude qualifying Texas LTSS interest and dividends --- .../is_medicaid_ltss_income_eligible.yaml | 79 +++++++++++++++++++ .../medicaid_ltss_couple_countable_income.py | 11 ++- ...dicaid_ltss_individual_countable_income.py | 9 ++- ...dicaid_ltss_qit_covered_unearned_income.py | 2 + ...d_ltss_unearned_income_deposited_to_qit.py | 2 + ...d_ltss_countable_interest_and_dividends.py | 20 +++++ ...id_ltss_excluded_interest_and_dividends.py | 38 +++++++++ 7 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_countable_interest_and_dividends.py create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_excluded_interest_and_dividends.py diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 48bed305b64..36df548054c 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -1635,3 +1635,82 @@ output: medicaid_ltss_impairment_related_work_expenses: [400, 0, 500] medicaid_ltss_countable_income: [2485, 2685, 2435] + + +- name: Texas excludes qualifying investment returns but counts pensions and other-resource returns. + period: 2026-07 + input: + people: + annual_interest: + pension_income: {2026: 34200} + interest_income: {2026: 2400} + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + pension_only: + pension_income: {2026: 36600} + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + monthly_dividends: + medicaid_ltss_reported_gross_unearned_income: 3250 + medicaid_ltss_reported_dividend_income: 400 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + other_resource_interest: + medicaid_ltss_reported_gross_unearned_income: 3050 + medicaid_ltss_reported_interest_income: 200 + tx_medicaid_ltss_countable_interest_and_dividends: 200 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + countable_pension_qit: + medicaid_ltss_reported_gross_unearned_income: 3600 + medicaid_ltss_reported_interest_income: 200 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + households: + household: + members: [annual_interest, pension_only, monthly_dividends, other_resource_interest, countable_pension_qit] + state_code: {2026: TX} + output: + # 34,200 / 12 + 2,400 / 12 = 3,050; eligibility excludes the 200 interest. + # 3,250 - 400 = 2,850; E-3331.3 keeps the other-resource 200 countable. + # A valid 500 pension deposit gives 3,600 - 500 - 200 = 2,900. + tx_medicaid_ltss_excluded_interest_and_dividends: [200, 0, 400, 0, 200] + medicaid_ltss_individual_countable_income: [2850, 3050, 2850, 3050, 2900] + is_medicaid_ltss_income_eligible: [true, false, true, false, true] + is_medicaid_ltss_financial_threshold_eligible: [true, false, true, false, true] + +- name: Texas couple budgets exclude each spouses qualifying investment receipts. + period: 2026-07 + input: + people: + spouse_one: + medicaid_ltss_reported_gross_unearned_income: 3200 + medicaid_ltss_reported_interest_income: 200 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + spouse_two: + medicaid_ltss_reported_gross_unearned_income: 3064 + medicaid_ltss_reported_dividend_income: 100 + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + marital_units: + couple: + members: [spouse_one, spouse_two] + households: + household: + members: [spouse_one, spouse_two] + state_code: {2026: TX} + output: + # 3,200 + 3,064 - 200 - 100 = 5,964, the 2026 Texas couple SIL. + tx_medicaid_ltss_excluded_interest_and_dividends: [200, 100] + medicaid_ltss_couple_countable_income: [5964, 5964] + medicaid_ltss_countable_income: [5964, 5964] + is_medicaid_ltss_income_eligible: [true, true] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py index 1db2d279453..a1a6b1e73c2 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py @@ -18,9 +18,11 @@ class medicaid_ltss_couple_countable_income(Variable): "20240.1 and 20240.3; 20 CFR 416.1112(c)(4)-(7)). Each person's " "expenses are limited to their own earnings before aggregation. " "Other modeled states use the combined income remaining " - "outside qualified income trusts without exclusions." + "outside qualified income trusts. Texas also excludes qualifying " + "interest and dividends under MEPD E-3331.1 and E-3331.2." ) reference = ( + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/e-3300-sources-unearned-income", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", @@ -59,6 +61,11 @@ def formula_2026_01_01(person, period, parameters): * p.de.income.earned_income_countable_rate ) delaware_budget = unearned - unearned_disregard + countable_earned + texas_excluded = person.marital_unit.sum( + person("tx_medicaid_ltss_excluded_interest_and_dividends", period) + ) return where( - state == state.possible_values.DE, delaware_budget, earned + unearned + state == state.possible_values.DE, + delaware_budget, + max_(earned + unearned - texas_excluded, 0), ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py index 552e95f8e17..d6b5f8f587b 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py @@ -19,9 +19,11 @@ class medicaid_ltss_individual_countable_income(Variable): "$20 exclusion (DSSM 20990). Washington removes representable " "WAC 182-513-1340 source exclusions before the SIL comparison " "and income budget. Texas uses income remaining outside the " - "qualified income trust." + "qualified income trust, excluding qualifying interest and dividends " + "under MEPD E-3331.1 and E-3331.2." ) reference = ( + "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/e-3300-sources-unearned-income", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", @@ -66,8 +68,11 @@ def formula_2026_01_01(person, period, parameters): ordinary_budget, ) washington_excluded = person("medicaid_ltss_wa_excluded_income", period) + texas_excluded = person( + "tx_medicaid_ltss_excluded_interest_and_dividends", period + ) return where( state == state.possible_values.DE, delaware_budget, - max_(gross - washington_excluded, 0), + max_(gross - washington_excluded - texas_excluded, 0), ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py index 91b57cd5e9b..e85ca7353ab 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py @@ -9,6 +9,8 @@ class medicaid_ltss_qit_covered_unearned_income(Variable): definition_period = MONTH default_value = 0 documentation = ( + "For Texas, report only non-exempt income: exclude interest and " + "dividends already exempt under MEPD E-3331.1 and E-3331.2. " "Actual monthly unearned income from the sources identified in the " "qualified income trust instrument, such as the applicant's private " "pension. This is a source amount before deposits, and a subset of " diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py index 80632d8d30e..33687fc0859 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py @@ -9,6 +9,8 @@ class medicaid_ltss_unearned_income_deposited_to_qit(Variable): definition_period = MONTH default_value = 0 documentation = ( + "For Texas, report only non-exempt income: exclude interest and " + "dividends already exempt under MEPD E-3331.1 and E-3331.2. " "Each person's own monthly unearned income validly deposited " "into a qualified income trust. Defaults to no deposits. The " "model excludes these deposits from gross unearned income without " diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_countable_interest_and_dividends.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_countable_interest_and_dividends.py new file mode 100644 index 00000000000..63aae6a8249 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_countable_interest_and_dividends.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class tx_medicaid_ltss_countable_interest_and_dividends(Variable): + value_type = float + entity = Person + label = "Texas Medicaid LTSS countable interest and dividends from other resources" + unit = USD + definition_period = MONTH + default_value = 0 + documentation = ( + "Monthly interest and dividends included in the investment-income " + "leaves that remain countable under MEPD E-3331.3 because they arise " + "from resources outside E-3331.1 and E-3331.2. Report the amount " + "countable under the handbook's treatment of those other resources. " + "The default assumes the reported investment income arises from " + "fully countable resources or the specified excluded resources. " + "This is a subset of gross investment receipts, not additional income." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/e-3300-sources-unearned-income" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_excluded_interest_and_dividends.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_excluded_interest_and_dividends.py new file mode 100644 index 00000000000..77afc34d319 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_excluded_interest_and_dividends.py @@ -0,0 +1,38 @@ +from policyengine_us.model_api import * + + +class tx_medicaid_ltss_excluded_interest_and_dividends(Variable): + value_type = float + entity = Person + label = "Texas Medicaid LTSS excluded interest and dividends" + unit = USD + definition_period = MONTH + documentation = ( + "MEPD E-3331.1 excludes interest and dividends on fully countable " + "resources from the eligibility budget regardless of amount or " + "frequency; E-3331.2 excludes those on its specified excluded or " + "partially excluded resources. E-3331.3 income that remains " + "countable is reported separately and is not excluded here. " + "This eligibility screen does not compute co-payment budgets. " + "Other E-series exempt-income categories are outside this screen. " + "Valid QIT deposits and covered sources must exclude these already " + "exempt receipts to avoid counting the same exclusion twice." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/e-3300-sources-unearned-income" + + def formula_2026_01_01(person, period, parameters): + state = person.household("state_code", period) + investment = max_(person("medicaid_ltss_interest_income", period), 0) + max_( + person("medicaid_ltss_dividend_income", period), 0 + ) + countable = max_( + person("tx_medicaid_ltss_countable_interest_and_dividends", period), 0 + ) + remaining = max_( + person("medicaid_ltss_qit_adjusted_unearned_income", period), 0 + ) + return where( + state == state.possible_values.TX, + min_(max_(investment - countable, 0), remaining), + 0, + ) From 5adbd3e96fcb490b2bb68a91026c7ccb0cf29bc7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 14 Oct 2026 23:33:44 -0400 Subject: [PATCH 30/34] Parameterize Medicaid LTSS policy durations and resource regimes --- .../same_facility_election_months.yaml | 11 ++++ .../federal/csra/snapshot_share.yaml | 13 +++++ .../federal/irwe/allocation_months.yaml | 11 ++++ .../wa/csra/maximum_regime_start.yaml | 11 ++++ .../wa/csra/pre_1989_resource_share.yaml | 11 ++++ .../wa/csra/snapshot_regime_start.yaml | 11 ++++ ...test_medicaid_ltss_financial_invariants.py | 57 +++++++++++++++++++ .../is_medicaid_ltss_income_eligible.yaml | 52 +++++++++++++++++ .../medicaid_ltss_assistance_unit_size.yaml | 42 ++++++++++++++ .../medicaid_ltss_assistance_unit_size.py | 3 +- .../financial/medicaid_ltss_csra.py | 10 +++- .../medicaid_ltss_csra_resource_eligible.py | 4 +- ...cluded_impairment_related_work_expenses.py | 5 +- ...d_ltss_impairment_related_work_expenses.py | 21 +++++-- ...recent_institutionalization_start_month.py | 4 +- ..._recent_institutionalization_start_year.py | 4 +- 16 files changed, 257 insertions(+), 13 deletions(-) create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/assistance_unit/same_facility_election_months.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/snapshot_share.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/irwe/allocation_months.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/maximum_regime_start.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/pre_1989_resource_share.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/snapshot_regime_start.yaml diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/assistance_unit/same_facility_election_months.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/assistance_unit/same_facility_election_months.yaml new file mode 100644 index 00000000000..71869b44ef5 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/assistance_unit/same_facility_election_months.yaml @@ -0,0 +1,11 @@ +description: Delaware sets this minimum number of completed months in the same institutional facility before spouses can elect their assistance unit under the Medicaid long-term services and supports program. +values: + 2026-01-01: 6 + +metadata: + unit: month + period: year + label: Delaware Medicaid LTSS same-facility budget election duration + reference: + - title: DSSM 20810 - Treatment of Couples, 16 DE Admin Code 20000 + href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/snapshot_share.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/snapshot_share.yaml new file mode 100644 index 00000000000..e7acfce3e2c --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/snapshot_share.yaml @@ -0,0 +1,13 @@ +description: The Department of Health and Human Services sets this share of the couple's snapshot resources as the spousal share under the Medicaid long-term services and supports program. +values: + 1989-09-30: 0.5 + +metadata: + unit: /1 + period: year + label: Medicaid LTSS community spouse snapshot resource share + reference: + - title: 42 USC 1396r-5(c)(1)(A)(ii) and (f)(2)(A) - Spousal share + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#c_1_A_ii + - title: WAC 182-513-1355(3)(b)(i) - Spousal share + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/irwe/allocation_months.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/irwe/allocation_months.yaml new file mode 100644 index 00000000000..720026a55d0 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/irwe/allocation_months.yaml @@ -0,0 +1,11 @@ +description: The Social Security Administration sets this number of consecutive months for allocating a nonrecurring impairment-related work expense under the Medicaid long-term services and supports program. +values: + 1980-12-01: 12 + +metadata: + unit: month + period: year + label: Medicaid LTSS impairment-related work expense allocation duration + reference: + - title: 20 CFR 416.976(e)(2) - Nonrecurring expenses + href: https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/maximum_regime_start.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/maximum_regime_start.yaml new file mode 100644 index 00000000000..262b1c42c65 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/maximum_regime_start.yaml @@ -0,0 +1,11 @@ +description: Washington sets this onset month, encoded as YYYYMM, as the start of the federal maximum community spouse resource allowance regime under the Medicaid long-term services and supports program. +values: + 1989-10-01: 198910 + +metadata: + unit: /1 + period: year + label: Washington Medicaid LTSS federal maximum CSRA regime start month + reference: + - title: WAC 182-513-1355(2)(b) and (3)(a) - Periods beginning on or after October 1, 1989 + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/pre_1989_resource_share.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/pre_1989_resource_share.yaml new file mode 100644 index 00000000000..b492729b5d7 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/pre_1989_resource_share.yaml @@ -0,0 +1,11 @@ +description: Washington includes this share of applicant-sole and jointly owned resources for institutionalization periods beginning before the federal maximum allowance regime under the Medicaid long-term services and supports program. +values: + 1989-10-01: 0.5 + +metadata: + unit: /1 + period: year + label: Washington Medicaid LTSS pre-1989 countable resource share + reference: + - title: WAC 182-513-1355(2)(a) - Periods beginning before October 1, 1989 + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/snapshot_regime_start.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/snapshot_regime_start.yaml new file mode 100644 index 00000000000..f365a8c09d1 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/snapshot_regime_start.yaml @@ -0,0 +1,11 @@ +description: Washington sets this onset month, encoded as YYYYMM, as the start of the snapshot-based community spouse resource allowance regime under the Medicaid long-term services and supports program. +values: + 2003-08-01: 200308 + +metadata: + unit: /1 + period: year + label: Washington Medicaid LTSS snapshot CSRA regime start month + reference: + - title: WAC 182-513-1355(3)(b) - Periods beginning on or after August 1, 2003 + href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355 diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index b82f27f29cd..7c6ee27717c 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -9,6 +9,8 @@ import numpy as np import pytest +from policyengine_core.reforms import Reform + from policyengine_us import Simulation from policyengine_us.system import system @@ -1152,3 +1154,58 @@ def test_more_nonrecurring_expense_never_raises_countable_income(allocate): ) assert (changed <= base + 0.001).all() assert (changed < base - 0.001).any() + + +def test_irwe_allocation_preserves_the_payment_month_rule_after_a_duration_reduction(): + # YAML inline parameter overrides apply a scalar across all test years. + # A dated reform is needed to distinguish a purchase's allocation rule + # from the current rule. This adds one isolated reform model, no dataset. + path = ( + "gov.hhs.medicaid.eligibility.long_term_care.financial." + "federal.irwe.allocation_months" + ) + reform = Reform.from_dict({path: {"2026-07-01": 6}}) + assessment = "2026-09" + simulation = Simulation( + reform=reform, + situation={ + "people": { + "older_purchase": { + "medicaid_ltss_reported_gross_earned_income": { + "2026-02": 10_000, + assessment: 10_000, + }, + "medicaid_ltss_irwe_nonrecurring_payment": {"2026-02": 4_800}, + "medicaid_ltss_irwe_allocate_over_12_months": {"2026-02": True}, + "medicaid_ltss_irwe_working_when_paid": {"2026-02": True}, + }, + "newer_purchase": { + "medicaid_ltss_reported_gross_earned_income": { + "2026-07": 10_000, + assessment: 10_000, + }, + "medicaid_ltss_irwe_nonrecurring_payment": {"2026-07": 4_800}, + "medicaid_ltss_irwe_allocate_over_12_months": {"2026-07": True}, + "medicaid_ltss_irwe_working_when_paid": {"2026-07": True}, + }, + }, + "marital_units": { + "older": {"members": ["older_purchase"]}, + "newer": {"members": ["newer_purchase"]}, + }, + "households": { + "household": { + "members": ["older_purchase", "newer_purchase"], + "state_code": {"2026": "DE"}, + }, + }, + }, + ) + # February's purchase remains allocated through its eighth month at + # $4,800 / 12 = $400. July's purchase uses the new $4,800 / 6 = $800. + np.testing.assert_allclose( + simulation.calculate( + "medicaid_ltss_impairment_related_work_expenses", assessment + ), + [400, 800], + ) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 36df548054c..3b62b8669cb 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -1714,3 +1714,55 @@ medicaid_ltss_couple_countable_income: [5964, 5964] medicaid_ltss_countable_income: [5964, 5964] is_medicaid_ltss_income_eligible: [true, true] + + +- name: Case 28, the work-expense allocation parameter controls the monthly divisor and final allocated month. + period: 2026-07 + input: + gov.hhs.medicaid.eligibility.long_term_care.financial.federal.irwe.allocation_months: 6 + people: + sixth_month: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + medicaid_ltss_reported_gross_earned_income: + 2026-02: 5_455 + 2026-07: 5_455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-02: 3_600 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-02: true + medicaid_ltss_irwe_working_when_paid: + 2026-02: true + seventh_month: + age: + 2026: 60 + meets_ssi_disability_criteria: + 2026: true + medicaid_ltss_reported_gross_earned_income: + 2026-01: 5_455 + 2026-07: 5_455 + medicaid_ltss_irwe_nonrecurring_payment: + 2026-01: 3_600 + medicaid_ltss_irwe_allocate_over_12_months: + 2026-01: true + medicaid_ltss_irwe_working_when_paid: + 2026-01: true + marital_units: + sixth_month: + members: [sixth_month] + seventh_month: + members: [seventh_month] + households: + household: + members: [sixth_month, seventh_month] + state_code: + 2026: DE + output: + # A $3,600 purchase allocated over six months gives $600 in the sixth + # month and $0 in the seventh. The standard unreformed divisor is twelve. + medicaid_ltss_impairment_related_work_expenses: [600, 0] + medicaid_ltss_excluded_impairment_related_work_expenses: [600, 0] + # (5,455 - 20 - 65 - 600) / 2 = 2,385; without IRWE it is 2,685. + medicaid_ltss_countable_income: [2_385, 2_685] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml index 62832fbcd31..f06e4f10325 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml @@ -641,3 +641,45 @@ medicaid_ltss_financial_pathway: [UNMODELED, UNMODELED, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] is_medicaid_ltss_financial_threshold_eligible: [false, false, true, true, true, true, true] + + +- name: Case 9, the same-facility election duration parameter controls the individual-budget election boundary. + period: 2026-09 + input: + gov.hhs.medicaid.eligibility.long_term_care.financial.de.assistance_unit.same_facility_election_months: 3 + people: + before_a: + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + before_b: + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + boundary_a: + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + boundary_b: + medicaid_ltss_reported_gross_unearned_income: 2_000 + medicaid_ltss_individual_countable_resources: 1_000 + marital_units: + before: + members: [before_a, before_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 2 + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + boundary: + members: [boundary_a, boundary_b] + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + medicaid_ltss_spouses_months_in_same_institutional_facility: 3 + medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + households: + household: + members: [before_a, before_b, boundary_a, boundary_b] + state_code: + 2026: DE + output: + # The three-month reform makes the reported individual election effective + # at month three, while month two still uses the compulsory couple budget. + medicaid_ltss_assistance_unit_size: [2, 2, 1, 1] + # A couple shares one $20 exclusion: 4,000 - 20 = 3,980. + # Each individual receives $20: 2,000 - 20 = 1,980. + medicaid_ltss_countable_income: [3_980, 3_980, 1_980, 1_980] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py index deb15d26213..1d3d1dd6253 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -91,7 +91,8 @@ def formula_2026_01_01(person, period, parameters): # DSSM 20810 allows an election only after six completed months in # the same facility; mandatory institutional and HCBS units prevail. institutional_couple = same_facility & ( - (months_together < 6) | elected_couple_budget + (months_together < p.de.assistance_unit.same_facility_election_months) + | elected_couple_budget ) delaware_unit = where(same_address_hcbs | institutional_couple, 2, 1) return where( diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py index fc2cb30ac02..464ecae4652 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py @@ -53,7 +53,10 @@ def formula_2026_01_01(person, period, parameters): period, ), ) - modern = min_(max_(snapshot / 2, floor), p.federal.csra.maximum) + modern = min_( + max_(snapshot * p.federal.csra.snapshot_share, floor), + p.federal.csra.maximum, + ) start_year = person( "wa_medicaid_ltss_most_recent_institutionalization_start_year", period ) @@ -64,7 +67,10 @@ def formula_2026_01_01(person, period, parameters): # WAC 182-513-1355(2)(a), (3)(a), and (3)(b). Both statutory # boundaries are the first day of the month, so year/month suffices. allowance = select( - [washington & (onset < 198910), washington & (onset < 200308)], + [ + washington & (onset < p.wa.csra.maximum_regime_start), + washington & (onset < p.wa.csra.snapshot_regime_start), + ], [0, p.federal.csra.maximum], default=modern, ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index 084beee491b..de0fb526134 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -114,9 +114,9 @@ def formula_2026_01_01(person, period, parameters): pre_1989_resources = ( person("wa_medicaid_ltss_solely_owned_countable_resources", period) + person("wa_medicaid_ltss_jointly_owned_countable_resources", period) - ) / 2 + ) * p.wa.csra.pre_1989_resource_share community_spouse_eligible = where( - (state == states.WA) & (onset < 198910), + (state == states.WA) & (onset < p.wa.csra.maximum_regime_start), (assistance_unit_size == 1) & (pre_1989_resources <= resource_limit), community_spouse_eligible, ) & ((state != states.WA) | valid_onset) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py index 44f9c802630..da65bd59092 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py @@ -28,11 +28,12 @@ class medicaid_ltss_excluded_impairment_related_work_expenses(Variable): def formula_2026_01_01(person, period, parameters): disabled = person("meets_ssi_disability_criteria", period.this_year) blind = person("is_blind", period.this_year) - under_65 = person("age", period.this_year) < 65 + aged_threshold = parameters(period).gov.ssa.ssi.eligibility.aged_threshold + below_aged_threshold = person("age", period.this_year) < aged_threshold qualifying_prior_receipt = person( "medicaid_ltss_received_disability_payments_before_age_65", period ) - eligible = disabled & ~blind & (under_65 | qualifying_prior_receipt) + eligible = disabled & ~blind & (below_aged_threshold | qualifying_prior_receipt) expenses = max_( person("medicaid_ltss_impairment_related_work_expenses", period), 0 ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py index 6ad07a9e3b3..5291aba2439 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py @@ -45,9 +45,19 @@ def formula_2026_01_01(person, period, parameters): if (working & (monthly > 0)).any(): received_earnings = person("medicaid_ltss_gross_earned_income", period) > 0 expenses = where(working & received_earnings, monthly, 0) - # 416.976(e)(2): payment month plus the following eleven months. - for months_ago in range(12): + # 416.976(e)(2): the allocation begins in the payment month. + allocation_parameter = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal.irwe.allocation_months + # A shorter new allocation rule must not truncate older purchases. + # Future policy values do not extend the current lookback. + allocation_months = max( + int(value.value) + for value in allocation_parameter.values_list + if value.instant_str <= str(period.start) and value.value is not None + ) + for months_ago in range(allocation_months): paid_month = period.offset(-months_ago) + # Keep each purchase on the allocation rule in its payment month. + paid_allocation_months = int(allocation_parameter(paid_month.start)) allocated = person("medicaid_ltss_irwe_allocate_over_12_months", paid_month) paid_while_working = person( "medicaid_ltss_irwe_working_when_paid", paid_month @@ -66,7 +76,8 @@ def formula_2026_01_01(person, period, parameters): ), 0, ) - applies = paid_while_working & (allocated | (months_ago == 0)) + allocated_month = allocated & (months_ago < paid_allocation_months) + applies = paid_while_working & (allocated_month | (months_ago == 0)) # No earnings history is needed for months with no usable payment. if not (applies & (net_payment > 0)).any(): continue @@ -74,7 +85,9 @@ def formula_2026_01_01(person, period, parameters): person("medicaid_ltss_gross_earned_income", paid_month) > 0 ) deduction = where( - allocated, net_payment / 12, net_payment if months_ago == 0 else 0 + allocated_month, + net_payment / paid_allocation_months, + net_payment if months_ago == 0 else 0, ) expenses += where(paid_while_working & paid_with_earnings, deduction, 0) return expenses diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py index cfcddd6cb8e..f19635b8cb1 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_month.py @@ -12,7 +12,9 @@ class wa_medicaid_ltss_most_recent_institutionalization_start_month(Variable): "institutionalization began. Together with the corresponding start " "year, this is the historical onset fact used by WAC " "182-513-1355(2)-(4), rather than a caller-selected allocation regime. " - "The default year/month is August 2003, which preserves the modern " + "The caller-facing default year/month is August 2003, matching " + "the YYYYMM value of the financial.wa.csra.snapshot_regime_start " + "parameter at introduction. This preserves the modern " "floor/half/cap branch for existing callers who do not report history. " "Supply the actual onset for legacy continuous periods, and replace " "it after a break of at least 30 consecutive days. Repeat the onset " diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py index 87510875352..39f391f11da 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_most_recent_institutionalization_start_year.py @@ -12,7 +12,9 @@ class wa_medicaid_ltss_most_recent_institutionalization_start_year(Variable): "institutionalization began. Together with the corresponding start " "month, this is the historical onset fact used by WAC " "182-513-1355(2)-(4), rather than a caller-selected allocation regime. " - "The default year/month is August 2003, which preserves the modern " + "The caller-facing default year/month is August 2003, matching " + "the YYYYMM value of the financial.wa.csra.snapshot_regime_start " + "parameter at introduction. This preserves the modern " "floor/half/cap branch for existing callers who do not report history. " "Supply the actual onset for legacy continuous periods, and replace " "it after a break of at least 30 consecutive days. Repeat the onset " From 6475010ea23e97a224cee030be173fcba671865c Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 14 Oct 2026 23:40:25 -0400 Subject: [PATCH 31/34] Project the LTSS home equity minimum using CMS indexing --- .../home_equity/minimum_limit.yaml | 33 +++++++++-------- .../parameters/uprating_extensions.py | 37 ++++++++++--------- ...est_medicaid_home_equity_limit_indexing.py | 26 ++++++++++--- ...test_medicaid_ltss_financial_invariants.py | 26 ++++++------- 4 files changed, 70 insertions(+), 52 deletions(-) diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml index 950a7992ab9..d8967ec7f17 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml @@ -1,5 +1,11 @@ -description: The Department of Health and Human Services applies this federal minimum limit on home equity for Medicaid long-term care eligibility in states that do not elect a higher limit. +description: The Department of Health and Human Services sets this federal minimum home equity limit under the Medicaid long-term services and supports program. values: + 2020-01-01: 595_000 + 2021-01-01: 603_000 + 2022-01-01: 636_000 + # CMS annual CPI increases: 8.2% for 2023 and 3.7% for 2024. + 2023-01-01: 688_000 + 2024-01-01: 713_000 2025-01-01: 730_000 2026-01-01: 752_000 @@ -7,23 +13,20 @@ metadata: unit: currency-USD period: year label: Medicaid long-term care federal minimum home equity limit - # 42 USC 1396p(f)(1)(C) increases the limit from year to year by CPI-U, - # rounded to the nearest $1,000. CMS applies the September-to-September - # change each January 1, which reproduces the published 2026 value from - # 2025. From 2028 the consuming formula caps the result at the - # non-agricultural maximum under P.L. 119-21 section 71108. - uprating: - parameter: gov.bls.cpi.cpi_u - at_defined_interval: - start: "0001-09-01" - end: "0002-09-01" - enactment: "0003-01-01" - rounding: - type: nearest - interval: 1_000 + # Projected in uprating_extensions.py using CMS's September-to-September + # CPI-U increase rounded to 0.1%, then rounding the amount to $1,000. + # The consuming formula caps this minimum at the non-agricultural maximum. reference: + - title: MEPD Handbook F-3600 - Substantial Home Equity + href: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-3600-substantial-home-equity - title: 42 USC 1396p(f)(1)(A) and (C) - Disqualification for long-term care assistance for individuals with substantial home equity href: https://www.law.cornell.edu/uscode/text/42/1396p#f_1 + - title: Updated 2020 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, June 24, 2020 + href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib062420-new.pdf#page=2 + - title: Updated 2021 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, June 4, 2021 + href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib060421.pdf#page=2 + - title: Updated 2022 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, June 2, 2022 + href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib06022022.pdf#page=2 - title: Updated 2025 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, May 28, 2025 href: https://www.medicaid.gov/federal-policy-guidance/downloads/cib05282025.pdf#page=2 - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 diff --git a/policyengine_us/parameters/uprating_extensions.py b/policyengine_us/parameters/uprating_extensions.py index c1c598de334..50c38200930 100644 --- a/policyengine_us/parameters/uprating_extensions.py +++ b/policyengine_us/parameters/uprating_extensions.py @@ -625,9 +625,9 @@ def extend_medicaid_home_equity_limits( ) -> None: """Project the CPI-indexed Medicaid long-term care home equity limits. - Each year after the last CMS-published value, the agricultural home - equity limit becomes the prior year's limit increased by that year's - CPI-U percentage (see ``get_cms_cpi_u_percentage_increase``), rounded to + Each year after their last CMS-published values, the minimum and + agricultural home equity limits become their prior year's limit increased + by that year's CPI-U percentage (see ``get_cms_cpi_u_percentage_increase``), rounded to the nearest $1,000, effective January 1. Before P.L. 119-21 section 71108 caps other homes at $1,000,000 beginning in 2028, the agricultural and non-agricultural limits are the same indexed maximum, so each year before @@ -641,21 +641,24 @@ def extend_medicaid_home_equity_limits( home_equity = parameters.gov.hhs.medicaid.eligibility.long_term_care.home_equity cpi = parameters.gov.bls.cpi agricultural = home_equity.agricultural_limit - first_projected_year = 1 + max( - int(value.instant_str[:4]) for value in agricultural.values_list - ) - for year in range(first_projected_year, end_year + 1): - agricultural.update( - period=f"year:{year}-01-01:1", - value=adjust_home_equity_limit_for_inflation( - agricultural(f"{year - 1}-01-01"), - get_cms_cpi_u_percentage_increase(cpi, year), - ), + percentages = {} + for parameter in (home_equity.minimum_limit, agricultural): + first_projected_year = 1 + max( + int(value.instant_str[:4]) for value in parameter.values_list + ) + for year in range(first_projected_year, end_year + 1): + if year not in percentages: + percentages[year] = get_cms_cpi_u_percentage_increase(cpi, year) + parameter.update( + period=f"year:{year}-01-01:1", + value=adjust_home_equity_limit_for_inflation( + parameter(f"{year - 1}-01-01"), percentages[year] + ), + ) + parameter.update( + start=instant(f"{end_year}-01-01"), + value=parameter(f"{end_year}-01-01"), ) - agricultural.update( - start=instant(f"{end_year}-01-01"), - value=agricultural(f"{end_year}-01-01"), - ) non_agricultural = home_equity.limit encoded_years = { int(value.instant_str[:4]) for value in non_agricultural.values_list diff --git a/policyengine_us/tests/core/test_medicaid_home_equity_limit_indexing.py b/policyengine_us/tests/core/test_medicaid_home_equity_limit_indexing.py index 81fb207e5d2..3a8c6bbbde9 100644 --- a/policyengine_us/tests/core/test_medicaid_home_equity_limit_indexing.py +++ b/policyengine_us/tests/core/test_medicaid_home_equity_limit_indexing.py @@ -79,6 +79,8 @@ def test_a_falling_index_is_not_an_increase(current, percentage): def test_published_limits_are_parameter_values(): + for year, (minimum, _) in PUBLISHED_LIMITS.items(): + assert HOME_EQUITY.minimum_limit(f"{year}-01-01") == minimum for year in (2025, 2026): assert HOME_EQUITY.limit(f"{year}-01-01") == PUBLISHED_LIMITS[year][1] assert ( @@ -87,15 +89,17 @@ def test_published_limits_are_parameter_values(): ) -def test_agricultural_limit_is_projected_year_to_year_on_january_1(): +@pytest.mark.parametrize("name", ["minimum_limit", "agricultural_limit"]) +def test_indexed_limits_are_projected_year_to_year_on_january_1(name): + parameter = getattr(HOME_EQUITY, name) for year in range(2027, 2041): - current = HOME_EQUITY.agricultural_limit(f"{year}-01-01") + current = parameter(f"{year}-01-01") assert current == adjust_home_equity_limit_for_inflation( - HOME_EQUITY.agricultural_limit(f"{year - 1}-01-01"), + parameter(f"{year - 1}-01-01"), get_cms_cpi_u_percentage_increase(CPI, year), ) for month in ["02", "07", "12"]: - assert HOME_EQUITY.agricultural_limit(f"{year}-{month}-01") == current + assert parameter(f"{year}-{month}-01") == current def test_non_agricultural_limit_is_the_indexed_maximum_until_the_2028_cap(): @@ -134,11 +138,17 @@ def test_chassis_screen_reads_each_years_agricultural_limit(): @pytest.mark.parametrize("agricultural_published_through", [2026, 2027]) -def test_non_agricultural_fill_follows_its_own_coverage( +@pytest.mark.parametrize("minimum_published_through", [2026, 2027]) +def test_each_limit_follows_its_own_published_coverage( agricultural_published_through, + minimum_published_through, ): # Publishing the 2027 agricultural limit before the non-agricultural one # must not leave the non-agricultural 2027 limit at its 2026 value. + minimum = {"2025-01-01": 730_000, "2026-01-01": 752_000} + if minimum_published_through == 2027: + # A separately published value takes precedence over the projection. + minimum["2027-01-01"] = 776_000 agricultural = {"2025-01-01": 1_097_000, "2026-01-01": 1_130_000} if agricultural_published_through == 2027: agricultural["2027-01-01"] = 1_164_000 @@ -158,6 +168,7 @@ def test_non_agricultural_fill_follows_its_own_coverage( "eligibility": { "long_term_care": { "home_equity": { + "minimum_limit": {"values": minimum}, "agricultural_limit": {"values": agricultural}, "limit": {"values": non_agricultural}, } @@ -186,3 +197,8 @@ def test_non_agricultural_fill_follows_its_own_coverage( ) == adjust_home_equity_limit_for_inflation( home_equity.agricultural_limit("2027-01-01"), 3.0 ) + expected_minimum = 776_000 if minimum_published_through == 2027 else 775_000 + assert home_equity.minimum_limit("2027-01-01") == expected_minimum + assert home_equity.minimum_limit( + "2028-01-01" + ) == adjust_home_equity_limit_for_inflation(expected_minimum, 3.0) diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 7c6ee27717c..10fe3b6dbe1 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -23,7 +23,6 @@ FINANCIAL = system.parameters.gov.hhs.medicaid.eligibility.long_term_care.financial HOME_EQUITY = system.parameters.gov.hhs.medicaid.eligibility.long_term_care.home_equity SSI = system.parameters.gov.ssa.ssi -CPI_U = system.parameters.gov.bls.cpi.cpi_u OUTPUTS = [ "medicaid_ltss_financial_pathway", @@ -838,20 +837,17 @@ def test_special_income_limit_follows_the_uprated_federal_benefit_rate(year): assert SSI.amount.individual(instant) > SSI.amount.individual("2026-01-01") -def test_minimum_home_equity_limit_indexes_like_cms(): - # 42 USC 1396p(f)(1)(C): September-to-September CPI-U, rounded to the - # nearest $1,000, effective January 1. Applied to the 2025 value, the rule - # reproduces CMS's published 2026 value. - def indexed(value, year): - change = CPI_U(f"{year - 1}-09-01") / CPI_U(f"{year - 2}-09-01") - return round(value * change / 1_000) * 1_000 - - assert indexed(HOME_EQUITY.minimum_limit("2025-01-01"), 2026) == 752_000 - for year in range(2027, 2036): - prior = HOME_EQUITY.minimum_limit(f"{year - 1}-01-01") - current = HOME_EQUITY.minimum_limit(f"{year}-01-01") - assert current == indexed(prior, year) - assert HOME_EQUITY.minimum_limit(f"{year}-12-01") == current +def test_minimum_home_equity_limit_matches_published_cms_figures(): + # Chart page 2 of CMS's 2020, 2021, 2022, 2025 and 2026 bulletins. + published = { + 2020: 595_000, + 2021: 603_000, + 2022: 636_000, + 2025: 730_000, + 2026: 752_000, + } + for year, minimum in published.items(): + assert HOME_EQUITY.minimum_limit(f"{year}-01-01") == minimum def test_indexed_minimum_home_equity_limit_is_capped_after_2028(): From 18d99351954d94403f8f1a17a2ead387ad45325b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 15 Oct 2026 00:16:17 -0400 Subject: [PATCH 32/34] Correct LTSS trust validity, couple fallback, and spouse inventories --- .../ltss-financial-eligibility.added.md | 2 +- changelog.d/ltss-financial-round-two.fixed.md | 1 - .../ltss-financial-wa-reentry.fixed.md | 1 - ...aid-ltss-delaware-budget-election.added.md | 1 - .../medicaid-ltss-delaware-irwe.fixed.md | 1 - .../medicaid-ltss-irwe-leaf-payments.fixed.md | 1 - .../medicaid-ltss-leaf-inputs.changed.md | 1 - .../medicaid-ltss-qit-opening-month.fixed.md | 1 - ...medicaid-ltss-wa-legacy-dividends.fixed.md | 1 - changelog.d/medicaid-ltss-wa-legacy.fixed.md | 1 - ...ltss-washington-income-exclusions.fixed.md | 1 - .../financial/de/csra/state_minimum.yaml | 2 +- .../financial/de/income/earned_disregard.yaml | 2 +- .../income/earned_income_countable_rate.yaml | 2 +- .../de/income/general_disregard.yaml | 2 +- .../de/special_income_limit/rate.yaml | 2 +- .../financial/federal/csra/maximum.yaml | 2 +- .../financial/federal/csra/minimum.yaml | 2 +- .../financial/federal/mmmna/maximum.yaml | 2 +- .../financial/federal/mmmna/minimum.yaml | 2 +- .../federal/mmmna/shelter_threshold_rate.yaml | 2 +- .../couple_multiplier.yaml | 2 +- .../tx/special_income_limit/rate.yaml | 2 +- .../financial/wa/csra/state_minimum.yaml | 2 +- .../wa/medically_needy/income_level.yaml | 2 +- .../financial/wa/mmmna/minimum.yaml | 2 +- .../financial/wa/mmmna/shelter_threshold.yaml | 2 +- .../financial/wa/resources/individual.yaml | 2 +- .../wa/special_income_limit/rate.yaml | 2 +- .../financial/wa/waivers/copes/enabled.yaml | 2 +- .../wa/waivers/new_freedom/enabled.yaml | 2 +- .../financial/wa/waivers/rsw/enabled.yaml | 4 +- ...test_medicaid_ltss_financial_invariants.py | 59 ++++- ...aid_ltss_financial_threshold_eligible.yaml | 6 + .../is_medicaid_ltss_income_eligible.yaml | 213 +++++++++++++++++- .../medicaid_ltss_assistance_unit_size.yaml | 36 +-- .../medicaid_ltss_csra_resource_eligible.yaml | 169 +++++++++++++- .../medicaid_ltss_financial_pathway.yaml | 2 +- ...id_ltss_post_six_month_budget_election.py} | 2 +- .../medicaid_ltss_assistance_unit_size.py | 39 +++- ...ss_community_spouse_countable_resources.py | 24 +- .../medicaid_ltss_couple_countable_income.py | 2 +- ...aid_ltss_earned_income_deposited_to_qit.py | 7 +- ...cluded_impairment_related_work_expenses.py | 2 +- .../medicaid_ltss_financial_pathway.py | 2 +- .../medicaid_ltss_gross_earned_income.py | 2 +- .../medicaid_ltss_gross_unearned_income.py | 2 +- ...d_ltss_impairment_related_work_expenses.py | 2 +- ...dicaid_ltss_individual_countable_income.py | 4 +- .../medicaid_ltss_medically_needy_expenses.py | 2 +- ..._ltss_non_delaware_assistance_unit_size.py | 13 +- ...re_community_spouse_countable_resources.py | 10 +- ...edicaid_ltss_qit_adjusted_earned_income.py | 15 +- ...icaid_ltss_qit_adjusted_unearned_income.py | 15 +- ...s_qit_subsequent_full_deposits_verified.py | 9 +- ...icaid_ltss_reported_gross_earned_income.py | 2 +- ...aid_ltss_reported_gross_unearned_income.py | 2 +- ...d_ltss_unearned_income_deposited_to_qit.py | 7 +- ..._ltss_qit_opening_month_deposit_invalid.py | 59 +++++ ...py => wa_medicaid_ltss_excluded_income.py} | 2 +- 60 files changed, 652 insertions(+), 113 deletions(-) delete mode 100644 changelog.d/ltss-financial-round-two.fixed.md delete mode 100644 changelog.d/ltss-financial-wa-reentry.fixed.md delete mode 100644 changelog.d/medicaid-ltss-delaware-budget-election.added.md delete mode 100644 changelog.d/medicaid-ltss-delaware-irwe.fixed.md delete mode 100644 changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md delete mode 100644 changelog.d/medicaid-ltss-leaf-inputs.changed.md delete mode 100644 changelog.d/medicaid-ltss-qit-opening-month.fixed.md delete mode 100644 changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md delete mode 100644 changelog.d/medicaid-ltss-wa-legacy.fixed.md delete mode 100644 changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md rename policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/{medicaid_ltss_de_post_six_month_budget_election.py => de_medicaid_ltss_post_six_month_budget_election.py} (95%) create mode 100644 policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_deposit_invalid.py rename policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/{medicaid_ltss_wa_excluded_income.py => wa_medicaid_ltss_excluded_income.py} (98%) diff --git a/changelog.d/ltss-financial-eligibility.added.md b/changelog.d/ltss-financial-eligibility.added.md index 1e43eadfa4f..3195944c4c2 100644 --- a/changelog.d/ltss-financial-eligibility.added.md +++ b/changelog.d/ltss-financial-eligibility.added.md @@ -1 +1 @@ -Add an opt-in 2026 Medicaid LTSS financial-threshold screen for selected institutional and named-waiver pathways in Texas, Delaware, and Washington. +Add an opt-in Medicaid LTSS financial eligibility screen for Texas, Delaware, and Washington, with source income exclusions, qualified income trust opening-month rules, individual and couple budgeting, initial and continuing spousal resource rules, CMS-indexed home equity limits, and maintenance needs allowances. Derive budgets from each spouse's income, resource inventories, service locations, Delaware elections, Washington institutionalization history, and qualifying impairment-related work expense payment and allocation facts. Keep the screen separate from Medicaid enrollment and benefit calculations. diff --git a/changelog.d/ltss-financial-round-two.fixed.md b/changelog.d/ltss-financial-round-two.fixed.md deleted file mode 100644 index 3b127f70c7c..00000000000 --- a/changelog.d/ltss-financial-round-two.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Correct Delaware married home-equity interests and continuing spousal resource eligibility, index Washington's LTSS medically needy income limit to SSI, and use Washington's published maintenance and shelter standards. diff --git a/changelog.d/ltss-financial-wa-reentry.fixed.md b/changelog.d/ltss-financial-wa-reentry.fixed.md deleted file mode 100644 index 2308fe4553d..00000000000 --- a/changelog.d/ltss-financial-wa-reentry.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Use Washington's most recent continuous-period resource snapshot for Medicaid LTSS spousal eligibility after re-entry, preserving the first-period snapshot for Texas and Delaware. diff --git a/changelog.d/medicaid-ltss-delaware-budget-election.added.md b/changelog.d/medicaid-ltss-delaware-budget-election.added.md deleted file mode 100644 index 35ac1e7dac5..00000000000 --- a/changelog.d/medicaid-ltss-delaware-budget-election.added.md +++ /dev/null @@ -1 +0,0 @@ -Add a reported individual or couple budgeting election for Delaware Medicaid LTSS couples after six months together in the same facility, retaining favorable-budget selection when unspecified and mandatory budgeting elsewhere. diff --git a/changelog.d/medicaid-ltss-delaware-irwe.fixed.md b/changelog.d/medicaid-ltss-delaware-irwe.fixed.md deleted file mode 100644 index b55788e0704..00000000000 --- a/changelog.d/medicaid-ltss-delaware-irwe.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Apply qualifying Delaware Medicaid LTSS impairment-related work expenses after the $20 and $65 income exclusions and before halving remaining earnings, deriving expenses from payment, reimbursement, business-expense, allocation-election and age-65 disability-payment history facts. diff --git a/changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md b/changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md deleted file mode 100644 index 3637d8c4ac6..00000000000 --- a/changelog.d/medicaid-ltss-irwe-leaf-payments.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Derive Delaware LTSS impairment-related work expenses from payment and reimbursement facts, business-cost overlap, and the claimant's twelve-month allocation election. diff --git a/changelog.d/medicaid-ltss-leaf-inputs.changed.md b/changelog.d/medicaid-ltss-leaf-inputs.changed.md deleted file mode 100644 index 2b62eb35e3a..00000000000 --- a/changelog.d/medicaid-ltss-leaf-inputs.changed.md +++ /dev/null @@ -1 +0,0 @@ -Compute Medicaid LTSS income exclusions and Delaware couple budgets from each spouse's own gross income, trust deposits, resources, service locations, and duration; select the favorable institutional budget after six months. diff --git a/changelog.d/medicaid-ltss-qit-opening-month.fixed.md b/changelog.d/medicaid-ltss-qit-opening-month.fixed.md deleted file mode 100644 index c7dbdce9fc4..00000000000 --- a/changelog.d/medicaid-ltss-qit-opening-month.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Apply Texas Medicaid LTSS qualified income trust opening-month whole-source exclusions to earned and unearned income after verification of subsequent full deposits, using trust-opening and covered-source facts. diff --git a/changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md b/changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md deleted file mode 100644 index f940358cbf6..00000000000 --- a/changelog.d/medicaid-ltss-wa-legacy-dividends.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Match Washington's LTSS dividend exclusion to the legacy-compatible dividend source included in gross income. diff --git a/changelog.d/medicaid-ltss-wa-legacy.fixed.md b/changelog.d/medicaid-ltss-wa-legacy.fixed.md deleted file mode 100644 index fe15ec3b9b7..00000000000 --- a/changelog.d/medicaid-ltss-wa-legacy.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Select Washington Medicaid LTSS spousal resource rules from the onset of the most recent continuous institutionalization, including the federal-maximum allocation for October 1989 through July 2003 and the pre-October 1989 ownership rule. diff --git a/changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md b/changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md deleted file mode 100644 index b83f014970b..00000000000 --- a/changelog.d/medicaid-ltss-washington-income-exclusions.fixed.md +++ /dev/null @@ -1 +0,0 @@ -Apply Washington Medicaid LTSS source income exclusions before the special income limit and medically needy payment thresholds, with monthly interest, dividend, SSI, and state public-assistance receipt facts. diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml index c1588160347..df2792073b3 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml @@ -1,4 +1,4 @@ -description: Delaware sets this state spousal share as the minimum community spouse resource allowance under Medicaid long-term services and supports. +description: Delaware sets this state spousal share as the minimum community spouse resource allowance under the Medicaid long-term services and supports program. values: 1993-10-01: 25_000 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml index 7396e8c8bba..5be8f411751 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml @@ -1,4 +1,4 @@ -description: Delaware disregards this amount of monthly earned income after any unused general income exclusion for Medicaid long-term services and supports applicants without a community spouse. +description: Delaware excludes this amount of monthly earned income for applicants without a community spouse under the Medicaid long-term services and supports program. values: 2026-01-01: 65 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml index 6dee1f5261c..7b8c67cb96d 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml @@ -1,4 +1,4 @@ -description: Delaware counts this share of monthly earned income remaining after the general and earned income exclusions for Medicaid long-term services and supports applicants without a community spouse. +description: Delaware uses this share of remaining monthly earned income for applicants without a community spouse under the Medicaid long-term services and supports program. values: 2026-01-01: 0.5 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml index d0347cd6a4d..01d1dda17db 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml @@ -1,4 +1,4 @@ -description: Delaware disregards up to this amount of monthly income when applying the special income limit under Medicaid long-term services and supports. +description: Delaware excludes this amount of monthly income under the Medicaid long-term services and supports program. values: 2026-01-01: 20 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml index 11de5d36428..a5d3abaa9e2 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml @@ -1,4 +1,4 @@ -description: Delaware sets the special income limit at this multiple of the Supplemental Security Income federal benefit rate for an individual or couple under Medicaid long-term services and supports. +description: Delaware sets the special income limit at this multiple of the Supplemental Security Income federal benefit rate for an individual or couple under the Medicaid long-term services and supports program. values: 1994-10-01: 2.5 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml index 6244daea003..fbe90d00f99 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml @@ -1,4 +1,4 @@ -description: The Department of Health and Human Services limits the community spouse resource allowance to this amount under Medicaid long-term services and supports. +description: The Department of Health and Human Services limits the community spouse resource allowance to this amount under the Medicaid long-term services and supports program. values: 2026-01-01: 162_660 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml index 68694bd706a..5ef22b35e16 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml @@ -1,4 +1,4 @@ -description: The Department of Health and Human Services sets this minimum community spouse resource allowance under Medicaid long-term services and supports. +description: The Department of Health and Human Services sets this minimum community spouse resource allowance under the Medicaid long-term services and supports program. values: 2026-01-01: 32_532 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml index 9fc9d1d9fd8..7438b3a9e95 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml @@ -1,4 +1,4 @@ -description: The Department of Health and Human Services limits the community spouse monthly maintenance needs allowance to this amount under Medicaid long-term services and supports. +description: The Department of Health and Human Services limits the community spouse monthly maintenance needs allowance to this amount under the Medicaid long-term services and supports program. values: 2026-01-01: 4_066.5 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml index ba8ac4b68d8..698bac259cc 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml @@ -1,4 +1,4 @@ -description: The Department of Health and Human Services sets this minimum monthly maintenance needs allowance for a community spouse in the contiguous states and the District of Columbia under Medicaid long-term services and supports. +description: The Department of Health and Human Services sets this minimum monthly maintenance needs allowance for a community spouse in the contiguous states and the District of Columbia under the Medicaid long-term services and supports program. values: 2025-07-01: 2_643.75 2026-07-01: 2_705 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml index 654c97041dc..ab6c4c7358b 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml @@ -1,4 +1,4 @@ -description: The Department of Health and Human Services uses this share of the minimum monthly maintenance needs allowance as the community spouse excess shelter threshold under Medicaid long-term services and supports. +description: The Department of Health and Human Services uses this share of the minimum monthly maintenance needs allowance as the community spouse excess shelter threshold under the Medicaid long-term services and supports program. values: 1989-10-01: 0.3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml index 175671d774a..a6cfc4679aa 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/couple_multiplier.yaml @@ -1,4 +1,4 @@ -description: Texas sets the couple special income limit at this multiple of the individual special income limit under Medicaid long-term services and supports. +description: Texas sets the couple special income limit at this multiple of the individual special income limit under the Medicaid long-term services and supports program. values: 2009-09-01: 2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml index df5bc9ac011..cb8bf1e5aeb 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/tx/special_income_limit/rate.yaml @@ -1,4 +1,4 @@ -description: Texas sets the individual special income limit at this multiple of the individual Supplemental Security Income federal benefit rate under Medicaid long-term services and supports. +description: Texas sets the individual special income limit at this multiple of the individual Supplemental Security Income federal benefit rate under the Medicaid long-term services and supports program. values: 2009-09-01: 3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml index c7f7e11e7c3..14c273717db 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml @@ -1,4 +1,4 @@ -description: Washington sets this state spousal resource standard as the minimum community spouse resource allowance under Medicaid long-term services and supports. +description: Washington sets this state spousal resource standard as the minimum community spouse resource allowance under the Medicaid long-term services and supports program. values: 2025-07-01: 72_529 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml index 40870ad5440..f3c9bc5c68b 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -1,4 +1,4 @@ -description: Washington uses this monthly medically needy income level for a single person under Medicaid long-term services and supports, equal to the one-person SSI federal benefit rate and updated each January with the Social Security cost-of-living adjustment. +description: Washington uses this monthly medically needy income level for a single person under the Medicaid long-term services and supports program. values: 2026-01-01: 994 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml index a40de1892e6..475ef01543e 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml @@ -1,4 +1,4 @@ -description: Washington publishes this minimum monthly maintenance needs allowance standard for a community spouse under Medicaid long-term services and supports. +description: Washington sets this minimum monthly maintenance needs allowance for a community spouse under the Medicaid long-term services and supports program. values: 2025-07-01: 2_644 2026-07-01: 2_705 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml index 5e11d6c5072..f944f08464f 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/shelter_threshold.yaml @@ -1,4 +1,4 @@ -description: Washington publishes this monthly community spouse shelter threshold under Medicaid long-term services and supports; allowable shelter expenses above this standard increase the maintenance needs allowance. +description: Washington sets this monthly community spouse shelter threshold under the Medicaid long-term services and supports program. values: 2025-07-01: 794 2026-07-01: 812 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml index c2128aefaaf..523982ab430 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml @@ -1,4 +1,4 @@ -description: Washington limits countable resources to this amount for a single person or an institutionalized spouse under Medicaid long-term services and supports. +description: Washington limits countable resources to this amount for a single person or an institutionalized spouse under the Medicaid long-term services and supports program. values: 2026-01-01: 2_000 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml index 4f2bac530a5..c8abbf1be1e 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/special_income_limit/rate.yaml @@ -1,4 +1,4 @@ -description: Washington sets the special income level at this multiple of the Supplemental Security Income federal benefit rate under Medicaid long-term services and supports. +description: Washington sets the special income level at this multiple of the Supplemental Security Income federal benefit rate under the Medicaid long-term services and supports program. values: 2026-01-01: 3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml index 9f8ba9351df..29a84cdf0ba 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml @@ -1,4 +1,4 @@ -description: Washington models the COPES home and community-based services waiver under Medicaid long-term services and supports if this is true. +description: Washington models the COPES home and community-based services waiver under the Medicaid long-term services and supports program if this is true. values: 2026-01-01: true diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml index ff376afb21c..3f24e2e600a 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml @@ -1,4 +1,4 @@ -description: Washington models the New Freedom home and community-based services waiver under Medicaid long-term services and supports if this is true. +description: Washington models the New Freedom home and community-based services waiver under the Medicaid long-term services and supports program if this is true. values: 2026-01-01: true diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml index 0209acf057f..ada3829c53b 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml @@ -1,11 +1,11 @@ -description: Washington models the Residential Support Waiver home and community-based services waiver under Medicaid long-term services and supports if this is true. +description: Washington models the Residential Support Waiver home and community-based services waiver under the Medicaid long-term services and supports program if this is true. values: 2026-01-01: true metadata: unit: bool period: year - label: Washington Medicaid LTSS Residential Support Waiver waiver enabled + label: Washington Medicaid LTSS Residential Support Waiver enabled reference: - title: WAC 182-515-1505 - HCB waiver services authorized by Home and Community Services href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505 diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 10fe3b6dbe1..4a961c8aebb 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -402,10 +402,13 @@ def test_delaware_independent_applicants_derive_individual_units(population): _, column, base, shifted = population delaware = column("state") == "DE" assert (base["medicaid_ltss_assistance_unit_size"][delaware] == 1).all() + # Texas can switch its candidate unit after a couple budget fails; + # every other independent-applicant unit remains unchanged. + unchanged = column("state") != "TX" for results in shifted.values(): np.testing.assert_array_equal( - results["medicaid_ltss_assistance_unit_size"], - base["medicaid_ltss_assistance_unit_size"], + results["medicaid_ltss_assistance_unit_size"][unchanged], + base["medicaid_ltss_assistance_unit_size"][unchanged], ) np.testing.assert_allclose( base["medicaid_ltss_countable_resources"][delaware], @@ -413,6 +416,54 @@ def test_delaware_independent_applicants_derive_individual_units(population): ) +def test_texas_independent_candidate_units_follow_the_failed_couple_budget(population): + _, column, base, shifted = population + texas = column("state") == "TX" + candidate = column("unit_size") + inconsistent_spouse = column("has_community_spouse") + for results in [base, *shifted.values()]: + # G-6120 uses individual budgets once the candidate couple exceeds + # either published 2026 limit, $5,964 income or $3,000 resources. + # These singleton candidate rows retain the existing caller contract; + # the paired-spouse property below covers actual combined budgets. + couple_passes = ( + results["medicaid_ltss_individual_countable_income"] <= 5_964 + ) & (results["medicaid_ltss_countable_resources"] <= 3_000) + expected = np.where( + (candidate == 2) & ~inconsistent_spouse & ~couple_passes, 1, candidate + ) + np.testing.assert_array_equal( + results["medicaid_ltss_assistance_unit_size"][texas], expected[texas] + ) + + +def test_texas_actual_couple_fallback_uses_both_financial_limits(election_couples): + people, base, elected, _ = election_couples + texas = np.repeat([couple["state"] == "TX" for couple in people], 2) + expected_units = [] + expected_eligible = [] + for couple in people: + incomes = couple["earned"] + couple["unearned"] + resources = couple["resources"] + # G-6120: inclusive coupled standards, then each individual's budget. + coupled = sum(incomes) <= 5_964 and sum(resources) <= 3_000 + expected_units.extend([2 if coupled else 1] * 2) + expected_eligible.extend( + [True, True] if coupled else (incomes <= 2_982) & (resources <= 2_000) + ) + assert texas.any() + assert (np.array(expected_units)[texas] == 1).any() + for results in [base, *elected.values()]: + np.testing.assert_array_equal( + results["medicaid_ltss_assistance_unit_size"][texas], + np.array(expected_units)[texas], + ) + np.testing.assert_array_equal( + results["is_medicaid_ltss_financial_threshold_eligible"][texas], + np.array(expected_eligible)[texas], + ) + + def test_washington_dated_allocation_and_ownership_rules(population): _, column, base, _ = population washington = column("state") == "WA" @@ -524,7 +575,7 @@ def _couple_results(couples, raised_spouse=None, reverse=False, election=None): } if election is not None: situation["marital_units"][f"couple_{index}"][ - "medicaid_ltss_de_post_six_month_budget_election" + "de_medicaid_ltss_post_six_month_budget_election" ] = month(election) for spouse, name in enumerate(names): situation["people"][name] = { @@ -1076,7 +1127,7 @@ def test_dividend_exclusion_never_exceeds_dividends_counted_in_gross(source): simulation = Simulation(situation=situation) counted_dividends = simulation.calculate("dividend_income", YEAR) / 12 gross = simulation.calculate("medicaid_ltss_gross_unearned_income", PERIOD) - excluded = simulation.calculate("medicaid_ltss_wa_excluded_income", PERIOD) + excluded = simulation.calculate("wa_medicaid_ltss_excluded_income", PERIOD) np.testing.assert_allclose(gross, 2_900 + counted_dividends, atol=0.001) assert (excluded <= counted_dividends + 0.001).all() np.testing.assert_allclose(excluded, counted_dividends, atol=0.001) diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index e98a6fb15c7..0cfe32b445d 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -451,6 +451,11 @@ wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_530 + marital_units: + at_state_standard: + members: [at_state_standard] + above_state_standard: + members: [above_state_standard] households: at_household: members: [at_state_standard] @@ -461,6 +466,7 @@ state_code: 2026: WA output: + medicaid_ltss_community_spouse_countable_resources: [72_529, 72_530] medicaid_ltss_financial_pathway: [SPECIAL_INCOME, SPECIAL_INCOME] is_medicaid_ltss_income_eligible: [true, true] medicaid_ltss_csra_resource_eligible: [true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 3b62b8669cb..94c33f6de90 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -1335,7 +1335,9 @@ state_code: '2026': TX output: - medicaid_ltss_qit_adjusted_unearned_income: [3500, 3500, 4000, 3500, 3500, 3500, 1500] + medicaid_ltss_qit_adjusted_unearned_income: [4000, 3500, 4000, 3500, 3500, 3500, 1500] + tx_medicaid_ltss_qit_opening_month_exclusion_applies: [false, false, false, false, false, false, true] + tx_medicaid_ltss_qit_opening_month_deposit_invalid: [true, false, false, false, false, false, false] - name: Texas QIT opening exclusion covers both identified sources with one partial source deposit period: 2026-07 input: @@ -1766,3 +1768,212 @@ medicaid_ltss_excluded_impairment_related_work_expenses: [600, 0] # (5,455 - 20 - 65 - 600) / 2 = 2,385; without IRWE it is 2,685. medicaid_ltss_countable_income: [2_385, 2_685] + +# F-6820: $3,400 - $500 would be $2,900 <= the $2,982 SIL, but an +# unverified partial opening deposit instead counts all $3,400. In a mixed +# trust, restoring both streams counts $3,400 + $1,000 = $4,400. + + +- name: Case 41, Texas unverified partial opening deposits invalidate the whole trust while full deposits remain excluded. + period: 2026-07 + input: + people: + partial_unverified: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3400 + medicaid_ltss_individual_countable_resources: 1000 + medicaid_ltss_reported_gross_earned_income: 0 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_earned_income_deposited_to_qit: 0 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 3400 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_covered_earned_income: 0 + medicaid_ltss_qit_covered_earned_income_deposited: 0 + medicaid_ltss_qit_subsequent_full_deposits_verified: false + partial_verified: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3400 + medicaid_ltss_individual_countable_resources: 1000 + medicaid_ltss_reported_gross_earned_income: 0 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_earned_income_deposited_to_qit: 0 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 3400 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_covered_earned_income: 0 + medicaid_ltss_qit_covered_earned_income_deposited: 0 + medicaid_ltss_qit_subsequent_full_deposits_verified: true + full_unverified: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3400 + medicaid_ltss_individual_countable_resources: 1000 + medicaid_ltss_reported_gross_earned_income: 0 + medicaid_ltss_unearned_income_deposited_to_qit: 3400 + medicaid_ltss_earned_income_deposited_to_qit: 0 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 3400 + medicaid_ltss_qit_covered_unearned_income_deposited: 3400 + medicaid_ltss_qit_covered_earned_income: 0 + medicaid_ltss_qit_covered_earned_income_deposited: 0 + medicaid_ltss_qit_subsequent_full_deposits_verified: false + mixed_unverified: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3400 + medicaid_ltss_individual_countable_resources: 1000 + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_earned_income_deposited_to_qit: 1000 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 7 + medicaid_ltss_qit_covered_unearned_income: 3400 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_covered_earned_income: 1000 + medicaid_ltss_qit_covered_earned_income_deposited: 1000 + medicaid_ltss_qit_subsequent_full_deposits_verified: false + later_month: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 3400 + medicaid_ltss_individual_countable_resources: 1000 + medicaid_ltss_reported_gross_earned_income: 0 + medicaid_ltss_unearned_income_deposited_to_qit: 500 + medicaid_ltss_earned_income_deposited_to_qit: 0 + medicaid_ltss_qit_opening_year: 2026 + medicaid_ltss_qit_opening_month: 6 + medicaid_ltss_qit_covered_unearned_income: 3400 + medicaid_ltss_qit_covered_unearned_income_deposited: 500 + medicaid_ltss_qit_covered_earned_income: 0 + medicaid_ltss_qit_covered_earned_income_deposited: 0 + medicaid_ltss_qit_subsequent_full_deposits_verified: false + marital_units: + partial_unverified: + members: [partial_unverified] + partial_verified: + members: [partial_verified] + full_unverified: + members: [full_unverified] + mixed_unverified: + members: [mixed_unverified] + later_month: + members: [later_month] + households: + household: + members: [partial_unverified, partial_verified, full_unverified, mixed_unverified, later_month] + state_code: + '2026': TX + output: + tx_medicaid_ltss_qit_opening_month_deposit_invalid: [true, false, false, true, false] + tx_medicaid_ltss_qit_opening_month_exclusion_applies: [false, true, false, false, false] + medicaid_ltss_qit_adjusted_unearned_income: [3400, 0, 0, 3400, 2900] + medicaid_ltss_qit_adjusted_earned_income: [0, 0, 0, 1000, 0] + medicaid_ltss_countable_income: [3400, 0, 0, 4400, 2900] + is_medicaid_ltss_income_eligible: [false, true, true, false, true] + is_medicaid_ltss_financial_threshold_eligible: [false, true, true, false, true] + +# G-6120: $2,982 + $2,982 = $5,964 is a valid couple budget. Adding +# $1 gives $5,965, so individual $2,983/$2,982 budgets fail/pass. The +# $5,000 + $1,500 = $6,500 couple also falls back to fail/pass. Resources +# $1,500.50 + $1,500.50 = $3,001 exceed the $3,000 couple limit, so each +# $1,500.50 individual inventory passes the $2,000 limit after fallback. + + +- name: Case 42, Texas retests each spouse individually when the candidate couple fails either financial limit. + period: 2026-07 + input: + people: + income_at_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 2982 + medicaid_ltss_individual_countable_resources: 1500 + income_at_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 2982 + medicaid_ltss_individual_countable_resources: 1500 + income_above_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 2983 + medicaid_ltss_individual_countable_resources: 1500 + income_above_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 2982 + medicaid_ltss_individual_countable_resources: 1500 + uneven_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 5000 + medicaid_ltss_individual_countable_resources: 1000 + uneven_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 1500 + medicaid_ltss_individual_countable_resources: 1000 + resources_above_a: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 1000 + medicaid_ltss_individual_countable_resources: 1500.5 + resources_above_b: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 1000 + medicaid_ltss_individual_countable_resources: 1500.5 + marital_units: + income_at: + members: [income_at_a, income_at_b] + income_above: + members: [income_above_a, income_above_b] + uneven: + members: [uneven_a, uneven_b] + resources_above: + members: [resources_above_a, resources_above_b] + households: + household: + members: [income_at_a, income_at_b, income_above_a, income_above_b, uneven_a, uneven_b, resources_above_a, resources_above_b] + state_code: + '2026': TX + output: + medicaid_ltss_assistance_unit_size: [2, 2, 1, 1, 1, 1, 1, 1] + medicaid_ltss_special_income_limit: [5964, 5964, 2982, 2982, 2982, 2982, 2982, 2982] + medicaid_ltss_countable_income: [5964, 5964, 2983, 2982, 5000, 1500, 1000, 1000] + medicaid_ltss_countable_resources: [3000, 3000, 1500, 1500, 1000, 1000, 1500.5, 1500.5] + is_medicaid_ltss_income_eligible: [true, true, false, true, false, true, true, true] + medicaid_ltss_csra_resource_eligible: [true, true, true, true, true, true, true, true] + is_medicaid_ltss_financial_threshold_eligible: [true, true, false, true, false, true, true, true] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml index f06e4f10325..e0ee1cc978f 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.yaml @@ -271,12 +271,12 @@ members: [high_income, low_income] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL reversed_individual_election: members: [reversed_low_income, reversed_high_income] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL households: delaware: members: [high_income, low_income, reversed_low_income, reversed_high_income] @@ -336,17 +336,17 @@ members: [income_a, income_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE resources: members: [resources_a, resources_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE tie: members: [tie_a, tie_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE households: delaware: members: [income_a, income_b, resources_a, resources_b, tie_a, tie_b] @@ -446,7 +446,7 @@ members: [not_supplied_couple_a, not_supplied_couple_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: NOT_SUPPLIED + de_medicaid_ltss_post_six_month_budget_election: NOT_SUPPLIED omitted_individual: members: [omitted_individual_a, omitted_individual_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true @@ -455,7 +455,7 @@ members: [not_supplied_individual_a, not_supplied_individual_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: NOT_SUPPLIED + de_medicaid_ltss_post_six_month_budget_election: NOT_SUPPLIED omitted_tie: members: [omitted_tie_a, omitted_tie_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true @@ -464,7 +464,7 @@ members: [not_supplied_tie_a, not_supplied_tie_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 6 - medicaid_ltss_de_post_six_month_budget_election: NOT_SUPPLIED + de_medicaid_ltss_post_six_month_budget_election: NOT_SUPPLIED households: delaware: members: @@ -472,7 +472,7 @@ state_code: 2026: DE output: - medicaid_ltss_de_post_six_month_budget_election: + de_medicaid_ltss_post_six_month_budget_election: [NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED, NOT_SUPPLIED] medicaid_ltss_assistance_unit_size: [2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1] medicaid_ltss_countable_income: @@ -532,16 +532,16 @@ members: [five_month_individual_a, five_month_individual_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 5 - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL five_month_couple: members: [five_month_couple_a, five_month_couple_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 5 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE duration_unspecified: members: [duration_unspecified_a, duration_unspecified_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL households: delaware: members: @@ -609,22 +609,22 @@ members: [hcbs_a, hcbs_b] medicaid_ltss_spouses_requesting_or_receiving_hcbs_at_same_address: true medicaid_ltss_spouses_months_in_same_institutional_facility: 12 - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL different_facilities: members: [different_facilities_a, different_facilities_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: false medicaid_ltss_spouses_months_in_same_institutional_facility: 12 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE single: members: [single] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 12 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE texas: members: [texas_a, texas_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 12 - medicaid_ltss_de_post_six_month_budget_election: COUPLE + de_medicaid_ltss_post_six_month_budget_election: COUPLE households: delaware: members: [hcbs_a, hcbs_b, different_facilities_a, different_facilities_b, single] @@ -665,12 +665,12 @@ members: [before_a, before_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 2 - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL boundary: members: [boundary_a, boundary_b] medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true medicaid_ltss_spouses_months_in_same_institutional_facility: 3 - medicaid_ltss_de_post_six_month_budget_election: INDIVIDUAL + de_medicaid_ltss_post_six_month_budget_election: INDIVIDUAL households: household: members: [before_a, before_b, boundary_a, boundary_b] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index f3708ba7071..395815c4d9b 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -615,7 +615,7 @@ output: medicaid_ltss_csra_resource_eligible: [true, false] -- name: Case 12, a genuine two-person institutionalized couple uses the couple limit. +- name: Case 12, Texas uses the inclusive couple resource limit and individual fallback above it. period: 2026-07 input: people: @@ -702,11 +702,11 @@ - SPECIAL_INCOME - SPECIAL_INCOME - SPECIAL_INCOME - medicaid_ltss_csra_resource_eligible: - - true - - true - - false - - false + # $1,500 + $1,500 = $3,000 retains the couple unit. At $3,001, + # each $1,500.50 inventory is retested against $2,000 individually. + medicaid_ltss_assistance_unit_size: [2, 2, 1, 1] + medicaid_ltss_countable_resources: [3000, 3000, 1500.5, 1500.5] + medicaid_ltss_csra_resource_eligible: [true, true, true, true] - name: Case 13, the federal minimum governs over the Delaware state spousal share. period: 2026-07 @@ -891,12 +891,20 @@ wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_non_delaware_community_spouse_countable_resources: 72_530 + # Independent applicants whose community spouses are outside this simulation. + marital_units: + at_allowance: + members: [at_allowance] + above_allowance: + members: [above_allowance] households: household: members: [at_allowance, above_allowance] state_code: 2026: WA output: + medicaid_ltss_community_spouse_countable_resources: [72_529, 72_530] + medicaid_ltss_csra: [72_529, 72_529] medicaid_ltss_csra_resource_eligible: [true, false] - name: Case 17, half of snapshot resources governs between the Washington CSRA bounds. @@ -923,12 +931,20 @@ wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 200_000 medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_non_delaware_community_spouse_countable_resources: 100_001 + # Independent applicants whose community spouses are outside this simulation. + marital_units: + at_allowance: + members: [at_allowance] + above_allowance: + members: [above_allowance] households: household: members: [at_allowance, above_allowance] state_code: 2026: WA output: + medicaid_ltss_community_spouse_countable_resources: [100_000, 100_001] + medicaid_ltss_csra: [100_000, 100_000] medicaid_ltss_csra_resource_eligible: [true, false] - name: Case 18, the federal CSRA maximum caps the Washington allowance. @@ -955,12 +971,20 @@ wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 400_000 medicaid_ltss_individual_countable_resources: 2_000 medicaid_ltss_non_delaware_community_spouse_countable_resources: 162_661 + # Independent applicants whose community spouses are outside this simulation. + marital_units: + at_allowance: + members: [at_allowance] + above_allowance: + members: [above_allowance] households: household: members: [at_allowance, above_allowance] state_code: 2026: WA output: + medicaid_ltss_community_spouse_countable_resources: [162_660, 162_661] + medicaid_ltss_csra: [162_660, 162_660] medicaid_ltss_csra_resource_eligible: [true, false] - name: Case 19, continuing Delaware eligibility ignores community spouse resources above the initial allowance. @@ -1640,3 +1664,136 @@ - false - false - false + +# 42 USC 1396r-5(c)(2)(A): represented spouse inventories are included. +# TX: half the $100,000 snapshot is $50,000; $2,000 + $50,000 = $52,000 +# passes, $52,001 fails, and the reviewer's $402,000 example fails. +# WA: the $72,529 floor controls; $2,000 + $72,529 = $74,529 passes, +# $74,530 fails, and $402,000 also fails. Separate spouse inputs are zero. + + +- name: Case 31, Texas and Washington include represented community spouses' inventories at the initial CSRA boundary. + period: 2026-07 + input: + people: + tx_at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + tx_at_spouse: + medicaid_ltss_individual_countable_resources: 50000 + tx_above: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + tx_above_spouse: + medicaid_ltss_individual_countable_resources: 50001 + tx_large: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + tx_large_spouse: + medicaid_ltss_individual_countable_resources: 400000 + wa_at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_at_spouse: + medicaid_ltss_individual_countable_resources: 72529 + wa_above: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_above_spouse: + medicaid_ltss_individual_countable_resources: 72530 + wa_large: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + '2026': true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_income: 2500 + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_non_delaware_community_spouse_countable_resources: 0 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 7 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_large_spouse: + medicaid_ltss_individual_countable_resources: 400000 + marital_units: + tx_at: + members: [tx_at, tx_at_spouse] + tx_above: + members: [tx_above, tx_above_spouse] + tx_large: + members: [tx_large, tx_large_spouse] + wa_at: + members: [wa_at, wa_at_spouse] + wa_above: + members: [wa_above, wa_above_spouse] + wa_large: + members: [wa_large, wa_large_spouse] + households: + tx_at: + members: [tx_at, tx_at_spouse] + state_code: + '2026': TX + tx_above: + members: [tx_above, tx_above_spouse] + state_code: + '2026': TX + tx_large: + members: [tx_large, tx_large_spouse] + state_code: + '2026': TX + wa_at: + members: [wa_at, wa_at_spouse] + state_code: + '2026': WA + wa_above: + members: [wa_above, wa_above_spouse] + state_code: + '2026': WA + wa_large: + members: [wa_large, wa_large_spouse] + state_code: + '2026': WA + output: + medicaid_ltss_community_spouse_countable_resources: [50000, 0, 50001, 0, 400000, 0, 72529, 0, 72530, 0, 400000, 0] + medicaid_ltss_csra: [50000, 0, 50000, 0, 50000, 0, 72529, 0, 72529, 0, 72529, 0] + medicaid_ltss_csra_resource_eligible: [true, false, false, false, false, false, true, false, false, false, false, false] + is_medicaid_ltss_financial_threshold_eligible: [true, false, false, false, false, false, true, false, false, false, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index 4ad7dbbcfbb..35514ef1ee4 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -407,7 +407,7 @@ output: medicaid_ltss_gross_unearned_income: 3_000 medicaid_ltss_dividend_income: 100 - medicaid_ltss_wa_excluded_income: 100 + wa_medicaid_ltss_excluded_income: 100 medicaid_ltss_countable_income: 2_900 medicaid_ltss_special_income_limit: 2_982 medicaid_ltss_financial_pathway: SPECIAL_INCOME diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/de_medicaid_ltss_post_six_month_budget_election.py similarity index 95% rename from policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py rename to policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/de_medicaid_ltss_post_six_month_budget_election.py index f6672a92909..94a5299ef23 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_de_post_six_month_budget_election.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/de_medicaid_ltss_post_six_month_budget_election.py @@ -7,7 +7,7 @@ class MedicaidLTSSDEPostSixMonthBudgetElection(Enum): NOT_SUPPLIED = "Not supplied" -class medicaid_ltss_de_post_six_month_budget_election(Variable): +class de_medicaid_ltss_post_six_month_budget_election(Variable): value_type = Enum possible_values = MedicaidLTSSDEPostSixMonthBudgetElection default_value = MedicaidLTSSDEPostSixMonthBudgetElection.NOT_SUPPLIED diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py index 1d3d1dd6253..dae28256d65 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -14,7 +14,7 @@ class medicaid_ltss_assistance_unit_size(Variable): "unit requesting or receiving services in the same facility must " "use couple budgeting until six completed months there; at six " "months the couple's reported " - "medicaid_ltss_de_post_six_month_budget_election selects individual " + "de_medicaid_ltss_post_six_month_budget_election selects individual " "or couple budgeting. When that election is NOT_SUPPLIED, the " "model uses whichever budget allows more spouses to pass both " "income and resource thresholds, choosing individual budgets in " @@ -27,9 +27,14 @@ class medicaid_ltss_assistance_unit_size(Variable): "unit independently of whether a financial pathway is modeled. " "Outside Delaware, supply the separate " "medicaid_ltss_non_delaware_assistance_unit_size input: use two only " - "where both spouses are budgeted as a couple, including Texas " - "spouses in the same institutional setting, and one for an " - "individual applicant. The outside-Delaware default zero and " + "where both spouses are candidates for a couple budget. Texas " + "spouses in the same institutional setting are tested as a " + "couple first; G-6120 requires individual budgets when that " + "couple exceeds either its income or resource limit. Report one " + "for separate institutional settings or an individual applicant. " + "A couple-sized unit with a community-spouse flag is inconsistent " + "and remains a couple unit so the resource screen fails closed. " + "The outside-Delaware default zero and " "unsupported sizes fail closed. Income and resources are supplied " "for each person and combined internally for a couple budget." ) @@ -77,7 +82,7 @@ def formula_2026_01_01(person, period, parameters): couple_eligible_spouses = 2 * couple_passes favorable_couple_budget = couple_eligible_spouses > individual_eligible_spouses election = person.marital_unit( - "medicaid_ltss_de_post_six_month_budget_election", period + "de_medicaid_ltss_post_six_month_budget_election", period ) election_values = election.possible_values elected_couple_budget = select( @@ -95,8 +100,26 @@ def formula_2026_01_01(person, period, parameters): | elected_couple_budget ) delaware_unit = where(same_address_hcbs | institutional_couple, 2, 1) + reported_unit = person( + "medicaid_ltss_non_delaware_assistance_unit_size", period + ) + texas_couple_limit = ( + p.tx.special_income_limit.rate + * fbr.individual + * p.tx.special_income_limit.couple_multiplier + ) + texas_couple_passes = (couple_income <= texas_couple_limit) & ( + couple_resources <= resources_limit.couple + ) + # G-6120: an ineligible institutional couple receives two individual + # budgets. A community-spouse flag contradicts that couple contract. + texas_fallback = ( + (state == state.possible_values.TX) + & (reported_unit == 2) + & ~person("medicaid_ltss_has_community_spouse", period) + & ~texas_couple_passes + ) + outside_delaware_unit = where(texas_fallback, 1, reported_unit) return where( - state == state.possible_values.DE, - delaware_unit, - person("medicaid_ltss_non_delaware_assistance_unit_size", period), + state == state.possible_values.DE, delaware_unit, outside_delaware_unit ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py index db8242cf905..f0a5e82ddee 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py @@ -10,11 +10,13 @@ class medicaid_ltss_community_spouse_countable_resources(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Delaware derives the community spouse's own current countable " + "Texas, Delaware, and Washington derive the community spouse's own current countable " "resources from the other person's resource inventory within their " "two-person marital unit. Supply each spouse's own " "medicaid_ltss_individual_countable_resources rather than a " - "pre-attributed community-spouse total. Outside Delaware it reads " + "pre-attributed community-spouse total. For Texas or Washington " + "applicants whose community spouse is outside the simulation, " + "the singleton marital unit instead reads " "medicaid_ltss_non_delaware_community_spouse_countable_resources, " "the spouse's own current comprehensive countable-resource " "inventory after applicable ownership and exclusion rules. Combined " @@ -32,14 +34,14 @@ def formula_2026_01_01(person, period, parameters): own_resources = person("medicaid_ltss_individual_countable_resources", period) spouse_resources = person.marital_unit.sum(own_resources) - own_resources has_spouse = person("medicaid_ltss_has_community_spouse", period) - delaware_resources = where( - has_spouse & (person.marital_unit.nb_persons() == 2), spouse_resources, 0 + represented_spouse = person.marital_unit.nb_persons() == 2 + external_spouse_resources = person( + "medicaid_ltss_non_delaware_community_spouse_countable_resources", + period, ) - return where( - state == state.possible_values.DE, - delaware_resources, - person( - "medicaid_ltss_non_delaware_community_spouse_countable_resources", - period, - ), + resources = where( + represented_spouse, + spouse_resources, + where(state == state.possible_values.DE, 0, external_spouse_resources), ) + return where(has_spouse, resources, 0) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py index a1a6b1e73c2..61dbb9d84f3 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py @@ -26,7 +26,7 @@ class medicaid_ltss_couple_countable_income(Variable): "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=67", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5", "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py index be903328694..ba83a0c4bdb 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_earned_income_deposited_to_qit.py @@ -14,8 +14,11 @@ class medicaid_ltss_earned_income_deposited_to_qit(Variable): "excludes these deposits from gross earned income without allowing " "a negative remainder. The Texas opening-month rule can also " "exclude an entire identified source after verification of " - "subsequent full deposits. Trust legality, irrevocability, funding, " - "payback terms, and the validity of a deposit are unmodeled." + "subsequent full deposits. An unverified partial opening-month " + "deposit invalidates the Texas trust for this screen, restoring " + "both income streams including their deposits. Other trust " + "legality, irrevocability, funding, payback terms, and deposit " + "validity remain unmodeled." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py index da65bd59092..35c16d69380 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_excluded_impairment_related_work_expenses.py @@ -20,7 +20,7 @@ class medicaid_ltss_excluded_impairment_related_work_expenses(Variable): "and age use the existing annual facts." ) reference = ( - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5", "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py index c158f7b2be3..9376ba3e934 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -55,7 +55,7 @@ def formula_2026_01_01(person, period, parameters): assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) income = max_( person("medicaid_ltss_qit_adjusted_income", period) - - person("medicaid_ltss_wa_excluded_income", period), + - person("wa_medicaid_ltss_excluded_income", period), 0, ) special_income_limit = person("medicaid_ltss_special_income_limit", period) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py index fd9a165bbbf..4367bd90911 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py @@ -20,7 +20,7 @@ class medicaid_ltss_gross_earned_income(Variable): "spouse reports their own income; the model combines it when " "couple budgeting applies." ) - reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=6" def formula(person, period, parameters): reported = person("medicaid_ltss_reported_gross_earned_income", period) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py index 485f71ce009..076a4af0aef 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py @@ -19,7 +19,7 @@ class medicaid_ltss_gross_unearned_income(Variable): "reports. Each spouse reports their own income; the model " "combines it when couple budgeting applies." ) - reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=6" def formula(person, period, parameters): reported = person("medicaid_ltss_reported_gross_unearned_income", period) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py index 5291aba2439..8e8edb58194 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py @@ -28,7 +28,7 @@ class medicaid_ltss_impairment_related_work_expenses(Variable): "exclusion order, are applied separately by derived outputs." ) reference = ( - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5", "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm", "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py index d6b5f8f587b..af207a4c776 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py @@ -27,7 +27,7 @@ class medicaid_ltss_individual_countable_income(Variable): "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=10", "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71", - "https://regulations.delaware.gov/api/AdminCode/title16/20000/13aee487-1cd1-4726-addf-63603af28a78#page=6", + "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5", "https://www.ssa.gov/OP_Home/cfr20/416/416-1112.htm", "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1340", ) @@ -67,7 +67,7 @@ def formula_2026_01_01(person, period, parameters): community_spouse_budget, ordinary_budget, ) - washington_excluded = person("medicaid_ltss_wa_excluded_income", period) + washington_excluded = person("wa_medicaid_ltss_excluded_income", period) texas_excluded = person( "tx_medicaid_ltss_excluded_interest_and_dividends", period ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py index 36dff59154e..85be2858541 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py @@ -15,7 +15,7 @@ class medicaid_ltss_medically_needy_expenses(Variable): "applicable expense categories, ordering, and documentation; the " "model does not adjudicate expenses or calculate a spenddown budget " "period. Omit source receipts already removed by " - "medicaid_ltss_wa_excluded_income, including modeled interest, " + "wa_medicaid_ltss_excluded_income, including modeled interest, " "dividends, SSI, and state public assistance, to avoid a duplicate " "deduction." ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py index a01731f260b..f8d04ca0c0b 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_assistance_unit_size.py @@ -8,10 +8,15 @@ class medicaid_ltss_non_delaware_assistance_unit_size(Variable): definition_period = MONTH default_value = 0 documentation = ( - "Explicit assistance-unit size for states outside Delaware. Use two " - "only where the state budgets both spouses as a couple, including " - "Texas spouses in the same institutional setting, and one for an " - "individual applicant. Zero and unsupported sizes fail closed. " + "Candidate assistance-unit size for states outside Delaware. Report " + "two for Texas spouses in the same institutional setting who must " + "be tested as a couple first. Under G-6120, the derived unit falls " + "back to one for each spouse if the couple exceeds either its " + "income or resource limit. Report one for spouses in separate " + "institutional settings and individual applicants. A community " + "spouse is inconsistent with a couple unit and prevents that " + "fallback, preserving the resource screen's fail-closed result. " + "Zero and unsupported sizes fail closed. " "Delaware ignores this input and derives the unit from the spouses' " "service, location, and duration facts. A separate input preserves " "Delaware derivation in mixed-state populations: providing values " diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py index 94ac838f385..09baa1a0c87 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_non_delaware_community_spouse_countable_resources.py @@ -11,9 +11,13 @@ class medicaid_ltss_non_delaware_community_spouse_countable_resources(Variable): default_value = 0 documentation = ( "The community spouse's own current comprehensive countable-resource " - "inventory for applicants outside Delaware, after applicable ownership " - "and exclusion rules. Delaware instead uses each spouse's own " - "medicaid_ltss_individual_countable_resources in their marital unit. " + "inventory for applicants outside Delaware whose community spouse " + "is outside the simulation, after applicable ownership and exclusion " + "rules. A represented spouse's own " + "medicaid_ltss_individual_countable_resources in the two-person " + "marital unit takes precedence in Texas and Washington as well as " + "Delaware. This fallback is read only for a community-spouse " + "applicant in a singleton marital unit outside Delaware. " "Keeping this input separate from the derived community-spouse " "resource output permits mixed-state populations without overriding " "Delaware's calculation." diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py index fd15436bab8..edde5d45bcf 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py @@ -14,7 +14,11 @@ class medicaid_ltss_qit_adjusted_earned_income(Variable): "excludes entire identified sources in the trust's opening month " "after a partial covered-source deposit and verification of " "subsequent full deposits. The deposited covered-source component " - "is subtracted from that extension to avoid a duplicate exclusion." + "is subtracted from that extension to avoid a duplicate exclusion. " + "Under F-6820, an unverified partial opening-month deposit " + "invalidates the trust for this screen: neither income stream " + "receives a deposited-income exclusion. Full covered deposits " + "retain their actual-deposit exclusion without that verification." ) reference = ( "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", @@ -41,4 +45,11 @@ def formula(person, period, parameters): "tx_medicaid_ltss_qit_opening_month_exclusion_applies", period ) additional_exclusion = where(opening_month, covered - covered_deposits, 0) - return max_(income - deposits - additional_exclusion, 0) + invalid_opening_deposit = person( + "tx_medicaid_ltss_qit_opening_month_deposit_invalid", period + ) + return where( + invalid_opening_deposit, + income, + max_(income - deposits - additional_exclusion, 0), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py index 8c4e6af5d62..6d9056ee31f 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py @@ -14,7 +14,11 @@ class medicaid_ltss_qit_adjusted_unearned_income(Variable): "excludes entire identified sources in the trust's opening month " "after a partial covered-source deposit and verification of " "subsequent full deposits. The deposited covered-source component " - "is subtracted from that extension to avoid a duplicate exclusion." + "is subtracted from that extension to avoid a duplicate exclusion. " + "Under F-6820, an unverified partial opening-month deposit " + "invalidates the trust for this screen: neither income stream " + "receives a deposited-income exclusion. Full covered deposits " + "retain their actual-deposit exclusion without that verification." ) reference = ( "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust", @@ -42,4 +46,11 @@ def formula(person, period, parameters): "tx_medicaid_ltss_qit_opening_month_exclusion_applies", period ) additional_exclusion = where(opening_month, covered - covered_deposits, 0) - return max_(income - deposits - additional_exclusion, 0) + invalid_opening_deposit = person( + "tx_medicaid_ltss_qit_opening_month_deposit_invalid", period + ) + return where( + invalid_opening_deposit, + income, + max_(income - deposits - additional_exclusion, 0), + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py index 23c76b39147..37618fa8a8a 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_subsequent_full_deposits_verified.py @@ -12,8 +12,11 @@ class medicaid_ltss_qit_subsequent_full_deposits_verified(Variable): "amounts of the income sources identified in the qualified income " "trust are deposited in subsequent months. This is a verification " "fact, not a caller-selected eligibility result. Texas requires " - "this verification for a partial opening-month deposit to exclude " - "the entire covered sources. Trust legality and the validity of " - "reported deposits remain outside this financial screen." + "this verification before any exclusion for a partial opening-month " + "deposit. Without it, F-6820 invalidates the trust for this screen, " + "so both earned and unearned income include deposited amounts. " + "Full covered-source deposits retain their ordinary exclusion. " + "Other trust legality and deposit-validity conditions remain " + "outside this financial screen." ) reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py index aaa066b4b1b..1908d4ada20 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_earned_income.py @@ -20,4 +20,4 @@ class medicaid_ltss_reported_gross_earned_income(Variable): "spouse reports their own income; the model combines it when " "couple budgeting applies." ) - reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=6" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py index 1ede106b76b..058de38c62a 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_gross_unearned_income.py @@ -18,4 +18,4 @@ class medicaid_ltss_reported_gross_unearned_income(Variable): "actual monthly amounts. Each spouse reports their own income; " "the model combines it when couple budgeting applies." ) - reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=5" + reference = "https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=6" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py index 33687fc0859..f109293953f 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_unearned_income_deposited_to_qit.py @@ -16,8 +16,11 @@ class medicaid_ltss_unearned_income_deposited_to_qit(Variable): "model excludes these deposits from gross unearned income without " "allowing a negative remainder. The Texas opening-month rule can " "also exclude an entire identified source after verification of " - "subsequent full deposits. Trust legality, irrevocability, " - "funding, payback terms, and the validity of a deposit are unmodeled." + "subsequent full deposits. An unverified partial opening-month " + "deposit invalidates the Texas trust for this screen, restoring " + "both income streams including their deposits. Other trust " + "legality, irrevocability, funding, payback terms, and deposit " + "validity remain unmodeled." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#d_4_B", diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_deposit_invalid.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_deposit_invalid.py new file mode 100644 index 00000000000..47da1000065 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/tx_medicaid_ltss_qit_opening_month_deposit_invalid.py @@ -0,0 +1,59 @@ +from policyengine_us.model_api import * + + +class tx_medicaid_ltss_qit_opening_month_deposit_invalid(Variable): + value_type = bool + entity = Person + label = ( + "Texas Medicaid LTSS QIT partial opening-month deposit invalidates the trust" + ) + definition_period = MONTH + default_value = False + documentation = ( + "Derives the F-6820 invalidation condition for a Texas qualified " + "income trust with a partial covered-source deposit in its opening " + "month when subsequent full deposits have not been verified before " + "certification. Covered deposits are clipped to the identified " + "sources and actual deposits. A partial deposit across the covered " + "sources invalidates the entire trust for this screen, so neither " + "earned nor unearned deposits receive a trust exclusion. A full " + "covered-source deposit does not require this verification. Other " + "trust legality and deposit-validity conditions remain unmodeled." + ) + reference = "https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/f-6800-qualified-income-trust" + + def formula(person, period, parameters): + state = person.household("state_code", period) + opening_year = person("medicaid_ltss_qit_opening_year", period) + opening_month = person("medicaid_ltss_qit_opening_month", period) + verified = person("medicaid_ltss_qit_subsequent_full_deposits_verified", period) + covered_income = person.empty_array() + covered_deposits = person.empty_array() + for source in ["earned", "unearned"]: + gross = max_(person(f"medicaid_ltss_gross_{source}_income", period), 0) + covered = min_( + max_(person(f"medicaid_ltss_qit_covered_{source}_income", period), 0), + gross, + ) + deposits = max_( + person(f"medicaid_ltss_{source}_income_deposited_to_qit", period), 0 + ) + deposited_covered = min_( + max_( + person( + f"medicaid_ltss_qit_covered_{source}_income_deposited", period + ), + 0, + ), + min_(covered, deposits), + ) + covered_income += covered + covered_deposits += deposited_covered + partial_deposit = (covered_deposits > 0) & (covered_deposits < covered_income) + return ( + (state == state.possible_values.TX) + & (opening_year == period.start.year) + & (opening_month == period.start.month) + & partial_deposit + & ~verified + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_excluded_income.py similarity index 98% rename from policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py rename to policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_excluded_income.py index 26042bdb212..272f84b24bc 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_wa_excluded_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_excluded_income.py @@ -1,7 +1,7 @@ from policyengine_us.model_api import * -class medicaid_ltss_wa_excluded_income(Variable): +class wa_medicaid_ltss_excluded_income(Variable): value_type = float entity = Person label = "Washington Medicaid LTSS modeled income exclusions" From 274d4141f0b13e4bf86eb0a8e928930ab7ad725b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 15 Oct 2026 02:34:42 -0400 Subject: [PATCH 33/34] Refine LTSS source contracts, ownership checks, and indexing --- .../gov/bls/cpi/cpi_u_nsa_september.yaml | 5 +- .../financial/de/income/earned_disregard.yaml | 11 - .../income/earned_income_countable_rate.yaml | 11 - .../de/income/general_disregard.yaml | 15 -- .../financial/federal/csra/maximum_base.yaml | 11 + .../financial/federal/csra/minimum_base.yaml | 11 + .../financial/federal/indexing/base_year.yaml | 11 + .../percentage_rounding_interval.yaml | 11 + .../federal/indexing/reference_month.yaml | 11 + .../financial/federal/mmmna/maximum_base.yaml | 11 + .../wa/medically_needy/income_level.yaml | 2 - .../parameters/uprating_extensions.py | 88 +++++++ policyengine_us/programs.yaml | 4 +- ...test_medicaid_ltss_financial_invariants.py | 9 +- ...edicaid_spousal_impoverishment_indexing.py | 190 +++++++++++++++ ...aid_ltss_financial_threshold_eligible.yaml | 8 +- .../is_medicaid_ltss_income_eligible.yaml | 166 ++++++++++--- .../medicaid_ltss_csra_resource_eligible.yaml | 228 ++++++++++++++++++ .../medicaid_ltss_financial_pathway.yaml | 10 + .../medicaid_ltss_home_equity_eligible.yaml | 49 ++-- .../financial/medicaid_ltss_mmmna.yaml | 16 ++ .../medicaid_ltss_special_income_limit.yaml | 5 + .../medicaid_ltss_couple_countable_income.py | 25 +- .../medicaid_ltss_csra_resource_eligible.py | 17 +- .../medicaid_ltss_dividend_income.py | 13 +- .../medicaid_ltss_financial_pathway.py | 6 +- .../medicaid_ltss_gross_earned_income.py | 9 +- .../medicaid_ltss_gross_unearned_income.py | 9 +- ...dicaid_ltss_individual_countable_income.py | 27 +-- .../medicaid_ltss_interest_income.py | 13 +- ...icaid_ltss_irwe_allocate_over_12_months.py | 1 + ...aid_ltss_irwe_monthly_business_expenses.py | 1 + .../medicaid_ltss_irwe_monthly_payments.py | 1 + ...dicaid_ltss_irwe_monthly_reimbursements.py | 1 + ...tss_irwe_nonrecurring_business_expenses.py | 1 + ...medicaid_ltss_irwe_nonrecurring_payment.py | 1 + ...id_ltss_irwe_nonrecurring_reimbursement.py | 1 + .../medicaid_ltss_irwe_working_when_paid.py | 1 + .../medicaid_ltss_reported_dividend_income.py | 5 +- .../medicaid_ltss_reported_interest_income.py | 3 +- ..._ltss_jointly_owned_countable_resources.py | 9 +- ...d_ltss_solely_owned_countable_resources.py | 9 +- 42 files changed, 889 insertions(+), 147 deletions(-) delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml delete mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum_base.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum_base.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/base_year.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/percentage_rounding_interval.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/reference_month.yaml create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum_base.yaml create mode 100644 policyengine_us/tests/core/test_medicaid_spousal_impoverishment_indexing.py diff --git a/policyengine_us/parameters/gov/bls/cpi/cpi_u_nsa_september.yaml b/policyengine_us/parameters/gov/bls/cpi/cpi_u_nsa_september.yaml index 738737b408f..9db71ff04ed 100644 --- a/policyengine_us/parameters/gov/bls/cpi/cpi_u_nsa_september.yaml +++ b/policyengine_us/parameters/gov/bls/cpi/cpi_u_nsa_september.yaml @@ -1,6 +1,7 @@ -description: The Bureau of Labor Statistics publishes this September value of the Consumer Price Index for All Urban Consumers, not seasonally adjusted, from which CMS takes the September-to-September percentage change it applies to the Medicaid long-term care home equity limits. +description: The Bureau of Labor Statistics provides this September value of the not seasonally adjusted Consumer Price Index for All Urban Consumers. values: # BLS series CUUR0000SA0 (U.S. city average, all items, 1982-84=100). + 1988-09-01: 119.8 2018-09-01: 252.439 2019-09-01: 256.759 2020-09-01: 260.28 @@ -16,3 +17,5 @@ metadata: reference: - title: BLS | CPI-U, U.S. city average, all items, not seasonally adjusted (CUUR0000SA0) href: https://data.bls.gov/timeseries/CUUR0000SA0 + - title: BLS | Historical Consumer Price Index for All Urban Consumers, September 2018 release + href: https://www.bls.gov/cpi/tables/supplemental-files/historical-cpi-u-201809.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml deleted file mode 100644 index 5be8f411751..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_disregard.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Delaware excludes this amount of monthly earned income for applicants without a community spouse under the Medicaid long-term services and supports program. -values: - 2026-01-01: 65 - -metadata: - unit: currency-USD - period: month - label: Delaware Medicaid LTSS earned income disregard - reference: - - title: DSSM 20240.3 - Earned Income, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml deleted file mode 100644 index 7b8c67cb96d..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/earned_income_countable_rate.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Delaware uses this share of remaining monthly earned income for applicants without a community spouse under the Medicaid long-term services and supports program. -values: - 2026-01-01: 0.5 - -metadata: - unit: /1 - period: month - label: Delaware Medicaid LTSS remaining earned income countable rate - reference: - - title: DSSM 20240.3 - Earned Income, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml deleted file mode 100644 index 01d1dda17db..00000000000 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/income/general_disregard.yaml +++ /dev/null @@ -1,15 +0,0 @@ -description: Delaware excludes this amount of monthly income under the Medicaid long-term services and supports program. -values: - 2026-01-01: 20 - -metadata: - unit: currency-USD - period: month - label: Delaware Medicaid LTSS general income disregard - reference: - - title: Delaware DMMA Administrative Notice A-14-2025, 2026 SSI-Related Income Standards and Medicare Premiums - href: https://dhss.delaware.gov/wp-content/uploads/sites/11/2026/06/2026-SSI-Related-Income-Standards-and-Medicare-Premiums.pdf#page=1 - - title: DSSM 20240.1 - Gross Income, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=9 - - title: DSSM 20990 - Income Rules, 16 DE Admin Code 20000 - href: https://regulations.delaware.gov/api/AdminCode/title16/20000/61c317a6-5b56-4745-83ff-60107295dd03#page=71 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum_base.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum_base.yaml new file mode 100644 index 00000000000..bea34f0bf95 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum_base.yaml @@ -0,0 +1,11 @@ +description: The Department of Health and Human Services sets this statutory base for the maximum community spouse resource allowance under the Medicaid long-term services and supports program. +values: + 1989-01-01: 60_000 + +metadata: + unit: currency-USD + period: year + label: Federal Medicaid LTSS maximum CSRA statutory base + reference: + - title: 42 USC 1396r-5(f)(2)(A)(ii)(II) and (g) - Maximum community spouse resource allowance and indexing + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum_base.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum_base.yaml new file mode 100644 index 00000000000..6ba8167ba5f --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum_base.yaml @@ -0,0 +1,11 @@ +description: The Department of Health and Human Services sets this statutory base for the minimum community spouse resource allowance under the Medicaid long-term services and supports program. +values: + 1989-01-01: 12_000 + +metadata: + unit: currency-USD + period: year + label: Federal Medicaid LTSS minimum CSRA statutory base + reference: + - title: 42 USC 1396r-5(f)(2)(A)(i) and (g) - Minimum community spouse resource allowance and indexing + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#f_2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/base_year.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/base_year.yaml new file mode 100644 index 00000000000..d4aefc5321b --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/base_year.yaml @@ -0,0 +1,11 @@ +description: The Department of Health and Human Services uses this base year for indexing federal spousal impoverishment standards under the Medicaid long-term services and supports program. +values: + 1989-01-01: 1988 + +metadata: + unit: year + period: year + label: Federal Medicaid LTSS spousal impoverishment CPI base year + reference: + - title: 42 USC 1396r-5(g) - Indexing dollar amounts + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#g diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/percentage_rounding_interval.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/percentage_rounding_interval.yaml new file mode 100644 index 00000000000..4d67599bed2 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/percentage_rounding_interval.yaml @@ -0,0 +1,11 @@ +description: The Department of Health and Human Services sets this rounding interval in percentage points for cumulative CPI increases under the Medicaid long-term services and supports program. +values: + 1989-01-01: 0.1 + +metadata: + unit: /1 + period: year + label: Federal Medicaid LTSS cumulative CPI percentage rounding interval + reference: + - title: Updated 2026 SSI and Spousal Impoverishment Standards, CMCS Informational Bulletin, April 27, 2026 + href: https://www.medicaid.gov/sites/default/files/2026-04/cib04272026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/reference_month.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/reference_month.yaml new file mode 100644 index 00000000000..05466633119 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/indexing/reference_month.yaml @@ -0,0 +1,11 @@ +description: The Department of Health and Human Services uses this month for indexing federal spousal impoverishment standards under the Medicaid long-term services and supports program. +values: + 1989-01-01: 9 + +metadata: + unit: month + period: year + label: Federal Medicaid LTSS spousal impoverishment CPI reference month + reference: + - title: 42 USC 1396r-5(g) - Indexing dollar amounts + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#g diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum_base.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum_base.yaml new file mode 100644 index 00000000000..aaf84a606e3 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum_base.yaml @@ -0,0 +1,11 @@ +description: The Department of Health and Human Services sets this statutory base for the maximum monthly maintenance needs allowance under the Medicaid long-term services and supports program. +values: + 1989-01-01: 1_500 + +metadata: + unit: currency-USD + period: month + label: Federal Medicaid LTSS maximum MMMNA statutory base + reference: + - title: 42 USC 1396r-5(d)(3)(C) and (g) - Maximum monthly maintenance needs allowance and indexing + href: https://www.law.cornell.edu/uscode/text/42/1396r-5#d_3 diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml index f3c9bc5c68b..8b051886a52 100644 --- a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -12,7 +12,5 @@ metadata: href: https://app.leg.wa.gov/wac/default.aspx?cite=182-519-0050 - title: Washington Apple Health Income and Resource Standards, January 1, 2026 href: https://www.hca.wa.gov/assets/free-or-low-cost/income-standards-20260101.pdf#page=3 - - title: WAC 182-513-1395 - Institutional SSI-related medically needy eligibility - href: https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1395 - title: WAC 182-515-1508 - HCS waiver financial eligibility using institutional rules href: https://app.leg.wa.gov/wac/default.aspx?cite=182-515-1508 diff --git a/policyengine_us/parameters/uprating_extensions.py b/policyengine_us/parameters/uprating_extensions.py index 50c38200930..a8dab1253b4 100644 --- a/policyengine_us/parameters/uprating_extensions.py +++ b/policyengine_us/parameters/uprating_extensions.py @@ -673,6 +673,90 @@ def extend_medicaid_home_equity_limits( ) +def get_cms_spousal_impoverishment_multiplier( + parameters: ParameterNode, year: int +) -> float: + """CMS's cumulative 42 USC 1396r-5(g) CPI-U adjustment multiplier. + + The statutory CSRA and MMMNA bases are adjusted by CPI-U growth from + September 1988 to September before the eligibility year. CMS's annual + bulletins round this cumulative percentage to one decimal place before + applying it: the 2026 increase is 171.1%, giving a multiplier of 2.711. + This cumulative calculation avoids compounding rounded annual increases. + + Published not-seasonally-adjusted Septembers take precedence. Beyond the + last publication, the model's projected CPI-U growth is applied to that + published NSA level. Normalizing the forecast at the last common month + avoids treating the SA/NSA level difference as future inflation. + """ + cpi = parameters.gov.bls.cpi + indexing = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal.indexing + date = f"{year}-01-01" + base_year = int(indexing.base_year(date)) + reference_month = int(indexing.reference_month(date)) + rounding_interval = Decimal(str(indexing.percentage_rounding_interval(date))) + base_date = f"{base_year}-{reference_month:02d}-01" + current_date = f"{year - 1}-{reference_month:02d}-01" + september = cpi.cpi_u_nsa_september + published_dates = {value.instant_str for value in september.values_list} + base = Decimal(str(september(base_date))) + if current_date in published_dates: + current = Decimal(str(september(current_date))) + else: + anchor_date = max(date for date in published_dates if date < current_date) + anchor = Decimal(str(september(anchor_date))) + projected_current = Decimal( + str(get_projected_cpi_u_for_month(cpi.cpi_u, instant(current_date))) + ) + projected_anchor = Decimal( + str(get_projected_cpi_u_for_month(cpi.cpi_u, instant(anchor_date))) + ) + current = anchor * projected_current / projected_anchor + change = 100 * (current / base - 1) + rounded_change = (change / rounding_interval).quantize( + Decimal(1), rounding=ROUND_HALF_UP + ) * rounding_interval + return float(1 + max(rounded_change, 0) / 100) + + +def extend_medicaid_spousal_impoverishment_standards( + parameters: ParameterNode, end_year: int +) -> None: + """Project federal CSRA bounds and the MMMNA maximum under 1396r-5(g). + + Each unpublished year's standards apply the cumulative CPI-U multiplier + to the statutory dollar bases, effective January 1. CMS-published values + encoded in YAML take precedence for their years. July's minimum MMMNA + follows the separate poverty-guideline schedule and is not changed here. + + Like the other projections in this module, the values are fixed when the + parameter tree is built; later reforms can override individual years. + """ + federal = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal + multipliers = {} + for parameter, statutory_base in ( + (federal.csra.minimum, federal.csra.minimum_base), + (federal.csra.maximum, federal.csra.maximum_base), + (federal.mmmna.maximum, federal.mmmna.maximum_base), + ): + first_projected_year = 1 + max( + int(value.instant_str[:4]) for value in parameter.values_list + ) + for year in range(first_projected_year, end_year + 1): + if year not in multipliers: + multipliers[year] = get_cms_spousal_impoverishment_multiplier( + parameters, year + ) + value = Decimal(str(statutory_base(f"{year}-01-01"))) * Decimal( + str(multipliers[year]) + ) + parameter.update(period=f"year:{year}-01-01:1", value=float(value)) + parameter.update( + start=instant(f"{end_year}-01-01"), + value=parameter(f"{end_year}-01-01"), + ) + + def extend_wa_millionaires_standard_deduction( parameters: ParameterNode, end_year: int, @@ -1176,6 +1260,10 @@ def set_all_uprating_parameters(parameters: ParameterNode) -> ParameterNode: # Medicaid long-term care home equity limits, CMS's rounded CPI-U method extend_medicaid_home_equity_limits(parameters, end_year=END_YEAR) + # Federal Medicaid CSRA bounds and MMMNA maximum use cumulative CPI-U + # since September 1988, rather than chaining annual rounded changes. + extend_medicaid_spousal_impoverishment_standards(parameters, end_year=END_YEAR) + # The limits on a dependent's standard deduction follow 26 U.S.C. # 63(c)(4)'s chained CPI-U schedule, computed from the statutory 1987 and # 1997 bases. Must run after the Chained CPI-U extension above so diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 55dec7dba2e..1f5263db3e6 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -194,7 +194,9 @@ programs: services and supports: the special income limit, qualified income trusts, Washington's medically needy route, resources, the community spouse resource allowance, home equity, and the community spouse - maintenance needs allowance. Income and resources are trusted inputs. + maintenance needs allowance. Income exclusions and couple budgets are + derived from each person's gross receipts, deposit facts, and comprehensive + countable-resource inventory; asset classification remains caller-supplied. The screen does not feed Medicaid eligibility, enrollment, or benefit values, and states other than Texas, Delaware, and Washington are unmodeled. diff --git a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py index 4a961c8aebb..80b78f74ec8 100644 --- a/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -1205,16 +1205,18 @@ def test_more_nonrecurring_expense_never_raises_countable_income(allocate): def test_irwe_allocation_preserves_the_payment_month_rule_after_a_duration_reduction(): # YAML inline parameter overrides apply a scalar across all test years. - # A dated reform is needed to distinguish a purchase's allocation rule - # from the current rule. This adds one isolated reform model, no dataset. + # A dated reform distinguishes each purchase's allocation rule. Clone + # loaded policy for this isolated reform, with no dataset or baseline branch. path = ( "gov.hhs.medicaid.eligibility.long_term_care.financial." "federal.irwe.allocation_months" ) reform = Reform.from_dict({path: {"2026-07-01": 6}}) + reformed_system = system.clone() + reform.apply(reformed_system) assessment = "2026-09" simulation = Simulation( - reform=reform, + tax_benefit_system=reformed_system, situation={ "people": { "older_purchase": { @@ -1256,3 +1258,4 @@ def test_irwe_allocation_preserves_the_payment_month_rule_after_a_duration_reduc ), [400, 800], ) + assert system.parameters.get_child(path)(f"{assessment}-01") == 12 diff --git a/policyengine_us/tests/core/test_medicaid_spousal_impoverishment_indexing.py b/policyengine_us/tests/core/test_medicaid_spousal_impoverishment_indexing.py new file mode 100644 index 00000000000..bd96b6a5103 --- /dev/null +++ b/policyengine_us/tests/core/test_medicaid_spousal_impoverishment_indexing.py @@ -0,0 +1,190 @@ +"""CMS cumulative CPI indexing and projection of federal spousal standards. + +These parameter-tree checks cannot use the YAML policy runner: they exercise +projection coverage, published precedence and forecast normalization without +building additional simulations. Published values are from the chart page of +CMS's SSI and spousal impoverishment bulletins for 2021, 2022, 2025 and +2026; statute 42 USC 1396r-5(g) sets the September 1988 reference period. + +The 2020 bulletin publishes a 114.4% cumulative increase, whereas BLS's +September 2019 index (256.759) over September 1988 (119.8) gives 114.3% +after rounding. CMS does not explain the discrepancy in that bulletin. +Keep its published amounts as explicit values rather than deriving 2020 +with a special-case rule; projections begin after the final published year. +""" + +import pytest + +from policyengine_core.parameters import ParameterNode +from policyengine_us.parameters.uprating_extensions import ( + extend_medicaid_spousal_impoverishment_standards, + get_cms_spousal_impoverishment_multiplier, +) +from policyengine_us.system import system + +FEDERAL = ( + system.parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal +) +PUBLISHED_STANDARDS = { + # year: (cumulative CPI increase %, CSRA minimum, CSRA maximum, MMMNA maximum) + 2021: (117.3, 26_076, 130_380, 3_259.5), + 2022: (129.0, 27_480, 137_400, 3_435), + 2025: (163.2, 31_584, 157_920, 3_948), + 2026: (171.1, 32_532, 162_660, 4_066.5), +} + + +@pytest.mark.parametrize("year, published", PUBLISHED_STANDARDS.items()) +def test_cumulative_indexing_reproduces_cms(year, published): + percentage, minimum, maximum, mmmna = published + multiplier = get_cms_spousal_impoverishment_multiplier(system.parameters, year) + assert multiplier == pytest.approx(1 + percentage / 100) + date = f"{year}-01-01" + assert FEDERAL.csra.minimum_base(date) * multiplier == pytest.approx(minimum) + assert FEDERAL.csra.maximum_base(date) * multiplier == pytest.approx(maximum) + assert FEDERAL.mmmna.maximum_base(date) * multiplier == pytest.approx(mmmna) + + +def test_published_and_projected_standards_are_january_parameters(): + assert FEDERAL.csra.minimum("2026-01-01") == 32_532 + assert FEDERAL.csra.maximum("2026-01-01") == 162_660 + assert FEDERAL.mmmna.maximum("2026-01-01") == 4_066.5 + for year in range(2027, 2041): + multiplier = get_cms_spousal_impoverishment_multiplier(system.parameters, year) + for parameter, statutory_base in ( + (FEDERAL.csra.minimum, FEDERAL.csra.minimum_base), + (FEDERAL.csra.maximum, FEDERAL.csra.maximum_base), + (FEDERAL.mmmna.maximum, FEDERAL.mmmna.maximum_base), + ): + current = parameter(f"{year}-01-01") + assert current == pytest.approx( + statutory_base(f"{year}-01-01") * multiplier + ) + for month in ("02", "07", "12"): + assert parameter(f"{year}-{month}-01") == current + assert FEDERAL.csra.minimum("2027-01-01") > FEDERAL.csra.minimum("2026-01-01") + + +def _parameters(published_maximum=False, minimum_base=12_000): + maximum = {"2026-01-01": 162_660} + if published_maximum: + maximum["2027-01-01"] = 200_000 + return ParameterNode( + data={ + "gov": { + "hhs": { + "medicaid": { + "eligibility": { + "long_term_care": { + "financial": { + "federal": { + "indexing": { + "base_year": { + "values": {"1989-01-01": 1988} + }, + "reference_month": { + "values": {"1989-01-01": 9} + }, + "percentage_rounding_interval": { + "values": {"1989-01-01": 0.1} + }, + }, + "csra": { + "minimum": { + "values": {"2026-01-01": 32_532} + }, + "maximum": {"values": maximum}, + "minimum_base": { + "values": {"1989-01-01": minimum_base} + }, + "maximum_base": { + "values": {"1989-01-01": 60_000} + }, + }, + "mmmna": { + "maximum": { + "values": {"2026-01-01": 4_066.5} + }, + "maximum_base": { + "values": {"1989-01-01": 1_500} + }, + }, + } + } + } + } + } + }, + "bls": { + "cpi": { + "cpi_u_nsa_september": { + "values": {"1988-09-01": 119.8, "2025-09-01": 324.8} + }, + # A different SA level at the common September must + # not become an inflation adjustment. The forecast + # rises 4% a year regardless of this level difference. + "cpi_u": { + "values": { + "2025-09-01": 300, + "2026-09-01": 312, + "2027-09-01": 324.48, + } + }, + } + }, + } + } + ) + + +def test_projection_normalizes_to_the_last_published_nsa_level(): + parameters = _parameters() + # 324.8 x (312 / 300) / 119.8 = 2.81963272...; CMS rounds the + # cumulative increase to 182.0%, giving the multiplier 2.820. + assert get_cms_spousal_impoverishment_multiplier(parameters, 2027) == 2.820 + # Published 2026 uses NSA 324.8 directly, not the SA level of 300. + assert get_cms_spousal_impoverishment_multiplier(parameters, 2026) == 2.711 + extend_medicaid_spousal_impoverishment_standards(parameters, end_year=2030) + federal = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal + assert federal.csra.minimum("2027-01-01") == 33_840 + assert federal.csra.maximum("2027-01-01") == 169_200 + assert federal.mmmna.maximum("2027-01-01") == 4_230 + # Chaining the rounded 2026 standard by 4% would produce $33,833.28. + assert federal.csra.minimum("2027-01-01") != 32_532 * 1.04 + + +@pytest.mark.parametrize("published_maximum", [False, True]) +def test_each_standard_respects_its_own_published_coverage(published_maximum): + parameters = _parameters(published_maximum) + extend_medicaid_spousal_impoverishment_standards(parameters, end_year=2030) + federal = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal + expected_maximum = 200_000 if published_maximum else 169_200 + assert federal.csra.maximum("2027-01-01") == expected_maximum + assert federal.csra.minimum("2027-01-01") == 33_840 + assert federal.mmmna.maximum("2027-01-01") == 4_230 + assert federal.csra.maximum("2028-01-01") == 175_920 + + +def test_historical_published_standards_are_preserved(): + parameters = _parameters() + federal = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal + # CMS cib062420-new.pdf p.2: this published year differs from the + # rounded raw-index ratio and must remain authoritative for its year. + published = ( + (federal.csra.minimum, 25_728), + (federal.csra.maximum, 128_640), + (federal.mmmna.maximum, 3_216), + ) + for parameter, value in published: + parameter.update(period="year:2020-01-01:1", value=value) + extend_medicaid_spousal_impoverishment_standards(parameters, end_year=2030) + for parameter, value in published: + assert parameter("2020-01-01") == value + + +def test_projection_reads_reformed_statutory_bases(): + parameters = _parameters(minimum_base=13_000) + extend_medicaid_spousal_impoverishment_standards(parameters, end_year=2027) + federal = parameters.gov.hhs.medicaid.eligibility.long_term_care.financial.federal + assert federal.csra.minimum("2027-01-01") == 36_660 + assert federal.csra.maximum("2027-01-01") == 169_200 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml index 0cfe32b445d..e77313530a8 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_financial_threshold_eligible.yaml @@ -533,7 +533,7 @@ people: applicant_1: medicaid_ltss_setting: INSTITUTIONAL - is_ssi_aged_blind_disabled: &id001 + is_ssi_aged_blind_disabled: 2026: true medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_reported_gross_unearned_income: 2000 @@ -546,7 +546,8 @@ medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 applicant_2: medicaid_ltss_setting: INSTITUTIONAL - is_ssi_aged_blind_disabled: *id001 + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_reported_gross_unearned_income: 2000 medicaid_ltss_has_community_spouse: true @@ -558,7 +559,8 @@ medicaid_ltss_non_delaware_community_spouse_countable_resources: 98000 applicant_3: medicaid_ltss_setting: INSTITUTIONAL - is_ssi_aged_blind_disabled: *id001 + is_ssi_aged_blind_disabled: + 2026: true medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_reported_gross_unearned_income: 2000 medicaid_ltss_has_community_spouse: true diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml index 94c33f6de90..4effe957825 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.yaml @@ -629,7 +629,7 @@ medicaid_ltss_financial_pathway: [INSTITUTIONAL_MEDICALLY_NEEDY, INSTITUTIONAL_MEDICALLY_NEEDY] is_medicaid_ltss_income_eligible: [true, false] -- name: Washington COPES medically needy income level follows SSI uprating in 2027. +- name: Case 13, Washington COPES medically needy income level follows SSI uprating in 2027. period: 2027-01 input: state_code: @@ -646,7 +646,7 @@ medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY is_medicaid_ltss_income_eligible: true -- name: Case 13, Delaware computes ordered exclusions from raw earnings. +- name: Case 14, Delaware computes ordered exclusions from raw earnings. period: 2026-07 input: people: @@ -698,7 +698,7 @@ is_medicaid_ltss_income_eligible: [true, false, false, true, false] medicaid_ltss_countable_income: [2485, 2486, 5035, 2485, 9980] -- name: Delaware excludes ordinary unearned income before halving earnings +- name: Case 15, Delaware excludes ordinary unearned income before halving earnings. period: 2026-07 input: state_code: @@ -714,7 +714,7 @@ medicaid_ltss_countable_income: 547.5 is_medicaid_ltss_income_eligible: true -- name: Delaware carries unused general exclusion to earnings before the earned exclusion +- name: Case 16, Delaware carries unused general exclusion to earnings before the earned exclusion. period: 2026-07 input: state_code: @@ -730,7 +730,7 @@ medicaid_ltss_countable_income: 462.5 is_medicaid_ltss_income_eligible: true -- name: Delaware does not apply general exclusion to needs-based unearned income +- name: Case 17, Delaware does not apply general exclusion to needs-based unearned income. period: 2026-07 input: state_code: @@ -746,7 +746,7 @@ medicaid_ltss_countable_income: 557.5 is_medicaid_ltss_income_eligible: true -- name: Delaware clips small earnings after ordered exclusions +- name: Case 18, Delaware clips small earnings after ordered exclusions. period: 2026-07 input: state_code: @@ -762,7 +762,7 @@ medicaid_ltss_countable_income: 0 is_medicaid_ltss_income_eligible: true -- name: Raw earned and unearned components default to existing annual income sources +- name: Case 19, Raw earned and unearned components default to existing annual income sources. period: 2026-07 input: state_code: @@ -779,7 +779,7 @@ medicaid_ltss_gross_unearned_income: 100 medicaid_ltss_countable_income: 547.5 -- name: Source-specific QIT deposits precede Delaware income exclusions +- name: Case 20, Source-specific QIT deposits precede Delaware income exclusions. period: 2026-07 input: state_code: @@ -795,7 +795,7 @@ medicaid_ltss_qit_adjusted_income: 1100 medicaid_ltss_countable_income: 547.5 -- name: Delaware couple raw earnings include the exact limit after one set of exclusions +- name: Case 21, Delaware couple raw earnings include the exact limit after one set of exclusions. period: 2026-07 input: people: @@ -827,7 +827,7 @@ medicaid_ltss_countable_income: [3727.5, 3727.5] is_medicaid_ltss_income_eligible: [true, true] -- name: Delaware couple raw earnings above the limit fail after one set of exclusions +- name: Case 22, Delaware couple raw earnings above the limit fail after one set of exclusions. period: 2026-07 input: people: @@ -860,7 +860,7 @@ medicaid_ltss_countable_income: [3728.5, 3728.5] is_medicaid_ltss_income_eligible: [false, false] -- name: Delaware mixed-income couple shares one general and earned exclusion +- name: Case 23, Delaware mixed-income couple shares one general and earned exclusion. period: 2026-07 input: people: @@ -892,7 +892,7 @@ medicaid_ltss_countable_income: [3747.5, 3747.5] is_medicaid_ltss_income_eligible: [false, false] -- name: Delaware derives remaining needs-based income from raw QIT source deposits +- name: Case 24, Delaware derives remaining needs-based income from raw QIT source deposits. period: 2026-07 input: state_code: @@ -910,7 +910,7 @@ medicaid_ltss_qit_adjusted_needs_based_income: 50 medicaid_ltss_countable_income: 547.5 -- name: Delaware preserves the needs-based carve-out when QIT classifications are incomplete +- name: Case 25, Delaware preserves the needs-based carve-out when QIT classifications are incomplete. period: 2026-07 input: state_code: @@ -928,7 +928,7 @@ medicaid_ltss_qit_adjusted_needs_based_income: 100 medicaid_ltss_countable_income: 557.5 -- name: Reported monthly income preserves other people's annual-source defaults +- name: Case 26, Reported monthly income preserves other people's annual-source defaults. period: 2026-07 input: people: @@ -984,7 +984,7 @@ is_medicaid_ltss_income_eligible: [true, false, false] is_medicaid_ltss_financial_threshold_eligible: [true, false, false] -- name: Delaware deducts impairment-related work expenses before halving earnings +- name: Case 27, Delaware deducts impairment-related work expenses before halving earnings. period: 2026-07 input: state_code: @@ -1007,7 +1007,7 @@ is_medicaid_ltss_income_eligible: true is_medicaid_ltss_financial_threshold_eligible: true -- name: Delaware combines each disabled spouse's work expenses before halving +- name: Case 28, Delaware combines each disabled spouse's work expenses before halving. period: 2026-07 input: people: @@ -1050,7 +1050,7 @@ medicaid_ltss_countable_income: [3727.5, 3727.5] is_medicaid_ltss_income_eligible: [true, true] -- name: Texas QIT opening month excludes a covered pension despite a partial deposit +- name: Case 29, Texas QIT opening month excludes a covered pension despite a partial deposit. period: 2026-07 input: state_code: @@ -1074,7 +1074,7 @@ is_medicaid_ltss_income_eligible: true is_medicaid_ltss_financial_threshold_eligible: true -- name: Texas QIT later month subtracts actual deposits rather than the whole source +- name: Case 30, Texas QIT later month subtracts actual deposits rather than the whole source. period: 2026-08 input: state_code: @@ -1096,7 +1096,7 @@ medicaid_ltss_countable_income: 3500 is_medicaid_ltss_income_eligible: false -- name: Texas QIT opening month also excludes a covered earnings source +- name: Case 31, Texas QIT opening month also excludes a covered earnings source. period: 2026-07 input: state_code: @@ -1119,8 +1119,7 @@ medicaid_ltss_countable_income: 0 is_medicaid_ltss_income_eligible: true -- name: Delaware impairment expense applicability follows disability blindness age and community spouse - facts +- name: Case 32, Delaware impairment expense applicability follows disability blindness age and community spouse facts. period: 2026-07 input: people: @@ -1228,9 +1227,11 @@ state_code: '2026': DE output: + # The community-spouse applicant has qualified expenses available, but + # DSSM 20990's selected budget below applies only the $20 exclusion. + medicaid_ltss_excluded_impairment_related_work_expenses: [400, 0, 400, 0, 0, 400, 100] medicaid_ltss_individual_countable_income: [2485, 2685, 2485, 2685, 2685, 5435, 480] -- name: Texas QIT opening source exclusion requires complete dated and verified facts and avoids overlapping - deposits +- name: Case 33, Texas QIT opening source exclusion requires complete dated and verified facts and avoids overlapping deposits. period: 2026-07 input: people: @@ -1338,7 +1339,7 @@ medicaid_ltss_qit_adjusted_unearned_income: [4000, 3500, 4000, 3500, 3500, 3500, 1500] tx_medicaid_ltss_qit_opening_month_exclusion_applies: [false, false, false, false, false, false, true] tx_medicaid_ltss_qit_opening_month_deposit_invalid: [true, false, false, false, false, false, false] -- name: Texas QIT opening exclusion covers both identified sources with one partial source deposit +- name: Case 34, Texas QIT opening exclusion covers both identified sources with one partial source deposit. period: 2026-07 input: state_code: @@ -1356,7 +1357,7 @@ medicaid_ltss_qit_adjusted_earned_income: 0 medicaid_ltss_qit_adjusted_unearned_income: 0 medicaid_ltss_countable_income: 0 -- name: Washington monthly source reports preserve other applicants annual defaults +- name: Case 35, Washington monthly source reports preserve other applicants annual defaults. period: 2026-07 input: people: @@ -1404,7 +1405,7 @@ is_medicaid_ltss_income_eligible: [true, true] -- name: Delaware derives work expenses from payment facts and the allocation election +- name: Case 36, Delaware derives work expenses from payment facts and the allocation election. period: 2026-07 input: people: @@ -1564,7 +1565,7 @@ is_medicaid_ltss_income_eligible: [true, false, true, true, false, false, false] -- name: Delaware allocation crosses years ends after twelve months and combines purchases +- name: Case 37, Delaware allocation crosses years ends after twelve months and combines purchases. period: 2027-06 input: people: @@ -1639,7 +1640,7 @@ medicaid_ltss_countable_income: [2485, 2685, 2435] -- name: Texas excludes qualifying investment returns but counts pensions and other-resource returns. +- name: Case 38, Texas excludes qualifying investment returns but counts pensions and other-resource returns. period: 2026-07 input: people: @@ -1674,6 +1675,17 @@ medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_setting: INSTITUTIONAL is_ssi_aged_blind_disabled: {2026: true} + marital_units: + annual_interest: + members: [annual_interest] + pension_only: + members: [pension_only] + monthly_dividends: + members: [monthly_dividends] + other_resource_interest: + members: [other_resource_interest] + countable_pension_qit: + members: [countable_pension_qit] households: household: members: [annual_interest, pension_only, monthly_dividends, other_resource_interest, countable_pension_qit] @@ -1687,7 +1699,7 @@ is_medicaid_ltss_income_eligible: [true, false, true, false, true] is_medicaid_ltss_financial_threshold_eligible: [true, false, true, false, true] -- name: Texas couple budgets exclude each spouses qualifying investment receipts. +- name: Case 39, Texas couple budgets exclude each spouses qualifying investment receipts. period: 2026-07 input: people: @@ -1718,7 +1730,7 @@ is_medicaid_ltss_income_eligible: [true, true] -- name: Case 28, the work-expense allocation parameter controls the monthly divisor and final allocated month. +- name: Case 40, the work-expense allocation parameter controls the monthly divisor and final allocated month. period: 2026-07 input: gov.hhs.medicaid.eligibility.long_term_care.financial.federal.irwe.allocation_months: 6 @@ -1977,3 +1989,97 @@ is_medicaid_ltss_income_eligible: [true, true, false, true, false, true, true, true] medicaid_ltss_csra_resource_eligible: [true, true, true, true, true, true, true, true] is_medicaid_ltss_financial_threshold_eligible: [true, true, false, true, false, true, true, true] + + +- name: Case 43, Delaware budgets reuse the SSI general earned and excluded-share parameters. + period: 2026-07 + input: + gov.ssa.ssi.income.exclusions.general: 25 + gov.ssa.ssi.income.exclusions.earned: 75 + gov.ssa.ssi.income.exclusions.earned_share: 0.75 + people: + earned_only: + medicaid_ltss_reported_gross_earned_income: 5055 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + mixed: + medicaid_ltss_reported_gross_earned_income: 1000 + medicaid_ltss_reported_gross_unearned_income: 20 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + marital_units: + earned_only: + members: [earned_only] + mixed: + members: [mixed] + households: + household: + members: [earned_only, mixed] + state_code: {2026: DE} + output: + # (5,055 - 25 - 75) x (1 - 0.75) = 1,238.75. + # The 20 unearned uses 20 of the 25 general disregard, leaving 5: + # (1,000 - 5 - 75) x 0.25 = 230. + medicaid_ltss_individual_countable_income: [1238.75, 230] + is_medicaid_ltss_income_eligible: [true, true] + + +- name: Case 44, Actual monthly gross uses zero unspecified investment sources and accepts explicit receipts. + period: 2026-07 + input: + people: + tx_unspecified: + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_reported_gross_unearned_income: 3050 + dividend_income: {2026: 24000} + interest_income: {2026: 12000} + tx_explicit: + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_reported_gross_unearned_income: 3050 + dividend_income: {2026: 24000} + interest_income: {2026: 12000} + medicaid_ltss_reported_dividend_income: 150 + medicaid_ltss_reported_interest_income: 50 + wa_unspecified: + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_reported_gross_unearned_income: 3050 + dividend_income: {2026: 24000} + interest_income: {2026: 12000} + wa_explicit: + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_reported_gross_unearned_income: 3050 + dividend_income: {2026: 24000} + interest_income: {2026: 12000} + medicaid_ltss_reported_dividend_income: 150 + medicaid_ltss_reported_interest_income: 50 + marital_units: + tx_unspecified: + members: [tx_unspecified] + tx_explicit: + members: [tx_explicit] + wa_unspecified: + members: [wa_unspecified] + wa_explicit: + members: [wa_explicit] + households: + tx: + members: [tx_unspecified, tx_explicit] + state_code: {2026: TX} + wa: + members: [wa_unspecified, wa_explicit] + state_code: {2026: WA} + output: + # Annual 2,000 dividends and 1,000 interest cannot reduce reported 3,050. + # Explicit monthly sources reduce 3,050 - 150 - 50 = 2,850. + medicaid_ltss_dividend_income: [0, 150, 0, 150] + medicaid_ltss_interest_income: [0, 50, 0, 50] + medicaid_ltss_countable_income: [3050, 2850, 3050, 2850] + is_medicaid_ltss_income_eligible: [false, true, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml index 395815c4d9b..88bce27453f 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.yaml @@ -1797,3 +1797,231 @@ medicaid_ltss_csra: [50000, 0, 50000, 0, 50000, 0, 72529, 0, 72529, 0, 72529, 0] medicaid_ltss_csra_resource_eligible: [true, false, false, false, false, false, true, false, false, false, false, false] is_medicaid_ltss_financial_threshold_eligible: [true, false, false, false, false, false, true, false, false, false, false, false] + + +- name: Case 32, Washington pre-1989 resource eligibility requires both ownership inventories and distinguishes explicit zero. + period: 2026-09 + input: + people: + omitted_both: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + omitted_sole: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + omitted_joint: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + wa_medicaid_ltss_solely_owned_countable_resources: 4000 + explicit_zero: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + wa_medicaid_ltss_solely_owned_countable_resources: 0 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + at_boundary: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + wa_medicaid_ltss_solely_owned_countable_resources: 4000 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + above_boundary: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + wa_medicaid_ltss_solely_owned_countable_resources: 4001 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + negative_ownership: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: true + medicaid_ltss_reported_gross_unearned_income: 2_500 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_community_spouse_countable_resources: 98_000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100_000 + wa_medicaid_ltss_solely_owned_countable_resources: -2 + wa_medicaid_ltss_jointly_owned_countable_resources: 0 + marital_units: + omitted_both: + members: [omitted_both] + omitted_sole: + members: [omitted_sole] + omitted_joint: + members: [omitted_joint] + explicit_zero: + members: [explicit_zero] + at_boundary: + members: [at_boundary] + above_boundary: + members: [above_boundary] + negative_ownership: + members: [negative_ownership] + households: + household: + members: [omitted_both, omitted_sole, omitted_joint, explicit_zero, at_boundary, above_boundary, negative_ownership] + state_code: + 2026: WA + output: + # The reviewer's $2,000 applicant and $98,000 spouse cannot establish + # legacy eligibility with omitted ownership. Explicit 0/0 counts $0. + # (4,000 + 0) / 2 = $2,000 passes; (4,001 + 0) / 2 = $2,000.50 fails. + wa_medicaid_ltss_solely_owned_countable_resources: [-1, -1, 4000, 0, 4000, 4001, -2] + wa_medicaid_ltss_jointly_owned_countable_resources: [-1, 0, -1, 0, 0, 0, 0] + medicaid_ltss_csra: [0, 0, 0, 0, 0, 0, 0] + medicaid_ltss_csra_resource_eligible: [false, false, false, true, true, false, false] + is_medicaid_ltss_financial_threshold_eligible: [false, false, false, true, true, false, false] + + +- name: Case 33, TX modern continuing determinations exclude the represented community spouses inventory. + period: 2026-07 + input: + people: + at_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 1 + at_limit_spouse: + medicaid_ltss_individual_countable_resources: 400000 + above_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_individual_countable_resources: 2001 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 1 + above_limit_spouse: + medicaid_ltss_individual_countable_resources: 400000 + marital_units: + at_limit: + members: [at_limit, at_limit_spouse] + above_limit: + members: [above_limit, above_limit_spouse] + households: + household: + members: [at_limit, at_limit_spouse, above_limit, above_limit_spouse] + state_code: {2026: TX} + output: + # The 400,000 spouse inventory exceeds either CSRA but is unavailable + # after the initial determination. Own 2,000 passes; own 2,001 fails. + medicaid_ltss_community_spouse_countable_resources: [400000, 0, 400000, 0] + medicaid_ltss_csra_resource_eligible: [true, false, false, false] + + +- name: Case 34, WA modern continuing determinations exclude the represented community spouses inventory. + period: 2026-07 + input: + people: + at_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_individual_countable_resources: 2000 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 1 + at_limit_spouse: + medicaid_ltss_individual_countable_resources: 400000 + above_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: {2026: true} + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_is_initial_eligibility_determination: false + medicaid_ltss_individual_countable_resources: 2001 + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100000 + wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization: 100000 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 2026 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 1 + above_limit_spouse: + medicaid_ltss_individual_countable_resources: 400000 + marital_units: + at_limit: + members: [at_limit, at_limit_spouse] + above_limit: + members: [above_limit, above_limit_spouse] + households: + household: + members: [at_limit, at_limit_spouse, above_limit, above_limit_spouse] + state_code: {2026: WA} + output: + # The 400,000 spouse inventory exceeds either CSRA but is unavailable + # after the initial determination. Own 2,000 passes; own 2,001 fails. + medicaid_ltss_community_spouse_countable_resources: [400000, 0, 400000, 0] + medicaid_ltss_csra_resource_eligible: [true, false, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml index 35514ef1ee4..9eb8e65a6bd 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -266,6 +266,11 @@ 2026: true medicaid_ltss_waiver: NONE medicaid_ltss_non_delaware_assistance_unit_size: -1 + marital_units: + three_person_unit: + members: [three_person_unit] + negative_unit: + members: [negative_unit] households: household: members: [three_person_unit, negative_unit] @@ -291,6 +296,11 @@ 2026: true medicaid_ltss_waiver: WA_NEW_FREEDOM medicaid_ltss_non_delaware_assistance_unit_size: 1 + marital_units: + copes: + members: [copes] + new_freedom: + members: [new_freedom] households: household: members: [copes, new_freedom] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml index a947a0b1ccd..5c09595364d 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.yaml @@ -1,4 +1,4 @@ -- name: Delaware combines married co-owners' interests in their retained home. +- name: Case 1, Delaware combines married co-owners' interests in their retained home. period: 2026-07 input: people: @@ -39,7 +39,7 @@ # Combined interests are $1m (fail), $752k (pass), and $750k (pass). medicaid_ltss_home_equity_eligible: [false, false, true, true, true, true] -- name: Delaware married ownership remains combined under individual budgets. +- name: Case 2, Delaware married ownership remains combined under individual budgets. period: 2026-07 input: people: @@ -58,7 +58,7 @@ output: medicaid_ltss_home_equity_eligible: [false, false] -- name: Case 1, Texas home-equity cap includes the exact boundary. +- name: Case 3, Texas home-equity cap includes the exact boundary. period: 2026-07 input: people: @@ -133,7 +133,7 @@ output: medicaid_ltss_home_equity_eligible: [true, true, false] -- name: Case 2, Washington home-equity cap includes the exact boundary. +- name: Case 4, Washington home-equity cap includes the exact boundary. period: 2026-07 input: people: @@ -208,7 +208,7 @@ output: medicaid_ltss_home_equity_eligible: [true, true, false] -- name: Case 3, a resident spouse exception applies above the Texas cap. +- name: Case 5, a resident spouse exception applies above the Texas cap. period: 2026-07 input: state_code: @@ -225,7 +225,7 @@ output: medicaid_ltss_home_equity_eligible: true -- name: Case 4, a resident child under age 21 exception applies above the Texas cap. +- name: Case 6, a resident child under age 21 exception applies above the Texas cap. period: 2026-07 input: state_code: @@ -242,7 +242,7 @@ output: medicaid_ltss_home_equity_eligible: true -- name: Case 5, a resident blind or disabled child exception applies above the Texas cap. +- name: Case 7, a resident blind or disabled child exception applies above the Texas cap. period: 2026-07 input: state_code: @@ -259,7 +259,7 @@ output: medicaid_ltss_home_equity_eligible: true -- name: Case 6, a granted hardship waiver applies above the Texas cap. +- name: Case 8, a granted hardship waiver applies above the Texas cap. period: 2026-07 input: state_code: @@ -276,7 +276,7 @@ output: medicaid_ltss_home_equity_eligible: true -- name: Case 7, Delaware applies the federal-minimum cap at the exact boundary. +- name: Case 9, Delaware applies the federal-minimum cap at the exact boundary. period: 2026-07 input: people: @@ -350,7 +350,7 @@ [SPECIAL_INCOME, SPECIAL_INCOME, SPECIAL_INCOME] medicaid_ltss_home_equity_eligible: [true, true, false] -- name: Case 8, a Delaware non-homeowner passes the home-equity screen. +- name: Case 10, a Delaware non-homeowner passes the home-equity screen. period: 2026-07 input: state_code: @@ -366,7 +366,7 @@ medicaid_ltss_financial_pathway: SPECIAL_INCOME medicaid_ltss_home_equity_eligible: true -- name: Case 9, encumbrances land exactly at the Texas cap. +- name: Case 11, encumbrances land exactly at the Texas cap. period: 2026-07 input: people: @@ -410,7 +410,7 @@ output: medicaid_ltss_home_equity_eligible: [true, false] -- name: Case 10, invalid ownership shares fail closed. +- name: Case 12, invalid ownership shares fail closed. period: 2026-07 input: people: @@ -454,7 +454,7 @@ output: medicaid_ltss_home_equity_eligible: [false, false] -- name: Case 11, an unmodeled state passes at the federal minimum and fails closed above it. +- name: Case 13, an unmodeled state passes at the federal minimum and fails closed above it. period: 2026-07 input: people: @@ -531,7 +531,7 @@ medicaid_ltss_home_equity_eligible: [true, true, false] is_medicaid_ltss_financial_threshold_eligible: [false, false, false] -- name: Case 12, resident exceptions and hardship waivers pass despite an invalid ownership share. +- name: Case 14, resident exceptions and hardship waivers pass despite an invalid ownership share. period: 2026-07 input: people: @@ -543,6 +543,11 @@ medicaid_ltss_home_market_value: 2_000_000 medicaid_ltss_home_ownership_share: -0.5 medicaid_ltss_home_equity_hardship_waiver: true + marital_units: + spouse_exception: + members: [spouse_exception] + hardship_waiver: + members: [hardship_waiver] households: household: members: [spouse_exception, hardship_waiver] @@ -551,7 +556,7 @@ output: medicaid_ltss_home_equity_eligible: [true, true] -- name: Case 13, a zero ownership share and negative equity both pass. +- name: Case 15, a zero ownership share and negative equity both pass. period: 2026-07 input: people: @@ -562,6 +567,11 @@ medicaid_ltss_home_market_value: 500_000 medicaid_ltss_home_encumbrances: 900_000 medicaid_ltss_home_ownership_share: 1 + marital_units: + zero_share: + members: [zero_share] + negative_equity: + members: [negative_equity] households: household: members: [zero_share, negative_equity] @@ -570,7 +580,7 @@ output: medicaid_ltss_home_equity_eligible: [true, true] -- name: Case 14, resident-child exceptions apply above the Delaware and Washington caps. +- name: Case 16, resident-child exceptions apply above the Delaware and Washington caps. period: 2026-07 input: people: @@ -585,6 +595,13 @@ washington_no_exception: medicaid_ltss_home_market_value: 2_000_000 medicaid_ltss_home_ownership_share: 1 + marital_units: + delaware_child_under_21: + members: [delaware_child_under_21] + washington_disabled_child: + members: [washington_disabled_child] + washington_no_exception: + members: [washington_no_exception] households: delaware: members: [delaware_child_under_21] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml index 28078b98b30..822382b302c 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -290,6 +290,15 @@ medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: false medicaid_ltss_community_spouse_shelter_expenses: 2_000 + marital_units: + delaware_above_cap: + members: [delaware_above_cap] + delaware_cent_above_cap: + members: [delaware_cent_above_cap] + texas_no_spouse: + members: [texas_no_spouse] + washington_no_spouse: + members: [washington_no_spouse] households: delaware: members: [delaware_above_cap, delaware_cent_above_cap] @@ -334,6 +343,13 @@ medicaid_ltss_non_delaware_assistance_unit_size: 1 medicaid_ltss_has_community_spouse: true medicaid_ltss_community_spouse_shelter_expenses: 1_000 + marital_units: + texas: + members: [texas] + delaware_base: + members: [delaware_base] + washington_excess_shelter: + members: [washington_excess_shelter] households: texas: members: [texas] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml index 7238cc75976..09549b34271 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_special_income_limit.yaml @@ -74,6 +74,11 @@ medicaid_ltss_non_delaware_assistance_unit_size: 0 three_person_unit: medicaid_ltss_non_delaware_assistance_unit_size: 3 + marital_units: + no_unit: + members: [no_unit] + three_person_unit: + members: [three_person_unit] households: household: members: [no_unit, three_person_unit] diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py index 61dbb9d84f3..145ff1786ba 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py @@ -31,7 +31,7 @@ class medicaid_ltss_couple_countable_income(Variable): ) def formula_2026_01_01(person, period, parameters): - p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + ssi_exclusions = parameters(period).gov.ssa.ssi.income.exclusions state = person.household("state_code", period) earned = person.marital_unit.sum( person("medicaid_ltss_qit_adjusted_earned_income", period) @@ -42,24 +42,19 @@ def formula_2026_01_01(person, period, parameters): person("medicaid_ltss_qit_adjusted_needs_based_income", period) ) unearned_disregard = min_( - max_(unearned - needs_based, 0), p.de.income.general_disregard - ) - unused_general_disregard = max_( - p.de.income.general_disregard - unearned_disregard, 0 + max_(unearned - needs_based, 0), ssi_exclusions.general ) + unused_general_disregard = max_(ssi_exclusions.general - unearned_disregard, 0) impairment_expenses = person.marital_unit.sum( person("medicaid_ltss_excluded_impairment_related_work_expenses", period) ) - countable_earned = ( - max_( - earned - - unused_general_disregard - - p.de.income.earned_disregard - - impairment_expenses, - 0, - ) - * p.de.income.earned_income_countable_rate - ) + countable_earned = max_( + earned + - unused_general_disregard + - ssi_exclusions.earned + - impairment_expenses, + 0, + ) * (1 - ssi_exclusions.earned_share) delaware_budget = unearned - unearned_disregard + countable_earned texas_excluded = person.marital_unit.sum( person("tx_medicaid_ltss_excluded_interest_and_dividends", period) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py index de0fb526134..06eb25fba9e 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -25,6 +25,9 @@ class medicaid_ltss_csra_resource_eligible(Variable): "and the full jointly titled balance is tested against the individual limit, " "excluding spouse-sole resources. Those ownership balances are " "separate leaf inputs because attributed totals do not reveal title. " + "Both ownership balances must be reported as nonnegative amounts; " + "their minus-one defaults mark omitted facts and fail this historical " + "resource screen closed. Explicit zero balances remain valid. " "There is a new determination after a break of at least 30 consecutive " "days under WAC 182-513-1350(3)(b)(vi)(A). Texas uses the federal minimum as its " "floor; Delaware's $25,000 state spousal share (DSSM 20910.10) sits " @@ -111,13 +114,21 @@ def formula_2026_01_01(person, period, parameters): # WAC 182-513-1355(2)(a) counts one-half of the sum of applicant-sole # resources and the full joint balance, excluding spouse-sole resources. This # rule continues for pre-1989 periods at redeterminations as well. + solely_owned = person( + "wa_medicaid_ltss_solely_owned_countable_resources", period + ) + jointly_owned = person( + "wa_medicaid_ltss_jointly_owned_countable_resources", period + ) + ownership_facts_valid = (solely_owned >= 0) & (jointly_owned >= 0) pre_1989_resources = ( - person("wa_medicaid_ltss_solely_owned_countable_resources", period) - + person("wa_medicaid_ltss_jointly_owned_countable_resources", period) + solely_owned + jointly_owned ) * p.wa.csra.pre_1989_resource_share community_spouse_eligible = where( (state == states.WA) & (onset < p.wa.csra.maximum_regime_start), - (assistance_unit_size == 1) & (pre_1989_resources <= resource_limit), + (assistance_unit_size == 1) + & ownership_facts_valid + & (pre_1989_resources <= resource_limit), community_spouse_eligible, ) & ((state != states.WA) | valid_onset) modeled_pathway = pathway != pathways.UNMODELED diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py index 98b844f4719..a04bf869e27 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py @@ -8,6 +8,9 @@ class medicaid_ltss_dividend_income(Variable): unit = USD definition_period = MONTH documentation = ( + "When gross monthly unearned income is reported, an unspecified " + "monthly investment source is zero; annual receipts are not mixed " + "with an actual-month gross budget. " "Each person's dividend income included in gross unearned income. " "Defaults to annual dividend_income, the same legacy-compatible " "source included in gross SSI unearned income, divided by twelve, " @@ -17,5 +20,11 @@ class medicaid_ltss_dividend_income(Variable): def formula(person, period, parameters): reported = person("medicaid_ltss_reported_dividend_income", period) - annual_default = max_(person("dividend_income", period.this_year) / 12, 0) - return where(reported == -1, annual_default, max_(reported, 0)) + reported_gross = person("medicaid_ltss_reported_gross_unearned_income", period) + use_annual = (reported == -1) & (reported_gross == -1) + if not use_annual.any(): + return max_(reported, 0) + annual_default = max_( + person("dividend_income", period.this_year) / MONTHS_IN_YEAR, 0 + ) + return where(use_annual, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py index 9376ba3e934..aae6f48eade 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -53,11 +53,7 @@ def formula_2026_01_01(person, period, parameters): waiver = person("medicaid_ltss_waiver", period) waivers = waiver.possible_values assistance_unit_size = person("medicaid_ltss_assistance_unit_size", period) - income = max_( - person("medicaid_ltss_qit_adjusted_income", period) - - person("wa_medicaid_ltss_excluded_income", period), - 0, - ) + income = person("medicaid_ltss_individual_countable_income", period) special_income_limit = person("medicaid_ltss_special_income_limit", period) aged_blind_disabled = person("is_ssi_aged_blind_disabled", period.this_year) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py index 4367bd90911..6f649ffa5e4 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py @@ -24,5 +24,10 @@ class medicaid_ltss_gross_earned_income(Variable): def formula(person, period, parameters): reported = person("medicaid_ltss_reported_gross_earned_income", period) - annual_default = max_(person("ssi_earned_income", period.this_year) / 12, 0) - return where(reported == -1, annual_default, max_(reported, 0)) + use_annual = reported == -1 + if not use_annual.any(): + return max_(reported, 0) + annual_default = max_( + person("ssi_earned_income", period.this_year) / MONTHS_IN_YEAR, 0 + ) + return where(use_annual, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py index 076a4af0aef..9a528c9ff27 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py @@ -23,5 +23,10 @@ class medicaid_ltss_gross_unearned_income(Variable): def formula(person, period, parameters): reported = person("medicaid_ltss_reported_gross_unearned_income", period) - annual_default = max_(person("ssi_unearned_income", period.this_year) / 12, 0) - return where(reported == -1, annual_default, max_(reported, 0)) + use_annual = reported == -1 + if not use_annual.any(): + return max_(reported, 0) + annual_default = max_( + person("ssi_unearned_income", period.this_year) / MONTHS_IN_YEAR, 0 + ) + return where(use_annual, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py index af207a4c776..5892a88c711 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py @@ -33,34 +33,29 @@ class medicaid_ltss_individual_countable_income(Variable): ) def formula_2026_01_01(person, period, parameters): - p = parameters(period).gov.hhs.medicaid.eligibility.long_term_care.financial + ssi_exclusions = parameters(period).gov.ssa.ssi.income.exclusions state = person.household("state_code", period) earned = person("medicaid_ltss_qit_adjusted_earned_income", period) unearned = person("medicaid_ltss_qit_adjusted_unearned_income", period) needs_based = person("medicaid_ltss_qit_adjusted_needs_based_income", period) unearned_disregard = min_( - max_(unearned - needs_based, 0), p.de.income.general_disregard - ) - unused_general_disregard = max_( - p.de.income.general_disregard - unearned_disregard, 0 + max_(unearned - needs_based, 0), ssi_exclusions.general ) + unused_general_disregard = max_(ssi_exclusions.general - unearned_disregard, 0) impairment_expenses = person( "medicaid_ltss_excluded_impairment_related_work_expenses", period ) - countable_earned = ( - max_( - earned - - unused_general_disregard - - p.de.income.earned_disregard - - impairment_expenses, - 0, - ) - * p.de.income.earned_income_countable_rate - ) + countable_earned = max_( + earned + - unused_general_disregard + - ssi_exclusions.earned + - impairment_expenses, + 0, + ) * (1 - ssi_exclusions.earned_share) ordinary_budget = unearned - unearned_disregard + countable_earned gross = earned + unearned community_spouse_budget = gross - min_( - max_(gross - needs_based, 0), p.de.income.general_disregard + max_(gross - needs_based, 0), ssi_exclusions.general ) delaware_budget = where( person("medicaid_ltss_has_community_spouse", period), diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py index dfce746282f..adc9afb50d5 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py @@ -8,6 +8,9 @@ class medicaid_ltss_interest_income(Variable): unit = USD definition_period = MONTH documentation = ( + "When gross monthly unearned income is reported, an unspecified " + "monthly investment source is zero; annual receipts are not mixed " + "with an actual-month gross budget. " "Each person's interest income included in gross unearned income. " "Defaults to annual interest_income divided by twelve, unless " "that person reports actual monthly interest receipts." @@ -16,5 +19,11 @@ class medicaid_ltss_interest_income(Variable): def formula(person, period, parameters): reported = person("medicaid_ltss_reported_interest_income", period) - annual_default = max_(person("interest_income", period.this_year) / 12, 0) - return where(reported == -1, annual_default, max_(reported, 0)) + reported_gross = person("medicaid_ltss_reported_gross_unearned_income", period) + use_annual = (reported == -1) & (reported_gross == -1) + if not use_annual.any(): + return max_(reported, 0) + annual_default = max_( + person("interest_income", period.this_year) / MONTHS_IN_YEAR, 0 + ) + return where(use_annual, annual_default, max_(reported, 0)) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py index 0cb2e9db91c..197cd2f5151 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_allocate_over_12_months.py @@ -18,6 +18,7 @@ class medicaid_ltss_irwe_allocate_over_12_months(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py index cbf4eafe6dc..388f2ac9033 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py @@ -19,6 +19,7 @@ class medicaid_ltss_irwe_monthly_business_expenses(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py index 12d64c631da..9705ee82874 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py @@ -21,6 +21,7 @@ class medicaid_ltss_irwe_monthly_payments(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py index d056eb2071e..3210b7b39ed 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py @@ -19,6 +19,7 @@ class medicaid_ltss_irwe_monthly_reimbursements(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py index e0b1098049b..783a6d061e1 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py @@ -18,6 +18,7 @@ class medicaid_ltss_irwe_nonrecurring_business_expenses(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py index 7461bad4f39..7abfa9a36e2 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py @@ -27,6 +27,7 @@ class medicaid_ltss_irwe_nonrecurring_payment(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py index 4bb978eb17d..2f9349b614c 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py @@ -18,6 +18,7 @@ class medicaid_ltss_irwe_nonrecurring_reimbursement(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py index 78f00262e89..02453cad2ca 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py @@ -20,6 +20,7 @@ class medicaid_ltss_irwe_working_when_paid(Variable): reference = "https://www.ssa.gov/OP_Home/cfr20/416/416-0976.htm" def formula(person, period, parameters): + # Formula-backed transaction facts are omitted from API input metadata. # Transaction facts apply only to the explicitly reported month. # A zero fallback prevents Core from carrying or uprating past inputs. return person.empty_array() diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py index e702ab7454f..599f16c7073 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py @@ -12,8 +12,9 @@ class medicaid_ltss_reported_dividend_income(Variable): "Each person's actual dividend receipts in the assessment month, " "included in their reported gross unearned income. A nonnegative " "amount replaces that person's annual-source default independently " - "of other people's reports. The -1 sentinel uses annual ordinary " - "dividend income divided by twelve. Washington excludes dividends " + "of other people's reports. The -1 sentinel uses annual dividend_income " + "divided by twelve only when gross income also uses annual sources; " + "it otherwise gives zero. Washington excludes dividends " "for an applicant with institutional status; community-spouse " "dividends remain income of the community spouse." ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py index d4eeabb5400..730fcb1596d 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py @@ -13,7 +13,8 @@ class medicaid_ltss_reported_interest_income(Variable): "included in their reported gross unearned income. A nonnegative " "amount replaces that person's annual-source default independently " "of other people's reports. The -1 sentinel uses annual interest " - "income divided by twelve. Washington excludes this income for " + "income divided by twelve only when gross income also uses annual sources; " + "it otherwise gives zero. Washington excludes this income for " "an applicant with institutional status; community-spouse interest " "remains income of the community spouse." ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py index 4c22be32348..4977c50efb9 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_jointly_owned_countable_resources.py @@ -8,7 +8,7 @@ class wa_medicaid_ltss_jointly_owned_countable_resources(Variable): unit = USD quantity_type = STOCK definition_period = MONTH - default_value = 0 + default_value = -1 documentation = ( "Current full balance of countable resources held jointly in both spouses' names. " "This ownership fact is needed for continuous periods beginning " @@ -18,7 +18,12 @@ class wa_medicaid_ltss_jointly_owned_countable_resources(Variable): "the full joint balance rather than the applicant's attributed share. " "These ownership amounts are separate from the current attributed " "resource input used for modern periods; the model cannot infer " - "legal title from that input. Applicable asset exclusions remain " + "legal title from that input. The default minus one means ownership " + "was not reported. The pre-October-1989 resource screen requires " + "both ownership inputs to be nonnegative and fails closed when " + "either is omitted or negative. Report zero explicitly when " + "there are no resources in this ownership category. " + "Applicable asset exclusions remain " "the caller's resource-inventory responsibility." ) reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355" diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py index 0b1393cc155..1198dee2f2c 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_solely_owned_countable_resources.py @@ -8,7 +8,7 @@ class wa_medicaid_ltss_solely_owned_countable_resources(Variable): unit = USD quantity_type = STOCK definition_period = MONTH - default_value = 0 + default_value = -1 documentation = ( "Current countable resources held solely in the institutionalized applicant's name. " "This ownership fact is needed for continuous periods beginning " @@ -18,7 +18,12 @@ class wa_medicaid_ltss_solely_owned_countable_resources(Variable): "the full joint balance rather than the applicant's attributed share. " "These ownership amounts are separate from the current attributed " "resource input used for modern periods; the model cannot infer " - "legal title from that input. Applicable asset exclusions remain " + "legal title from that input. The default minus one means ownership " + "was not reported. The pre-October-1989 resource screen requires " + "both ownership inputs to be nonnegative and fails closed when " + "either is omitted or negative. Report zero explicitly when " + "there are no resources in this ownership category. " + "Applicable asset exclusions remain " "the caller's resource-inventory responsibility." ) reference = "https://app.leg.wa.gov/wac/default.aspx?cite=182-513-1355" From 226852a180e37e1b20c7f6e2c38bc789c949119b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Thu, 15 Oct 2026 20:34:54 -0400 Subject: [PATCH 34/34] Cite the home-equity follow-up issue by reference, not URL test_reference_urls (#9849) requires every URL in a variable's documentation to appear in its reference list. Cite the follow-up as PolicyEngine/policyengine-us#9895, the form other variables use, so the issue link stays out of the legal references. Co-Authored-By: Claude Opus 5.5 --- .../financial/medicaid_ltss_home_equity_eligible.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py index f3dfeb1bf33..e538fb3e351 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -30,7 +30,7 @@ class medicaid_ltss_home_equity_eligible(Variable): "modeled here; that chassis applies the federal maximum in every " "state, so it passes Texas or Delaware equity between the federal " "minimum and maximum that this screen bars (follow-up: " - "https://github.com/PolicyEngine/policyengine-us/issues/9895)." + "PolicyEngine/policyengine-us#9895)." ) reference = ( "https://www.law.cornell.edu/uscode/text/42/1396p#f",