Skip to content

Add Minnesota Supplemental Aid (MSA)#8215

Open
hua7450 wants to merge 18 commits intoPolicyEngine:mainfrom
hua7450:mn-msa
Open

Add Minnesota Supplemental Aid (MSA)#8215
hua7450 wants to merge 18 commits intoPolicyEngine:mainfrom
hua7450:mn-msa

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Apr 30, 2026

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

  • Administration: state-supervised, county-administered (DHS supervises; counties/tribal human services agencies determine eligibility through MAXIS)
  • Funding: state general fund (no federal match)
  • Effective date: April 1, 1974 (Minn. Stat. § 256D)
  • Recipients: ~42,311 (Jan 2011 SSA data)
  • Annual expenditures: $71.8M (CY 2010 per SSA 2011 report)

Eligibility

Requirement Source How modeled
Aged/blind/disabled (18+ if disabled) § 256D.44 Subd. 1 is_ssi_aged | is_blind | (age >= 18 & is_ssi_disabled)
Two paths: receives SSI OR SSI-eligible-except-for-income § 256D.44 Subd. 1 dual-track formula
SSI-track resources $2k/$3k federal SSI inherited via ssi > 0
Non-SSI track resources $10k § 256P.02 Subd. 2 (via § 256D.425 Subd. 2(b)) eligibility/asset_limit/non_ssi_track.yaml
Gross income ≤ 300% SSI FBR (600% couple) CM 0019.06 eligibility/income_limit/{individual,couple}_fbr_multiplier.yaml (FBR substituted for SSI recipients per CM 0017)
Net countable income ≤ MSA standard § 256D.44 Subd. 1 mn_msa_net_income_eligible
MN residency program defined_for = StateCode.MN
Citizen or qualified noncitizen § 256D.44 is_citizen_or_legal_immigrant
Qualifying living arrangement enum mn_msa_payment_category != NONE

Benefit Calculation

Living-arrangement assistance standards (combined federal+state)

Living arrangement 2011 (SSA) 2024 (House Res.) 2026 (CM 01/2026)
Individual living alone $735 $1,004 $1,055
Individual living with others $542 $721 $755.33
Couple living alone $1,102 $1,506 $1,582
Couple living with others $738 $1,007 $1,058
Medicaid facility (combined PNA) $89 $125 $132

(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.

  • SSI track (couple): couple_supplement = max(0, standard − max(0, couple_FBR + couple_unearned − $20)), divided by 2 per spouse
  • SSI track (individual): supplement = max(0, standard − max(0, FBR + unearned − $20))
  • Non-SSI track: supplement = max(0, standard − federal_countable_income) where countable income uses the federal SSI helper _apply_ssi_exclusions ($20 general + $65 earned + ½ remainder)
  • FLA-D carve-out: the $20 general disregard is set to 0 for Medicaid-facility recipients so the formula collapses to state_supplement = PNA − federal_FBR

Gross-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"):

  • Gross income test (300%/600% FBR): includes the FBR for SSI recipients
  • Guardian fee 5% × AU gross: includes the FBR for SSI recipients
  • For non-SSI recipients, gross is raw earned + unearned (no SSI substitution)

Federal/state separation

Income variables are inherited from federal SSI rather than duplicated:

  • Earned and unearned income — federal ssi_earned_income, ssi_unearned_income, plus deemed variants
  • Countable income (non-SSI track) — federal _apply_ssi_exclusions helper directly
  • $20 / $65 / ½ disregards — federal parameters at gov.ssa.ssi.income.exclusions

This avoids parameter duplication and inherits federal spousal-deeming and asymmetric-couple aggregation logic for free.

Special-needs add-ons

Add-on Amount Source
Representative payee fee $25/month (2011) → $57/month (2026) § 256D.44 Subd. 5(f); CM 0023.21
Guardian/conservator fee min(5% × AU gross, $100/month) § 256D.44 Subd. 5(d); CM 0023.15
MSA Housing Assistance ½ × SSI individual FBR § 256D.44 Subd. 5(g)(1); CM 0023.24

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)

Item Source Why
Housing-assistance financial test (shelter > 40% income, concurrent subsidy check) § 256D.44 Subd. 5(g)(1); CM 0023.24 Deferred — mn_msa_housing_assistance_eligible is a bare bool input with TODO
Subd. 2 HCBS-waiver and GRH/Housing Support upgrade pathways § 256D.44 Subd. 2; CM 0020.21 We don't track HCBS-waiver enrollment or Housing Support residency at the moment
Age-65 cap on housing assistance § 256D.44 Subd. 5(g)(1) Deferred with the broader housing-assistance financial test
Housing-assistance July-1 FBR freeze § 256D.44 Subd. 5(g)(1) Code uses current-period FBR; small Jan-Jun overstatement (~$13.50/mo). Follow-up issue.
Medically prescribed diet allowance § 256D.44 Subd. 5(b) Per-person diet input not tracked at the moment
$68 grandfathered restaurant meal § 256D.44 Subd. 5(e) Closed cohort, niche
Non-recurring needs § 256D.44 Subd. 5(c) Case-by-case, one-time
Student earned income disregard (SEID) CM 0018.18 Niche — applies to under-22 blind/disabled students
HCBS waiver / GRH / county placement details § 256I; CM 0020.21 County-determined
County supplement above state cap § 256D.44 County-level optional supplement
Pre-1994 grandfathered couple rates (user-elected) Closed cohort
MN narrower non-SSI personal-property definition § 256P.02 Subd. 2(b) Uses federal ssi_countable_resources as proxy; comment noted in mn_msa_resource_eligible.py

Historical Notes

  • Rates increase annually with the SSI COLA per § 256D.44 Subd. 4. PolicyEngine encodes verified static values for 2011 / 2024 / 2026.
  • The 2025 standards are omitted pending primary-source verification (DB101 reports $1,028 individual living alone but no DHS Combined Manual issuance was located for 1/2025).

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 — added mn_msa to adds list
  • policyengine_us/parameters/gov/household/household_state_benefits.yaml — added mn_msa to all date entries
  • policyengine_us/programs.yaml — added MN entry under ssi_state_supplement.state_implementations

Test plan

  • All 102 MN MSA tests pass locally
  • CI passes
  • Smoke check on PolicyEngine web app

hua7450 and others added 5 commits April 30, 2026 18:02
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
Copy link
Copy Markdown

codecov Bot commented May 1, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 97.88%. Comparing base (cc5bd64) to head (f19e627).
⚠️ Report is 105 commits behind head on main.

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     
Flag Coverage Δ
unittests 97.88% <100.00%> (+26.16%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 11 commits May 1, 2026 10:45
- 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>
@hua7450 hua7450 marked this pull request as ready for review May 4, 2026 04:31
hua7450 and others added 2 commits May 4, 2026 00:31
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Minnesota Supplemental Aid (MSA)

1 participant