Skip to content

Medicaid ABD pathway: individual or couple unit nationwide, Missouri dollar standards and deeming order - #9379

Merged
hua7450 merged 8 commits into
PolicyEngine:mainfrom
hua7450:mo-medicaid-sga-mhdc
Sep 8, 2026
Merged

hua7450 merged 8 commits into
PolicyEngine:mainfrom
hua7450:mo-medicaid-sga-mhdc

Conversation

@hua7450

@hua7450 hua7450 commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Summary

Two Missouri MHABD fixes raised by MyFriendBen, generalized where the underlying rule is federal, plus regression tests for the MHDC parental-deeming behavior they questioned.

Related: #9316 (resolved without a code change; see section 3).

1. The aged, blind, and disabled unit is the individual or married couple, not the tax unit

Non-MAGI Medicaid follows the SSI financial-responsibility rules (42 CFR 435.602): income and resources count from the person and a spouse living with them (and from a parent for a child, handled by the deeming variables). Filing status never enters. The model used the tax unit as a proxy, which failed two ways: a married couple filing separately compared half its income against the couple standard, and any tax unit with more than one eligible member (two disabled siblings, a disabled parent and disabled child) was overcounted. It also sized the limit by the whole tax unit, so a disabled child in a four-person Florida tax unit got a 2026 limit of $29,040 instead of the individual $14,044.80.

  • medicaid_optional_senior_or_disabled_income_limit: the individual or couple percentage on the one- or two-person poverty guideline, keyed on marital_unit.nb_persons() == 2 instead of tax_unit_is_joint and tax_unit_fpg.
  • is_optional_senior_or_disabled_income_eligible, is_209b_ssi_recipient_income_eligible_for_medicaid, is_optional_senior_or_disabled_asset_eligible: sum countable income, spenddown income, and resources across the marital unit.
  • Missouri publishes its standards as monthly dollar amounts (Appendix J: $1,131 / $1,533 aged or disabled, $1,330 / $1,804 blind in 2026), each the percentage of the monthly guideline rounded up to the next dollar (§ 0805.015.45 "single individuals and married couples"; § 0805.015.05 budgets a couple living together jointly). Missouri keeps that rounding; other states keep percentage × guideline. Missouri adopts each year's guideline on April 1; the model applies it from January because gov.hhs.fpg is dated January 1, so a 2026 test period already resolves to the April 2026 amounts.
  • Tests: multi-person cases declare marital_units (the YAML runner otherwise puts everyone in one default marital unit); Florida and Illinois cases that injected tax_unit_fpg: 15_000 / 20_000 are recomputed from the real guidelines ($15,650 one person, $21,150 couple in 2025; $15,960 in 2026); new Florida and Missouri cases cover a couple filing separately, unmarried adults sharing a tax unit, a disabled child in a family of four, a Missouri couple each under the individual standard but over the couple standard combined (income, 209(b) spenddown, and resources), spenddown on one spouse's medical expenses, and a blind Missouri couple spending down to the 100% FPL couple standard.

2. MHDC parental deeming: exclusion order and tests

MyFriendBen reported that stepparent and two-disabled-child households returned the children ineligible. Reproduced locally: with meets_ssi_disability_criteria set on the child, the model already deems only from adults flagged as parents (so a stepparent is not a deeming source, matching § 0805.020.15) and splits deemed income equally between applying disabled children. The reported ineligibility comes from sending is_disabled alone, which no longer feeds SSI disability.

The deeming variable applied Missouri's applicant budget order ($65 and half, then $20). § 0805.020.15 steps 4–6 and Example 2 take the $20 off earnings before the $65 and the half, the SSI order, so Missouri deeming now routes through _apply_ssi_exclusions. Two Missouri cases lock in the stepparent exclusion and the equal split ($11,562 for one parent at $4,000/month; $9,549 each for two children at $6,250/month); the manual shows no rounding at that step. The per-child split now accumulates in a float array (it previously truncated to integers). Stepparent exclusion is only as accurate as is_parent, which derives from own_children_in_household.

3. No SGA screen on the 209(b) SSI-recipient pathway (issue #9316)

Earlier drafts of this PR added a Missouri and New Hampshire earnings screen to is_209b_ssi_recipient_for_medicaid. It is withdrawn. Computed SSI already fails is_ssi_disabled above SGA, so the screen could only ever fire on a receives_ssi or ssi input that contradicts the wages. Once asserted SSI receipt is honored, the only way it is true above SGA is section 1619 status, and both screening states keep those people covered (Missouri § 0850.005.00; New Hampshire evaluates 1619 status before MEAD). The reported household ($56,220 in wages with asserted SSI) exceeds even Missouri's 2026 1619(b) threshold of $55,181 (POMS SI 02302.200), so it is an inconsistent input rather than a modeling gap. The survey of the other 209(b) states (CT, HI, IL, MN, ND, VA accept an SSA disability finding with no earnings screen; MO and NH screen at application) is recorded on the issue.

Test plan

  • CI passes (medicaid_optional_senior_or_disabled_income_limit, is_optional_senior_or_disabled_income_eligible, is_optional_senior_or_disabled_asset_eligible, is_209b_ssi_recipient_income_eligible_for_medicaid, medicaid_category, is_ssi_recipient_for_medicaid, parental deeming)
  • Household API partner tests unchanged

🤖 Generated with Claude Code

@codecov

codecov Bot commented Sep 3, 2026

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9379   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            3         5    +2     
  Lines           33        98   +65     
=========================================
+ Hits            33        98   +65     
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.

hua7450 and others added 2 commits September 4, 2026 21:41
Deny the 209(b) SSI-recipient Medicaid pathway to non-blind, non-aged
earners above the substantial gainful activity threshold per Missouri
DSS MHABD Manual 0840.010.35, behind a state-level applies_sga_screen
parameter (Missouri only). Test the Missouri Appendix J standard against
the one-person or couple poverty guideline instead of the tax unit's,
so a disabled child in a family faces the individual standard. Add
Missouri parental-deeming cases covering the stepparent exclusion and
the equal split between two disabled children.

Fixes PolicyEngine#9316

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tandard on marriage

Review fixes for PolicyEngine#9379: the 209(b) SGA exclusion now applies only once
countable income exhausts the SSI benefit rate, so a continuing recipient
who still draws SSI cash above SGA keeps MHABD (42 CFR 435.121(b)(3),
DSS MHABD Manual § 0850.005.00); and the Appendix J couple standard is
identified by marital unit rather than joint filing (§ 0805.015.45).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 force-pushed the mo-medicaid-sga-mhdc branch from 3bb61a1 to 88707be Compare September 5, 2026 01:41
@hua7450
hua7450 marked this pull request as ready for review September 5, 2026 01:43
hua7450 and others added 4 commits September 4, 2026 22:38
ssi_countable_income is zero for anyone the model does not find SSI
eligible, so the guard never fired for asserted recipients above SGA.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…eeming for Missouri MHABD

The 1619(a) guard subtracts the student earned income exclusion; Missouri
sums a married couple's countable income across the marital unit in the
income and spenddown tests; parental deeming takes the $20 exclusion off
before the $65 and the half (DSS Manual 0805.020.15 steps 4-6).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…(b) states as checked

NH MAM Part 209 denies APTD medical assistance to applicants with
adjusted earned income over SGA with no SSI-recipient exception. CT, HI,
IL, MN, ND and VA accept SSA's disability finding with no earnings
screen. MO's lead citation moves to 1973 Manual 1060.005.00, which
requires an MRT decision when earned income exceeds SGA.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…hdraw the SGA screen

Non-MAGI Medicaid follows SSI financial responsibility rules (42 CFR
435.602), so the income limit, income and spenddown sums, and the asset
test key on the marital unit in every state instead of the tax unit.
The 209(b) SGA screen is withdrawn: asserted SSI receipt above SGA can
only be section 1619 status, which Missouri and New Hampshire keep
covered, so the screen could only fire on inconsistent inputs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450 hua7450 changed the title Missouri MHABD: SGA screen on the 209(b) pathway and individual/couple income standard Medicaid ABD pathway: individual or couple unit nationwide, Missouri dollar standards and deeming order Sep 6, 2026
@hua7450
hua7450 requested a review from DTrim99 September 8, 2026 15:25
@DTrim99

DTrim99 commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #9379 (Medicaid ABD individual/couple unit + MO dollar standards + deeming)

Scope (federal ABD pathway nationwide unit change + MO MHABD standards; 42 CFR 435.602/.121, 42 USC 1396a(m); MHABD Appendix J)

Substantive non-MAGI aged/blind/disabled (ABD) Medicaid PR reviewed at head a9ebbd83041cbb9575dd75a2dbb9a1266ef45fab. Three changes:

  1. Nationwide unit change — the four ABD eligibility variables (income limit, income eligibility, asset eligibility, 209(b) spenddown) switch the assessment unit from tax_unit to the person's marital unit (individual = 1 person, couple = 2).
  2. MO dollar standards — MHABD income limits computed as ceil(limit_pct × monthly FPG), verified against the MO DSS MHABD Manual Appendix J (eff 2026-04-01).
  3. Deeming order — parental deemed income from an ineligible parent routed through the SSI-style exclusion order ($20 general → $65 earned → 50% earned disregard), split equally across disabled children; the 209(b) SGA screen is removed.

Regulatory verdicts

  • Unit definition (nationwide) — CORRECT. Per 42 CFR 435.602: for ABD the financial unit is the individual or individual+spouse (the marital unit); other relatives (dependents, adult children, unmarried co-filers) must not be summed in. The old tax_unit behavior was over-inclusive (summed a dependent/co-filer's income) and under-inclusive for married-filing-separately (split spouses who should be combined); both are corrected. marital_unit.nb_persons() is 1 or 2 and never includes children, so is_couple = nb_persons()==2 is the right couple test and a disabled child is correctly a 1-person unit (parental income reaches the child only via the separate deeming variable, per 435.602's parent-to-child rule). Common cases (single filer; MFJ couple) are unchanged. The one external consumer, MS Healthier-MS-Waiver (ms_hmw_income_eligible.py), already aggregates on marital_unit, so it is unaffected. No nationwide regulatory error — not CRITICAL.
  • MO Appendix J dollar standards — CONFIRMED. Live MO DSS MHABD Appendix J (rev 07/2026), Spend Down block eff 04-01-2026, publishes exactly: 1 person aged/disabled $1,131 = ceil(0.85 × 15,960/12); 2 person aged/disabled $1,533 = ceil(0.85 × 21,640/12); 1 person blind $1,330 = ceil(1.00 × 15,960/12); 2 person blind $1,804 = ceil(1.00 × 21,640/12). FPG bases (CONTIGUOUS_US 2026: 15,960 / 21,640), percentages (85% aged-disabled, 100% blind), and the fpg() 2-person construction all reconcile. Secondary SSI FBR cross-checks ($994 / $1,491) also match. No value mismatch — not CRITICAL.
  • Deeming order — CORRECT. Per 20 CFR 416.1165 → 416.1124/416.1112: ineligible-child allocations deducted before the SSI exclusions, parents' living allowance (FBR) after; equal split across disabled children is standard SSI treatment. Both regression tests reproduce to the cent (Case 2 stepparent-excluded = 11,562; Case 3 two-child split = 9,549 each). Stepparent exclusion works via is_ssi_ineligible_parent gated on is_parent. SGA-screen withdrawal is a clean deletion with no dangling references.

Critical (Must Fix)

None.

Should Address

  1. Mid-year effective date vs 2026 test resolution. medicaid_optional_senior_or_disabled_income_limit.yaml (and the new is_* / deeming tests) use period: 2026, which resolves parameter lookups at 2026-01-01, while the MO MHABD Appendix J standards the comments cite are effective 2026-04-01. Confirm gov.states.mo.dss.mhabd.income_limit (and the 2026 FPG bases) carry a 2026-01-01-or-earlier entry with these values; otherwise a 2026 test reads pre-April values and the comment arithmetic (ceil(0.85 × 15,960/12) = 1,131) will not match what the engine resolves. (Per Mode B period rules, mid-year effective dates are normally tested at the first January after the effective date, i.e. 2027.) Regulatory review independently confirmed the 2026 Appendix J values reproduce from the formula, so this is a param-date/test-period alignment check rather than a value error. (medicaid_optional_senior_or_disabled_income_limit.yaml; new is_*/deeming test files.)
  2. MO couple income-eligibility / 209(b) tests do not isolate the marital-unit sum. In the is_optional_senior_or_disabled_income_eligible MO separate-filers case and 209(b) Case 6, each spouse's 14,880 already exceeds the 13,572 individual standard, so the case reads [false, false] under either old tax-unit or new marital-unit logic — it does not on its own prove the couple sum. Only the unmarried-in-same-tax-unit negative control and (for the limit variable) the FL couple boundary truly isolate the change. Add one MO couple case with each spouse under the individual standard but combined over the couple standard (~9,300 each vs 18,396 → [false, false], vs [true, true] if tested per person), giving these two variables the same discriminating boundary the limit variable gets from Florida. (is_optional_senior_or_disabled_income_eligible.yaml; is_209b_ssi_recipient_income_eligible_for_medicaid.yaml Case 6.)
  3. No couple asset-eligibility boundary that distinguishes couple vs individual limit. is_optional_senior_or_disabled_asset_eligible.yaml gained marital_units blocks for its couple cases, but the two people hold equal resources and no case has the couple limit flip the result relative to the individual limit. Add one couple case straddling the couple asset limit (both under the individual limit individually, combined over the couple limit, or vice-versa) so the is_couple branch and p.assets.limit.couple[state] selection are pinned, mirroring the income-limit tests. (is_optional_senior_or_disabled_asset_eligible.yaml; is_optional_senior_or_disabled_asset_eligible.py:14-19.)

Suggestions

  1. Deeming split integer dtype (pre-existing, outside diff). In medicaid_optional_senior_or_disabled_unearned_income_deemed_from_ineligible_parent.py (final block), income = np.zeros_like(count_eligible_children) uses an integer array (sum of booleans); assigning net[mask] / count[mask] (float) truncates the fraction. Current tests pass only because splits are whole numbers (Case 3: 19,098/2 = 9,549). Consider dtype=float. Not blocking — pre-existing, not a changed line.
  2. Add a single-child (count == 1) MO deeming case under the new SSI-order path, alongside the two-child split (Case 3). The pre-existing CT single-child case uses the non-MO path. This pins the count == 1 branch with no division artifact and documents the one- vs two-parent allowance difference explicitly.
  3. Blind-couple 209(b) case. 209(b) tests cover a blind-vs-non-blind single applicant (Cases 4/5) and a non-blind couple (Case 6). A blind MO couple spenddown case would cross the per-person blind-override logic with the couple marital unit in the 209(b) variable specifically (that intersection is currently tested only in the limit variable).
  4. medicaid_category.yaml couple/marital-unit case. The category test only updated IL single-person spenddown numbers; add one couple case exercising the new unit end-to-end through category selection for an integration-level assertion. Low priority — sub-variables are covered.
  5. Stepparent exclusion depends on own_children_in_household. The "deems only a natural/adoptive parent, never a stepparent" claim is enforced only via is_parent = own_children_in_household > 0 (pre-existing model definition). Worth a one-line PR/issue note that stepparent exclusion is only as accurate as that variable's stepchild handling.
  6. 209(b) per-person limit vs marital-unit income. Correct today, but broadcasting marital-unit income against a per-person limit that can differ by blindness within a couple is subtle; a short inline comment on the shared-income / per-person-standard design would help future readers. (is_209b_ssi_recipient_income_eligible_for_medicaid.py:31-41.)
  7. Test-comment label (cosmetic). Deeming test comments call the $994/$1,491 living allowance the "one-/two-parent allowance" and cite Appendix J SSI rows; the code pulls the federal SSI FBR (gov.ssa.ssi.amount). Values coincide (MO republishes the federal FBR), so this is a labeling nuance, not a value error.

Validation Summary

  • Regulatory: PASS. Unit definition correct (42 CFR 435.602); MO Appendix J standards CONFIRMED against the live source (eff 2026-04-01); deeming order correct (20 CFR 416.1165/.1124/.1112); 209(b)/435.121 spenddown consistent; SGA-screen removal clean; no reinvented variables (reuses fpg() and _apply_ssi_exclusions).
  • Code: PASS. 0 CRITICAL. Entity levels align (marital-unit throughout); no hard-coded values; safe divide-by-zero guard on the split; vectorization-safe where(state=="MO", …); changelog fragment present (mo-medicaid-sga-mhdc.fixed.md); references well-formed.
  • Tests: PASS. No zero-coverage of any changed branch; boolean outputs use exact margins (no absolute_error_margin ≥ 1 masking); 2025 vs 2026 values distinct and period-correct. Gaps are isolation-test additions (SHOULD Run black formatting on docs #2, Implement SNAP rules at the national level #3), not coverage holes.
  • CI: Not run in this read-only review; verify green before merge.

Branch Status

⚠ 3 commits behind main; scoped to PR changes (5 variable .py + 7 test .yaml + 1 changelog fragment). Rebase on upstream/main before merge.

Review Severity: APPROVE

No CRITICAL findings. The two CRITICAL-eligible risks (nationwide unit-definition error; MO dollar-standard value mismatch) both resolve in the PR's favor — unit definition is correct per 42 CFR 435.602 and the MO Appendix J standards are CONFIRMED against the live source. The three SHOULD ADDRESS items are a param-date/test-period alignment check and two isolation-test additions; none block. Recommend addressing SHOULD #1 (or confirming the param date) and adding the isolation tests as a fast follow.

🤖 /review-program

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

No critical issues — the substantive core all checks out: the nationwide tax_unit→marital_unit switch is correct per 42 CFR 435.602 (individual = 1 person / couple = 2, excludes dependents/co-filers, combines MFS spouses); the MO MHABD dollar standards are CONFIRMED against the live Appendix J (eff 2026-04-01: $1,131/$1,533 aged-disabled, $1,330/$1,804 blind); and the ineligible-parent deeming order is correct (20 CFR 416.1165/.1124/.1112, $20→$65→50%, equal split across disabled children; SGA-screen removal clean). Requesting changes for 3 non-blocking should-address items: (1) the 2026 test period resolves at 2026-01-01 but Appendix J is effective 2026-04-01 — confirm the parameter's date entry aligns so the engine value matches the comment arithmetic; (2) the MO couple income-eligibility / 209(b) cases don't isolate the marital-unit sum (each spouse is already over the individual standard) — add an under-individual/over-couple case; (3) add a couple asset-eligibility boundary case distinguishing the couple vs individual limit. Full findings above. 🤖 /review-program

hua7450 and others added 2 commits September 8, 2026 13:39
…id ABD unit

Address review: isolate the marital-unit sum with a Missouri couple each
under the individual standard but over the couple standard (income,
209(b) spenddown, and resources), add a blind couple spenddown case, make
the per-child deeming split a float array, and clarify the April 1 vs
January guideline timing and the SSI federal benefit rate labels.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 requested a review from DTrim99 September 8, 2026 17:59

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

Re-review — all 3 should-address items resolved, CI 34/34 green. (1) The param-date concern is cleanly reconciled: the MO limit is FPG-derived and gov.hhs.fpg.first_person is dated 2026-01-01 (15,960), with the percentage params predating 2026, so a period: 2026 test resolves to the exact Appendix J dollars (13,572 / 15,960 / 18,396 / 21,648); the author removed the stale tax_unit_fpg overrides and added a comment reconciling the 04-01 effective date with the 01-01 FPG. (2) The marital-unit sum is now isolated — an MO income-eligibility case with each spouse under the 13,572 individual standard but combined 18,600 over the 18,396 couple standard → [false,false] (per-person would be [true,true]), plus 209(b) Cases 7/8 and a bonus blind-couple case. (3) A couple asset-eligibility boundary straddling the 11,452 couple limit (vs 5,726 individual) is added. The core was already confirmed (nationwide marital-unit switch per 42 CFR 435.602; MO Appendix J standards; SSI deeming order). Approving. 🤖 /review-program

@hua7450
hua7450 merged commit 7b5ecce into PolicyEngine:main Sep 8, 2026
33 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.

2 participants