From da4788e9cc0796bd9e398be7a7d6f9903adee32b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 20 Oct 2026 16:50:07 -0400 Subject: [PATCH 1/4] Exclude county staff guardians from Minnesota MSA fees --- .../mn-msa-guardian-fee-county-staff.fixed.md | 1 + .../dhs/msa/payment/mn_msa_guardian_fee.yaml | 61 +++++++++++++++++++ .../msa/mn_msa_guardian_is_county_staff.py | 11 ++++ .../mn/dhs/msa/payment/mn_msa_guardian_fee.py | 7 ++- 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 changelog.d/mn-msa-guardian-fee-county-staff.fixed.md create mode 100644 policyengine_us/variables/gov/states/mn/dhs/msa/mn_msa_guardian_is_county_staff.py 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/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..6591f5a5941 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. + # MN DHS's MSA policy lead (correspondence, 2026-10-19) reports that + # approved guardian fees are $100 in practice regardless of income; + # PolicyEngine follows the statute's 5%/$100 cap (Max's ruling). 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 From 8a271d47e00c06ef82d7a3c2e807505a0a04fd54 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Tue, 20 Oct 2026 22:31:48 -0400 Subject: [PATCH 2/4] Describe the DHS practice note without identifying a role Co-Authored-By: Claude Opus 5.5 --- .../gov/states/mn/dhs/msa/payment/mn_msa_guardian_fee.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 6591f5a5941..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,9 @@ 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. - # MN DHS's MSA policy lead (correspondence, 2026-10-19) reports that - # approved guardian fees are $100 in practice regardless of income; - # PolicyEngine follows the statute's 5%/$100 cap (Max's ruling). + # 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) From 7ae2ba310da579fa1b7626e3e598f0d9f64e1281 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 21 Oct 2026 12:08:22 -0400 Subject: [PATCH 3/4] Point the us-mn:msa-guardian-fee-cap candidate at this PR's code Co-Authored-By: Claude Opus 5.5 --- source_conflicts/candidates.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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. From d3fb780298e0a22f694a728e4c13d02c3e116a37 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Wed, 21 Oct 2026 12:08:24 -0400 Subject: [PATCH 4/4] Baseline the MN guardian fee practice comment until it is registered Co-Authored-By: Claude Opus 5.5 --- policyengine_us/tests/code_health/test_source_conflicts.py | 1 + 1 file changed, 1 insertion(+) 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,