Add Minnesota Supplemental Aid (MSA)#8215
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 97.76% 97.90% +0.13%
==========================================
Files 16 17 +1
Lines 269 287 +18
Branches 2 2
==========================================
+ Hits 263 281 +18
Misses 6 6
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>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
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)
-
Living-arrangement default overstates simulated benefits.
mn_msa_living_arrangementandmn_msa_payment_categorydefault toINDIVIDUAL_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: changedefault_valuetoNONE(yields 0 standard) so users opt in. -
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
MNMSALivingArrangementenum 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. -
"Living with others" standards use fractional dollars in violation of Subd. 1 "round up to nearest dollar."
INDIVIDUAL_LIVING_WITH_OTHERS2025/2026 = 737.33 / 755.33 andCOUPLE_LIVING_WITH_OTHERS2025 = 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. -
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
-
TODO block in production code.
mn_msa_housing_assistance_eligible.pyis 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. -
Duplicated countable-income logic.
mn_msa_person.py:32–123andmn_msa_net_income_eligible.py:31–105duplicate ~80 lines of countable-income arithmetic to avoid adefined_forcycle. Comments warn to "keep the two formulas in sync." Extract a shared_mn_msa_countable_incomePerson-level helper (sibling to_apply_ssi_exclusions) to enforce single source of truth. -
Breakdown enum mismatch.
assistance_standard/amount.yamlusesbreakdown: [mn_msa_living_arrangement], but the lookup inmn_msa_assistance_standard.py:4036usesmn_msa_payment_category. Both enums share theMNMSALivingArrangementclass so it works, but the breakdown should reference the variable actually used. -
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_categoryMedicaid-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
person2as 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).
-
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.
-
guardian_fee/rate.yamlperiod. Set toyear; should beeternity(pure structural rate, not time-keyed).
Suggestions
-
PNA exposure as standalone parameter. $132 (2026) PNA is folded into the
MEDICAID_FACILITYrow ofassistance_standard/amount.yaml. Downstream GRH deductions, etc., cannot re-use it. Expose as a top-levelpersonal_needs_allowanceparameter. -
Dynamic DHS URLs without page anchors.
cm_001906,cm_002324URLs are IDC service links that can rotate. Mirror with the static PDF (mndhs-073585.pdf) where the same section exists. -
1-month-absence cancellation rule unmodeled. PDF 2 p5: grant cancels if recipient is absent from MN ≥ 1 calendar month.
defined_for = StateCode.MNcaptures state of residence only. -
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.
-
Prescribed-diet and restaurant-meals special needs unmodeled. PDF 2 p6 lists these as ongoing special-needs categories alongside guardian/rep-payee/housing.
-
Asset-limit effective date
1989-01-01predates § 256P.02 (enacted 2017); use 2017-07-01 or an earlier explicit § 256D.425 date. -
"Blind children meeting requirements" not routed to $125 PNA category.
-
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.
Merge branch 'main' of https://github.com/PolicyEngine/policyengine-us into mn-msa
|
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. |
PavelMakarchuk
left a comment
There was a problem hiding this comment.
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)
- Minn. Stat. § 256D.33–.54 (MSA enabling statute) — categorical eligibility, asset limits, two-track structure, COLA mechanics.
- Minn. Stat. § 256P.02 (uniform asset standard for cash programs) — non-SSI track resource limits.
- 42 CFR § 416.1121 (SSI countable unearned income definitions) — basis for
ssi_unearned_incomeexclusions inherited by MSA. - DHS Combined Manual (CM) sections 0017 (income exclusions), 0023 (special-needs sequencing), and the MSA assistance standards bulletins for CY2024 and CY2026.
- Minnesota House Research — MSA Assistance Standards (2024) — published 2024 standard amounts.
- DHS Bulletin CM 01/2026 — published 2026 standard amounts.
- 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:
- CM 0017 substitution double-count —
ssi_unearned_incomeis sourced from CFR § 416.1121 and excludes SSI by construction (nossivariable in the sum). The PR's substitution of FBR for SSI amount is correct and does not double-count. - 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. - 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)
-
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 fromFBR(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. -
2024 representative payee fee: YAML $54 vs. SSA POMS $53.
parameters/.../representative_payee_fee.yamlshows $54 for 2024; SSA POMS GN 00602 shows the 2024 maximum fee was $53. Spot-check and reconcile — likely a transposition. -
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 andreference:block in the variable. -
FLA-D non-SSI bypass: missing
general_exclusion=0override.
_apply_ssi_exclusionsis 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 passgeneral_exclusion=0(or otherwise gate it) for the non-SSI track to match policy. -
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. -
Two DHS Combined Manual URLs use session-bound IDC form.
Citations of the formIdcService=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. -
Parameter
values_liststart dates earlier than statutory effective date.non_ssi_track.yamlstarts 1989-01-01 but § 256P.02 (uniform asset standard) is effective for MSA in 2015. Restart at 2015-01-01.housing_assistance/fbr_multiplier.yamlstarts 1989-01-01 but Subd. 5(g) was added in 2017. Restart at 2017-01-01.
-
Period metadata gaps.
asset_limit/non_ssi_track.yamlshould declareperiod: eternity(oryear) explicitly.- FBR multiplier parameters should declare
period: month(oreternity) to match consumer variables.
-
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.
-
Statute citation polish on
Subd. 3reference.
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. -
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. -
Verbose code comments.
Several formula files contain narrative comments duplicating docstrings and reference blocks. Minor polish — tighten to single-line intent comments where thereference:block already documents the rule.
Suggestions (6)
- Add a header comment to the standards YAML documenting the
standard = FBR + state_portion − $20convention and the FLA-B⅔ × FBR"with others" reduction, so future maintainers (and auditors) don't need to reverse-engineer the matrix. - Distinguish
mn_msa_living_arrangementvs.mn_msa_payment_categorymore clearly — currently the two concepts are partially conflated in the codepath. A short rename or enum-level docstring would help. - Add age-boundary tests at 18 / 64 / 65 for categorical eligibility (aged/blind/disabled track switching).
- Add explicit CM 0017 substitution tests that set SSI = X and confirm the formula uses FBR (not X) in the substituted slot.
- Refactor shared logic between
mn_msa_net_income_eligibleandmn_msa_personinto a single helper. Both currently duplicate the gross→net→standard comparison. - 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)
-
CM 0017 substitution double-count (originally flagged CRITICAL).
Audit alleged that substituting FBR into a sum that already excluded SSI would double-count. Verifier confirmedssi_unearned_incomeis sourced directly from CFR § 416.1121 and contains nossiterm. The PR's substitution is correct. -
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. -
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
-
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).
-
Test additions (recommended before merge):
- 7 missing standards-matrix cells (#9).
- Couple-in-Medicaid-facility, asymmetric-couple gating.
-
Documentation polish (post-merge acceptable):
-
Posting: LOCAL ONLY — no GitHub comments posted. Full report at
/tmp/review-program-full-report.md, summary at/tmp/review-program-summary.md.
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>
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