diff --git a/changelog.d/mn-msa-guardian-fee-county-staff.fixed.md b/changelog.d/mn-msa-guardian-fee-county-staff.fixed.md new file mode 100644 index 00000000000..92496075e3e --- /dev/null +++ b/changelog.d/mn-msa-guardian-fee-county-staff.fixed.md @@ -0,0 +1 @@ +Exclude county agency staff guardians and conservators from Minnesota Supplemental Aid guardian fees while retaining the statutory 5% of gross monthly income / $100 cap for other guardians. diff --git a/policyengine_us/tests/code_health/test_source_conflicts.py b/policyengine_us/tests/code_health/test_source_conflicts.py index 25311fb01e9..ac9ad438464 100644 --- a/policyengine_us/tests/code_health/test_source_conflicts.py +++ b/policyengine_us/tests/code_health/test_source_conflicts.py @@ -160,6 +160,7 @@ "policyengine_us/variables/gov/states/ks/tax/income/deductions/ks_itemized_deductions.py": 1, "policyengine_us/variables/gov/states/ky/dcbs/liheap/ky_liheap.py": 1, "policyengine_us/variables/gov/states/mn/dcyf/mfip/income/earned/mn_mfip_dependent_care_deduction.py": 1, + "policyengine_us/variables/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py": 1, "policyengine_us/variables/gov/states/mn/tax/income/deductions/mn_itemized_deductions.py": 1, "policyengine_us/variables/gov/states/mn/tax/income/subtractions/mn_k12_education_subtraction.py": 1, "policyengine_us/variables/gov/states/mo/dese/ccs/eligibility/mo_ccs_income_eligible.py": 1, diff --git a/policyengine_us/tests/policy/baseline/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.yaml b/policyengine_us/tests/policy/baseline/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.yaml index f9824946ec7..cc0d42ffb47 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.yaml @@ -10,6 +10,7 @@ immigration_status: CITIZEN ssi_countable_resources: 500 mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: false ssi_unearned_income: 24_000 # $2,000/mo gross marital_units: marital_unit: @@ -40,6 +41,7 @@ immigration_status: CITIZEN ssi_countable_resources: 500 mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: false ssi_unearned_income: 36_000 # $3,000/mo gross -> 5% = $150 marital_units: marital_unit: @@ -70,6 +72,7 @@ immigration_status: CITIZEN ssi_countable_resources: 500 mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: false ssi: 0 ssi_unearned_income: 12_000 # $1,000/mo -> 5% = $50 marital_units: @@ -146,6 +149,7 @@ state_code: MN output: # min(5% of $1,999 = $99.95, $100 cap) = $99.95. + mn_msa_guardian_is_county_staff: false mn_msa_guardian_fee: 99.95 - name: Case 6, gross income $1 above $2,000 boundary is capped at $100. @@ -177,3 +181,60 @@ output: # min(5% of $2,001 = $100.05, $100 cap) = $100. mn_msa_guardian_fee: 100 + +- name: Case 7, county agency staff guardian receives no fee below the cap. + period: 2026-01 + input: + state_code: MN + age: 70 + mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: true + ssi: 0 + ssi_unearned_income: 12_000 # $1,000/mo would otherwise allow $50. + output: + mn_msa_guardian_fee: 0 + +- name: Case 8, county agency staff guardian receives no fee above the cap. + period: 2026-01 + input: + state_code: MN + age: 70 + mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: true + ssi: 0 + ssi_unearned_income: 36_000 # $3,000/mo would otherwise allow $100. + output: + mn_msa_guardian_fee: 0 + +- name: Case 9, county staff status only excludes that person's guardian fee. + period: 2026-01 + input: + people: + county_staff_guardian_person: + age: 70 + mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: true + ssi: 0 + ssi_unearned_income: 18_000 + nonstaff_guardian_person: + age: 70 + mn_msa_has_guardian: true + mn_msa_guardian_is_county_staff: false + ssi: 0 + ssi_unearned_income: 18_000 + marital_units: + marital_unit: + members: [county_staff_guardian_person, nonstaff_guardian_person] + tax_units: + tax_unit: + members: [county_staff_guardian_person, nonstaff_guardian_person] + spm_units: + spm_unit: + members: [county_staff_guardian_person, nonstaff_guardian_person] + households: + household: + members: [county_staff_guardian_person, nonstaff_guardian_person] + state_code: MN + output: + # Unit gross income is $3,000/mo: only the nonstaff guardian gets the $100 cap. + mn_msa_guardian_fee: [0, 100] diff --git a/policyengine_us/variables/gov/states/mn/dhs/msa/mn_msa_guardian_is_county_staff.py b/policyengine_us/variables/gov/states/mn/dhs/msa/mn_msa_guardian_is_county_staff.py new file mode 100644 index 00000000000..9fb8e245e70 --- /dev/null +++ b/policyengine_us/variables/gov/states/mn/dhs/msa/mn_msa_guardian_is_county_staff.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class mn_msa_guardian_is_county_staff(Variable): + value_type = bool + default_value = False + entity = Person + label = "Whether the person's Minnesota Supplemental Aid guardian or conservator is a member of the county agency staff" + definition_period = MONTH + defined_for = StateCode.MN + reference = "https://www.revisor.mn.gov/statutes/cite/256D.44#stat.256D.44.5" diff --git a/policyengine_us/variables/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py b/policyengine_us/variables/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py index 1cb654a81cd..d1ab0978070 100644 --- a/policyengine_us/variables/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py +++ b/policyengine_us/variables/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py @@ -20,9 +20,14 @@ def formula(person, period, parameters): # for SSI recipients count the full SSI FBR as gross unearned # income (even when the actual SSI check is less). Aggregate to # the marital unit before applying the cap. + # Minnesota DHS correspondence (2026-10-19) reports that approved + # guardian fees are $100 in practice regardless of income. + # PolicyEngine follows the statute's 5%/$100 cap, which governs. p = parameters(period).gov.states.mn.dhs.msa.special_needs.guardian_fee has_guardian = person("mn_msa_has_guardian", period) + guardian_is_county_staff = person("mn_msa_guardian_is_county_staff", period) gross = person("mn_msa_gross_income", period) unit_gross = person.marital_unit.sum(gross) unit_fee = min_(unit_gross * p.rate, p.max_amount) - return has_guardian * unit_fee + # Minn. Stat. ยง 256D.44 Subd. 5(d) allows no fee for county agency staff. + return has_guardian * ~guardian_is_county_staff * unit_fee diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 7d8c41658c6..90d0f6b972a 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -3148,8 +3148,10 @@ candidates: example: An SSI-only recipient receives $49.70 versus $100 in 2026, and $51.45 versus $100 in 2027. pe_us: follows: statute - code: [] - prs: [] + code: + - policyengine_us/variables/gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10315 state: ruled note: Ruled in October 2026 to retain the statutory cap; confirm and describe the stated agency practice without quoting correspondence.