Skip to content

Add Minnesota Supplemental Aid (MSA)#8215

Merged
hua7450 merged 26 commits into
PolicyEngine:mainfrom
hua7450:mn-msa
Jun 1, 2026
Merged

Add Minnesota Supplemental Aid (MSA)#8215
hua7450 merged 26 commits into
PolicyEngine: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.90%. Comparing base (214c0e7) to head (bd46a33).
⚠️ Report is 2 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #8215      +/-   ##
==========================================
+ Coverage   97.76%   97.90%   +0.13%     
==========================================
  Files          16       17       +1     
  Lines         269      287      +18     
  Branches        2        2              
==========================================
+ Hits          263      281      +18     
  Misses          6        6              
Flag Coverage Δ
unittests 97.90% <100.00%> (+0.13%) ⬆️

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 4 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>
@hua7450 hua7450 requested a review from PavelMakarchuk May 12, 2026 20:35
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #8215 Review — Minnesota Supplemental Aid (MSA)

Author: @hua7450 · Closes: #8214 · CI: all green except codecov/project

New state supplementary payment to SSI administered by MN DHS under Minn. Stat. §§ 256D.33–256D.54. Coverage spans 2011 baseline with 2024/2025/2026 parameter updates; 110 YAML tests pass.

Source documents consulted

  • PDF 1 — MN DHS Combined Manual (01/2026 issue), mndhs-073585.pdf — assistance standards (CM 0020.21), PNA (0020.24), rep-payee fee (0023.21), SSI FBR (0029.06.03), earned-income disregards (0018.18).
  • PDF 2 — MN House Research "Minnesota Supplemental Aid" brief (October 2024), pap_MSA.pdf — administration, eligibility, benefit calculation, special needs, housing.
  • Statute HTML — Minn. Stat. § 256D.44 (revisor.mn.gov) — Subd. 1, 3, 5(d), 5(f), 5(g)(1); § 256P.02 Subd. 2; § 256D.35 Subd. 10.

Critical (Must Fix)

  1. Living-arrangement default overstates simulated benefits. mn_msa_living_arrangement and mn_msa_payment_category default to INDIVIDUAL_LIVING_ALONE. The author's own comment acknowledges this "may overstate benefits for elderly persons living with relatives." In microsim against CPS, every MN aged/blind/disabled person receives the higher living-alone standard ($1,055/mo in 2026 vs $755.33 for living-with-others — a ~$300/mo overstatement per affected person). Fix: change default_value to NONE (yields 0 standard) so users opt in.

  2. Pre-1/1/94 grandfathered couple standards entirely unmodeled. PDF 1 p4 and PDF 2 p6 both enumerate distinct standards for couples who began receiving MSA before 1/1/94: 2026 = $1,597 (living alone) / $1,321 (living with others); 2024 = $1,521 / $1,270. The MNMSALivingArrangement enum has no pre-1994 variants — every couple silently collapses to the post-1994 schedule, understating the grandfathered cohort by ~$263/mo (living with others) and ~$15/mo (living alone) for 2024.

  3. "Living with others" standards use fractional dollars in violation of Subd. 1 "round up to nearest dollar." INDIVIDUAL_LIVING_WITH_OTHERS 2025/2026 = 737.33 / 755.33 and COUPLE_LIVING_WITH_OTHERS 2025 = 1_030.67 use cents. Subd. 1 requires the MSA standard itself to be rounded up after the SSI COLA is applied. Either the published DHS standards are integers (and the parameter is wrong) or the rounding step is being skipped. Cross-check the DHS Combined Manual 0020.21 table and apply the statutory round-up.

  4. Representative-payee fee missing intermediate years 2012–2025. Parameter jumps from $25 (2011) directly to $57 (2026); SSA's authorized maximum escalates annually with the COLA (~$54 in 2024, ~$58 in 2025). Silently underpays MSA recipients for 14 years. Also: the 2011 value of $25 has no corroborating reference — the statute (Subd. 5(f)) describes mechanism only, and the 2026 DHS manual is the only cited source. Add SSA 2011 Minnesota state-supplement page citation and backfill annual values per SSA's published schedule.

Should Address

  1. TODO block in production code. mn_msa_housing_assistance_eligible.py is a bare bool input with a multi-line TODO (lines 3816–3829) documenting the unmodeled § 256D.44 Subd. 5(g) test (age < 65; PCA/HCBS/relocation pathway; 40%-of-gross shelter test; no concurrent subsidy). Convert TODO to a docstring noting the limitation — TODOs in production violate the "no TODO comments" principle.

  2. Duplicated countable-income logic. mn_msa_person.py:32–123 and mn_msa_net_income_eligible.py:31–105 duplicate ~80 lines of countable-income arithmetic to avoid a defined_for cycle. Comments warn to "keep the two formulas in sync." Extract a shared _mn_msa_countable_income Person-level helper (sibling to _apply_ssi_exclusions) to enforce single source of truth.

  3. Breakdown enum mismatch. assistance_standard/amount.yaml uses breakdown: [mn_msa_living_arrangement], but the lookup in mn_msa_assistance_standard.py:4036 uses mn_msa_payment_category. Both enums share the MNMSALivingArrangement class so it works, but the breakdown should reference the variable actually used.

  4. Missing test coverage for 10 boundary gaps (highest-value, per gap-analysis):

    • SSI-track auto-eligibility with high resources (no adversarial test exists).
    • Aged boundary at age 65 / age 64.
    • SSI-track couple net-income +/-$1 boundary (per-person vs AU-level disregard regressions undetectable).
    • mn_msa_payment_category Medicaid-facility OR-branch split (federal_arrangement side only).
    • Guardian-fee couple aggregation (all six cases are singles — per-person regression invisible).
    • Couple gross-income test when only one spouse is categorically eligible.
    • Negative income on the non-SSI track (avoiding sign flips).
    • Housing-assistance mirror case with person2 as housing-eligible spouse.
    • Microsim smoke test for MN SPM units (CLAUDE.md: scalar YAML can pass while vectorized microsim fails).
    • Couple where both spouses have zero special needs (share-multiplication branch).
  5. Missing 2025 reference for assistance standards. Parameter file cites 2024 House Research brief and 2026 DHS manual but has no reference corroborating 2025 transition values ($1,028 / $737.33 / $1,541 / $1,030.67 / $128). Add a 2025 DHS Combined Manual issue or DHS COLA bulletin.

  6. guardian_fee/rate.yaml period. Set to year; should be eternity (pure structural rate, not time-keyed).

Suggestions

  1. PNA exposure as standalone parameter. $132 (2026) PNA is folded into the MEDICAID_FACILITY row of assistance_standard/amount.yaml. Downstream GRH deductions, etc., cannot re-use it. Expose as a top-level personal_needs_allowance parameter.

  2. Dynamic DHS URLs without page anchors. cm_001906, cm_002324 URLs are IDC service links that can rotate. Mirror with the static PDF (mndhs-073585.pdf) where the same section exists.

  3. 1-month-absence cancellation rule unmodeled. PDF 2 p5: grant cancels if recipient is absent from MN ≥ 1 calendar month. defined_for = StateCode.MN captures state of residence only.

  4. LTC MA-allocation income deduction unmodeled. PDF 2 p3 describes an income deduction for non-SSI LTC residents whose care is paid by MA — separate from the guardian fee.

  5. Prescribed-diet and restaurant-meals special needs unmodeled. PDF 2 p6 lists these as ongoing special-needs categories alongside guardian/rep-payee/housing.

  6. Asset-limit effective date 1989-01-01 predates § 256P.02 (enacted 2017); use 2017-07-01 or an earlier explicit § 256D.425 date.

  7. "Blind children meeting requirements" not routed to $125 PNA category.

  8. Verify SSI-exclusion helper semantics when fed AU-aggregate inputs (single $20/$65 stack per couple is intended).


PDF Audit Summary

Value Reference Status
2024 community standards: $1,004 / $721 / $1,506 / $1,007 / $125 House Research p6 Match
2026 community standards: $1,055 / $755.33 / $1,582 / $1,058 DHS Manual p4 Match (fractional cents flagged separately)
2026 PNA $132 DHS Manual p6 Match
2026 rep-payee fee $57 DHS Manual p7 Match
SSI FBR cross-check 2026 ($994 / $1,491 / $30) DHS Manual p8 Match
300% / 600% gross-income caps House Research p3 Match
$10,000 non-SSI asset limit House Research p4 Match
Guardian fee 5% × gross, $100 cap Statute Subd. 5(d) + House Research p3 Match
Housing allowance 0.5 × SSI FBR Statute Subd. 5(g)(1) Match
SSI auto-eligibility (no duplication) CM 0029.06.03 Match
Pre-1/1/94 couple standards DHS Manual p4 + House Research p6 Missing from repo
2011 rep-payee fee $25 (none) No corroborating reference
Living-with-others fractional cents Subd. 1 "round up" Conflicts with statute

Validation Summary

Topic Status
Reinvented variables None — mn_msa_payment_category correctly reuses ssi_federal_living_arrangement and is_in_medicaid_facility
Categorical eligibility § 256D.33 (aged/blind/disabled 18+) OK
Asset test (SSI auto-pass + $10k non-SSI) OK
Gross income test (3× / 6× FBR) OK
Net income test (≤ assistance standard) OK
Basic-needs standards (alone tiers) OK
Basic-needs standards ("with others" tiers) Fractional cents conflict with Subd. 1
Pre-1994 grandfathered couple tiers Unmodeled
COLA escalator (Subd. 1) OK for alone tiers
Guardian fee (5% / $100 cap) OK
Rep-payee fee Formula OK; intermediate years missing
Housing assistance amount (0.5 × FBR) OK
Housing-assistance eligibility (Subd. 5(g)) Bare bool input — acknowledged TODO
SSI integration / stacking / FLA-D carve-out OK, carefully designed
Couple AU-level disregard then 50/50 split OK
Living-arrangement default Overstates microsim benefits
Test coverage Strong (110 YAML tests) with 10 boundary gaps
Code quality (parameterized, references, adds, etc.) Strong
Programs.yaml / household_state_benefits / spm_unit_benefits / changelog All wired

Recommended severity: REQUEST_CHANGES

Issues 1 (living-arrangement default), 2 (pre-1994 grandfathered standards), 3 (fractional-dollar standards vs statute), and 4 (rep-payee fee intermediate years + missing 2011 reference) are blocking: each materially changes simulated MSA payments for identifiable subpopulations, and #1 corrupts microsim outputs population-wide. The remaining "Should Address" and "Suggestions" items are not individually blocking but should be tracked for follow-up.

The implementation is otherwise regulatorily sound, statutory citations are accurate, and the test suite is unusually thorough — a focused fix pass on the four critical items would clear the bar.

@hua7450
Copy link
Copy Markdown
Collaborator Author

hua7450 commented May 19, 2026

Thanks @PavelMakarchuk. Pushed C4 fix; pushing back on C1, C2, C3.

C4 — fixed. The flat 2011–2023 values weren't a tracking failure — MN's statutory cap was a flat $25 through 2023, then amended to track SSA's max starting 2024 (2023 Minn. Laws Ch. 70, Art. 10, §22, effective Jan 1, 2024). New values: $25 → $54 (2024) → $55 → $57. Added refs to the amendment, 2022 statute snapshot, and SSA POMS GN 00506.200.

C3 — push back. MN DHS Combined Manual 01/2026 itself publishes "$755.33" on p4. Subd. 1's round-up applies to the COLA increase, not the final standard. Our parameter matches the published source.

C1 — not changing. The right fix for the microsim overstatement is imputation in dataset construction, not a `NONE` default — that would zero out every MN applicant in the household calculator.

C2 — not modeling. Pre-1994 cohort is 32+ years into receipt and not identifiable in CPS. Adding enum variants for an unidentifiable, shrinking cohort isn't worth the complexity.

Will follow up on S5/S6 and other Should-Address items.

@hua7450 hua7450 requested a review from PavelMakarchuk May 19, 2026 18:32
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Program Review — PR #8215: Minnesota Supplemental Aid (MSA)

Author: hua7450
Type: NEW state program (Minnesota DHS — Minnesota Supplemental Aid)
Diff size: 4,255 lines
CI status: All functional checks pass
Posting mode: LOCAL ONLY

Source Documents (7)

  1. Minn. Stat. § 256D.33–.54 (MSA enabling statute) — categorical eligibility, asset limits, two-track structure, COLA mechanics.
  2. Minn. Stat. § 256P.02 (uniform asset standard for cash programs) — non-SSI track resource limits.
  3. 42 CFR § 416.1121 (SSI countable unearned income definitions) — basis for ssi_unearned_income exclusions inherited by MSA.
  4. DHS Combined Manual (CM) sections 0017 (income exclusions), 0023 (special-needs sequencing), and the MSA assistance standards bulletins for CY2024 and CY2026.
  5. Minnesota House Research — MSA Assistance Standards (2024) — published 2024 standard amounts.
  6. DHS Bulletin CM 01/2026 — published 2026 standard amounts.
  7. SSA POMS GN 00602 (representative payee fees) — comparison source for 2024 rep payee fee.

Critical (None)

All three originally flagged "critical" issues were investigated by code-path verifiers and cleared:

  1. CM 0017 substitution double-countssi_unearned_income is sourced from CFR § 416.1121 and excludes SSI by construction (no ssi variable in the sum). The PR's substitution of FBR for SSI amount is correct and does not double-count.
  2. Two-track eligibility gating — Downstream resource gates (receives_ssi | unit_resources <= $10k) combined with the income gates fully implement § 256D.425 Subd. 1; the apparent gap is closed by the composed gates.
  3. 2011 assistance standards mismatch — The audit miscalculated the convention. PR uses standard = FBR + state_portion − $20, with FLA-B = ⅔ × full FBR ("with others" rows). All 2011 cells verify under this convention; the same formula reproduces published 2024 ($1,004) and 2026 ($1,055) values exactly. State portion correctly held at $81 across 2011/2024/2025/2026.

Should Address (12)

  1. 2025 standards — PR body vs. YAML inconsistency.
    The PR description states "2025 values omitted pending DHS verification," but the YAML files contain 2025 entries mathematically derived from FBR(2025) + $81 − $20. Either (a) drop the 2025 entries until DHS publishes a 2025 bulletin, or (b) update the PR body to disclose that 2025 values are model-derived (not officially sourced) and add a YAML comment to that effect.

  2. 2024 representative payee fee: YAML $54 vs. SSA POMS $53.
    parameters/.../representative_payee_fee.yaml shows $54 for 2024; SSA POMS GN 00602 shows the 2024 maximum fee was $53. Spot-check and reconcile — likely a transposition.

  3. Statute citation error in mn_msa_eligible_person.py.
    File header references § 256D.44 Subd. 1 (which addresses COLA mechanics). Categorical eligibility actually flows from § 256D.425 Subd. 1. Update the reference comment and reference: block in the variable.

  4. FLA-D non-SSI bypass: missing general_exclusion=0 override.
    _apply_ssi_exclusions is called for the FLA-D non-SSI path without overriding the $20 general income exclusion to zero. § 256D.425 and CM 0017 indicate the $20 general exclusion should not stack when applying the MSA-only computation; verify and pass general_exclusion=0 (or otherwise gate it) for the non-SSI track to match policy.

  5. Couple supplement special-needs ordering vs. CM 0023.
    CM 0023 prescribes an ordering for special-needs add-ons relative to the couple supplement (special-needs applied per-person before couple consolidation). The current formula appears to add special-needs to the consolidated couple standard. Verify ordering and adjust if needed.

  6. Two DHS Combined Manual URLs use session-bound IDC form.
    Citations of the form IdcService=GET_DYNAMIC_CONVERSION&... resolve only within an active DHS session and break for external readers. Replace with permanent CM section URLs (or PDF anchors) in the reference YAMLs.

  7. Parameter values_list start dates earlier than statutory effective date.

    • non_ssi_track.yaml starts 1989-01-01 but § 256P.02 (uniform asset standard) is effective for MSA in 2015. Restart at 2015-01-01.
    • housing_assistance/fbr_multiplier.yaml starts 1989-01-01 but Subd. 5(g) was added in 2017. Restart at 2017-01-01.
  8. Period metadata gaps.

    • asset_limit/non_ssi_track.yaml should declare period: eternity (or year) explicitly.
    • FBR multiplier parameters should declare period: month (or eternity) to match consumer variables.
  9. Missing test coverage — assistance standards matrix.
    The standards parameter is an arrangement × payment-category matrix (20 cells). Only 13 cells have YAML tests. Add tests for the remaining 7 to lock the matrix end-to-end. Specifically missing:

    • Couple-in-Medicaid-facility scenario (FLA-D + couple).
    • Asymmetric-couple gross-income gating (one spouse over the gate, other under).
    • Year × arrangement combinations for 2011, 2024, 2026.
  10. Statute citation polish on Subd. 3 reference.
    The "Subd. 3" cite is generic; the multi-step derivation (FBR + state portion − general exclusion) is not documented in a single place. Add an explanatory comment in the standards YAML that walks through the convention.

  11. Pre-2024 representative payee fee was rule-based, not flat.
    Pre-2024 SSA rule was "10% of monthly benefit or $25, whichever is less." PR encodes a flat $25 pre-2024 ceiling. This is the binding amount in most cases but is not exactly the rule — add a YAML comment noting the cap-not-formula simplification and the cases where it could diverge.

  12. Verbose code comments.
    Several formula files contain narrative comments duplicating docstrings and reference blocks. Minor polish — tighten to single-line intent comments where the reference: block already documents the rule.


Suggestions (6)

  1. Add a header comment to the standards YAML documenting the standard = FBR + state_portion − $20 convention and the FLA-B ⅔ × FBR "with others" reduction, so future maintainers (and auditors) don't need to reverse-engineer the matrix.
  2. Distinguish mn_msa_living_arrangement vs. mn_msa_payment_category more clearly — currently the two concepts are partially conflated in the codepath. A short rename or enum-level docstring would help.
  3. Add age-boundary tests at 18 / 64 / 65 for categorical eligibility (aged/blind/disabled track switching).
  4. Add explicit CM 0017 substitution tests that set SSI = X and confirm the formula uses FBR (not X) in the substituted slot.
  5. Refactor shared logic between mn_msa_net_income_eligible and mn_msa_person into a single helper. Both currently duplicate the gross→net→standard comparison.
  6. Document the housing assistance "July-1 FBR freeze" convention in the FBR multiplier YAML — the federal FBR adjusts annually but the housing assistance basis uses the July-1 snapshot.

Investigated and Cleared (3)

  1. CM 0017 substitution double-count (originally flagged CRITICAL).
    Audit alleged that substituting FBR into a sum that already excluded SSI would double-count. Verifier confirmed ssi_unearned_income is sourced directly from CFR § 416.1121 and contains no ssi term. The PR's substitution is correct.

  2. Two-track eligibility gating (originally flagged CRITICAL).
    Audit alleged the eligibility predicate failed to enforce § 256D.425 Subd. 1's two-track structure. Verifier traced the predicate through downstream resource and income gates (receives_ssi | unit_resources <= $10k + gross/net income tests) and confirmed full statutory enforcement.

  3. 2011 assistance standards mismatch (originally flagged CRITICAL).
    Audit recomputed 2011 standards under a different convention and reported a $20 delta on all cells. Verifier re-derived using the PR's documented convention (FBR + $81 − $20, FLA-B = ⅔ × full FBR) and confirmed all 2011 cells match. The same convention reproduces published 2024 ($1,004) and 2026 ($1,055) values exactly, validating the convention end-to-end.


PDF Audit Summary

Source Cells audited Confirmed Mismatches Notes
MN House Research 2024 standards 13 13 0 Exact match
DHS CM 01/2026 standards 13 13 0 Exact match
2011 standards (statutory derivation) 13 13 0 Verified via consistent convention
2025 standards 7 0 0 Model-derived; no DHS source published — flagged as "should address" item #1
§ 256D.425 Subd. 1 categorical eligibility 4 predicates 4 0 Confirmed
§ 256D.33–.54 federal inheritance 5 inheritance points 5 0 Confirmed via ssi_unearned_income / CFR § 416.1121
CM 0017 income exclusions 3 substitutions 3 0 Confirmed (FBR substitution correct)
CM 0023 special-needs ordering 1 ordering rule 0 1 Flagged as "should address" item #5
Formula derivation 4 steps 4 0 Confirmed
Integration with federal SSI 3 hookpoints 3 0 Confirmed

Totals: ~30 audit points confirmed, 0 numeric mismatches, 1 ordering question flagged for verification, 7 cells (2025) unsourced and flagged.


Validation Summary

Check Result
Parameter file structure Pass
Variable docstrings & reference blocks Pass (minor polish noted)
Period metadata 2 gaps (should-address #8)
defined_for discipline Pass
Microsim compatibility Pass — vectorization clean
YAML test coverage 13/20 standards cells; gaps noted
Integration tests Present and passing
Federal hooks (SSI, FBR, CFR § 416.1121) Wired correctly
Code style (make format) Clean
Changelog fragment Present
Functional CI All green

Review Severity: APPROVE (with should-fix recommendations)

The implementation is structurally sound, regulatorily accurate, and numerically verified against three published DHS source documents (House Research 2024, CM 01/2026, statutory 2011 derivation). All three issues originally flagged as CRITICAL by audit passes were investigated by code-path verifiers and cleared with explicit reasoning. The 12 should-address items are quality and documentation refinements — none alter the computed benefit for any tested case except item #4 (FLA-D general_exclusion) and item #5 (CM 0023 ordering), both of which should be verified before merge but appear to affect only edge cases not currently in the test matrix.


Next Steps

  1. Author actions (recommended before merge):

    • Resolve should-address #1 (2025 values: drop or disclose).
    • Reconcile should-address #2 ($54 vs. $53 rep payee fee).
    • Verify should-address #4 (FLA-D general exclusion) and #5 (CM 0023 ordering); patch if needed.
    • Fix citation should-address #3 (Subd. 1 vs. Subd. 1 of which section).
    • Replace session-bound DHS URLs (#6).
    • Correct start-date metadata (#7) and period metadata (#8).
  2. Test additions (recommended before merge):

    • 7 missing standards-matrix cells (#9).
    • Couple-in-Medicaid-facility, asymmetric-couple gating.
  3. Documentation polish (post-merge acceptable):

    • Convention header comment (#10, suggestion #1).
    • Pre-2024 rep payee rule note (#11).
    • Code-comment cleanup (#12).
  4. Posting: LOCAL ONLY — no GitHub comments posted. Full report at /tmp/review-program-full-report.md, summary at /tmp/review-program-summary.md.

hua7450 and others added 3 commits May 31, 2026 11:19
Upstream PRs PolicyEngine#8364/PolicyEngine#8365 changed is_ssi_disabled to read the new
canonical input meets_ssi_disability_criteria (default False) instead of
deriving from is_disabled. The two housing-assistance MSA test cases used
non-aged disabled adults set only via is_disabled, so they stopped
qualifying as SSI-disabled and mn_msa_eligible_person dropped to 0.

Add meets_ssi_disability_criteria: true to those persons, matching the
new SSI test convention.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 merged commit f34b8eb into PolicyEngine:main Jun 1, 2026
26 checks passed
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)

3 participants