From 25ef4e6ab4f0146fc3b6f8ec12c4db676900b332 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Nov 2026 17:14:18 -0500 Subject: [PATCH] Restore the part-year facility-stay test cases now that SSI follows each month's facility status PR 10820 (38a392741c) makes SSI combine a couple's income by each month's facility status, so the workarounds added while SSI used December's status can go: - msp_fpg.yaml Case 4: the stay runs from July through December again; expected values are unchanged. Delete the NOTE in _msp_spouse_income.py. - is_medically_needy_for_medicaid.yaml Case 45 (from PR 10640): assert ssi_countable_income again, as [14_320, 27_320], the reviewer's corrected figure (round-3 G12); 20,880 each was the figure with no stay. Also take the reviewer's optional round-3 suggestions on PRs 10633 and 10820: - Candidate us-tx:msp-spouse-deeming-allowance starts in 2025, from Revision 25-2 of Texas MEPD Appendix XXIX, and cites 42 U.S.C. 1396a(r)(2)(A). - The Maryland PAA and Medicaid optional pathway part-year cases give person1 12,000 of earned income, pinning each reader's earned line: [17_370, 5_760]. - Two SSI test names date the change from the first full month in a facility. Co-Authored-By: Claude Opus 5.5 --- .../msp-post-merge-followups.changed.md | 1 + .../is_medically_needy_for_medicaid.yaml | 15 ++++++++------- ...l_senior_or_disabled_countable_income.yaml | 16 ++++++++++------ .../savings_programs/income/msp_fpg.yaml | 12 +++++------- .../ssi/income/ssi_marital_earned_income.yaml | 2 +- .../income/ssi_marital_unearned_income.yaml | 2 +- .../dhs/fia/paa/md_paa_countable_income.yaml | 16 ++++++++++------ .../income/_msp_spouse_income.py | 4 ---- source_conflicts/candidates.yaml | 19 +++++++++++++++---- 9 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 changelog.d/msp-post-merge-followups.changed.md diff --git a/changelog.d/msp-post-merge-followups.changed.md b/changelog.d/msp-post-merge-followups.changed.md new file mode 100644 index 00000000000..c09d09bb324 --- /dev/null +++ b/changelog.d/msp-post-merge-followups.changed.md @@ -0,0 +1 @@ +Let the Medicare Savings Program guideline test's facility stay run through December now that SSI combines a couple's income by each month's facility status, assert SSI countable income again in the New York medically needy part-year case, add earned income to the part-year couple cases for Maryland PAA and the Medicaid optional senior or disabled pathway, and date the Texas Medicare Savings Program deeming-allowance source conflict candidate from 2025. diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml index efffbffbb10..f322d235f81 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml @@ -1201,13 +1201,13 @@ is_medically_needy_for_medicaid: [false, false] # A year reads this month-defined status in December, when the couple is home, so -# the couple is tested together: 8,000 + 34,000 - 240 = 41,760 is above 12 x 2,489 = -# 29,868. Tested alone for the stay, person2's 33,760 is also above 12 x 1,836 = -# 22,032. The ssi_countable_income assertion is left out until -# PolicyEngine/policyengine-us#10820 merges. Until then SSI counts the couple's whole -# income for each spouse in the months of the stay (PolicyEngine/policyengine-us#10818), -# giving 31,320 each where (8,000 + 34,000 - 240) / 2 = 20,880 is right. Restore -# ssi_countable_income: [20_880, 20_880] once the fix merges. +# the couple is tested together against 12 x 2,489 = 29,868. ssi_countable_income +# follows each month's status. During the stay each spouse counts their own income +# less 20 (20 CFR 416.414(b)(3)): (8,000 / 12 - 20) x 6 = 3,880 and +# (34,000 / 12 - 20) x 6 = 16,880. At home from July each counts half of the +# couple's 42,000 / 12 - 20 = 3,480 (20 CFR 416.1802(b)(1)): 1,740 x 6 = 10,440. +# That gives 3,880 + 10,440 = 14,320 and 16,880 + 10,440 = 27,320, together 41,640, +# above 29,868. Tested alone, person2's 27,320 is also above 12 x 1,836 = 22,032. - name: Case 45, a facility stay that ends within the year tests the couple on its December status. period: 2026 absolute_error_margin: 0.01 @@ -1248,6 +1248,7 @@ ssi_couple_computation_applies: 2026-01: [false, false] 2026-12: [true, true] + ssi_countable_income: [14_320, 27_320] medicaid_medically_needy_uses_couple_standard: [true, true] medicaid_medically_needy_income_limit: [29_868, 29_868] is_medically_needy_for_medicaid: [false, 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 1a766683e0c..330935d5679 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 @@ -1109,6 +1109,7 @@ person1: age: 72 is_tax_unit_head: true + ssi_earned_income: 12_000 ssi_unearned_income: 12_000 person2: age: 70 @@ -1135,9 +1136,12 @@ 2025-07: [false, false] # This annual formula applies December's status, separate, to the whole # year, so each spouse counts their own income in all twelve months, - # including January to June, when SSI combines the couple's income: - # (1,000 - 20) x 12 = 11,760 and (500 - 20) x 12 = 5,760. - # Summing the monthly ssi_marital_unearned_income instead would combine - # 1,500 a month through June: 15,000 - 240 = 14,760 and - # 12,000 - 240 = 11,760. - medicaid_optional_senior_or_disabled_countable_income: [11_760, 5_760] + # including January to June, when SSI combines the couple's income. + # person1: (1,000 - 20) + (1,000 - 65) / 2 = 980 + 467.50 = 1,447.50, + # x 12 = 17,370. person2: (500 - 20) x 12 = 5,760. + # Summing the monthly ssi_marital_* variables instead would combine the + # couple's income through June. Unearned, 1,500 a month: person1 + # 15,000 - 240 + 5,610 = 20,370 and person2 12,000 - 240 = 11,760. + # Earned, 1,000 a month: person2 gets 6,000 a year, so + # 5,760 + (500 - 65) / 2 x 12 = 8,370. + medicaid_optional_senior_or_disabled_countable_income: [17_370, 5_760] diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_fpg.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_fpg.yaml index 4bc7a8b68b7..7b846365a1b 100644 --- a/policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_fpg.yaml +++ b/policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/income/msp_fpg.yaml @@ -70,10 +70,8 @@ meets_ssi_disability_criteria: true ssi_lives_in_medical_treatment_facility: 2026-07: true - 2026-12: false ssi_medicaid_pays_majority_of_care: 2026-07: true - 2026-12: false ssi_unearned_income: 18_000 tax_units: tax_unit: @@ -86,14 +84,14 @@ members: [person1, person2] state_code: TX output: - # June, both at home: each spouse's income is above 497 and is deemed: - # 1,000 + 1,500 - 20 = 2,480, above 1.35 x 21,640 / 12 = 2,434.50. + # The stay runs from July through December. + # June, both at home: SSI combines the couple's income (20 CFR + # 416.1802(b)(1)), 1,000 + 1,500 - 20 = 2,480, above the 1,491 couple rate, + # so neither spouse is eligible for SSI. Each spouse's income is above 497 + # and is deemed: 2,480, above 1.35 x 21,640 / 12 = 2,434.50. # July, person2 in a facility (20 CFR 416.414(b)(3)): each is tested alone. # person1: 1,000 - 20 = 980, at or below 15,960 / 12 = 1,330, so QMB. # person2: 1,500 - 20 = 1,480, and not on Medicare. - # The stay ends before December because SSI attributes a couple's income - # by the year's last month (ssi_marital_unearned_income): a stay lasting - # through December would leave their June income uncombined. msp_fpg: 2026-06: [1_803.33, 1_803.33] 2026-07: [1_330, 1_330] diff --git a/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_earned_income.yaml index 220474026fc..22d1baeace4 100644 --- a/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_earned_income.yaml @@ -62,7 +62,7 @@ output: ssi_marital_earned_income: [10, 10] -- name: Earned income is combined only in the months before one spouse enters a medical facility +- name: Earned income is combined only in the months before one spouse's first full month in a medical facility period: 2026 absolute_error_margin: 0.01 input: diff --git a/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_unearned_income.yaml b/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_unearned_income.yaml index 12947143741..598c8178586 100644 --- a/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_unearned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/ssa/ssi/income/ssi_marital_unearned_income.yaml @@ -62,7 +62,7 @@ output: ssi_marital_unearned_income: [10, 10] -- name: Unearned income is combined only in the months before one spouse enters a medical facility +- name: Unearned income is combined only in the months before one spouse's first full month in a medical facility period: 2026 absolute_error_margin: 0.01 input: diff --git a/policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa/md_paa_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa/md_paa_countable_income.yaml index 4f99f3871c6..cd9a5f71e76 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa/md_paa_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/md/dhs/fia/paa/md_paa_countable_income.yaml @@ -54,6 +54,7 @@ person1: age: 72 is_tax_unit_head: true + ssi_earned_income: 12_000 ssi_unearned_income: 12_000 person2: age: 70 @@ -80,11 +81,14 @@ 2025-07: [false, false] # This annual formula applies December's status, separate, to the whole # year, so each spouse counts their own income in all twelve months, - # including January to June, when SSI combines the couple's income: - # (1,000 - 20) x 12 = 11,760 and (500 - 20) x 12 = 5,760. + # including January to June, when SSI combines the couple's income. + # person1: (1,000 - 20) + (1,000 - 65) / 2 = 980 + 467.50 = 1,447.50, + # x 12 = 17,370. person2: (500 - 20) x 12 = 5,760. # Both spouses are aged, so neither is an ineligible spouse and no # income is deemed. - # Summing the monthly ssi_marital_unearned_income instead would combine - # 1,500 a month through June: 15,000 - 240 = 14,760 and - # 12,000 - 240 = 11,760. - md_paa_countable_income: [11_760, 5_760] + # Summing the monthly ssi_marital_* variables instead would combine the + # couple's income through June. Unearned, 1,500 a month: person1 + # 15,000 - 240 + 5,610 = 20,370 and person2 12,000 - 240 = 11,760. + # Earned, 1,000 a month: person2 gets 6,000 a year, so + # 5,760 + (500 - 65) / 2 x 12 = 8,370. + md_paa_countable_income: [17_370, 5_760] diff --git a/policyengine_us/variables/gov/hhs/medicare/savings_programs/income/_msp_spouse_income.py b/policyengine_us/variables/gov/hhs/medicare/savings_programs/income/_msp_spouse_income.py index ee94b6b3e97..6a4198e6325 100644 --- a/policyengine_us/variables/gov/hhs/medicare/savings_programs/income/_msp_spouse_income.py +++ b/policyengine_us/variables/gov/hhs/medicare/savings_programs/income/_msp_spouse_income.py @@ -33,10 +33,6 @@ def msp_spouse_income(person: Population, period: Period, spouse: ArrayLike) -> # 416.1801(c); POMS SI 00501.154 A.1), not only aged, blind or disabled: # uncapped_ssi above zero adds the income test that is_ssi_eligible leaves # out. - # NOTE: SSI attributes a couple's income by the year's last month - # (ssi_marital_unearned_income). In the months before a facility stay that - # lasts through December, uncapped_ssi can be above zero for spouses whose - # combined income rules SSI out, and nothing is then deemed between them. year = period.this_year spouse_eligible_for_ssi = msp_spouse_value( person("uncapped_ssi", period) > 0, spouse diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 0dffa25d573..6afe0b82bad 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -11661,32 +11661,43 @@ candidates: - id: us-tx:msp-spouse-deeming-allowance program: medicare-savings-programs years: - from: 2026 + from: 2025 type: calendar question: When Texas deems an ineligible spouse's income for the Medicare Savings Programs, is the deeming threshold, and each ineligible child's allocation, MEPD Appendix XXIX's program-specific living allowance ($474 for QMB, $568 - for SLMB and $639 for QI-1 in 2026) or SSI's $497 difference between the couple and individual benefit rates? + for SLMB and $639 for QI-1 in 2026; $458, $550 and $619 in 2025) or SSI's difference between the couple and + individual benefit rates ($497 in 2026; $483 in 2025)? sources: - kind: statute citation: 42 U.S.C. 1396d(p)(1)(B) url: https://www.law.cornell.edu/uscode/text/42/1396d + - kind: statute + citation: 42 U.S.C. 1396a(r)(2)(A) + url: https://www.law.cornell.edu/uscode/text/42/1396a#r_2 - kind: regulation citation: 20 CFR 416.1163(b)(1) and (d) url: https://www.law.cornell.edu/cfr/text/20/416.1163 - kind: manual citation: Texas MEPD Handbook, Appendix XXIX (Rev. 26-2) url: https://fhb.hhs.texas.gov/handbooks/medicaid-elderly-people-disabilities-handbook/appendix-xxix-special-deeming-eligibility-test-spouse-spouse + - kind: manual + citation: Texas MEPD Handbook, Revision 25-2 (archived), Appendix XXIX + url: https://fhb.hhs.texas.gov/sites/default/files/documents/mepd-25-2.pdf#page=488 readings: statute: 'Section 1396d(p)(1)(B) measures income "as determined under section 1382a of this title for purposes of the supplemental security income program". 20 CFR 416.1163(b)(1) sets each ineligible child''s allocation at "the difference between the Federal benefit rate for an eligible couple and the Federal benefit rate for an eligible individual", and (d) deems nothing from a spouse whose income after allocations "is not more than" that - difference: $1,491 - $994 = $497 a month in 2026, the same for every program.' + difference: $1,491 - $994 = $497 a month in 2026 and $1,450 - $967 = $483 in 2025, the same for every program. + Section 1396a(r)(2)(A) says the methodology for individuals "under section 1396d(p) of this title may be less + restrictive, and shall be no more restrictive, than the methodology" of the supplemental security income program + for aged, blind or disabled groups.' other: 'Appendix XXIX (Rev. 26-2, information effective March 1, 2026) gives a "Program-Specific Living Allowance Allocation: Community MEPD $497,CAS $497, QMB $474,SLMB $568, QI-1 $639", deducts it for each ineligible child (step 3), deems nothing when the spouse''s remaining income "is no more than the program- specific living allowance" (step 4a), and tells the worker to "re-budget for SLMB or QI-1 if applicable" when an applicant who - passes the QMB pretest fails QMB in the deeming test (step 8).' + passes the QMB pretest fails QMB in the deeming test (step 8). Revision 25-2 (information effective March 1, + 2025) has the same steps with 2025 amounts: "Community MEPD $483, CAS $483, QMB $458, SLMB $550, QI-1 $619".' example: A Texas applicant, 68, on Medicare with $1,340 a month and a spouse, 50, with $497 a month is QMB under the regulation, because $497 is not more than $497, so nothing is deemed and $1,320 is within the one-person $1,330. Under Appendix XXIX, $497 is above $474, so it is deemed for QMB, and $1,340 + $497 - $20 = $1,817 is above the