Repository navigation
Lower California's non-MAGI Medi-Cal asset limit to $21,000 / $31,000 on July 1, 2027 - #10375
Conversation
- Washington: no MSP asset test from 2023-01-01 (WSR 22-21-043). - California: $130,000 / $195,000 asset limit from 2022-07-01; asset test reinstated from 2026-01-01 (ACWDL 21-31, 22-25, 25-14, 25-27). - Minnesota: $10,000 / $18,000 asset limit, or the federal limit when higher (Minn. Stat. 256B.057 subd. 3). - Illinois $25 and Mississippi $50 general income exclusions in place of the SSI $20. Closes PolicyEngine#10359 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Switch on the senior and disabled medically needy flags for AR, IA, IL, NJ and ND. - Add medicaid_medically_needy_income_limit, which applies a share of the poverty guideline (IL, MN, ND, NY, UT, WI) or of the SSI federal benefit rate (KS, WA) in place of a dollar limit; Washington applies its one-person limit to couples. - Update dollar limits in CT, DC, NH, RI and NY (2022), and asset limits in CA, IL and NY. Closes PolicyEngine#10357 Closes PolicyEngine#10358 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… into ca-medi-cal-asset-limit-2027
…to ca-medi-cal-asset-limit-2027
SB 164 (Stats. 2026, ch. 27) sec. 69 sets the non-MAGI resource limit at $21,000 for one person and $31,000 for two from July 1, 2027, and sec. 71 ties the Medicare Savings Program resource limit to it. Apply the cut to the aged, blind and disabled, medically needy and MSP California limits, with tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…and pin the new limits WIC 14007.9(a)(1)(C) caps 250% Working Disabled Program resources at the WIC 14005.62(a) levels, so SB 164's July 1, 2027 schedule applies there too: $21,000 for one person, $31,000 for two and $1,550 for each person beyond two. Add a two_people parameter, make additional_person the amount beyond two, and use them in ca_wdp_asset_eligible; limits before July 2027 are unchanged. Add eligible-side cases at or under the new limits, WDP cases for one, two and three people, and January 1 timing comments on the July 2027 rows read by annual variables. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…atute references - Illinois gives each applying spouse with income their own $25 exemption (PM 15-04-03-a, 89 Ill. Adm. Code 120.335(a)(1)); new by-state flag state_general_exclusion_per_spouse, used only in the couple path. - Tests pin Washington before 2023, California July 2022 and December 2025, California's couple limit, and Minnesota's individual and couple limits from above. - Cite Welf. & Inst. Code 14005.62, Laws of Washington 2022 ch. 297 and the official Mississippi rules; label the Illinois and Mississippi start dates as in-effect-by dates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rences - Year-keyed cases pin every dated CT, DC, NH, RI, NY, MN, ND and WI income limit; cases sit exactly at the IL, ND, CA and NY limits, with CA one dollar over, CA 2024 without a limit, and couples at the NY, CA and IL couple asset limits. - NJ and CA cases use incomes above the optional ABD pathway. - Disabled adults in AR, IA, IL, ND and NJ are in a medically needy category. - Arkansas spend down in cents (108.33 / 216.66, DHS quick reference). - Fix NY GIS 22 MA/11 and RI 210-RICR-40-00-3 titles, the RI section, the KS F-8 page; cite 305 ILCS 5/5-2 and Welf. & Inst. Code 14005.62. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ACWDL 21-31 raised the non-MAGI limit, including the ABD FPL program, to $130,000 for one person and $195,000 for two on July 1, 2022; the CA ABD rows jumped from $2,000 / $3,000 straight to no limit in 2024. Add the 2022 rows with the 21-31 reference and a 2023 case. Add 2027 cases showing the annual variables still read $130,000, WDP cases at the 2026 three-person limit and at the ten-person cap, and the page lists in the two_people reference titles. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The PIL outside Chittenden County, the same for one and two people, each January 1 (HBEE 8.06(b), 29.14; DCF B17-26; DVHA charts 2020-2026). No 2019 PIL was found, so 2018's value stays in force through 2019. The higher Chittenden PIL is not modeled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PolicyEngine#10364 adds the same California 2022-07-01 rows, ACWDL 21-31 reference and 2023 case to the senior_or_disabled asset files. Remove them here to avoid duplicate edits; keep the 2027 January 1 case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml
KFF 2018 and 2026 list no medically needy program for aged, blind or disabled people in these five states; the flags had been swapped with AR, IL, IA, NJ and ND. Their -inf limits meant no result changes. The NJ DMAHS fact sheet now 404s, so cite the 2026-05-14 Wayback copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/parameters/gov/hhs/medicare/savings_programs/eligibility/asset/state_limit/couple.yaml # policyengine_us/parameters/gov/hhs/medicare/savings_programs/eligibility/asset/state_limit/individual.yaml # policyengine_us/tests/policy/baseline/gov/hhs/medicare/savings_programs/eligibility/msp_asset_eligible.yaml
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… 1999 - A spouse's own income for the Illinois $25 exemption floors earned and unearned income separately, so a self-employment loss earns no exemption and does not raise countable income. - Mississippi's MSP asset test ended 1999-07-01 (Eligibility Manual page 7220; 23 Miss. Code R. 103-1.8(A)(1)), not 2024. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Iowa 441-75.8(7) and (5)"a", the NJ fact sheet (archived) and SPA KS-25-0019 page 7 for the $475 standard, alongside KFF. - HBEE 29.14 cited from file page 50. - Number the two category cases 3 and 4, after PR 10370's Cases 1-2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Pavel. Round 1 is addressed at head Paths:
Stacking:
Update (head Update (head Update (head |
…needy-limits # Conflicts: # policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_in_medicaid_medically_needy_category.yaml # policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml
…and references Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
PR #10375, "Lower California's non-MAGI Medi-Cal asset limit to $21,000 / $31,000 on July 1, 2027" (hua7450). Round 2, incremental review of 8f9c019428..5a37f33d7f.
IDs: C = critical, SA = should address, G = suggestion. New items continue the numbering after the highest prior ID in each class.
Paths are the same as in my round 1 review: ABD/ = policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/assets/limit/, MN/ = .../medically_needy/limit/assets/, MSP/ = policyengine_us/parameters/gov/hhs/medicare/savings_programs/eligibility/asset/state_limit/, WDP/ = policyengine_us/parameters/gov/states/ca/chhs/wdp/eligibility/asset/, V = policyengine_us/variables/gov/states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.py. Tests: TA = .../categories/is_optional_senior_or_disabled_asset_eligible.yaml, TMN = .../medically_needy/is_medically_needy_for_medicaid.yaml, TMSP = .../savings_programs/eligibility/msp_asset_eligible.yaml, TW = .../states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.yaml. Line numbers refer to the reviewed head.
Source Documents
- Reviewed head SHA: 5a37f33
- Mode: incremental (round 2)
- Scope: one own commit,
f51df391f5(8 files, +145/-9): the SA1 and SA2 tests, G2 inV:25, G3 inWDP/two_people.yaml:16, G4 inWDP/additional_person.yaml:14-17, and G5 inMSP/individual.yaml:19-20andMSP/couple.yaml:19-20. The other commits are merges: #10360 at5bb5a500e0, #10374 at15059d9cd2and then33d10a5f09, andmainatb210b45a6cand3f24a22578. The merges renumber this PR's cases (TMN Cases 28-33, TMSP Cases 22-25) and change no line of this PR's own content. The PR body was updated (heads, recipe, AB 173 note, #10542). - Sources this round: I could not open leginfo (Cloudflare 403), the DHCS letter PDFs (Incapsula challenge) or Wayback (429 and a TLS error) from this machine. For SB 164, AB 173 sec. 16 and ACWDLs 21-31 and 25-14, I rely on my round 1 reading. Each new title and page in this round is the text I gave in round 1. The author also reports reading AB 173 sec. 16 on leginfo.
- Issue #10542 (opened 1:42pm EDT, October 29): it lists the start-date recheck for all nine CA parameter files and the renewal phase-in.
Branch Status
- The branch is 42 commits ahead of
main(95cf2373a0) and 5 behind. GitHub reports MERGEABLE, and a trial merge withmainis clean. - CI at the head (re-checked at 3:54pm EDT): 27 pass, 2 fail, 4 pending. "Full Suite - Rest (Python shard 3)" fails one test, and "Check Rest Python shards" fails because of it. See C1. "Household API Partners" and all baseline shards pass. Four contrib shards are still pending.
- #10374 (
33d10a5f09) and #10360 (5bb5a500e0) are still open, and their heads are the ones merged here. #10364 (7f8a8a1bcf) is still open. - #10364 trial merge (in a scratch clone): only
TAconflicts. TheABD/files merge to 2,000 → 130,000 (2022-07) →.inf(2024) → 130,000 (2026) → 21,000 (2027-07), and the matching couple series. The body's recipe gives 49 + 6 = 55 cases, and all 55 pass. - Other open PRs: #10386 (
2131da0de7) conflicts inTA. #10240 (e3b765b1ce) conflicts inTMNand in #10360'smsp_countable_income.yaml. I did not check #10394 (its head is not available locally). - No partner contract test differs from
main. The six partner files that changed since my last review came frommainmerges.
Round 1 items
| ID | Status | Evidence |
|---|---|---|
| SA1 | RESOLVED | TA:184-191 now uses 20,999 and TA:193-214 uses 15,499 + 15,500 = 30,999. Both pass. Mutations: an ABD/individual.yaml limit of 20,500 fails only the 20,999 case; an ABD/couple.yaml limit of 30,500 fails only the 30,999 case. |
| SA2 | RESOLVED | All five cases are in, word for word: TA:225-246, TMN Case 33 (TMN:831), TW Cases 12-14 (TW:272, TW:294, TW:318). Each mutation fails only the case it pins. The ABD/couple.yaml row moved to 2027-01-01 fails the 2027 couple case. The MN/couple.yaml row moved to 2027-01-01 fails Case 33. WDP/two_people.yaml moved to 2027-01-01 fails Cases 12 and 13. WDP/additional_person.yaml moved to 2027-01-01 fails Case 13. Removing the two_people 2024 .inf row fails Case 14. |
| G1 | DEFERRED (accepted) | The strict < is still on main (is_optional_senior_or_disabled_asset_eligible.py:32), and #10364 is still open. On the trial merge with #10364, the recipe file with the G1 amounts (21,000; 15,500 + 15,500) passes 55/55. The body's "Notes for reviewers" gives the recipe and the G1 step. |
| G2 | RESOLVED | V:25 is now p.two_people + (capped_size - 2) * p.additional_person. ruff format --check is clean. TW passes 14/14. The where makes the negative branch for one person harmless, and additional_person is never infinite, so inf * 0 cannot occur. |
| G3 | RESOLVED | WDP/two_people.yaml:16 now has the page 1 subject line, "Increases to the Asset Limits for Non-Modified Adjusted Gross Income Medi-Cal Programs". The MSP files use the same title. |
| G4 | RESOLVED | WDP/additional_person.yaml:14-17 cites ACWDL 21-31 "#page 2,4" (#page=2) and ACWDL 25-14 "#page 1,9" (#page=1). These are the pages where I read "$65,000 for each additional person" in round 1. |
| G5 | RESOLVED | The body bullet now reads as I suggested. MSP/individual.yaml:19-20 and MSP/couple.yaml:19-20 cite AB 173 sec. 16 and WIC 14005.11(h). This agrees with my round 1 reading and with the author's quote of (h). |
| G6 | DEFERRED (accepted) | Item 2 of #10542 tracks the renewal phase-in, and the body's "Limitations" section documents it. It was a suggestion, and the model has no redetermination-date input. |
| G7 | DEFERRED (accepted) | Item 1 of #10542 tracks the date recheck and the future DHCS letter for all nine CA files. |
New findings
Critical
C1. CI fails at the head because of a parameter file that this branch takes from #10374.
- Where:
policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/medically_needy/limit/income/rounds_down_monthly.yaml. It came from #10374's commit33d10a5f09and has astate_codebreakdown with one member,IL. - Evidence:
policyengine_us/tests/test_parameter_files.py::test_enum_breakdown_parameters_do_not_have_single_member_tablesreports: "has metadata.breakdown=['state_code'] but only one top-level member 'IL'. Use a scalar parameter under a member-specific path instead." The guard came frommain(e281f7eef5). The same test fails in #10374's own CI (job 123653103433). I ran the test at this head: 1 failed, 7 passed. - Why CRITICAL: a CI failure with a real test failure, not an infrastructure timeout. This PR's own files do not cause it, and this PR needs no own change for it.
- Fix: #10374 fixes the file (its formula reads
p.rounds_down_monthly[state]inmedicaid_medically_needy_income_limit.py:42). Then merge #10374's new head into this branch, or mergemainafter #10374 merges, and confirm that CI passes.
Should address
None.
Suggestions
None.
Investigated and cleared
- New test arithmetic. TA: 20,999 < 21,000; 15,499 + 15,500 = 30,999 < 31,000; and in 2027, 31,001 < 195,000. TMN Case 33: a probe gives the CA couple income limit as 11,208 (934 x 12), and (9,000 - 4,000) x 2 = 10,000 is under it. In 2027 the couple asset limit reads 195,000, and in 2028 it reads 31,000. TW: 31,001 ≤ 195,000 (Case 12); 195,000 + 65,000 = 260,000 ≤ 260,000 (Case 13);
.infin 2025 (Case 14). - Merge resolutions. Compared with #10374's head,
TMNadds only this PR's Cases 28-33 at the end. Compared with #10360's head,TMSPadds only Cases 22-25 at the end. No case of theirs is lost or changed. Compared withmain,TAandTWhave additions only. - PR body. The merged heads, case numbers (MN 28-33, MSP 22-25), the #10364 recipe (49 + 6 = 55 cases) and the test plan match the head. The unchecked "CI passes" box is accurate (C1).
- Changelog. This PR's fragment is unchanged. The two stacked fragments are still present, and the body's stacking steps remove them with
git rm.
Out of scope / follow-up
- #10374's
MN/individual.yaml:21andMN/couple.yaml:21still use the old ACWDL 21-31 title "(Phase I)". This belongs to #10374's review, as in round 1. - The CA medically needy income levels in the TMN comments (600 and 934 a month) belong to #10374's review.
- The microsimulation was not run.
Tests run
- At the head, the four touched test files and
ca_wdp_eligible.yaml: 99 passed (TA 16, TMN 34, TMSP 25, TW 14,ca_wdp_eligible10). - At the head, the stacked PRs' other changed YAML files (
is_in_medicaid_medically_needy_category,medicaid_medically_needy_income_limit,medicaid_medically_needy_medical_expenses,msp_countable_income): 50 passed. - At the head,
pytest policyengine_us/tests/test_parameter_files.py: 1 failed, 7 passed (C1). - Mutations on a scratch copy: 7 of 7 were caught, and each was caught only by the new SA1 or SA2 case for it.
- Trial merge with #10364 (scratch clone): the recipe
TApassed 55/55, and with the G1 amounts it also passed 55/55. ruff format --checkonV: clean.
Verdict
REQUEST_CHANGES: All round 1 items are resolved or accepted as deferred, and this PR's own changes are correct. The only open item is C1, a CI failure that comes from #10374's rounds_down_monthly.yaml. Fix it in #10374, merge that head here, and this PR is ready to approve when CI passes.
…d comments Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…into ca-medi-cal-asset-limit-2027 Keep main's PolicyEngine#10360 MSP files and append this PR's 2027 rows, SB 164 and AB 173 references, and MSP Cases 22-25. For the aged, blind and disabled test file, take PolicyEngine#10364's file and append this PR's cases, then apply Pavel's G1: with California's inclusive limit flags from PolicyEngine#10364, the 2028 eligible cases sit exactly at $21,000 and $31,000. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
PR #10375, "Lower California's non-MAGI Medi-Cal asset limit to $21,000 / $31,000 on July 1, 2027" (hua7450). Round 3, incremental review of 5a37f33d7f..753c6082c8.
IDs: C = critical, SA = should address, G = suggestion. New items continue the numbering after the highest prior ID in each class.
Paths are the same as in my round 1 and round 2 reviews: ABD/ = policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/assets/limit/, MN/ = .../medically_needy/limit/assets/, MSP/ = policyengine_us/parameters/gov/hhs/medicare/savings_programs/eligibility/asset/state_limit/, WDP/ = policyengine_us/parameters/gov/states/ca/chhs/wdp/eligibility/asset/, V = policyengine_us/variables/gov/states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.py. Tests: TA = .../categories/is_optional_senior_or_disabled_asset_eligible.yaml, TMN = .../medically_needy/is_medically_needy_for_medicaid.yaml, TMSP = .../savings_programs/eligibility/msp_asset_eligible.yaml, TW = .../states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.yaml. Line numbers refer to the reviewed head.
Source Documents
- Reviewed head SHA: 753c608
- Mode: incremental (round 3)
- Scope: two merge commits, no own commit.
66939956ebmerges #10374's head0f8b603643. It moves the Illinois rounding flag to the scalarmedically_needy/limit/income/il/rounds_down_monthly.yaml, reads it inmedicaid_medically_needy_income_limit.py:40, adds Case 23 tomedicaid_medically_needy_income_limit.yaml, and changes three TMN comments.753c6082c8mergesmainatec16e0fc99, with #10360 (631ff8cf10), #10363 (3cfcb37e00) and #10364 (ec16e0fc99).- This PR's own content changed in one place: the two 2028 eligible cases in
TA:729-759now sit at exactly $21,000 and $15,500 + $15,500 = $31,000 (G1). TheABD/files took #10364's July 2022 step and Missouri rows, and kept this PR's SB 164 reference and 2027-07-01 rows. TheMN/,MSP/,WDP/,V, TMSP, TW and changelog files of this PR did not change. - The PR body was updated: #10360 and #10364 are merged, the merged heads, the G1 note and the inclusive-limit note.
- Sources this round: leginfo returned 403 and justia 403. The DHCS FAQ returned an Incapsula challenge, and Wayback returned 429. This round adds no new reference to this PR's own files. The only new citation is the "WIC 14005.40(c)(5)" comment on the G1 cases. That is the text I gave in round 1, from my round 1 reading of the section ("do not exceed the maximum levels established in that section").
- Issue #10542 is open. It still lists the start-date recheck for all nine CA parameter files and the renewal phase-in.
Branch Status
- The branch is 46 commits ahead of
mainand 1 behind. The missing commit is the released983c32370(5:48pm EDT). It deletes the #10360, #10363 and #10364 changelog fragments and bumps the version. A trial merge (git merge-tree) withd983c32370is clean. This PR does not touch those three fragments, so the merge keeps them deleted. - CI at the head: 34 pass, 0 fail, 0 pending. This includes "Household API Partners".
- #10374 is open, MERGEABLE, at
0f8b603643, which is the head merged here. Its CI is also 34 pass. - Merge order: #10374 first, then this PR, with the body's three stacking steps (merge
main,git rmthe #10374 fragment if the release removed it, then resolve the insertion-only conflicts inMN/and TMN). - No partner contract test differs from the merge base or from
main.
Round 2 items
| ID | Status | Evidence |
|---|---|---|
| C1 | RESOLVED | The breakdown file medically_needy/limit/income/rounds_down_monthly.yaml is gone. The scalar .../income/il/rounds_down_monthly.yaml has no breakdown, and medicaid_medically_needy_income_limit.py:40 reads (state == "IL") & p.il.rounds_down_monthly. No other file reads the old path. At the head, pytest policyengine_us/tests/test_parameter_files.py passes 8/8, including test_enum_breakdown_parameters_do_not_have_single_member_tables. The test lives in policyengine_us/tests/, not in a code_health/ folder. CI is 34/34 green. The new income limit Case 23 is correct: 2022 keeps 18,310 and 13,590; 2023 gives 19,720 / 12 = 1,643.33, floored to 1,643 x 12 = 19,716, and 14,580 / 12 = 1,215 exactly. |
| SA1 | RESOLVED | G1 replaced the one-dollar-below cases with exact-limit cases, and they still pin the amounts. Mutations: ABD/individual.yaml 2027-07-01 at 20,999 fails only "assets at the July 2027 CA limit in 2028, eligible". ABD/couple.yaml at 30,999 fails only "joint filers at the July 2027 CA couple limit in 2028, eligible". The 21,001 and 31,001 ineligible cases catch a limit raised by $1. |
| SA2 | RESOLVED | The five cases are unchanged and pass: TA:761-790, TMN Case 33 (TMN:831), TW Cases 12-14 (TW:272, TW:294, TW:318). |
| G1 | RESOLVED | TA:729-736 uses 21,000, and TA:738-759 uses 15,500 + 15,500, with the names and comments I gave in round 1. On main, #10364 sets CA individual_limit_inclusive and couple_limit_inclusive to true from 2015. With the CA individual flag set to false, the 21,000 case fails, together with #10364's three CA at-limit cases. With the couple flag set to false, the 31,000 case fails, together with #10364's two CA couple at-limit cases. |
| G2 | RESOLVED | V:25 is unchanged since round 2. TW passes 14/14. |
| G3 | RESOLVED | WDP/two_people.yaml:16 is unchanged. |
| G4 | RESOLVED | WDP/additional_person.yaml:14-17 is unchanged. |
| G5 | RESOLVED | MSP/individual.yaml:19-20 and MSP/couple.yaml:19-20 are unchanged. After the #10360 merge, this PR adds only the SB 164 and AB 173 references and the 2027-07-01 rows to the two MSP/ files. |
| G6 | DEFERRED (accepted) | Item 2 of #10542 (open) tracks the renewal phase-in. The body's "Limitations" section documents it. |
| G7 | DEFERRED (accepted) | Item 1 of #10542 (open) tracks the date recheck and the future DHCS letter for all nine CA files. |
New findings
Critical
C2. Inherited from #10374 (its C3): Illinois medically needy limits for 2018-2022 keep the cents.
- Where: this branch contains #10374's head
0f8b603643, so it carriesmedically_needy/limit/income/il/rounds_down_monthly.yamland the Illinois branch ofmedicaid_medically_needy_income_limit.pyas they are there. - Evidence: in 2022 the model gives $1,132.50 / $1,525.83 a month for one and two people. The IDHS table publishes $1,133 / $1,526, and KFF 2018 and the IDHS 2019-2021 tables also round to the nearest dollar. The error is under $0.50 a month, but at the published level it makes the person ineligible in 7 of 10 probe cases (2018-2022).
- The fault is in my round-1 fix on #10374, not in this PR's own work. My #10374 review gives the tested fix.
- Fix: once #10374 takes the fix, merge #10374 into this branch again. This PR's own files need no change.
Should address
None.
Suggestions
G8. Correct two small points in the PR body.
- Where: "Notes for reviewers", the second sub-bullet under "Resources exactly at the limit", and the last box of "Test plan".
- Evidence: the body says that #10364 added the inclusive flags and that "All four formulas therefore count resources equal to the limit as within it." The flags drive only
is_optional_senior_or_disabled_asset_eligible. The other three formulas already use<=and do not read the flags:is_medically_needy_for_medicaid.py(assets <= asset_limit),msp_asset_eligible.py(countable_resources <= asset_limit) andV:28. Also, the "CI passes" box is still unchecked, but CI is now 34/34 green. - Why a suggestion: this is documentation only. The model and the tests are correct.
- Fix: change the sentence to "The flags make the aged, blind and disabled comparison inclusive for California. The medically needy, MSP and Working Disabled Program formulas already use
<=. So all four count resources equal to the limit as within it." Then tick the CI box.
Investigated and cleared
- Merge result with
main. Compared withec16e0fc99, theABD/files add only the SB 164 reference and the 2027-07-01 rows. The CA series are 2,000 → 130,000 (2022-07) →.inf(2024) → 130,000 (2026) → 21,000 (2027-07), and 3,000 → 195,000 →.inf→ 195,000 → 31,000. TA adds 99 lines and deletes none:mainhas 49 cases, and with this PR's 6 cases the file has 55. TheMSP/files and TMSP add only lines (88 test lines, no deletions). No case from #10360 or #10364 was lost or changed. - #10364 logic and this PR. CA is not in
uses_msp_limit(only AR, OK and SC are), so CA still uses its state dollar limit. The new whole-cent rounding of resources does not change any CA case. #10360'sapplies.yamlturns the CA MSP asset test off for 2024-2025 and on from 2026, so this PR'sMSP/rows need no.infrow. - New test arithmetic (G1). 21,000 ≤ 21,000 and 15,500 + 15,500 = 31,000 ≤ 31,000 in 2028. The January 1, 2028 read gives 21,000 / 31,000 from the 2027-07-01 rows. Both values are exact in float32.
- Exact-limit cases in the other programs. TMN Cases 30-31, TMSP Cases 24-25 and TW Cases 2, 4 and 6 were already at the limits in round 2. All pass.
- PR body. The merged heads (#10374
0f8b603643,mainec16e0fc99), the case counts (TA 49 + 6 = 55, TMN Cases 28-33, TMSP Cases 22-25, TW Cases 1-14), the stacking steps and the test plan match the head, apart from G8. - Changelog. This PR's fragment is unchanged. The #10374 fragment is still present, and step 2 of the body's stacking steps removes it if needed. The three
mainfragments on the branch are deleted by the release commit, and the trial merge keeps them deleted.
Out of scope / follow-up
- #10374's
MN/individual.yaml:21andMN/couple.yaml:21still use the old ACWDL 21-31 title "(Phase I)". This belongs to #10374's review, as in rounds 1 and 2. - The CA medically needy income levels in the TMN comments (600 and 934 a month) belong to #10374's review.
- The microsimulation was not run.
Tests run
- At the head,
pytest policyengine_us/tests/test_parameter_files.py: 8 passed (C1). - At the head, the YAML folder
gov/hhs/medicaid/eligibility/categories: 397 passed. The rest ofgov/hhs/medicaid: 483 passed.gov/hhs/medicare/savings_programs,gov/states/ca/chhsandgov/states/ca/dhcs(Medi-Cal): 199 passed. - Per file: TA 55, TMN 34, TMSP 25, TW 14,
ca_wdp_eligible10,medicaid_medically_needy_income_limit23. All passed. - Mutations on a scratch copy (deleted after use): 4 of 4 were caught. The CA individual limit at 20,999 and the CA couple limit at 30,999 each fail only the matching G1 case. The CA individual and couple inclusive flags set to false fail the matching G1 case and #10364's CA at-limit cases.
- Trial merge with
maind983c32370(git merge-tree): clean.
Verdict
REQUEST_CHANGES: C1 is resolved (the scalar Illinois flag is in, the parameter-file test passes, and CI is 34/34 green). G1 is applied, and every other round 1 and round 2 item is resolved or accepted as deferred to #10542. The main merge did not break any of this PR's tests or logic. C2, inherited from #10374, is open; it clears when this branch merges #10374's fix. G8 is a PR-body wording point. Merge #10374 first, then this PR, with the body's stacking steps.
KFF 2018 and the IDHS 2019-2024 tables round the monthly level to the nearest dollar; the 2025 and 2026 tables drop the cents. Add the scalar il/rounds_to_nearest_monthly flag and move il/rounds_down_monthly to 2025. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes PolicyEngine#10374's Illinois nearest-dollar rounding fix (Pavel's C3 there, C2 here) and its main merge at 7f736e8. The aged, blind and disabled asset test keeps main's 53 cases and appends this PR's 6. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
PR #10375, "Lower California's non-MAGI Medi-Cal asset limit to $21,000 / $31,000 on July 1, 2027" (hua7450). Round 4, incremental review of 753c6082c8..a8ffdcd1f7.
IDs: C = critical, SA = should address, G = suggestion. New items continue the numbering after the highest prior ID in each class.
Paths are the same as in my earlier rounds: ABD/ = policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/assets/limit/, MN/ = .../medically_needy/limit/assets/, INC/ = .../medically_needy/limit/income/, MSP/ = policyengine_us/parameters/gov/hhs/medicare/savings_programs/eligibility/asset/state_limit/, WDP/ = policyengine_us/parameters/gov/states/ca/chhs/wdp/eligibility/asset/, V = policyengine_us/variables/gov/states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.py, VL = policyengine_us/variables/gov/hhs/medicaid/eligibility/categories/medically_needy/medicaid_medically_needy_income_limit.py. Tests: TA = .../categories/is_optional_senior_or_disabled_asset_eligible.yaml, TMN = .../medically_needy/is_medically_needy_for_medicaid.yaml, TL = .../medically_needy/medicaid_medically_needy_income_limit.yaml, TMSP = .../savings_programs/eligibility/msp_asset_eligible.yaml, TW = .../states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.yaml. Line numbers refer to the reviewed head.
Source Documents
- Reviewed head SHA: a8ffdcd
- Mode: incremental (round 4)
- Scope: two merge commits, no own commit, both on October 30 at 10:50am EDT.
9175021a3fmerges #10374's headbdb48a7b2c. That head carries the C2 fix (#10374's C3):INC/il/rounds_down_monthly.yaml(false from 2018, true from 2025, plus the May 15, 2025 capture), the new scalarINC/il/rounds_to_nearest_monthly.yaml(true from 2018, false from 2025),VL:39-57(thein_il,rounds_to_nearestandnp.floor(fpg_monthly + 0.5)lines), the new Case 23 inTL:576-600, and the #10374 changelog fragment text. It also bringsmainat7f736e8f3a, with #10386 (70eac3c751): four Maine cases inTA:694-762, a Maine savings exclusion inis_optional_senior_or_disabled_asset_eligible.py, and the newsenior_or_disabled/covers_blind_or_disabled.yaml.a8ffdcd1f7mergesmainat5f23a26bf8(the release commit). It changes onlyCHANGELOG.md,pyproject.toml,uv.lockand one deletedmainfragment.- This PR's own California files did not change.
git diff 753c6082c8 HEADshows no change inABD/,MN/,MSP/,WDP/,V, TMN, TMSP, TW orchangelog.d/ca-medi-cal-asset-limit-2027.fixed.md. In TA, the only change is the four Maine cases frommain, inserted above the California block. The California block (TA:764-861, six cases) is byte-for-byte the same. - The PR body was updated: the merged heads (#10374
bdb48a7b2c,main5f23a26bf8), the TA case count (53 + 6 = 59), the G8 sentence and the ticked CI box.
- Sources this round: the three Wayback captures that the C2 fix cites return 200 with
id_, and they show the AABD 100% FPL levels in the reference titles: Sept. 28, 2022 $1,133 / $1,526; July 15, 2024 $1,255 / $1,703; May 15, 2025 $1,304 / $1,762. This round adds no new California reference. - Issue #10542 is open. It still tracks the start-date recheck and the renewal phase-in (G6, G7).
Branch Status
- The branch is 50 commits ahead of
main(7a58b4fa2e) and 52 behind. A trial merge (git merge-tree) with7a58b4fa2eis clean.mainchanged none of this PR's 31 files since5f23a26bf8, and no Medicaid, MSP, SSI or CA CHHS variable or parameter. - CI at the head: 33 pass, 0 fail, 0 pending. This includes "Household API Partners".
- No file under
policyengine_us/tests/policy/baseline/partners/differs frommain. - #10374 is open at
51818a8130(amainmerge atbdd08b8d69, October 30, 7:25pm EDT). Its IL files,VL, TL and its changelog fragment are identical to this head (git diff 51818a8130 HEADon those paths is empty). So this branch does not need to merge #10374 again for C2. One #10374 check, "Contrib tests / Full Suite - Contrib (other-shard-1)", was cancelled at the 60-minute limit (8:05pm to 9:05pm EDT, October 30), with no test failure. That is #10374's item: re-run it before #10374 merges. - Merge order: #10374 first, then this PR, with the body's three stacking steps. I simulated a squash merge of #10374 onto
main7a58b4fa2eand then merged this head into it. Only three files conflict:MN/individual.yaml,MN/couple.yamland TMN. Each conflict hunk has this PR's lines on one side and nothing on the other (the SB 164 reference, the 2027-07-01 row, and Cases 28-33). That matches step 3 of the body. All other files, including the IL files, merge cleanly.
Round 3 items
| ID | Status | Evidence |
|---|---|---|
| C2 | RESOLVED | The fix is present and identical to my round 3 fix on #10374 and to #10374's current head 51818a8130. INC/il/rounds_down_monthly.yaml and INC/il/rounds_to_nearest_monthly.yaml match my tested fix files byte for byte. VL:40-44 reads both flags, and VL:54 is np.floor(fpg_monthly + 0.5) * MONTHS_IN_YEAR. Neither file has a breakdown, and the guard test passes (8 of 8). TL:576-600 is my Case 23. Probe at the head: one and two people in IL, 2018-2026, at 12 times the published level. The model limit equals the published level in 18 of 18 cases, and all 18 are eligible (in round 3, 7 of the 10 cases for 2018-2022 were ineligible). Mutations: np.round in place of the half-up step fails only Case 23, and rounds_to_nearest_monthly false from 2018 fails only Case 23. |
| G8 | RESOLVED | "Notes for reviewers" now has my sentence: the flags make the aged, blind and disabled comparison inclusive for California, and the medically needy, MSP and Working Disabled Program formulas already use <=. The CI box is ticked. Optional: the box says "CI passes at 753c6082c8 (34 of 34)". At this head, CI is 33 of 33. |
| C1, SA1, SA2, G1-G5 | RESOLVED (round 3) | The files that these items rest on did not change in this round (see Scope). TA passes 59 of 59, including the G1 exact-limit cases at TA:799 and TA:808. TMN Cases 28-33, TMSP and TW pass. |
| G6 | DEFERRED (accepted) | Item 2 of #10542 (open) tracks the renewal phase-in. The body's "Limitations" section still documents it. |
| G7 | DEFERRED (accepted) | Item 1 of #10542 (open) tracks the date recheck and the future DHCS letter. |
New findings
Critical
None.
Should address
None.
Suggestions
None.
Investigated and cleared
- C2 arithmetic (Case 23). The 2022 poverty guideline is $13,590 / $18,310, and the 2025 guideline is $15,650 / $21,150. 2022: 13,590 / 12 = 1,132.50, half up to 1,133, x 12 = 13,596; 18,310 / 12 = 1,525.83, to 1,526, x 12 = 18,312. 2025: 21,150 / 12 = 1,762.50, cents dropped, 1,762, x 12 = 21,144; 15,650 / 12 = 1,304.17, to 1,304, x 12 = 15,648. These match the test and the IDHS captures.
- #10386 merge and California. The Maine savings exclusion in
is_optional_senior_or_disabled_asset_eligible.pyapplies onlywhere(state == "ME", ...), so it is 0 for California.covers_blind_or_disabled.yamlis true for CA from 2018, so the CA pathway is unchanged. The four Maine cases aremain's, and their arithmetic is right (9,000 - 8,000 = 1,000 < 2,000; 10,000 - 8,000 = 2,000, not under 2,000; 14,000 - 12,000 = 2,000 < 3,000; 15,000 - 12,000 = 3,000, not under 3,000). - TA merge result. TA has 53 cases at
5f23a26bf8and 59 at the head. Againstmain, TA adds 99 lines and deletes none. This matches the body. - Changelog. Against
main, the branch adds onlyca-medi-cal-asset-limit-2027.fixed.md(unchanged) and #10374'smedicaid-medically-needy-limits.fixed.md. The release ina8ffdcd1f7removedca-capi-ssi-ssp-standard.fixed.md, and the branch keeps it removed. Step 2 of the body still covers the #10374 fragment. - PR body. The merged heads, the TA count (53 + 6 = 59), the TMN numbering (Cases 28-33 after #10374's Cases 1-27, at
TMN:704-831) and the stacking steps match the head. Theaxiom:line isqueued(process note only).
Out of scope / follow-up
- #10374's cancelled contrib shard and its remaining items belong to #10374's review.
- The microsimulation was not run.
Tests run
- At the head,
pytest policyengine_us/tests/test_parameter_files.py: 8 passed. - At the head, the YAML folder
gov/hhs/medicaid/eligibility/categories/medically_needy: 66 passed (TMN 34, TL 23, and the two other files). The wholegov/hhs/medicaid/eligibility/categoriesfolder: 419 passed. - Per file or folder: TA 59 passed, TMSP 25 passed,
gov/states/ca/chhs/wdp27 passed (TW 14,ca_wdp_eligible10, and the rest). - IL probe (18 cases, 2018-2026): 18 of 18 at the published level and eligible.
- Mutations on a scratch copy (deleted after use): 2 of 2 caught, each by Case 23 only.
- Trial merges (
git merge-tree): clean withmain7a58b4fa2e. After a simulated squash of #10374, insertion-only conflicts inMN/individual.yaml,MN/couple.yamland TMN, as the body says.
Verdict
APPROVE: C2 is resolved, because this branch now carries #10374's tested Illinois rounding fix, identical to #10374's current head. G8 is applied. Every earlier item is resolved or accepted as deferred to #10542. The merges did not change any California Medi-Cal asset file or test, and CI is 33 of 33 green. Merge #10374 first (after a re-run of its cancelled shard), then this PR, with the body's stacking steps.
…0240 and PolicyEngine#10378) into ca-medi-cal-asset-limit-2027 Resolves the conflicts from PolicyEngine#10374's squash: keeps main's medically needy files, adds this PR's SB 164 references and 2027-07-01 rows to the asset limits, and appends this PR's medically needy cases as Cases 31-36. medicaid_medically_needy_income_limit.yaml is main's, so it leaves this PR's diff. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…al-asset-limit-2027 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #10465
What and why
California's budget trailer bill SB 164 (Statutes of 2026, Chapter 27; approved June 29, 2026) lowers the non-MAGI Medi-Cal asset limit on July 1, 2027. PolicyEngine kept $130,000 for one person and $195,000 for two in every later year. This PR adds the cut to the four California asset limits the model uses. The aged, blind and disabled limit's missing July 1, 2022 step ($130,000 / $195,000) is in #10364, not here.
medicaid.eligibility.categories.senior_or_disabled.assets.limit.{individual,couple}medicaid.eligibility.categories.medically_needy.limit.assets.{individual,couple}medicare.savings_programs.eligibility.asset.state_limit.{individual,couple}states.ca.chhs.wdp.eligibility.asset.{base,two_people,additional_person}(250% Working Disabled Program)Working Disabled Program
WIC 14007.9(a)(1)(C) caps a Working Disabled Program applicant's resources at "the maximum levels established in subdivision (a) of Section 14005.62". So the program takes the new schedule too.
The old formula, base plus $65,000 for each person after the first, cannot express $21,000 / $31,000 / +$1,550. The PR therefore:
two_peopleparameter ($195,000, then $31,000);additional_personthe amount for each person beyond two ($65,000, then $1,550);ca_wdp_asset_eligibleto use them.Because $195,000 = $130,000 + $65,000, every limit before July 1, 2027 is unchanged.
Sources
The statute and DHCS agree on the amounts and dates, so this PR records no source conflict.
MSP and the federal floor
msp_asset_eligibletests resources against the higher of the federal MSP limit and the state limit, because a state may be less restrictive than federal law but not more. The federal limit is $9,950 / $14,910 in 2026 and is indexed to CPI. That is well under $21,000 / $31,000, so the higher limit is California's, which matches sec. 71.Timing
is_optional_senior_or_disabled_asset_eligible,is_medically_needy_for_medicaidandca_wdp_asset_eligibleare annual variables. They read the January 1 value, so they first use the lower limits in 2028. A comment above each July 2027 row says so.msp_asset_eligibleis monthly and switches in July 2027.Limitations
Notes for reviewers
ec16e0fc99), and Limit Arkansas's Medicaid aged, blind and disabled pathway to aged people, and apply Maine's savings exclusion and couple disregard #10386 (70eac3c751) later added four cases to the same test file. This branch tookmain'sis_optional_senior_or_disabled_asset_eligible.yaml(53 cases) and appended this PR's six cases, giving 59. The twosenior_or_disabledlimit files merged cleanly: $2,000 → $130,000 from July 2022 (Update Medicaid aged, blind and disabled pathway disregards and asset limits (CA, CT, MN, MO, AR, OK, SC) #10364) → no limit in 2024-2025 → $130,000 from 2026 → $21,000 from July 2027 (this PR), and the matching couple series.main, addedindividual_limit_inclusiveandcouple_limit_inclusiveflags, true for California (22 CCR 50420(a); WIC 14005.40(c)(5)). The flags make the aged, blind and disabled comparison inclusive for California. The medically needy, MSP and Working Disabled Program formulas already use<=. So all four count resources equal to the limit as within it.Test plan
ca_wdp_asset_eligible.yaml):make format(ruff)changelog.d/753c6082c8(34 of 34; tests were not run locally)No file in
tests/policy/baseline/partners/changes.axiom: TheAxiomFoundation/rulespec-us#1925 queued
🤖 Generated with Claude Code