diff --git a/changelog.d/mn-ccap-rsdi-above-ssi-fbr.fixed.md b/changelog.d/mn-ccap-rsdi-above-ssi-fbr.fixed.md new file mode 100644 index 00000000000..cb2253c3dd6 --- /dev/null +++ b/changelog.d/mn-ccap-rsdi-above-ssi-fbr.fixed.md @@ -0,0 +1 @@ +Count Minnesota CCAP Retirement, Survivors, and Disability Insurance, including dependents' benefits, only above the federal maximum SSI payment, per Minn. Stat. 256P.06, subd. 3(2)(xvi). diff --git a/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/rsdi_sources.yaml b/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/rsdi_sources.yaml new file mode 100644 index 00000000000..cb3c792fa86 --- /dev/null +++ b/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/rsdi_sources.yaml @@ -0,0 +1,22 @@ +description: Minnesota counts these Retirement, Survivors, and Disability Insurance sources under the Child Care Assistance Program, to the extent they exceed the federal maximum Supplemental Security Income payment. +values: + 2025-01-01: + # Retirement, survivors, disability and dependents' benefits; RSDI pays + # dependents of insured people (Combined Manual 0029.06.06). + - social_security + +metadata: + unit: list + period: year + label: Minnesota CCAP Retirement, Survivors, and Disability Insurance sources + reference: + - title: Minn. Stat. 256P.06, subd. 3(2)(xvi) (RSDI above the federal maximum SSI payment) + href: https://www.revisor.mn.gov/statutes/cite/256P.06 + - title: Minnesota CCAP Policy Manual, section 6.6 (Earned/Unearned Income) + href: https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=CCAP_0606 + - title: Minnesota CCAP Policy Manual, section 6.15.24 (Annualizing RSDI) + href: https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=CCAP_061524 + - title: Minnesota Combined Manual, 0017.15.45 - Income From RSDI and SSI + href: https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=cm_00171545 + - title: Minnesota Combined Manual, 0029.06.06 - Retirement, Survivors and Disability Insurance + href: https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=cm_00290606 diff --git a/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml b/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml index a8bc102168b..1c9a1bdfee1 100644 --- a/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml +++ b/policyengine_us/parameters/gov/states/mn/dcyf/ccap/income/countable_income/unearned.yaml @@ -1,12 +1,10 @@ description: Minnesota counts these unearned income sources under the Child Care Assistance Program. values: 2025-01-01: - # RSDI (gross amount) — Retirement, Survivors, and Disability Insurance. - # Listed as components rather than the social_security umbrella, which also - # adds social_security_dependents. - - social_security_retirement - - social_security_survivors - - social_security_disability + # Retirement, Survivors, and Disability Insurance counts only above the + # federal maximum SSI payment (Minn. Stat. 256P.06, subd. 3(2)(xvi)); the + # sources are listed in rsdi_sources. + - mn_ccap_countable_rsdi - dividend_income - interest_income - pension_income diff --git a/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_income.yaml index 4501467b683..1cb898452fb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_income.yaml @@ -1,7 +1,8 @@ # Tests MN CCAP countable income = gross income (earned + unearned sources) # minus allowable deductions, floored at zero (Minn. Rules 3400.0170 subp. 4/6a; # manual sections 6.6 and 6.18). The variable is monthly; annual income inputs -# divide by 12. +# divide by 12. RSDI counts only above the federal maximum SSI payment (Minn. +# Stat. 256P.06, subd. 3(2)(xvi)). - name: Case 1, earnings only. period: 2026-01 absolute_error_margin: 0.01 @@ -31,8 +32,10 @@ members: [person1] state_code: MN output: - # (24,000 + 6,000 + 1,200) / 12 = 2,600 per month. - mn_ccap_countable_income: 2_600 + # RSDI counts only above the 2026 federal maximum SSI payment of + # 994 * 12 = 11,928 (Minn. Stat. 256P.06, subd. 3(2)(xvi)), so the 6,000 + # RSDI counts as 0. (24,000 + 0 + 1,200) / 12 = 2,100 per month. + mn_ccap_countable_income: 2_100 - name: Case 3, income reduced by allowable deductions. period: 2026-01 @@ -112,8 +115,10 @@ members: [person1] state_code: MN output: - # (12,000 + 6,000 + 3,600 + 2,400) / 12 = 24,000 / 12 = 2,000 per month. - mn_ccap_countable_income: 2_000 + # RSDI counts above the 2026 federal maximum SSI payment: + # 12,000 - 994 * 12 = 12,000 - 11,928 = 72. + # (72 + 6,000 + 3,600 + 2,400) / 12 = 12,072 / 12 = 1,006 per month. + mn_ccap_countable_income: 1_006 - name: Case 8, a child's earned income is not counted. period: 2026-01 @@ -214,3 +219,57 @@ # The allowed cross-business offset still works: max(20,000 - 8,000, 0) = # 12,000 net self-employment. 12,000 / 12 = 1,000 per month. mn_ccap_countable_income: 1_000 + +- name: Case 13, each member's RSDI counts only above the federal maximum SSI payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + social_security_disability: 18_000 # 1,500/month + person2: + age: 38 + employment_income: 24_000 # 2,000/month + social_security_survivors: 6_000 # 500/month + person3: + age: 6 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: MN + output: + # Minn. Stat. 256P.06, subd. 3(2)(xvi), 2026 federal maximum SSI payment + # of 994 * 12 = 11,928 per recipient: + # person1 RSDI: 18,000 - 11,928 = 6,072. + # person2 RSDI: max(6,000 - 11,928, 0) = 0. + # (6,072 + 0 + 24,000) / 12 = 30,072 / 12 = 2,506 per month. + mn_ccap_countable_income: 2_506 + +- name: Case 14, a child's RSDI above the federal maximum SSI payment counts as family income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + employment_income: 24_000 # 2,000/month + person2: + age: 8 + social_security_dependents: 13_200 # 1,100/month + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MN + output: + # Minn. Stat. 256P.06, subd. 2 exempts only a child's earned income, so + # the child's own RSDI counts above 994 * 12 = 11,928: + # person2 RSDI: 13,200 - 11,928 = 1,272. + # (24,000 + 1,272) / 12 = 25,272 / 12 = 2,106 per month. + mn_ccap_countable_income: 2_106 diff --git a/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_rsdi.yaml b/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_rsdi.yaml new file mode 100644 index 00000000000..36da0147ce7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/mn/dcyf/ccap/mn_ccap_countable_rsdi.yaml @@ -0,0 +1,146 @@ +# Tests MN CCAP countable RSDI: Minn. Stat. 256P.06, subd. 3(2)(xvi) counts +# only the Retirement, Survivors, and Disability Insurance amount that exceeds +# the monthly federal maximum SSI payment. Federal maximum SSI payment for an +# individual (SSA): $967/month in 2025 (11,604/year), $994/month in 2026 +# (11,928/year). +- name: Case 1, RSDI below the federal maximum SSI payment is not counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + social_security_retirement: 9_600 # 800/month + households: + household: + members: [person1] + state_code: MN + output: + # max(9,600 - 11,928, 0) = 0. + mn_ccap_countable_rsdi: 0 + +- name: Case 2, RSDI above the federal maximum SSI payment counts the excess. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + social_security_disability: 18_000 # 1,500/month + households: + household: + members: [person1] + state_code: MN + output: + # 18,000 - 11,928 = 6,072. + mn_ccap_countable_rsdi: 6_072 + +- name: Case 3, RSDI equal to the federal maximum SSI payment is not counted. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + social_security_retirement: 11_928 # 994/month + households: + household: + members: [person1] + state_code: MN + output: + # 11,928 - 11,928 = 0. + mn_ccap_countable_rsdi: 0 + +- name: Case 4, one person's RSDI components are combined before the offset. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + social_security_retirement: 6_000 # 500/month + social_security_survivors: 9_000 # 750/month + households: + household: + members: [person1] + state_code: MN + output: + # (6,000 + 9,000) - 11,928 = 3,072. + mn_ccap_countable_rsdi: 3_072 + +- name: Case 5, each recipient's RSDI is offset separately. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + social_security_disability: 18_000 # 1,500/month + person2: + age: 38 + social_security_disability: 6_000 # 500/month + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: MN + output: + # person1: 18,000 - 11,928 = 6,072. + # person2: max(6,000 - 11,928, 0) = 0; the unused offset does not carry + # over to person1. + mn_ccap_countable_rsdi: [6_072, 0] + +- name: Case 6, the 2025 federal maximum SSI payment applies in 2025. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + social_security_retirement: 15_000 # 1,250/month + households: + household: + members: [person1] + state_code: MN + output: + # 15,000 - 967 * 12 = 15,000 - 11,604 = 3,396. + mn_ccap_countable_rsdi: 3_396 + +- name: Case 7, RSDI just above the federal maximum SSI payment counts only the excess. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + social_security_retirement: 11_940 # 995/month + households: + household: + members: [person1] + state_code: MN + output: + # 11,940 - 11,928 = 12. + mn_ccap_countable_rsdi: 12 + +- name: Case 8, a child's own dependents' benefit gets its own offset. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + social_security_disability: 18_000 # 1,500/month + person2: + age: 8 + social_security_dependents: 13_200 # 1,100/month + person3: + age: 5 + social_security_dependents: 6_000 # 500/month + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: MN + output: + # person1: 18,000 - 11,928 = 6,072. + # person2: 13,200 - 11,928 = 1,272. + # person3: max(6,000 - 11,928, 0) = 0. + mn_ccap_countable_rsdi: [6_072, 1_272, 0] diff --git a/policyengine_us/variables/gov/states/mn/dcyf/ccap/mn_ccap_countable_rsdi.py b/policyengine_us/variables/gov/states/mn/dcyf/ccap/mn_ccap_countable_rsdi.py new file mode 100644 index 00000000000..dfd0f296f21 --- /dev/null +++ b/policyengine_us/variables/gov/states/mn/dcyf/ccap/mn_ccap_countable_rsdi.py @@ -0,0 +1,31 @@ +from policyengine_us.model_api import * + + +class mn_ccap_countable_rsdi(Variable): + value_type = float + entity = Person + unit = USD + label = "Minnesota CCAP countable Retirement, Survivors, and Disability Insurance" + definition_period = YEAR + defined_for = StateCode.MN + reference = ( + "https://www.revisor.mn.gov/statutes/cite/256P.06", + "https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=CCAP_0606", + "https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=CCAP_061524", + "https://www.dhs.state.mn.us/main/idcplg?IdcService=GET_DYNAMIC_CONVERSION&RevisionSelectionMethod=LatestReleased&dDocName=cm_00171545", + ) + + def formula(person, period, parameters): + # Minn. Stat. 256P.06, subd. 3(2)(xvi) counts, for chapter 142E + # programs, only the RSDI amount that exceeds the monthly federal + # maximum SSI payment. CCAP Policy Manual section 6.6 annualizes the + # gross RSDI and deducts the SSI federal benefit rate from it; section + # 6.15.24 gives that rate as $967 per month in 2025, the individual + # rate. Combined Manual 0017.15.45 counts, for each client who receives + # RSDI, only the amount above the SSI standard for a household of 1, + # and its 09/2024 revision note applies the change to CCAP. We apply + # the individual rate to each recipient's own RSDI. + p = parameters(period).gov.states.mn.dcyf.ccap.income.countable_income + rsdi = add(person, period, p.rsdi_sources) + monthly_fbr = parameters(period).gov.ssa.ssi.amount.individual + return max_(rsdi - monthly_fbr * MONTHS_IN_YEAR, 0)