Skip to content

Exclude county agency staff from Minnesota MSA guardian fees - #10315

Open
MaxGhenis wants to merge 5 commits into
mainfrom
mn-msa-guardian-fee-county-staff
Open

MaxGhenis wants to merge 5 commits into
mainfrom
mn-msa-guardian-fee-county-staff

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Minnesota Supplemental Aid now excludes guardians and conservators who are county agency staff from guardian fee allowances. Nonstaff guardians retain the statutory cap of 5% of assistance-unit gross monthly income, up to $100 per month, under Minn. Stat. § 256D.44, subd. 5(d).

Plan:

  • Add the Person boolean input mn_msa_guardian_is_county_staff, defaulting to false, and exclude county agency staff from guardian/conservator fees.
  • Preserve the statutory 5% of assistance-unit gross monthly income / $100 monthly cap for other guardians. Document DHS's reported $100 practice and Max's 2026-10-19 ruling in a code comment without identifying the official.
  • Add regression cases for staff guardians, nonstaff guardians, the default input, and mixed-person behavior.
  • Run every MN MSA YAML test file in a separate sequential foreground process with the required thread caps; record the counts here.

impact (hub, 2026-10-23): none on the default dataset. mn_msa_has_guardian and mn_msa_guardian_is_county_staff are boolean inputs that default to false, and the certified Populace file stores neither: the hub checked its 377 stored columns. So every record keeps the defaults, and no MSA amount changes. A household that supplies a guardian sees the change; the regression cases cover it.

axiom: TheAxiomFoundation/rulespec-us#1859 queued. Statutory guardian-fee module requires a compatible corpus re-pin and signed encoder dispatch.

Validation:

  • make format passed (Ruff formatting and lint).
  • MN MSA: 119 cases passed across 15/15 successful YAML files, including all 9 guardian-fee cases.
  • Each file ran in a separate sequential foreground process using PYTHONPATH=$PWD python -m policyengine_core.scripts.policyengine_command test <file> -c policyengine_us, with all required thread caps set to 4 and OMP_WAIT_POLICY=PASSIVE.

@MaxGhenis
MaxGhenis marked this pull request as ready for review October 21, 2026 02:32
@codecov

codecov Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (d3fb780).
⚠️ Report is 577 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10315   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         2    -2     
  Lines           76        26   -50     
  Branches         2         0    -2     
=========================================
- Hits            76        26   -50     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

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

☔ View full report in Codecov by Harness.
📢 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.

@MaxGhenis MaxGhenis closed this Oct 21, 2026
@MaxGhenis MaxGhenis reopened this Oct 21, 2026
@MaxGhenis MaxGhenis closed this Oct 21, 2026
@MaxGhenis MaxGhenis reopened this Oct 21, 2026
MaxGhenis and others added 3 commits October 21, 2026 12:07
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Exclude county agency staff from Minnesota MSA guardian fees

PR #10315 (author: MaxGhenis, head d3fb780298, merge-base f45d36a7d1). 6 files (+84/−3), 5 commits (one is a merge of main).

Summary

The PR adds the Person input mn_msa_guardian_is_county_staff (bool, default False, MONTH, defined_for = StateCode.MN). mn_msa_guardian_fee now returns has_guardian * ~guardian_is_county_staff * min(5% × marital-unit gross, $100). The other changes:

  • A code comment records that DHS reports a flat $100 in practice, and that PolicyEngine follows the statute.
  • The source-conflict candidate us-mn:msa-guardian-fee-cap now points at the code and this PR.
  • The ratchet baseline counts the new "in practice" comment.
  • Three new YAML cases (staff below the cap, staff above the cap, and a mixed staff/nonstaff couple). Cases 1–3 now set the flag explicitly, and Case 5 checks that it defaults to false.

The change matches the law:

  • The exclusion. Minn. Stat. § 256D.44, subd. 5(d) says: "If the guardian or conservator is a member of the county agency staff, no fee is allowed." CM 0023.15 says the same thing.
  • The cap. The 5% / $100 cap for other guardians is unchanged.
  • Dates. The sentence has been in the statute for decades, so leaving the rule ungated by date is right.
  • Effect on existing results. The default is False, so every existing result is unchanged, and the change has no effect in microsimulation.
  • Axiom. The line is valid: rulespec-us#1859 is open, labelled pe-parity, dispatch-ready, matches the head and records its blocker.
  • CI and branch. All 29 checks pass, and the branch merges cleanly with main.

No critical or should-fix items. Three suggestions:

  • A pre-existing simplification: the model pays the cap, not the negotiated or court-approved fee.
  • Reference and documentation polish on the new input.
  • Drop "WIP:" from the PR body.

Critical (must fix)

None.

Should address

None.

Suggestions

1. Pre-existing: the allowance is the statutory cap, not the negotiated or court-approved fee.

  • Where. mn_msa_guardian_fee.py:31-33 returns min_(unit_gross * p.rate, p.max_amount) for every nonstaff guardian.
  • The law.
    • Minn. Stat. § 256D.44, subd. 5(d): "A fee for guardian or conservator service is allowed at a reasonable rate negotiated by the county or approved by the court. This rate shall not exceed five percent of the assistance unit's gross monthly income up to a maximum of $100 per month."
    • CM 0023.15: "Use the fee amount negotiated by the county agency or approved by the court."
  • Effect. The allowance is the authorized fee, limited by the cap. With $1,000 monthly gross and a $30 approved fee, the law gives $30 and PolicyEngine gives $50. rulespec-us#1859 encodes the authorized amount, so the two will diverge whenever the approved fee is below the cap. Its companion tests avoid that by setting the authorized fee equal to the cap.
  • Scope. This PR didn't introduce this, and nothing in the PR claims otherwise.
  • Fix (optional, could be a follow-up). Add an input for the negotiated or court-approved monthly fee and return min_(authorized_fee, cap). Or at least say in the variable's documentation that the allowance assumes the approved fee equals the cap.

2. Reference and documentation polish on the new input.

  • Where. mn_msa_guardian_is_county_staff.py:11 cites only § 256D.44 subd. 5.
  • Add CM 0023.15 as a second reference. It is the county-facing rule ("Do not allow for a fee if the guardian or conservator is a county agency employee"), and mn_msa_guardian_fee.py already cites it.
  • Consider a one-line note on public guardianship. The flag is user input, so a note would help users classify one common case. Under Minn. Stat. § 252A.111, subd. 5, the commissioner of human services, acting as public guardian, "may carry out the powers and duties prescribed by this chapter directly or through local agencies." When county social services staff act for the commissioner, users need to know whether to set the flag. This is documentation only; the formula is fine as written.

3. Drop "WIP:" from the PR body.

The PR is marked ready for review and every plan item is checked, but the body still opens with "WIP:".

Verified correct

  • The statute.
    • The 2025 edition of § 256D.44, subd. 5(d) has all three sentences: a reasonable rate, negotiated or court-approved; a cap of "five percent of the assistance unit's gross monthly income up to a maximum of $100 per month"; and "If the guardian or conservator is a member of the county agency staff, no fee is allowed."
    • The 2004 edition has the same paragraph, word for word, as subd. 5(c). Its history runs back to 1989 c 282 art 5 s 103.
    • The guardian-fee parameters start 1989-01-01, so the exclusion has applied in every year the model covers, and an ungated formula is right.
  • CM 0023.15. It allows the fee only for clients outside a nursing home, regional treatment center or housing-support setting. It uses the negotiated or court-approved amount, caps it at 5% of the unit's income up to $100, and says not to allow a fee when the guardian or conservator is a county agency employee.
  • Code.
    • The new input follows mn_msa_has_guardian: Person, MONTH, defined_for = StateCode.MN. It sits in the same folder and its reference is anchored to subd. 5.
    • has_guardian * ~guardian_is_county_staff * unit_fee is vectorized. ~ is a logical not on the bool array, and Case 9 shows the flag affects only its own person.
    • Every other caller is unchanged because none sets the flag and the default is False: integration.yaml (fee $100), premium_input_contract.yaml ($97.50 = 5% × $1,950 and $79.70 = 5% × $1,594) and mn_msa_special_needs_total.yaml (3 cases).
  • Batch lessons.
  • Source-conflict ratchet.
    • mn_msa_guardian_fee.py has exactly one comment line that matches the ratchet's in practice pattern ("guardian fees are $100 in practice regardless of income"). The neighbouring lines ("follows the statute's 5%/$100 cap", "allows no fee for county agency staff") don't match. That agrees with the new KNOWN_UNMARKED count of 1.
    • Adding a baseline entry next to a candidates.yaml entry is the same pattern Take the 2020 charitable deduction for non-itemizers above the line #10186 used on main for charitable_contributions/cap.yaml.
    • The candidate us-mn:msa-guardian-fee-cap was already on main with empty code/prs. It now lists a tracked file and an https PR link, and its id is still absent from the vendored register, which main hasn't changed since the merge-base.
    • The comment describes the agency practice without quoting the correspondence or naming anyone, as the candidate's note asks.
    • In the merged tree, KNOWN_UNMARKED has both main's new charitable-cap entry and this PR's entry, and the candidate ids stay unique.
  • Changelog. The top-level changelog.d/mn-msa-guardian-fee-county-staff.fixed.md is present, and fixed is the right type.
  • Partner tests. No file under tests/policy/baseline/partners/** changes.

Hand-checks (13 expectations, all 2026-01). The 2026 SSI FBR is $994 for an individual and $1,491 for a couple. Where ssi isn't entered (Cases 1, 2, 4, 5 and 6), countable unearned income is more than the FBR, so SSI = 0 and CM 0017's FBR substitution doesn't apply.

Case Monthly unit gross Guardian; staff Hand computation Expected OK
1 24,000/12 = 2,000 (SSI 0: 1,980 > 994) yes; false min(100, 100) 100 ✓
2 36,000/12 = 3,000 yes; false min(150, 100) 100 ✓
3 12,000/12 = 1,000 (ssi: 0, no FBR substitution) yes; false min(50, 100) 50 ✓
4 2,000 no; default no guardian 0 ✓
5 23,988/12 = 1,999 (SSI 0: 1,979 > 994) yes; default min(99.95, 100) 99.95 ✓
5 — — default of the new input false ✓
6 24,012/12 = 2,001 yes; default min(100.05, 100) 100 ✓
7 1,000 (ssi: 0) yes; true staff excluded (would be 50) 0 ✓
8 3,000 (ssi: 0) yes; true staff excluded (would be 100) 0 ✓
9 (staff) 1,500 + 1,500 = 3,000 (couple: 2,980 > 1,491) yes; true staff excluded 0 ✓
9 (nonstaff) 3,000 yes; false min(150, 100) 100 ✓
premium contract 1,950 yes; default 5% × 1,950 97.50 (unchanged) ✓
premium contract 1,594 yes; default 5% × 1,594 79.70 (unchanged) ✓

Cases 7 and 8 really test the flag: without it they would return $50 and $100. Case 9 also shows that the flag doesn't change the other person's result.

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1859 queued is valid. #1859:

  • Status. It is OPEN, labelled pe-parity, and was updated 2026-10-22, after the head commit. It names head d3fb780298.
  • Dispatch-ready.
    • It gives a proposed module path (us-mn/statutes/256d/44/block-11.yaml, to be confirmed by the encoder mapper) and the corpus citation us-mn/statute/256d/44/block-11 with its row UUID.
    • It quotes the law verbatim: the subd. 5(d) staff sentence, the 5% / $100 cap from 2025 c 38 art 7 s 10(d), CM 0023.15 and § 256D.35 subd. 3a.
    • It lists the required outputs and invariants.
    • Its companion table matches all nine cases at the head, including which cases leave the flag at its default. It adds a $30 authorized-fee legal control.
  • Blocker recorded. rulespec-us pins a corpus release whose Minnesota statute scope lacks the provision. It needs a compatible re-pin to the September union release, which already ingests it, and then a signed encoder dispatch.
  • No over-claim. It correctly says "Encode the law, not the PE-US value" for the authorized-fee point (Suggestion 1).

CI status

  • Result. All 29 checks pass at the head (gh pr checks 10315, re-checked at the end of this review).
  • Timing. The runs started 2026-10-21 16:41 UTC, after the FL/SD LIHEAP ratchet fix landed on main, and the PR's base already includes the source-conflict guard (Tie source-conflict markers to the register shared with Axiom #10287). PR validation (lock, guard tests, lint, changelog) therefore exercised the ratchet with this PR's baseline entry.
  • The rest. All Baseline shards (including states-shard-1 to 4), the Contrib shards, Microsimulation, both Rest (Python) jobs, Quick Feedback, Package and compatibility, Household API Partners and codecov pass.
  • Local runs. None. CI is green, so I relied on it and on the hand-checks above.

Branch status

Verdict: APPROVE

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The exclusion matches Minn. Stat. 256D.44 subd. 5(d) (no fee when the guardian is county agency staff, unchanged since 1989) and CM 0023.15. The new input defaults off and is vectorized, all 13 expectations hand-check, and the axiom issue is valid. Three suggestions, including the pre-existing cap-vs-approved-fee assumption. Full report in the comment above.

This branch has not been deployed

No deployments
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.

2 participants