Skip to content

Lower California's non-MAGI Medi-Cal asset limit to $21,000 / $31,000 on July 1, 2027 - #10375

Open
hua7450 wants to merge 50 commits into
PolicyEngine:mainfrom
hua7450:ca-medi-cal-asset-limit-2027
Open

hua7450 wants to merge 50 commits into
PolicyEngine:mainfrom
hua7450:ca-medi-cal-asset-limit-2027

Conversation

@hua7450

@hua7450 hua7450 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Closes #10465

Stacked on #10374. #10360 and #10364 are merged and this branch has merged main after them, so their changes no longer show here. #10374 is merged into this branch, so its changes show in this diff until it merges. Merged heads: #10374 bdb48a7b2c and main at 5f23a26bf8.

After #10374 is squash-merged:

  1. Merge main into this branch.
  2. If the release has already removed changelog.d/medicaid-medically-needy-limits.fixed.md from main, run git rm changelog.d/medicaid-medically-needy-limits.fixed.md, so it is not released twice.
  3. Resolve the conflicts. They are insertion-only: keep main's text and add this PR's California rows, SB 164 references and cases.

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.

Parameter (CA) Through June 30, 2027 From July 1, 2027
medicaid.eligibility.categories.senior_or_disabled.assets.limit.{individual,couple} $130,000 / $195,000 (none in 2024-2025; the July 2022 step is in #10364) $21,000 / $31,000
medicaid.eligibility.categories.medically_needy.limit.assets.{individual,couple} $130,000 / $195,000 $21,000 / $31,000
medicare.savings_programs.eligibility.asset.state_limit.{individual,couple} $130,000 / $195,000 $21,000 / $31,000
states.ca.chhs.wdp.eligibility.asset.{base,two_people,additional_person} (250% Working Disabled Program) $130,000 / $195,000 / +$65,000 for each person beyond two $21,000 / $31,000 / +$1,550 for each person beyond two (up to 10 people)

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:

  • adds a two_people parameter ($195,000, then $31,000);
  • makes additional_person the amount for each person beyond two ($65,000, then $1,550);
  • changes ca_wdp_asset_eligible to use them.

Because $195,000 = $130,000 + $65,000, every limit before July 1, 2027 is unchanged.

Sources

  • SB 164, sec. 68, amends Welfare and Institutions Code (WIC) 14005.62 and keeps the $130,000 disregard plus $65,000 per additional member. Subdivision (e) says: "This section shall become inoperative on July 1, 2027".
  • SB 164, sec. 69, adds a new WIC 14005.62. For "an applicant or beneficiary whose eligibility is not determined using the modified adjusted gross income (MAGI)-based financial methods", subdivision (a)(1) sets "a resource limit of twenty-one thousand dollars ($21,000) in nonexempt property for a household with one member, thirty-one thousand dollars ($31,000) in nonexempt property for a household with two members, and one thousand five hundred fifty dollars ($1,550) for each additional household member, up to a maximum of 10 members". Subdivision (f) says: "This section shall become operative on July 1, 2027."
  • SB 164, sec. 71, re-adds WIC 14005.11 (Medicare Savings Programs), operative July 1, 2027. MSP resources must "not exceed the amount specified in subdivision (a) of Section 14005.62", so the cut also applies to MSP.
  • WIC 14005.40(c)(5) (aged and disabled FPL program): "Countable resources, as determined in accordance with subdivision (a) of Section 14005.62, do not exceed the maximum levels established in that section."
  • WIC 14007.9(a)(1)(C) (Stats. 2025, ch. 21, sec. 78, operative January 1, 2026): "The individual’s countable resources shall not exceed the maximum levels established in subdivision (a) of Section 14005.62."
  • ACWDL 21-31 (file pages 2-4) for the Working Disabled Program's July 1, 2022 history: "Effective July 1, 2022, the asset limits for Non-MAGI programs will increase to $130,000 for one person, and $65,000 for each additional person". Page 3 lists the ABD FPL aid codes and the 250% Working Disabled Program; page 4 shows "2 people $195,000".
  • Bill text: https://leginfo.legislature.ca.gov/faces/billTextClient.xhtml?bill_id=202520260SB164
  • DHCS Asset Limit FAQ (https://www.dhcs.ca.gov/medi-cal/help/asset-limit-frequently-asked-questions/) gives the same figures: $130,000 plus $65,000 "Through June 30, 2027", and "Starting July 1, 2027" $21,000 for one person, $31,000 for two and $1,550 for each extra person. I found no DHCS county letter on the 2027 limits yet. DHCS's MSP and Working Disabled Program pages still list only the current limit.

The statute and DHCS agree on the amounts and dates, so this PR records no source conflict.

MSP and the federal floor

msp_asset_eligible tests 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_medicaid and ca_wdp_asset_eligible are 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_eligible is monthly and switches in July 2027.
  • The new WIC 14005.62(a)(2) also requires the director to certify that systems are ready, "and no sooner than July 1, 2027". Implementation is also subject to federal approval under (e). This PR uses the operative date in the statute and DHCS's FAQ.

Limitations

  • Follow-up Recheck California's July 2027 non-MAGI asset limit date when DHCS issues its county letter, and track the renewal phase-in #10542: recheck the July 1, 2027 date when DHCS issues its county letter, and track the renewal phase-in below.
  • New WIC 14005.62(b) and 14005.11(b) apply the new limit to people already enrolled only from their first annual redetermination on or after July 1, 2027. PolicyEngine has no redetermination-date input, so it applies the limit to everyone from that date.
  • The aged, blind and disabled, medically needy and MSP parameters cover one person or a couple only, so the $1,550 for each member after the second is encoded only for the Working Disabled Program, as was the earlier $65,000.

Notes for reviewers

Test plan

  • YAML cases come from the statute and ACWDL amounts:
    • Aged, blind and disabled:
      • 2027: one person at $21,001 and a couple at $31,001 are still eligible (the January 1 read).
      • 2028: ineligible at $21,001 for one person and $31,001 for a couple (each spouse under $21,000); eligible at exactly $21,000 and $31,000.
    • Medically needy:
      • 2027: one person at $21,001 and a couple at $31,001 are still eligible.
      • 2028: ineligible at $21,001 and $31,001; eligible at exactly $21,000 and $31,000.
    • MSP: at $21,001 and $31,001, eligible in June 2027 and ineligible from July 2027. At exactly $21,000 and $31,000, eligible in July 2027.
    • Working Disabled Program (new ca_wdp_asset_eligible.yaml):
      • 2025: a couple with $1,000,000 is eligible (no limit in 2024-2025).
      • 2026: a couple at $195,000 and three people at $260,000 are eligible.
      • 2027: one person at $21,001 and a couple at $31,001 are still eligible, and three people at $260,000 are eligible.
      • 2028: one person at $21,000 and $21,001; a couple at $31,000 and $31,001; three people at $32,550 and $32,551; eleven people at $43,400 and $43,401, with the household capped at 10.
  • Source conflicts: not applicable.
  • make format (ruff)
  • Changelog fragment in changelog.d/
  • CI passes at 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

hua7450 and others added 6 commits October 21, 2026 16:30
- 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>
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>
hua7450 and others added 2 commits October 26, 2026 16:43
…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>
hua7450 and others added 5 commits October 26, 2026 17:21
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>
hua7450 and others added 5 commits October 26, 2026 20:08
# 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>
hua7450 and others added 4 commits October 27, 2026 15:58
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 PavelMakarchuk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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, 9705eae0b4 and 35b23f9de7 (15 files, +633/-4). The analysis ran at 4579b28e77. The head moved only by a merge of main, 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 with main is 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 main into this branch, remove changelog.d/medicaid-medically-needy-limits.fixed.md and changelog.d/msp-state-asset-income-rules.fixed.md with git rm, and resolve the insertion-only conflicts, as the PR body says.
  • #10360 (head 7291aa7713) now adds its own Case 21 to TMSP, a new conflict. Keep both blocks and renumber this PR's MSP cases to 22-25. Its ACWDL 21-31 title fix in MSP/ 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 in 35b23f9de7. The two ABD/ files merge cleanly into 2,000 → 130,000 (2022-07) → .inf (2024) → 130,000 (2026) → 21,000 (2027-07), and the matching couple series. Only TA conflicts. The body's recipe still gives 45 cases, and the resolved file passes. After the SA fixes, the same sed -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) and af3e256ab5 (#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_people tier 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:32 and ABD/couple.yaml:32; the eligible 2028 cases at TA:184-214.
  • Evidence: the eligible cases sit $1,000 under the new limits. With the strict < on main (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 TA after line 223, or change the cases at TA:184-214 to 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,7 and WDP/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 the two_people 2024-01-01 .inf row 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 TA after 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 in is_optional_senior_or_disabled_asset_eligible.py:32 on main; 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: true

In 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 when capped_size - 2 is 0 or more. Without max_, all 81 cases pass. The repo style drops a min_ or max_ that can never bind.
  • Why a suggestion: dead code with no effect on results.
  • Fix (ran; ruff format --check is 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.yaml already 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=1

G5. 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-18 and MSP/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=202520260AB173

G6. 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) and MSP/*.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_person meaning. 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.yaml follows main's base.yaml, so nothing changes against main.
  • 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.

  1. Add the seven test cases in SA1 and SA2.
  2. Take the suggestions that you agree with. G2, G3 and G4 are small edits.
  3. Run make format, then the four touched test files and ca_wdp_eligible.yaml.
  4. 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.
  5. With #10364, the PR that merges second applies the TA recipe and G1.
  6. Update the body: the AB 173 note (G5) and the head SHAs.

hua7450 and others added 6 commits October 29, 2026 13:37
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>
@hua7450

hua7450 commented Oct 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Thanks, Pavel. Round 1 is addressed at head c3b93ce373. Line numbers below are at that head.

Paths:

  • TA = policyengine_us/tests/policy/baseline/gov/hhs/medicaid/eligibility/categories/is_optional_senior_or_disabled_asset_eligible.yaml
  • TMN = .../medically_needy/is_medically_needy_for_medicaid.yaml
  • TMSP = .../medicare/savings_programs/eligibility/msp_asset_eligible.yaml
  • TW = .../states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.yaml
  • V = policyengine_us/variables/gov/states/ca/chhs/wdp/eligibility/ca_wdp_asset_eligible.py
Item Status Where
SA1 Fixed. I changed the two 2028 eligible cases to your one-dollar-below amounts ($20,999; $15,499 + $15,500 = $30,999), keeping your names and comments. TA:184, TA:193
SA2 Fixed, all five cases verbatim. Your medically needy "Case 21" is now Case 29: main now has #10370's Cases 1-10 first, and #10374's cases follow as 11-23. TA:225; TMN:768 (Case 29); TW:272, TW:294, TW:318 (Cases 12-14)
G1 Deferred to the merge with #10364, as you suggested. The PR body's #10364 note gives the recipe (#10364's file plus git show c3b93ce373:<file> | sed -n '148,$p', giving 46 cases) and then the exact-limit cases. PR body, "Notes for reviewers"
G2 Applied: p.two_people + (capped_size - 2) * p.additional_person. V:25
G3 Applied: the ACWDL 21-31 title now reads "Increases to the Asset Limits for Non-Modified Adjusted Gross Income Medi-Cal Programs". policyengine_us/parameters/gov/states/ca/chhs/wdp/eligibility/asset/two_people.yaml:16
G4 Applied: ACWDL 21-31 (pages 2 and 4) and ACWDL 25-14 (pages 1 and 9). .../wdp/eligibility/asset/additional_person.yaml:14-17
G5 Applied. I read AB 173 sec. 16 on leginfo: 14005.11 as amended by SB 164 sec. 70 now has "(h) This section shall become inoperative on July 1, 2027". The body bullet is replaced, and both MSP files cite AB 173. .../medicare/savings_programs/eligibility/asset/state_limit/individual.yaml:19-20, couple.yaml:19-20; PR body
G6 No code change, as you suggested. The renewal phase-in stays a documented limitation and is tracked with G7 in #10542. PR body, "Limitations"
G7 Follow-up opened: #10542 (recheck the 2027-07-01 date and cite the DHCS county letter when it is issued). #10542

Stacking:

Update (head 5a37f33d7f): merged #10374 at 33d10a5f09, which adds its Cases 24-27, and main at 3f24a22578. This PR's medically needy cases are now Cases 28-33, so the SA2 couple case at TMN:768 is now Case 33 at TMN:831. MSP Cases 22-25 are unchanged.

Update (head 753c6082c8): C1 in your second review is addressed by merging #10374 at 0f8b603643, which replaces the single-member IL rounds_down_monthly.yaml with the scalar il/rounds_down_monthly.yaml. I also merged main at ec16e0fc99, which includes #10360 and #10364, and applied G1 with #10364's California inclusive flags: the 2028 eligible cases are now exactly $21,000 and $15,500 + $15,500 (TA:729, TA:738). Medically needy cases remain 28-33 (Case 33 is at TMN:831), and MSP Cases 22-25 are unchanged.

Update (head a8ffdcd1f7): round-3 C2 is addressed by merging #10374 at bdb48a7b2c (Illinois nearest-dollar limits through 2024), then main at 5f23a26bf8. G8 is applied to the PR body. TA now holds main's 53 cases (with #10386's four) plus this PR's six, so the G1 cases are at TA:799 and TA:808. Medically needy Cases 28-33 and MSP Cases 22-25 are unchanged.

hua7450 and others added 4 commits October 29, 2026 13:52
…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 PavelMakarchuk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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 in V:25, G3 in WDP/two_people.yaml:16, G4 in WDP/additional_person.yaml:14-17, and G5 in MSP/individual.yaml:19-20 and MSP/couple.yaml:19-20. The other commits are merges: #10360 at 5bb5a500e0, #10374 at 15059d9cd2 and then 33d10a5f09, and main at b210b45a6c and 3f24a22578. 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 with main is 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 TA conflicts. The ABD/ 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 in TA. #10240 (e3b765b1ce) conflicts in TMN and in #10360's msp_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 from main merges.

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 commit 33d10a5f09 and has a state_code breakdown with one member, IL.
  • Evidence: policyengine_us/tests/test_parameter_files.py::test_enum_breakdown_parameters_do_not_have_single_member_tables reports: "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 from main (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] in medicaid_medically_needy_income_limit.py:42). Then merge #10374's new head into this branch, or merge main after #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); .inf in 2025 (Case 14).
  • Merge resolutions. Compared with #10374's head, TMN adds only this PR's Cases 28-33 at the end. Compared with #10360's head, TMSP adds only Cases 22-25 at the end. No case of theirs is lost or changed. Compared with main, TA and TW have 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:21 and MN/couple.yaml:21 still 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_eligible 10).
  • 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 TA passed 55/55, and with the G1 amounts it also passed 55/55.
  • ruff format --check on V: 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.

hua7450 and others added 4 commits October 29, 2026 17:42
…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 PavelMakarchuk left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

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.
    • 66939956eb merges #10374's head 0f8b603643. It moves the Illinois rounding flag to the scalar medically_needy/limit/income/il/rounds_down_monthly.yaml, reads it in medicaid_medically_needy_income_limit.py:40, adds Case 23 to medicaid_medically_needy_income_limit.yaml, and changes three TMN comments.
    • 753c6082c8 merges main at ec16e0fc99, 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-759 now sit at exactly $21,000 and $15,500 + $15,500 = $31,000 (G1). The ABD/ files took #10364's July 2022 step and Missouri rows, and kept this PR's SB 164 reference and 2027-07-01 rows. The MN/, 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 main and 1 behind. The missing commit is the release d983c32370 (5:48pm EDT). It deletes the #10360, #10363 and #10364 changelog fragments and bumps the version. A trial merge (git merge-tree) with d983c32370 is 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 rm the #10374 fragment if the release removed it, then resolve the insertion-only conflicts in MN/ 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 carries medically_needy/limit/income/il/rounds_down_monthly.yaml and the Illinois branch of medicaid_medically_needy_income_limit.py as 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) and V: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 with ec16e0fc99, the ABD/ 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: main has 49 cases, and with this PR's 6 cases the file has 55. The MSP/ 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's applies.yaml turns the CA MSP asset test off for 2024-2025 and on from 2026, so this PR's MSP/ rows need no .inf row.
  • 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, main ec16e0fc99), 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 main fragments 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:21 and MN/couple.yaml:21 still 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 of gov/hhs/medicaid: 483 passed. gov/hhs/medicare/savings_programs, gov/states/ca/chhs and gov/states/ca/dhcs (Medi-Cal): 199 passed.
  • Per file: TA 55, TMN 34, TMSP 25, TW 14, ca_wdp_eligible 10, medicaid_medically_needy_income_limit 23. 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 main d983c32370 (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.

hua7450 and others added 4 commits October 30, 2026 10:45
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>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Encode SB 164's July 1, 2027 non-MAGI Medi-Cal asset limit (WIC 14005.62)

2 participants