Skip to content

Correct Missouri Medicaid child income limit to 153% of FPL - #9133

Open
daphnehanse11 wants to merge 2 commits into
PolicyEngine:mainfrom
daphnehanse11:mo-child-medicaid-153
Open

Correct Missouri Medicaid child income limit to 153% of FPL#9133
daphnehanse11 wants to merge 2 commits into
PolicyEngine:mainfrom
daphnehanse11:mo-child-medicaid-153

Conversation

@daphnehanse11

Copy link
Copy Markdown
Collaborator

Fixes #9126.

Change

Corrects Missouri's Medicaid income limit for children ages 1-18 from 1.55 to 1.53 in both the young_child and older_child parameters.

Missouri's MO HealthNet for Kids base standard is 148% of FPL for all children ages 1-18 (DSS Manual § 1830.010.05), and the conditional 5% MAGI disregard (§ 1805.030.20.20.05) produces an effective 153% ceiling. The state's published dollar limits equal exactly 148% of the FPL ($23,621 for one person at the 04/2026 guidelines).

The prior 1.55 traces to KFF's figure, which reflects the pre-MAGI-conversion 150% standard (+5). Since the 148% MAGI-converted standard predates the parameter's 2018 start date, the value is corrected at the existing date rather than dated as a policy change. KFF reports 155% for January 2018, 2021, and 2025 alike, so this is a source discrepancy, not a recent change — a comment in each parameter file documents this.

Impact

  • Children in the 153-155% FPL band were incorrectly shown Medicaid-eligible (confirmed by partner testing for one- and two-person households).
  • The same children were misrouted away from CHIP, since is_chip_eligible_child requires non-Medicaid-eligibility before applying the CHIP ceiling (MO: 305%).

Tests

  • Adds four boundary regression tests (152% eligible / 154% ineligible, for both age groups).
  • Full Medicaid suite (380), CHIP + Missouri state suites (626), and partner contract suite (630) all pass; partner tests untouched.

🤖 Generated with Claude Code

@DTrim99

DTrim99 commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Program Review — PR #9133 (Correct Missouri Medicaid child income limit to 153% of FPL)

Author: daphnehanse11 · Draft · Fixes #9126

Source Documents (all HTML, verified via WebFetch)

  • MO DSS Manual § 1830.010.05 — MO HealthNet for Kids base standard: 148% FPL, ages 1-18 (and a separate 196% standard for under-1)
  • MO DSS Manual § 1805.030.20.20.05 — conditional 5%-of-FPL MAGI disregard
  • MyDSS published income limits — $23,621 (HH1) = exactly 148% FPL
  • KFF — reports 155% for MO (Jan 2018/2021/2025): the legacy pre-MAGI 150% + 5, i.e. the prior value's source

Branch Status

⚠ PR branch is 132 commits behind main (1 ahead). Recommend rebasing before merge. Review was scoped strictly to the PR's merge-base diff, so the staleness did not cause false-positive findings. (Also: this is a draft PR.)

Summary

Correct, well-sourced value fix. The MO entry in both the young_child and older_child Medicaid income-limit params moves 1.55 → 1.53 at the existing 2018-01-01 key. Independently verified: 148% base + 5% MAGI disregard = effective 153%, confirmed by two MO DSS manual sections and the MyDSS dollar figure. The prior 1.55 is the legacy pre-MAGI 150% + 5 = 155% (KFF's figure) and is genuinely wrong for the MAGI era. 0 critical. CI green (33/33).

The main correctness risk is cleared: young_child = ages 1-5, older_child = ages 6-18 — together exactly the ages 1-18 group MO sets at 148%(→153%). The under-1 infant limit (196%, encoded as 201%) lives in a separate param and is not touched, so this PR does not wrongly lower any infant limit. In-place 2018-01-01 dating is correct (the value was wrong since inception, not a policy change); MO-only (every other state byte-for-byte unchanged); folding the 5% disregard into the ceiling is the right encoding (medicaid_income_level carries no disregard of its own, so no double-count).

Critical (Must Fix)

None.

Should Address (non-blocking)

  1. Pin the exact 153% boundary + the strict-< operator (test gap, highest-value). The added tests straddle 1.53 with 1.52 (eligible) and 1.54 (ineligible) but never assert at 1.53. Eligibility uses strict <, so medicaid_income_level: 1.53 → ineligible; a future refactor to <= would silently flip it and no test would catch it. Add one case per file at exactly 1.53false. (This is the boundary the PR exists to set.)
  2. Add an integration test for the Medicaid → CHIP re-routing (the headline behavioral claim). The changelog says the 153-155% band was misrouted away from CHIP; is_chip_eligible_child gates on ~is_medicaid_eligible (MO CHIP ceiling 305%), so a MO child at ~154% FPL should now be is_medicaid_eligible: false and is_chip_eligible_child: true. No test pins this end-to-end — the 4 unit tests only take scalar medicaid_income_level and can't reach CHIP. (No existing medicaid/chip child integration file was found — worth adding a full-household case rather than forcing it into the unit files.)
  3. Tighten the param comment wording (regulatory + reference agents both flagged). The comment says "…not the 150% KFF reports", but KFF's published figure was 155% (150% + the 5% disregard already baked in), and KFF's current live snapshot now shows 148%. Reword to attribute 155% to the historical KFF snapshot, e.g. "KFF historically reported 155% (a 150% legacy base + 5% disregard); the MAGI-converted base is 148%, so the effective ceiling is 148 + 5 = 153%."

Suggestions

  • Add a one-line note that the 5% disregard is folded into the limit because medicaid_income_level carries no disregard of its own (pre-empts a "model the disregard separately?" question). (regulatory S2)
  • The 152% "eligible" test is not a regression guard — it passes under both 1.55 and 1.53; only the 154% case does real regression work. Acceptable as a both-sides pair, but the exact-1.53 case (item 1) is the one that matters. (tests M1)
  • Pre-existing, out of scope: MN: 2.80 on line 79 of both files carries a trailing zero (repo style → 2.8). Not introduced by this PR. (code)

Validation Summary

Check Result
Regulatory Accuracy Correct — 1.53 = 148% base + 5% MAGI disregard for ages 1-18 (both params); infant 196%/201% correctly untouched; 1.55 genuinely wrong for MAGI era; in-place dating correct; MO-only
Reference Quality 0 critical, 0 missing; 3 new MO refs corroborate 148%+5%=153%; KFF retained transparently (not deleted); 2 minor wording/date-anchor notes
Code Patterns 0 critical; right date key, MO-only, both params consistent, changelog present + fixed; 1 pre-existing trailing-zero (out of scope)
Test Coverage 4 boundary tests correct (154% flips → genuine regression guard); gaps: exact-1.53 boundary + < operator unpinned; no Medicaid→CHIP integration test
Source Audit 148% + 5% = 153% confirmed by 2 DSS manual sections + MyDSS $ figure; KFF 155% = legacy 150%+5
CI Status Passing (33/33)

Review Severity: COMMENT

A correct, cleanly-scoped, well-sourced value correction with the one real risk (infant band) verified clear. No blocking issues. Before marking ready: add the exact-1.53 boundary test + a Medicaid→CHIP integration test (items 1-2), tighten the KFF comment (item 3), and rebase off the 132-commit lag.

Next Steps

To auto-apply the actionable items: /fix-pr 9133

Review generated with Claude Code via /review-program

@daphnehanse11
daphnehanse11 force-pushed the mo-child-medicaid-153 branch 2 times, most recently from 018317b to c055603 Compare July 28, 2026 14:45
@daphnehanse11

Copy link
Copy Markdown
Collaborator Author

Addressed the review items and rebased onto main (branch is now main + 2 commits):

  1. Exact-153% boundary test — added to both category test files, but with one deviation from the suggestion: the case can't assert false. YAML inputs are stored as float32, and float32(1.53) ≈ 1.52999997 lands just below the float64 parameter 1.53, so the exact boundary evaluates eligible under both < and <= — the operator is unpinnable at this value. This happens to match the manual's income-maximum (≤) semantics, so the tests pin the actual behavior (true) with a comment explaining the float mechanics.
  2. Medicaid → CHIP integration tests — added to is_chip_eligible_child.yaml: a full-household MO child at 154% FPL is is_medicaid_eligible: false and is_chip_eligible_child: true (computed, not input), plus the 152% converse.
  3. Comment wording — reworded in both parameter files to attribute KFF's 155% to the legacy pre-MAGI 150% base plus the 5% disregard, and to note the disregard is folded into the limit because medicaid_income_level applies no disregard of its own.

Full Medicaid/CHIP/MO suites (999) and the partner contract suite (626) pass locally.

@daphnehanse11
daphnehanse11 marked this pull request as ready for review July 28, 2026 14:45
daphnehanse11 and others added 2 commits July 28, 2026 10:46
Missouri's MO HealthNet for Kids standard for children ages 1-18 is
148% of the federal poverty level (DSS Manual 1830.010.05), with the
conditional 5% MAGI disregard (1805.030.20.20.05) producing an
effective 153% ceiling. The parameters carried 1.55 from a KFF
figure based on the pre-MAGI-conversion 150% standard; the state's
published dollar limits equal exactly 148% of the FPL, so the value
is corrected at the existing 2018 date rather than dated as a policy
change.

Fixes PolicyEngine#9126.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ment wording

- Pin exact-153% boundary behavior in both child category test files (float32
  input storage lands just below the float64 parameter, so the boundary is
  eligible under both < and <=, matching the manual's income-maximum semantics)
- Add MO Medicaid-to-CHIP routing integration tests at 152%/154% FPL
- Reword parameter comments to attribute KFF's 155% to the legacy pre-MAGI
  150% base plus the 5% disregard

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@daphnehanse11
daphnehanse11 force-pushed the mo-child-medicaid-153 branch from c055603 to 1d8ae7a Compare July 28, 2026 15:05
@daphnehanse11
daphnehanse11 requested a review from DTrim99 July 28, 2026 16:12
@DTrim99

DTrim99 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Re-review — all three items addressed ✅

Thanks for the quick turnaround. The follow-up commit resolves every should-address item from the prior review:

  1. Exact-153% boundary — pinned, and your analysis corrects mine. Both category files now assert medicaid_income_level: 1.53 → eligible. I'd flagged the strict < as making 1.53 ineligible, but you're right: the input is stored as float32 (1.531.5299999713897705), which lands just below the float64 parameter 1.53, so it evaluates eligible under both < and <= — matching the manual's income-maximum (<=) semantics. Verified: float32(1.53) < 1.53 (float64) == True. Good catch; the comment documents it clearly.
    • Minor note (non-blocking): this relies on 1.53's nearest float32 rounding down. It's stable for this value, but it's a float-precision coincidence rather than an explicit <=; worth keeping the explanatory comment (which you have) so a future reader doesn't "simplify" it away.
  2. Medicaid → CHIP re-routing — pinned both sides. is_chip_eligible_child.yaml now has MO 154% FPL → is_medicaid_eligible: false + is_chip_eligible_child: true (routes to CHIP) and MO 152% → the inverse. This is exactly the end-to-end behavioral claim the PR makes.
  3. Comment wording — tightened. Now correctly attributes KFF's 155% to the legacy pre-MAGI 150% base + 5% disregard, and adds the note that the disregard is folded into the limit because medicaid_income_level carries none of its own. 👍

CI is green (31/31). The value itself was already verified correct against the MO DSS manual (148% base + 5% disregard = 153%) with the infant band correctly untouched. This is good to merge once you're ready to take it out of draft / rebase off the (now larger) main lag.

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.

Update Missouri children ages 1-18 Medicaid income limit from 155% to 153% FPL

2 participants