From 508f19b33a1d493dd04b4d2ea8ce435b41242384 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 26 Oct 2026 16:42:23 -0400 Subject: [PATCH] Subtract Connecticut's ABD unearned income disregard per spouse UPM 5030.15 A subtracts the individual disregard from each unit member's own unearned income, and UPM 5045.10 E sums the results. A by-state flag (CT true) caps each spouse's disregard at their own unearned income instead of subtracting the couple disregard from combined income. Closes #10458 Co-Authored-By: Claude Opus 5.5 --- .../ct-husky-c-per-member-disregard.fixed.md | 1 + .../income/disregard/applies_per_member.yaml | 115 ++++++++++++++++++ ...l_senior_or_disabled_countable_income.yaml | 51 ++++++++ ...nal_senior_or_disabled_countable_income.py | 16 ++- 4 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 changelog.d/ct-husky-c-per-member-disregard.fixed.md create mode 100644 policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/income/disregard/applies_per_member.yaml diff --git a/changelog.d/ct-husky-c-per-member-disregard.fixed.md b/changelog.d/ct-husky-c-per-member-disregard.fixed.md new file mode 100644 index 00000000000..606f0251bd6 --- /dev/null +++ b/changelog.d/ct-husky-c-per-member-disregard.fixed.md @@ -0,0 +1 @@ +Connecticut's aged, blind and disabled Medicaid pathway subtracts the unearned income disregard from each spouse's own unearned income (UPM 5030.15 A). diff --git a/policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/income/disregard/applies_per_member.yaml b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/income/disregard/applies_per_member.yaml new file mode 100644 index 00000000000..47d15903316 --- /dev/null +++ b/policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/income/disregard/applies_per_member.yaml @@ -0,0 +1,115 @@ +description: The state subtracts the individual income disregard from each spouse's own unearned income, instead of subtracting the couple disregard from the couple's combined unearned income, under the optional Medicaid pathway for seniors or people with disabilities, if this is true. +metadata: + unit: bool + period: year + label: Medicaid senior or disabled income disregard applies per member + breakdown: + - state_code + reference: + - title: Connecticut DSS Uniform Policy Manual 5030.15 A - Unearned Income Disregards, AABD and MAABD + href: https://portal.ct.gov/dss/-/media/departments-and-agencies/dss/upms/upm5---treatment-of-income-income-eligibility/5030_15.doc + - title: Connecticut DSS Uniform Policy Manual 5045.10 C and E - Applied Income Calculation Method, AABD and MAABD + href: https://portal.ct.gov/dss/-/media/departments-and-agencies/dss/upms/upm5---treatment-of-income-income-eligibility/5045_10.doc + +AK: + 2015-01-01: false +AL: + 2015-01-01: false +AR: + 2015-01-01: false +AZ: + 2015-01-01: false +CA: + 2015-01-01: false +CO: + 2015-01-01: false +CT: + 2015-01-01: true +DC: + 2015-01-01: false +DE: + 2015-01-01: false +FL: + 2015-01-01: false +GA: + 2015-01-01: false +HI: + 2015-01-01: false +IA: + 2015-01-01: false +ID: + 2015-01-01: false +IL: + 2015-01-01: false +IN: + 2015-01-01: false +KS: + 2015-01-01: false +KY: + 2015-01-01: false +LA: + 2015-01-01: false +MA: + 2015-01-01: false +MD: + 2015-01-01: false +ME: + 2015-01-01: false +MI: + 2015-01-01: false +MN: + 2015-01-01: false +MO: + 2015-01-01: false +MS: + 2015-01-01: false +MT: + 2015-01-01: false +NC: + 2015-01-01: false +ND: + 2015-01-01: false +NE: + 2015-01-01: false +NH: + 2015-01-01: false +NJ: + 2015-01-01: false +NM: + 2015-01-01: false +NV: + 2015-01-01: false +NY: + 2015-01-01: false +OH: + 2015-01-01: false +OK: + 2015-01-01: false +OR: + 2015-01-01: false +PA: + 2015-01-01: false +RI: + 2015-01-01: false +SC: + 2015-01-01: false +SD: + 2015-01-01: false +TN: + 2015-01-01: false +TX: + 2015-01-01: false +UT: + 2015-01-01: false +VA: + 2015-01-01: false +VT: + 2015-01-01: false +WA: + 2015-01-01: false +WI: + 2015-01-01: false +WV: + 2015-01-01: false +WY: + 2015-01-01: false diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml index 883b6e7bed9..395433a72df 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.yaml @@ -105,3 +105,54 @@ # rounding, 1,131.75 would exceed the $1,131 standard. medicaid_optional_senior_or_disabled_countable_income: 13_572 is_optional_senior_or_disabled_income_eligible: true + +- name: Connecticut couple with each spouse above the individual disregard gets twice the individual disregard. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ssi_unearned_income: 15_600 + person2: + age: 68 + is_tax_unit_spouse: true + ssi_unearned_income: 7_800 + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # UPM 5030.15 A: (1,300 - 535) + (650 - 535) = 880 a month. + # 880 x 12 / 2 = 5,280 each. + medicaid_optional_senior_or_disabled_countable_income: [5_280, 5_280] + +- name: Connecticut couple gets the disregard only up to a spouse's own unearned income. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_tax_unit_head: true + ssi_unearned_income: 18_000 + person2: + age: 68 + is_tax_unit_spouse: true + ssi_unearned_income: 3_600 + marital_units: + marital_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: CT + output: + # UPM 5030.15 A: (1,500 - 535) + max(300 - 535, 0) = 965 a month. + # 965 x 12 / 2 = 5,790 each. Subtracting the 1,070 couple disregard from + # the combined 1,800 would give 4,380 each. + medicaid_optional_senior_or_disabled_countable_income: [5_790, 5_790] diff --git a/policyengine_us/variables/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.py b/policyengine_us/variables/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.py index 044371e7419..289cf21bf79 100644 --- a/policyengine_us/variables/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.py +++ b/policyengine_us/variables/gov/hhs/medicaid/income/medicaid_optional_senior_or_disabled_countable_income.py @@ -13,6 +13,9 @@ class medicaid_optional_senior_or_disabled_countable_income(Variable): reference = ( "https://www.law.cornell.edu/uscode/text/42/1396a#m", "https://www.kff.org/medicaid/medicaid-financial-eligibility-for-seniors-and-people-with-disabilities-findings-from-a-50-state-survey/", + # Connecticut unearned income disregard per member + "https://portal.ct.gov/dss/-/media/departments-and-agencies/dss/upms/upm5---treatment-of-income-income-eligibility/5030_15.doc", + "https://portal.ct.gov/dss/-/media/departments-and-agencies/dss/upms/upm5---treatment-of-income-income-eligibility/5045_10.doc", # Missouri MHABD budgeting order and rounding "https://dssmanuals.mo.gov/mo-healthnet-for-the-aged-blind-and-disabled/0805-000-00/0805-015-00/", "https://dssmanuals.mo.gov/mo-healthnet-for-the-aged-blind-and-disabled/0805-000-00/0805-015-00/0805-015-25/", @@ -44,9 +47,20 @@ def formula(person, period, parameters): p = parameters( period ).gov.hhs.medicaid.eligibility.categories.senior_or_disabled.income.disregard + # UPM 5030.15 A subtracts the individual disregard from each member's + # own unearned income, and UPM 5045.10 E sums the members' results, so + # each spouse uses the disregard only up to their own unearned income. + own_unearned_monthly = person("ssi_unearned_income", period) / MONTHS_IN_YEAR + per_member_disregard = person.marital_unit.sum( + min_(own_unearned_monthly, p.individual[state]) + ) + applies_per_member = p.applies_per_member[state].astype(bool) + couple_disregard = where( + applies_per_member, per_member_disregard, p.couple[state] + ) income_disregard = where( couple_computation, - p.couple[state], + couple_disregard, p.individual[state], ) personal_countable = _apply_medicaid_optional_senior_or_disabled_exclusions(