Repository navigation
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>
Brings in main's CI fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in main's CI fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in main's CI fix. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mississippi's general exclusion applies to all of the applicant's own income (23 Miss. Admin. Code Part 104, Rule 4.2(C)(1)), so it does not exclude contributions. Listing it also satisfies the guard against single-member breakdown parameters. Results are unchanged. 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 1, full review.
IDs: C = critical, SA = should address, G = suggestion.
Paths: ABD/ = policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/senior_or_disabled/assets/limit/, MN/ = policyengine_us/parameters/gov/hhs/medicaid/eligibility/categories/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 under policyengine_us/tests/policy/baseline/gov/: TA = hhs/medicaid/eligibility/categories/is_optional_senior_or_disabled_asset_eligible.yaml, TMN = hhs/medicaid/eligibility/categories/medically_needy/is_medically_needy_for_medicaid.yaml, TMSP = hhs/medicare/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. Every PDF link uses the file page number.
Source Documents
- Reviewed head SHA: 8f9c019
- Mode: full
- Scope: this PR's own commits; stacked on #10374 and #10360. The own commits are
0ca586c1d9,a0ac0c2658,9705eae0b4and35b23f9de7(15 files, +633/-4). The analysis ran at4579b28e77. The head moved only by a merge ofmain, which changes no file in this scope, so every finding holds at the head. - SB 164 (Stats. 2026, ch. 27, approved June 29, 2026), bill text, secs. 68-71 of the chaptered text.
- AB 173 (Stats. 2026, ch. 252), bill text, sec. 16.
- WIC 14005.40(c)(5) and 14007.9(a)(1)(C), current text.
- DHCS letters (PDF, Wayback captures, read as images): ACWDL 21-31 pages 1-4, ACWDL 22-25 pages 2 and 5, ACWDL 25-14 pages 1, 2, 8 and 9.
- DHCS pages (Wayback, October 18, 2026): Asset Limit FAQ, Working Disabled Program, and the 2026 letter archive (26-01 to 26-04 and 26-08 only).
- Years: values checked 2022-2028. The PR's tests use 2026-2028.
Branch Status
- The branch is 26 commits ahead and 6 behind
main(8ea43422e6). It is MERGEABLE, and a merge withmainis clean. CI: 33 pass, 0 fail. - This branch carries #10374 (medically needy limits) and #10360 (MSP state asset rules), so their changes show in this diff. Their items are in their own reviews and are not counted here. After both merge, merge
maininto this branch, removechangelog.d/medicaid-medically-needy-limits.fixed.mdandchangelog.d/msp-state-asset-income-rules.fixed.mdwithgit rm, and resolve the insertion-only conflicts, as the PR body says. - #10360 (head
7291aa7713) now adds its own Case 21 toTMSP, a new conflict. Keep both blocks and renumber this PR's MSP cases to 22-25. Its ACWDL 21-31 title fix inMSP/merges cleanly. - #10364 (head
45120fa173) carries California's July 2022 ABD step ($130,000 / $195,000) and the inclusive-limit flags; this PR removed its own copy of that step in35b23f9de7. The twoABD/files merge cleanly into 2,000 → 130,000 (2022-07) →.inf(2024) → 130,000 (2026) → 21,000 (2027-07), and the matching couple series. OnlyTAconflicts. The body's recipe still gives 45 cases, and the resolved file passes. After the SA fixes, the samesed -n '148,$p'tail carries the new cases; use the new head SHA. The PR that merges second also applies G1. - Process note: the body cites heads
d3314169a7(#10364),c1b120a6ed(#10374) andaf3e256ab5(#10360). All three have moved; the recipe still holds. - #10370, #10386, #10394 and #10240 conflict with this branch in test files. This PR's MN cases declare
marital_units, so #10370's move to the marital unit does not change their results.
What the PR gets right
- Every added amount and date matches SB 164 sec. 69 and the DHCS FAQ: $21,000 / $31,000 / +$1,550 for each member beyond two, up to 10, from July 1, 2027. The earlier $130,000 / $195,000 / +$65,000 stay unchanged (sec. 68; ACWDL 21-31 page 4; 25-14 page 9). A probe for sizes 1-12 found 0 mismatches.
- The PR finds all four readers of California's non-MAGI asset limit. Adding the Working Disabled Program through WIC 14007.9(a)(1)(C) is a good catch; ACWDL 25-14 page 8 lists the 250% WDP as affected.
- The new
two_peopletier is the smallest change that can express the new schedule. Results before July 2027 are identical ($195,000 = $130,000 + $65,000). - The timing is honest: a comment above each July 2027 row says that annual variables read January 1, and "Limitations" covers the renewal phase-in.
- Of 50 small code and parameter changes, the tests catch 38. The MN, MSP and WDP one-person rows are pinned on both sides of the date and the amount, and every WDP formula change is caught.
- The stacking steps and the #10364 recipe are clear. The changelog fragment is correct, and no partner test is touched.
Critical (Must Fix)
None.
Should Address
SA1. The tests do not pin the new aged, blind and disabled limits of $21,000 and $31,000 to the dollar.
- Where:
ABD/individual.yaml:32andABD/couple.yaml:32; the eligible 2028 cases atTA:184-214. - Evidence: the eligible cases sit $1,000 under the new limits. With the strict
<onmain(policyengine_us/variables/gov/hhs/medicaid/eligibility/categories/is_optional_senior_or_disabled_asset_eligible.py:32), a limit of $20,500 or $30,500 passes all 81 cases in the five related test files. The same rows in MN, MSP and WDP are pinned to the dollar. - The body chose $20,000 and $30,000 so that the result does not depend on the operator. $20,999 and $30,999 have the same property: they pass at this head and on the tree merged with #10364.
- Why SA: a missing edge case for an already-tested variable.
- Fix (ran: both cases pass at the head, and each fails when the limit is $20,500 or $30,500). Append to
TAafter line 223, or change the cases atTA:184-214to these amounts:
- name: assets one dollar below the July 2027 CA limit in 2028, eligible
period: 2028
input:
ssi_countable_resources: 20_999
state_code: CA
output:
# 20,999 is under the 21,000 limit that applies from July 2027.
is_optional_senior_or_disabled_asset_eligible: true
- name: joint filers one dollar below the July 2027 CA couple limit in 2028, eligible
period: 2028
input:
people:
person1:
ssi_countable_resources: 15_499
person2:
ssi_countable_resources: 15_500
marital_units:
marital_unit1:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: CA
tax_units:
tax_unit:
members: [person1, person2]
tax_unit_is_joint: true
output:
# 15,499 + 15,500 = 30,999 is under the 31,000 couple limit.
is_optional_senior_or_disabled_asset_eligible: [true, true]SA2. The couple and multi-person rows have no test before the change, and the new 2024 .inf row has no test.
- Where:
ABD/couple.yaml:32,MN/couple.yaml:52,WDP/two_people.yaml:4,7andWDP/additional_person.yaml:5. - Evidence: each one-person row has a 2027 "still eligible" case (
TA:216-223,TMN:469,TW:150). The couple and multi-person rows have only 2028 cases. If one of these four rows starts on 2027-01-01, all 81 cases still pass, and the annual variables apply the cut a year early. If thetwo_people2024-01-01.infrow is removed, all cases also pass, and a two-person WDP household in 2024-2025 gets a $195,000 limit. ACWDL 22-25 page 2 says the limits were "eliminated". - Why SA: missing edge cases for already-tested variables (the switch dates).
- Fix (ran: all five cases pass at the head, and each fails on the change it pins). Append to
TAafter line 223:
- name: joint filers above the July 2027 CA couple limit in 2027, still eligible
period: 2027
input:
people:
person1:
ssi_countable_resources: 15_500
person2:
ssi_countable_resources: 15_501
marital_units:
marital_unit1:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: CA
tax_units:
tax_unit:
members: [person1, person2]
tax_unit_is_joint: true
output:
# January 1, 2027 still reads the 195,000 couple limit; 31,000 first applies in 2028.
is_optional_senior_or_disabled_asset_eligible: [true, true]Append to TMN after line 484:
- name: Case 21, California senior couple with assets above the July 2027 couple limit is still eligible in 2027.
period: 2027
input:
people:
person1:
age: 72
is_adult_for_medicaid: false
is_optional_senior_or_disabled_for_medicaid: false
is_ssi_recipient_for_medicaid: false
ssi_countable_income: 9_000
medicaid_medically_needy_medical_expenses: 4_000
ssi_countable_resources: 15_500
person2:
age: 70
is_adult_for_medicaid: false
is_optional_senior_or_disabled_for_medicaid: false
is_ssi_recipient_for_medicaid: false
ssi_countable_income: 9_000
medicaid_medically_needy_medical_expenses: 4_000
ssi_countable_resources: 15_501
tax_units:
tax_unit:
members: [person1, person2]
tax_unit_is_joint: true
marital_units:
marital_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: CA
output:
# Limit 934 x 12 = 11,208. (9,000 - 4,000) x 2 = 10,000 is under it. January 1,
# 2027 still reads the 195,000 couple limit; 31,000 first applies in 2028.
is_in_medicaid_medically_needy_category: [true, true]
is_medically_needy_for_medicaid: [true, true]Append to TW after line 270:
- name: Case 12, two-person tax unit above the July 2027 two-person limit is still eligible in 2027.
period: 2027
input:
people:
person1:
age: 45
ssi_countable_resources: 15_500
person2:
age: 43
ssi_countable_resources: 15_501
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: CA
output:
# January 1, 2027 still reads the 195,000 two-person limit; 31,000 first
# applies in 2028.
ca_wdp_asset_eligible: [true, true]
- name: Case 13, three-person tax unit at the 2027 three-person limit is eligible.
period: 2027
input:
people:
person1:
age: 45
ssi_countable_resources: 130_000
person2:
age: 43
ssi_countable_resources: 130_000
person3:
age: 10
tax_units:
tax_unit:
members: [person1, person2, person3]
households:
household:
members: [person1, person2, person3]
state_code: CA
output:
# January 1, 2027 reads 195,000 + 1 x 65,000 = 260,000. 130,000 + 130,000
# + 0 = 260,000 is at it; resources may not exceed it.
ca_wdp_asset_eligible: [true, true, true]
- name: Case 14, two-person tax unit with large assets is eligible in 2025, when no asset limit applied.
period: 2025
input:
people:
person1:
age: 45
ssi_countable_resources: 500_000
person2:
age: 43
ssi_countable_resources: 500_000
tax_units:
tax_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code: CA
output:
# ACWDL 22-25 eliminated the limit from January 1, 2024; ACWDL 25-14
# reinstated it from January 1, 2026.
ca_wdp_asset_eligible: [true, true]Suggestions
G1. Move the 2028 aged, blind and disabled cases to the exact limits when #10364 and this PR meet.
- Where:
TA:184-214. The strict<is inis_optional_senior_or_disabled_asset_eligible.py:32onmain; this PR does not change it. - Evidence: WIC 14005.40(c)(5) says countable resources "do not exceed" the 14005.62 levels, so $21,000 qualifies. At this head, $21,000 and $15,500 + $15,500 in 2028 return false. #10364 makes California's comparison inclusive. On the merged tree both exact cases pass, and the existing $21,001 and $31,001 cases then catch a limit raised by $1.
- Why a suggestion: the strict comparison is on
main, #10364 fixes it, and the body already plans this step. - Fix (ran on the tree merged with #10364: the resolved
TA, these cases and the SA cases, 54 passed; it fails at this head by design). The PR that merges second changes the two eligible 2028 cases:
- name: assets at the July 2027 CA limit in 2028, eligible
period: 2028
input:
ssi_countable_resources: 21_000
state_code: CA
output:
# Resources may not exceed 21,000 (WIC 14005.40(c)(5)).
is_optional_senior_or_disabled_asset_eligible: trueIn the couple case, use 15_500 for both people, the name "joint filers at the July 2027 CA couple limit in 2028, eligible", and the comment "15,500 + 15,500 = 31,000 does not exceed the couple limit."
G2. Remove a max_ that can never bind.
- Where:
V:25. - Evidence:
where(capped_size >= 2, ...)uses the first branch only whencapped_size - 2is 0 or more. Withoutmax_, all 81 cases pass. The repo style drops amin_ormax_that can never bind. - Why a suggestion: dead code with no effect on results.
- Fix (ran;
ruff format --checkis clean):
p.two_people + (capped_size - 2) * p.additional_person,G3. Correct the ACWDL 21-31 title.
- Where:
WDP/two_people.yaml:16. - Evidence: the title says "Asset Limit Changes for Non-MAGI Medi-Cal (Phase I)". The subject on page 1 of the letter is "Increases to the Asset Limits for Non-Modified Adjusted Gross Income Medi-Cal Programs". The link, letter number and pages are correct, so the value is corroborated. #10360 made the same correction in its MSP files.
- Fix (ran):
- title: "California DHCS All County Welfare Directors Letter 21-31, Increases to the Asset Limits for Non-Modified Adjusted Gross Income Medi-Cal Programs #page 2-4"G4. Give additional_person the same letters as two_people.
- Where:
WDP/additional_person.yaml:11-17. - Evidence: the $65,000 from 2022-07-01 cites only the DHCS WDP page. ACWDL 21-31 pages 2 and 4 and ACWDL 25-14 pages 1 and 9 state "$65,000 for each additional person" directly, and
two_people.yamlalready cites these letters. - Fix (not run; references only):
- title: "California DHCS All County Welfare Directors Letter 21-31, Increases to the Asset Limits for Non-Modified Adjusted Gross Income Medi-Cal Programs #page 2,4"
href: https://www.dhcs.ca.gov/services/medi-cal/eligibility/letters/Documents/21-31.pdf#page=2
- title: "California DHCS All County Welfare Directors Letter 25-14, Reinstatement of Asset Limits for Non-MAGI Medi-Cal Programs #page 1,9"
href: https://www.dhcs.ca.gov/services/medi-cal/eligibility/letters/Documents/25-14.pdf#page=1G5. The body's note on a WIC 14005.11 gap is out of date.
- Where: the PR body, last bullet of "Notes for reviewers"; optionally
MSP/individual.yaml:17-18andMSP/couple.yaml:17-18. - Evidence: AB 173 sec. 16 amends the version of WIC 14005.11 from SB 164 sec. 70, so that version "shall become inoperative on July 1, 2027". That is the day sec. 71's version starts, so there is no gap. No value changes.
- Fix: replace the bullet with "AB 173 (Stats. 2026, ch. 252) sec. 16 moved the earlier WIC 14005.11 to inoperative on July 1, 2027, the day the sec. 71 version starts." Optionally add this reference to both MSP files (not run):
- title: California Assembly Bill 173 (Statutes of 2026, Chapter 252), Section 16 - Welfare and Institutions Code 14005.11(h), inoperative July 1, 2027
href: https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=202520260AB173G6. Mid-year start and renewal phase-in (documented choice).
- Where: the comments above the July 2027 rows (
ABD/*.yaml:31,MN/*.yaml:51,WDP/base.yaml:6,WDP/two_people.yaml:6,WDP/additional_person.yaml:4) andMSP/*.yaml:27. - Evidence: new WIC 14005.62(b) and 14005.11(b) apply the new limit to enrolled people from their first annual redetermination on or after July 1, 2027. The annual variables use $130,000 for all of 2027 and $21,000 for all of 2028. So 2027 overstates eligibility for July-December 2027 applicants with $21,000-$130,000 ($31,000-$195,000 for couples), and 2028 understates it for enrollees who renew later in 2028. The monthly MSP understates it for enrollees in that band until renewal, for up to 12 months. No run measures the size.
- Why a suggestion: a deliberate choice, documented in the YAML comments and "Limitations"; the model has no redetermination-date input.
- Fix: none needed. Optionally open a tracked issue for the renewal phase-in.
G7. DHCS has not yet issued a county letter on the 2027 limits.
- Where: the 2027-07-01 rows in all four programs.
- Evidence: new WIC 14005.62(a)(2) starts the limit after the director's systems determination "and no sooner than July 1, 2027", and (e) requires federal approval. No 2026 letter covers these limits. The FAQ states July 1, 2027; the WDP page still shows $130,000 / $65,000.
- Why a suggestion: the statutory date is the right default, and the body says so.
- Fix: open a tracked follow-up to recheck the date and cite the letter when DHCS issues it.
Investigated and cleared
- Program scope. ABD through WIC 14005.40(c)(5), MSP through the new 14005.11(a), WDP through 14007.9(a)(1)(C). MAGI groups are exempt: no MAGI path reads these parameters.
- Citations. The chapter, section and subdivision are correct in all nine SB 164 references and the WIC 14007.9(a)(1)(C) references. The bill page has no section anchors, so a bill-level link is right.
- WDP formula. It equals the old formula before July 2027 (WDP Cases 1 and 9 pass).
- Periods. Annual variables read January 1; MSP is monthly and switches in July 2027.
- MSP federal floor. $9,950 / $14,910 in 2026 is below both California schedules, so
max_returns California's amount. additional_personmeaning. It now means each person beyond two. Earlier values do not change, and no other file reads it. A saved reform that edits it now changes only households of three or more; a changelog sentence for API users is optional.
Out of scope / follow-up
- The WDP limits before July 2022 take the 2022 values; ACWDL 21-31 page 1 gives $2,000 per person and $3,000 for two before that.
two_people.yamlfollowsmain'sbase.yaml, so nothing changes againstmain. WDP/max_people.yaml(not in the diff) cites only the DHCS page. SB 164 secs. 68 and 69 now put the 10-member cap in statute.- The ABD, MN and MSP limits hold only one-person and couple amounts, so +$1,550 applies only in WDP (documented).
- In the stacked PRs' own reviews: the MN tax-unit sums (#10374), the MSP couple test on
spm_unit_is_married(#10360), and the ACWDL 21-31 "(Phase I)" title in #10374's MN files and #10364's ABD files. - The microsimulation was not run.
Validation Summary
| Check | Result |
|---|---|
| CI | 8f9c019428: 33 pass, 0 fail |
| Local tests | The four touched test files and ca_wdp_eligible.yaml: 81/81 at the head. At 4579b28e77 (same PR files): Medicaid 738, Medicare 324, CA chhs and dhcs 101, partner healthcare 70 and CA 91 (read-only) |
| Fix runs | SA1, SA2, G2 and G3 at the head: 88 passed (81 + 7); ruff format --check clean. G1 on the tree merged with #10364: 54 passed |
| Mutation | 50 changes: 38 caught; the SA cases catch 7; 2 equivalent; 2 catchable only after #10364; 1 structural (MAGI) |
| References and law | All values corroborate. One wrong title (G3); one out-of-date body note (G5) |
| Merge trials | main and #10374 clean. #10360: TMSP. #10364: TA, recipe holds |
| Partner contract tests | None edited |
| PR body | Accurate apart from G5 and the old head SHAs. axiom: line present (process note, not counted) |
| Other reviews | None |
Review Severity: REQUEST_CHANGES
Two should-address test gaps are open (SA1, SA2), and one set of seven cases closes both. There are no critical items and seven suggestions.
Next Steps
To auto-fix issues: run the fix-pr workflow for this PR.
- Add the seven test cases in SA1 and SA2.
- Take the suggestions that you agree with. G2, G3 and G4 are small edits.
- Run
make format, then the four touched test files andca_wdp_eligible.yaml. - After #10374 and #10360 merge, merge
main, remove their two changelog fragments, keep #10360's new MSP Case 21, and renumber this PR's MN and MSP cases. - With #10364, the PR that merges second applies the
TArecipe and G1. - Update the body: the AB 173 note (G5) and the head SHAs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SA1: test the 2028 aged, blind and disabled limits one dollar below $21,000 and $31,000. SA2: add 2027 couple and multi-person cases for the January 1 read and a 2025 WDP case for the eliminated limit. G2: drop a max_ that cannot bind. G3/G4: correct the ACWDL 21-31 title and cite ACWDLs 21-31 and 25-14 for additional_person. G5: cite AB 173 sec. 16 in the MSP state limit files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# 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 # 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>
|
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>
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