Add Minnesota Supplemental Aid (MSA)#8215
Open
hua7450 wants to merge 18 commits intoPolicyEngine:mainfrom
Open
Add Minnesota Supplemental Aid (MSA)#8215hua7450 wants to merge 18 commits intoPolicyEngine:mainfrom
hua7450 wants to merge 18 commits intoPolicyEngine:mainfrom
Conversation
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ent to SSI Adds eligibility, income, payment, and special-needs logic for Minnesota's optional state supplement administered by MN DHS under Minn. Stat. §§ 256D.33–256D.54. - 11 parameters under gov/states/mn/dhs/msa/ - 26 variables (5-value living-arrangement enum, two eligibility tracks, all 4 special-needs add-ons) - 14 test files (~50+ cases) including boundary/edge cases - Wired into spm_unit_benefits.py, household_state_benefits.yaml, programs.yaml Refs PolicyEngine#8214 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Apply $20 general disregard on both SSI and non-SSI tracks (per CM 0018.18) - Avoid double-applying earned-income disregards on the SSI track (federal SSI already consumes them) - Add unit tests for previously-untested formula variables (gross_income, countable_unearned_income, earned_income_disregard) - Fix wrong PDF page anchors and replace repealed § 256D.37 / wrong Subd. 1 cites Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8215 +/- ##
===========================================
+ Coverage 71.72% 97.88% +26.16%
===========================================
Files 4658 17 -4641
Lines 67710 284 -67426
Branches 341 2 -339
===========================================
- Hits 48563 278 -48285
+ Misses 19140 6 -19134
+ Partials 7 0 -7
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
- Apply $20 general disregard against (federal SSI + raw unearned) for SSI-track recipients in living-alone / living-with-others arrangements (Minn. Stat. § 256D.44 Subd. 1; House Research Oct 2024 p.3). Carve out Medicaid facility (FLA-D), where the $30 federal SSI is a strict personal-needs cap and no $20 disregard applies (SSA 2011 Table 1). - Convert mn_msa_living_arrangement to a bare-input enum and add mn_msa_payment_category formula override that maps the federal medical- treatment facility code to MEDICAID_FACILITY (Maine SSP pattern). - Delete redundant input bools mn_msa_lives_with_others, mn_msa_treated_as_living_alone, and mn_msa_in_group_residential. - Gate mn_msa_special_needs_total so MSA Housing Assistance and Shelter Need are mutually exclusive (both authorized under § 256D.44 Subd. 5(g); CM 0023.24 gives Housing Assistance precedence). - Verify Shelter Need formula source against Minn. Stat. § 256D.44 Subd. 5(g)(1): "one-half of the maximum federal Supplemental Security Income payment amount for a single individual" — ½ × FBR confirmed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…variable) Both variables encoded the same formula (½ × federal SSI individual FBR) under Minn. Stat. § 256D.44 Subd. 5(g). They represented two eligibility pathways into the same statutory benefit: - Institution-relocation / HCBS-waiver / shelter > 40% income (Subd. 5(g)(1)) - Chronic homelessness / housing stabilization (CM 0023.24) Keep `mn_msa_housing_assistance` as the surviving variable; drop the parallel `mn_msa_shelter_need_allowance`. Mutual-exclusion gating in `mn_msa_special_needs_total` is no longer needed and reverts to a clean `adds = [...]` summation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
P2.1: For joint SSI couples in COUPLE_* arrangements, the $20 general disregard is now applied once to combined couple income (halved per spouse) rather than twice. 2026 couple living alone now correctly receives $111/mo (was $131/mo, overpaying by $20). P2.2: For non-SSI track couples, the $20 general disregard and $65 earned- income disregard are now halved per spouse so they sum to the correct once-per-couple totals. P2.3: Include `ssi_unearned_income_deemed_from_ineligible_parent` in MSA gross income, countable unearned, raw unearned, and earned-disregard rollover so blind/disabled child applicants with high parental income correctly fail the gross/net income screens. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file belongs in local memory and/or the policyengine-claude plugin repo, not in the policyengine-us code repo. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fix the per-spouse floor that wasted half the $20 / $65 disregards when only one spouse in a COUPLE_LIVING_* arrangement had income. Aggregate countable income, earned-income disregard, and SSI/non-SSI supplements at the marital_unit level, then split 50/50 across spouses. Apply policyengine-parameter-patterns and policyengine-variable-patterns skills: switch dimensionless ratios to period: year, rewrite parameter descriptions to the [State] [verb] this amount under the [Full Program Name] program template, replace lawhelpmn.org and incorrect CM 0018.18 references with primary statute / 20 CFR § 416.1124(c)(12), tighten subdivision citations, backdate the general disregard to MSA's 1974 program effective date, add a 1974 zero-floor for the rep payee fee. Drop the forbidden documentation field on mn_msa_housing_assistance_pathway_eligible and remove the file entirely. Defer the § 256D.44 Subd. 5(g) financial-eligibility test (40 percent shelter cost, concurrent housing subsidy check) to a follow-up PR — mn_msa_housing_assistance_eligible is now a bare bool input with a TODO comment. Trim multi-paragraph comment blocks across mn_msa_person.py and the income variables, simplify mn_msa_eligible_person to a single combined return, and replace marital_unit.sum > 0 with marital_unit.any in mn_msa_payment_category. Renumber out-of-order Case 5 in mn_msa_eligible_person.yaml and add positive-immigration (LPR), negative-immigration (UNDOCUMENTED), asymmetric-couple SSI track, asymmetric-couple non-SSI track, SSI-track-with-extra-unearned, and negative-self-employment cap tests. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Resource cap: § 256D.37 Subd. 1 applies the $10,000 personal-property limit to the assistance unit (married couple combined), not per spouse. Sum ssi_countable_resources at the marital unit before the comparison. Couples with combined resources above the cap (e.g., $6k + $6k) were previously passing because each spouse's share was individually under the limit. Gross-income cap: § 256D.44 Subd. 1 applies the 600% FBR couple cap to any married pair where both spouses are MSA-categorically eligible — not just SSI joint filers. Drop the ssi_claim_is_joint gate. Non-SSI aged couples with combined gross under the couple cap but one spouse above the individual cap were previously being made ineligible. Add tests for both fixes: combined-$12k couple ineligible, $10k boundary eligible, and an aged non-SSI couple with $3k/$2k earnings correctly under the $5,964 couple cap. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Address Critical findings from /review-program audit (PR PolicyEngine#8215): - MEDICAID_FACILITY 2024/2026 values were double-counting the $30 federal SSI FBR on top of an already-combined PNA. Per CM 0020.21 and CM 0020.24, the assistance standard equals the PNA. Update 2024 to $125 and 2026 to $132 (combined federal+state target), matching the same convention used for community-living rows. - Fix wrong subdivision citations: guardian fee Subd. 5(b) → 5(d); representative payee fee Subd. 5(c) → 5(f). - Replace repealed Minn. Stat. § 256D.37 (repealed 1995) with the live § 256P.02 Subd. 2 + § 256D.425 Subd. 2(b) chain in both the asset-limit parameter and the resource-eligibility variable. - Update 300%/600% FBR gross-income gate citation from § 256D.44 Subd. 1 (which covers only COLA mechanics) to MN DHS Combined Manual 0019.06. - Document deferred § 256D.44 Subd. 2 HCBS-waiver and GRH/Housing Support upgrade pathways alongside the existing Subd. 5(g) deferral comment. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per CM 0018.18 ("for SSI recipients, no county action is required") and
House Research Oct 2024, MN MSA inherits federal SSI's income disregards
($20 + $65 + 1/2). The PR's MSA-specific countable-income, earned-income-
disregard, and gross-income variables duplicated logic already provided
by federal SSI variables.
Deletes (5 variables, 3 parameters, 5 test files):
- mn_msa_countable_{earned,unearned,}_income
- mn_msa_earned_income_disregard
- mn_msa_gross_income
- disregard/{general,earned/initial,earned/rate}.yaml
Rewrites consumers using federal _apply_ssi_exclusions helper for the
non-SSI track and raw federal SSI income variables for the SSI track:
- mn_msa_person: non-SSI track via _apply_ssi_exclusions; SSI track
unchanged (FBR + raw_unearned - $20 with FLA-D carve-out)
- mn_msa_net_income_eligible: SSI track now correctly applies the
House Research FBR-substitution rule that the deleted variable was
missing
- mn_msa_gross_income_eligible: removes incorrect FBR substitution
per CM 0019.06 (gross test uses raw earned + unearned only)
- mn_msa_guardian_fee: per Subd. 5(d) and CM 0023.15, computes 5%
of the assistance unit's gross monthly income (raw earned + unearned,
excluding SSI per CM 0017) at the marital-unit level
Test updates:
- mn_msa_assistance_standard.yaml Case 5 medfac: 162 -> 132
- mn_msa_person.yaml Case 3 medfac: 132 -> 102 (state supplement,
not combined PNA)
- integration.yaml Case 2: SSI couple CLWO now correctly fails the
net-income test (couple FBR exceeds the standard) — payment $0
unchanged
- integration.yaml Case 11: rewritten as realistic non-SSI track
recipient with $2k earnings; exercises guardian fee at cap
86/86 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Critical fixes: - Rep payee fee: drop 1974 zero-row, add 2011 anchor at $25 (per SSA 2011 10%-of-gross-capped-at-$25 rule). Forward-fills from 2011 to match the assistance-standard anchor-year convention. - assistance_standard/amount.yaml: replace wrong subdivision labels (Subd. 2 "basic needs" → Subd. 1 COLA escalator; Subd. 3 "shelter needs" → Subd. 3 "basic needs"). Shelter is in Subd. 5(g). - Replace fabricated "Section 9.5" cite in guardian_fee files with "Special Needs Circumstances - Guardianship fees" (SSA 2011 has no section numbering). - Add 2011-period tests (3 cases in mn_msa_assistance_standard.yaml). - Add COUPLE_LIVING_WITH_OTHERS and NONE coverage to mn_msa_living_arrangement.yaml. CM 0017 correction (per DHS rule "for SSI recipients, count the full amount of the SSI Federal Benefit Rate as gross unearned income"): - mn_msa_gross_income_eligible.py: include SSI FBR for SSI recipients in the 300%/600% gross-income test. - mn_msa_guardian_fee.py: include SSI FBR for SSI recipients in the 5% × AU gross monthly income calc. Test coverage additions: - Medicaid facility with non-zero unearned (FLA-D zero-disregard branch) - Couple net-income at exact-equality boundary ($1,582) and below ($1,581) - Special-needs isolation cases (zero, guardian-only, payee-only, housing-only) - Repurposed integration Case 10 to a couple housing-upgrade scenario - 2024 housing assistance case → $471.50 - Blind 10-year-old eligibility (blind branch has no age cap) - Medicaid facility in mn_msa_eligible_person.yaml and mn_msa_net_income_eligible.yaml Quality cleanups: - Replace stale § 256D.37 cite in mn_msa_resource_eligible.yaml comments. - Document MN-narrower personal-property definition deferral in mn_msa_resource_eligible.py. - Fix misleading $10-half-disregard comment in mn_msa_net_income_eligible Case 4. 102/102 tests pass. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Remove pre_subsidy_rent from 10 test cases (no formula reads it now that housing-assistance financial test is deferred) - Add cycle-avoidance comment to mn_msa_person and mn_msa_net_income_eligible explaining why countable-income logic is intentionally duplicated - Document INDIVIDUAL_LIVING_ALONE default caveat on mn_msa_living_arrangement Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Minnesota Supplemental Aid (MSA) in PolicyEngine — Minnesota's optional State Supplementary Payment to SSI, administered by the Minnesota Department of Human Services under Minn. Stat. §§ 256D.33–256D.54.
Closes #8214
Regulatory Authority
Program Overview
Eligibility
is_ssi_aged | is_blind | (age >= 18 & is_ssi_disabled)ssi > 0eligibility/asset_limit/non_ssi_track.yamleligibility/income_limit/{individual,couple}_fbr_multiplier.yaml(FBR substituted for SSI recipients per CM 0017)mn_msa_net_income_eligibledefined_for = StateCode.MNis_citizen_or_legal_immigrantmn_msa_payment_category != NONEBenefit Calculation
Living-arrangement assistance standards (combined federal+state)
(All values are COMBINED federal+state; formula subtracts federal SSI to yield state portion. The Medicaid-facility row equals the personal needs allowance per CM 0020.21, which itself includes the $30 federal SSI FBR.)
Formula
Couples are computed at the marital unit then split 50/50 to each spouse.
couple_supplement = max(0, standard − max(0, couple_FBR + couple_unearned − $20)), divided by 2 per spousesupplement = max(0, standard − max(0, FBR + unearned − $20))supplement = max(0, standard − federal_countable_income)where countable income uses the federal SSI helper_apply_ssi_exclusions($20 general + $65 earned + ½ remainder)state_supplement = PNA − federal_FBRGross-income definition (CM 0017)
Per CM 0017 ("for SSI recipients, count the full amount of the SSI Federal Benefit Rate as gross unearned income, even if their actual SSI check is less"):
Federal/state separation
Income variables are inherited from federal SSI rather than duplicated:
ssi_earned_income,ssi_unearned_income, plus deemed variants_apply_ssi_exclusionshelper directlygov.ssa.ssi.income.exclusionsThis avoids parameter duplication and inherits federal spousal-deeming and asymmetric-couple aggregation logic for free.
Special-needs add-ons
Guardian fee uses raw earned + unearned + (FBR for SSI recipients per CM 0017) at the marital-unit level.
Living-arrangement enum (5 values + NONE)
INDIVIDUAL_LIVING_ALONE,INDIVIDUAL_LIVING_WITH_OTHERS,COUPLE_LIVING_ALONE,COUPLE_LIVING_WITH_OTHERS,MEDICAID_FACILITY,NONE(disqualifying input).User-elected to skip pre-1994 grandfathered couple categories (closed cohort, shrinking).
Not Modeled (by design / deferred)
mn_msa_housing_assistance_eligibleis a bare bool input with TODOssi_countable_resourcesas proxy; comment noted inmn_msa_resource_eligible.pyHistorical Notes
Files
policyengine_us/parameters/gov/states/mn/dhs/msa/(8 files)policyengine_us/variables/gov/states/mn/dhs/msa/(20 files — income logic inherits from federal SSI helpers)policyengine_us/tests/policy/baseline/gov/states/mn/dhs/msa/(9 test files, 102 tests)Integration
policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py— addedmn_msato adds listpolicyengine_us/parameters/gov/household/household_state_benefits.yaml— addedmn_msato all date entriespolicyengine_us/programs.yaml— added MN entry underssi_state_supplement.state_implementationsTest plan