diff --git a/changelog.d/ltss-financial-eligibility.added.md b/changelog.d/ltss-financial-eligibility.added.md new file mode 100644 index 00000000000..3195944c4c2 --- /dev/null +++ b/changelog.d/ltss-financial-eligibility.added.md @@ -0,0 +1 @@ +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/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/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/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..df2792073b3 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/csra/state_minimum.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: currency-USD + 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/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/special_income_limit/rate.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml new file mode 100644 index 00000000000..a5d3abaa9e2 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/de/special_income_limit/rate.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: /1 + period: year + label: Delaware Medicaid LTSS special income limit rate + reference: + - 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/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 new file mode 100644 index 00000000000..fbe90d00f99 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/maximum.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: currency-USD + 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/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.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml new file mode 100644 index 00000000000..5ef22b35e16 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/csra/minimum.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: currency-USD + 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/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/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/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/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/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..7438b3a9e95 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/maximum.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: currency-USD + period: month + label: Federal maximum Medicaid LTSS monthly maintenance needs 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(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/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/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..698bac259cc --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/minimum.yaml @@ -0,0 +1,16 @@ +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 + +metadata: + unit: currency-USD + 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 new file mode 100644 index 00000000000..ab6c4c7358b --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/federal/mmmna/shelter_threshold_rate.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: /1 + 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/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..a6cfc4679aa --- /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 the Medicaid long-term services and supports program. +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/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..cb8bf1e5aeb --- /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 the Medicaid long-term services and supports program. +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/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/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..14c273717db --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/csra/state_minimum.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: currency-USD + 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 new file mode 100644 index 00000000000..8b051886a52 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/medically_needy/income_level.yaml @@ -0,0 +1,16 @@ +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 + +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-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/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..475ef01543e --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/mmmna/minimum.yaml @@ -0,0 +1,16 @@ +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 + +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..f944f08464f --- /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 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 + +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/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..523982ab430 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/resources/individual.yaml @@ -0,0 +1,15 @@ +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 + +metadata: + unit: currency-USD + 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 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..c8abbf1be1e --- /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 the Medicaid long-term services and supports program. +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 new file mode 100644 index 00000000000..29a84cdf0ba --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/copes/enabled.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: bool + period: year + label: Washington Medicaid LTSS COPES 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 + - 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 new file mode 100644 index 00000000000..3f24e2e600a --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/new_freedom/enabled.yaml @@ -0,0 +1,13 @@ +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 + +metadata: + unit: bool + 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 + 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 new file mode 100644 index 00000000000..ada3829c53b --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/financial/wa/waivers/rsw/enabled.yaml @@ -0,0 +1,13 @@ +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 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 + - 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..d8967ec7f17 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/long_term_care/home_equity/minimum_limit.yaml @@ -0,0 +1,35 @@ +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 + +metadata: + unit: currency-USD + period: year + label: Medicaid long-term care federal minimum home equity limit + # 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 + 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/parameters/uprating_extensions.py b/policyengine_us/parameters/uprating_extensions.py index c1c598de334..a8dab1253b4 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 @@ -670,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, @@ -1173,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 5250ab3aa89..1f5263db3e6 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -178,6 +178,54 @@ 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 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. + 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_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 new file mode 100644 index 00000000000..80b78f74ec8 --- /dev/null +++ b/policyengine_us/tests/core/test_medicaid_ltss_financial_invariants.py @@ -0,0 +1,1261 @@ +"""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_core.reforms import Reform + +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 + +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", + "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])), + 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)), + 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)), + 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), + 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), + ) + ) + # 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 + + +def month(value): + return {PERIOD: value} + + +def _situation(people, **overrides): + situation = {"people": {}, "households": {}, "marital_units": {}} + community_spouses = [] + 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}" + # 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 = ( + "wa_medicaid_ltss_couple_countable_resources_at_most_recent_institutionalization" + if person["state"] == "WA" + else "medicaid_ltss_couple_countable_resources_at_first_institutionalization" + ) + 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_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_has_community_spouse": month(person["has_community_spouse"]), + "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"]), + "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"]), + } + 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 + + +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)[: len(people)] + 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 = { + "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 + ), + "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", + [ + ("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"), + ("earned_income", "is_medicaid_ltss_financial_threshold_eligible"), + ("unearned_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 _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 + 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"][unchanged], + base["medicaid_ltss_assistance_unit_size"][unchanged], + ) + np.testing.assert_allclose( + base["medicaid_ltss_countable_resources"][delaware], + column("resources")[delaware], + ) + + +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" + 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( + 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, 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: couple.get("state", "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"] + ), + } + if election is not None: + situation["marital_units"][f"couple_{index}"][ + "de_medicaid_ltss_post_six_month_budget_election" + ] = month(election) + 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 couple.get("state", "DE") != "DE": + situation["people"][name][ + "medicaid_ltss_non_delaware_assistance_unit_size" + ] = month(couple["non_delaware_unit"]) + if reverse: + 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: + 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.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", + [ + "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): + _, _, 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"), 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 + 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_non_delaware_assistance_unit_size": {period: 1} + }, + "delaware": {"medicaid_ltss_setting": {period: "HCBS"}}, + "delaware_spouse": {"medicaid_ltss_setting": {period: "HCBS"}}, + }, + "households": { + "texas_household": { + "members": ["texas"], + "state_code": {str(year): "TX"}, + }, + "delaware_household": { + "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" + 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_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(): + 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] + + +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_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), + "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_irwe_monthly_payments"), + ("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_irwe_monthly_payments" + ][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) + + +@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("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) + + +@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() + + +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 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( + tax_benefit_system=reformed_system, + 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], + ) + 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 new file mode 100644 index 00000000000..e77313530a8 --- /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,611 @@ +- name: Case 1, 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 + 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_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 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + medicaid_ltss_mmmna: 4_066.5 + is_medicaid_ltss_income_eligible: false + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 2, identical facts produce state-specific TX, DE, and WA home-equity results. + period: 2026-07 + input: + people: + texas: + 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: 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_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_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 + 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: Case 3, vectorized assistance units and explicit ownership inputs remain separate. + period: 2026-07 + input: + people: + single: + 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: 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 + couple: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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: + 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: 2_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_has_community_spouse: true + 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 + 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] + +- name: Case 4, 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_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 + 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: Case 5, 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_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 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 6, 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_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 + delaware: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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 + washington: + 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: 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 + 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 + +- 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_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] + 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_reported_gross_unearned_income: 2400 + medicaid_ltss_has_community_spouse: true + 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 + 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: + - 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 + input: + people: + at_state_standard: + 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: 2_500 + medicaid_ltss_has_community_spouse: true + 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_529 + above_state_standard: + 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: 2_500 + medicaid_ltss_has_community_spouse: true + 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] + state_code: + 2026: WA + above_household: + members: [above_state_standard] + 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] + 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_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: + 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 + +- 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_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_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 + 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: + 2026: true + 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_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_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_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_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_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_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/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..4effe957825 --- /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,2085 @@ +- name: Case 1, Texas special income limit includes the exact monthly limit. + period: 2026-07 + input: + people: + below_limit: + 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: 2981 + at_limit: + 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: 2982 + above_limit: + 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: 2983 + couple_below_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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_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_non_delaware_assistance_unit_size: 2 + medicaid_ltss_reported_gross_unearned_income: 5965 + 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 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_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 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_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 + input: + people: + below_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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_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_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_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_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_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] + tax_unit_at_limit: + members: [at_limit] + tax_unit_above_limit: + members: [above_limit] + tax_unit_couple_below_limit: + members: [couple_below_limit, couple_below_limit_spouse] + tax_unit_couple_at_limit: + members: [couple_at_limit, couple_at_limit_spouse] + tax_unit_couple_above_limit: + members: [couple_above_limit, couple_above_limit_spouse] + 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, 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, 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, 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] + spm_unit_at_limit: + members: [at_limit] + spm_unit_above_limit: + members: [above_limit] + spm_unit_couple_below_limit: + members: [couple_below_limit, couple_below_limit_spouse] + spm_unit_couple_at_limit: + members: [couple_at_limit, couple_at_limit_spouse] + spm_unit_couple_above_limit: + members: [couple_above_limit, couple_above_limit_spouse] + 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, couple_below_limit_spouse] + state_code: + 2026: DE + household_couple_at_limit: + members: [couple_at_limit, couple_at_limit_spouse] + state_code: + 2026: DE + household_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, 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 + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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_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_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_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_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_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] + 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, couple_below_limit_after_disregard_spouse] + tax_unit_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, couple_above_limit_after_disregard_spouse] + 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, 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, 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, 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] + 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, couple_below_limit_after_disregard_spouse] + spm_unit_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, couple_above_limit_after_disregard_spouse] + 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, couple_below_limit_after_disregard_spouse] + state_code: + 2026: DE + household_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, couple_above_limit_after_disregard_spouse] + state_code: + 2026: DE + output: + 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 + input: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_needs_based_income: 2505 + state_code: + 2026: DE + medicaid_ltss_reported_gross_unearned_income: 2505 + 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 + 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: 2981 + at_limit: + 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: 2982 + above_limit: + 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: 2983 + 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 + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 1 + medicaid_ltss_medically_needy_expenses: 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 + +- name: Case 9, Washington institutional medically needy income above cost of care fails. + period: 2026-07 + input: + 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_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 3499 + state_code: + 2026: WA + medicaid_ltss_reported_gross_unearned_income: 4000 + 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_reported_gross_unearned_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_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_needs_based_income: 2486 + medicaid_ltss_reported_gross_unearned_income: 2496 + 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_medically_needy_expenses: 500 + 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 2505 + medicaid_ltss_reported_gross_unearned_income: 4000 + 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] + +- name: Case 13, 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_medically_needy_expenses: 500 + medicaid_ltss_cost_of_care: 2500 + medicaid_ltss_reported_gross_unearned_income: 4000 + output: + medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY + is_medicaid_ltss_income_eligible: true + +- name: Case 14, Delaware computes ordered exclusions from raw earnings. + period: 2026-07 + input: + people: + earned_at_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + # (5_055 - 20 - 65) / 2 = 2_485, exactly the individual limit. + medicaid_ltss_reported_gross_earned_income: 5_055 + earned_above_limit: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + # (5_057 - 20 - 65) / 2 = 2_486, above the individual limit. + medicaid_ltss_reported_gross_earned_income: 5_057 + community_spouse_case: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_has_community_spouse: 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: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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: Case 15, 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: Case 16, 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: Case 17, 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: Case 18, 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: Case 19, 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: Case 20, 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: Case 21, 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: Case 22, 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: Case 23, 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: Case 24, 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: Case 25, 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: Case 26, 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: [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: + 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] + +- name: Case 27, 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 + # 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 + medicaid_ltss_countable_income: 2485 + is_medicaid_ltss_income_eligible: true + is_medicaid_ltss_financial_threshold_eligible: true + +- name: Case 28, 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_irwe_monthly_payments: 200 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 200 + medicaid_ltss_irwe_working_when_paid: true + 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: Case 29, 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: Case 30, 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: Case 31, 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 + +- name: Case 32, 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_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 400 + medicaid_ltss_irwe_working_when_paid: true + 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_irwe_monthly_payments: 50000 + medicaid_ltss_irwe_working_when_paid: true + 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: + # 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: Case 33, 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: [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: Case 34, 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: Case 35, 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] + + +- name: Case 36, 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: Case 37, 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] + + +- name: Case 38, 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} + 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] + 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: Case 39, 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] + + +- 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 + 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] + +# 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] + + +- 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_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..e0ee1cc978f --- /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,685 @@ +- 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] + +- 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 + 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 + de_medicaid_ltss_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 + 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 + 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 + de_medicaid_ltss_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 + 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 + 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 + 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 + 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 + de_medicaid_ltss_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: + 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: + [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 + 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 + 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 + de_medicaid_ltss_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 + 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 + 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 + 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 + de_medicaid_ltss_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] + + +- 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 + 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 + de_medicaid_ltss_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/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..88bce27453f --- /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,2027 @@ +- name: Case 1, Texas individual resource limit includes 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_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_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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_individual_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 + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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_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_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_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 individual and couple resource limits include their exact boundaries. + period: 2026-07 + input: + people: + below: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_individual_countable_resources: 2999 + at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_individual_countable_resources: 3000 + above: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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_individual_countable_resources: 1999 + individual_at: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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_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 + - below_spouse + at_tax_unit: + members: + - at + - at_spouse + above_tax_unit: + members: + - above + - above_spouse + 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 + - below_spouse + at_family: + members: + - at + - at_spouse + above_family: + members: + - above + - above_spouse + 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 + - below_spouse + at_spm_unit: + members: + - at + - at_spouse + above_spm_unit: + members: + - above + - above_spouse + 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 + - below_spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + at_marital_unit: + members: + - at + - at_spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + above_marital_unit: + members: + - above + - above_spouse + medicaid_ltss_spouses_requesting_or_receiving_institutional_services_in_same_facility: true + 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 + - below_spouse + state_code: + 2026: DE + at_household: + members: + - at + - at_spouse + state_code: + 2026: DE + above_household: + members: + - above + - above_spouse + 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 + - 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 + input: + people: + below: + 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_individual_countable_resources: 1_999 + at: + 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_individual_countable_resources: 2_000 + above: + 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_individual_countable_resources: 2_001 + unsupported_couple: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + medicaid_ltss_non_delaware_assistance_unit_size: 2 + medicaid_ltss_individual_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: + [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 + input: + state_code: + 2026: TX + 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_couple_countable_resources_at_first_institutionalization: 60_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_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 + 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_couple_countable_resources_at_first_institutionalization: 100_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 + +- name: Case 7, the federal CSRA maximum controls when half of snapshot resources is higher. + period: 2026-07 + input: + people: + at_maximum: + 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_couple_countable_resources_at_first_institutionalization: 400_000 + 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 400_000 + 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] + 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, 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_non_delaware_assistance_unit_size: 2 + medicaid_ltss_has_community_spouse: true + 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 + +- 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 60_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_couple_countable_resources_at_first_institutionalization: 100_000 + medicaid_ltss_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_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_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_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_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_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_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, Texas uses the inclusive couple resource limit and individual fallback above it. + 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_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_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_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_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 + 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 + # $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 + input: + people: + at_allowance: + 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: 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_has_community_spouse: true + 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 + - 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 + - false + - 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_has_community_spouse: true + 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_has_community_spouse: true + 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 + - 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 + - false + - 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_has_community_spouse: true + 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_has_community_spouse: true + 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 + - 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 + - false + - 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_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_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_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_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. + period: 2026-07 + input: + people: + at_allowance: + 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 + 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_000 + above_allowance: + 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 + 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. + period: 2026-07 + input: + people: + at_allowance: + 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 + 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_660 + above_allowance: + 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 + 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. + period: 2026-07 + input: + 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 + - false + +- name: Case 20, continuing Delaware eligibility cannot shelter excess applicant resources in an unused CSRA. + period: 2026-07 + input: + 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 + - false + +- name: Case 21, explicit initial Delaware eligibility tests combined current resources after CSRA. + period: 2026-07 + input: + people: + spouse_resources_above_allowance: + 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: 2000 + resources_available_for_transfer: + 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 + - 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 + - false + - false + +- name: Case 22, an omitted determination input preserves initial Delaware resource treatment. + period: 2026-07 + input: + people: + spouse_resources_above_allowance: + 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: 2000 + resources_available_for_transfer: + 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 + - 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 + - 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: + 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_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 + 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_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. + 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_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_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_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_individual_countable_resources: 2_000 + medicaid_ltss_non_delaware_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: + 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: 72529 + above_wa_floor: + 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: + 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: + 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: + 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 + 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 + - 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 + - false + - 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_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_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 + +- 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_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_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_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_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_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_individual_countable_resources: 2000 + medicaid_ltss_non_delaware_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_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_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 + applicant_2: + 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 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + 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 + applicant_3: + 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 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + 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 + applicant_4: + 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 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + 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 + applicant_5: + 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 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + 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 + applicant_6: + 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 + wa_medicaid_ltss_most_recent_institutionalization_start_year: 1989 + wa_medicaid_ltss_most_recent_institutionalization_start_month: 9 + 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 + 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_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 + applicant_2: + 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 + 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_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 + applicant_4: + 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 + 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 + +# 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] + + +- 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 new file mode 100644 index 00000000000..9eb8e65a6bd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.yaml @@ -0,0 +1,424 @@ +- name: Case 1, Texas institutional assistance unit of one uses 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_non_delaware_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Case 2, Delaware institutional assistance unit of one uses the special income pathway. + period: 2026-07 + input: + state_code: + 2026: DE + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Case 3, Washington institutional income at the special income limit uses that pathway. + 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: 2_982 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Case 4, Washington institutional income above the special income limit uses medically needy. + 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: 2_983 + output: + medicaid_ltss_financial_pathway: INSTITUTIONAL_MEDICALLY_NEEDY + +- name: Case 5, Washington COPES income at the special income limit uses that pathway. + 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 + medicaid_ltss_reported_gross_unearned_income: 2_982 + output: + medicaid_ltss_financial_pathway: SPECIAL_INCOME + +- name: Case 6, Washington named HCBS waivers vectorize across the income pathway boundary. + period: 2026-07 + input: + people: + new_freedom_applicant: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_NEW_FREEDOM + 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_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: + 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 + is_medicaid_ltss_income_eligible: [true, true] + +- name: Case 7, 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_non_delaware_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_income_eligible: false + medicaid_ltss_csra_resource_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: Case 8, Texas HCBS cannot use a Washington named waiver pathway. + period: 2026-07 + input: + state_code: + 2026: TX + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + medicaid_ltss_non_delaware_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 9, 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_non_delaware_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 10, 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_non_delaware_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + +- name: Case 11, 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_non_delaware_assistance_unit_size: 1 + output: + medicaid_ltss_financial_pathway: UNMODELED + is_medicaid_ltss_financial_threshold_eligible: false + +- name: Case 12, 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_non_delaware_assistance_unit_size: 0 + 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 + hcbs_named_waiver: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: WA_COPES + hcbs_no_waiver: + medicaid_ltss_setting: HCBS + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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, 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, SPECIAL_INCOME] + +- 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_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_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] + 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_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_non_delaware_assistance_unit_size: 1 + marital_units: + copes: + members: [copes] + new_freedom: + members: [new_freedom] + households: + household: + members: [copes, new_freedom] + state_code: + 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 + +- 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 + +- 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 + 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 + is_medicaid_ltss_income_eligible: true 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..5c09595364d --- /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,615 @@ +- name: Case 1, 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_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] + 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, + 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: Case 2, Delaware married ownership remains combined under individual budgets. + period: 2026-07 + input: + people: + first: &individual_owner + medicaid_ltss_setting: INSTITUTIONAL + 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 3, Texas home-equity cap includes 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_non_delaware_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_non_delaware_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_non_delaware_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 4, Washington home-equity cap includes 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_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 + at: + 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_home_market_value: 1_130_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_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 + 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 5, a resident spouse exception applies above the Texas cap. + 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_non_delaware_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 6, a resident child under age 21 exception applies above the Texas cap. + 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_non_delaware_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 7, a resident blind or disabled child exception applies above the Texas cap. + 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_non_delaware_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 8, a granted hardship waiver applies above the Texas cap. + 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_non_delaware_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 9, 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_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_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_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 10, 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_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: true + +- name: Case 11, encumbrances 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 12, 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 13, 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_non_delaware_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_non_delaware_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_non_delaware_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] + +- name: Case 14, 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 + marital_units: + spouse_exception: + members: [spouse_exception] + hardship_waiver: + members: [hardship_waiver] + households: + household: + members: [spouse_exception, hardship_waiver] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [true, true] + +- name: Case 15, 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 + marital_units: + zero_share: + members: [zero_share] + negative_equity: + members: [negative_equity] + households: + household: + members: [zero_share, negative_equity] + state_code: + 2026: TX + output: + medicaid_ltss_home_equity_eligible: [true, true] + +- name: Case 16, 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 + 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] + 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 new file mode 100644 index 00000000000..822382b302c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.yaml @@ -0,0 +1,389 @@ +- 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_non_delaware_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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 811.5 + high_shelter: + 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_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.5, 4_066.5, 4_066.5] + +- 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_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_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 811.5 + maximum: + medicaid_ltss_setting: INSTITUTIONAL + is_ssi_aged_blind_disabled: + 2026: true + medicaid_ltss_waiver: NONE + 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: DE + shelter_threshold: + members: [shelter_threshold] + state_code: + 2026: DE + maximum: + members: [maximum] + state_code: + 2026: DE + output: + medicaid_ltss_mmmna: [2_705, 2_705, 4_066.5] + +- name: Case 3, Washington uses its published July shelter 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_non_delaware_assistance_unit_size: 1 + medicaid_ltss_has_community_spouse: true + medicaid_ltss_community_spouse_shelter_expenses: 1_811.5 + cent_below_threshold: + 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_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: + # 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 + 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_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_non_delaware_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_non_delaware_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_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.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_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_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_non_delaware_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_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] + 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 2026 uses the operative federal and published state standards. + period: 2026-01 + 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_non_delaware_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_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_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] + state_code: + 2026: TX + delaware: + members: [delaware_base] + state_code: + 2026: DE + washington: + members: [washington_excess_shelter] + state_code: + 2026: WA + output: + # 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 + 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_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..09549b34271 --- /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,88 @@ +- name: Case 1, special income limits derive from the SSI federal benefit rate. + period: 2026-07 + input: + people: + texas_individual: + medicaid_ltss_non_delaware_assistance_unit_size: 1 + texas_couple: + medicaid_ltss_non_delaware_assistance_unit_size: 2 + delaware_individual: {} + delaware_couple: {} + washington_individual: + medicaid_ltss_non_delaware_assistance_unit_size: 1 + washington_couple: + medicaid_ltss_non_delaware_assistance_unit_size: 2 + california_individual: + 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] + 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, delaware_couple_spouse] + 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 + 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, 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_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] + 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/de_medicaid_ltss_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 new file mode 100644 index 00000000000..94a5299ef23 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/de_medicaid_ltss_post_six_month_budget_election.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSDEPostSixMonthBudgetElection(Enum): + INDIVIDUAL = "Individual" + COUPLE = "Couple" + NOT_SUPPLIED = "Not supplied" + + +class de_medicaid_ltss_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" 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..2475b75ebbb --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/is_medicaid_ltss_income_eligible.py @@ -0,0 +1,87 @@ +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. Gross earned and unearned income and QIT " + "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 " + "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 computes the $20 general exclusion " + "from non-needs-based unearned income first, carries any unused " + "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)." + ) + reference = ( + "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#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): + 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 + 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) + + special_income_eligible = income <= 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..dae28256d65 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_assistance_unit_size.py @@ -0,0 +1,125 @@ +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 = ( + "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 couple's reported " + "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 " + "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 " + "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 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." + ) + 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", + ) + + 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 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 + ) + 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 + election = person.marital_unit( + "de_medicaid_ltss_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 < p.de.assistance_unit.same_facility_election_months) + | 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, 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 new file mode 100644 index 00000000000..f0a5e82ddee --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_community_spouse_countable_resources.py @@ -0,0 +1,47 @@ +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 = ( + "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. 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 " + "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" + + 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) + represented_spouse = person.marital_unit.nb_persons() == 2 + external_spouse_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_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_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 new file mode 100644 index 00000000000..4a3211e8d25 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_countable_resources.py @@ -0,0 +1,31 @@ +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 = ( + "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..145ff1786ba --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_couple_countable_income.py @@ -0,0 +1,66 @@ +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 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. 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", + "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", + ) + + def formula_2026_01_01(person, period, parameters): + 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) + ) + 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), 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 + - 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) + ) + return where( + 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_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..ffd7b4938fd --- /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,21 @@ +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 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. 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.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py new file mode 100644 index 00000000000..464ecae4652 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra.py @@ -0,0 +1,85 @@ +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 * p.federal.csra.snapshot_share, 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 < p.wa.csra.maximum_regime_start), + washington & (onset < p.wa.csra.snapshot_regime_start), + ], + [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 new file mode 100644 index 00000000000..06eb25fba9e --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_csra_resource_eligible.py @@ -0,0 +1,140 @@ +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" + definition_period = MONTH + documentation = ( + "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 " + "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 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). " + "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. " + "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 " + "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. 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, " + "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://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", + ) + + 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) + + ssi_resource_limit = parameters(period).gov.ssa.ssi.eligibility.resources.limit + texas_or_delaware = (state == states.TX) | (state == states.DE) + resource_limit = select( + [ + texas_or_delaware & (assistance_unit_size == 1), + texas_or_delaware & (assistance_unit_size == 2), + (state == states.WA) & (assistance_unit_size == 1), + ], + [ + ssi_resource_limit.individual, + ssi_resource_limit.couple, + p.wa.resources.individual, + ], + default=0, + ) + no_community_spouse_eligible = resources <= resource_limit + + csra = person("medicaid_ltss_csra", period) + current_couple_resources = resources + person( + "medicaid_ltss_community_spouse_countable_resources", + period, + ) + has_community_spouse = person("medicaid_ltss_has_community_spouse", period) + 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, + ) + 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. + 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 = ( + 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) + & ownership_facts_valid + & (pre_1989_resources <= resource_limit), + community_spouse_eligible, + ) & ((state != states.WA) | valid_onset) + 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_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..a04bf869e27 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_dividend_income.py @@ -0,0 +1,30 @@ +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 = ( + "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, " + "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) + 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_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..ba83a0c4bdb --- /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,27 @@ +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 " + "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. 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", + "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_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..35c16d69380 --- /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,41 @@ +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/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", + ) + + def formula_2026_01_01(person, period, parameters): + disabled = person("meets_ssi_disability_criteria", period.this_year) + blind = person("is_blind", period.this_year) + 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 & (below_aged_threshold | 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 new file mode 100644 index 00000000000..aae6f48eade --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_financial_pathway.py @@ -0,0 +1,98 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSFinancialPathway(Enum): + SPECIAL_INCOME = "Special income" + INSTITUTIONAL_MEDICALLY_NEEDY = "Institutional medically needy" + UNMODELED = "Unmodeled" + + +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. 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. " + "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. " + "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", + ) + + 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_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) + + 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 + & 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) + ) + washington_special_income = washington_modeled_setting & ( + income <= special_income_limit + ) + washington_medically_needy = washington_modeled_setting & ( + income > special_income_limit + ) + + 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_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..6f649ffa5e4 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_earned_income.py @@ -0,0 +1,33 @@ +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=6" + + def formula(person, period, parameters): + reported = person("medicaid_ltss_reported_gross_earned_income", period) + 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 new file mode 100644 index 00000000000..9a528c9ff27 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_gross_unearned_income.py @@ -0,0 +1,32 @@ +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=6" + + def formula(person, period, parameters): + reported = person("medicaid_ltss_reported_gross_unearned_income", period) + 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_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..e538fb3e351 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_equity_eligible.py @@ -0,0 +1,100 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_home_equity_eligible(Variable): + value_type = bool + entity = Person + label = "Meets Medicaid LTSS home-equity threshold" + definition_period = MONTH + documentation = ( + "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), 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. 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 " + "is_medicaid_long_term_care_home_equity_eligible chassis is not " + "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: " + "PolicyEngine/policyengine-us#9895)." + ) + reference = ( + "https://www.law.cornell.edu/uscode/text/42/1396p#f", + "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", + ) + + 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, + 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) + # 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 + # on a valid ownership share. + exception = ( + 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 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_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..6c9c0e94c1c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_home_ownership_share.py @@ -0,0 +1,27 @@ +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. 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", + ) 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..8e8edb58194 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_impairment_related_work_expenses.py @@ -0,0 +1,93 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_impairment_related_work_expenses(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS monthly impairment-related work expenses" + unit = USD + definition_period = MONTH + documentation = ( + "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/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", + ) + + 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): 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 + ) + 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, + ) + 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 + paid_with_earnings = ( + person("medicaid_ltss_gross_earned_income", paid_month) > 0 + ) + deduction = where( + 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/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..5892a88c711 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_individual_countable_income.py @@ -0,0 +1,73 @@ +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 " + "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). 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, 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", + "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", + ) + + def formula_2026_01_01(person, period, parameters): + 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), 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 + - 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), ssi_exclusions.general + ) + delaware_budget = where( + person("medicaid_ltss_has_community_spouse", period), + community_spouse_budget, + ordinary_budget, + ) + washington_excluded = person("wa_medicaid_ltss_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 - texas_excluded, 0), + ) 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_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..adc9afb50d5 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_interest_income.py @@ -0,0 +1,29 @@ +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 = ( + "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." + ) + 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) + 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 new file mode 100644 index 00000000000..197cd2f5151 --- /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,24 @@ +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): + # 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 new file mode 100644 index 00000000000..388f2ac9033 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_business_expenses.py @@ -0,0 +1,25 @@ +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): + # 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 new file mode 100644 index 00000000000..9705ee82874 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_payments.py @@ -0,0 +1,27 @@ +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): + # 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 new file mode 100644 index 00000000000..3210b7b39ed --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_monthly_reimbursements.py @@ -0,0 +1,25 @@ +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): + # 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 new file mode 100644 index 00000000000..783a6d061e1 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_business_expenses.py @@ -0,0 +1,24 @@ +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): + # 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 new file mode 100644 index 00000000000..7abfa9a36e2 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_payment.py @@ -0,0 +1,33 @@ +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): + # 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 new file mode 100644 index 00000000000..2f9349b614c --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_nonrecurring_reimbursement.py @@ -0,0 +1,24 @@ +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): + # 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 new file mode 100644 index 00000000000..02453cad2ca --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_irwe_working_when_paid.py @@ -0,0 +1,26 @@ +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): + # 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_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..918f058f0f4 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_is_initial_eligibility_determination.py @@ -0,0 +1,29 @@ +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. 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/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..85be2858541 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_medically_needy_expenses.py @@ -0,0 +1,25 @@ +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 = ( + "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. Omit source receipts already removed by " + "wa_medicaid_ltss_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", + "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..30fb901ea37 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_mmmna.py @@ -0,0 +1,82 @@ +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 + 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 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; " + "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 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", + "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/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/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): + 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) + shelter_expenses = person( + "medicaid_ltss_community_spouse_shelter_expenses", + period, + ) + + 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_( + 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, + 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..417015af49f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_needs_based_income.py @@ -0,0 +1,25 @@ +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 = ( + "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", + "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_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..f8d04ca0c0b --- /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,30 @@ +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 = ( + "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 " + "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..09baa1a0c87 --- /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,25 @@ +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 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." + ) + 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..edde5d45bcf --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_earned_income.py @@ -0,0 +1,55 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_earned_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS earned income after qualified income trust exclusions" + unit = USD + definition_period = MONTH + documentation = ( + "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. " + "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", + "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 = min_( + max_(person("medicaid_ltss_earned_income_deposited_to_qit", period), 0), + income, + ) + 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) + 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_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..27b37da0b76 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_income.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS QIT-adjusted gross income" + unit = USD + definition_period = MONTH + documentation = ( + "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=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..6d9056ee31f --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_adjusted_unearned_income.py @@ -0,0 +1,56 @@ +from policyengine_us.model_api import * + + +class medicaid_ltss_qit_adjusted_unearned_income(Variable): + value_type = float + entity = Person + label = "Medicaid LTSS unearned income after qualified income trust exclusions" + unit = USD + definition_period = MONTH + documentation = ( + "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. " + "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", + "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 = min_( + max_(person("medicaid_ltss_unearned_income_deposited_to_qit", period), 0), + income, + ) + 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) + 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_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..e85ca7353ab --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_qit_covered_unearned_income.py @@ -0,0 +1,23 @@ +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 = ( + "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 " + "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..37618fa8a8a --- /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,22 @@ +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 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_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..599f16c7073 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_dividend_income.py @@ -0,0 +1,21 @@ +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 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." + ) + 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_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..1908d4ada20 --- /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=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 new file mode 100644 index 00000000000..058de38c62a --- /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=6" 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..730fcb1596d --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_reported_interest_income.py @@ -0,0 +1,21 @@ +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 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." + ) + 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_setting.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py new file mode 100644 index 00000000000..0a2a4824476 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_setting.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class MedicaidLTSSSetting(Enum): + INSTITUTIONAL = "Institutional" + HCBS = "Home and community-based services" + UNKNOWN = "Unknown" + + +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. 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_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_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" 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..f109293953f --- /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,29 @@ +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 = ( + "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 " + "allowing a negative remainder. The Texas opening-month rule can " + "also exclude an entire identified source after verification of " + "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", + "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_waiver.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/medicaid_ltss_waiver.py new file mode 100644 index 00000000000..1e814be3b74 --- /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): + 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): + 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://app.leg.wa.gov/wac/default.aspx?cite=182-515-1505", + "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/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, + ) 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/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 + ) 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", + ) diff --git a/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_excluded_income.py b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_excluded_income.py new file mode 100644 index 00000000000..272f84b24bc --- /dev/null +++ b/policyengine_us/variables/gov/hhs/medicaid/eligibility/long_term_care/financial/wa_medicaid_ltss_excluded_income.py @@ -0,0 +1,54 @@ +from policyengine_us.model_api import * + + +class wa_medicaid_ltss_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/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..4977c50efb9 --- /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,29 @@ +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 = -1 + 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. 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_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..f19635b8cb1 --- /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,27 @@ +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 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 " + "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..39f391f11da --- /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,27 @@ +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 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 " + "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..1198dee2f2c --- /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,29 @@ +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 = -1 + 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. 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"