Skip to content

Remove the BBCE net income test from California's Modified Categorical Eligibility - #10036

Draft
MaxGhenis wants to merge 20 commits into
mainfrom
fix-ca-mce-net-income-test
Draft

MaxGhenis wants to merge 20 commits into
mainfrom
fix-ca-mce-net-income-test

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

California Modified Categorical Eligibility (MCE) households lost SNAP when their net income exceeded the regular 100% poverty standard. MCE waives that eligibility standard for every household size. This sets California's elderly/disabled and other BBCE net_applies flags to false; net income continues to determine the benefit amount, and the MCE gross-income limit still applies. A separate California participation screen denies a zero calculated allotment, preserving the positive minimum for one- and two-person households.

#10065 and #10033 are now merged into main. This branch retains its earlier additive merges and merges current main through a plain merge commit; it does not duplicate #10065's changelog entry or change #10033's federal heat-and-eat policy. Case 8 (calendar 2024) has $30,000 wages and three $23 SNAP minimum payments in October, November, and December ($69 annually). California's poverty-guideline cutover is October: the monthly MCE gross ceiling rises to $2,510 against $2,500 wages. The working-person fixture explicitly supplies 30 weekly hours because the core YAML runner does not copy supplied employment_income to employment_income_before_lsr, which SNAP's earnings exemption reads. SNAP adds $0 to CARE/FERA income, so countable income remains $30,000.

Comparison baseline: main at 8ae01aa; final PR head: 8f3369b. This continuation starts from pushed head 55899ea8e97f432d5e863679df09ea9ffe94f2d7. Current-head validation and partner verification are reported below; historical results are labeled separately.

Sources and effective date

  • CDSS's June 30, 2014 MCE letter, page 3 grants one/two-person MCE households their minimum benefit and larger households their issuance-table allotment above the net-income standard.
  • 7 CFR 273.2(j)(2)(xi) and 273.9(a) exempt categorically eligible households from the income eligibility standards.
  • ACL 12-62, examples 4–5, ACL 13-32, ACL 14-56, and ACL 15-42 confirm the waiver, including elderly/disabled households within 200% of poverty. Elderly/disabled households above that gross limit still undergo regular screening.
  • MPP 63-409.1 and 63-301.72 reflect the categorical exemption.
  • ACL 11-11, page 1 identifies February 1, 2011 as the statewide expansion to all NACF households; California first implemented MCE in July 2009. The corrected flags retain 2015-10-01, matching the surrounding modeled BBCE gross, asset, and poverty-period parameters. This models the waiver throughout that baseline; changing these flags alone would not establish complete 2011 eligibility.
  • ACIN I-46-25, attachment I supplies the FY2026 limits, deductions, and allotments. ACL 24-59 supports the elderly case's actual medical deduction.

Regression cases and arithmetic

  • Four people, January 2026: four eligible young members, $45,000 annual wages and $10,200 annual rent. Gross $3,750 is below the $5,360 MCE ceiling. Earned deduction $750 and standard deduction $223 leave $2,777. Rent $850 is below half-net $1,388.50; with no utility allowance, shelter deduction is $0. Net exceeds the $2,680 regular standard, yet MCE remains true: $994 − ceil(0.30 × $2,777) = $994 − $834 = $160. Current main also computes a $0 automatic utility allowance for this household after Apply federal SNAP heat-and-eat SUA restriction in all states #10033; the zero-allowance input remains a controlled fixture assumption, with the same result as the default.
  • Elderly single person: $24,000 annual Social Security, $2,434.80 premiums, no rent. Monthly premiums $202.90 give actual medical deduction $167.90 ($202.90 − $35), exceeding the $150 standard medical deduction. Net $2,000 − $167.90 − $209 = $1,623.10 rounds to $1,623. SUA $663 is below half-net $811.55, so shelter deduction is $0. $298 − ceil(0.30 × $1,623) = −$189, raised to the $24 minimum. Gross $2,000 is below the $2,610 MCE ceiling.
  • Child support: the resolved California integration case retains categorical eligibility and the $24 minimum, and asserts the net-income calculation. Its unnecessary snap_utility_allowance: 0 input is removed; the current model derives $0. Gross ($36,275.59 − $5,200)/12 = $2,589.63 < $2,610; the earned deduction uses full wages, $36,275.59/12 × 20% = $604.59. Net before shelter is $1,776.04; rent $880 < half-net $888.02, so shelter deduction is $0. Rounded net $1,776 gives $298 − ceil($532.80) = −$235, raised to $24. 7 CFR 273.9(d)(2) supports the full-wage earned deduction.
  • YAML replacement for the Python property test: committed paired California households of sizes 1–8 hold gross income and household/member gates constant while varying net income, including elderly and disabled statuses. They derive categorical eligibility and independently assert the FY2026 table allotment, California participation screen, and final eligibility. policyengine_us/tests/policy/baseline/gov/states/ca/cdss/snap/ca_snap_meets_allotment_requirement.yaml contains 9 deterministic cases: eight CA pairs and a Washington control. Sizes 1/2 use net $0/$2,608 and $0/$3,525, giving $298/$24 and $546/$24. Sizes 3–8 use $1/$0 boundaries at nets $2,613/$2,614, $3,310/$3,311, $3,940/$3,941, $4,733/$4,734, $5,233/$5,234 and $5,960/$5,961. The Washington pair retains eligibility at both $1 and $0. Gross inputs floor the model's exact 200%-FPG limits rather than impose chart rounding. The YAML replacement is committed; final validation is listed below. Existing wage-based regressions retain the $1/$0 boundaries and one/two-person minimum cases below; the former Python test is removed at Ziming's request.

Methodology

The original branch used zero-utility fixtures to isolate the MCE correction before #10033's heat-and-eat correction landed. Current main incorporates #10033, so the four-person January 2026 renter and the child-support household both derive a $0 allowance by default. Their net income and resulting MCE changes are now the same with default versus explicit zero utility inputs. The child-support pin is removed as requested. The earlier comparison with a $663 default SUA and $198 renter benefit is historical and does not describe current main.

The net waiver and California zero-allotment screen use the existing 2015-10-01 modeled MCE baseline. Relative to current main, the net-test flags become false and the participation screen is added from that date. This PR preserves #10033's default utility policy and does not extend modeled coverage to the legal February 2011 expansion. The existing $48,000-wages, no-rent four-person case gets $100 in January after the waiver, and above-200% gross-limit guards remain. These previously accepted fixture and baseline choices are unchanged; METHODOLOGY_CHOICE: no.

SNAP → CARE → FERA regression

The June 2026 fixture has three people: a parent earning $40,000, a 16-year-old K–12 student earning $20,000, and a 14-year-old sibling. CARE counts both earners under the PG&E application income footnote: $60,000 > $54,640, the CPUC CARE ceiling for June 2026–May 2027; income remains below FERA's $68,300 ceiling. Medicaid, WIC, SSI, TANF and reported program receipt are explicitly excluded so that calculated SNAP alone supplies CARE categorical eligibility. CARE/FERA countable income is exactly $60,000 because #10065, now merged into main, excludes SNAP from income.

7 USC 2014(d)(7) excludes the schoolchild's wages from SNAP. Using the FY2026 CDSS table, attachment I: SNAP gross $40,000 / 12 = $3,333.33 is below the published $4,442 MCE ceiling. With no rent or utility allowance, net $3,333.33 − $666.67 earned deduction − $209 standard deduction = $2,457.67 rounds to $2,458 > $2,221. MCE waives that net test; $785 − ceil(0.30 × $2,458) = $785 − $738 = $47 monthly.

The fixture asserts SNAP eligible, CARE income eligibility false, CARE categorical and overall eligibility true, and FERA false. Current main retains the MCE net test, so the same household is denied SNAP; CARE categorical/overall eligibility are false and FERA is true (static reasoning, not a current executed comparison). No rent or utilities prevents a different month's annual SNAP calculation from conferring CARE on main. The previous $45,000 renter's nondiscriminating FERA assertion remains replaced by this case; its SNAP arithmetic remains covered.

Invariants and validation

The waiver applies to all California MCE household sizes, with or without an elderly/disabled member. Gross screening remains; net income still sets the allotment. The California participation screen uses only allotment > 0: one- and two-person units already receive the positive minimum from the shared allotment calculation. The redundant in_ca check is removed from is_snap_eligible, because the California gate defaults to true outside California. Other states retain their existing behavior, including Rhode Island controls retaining the net test. CARE/FERA countable income remains invariant to a SNAP-only change through merged #10065.

Final changed-file validation at 8f3369be39447c6a918328ca1e94d6b858106279:

Test file (under policyengine_us/tests/policy/baseline/) Passed Failed Process status Seconds
gov/states/ca/cdss/snap/ca_snap_meets_allotment_requirement.yaml 9 0 Passed 726.15
gov/hhs/tanf/non_cash/meets_tanf_non_cash_net_income_test.yaml 9 0 Passed 422.35
gov/states/ca/cpuc/integration.yaml 15 0 Passed 990.38
gov/usda/snap/eligibility/is_snap_eligible.yaml 24 0 Passed 1089.24
gov/usda/snap/snap_child_support_integration.yaml 3 0 Passed 701.59
partners/analytics_coverage/edge_cases/federal/nutrition/snap/ca.yaml 5 0 Passed 672.79
partners/analytics_coverage/signatures/ca.yaml 29 0 Passed 1025.11
partners/analytics_coverage/signatures/federal.yaml 18 0 Passed 477.31

Passed at final head: uvx ruff@0.15.5 format . (6,953 files unchanged), uvx ruff@0.15.5 check ., and git diff --check. make format also passed before the partner-review commit. The working tree is clean.

Current CI: Pull request run 38683845899 at the final head skipped all seven test/validation jobs because the PR is a draft, including Household API Partners. It provides no executed test validation.

Every current test runs one file per foreground process with the prescribed interpreter and these thread caps: OMP_NUM_THREADS=4 OPENBLAS_NUM_THREADS=4 MKL_NUM_THREADS=4 VECLIB_MAXIMUM_THREADS=4 NUMEXPR_NUM_THREADS=4 OMP_WAIT_POLICY=PASSIVE. Standard retests use the unchanged Core CLI. The pre-edit audit used an untracked subclass of Core’s YAML test plugin to aggregate every failed assertion after checking all outputs in the same simulation, and to record monthly diagnostics. It preserved every original failure and returned nonzero for the old expectations. No installed runner or model source was modified; final-head retests use the standard CLI without that audit subclass. No microsimulation is run in this revision; the hub handles that separately. Commands, diagnostic captures, and logs stay in untracked evidence.

Historical validation: earlier draft heads passed 23 and then 24 eligibility YAML cases, 15 utility-integration cases, and the former Python test with 40 generated and eight explicit Hypothesis examples. That Python test took 142.61 seconds of pytest time and is now replaced by deterministic YAML. Those historical Round 2 runs used an untracked shutdown plugin that skipped extra garbage collections and froze cyclic objects; shutdown-only finalizers or unraisable exceptions could be suppressed. Neither generated coverage nor those harness results are claimed for the replacement or final head. The original owner's 1,500-household seeded differential check predates the zero-allotment screen. GitHub run 38105600351 skipped all seven jobs and provides no executed validation.

The previous continuation's serial run passed the eligibility, CPUC integration, non-cash TANF, and child-support files. Its first paired-YAML run had eight passes and a one-person gross-threshold fixture failure; pushed continuation head 55899ea8e97f432d5e863679df09ea9ffe94f2d7 contains the correction to the model's exact threshold. Its original partner expectations failed in the 24 predicted cases. These are historical results, separate from the final-head table above.

Partner impact and landing blocker

The approval request expands to all changed cases observed in the three affected partner files after merging current main, including the 12 original no-rent signature cases and the 11 rental households #10033 pinned as ineligible. The observed inventory below contains 24 cases: the California edge case, ten CA signatures, and thirteen federal signatures. It supersedes the earlier request that named only the edge case.

The three affected files were audited at 55899ea8e97f432d5e863679df09ea9ffe94f2d7: 52 cases / 2,732 asserted outputs. Exactly 24 cases / 48 values failed the old expectations, and every failure was either snap ($0 to the observed positive amount) or is_snap_eligible (false to true). The remaining 2,684 assertions met their existing expectations, including downstream program outputs.

Partner inventory validation remains incomplete: 3 of 144 files have passing final-head process results, covering 52 cases in those passing processes. There are 141 files without a passing process result. The full inventory contains 623 cases. The 24-row table is the complete observed change set in the three audited files; an exhaustive runtime claim for all partner files is not made. Remaining filenames and individual counts stay in the untracked hub evidence. Final-head standard retests are distinguished from the pre-edit audit above.

Partner expectations are updated only for those 48 required output changes. The table below contains the complete observed set in these three files. Standard Core CLI retests of all three updated files passed; their per-file results are recorded in the validation table above.

All 24 rows below are observed model outputs from the complete three-file audit. Ziming Hua (@hua7450) decides approval for the complete observed set together. Partner approval and any required partner notification remain landing requirements. No PR comment or review reply is posted by this revision.

Partner cases changed (for Ziming's approval)

All cases are calendar 2026. File aliases denote these complete paths:

  • SNAP CA: policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/snap/ca.yaml
  • Signatures CA: policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/ca.yaml
  • Signatures federal: policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/federal.yaml

The old columns are committed main expectations, read from the fixtures; main has not been separately rerun. The new columns are observed model outputs from the complete audit at 55899ea8e97f432d5e863679df09ea9ffe94f2d7. Every listed case changes both outputs; all other assertions in these three files meet their existing expectations.

File Case Old contract SNAP/year Old contract eligibility Observed new SNAP/year Observed new eligibility
SNAP CA snap_ca_net_income_above_net_limit_all_year_38000 (ca) $0 false $1,122 true
Signatures CA signature_22 (10 reqs) $0 false $1,293 true
Signatures CA signature_28 (8 reqs) $0 false $1,293 true
Signatures CA signature_44 (6 reqs) $0 false $1,416 true
Signatures CA signature_58 (4 reqs) $0 false $1,293 true
Signatures CA signature_60 (4 reqs) $0 false $1,416 true
Signatures CA signature_61 (4 reqs) $0 false $1,416 true
Signatures CA signature_63 (4 reqs) $0 false $1,293 true
Signatures CA signature_78 (4 reqs) $0 false $1,293 true
Signatures CA signature_79 (4 reqs) $0 false $1,416 true
Signatures CA signature_80 (4 reqs) $0 false $1,293 true
Signatures federal signature_8 (25 reqs, +2 dupes) $0 false $1,293 true
Signatures federal signature_126 (2 reqs) $0 false $1,959 true
Signatures federal signature_138 (1 reqs) $0 false $1,341 true
Signatures federal signature_139 (1 reqs) $0 false $1,341 true
Signatures federal signature_142 (1 reqs) $0 false $1,293 true
Signatures federal signature_147 (1 reqs) $0 false $1,293 true
Signatures federal signature_151 (1 reqs) $0 false $1,416 true
Signatures federal signature_152 (1 reqs) $0 false $1,293 true
Signatures federal signature_159 (1 reqs) $0 false $1,341 true
Signatures federal signature_160 (1 reqs, +1 dupes) $0 false $1,293 true
Signatures federal signature_161 (1 reqs, +1 dupes) $0 false $1,293 true
Signatures federal signature_177 (1 reqs) $0 false $1,341 true
Signatures federal signature_179 (1 reqs) $0 false $1,959 true

Signature arithmetic: all annual totals use nine FY2026 months and three modeled FY2027 months. The complete audit confirms all five annual-amount groups shown here. Main already models both the FY2027 utility uprating and cents-then-whole-dollar net-income rounding used here. Correcting the earlier draft's flat-utility arithmetic changes neither methodology nor policy.

  • The twelve no-rent signatures have $48,000 annual wages: $4,000 gross − $800 earned deduction − $223/$229 standard deduction = $2,977/$2,971 net. Contributions are $894/$892; maxima $994/$1,023 give benefits $100/$131 and 9 × $100 + 3 × $131 = $1,293.
  • CA 44/60/61/79 have observed annual SNAP $1,416. January uses $1,500 rent plus the $20 phone allowance: shelter deduction $31.50 gives unrounded net $2,945.50, rounded net $2,946, contribution ceil(30% × $2,946) = $884, and benefit $994 − $884 = $110. October uses main's modeled uprated phone allowance $20.706285: shelter deduction $35.206299 gives unrounded net $2,935.793701, rounded net $2,936, contribution $881, and benefit $1,023 − $881 = $142. 9 × $110 + 3 × $142 = $1,416. Federal 151 has the same phone-only fixture and observed $1,416 annual amount.
  • Federal 138/139/159/177 have $1,500 rent and $0 qualifying allowance. Shelter deductions $11.50/$14.50 give rounded net $2,966/$2,957, contributions $890/$888, and benefits $104/$135: 9 × $104 + 3 × $135 = $1,341.
  • Federal 126 has observed annual SNAP $1,959. January uses the $170 limited utility allowance: shelter deduction $181.50 gives rounded net $2,796, contribution $839, and benefit $155. October uses main's modeled allowance $176.003418: shelter deduction $190.503418 gives raw net $2,780.496582. The existing model rounds to cents ($2,780.50) before half-up whole-dollar rounding ($2,781); contribution ceil(30% × $2,781) = $835 and benefit $1,023 − $835 = $188. 9 × $155 + 3 × $188 = $1,959. Federal 179 has the same multi-utility fixture and observed $1,959 annual amount.

These cases retain the gross ceiling and positive-allotment screen. The eligibility correction does not restore #10033's heating/cooling SUA. The complete audit checked every asserted output in these files. Only the 48 SNAP/eligibility assertions required expectation changes; the other 2,684 assertions pass within their existing fixture tolerances.

Partner contract case (needs hua7450)

snap_ca_net_income_above_net_limit_all_year_38000 (ca) has old contract values snap: 0, is_snap_eligible: false. The observed new values are $1,122 annually and true. The zero-allotment screen does not deny this household because every monthly allotment is positive. Ziming's approval is requested for this case together with all signature cases above.

January–September 2026: $38,000/12 = $3,166.67 gross, below the published three-person MCE ceiling $4,442. Subtract the $633.33 earned deduction and $209 standard deduction to get $2,324.33, rounded net $2,324. No utility or shelter deduction applies. $785 − ceil(0.30 × $2,324) = $87/month. October–December use modeled FY2027 maximum $808 and standard deduction $217: rounded net $2,316 gives $808 − ceil($694.80) = $113/month. Annual total is 9 × $87 + 3 × $113 = $1,122. The FY2026 source supports the first nine months; the last three use modeled FY2027 parameters.

The complete five-case edge-file audit observed exactly these two changed values; the other eight assertions met their existing expectations. Standard Core CLI retest results for the updated expectations are recorded in the final validation table above.

Historically, Round 2 at a04cc81702f88092d360660551b3d885f97052f8 passed the other four cases in this edge-case file and failed this case with snap@2026: 1122.0 differs from 0.0; a separate eligibility-only run reproduced true versus false. Those historical runs do not establish complete merged-main partner impact.

Known interactions

California's treatment is resolved and implemented. ACL 14-56, page 6 states that California chooses denial for CE/MCE households of three or more with zero benefits; counties discontinue ongoing cases after mandatory or verified-upon-receipt income/expense changes and deny zero-benefit recertifications. Its page 4 preserves the minimum for one/two-person MCE households and positive issuance-table allotments for larger households above the regular net standard, including ongoing allotments below $10. ACL 14-63, pages 1–2 confirms denial for three-or-more-person CE/MCE applicants, termination of ongoing zero-benefit cases, and denial at recertification; one/two-person CE households retain the minimum outside the initial month.

7 CFR 273.10(e)(2)(iii)(A)–(B) requires states either to deny or to certify and suspend an otherwise eligible household of three or more with no benefits. It excludes zeros caused by initial-month proration or the initial-month prohibition on issuing less than $10. Subparagraph (iv) requires certification beginning in the application month when those initial-month issuance restrictions prevent benefits but later months qualify. Subparagraph (ii)(C) provides the one/two-person minimum outside the initial month. The model does not represent application-month proration/issuance exceptions.

snap_allotment_before_eligibility holds the existing maximum-minus-rounded-contribution calculation with the applicable minimum. Both snap_normal_allotment and ca_snap_meets_allotment_requirement use it, avoiding an eligibility/allotment cycle or duplicate calculation. The California gate now requires only a positive calculated allotment; because one- and two-person units already receive the minimum, dropping the hard-coded size check preserves their treatment. The gate remains independent of the waived net-income standard and starts at the existing October 2015 modeled MCE baseline.

Hand-worked January 2026 boundaries (CDSS FY2026 maximums $785 for three, $994 for four): three-person net $2,613 gives $785 − ceil($783.90) = $1, while $2,614 gives $785 − ceil($784.20) = $0; four-person net $3,310 gives $994 − $993 = $1, while $3,311 gives $994 − ceil($993.30) = $0. The existing YAML derives these nets from annual wages $42,330/$42,345 and $52,995/$53,010, respectively, with zero housing/utility allowance. One/two-person cases retain $24. The four-person $60,000-wages/no-rent case remains MCE but is denied participation: $5,000 − $1,000 − $223 = $3,777 net; max(0, $994 − ceil($1,133.10)) = $0.

Federal scope gap: other states currently can report categorical eligibility with a zero normal allotment (the existing Missouri three-person zero-benefit case in gov/usda/snap/snap_categorical_eligibility_ceiling.yaml expects is_snap_eligible: true), and the model has no certified-but-suspended participation status or other-state denial-option screen. Federal law permits suspension as an alternative to denial, so a universal is_snap_eligible=false rule would be unjustified. This PR implements California's documented denial option only; other states retain their behavior. MCE exclusions for IPV-disqualified members and noncompliant household heads remain unmodeled. This revision files no public issues.

Response to Ziming's review

  • Blocking — partner request: merged current main; the section “Partner cases changed (for Ziming's approval)” lists all 24 observed case changes and both old/new outputs. The three affected files were audited in full (52 cases / 2,732 assertions); only the 48 SNAP/eligibility values required updates. The remaining partner-suite status is reported above. Ziming's approval remains pending.
  • Blocking — merge conflict: retained eligible/$24 in gov/usda/snap/snap_child_support_integration.yaml and removed the unnecessary snap_utility_allowance: 0 input. The model derives $0; final validation is in the table above.
  • Please fix — duplicate changelog: removed changelog.d/hub-ca-care-excludes-snap-1010.fixed.md, already merged through Exclude SNAP from California CARE and FERA countable income #10065.
  • Please fix — hard-coded size check: ca_snap_meets_allotment_requirement.py returns only allotment > 0; the shared one/two-person minimum supplies their positive allotment.
  • Please fix — Python test cost: replaced gov/states/ca/cdss/snap/test_ca_snap_eligibility.py with nine deterministic cases in ca_snap_meets_allotment_requirement.yaml: paired California sizes 1–8 and a Washington control. Final validation is in the table above.
  • Optional — redundant state check: removed in_ca from is_snap_eligible.py; the CA gate defaults to true elsewhere. The YAML replacement includes a Washington control.
  • Optional — ACL reference: added #page=1 to ACL 11-11 in both BBCE net_applies parameter references and the source link above.
  • Optional — fixture input keys: removed eight unnecessary 2026: input wrappers from gov/usda/snap/eligibility/is_snap_eligible.yaml; retained explicit periods where needed.

The prior merge and cleanup commits remain intact. This continuation adds fast-forward commit 8f3369be39447c6a918328ca1e94d6b858106279 (24 required partner outcomes and arithmetic comments), pushed to fix-ca-mce-net-income-test. No history was rewritten. All partner inputs and non-SNAP expectations are preserved.

The previously accepted modeled effective date and utility-fixture methodology are retained: METHODOLOGY_CHOICE: no.

Hub microsimulation impact

Pending: the hub runs it. This PR remains a draft. Include at least snap, is_snap_eligible, meets_snap_categorical_eligibility, ca_care, ca_fera, and household_net_income; also inspect snap_allotment_before_eligibility and ca_snap_meets_allotment_requirement. Use current-main baseline 8ae01aa and final head 8f3369b; supply population results and modeled years before landing.

axiom: CDSS ACL 13-32 and ACL 15-42 (CalFresh MCE net income ceiling) encoded-correct (us-ca/policies/cdss/snap/fy-2026-benefit-calculation.yaml#calfresh_mce_net_income_eligibility_test_waived, companion test mce_waives_the_net_ceiling_but_net_income_still_computes_the_benefit)

The original owner checked that RuleSpec module, composition and companion test at rulespec-us main 16a667719; it expects a three-person MCE household above the net standard to be eligible for $97. Execution was blocked by the local engine's auto_gate_outputs completeness check. That historical MCE parity status is preserved; the CARE/FERA correction is already merged in #10065.

axiom: TheAxiomFoundation/rulespec-us#1098 queued

Parity for California's zero-allotment participation screen (CDSS ACL 14-56, page 6; ACL 14-63, page 2) is separately queued in the linked issue; the net-waiver encoded-correct evidence does not cover this screen. This revision preserves both existing axiom declarations.

MaxGhenis and others added 2 commits October 9, 2026 14:39
CalFresh Modified Categorical Eligibility has no net income test. CDSS
ACL 12-62 (examples 4-5), ACL 13-32, ACL 14-56 and ACL 15-42 direct that
an MCE household of three or more gets the issuance-table allotment even
when net income exceeds the net standard, and that one of one or two gets
the minimum allotment. ACL 13-32 applies this to elderly or disabled
households at or below 200% of poverty. MPP 63-409.1 and 7 CFR 273.9(a)
exempt categorically eligible households from the income standards.

Set CA to false in both net_applies parameters, cite the CDSS sources,
move the net-standard rounding cases to Rhode Island, and add California
cases with FY 2026 values from CDSS ACIN I-46-25.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CARE countable income counts SNAP. The Case 8 household is an MCE
household above the net standard in November and December 2024, so with
the BBCE net test gone it receives the $23 FY 2025 minimum allotment in
those two months (CDSS ACL 12-62, example 4), and its countable income is
30,046, not 30,000.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub: taking this draft forward (2026-10-10).

The review of #10033 (SNAP heat-and-eat) found that #10033 had picked up a narrower version of this fix, exempting only one- and two-person California households. It recommended that the all-size waiver here carry the California correction. This PR's owner session isn't running, so the hub is doing the reconciliation:

  • a new small PR carries the CARE/FERA correction (SNAP is not income for CARE, 7 U.S.C. 2017(b)), and this branch merges it in;
  • the CARE integration expectation here changes from $30,046 to $30,000 once SNAP is excluded;
  • the review's four-person and elderly single-person cases are added;
  • Apply federal SNAP heat-and-eat SUA restriction in all states #10033 then drops its own California changes.

Commits to this branch are additive: no rebase and no force-push. If the owner session resumes, the hub's work is recorded under fixes/ca-snap-split/ in the hub's state folder.

@MaxGhenis
MaxGhenis requested a review from hua7450 October 11, 2026 10:53
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

@hua7450, this PR changes one partner contract case, and partner cases are your call. It needs your go before it can land.

The case. policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/snap/ca.yaml, snap_ca_net_income_above_net_limit_all_year_38000 (ca): three California citizens (a couple and one child) with $38,000 of earnings, 2026.

Expected in the partner file (and main) This PR
snap $0 $1,122
is_snap_eligible false true

The file is unchanged here; the case fails at this head with snap@2026: 1122.0 differs from 0.0.

Why it moves. The case's own comment calls it a deliberate pin of California's net-income test: net income of $2,324/month is above the net limit, so the household is ineligible on main. This PR applies California's Modified Categorical Eligibility as CDSS describes it: households eligible through MCE are not held to the net-income standard. Gross income stays under the 200% MCE ceiling, and allotments still use net income (CDSS MCE instructions, p. 3). Households of three or more whose allotment computes to $0 are still denied (ACL 14-56, p. 6), but this one has a positive allotment every month:

  • January to September: rounded net $2,324; $785 − ceil(0.30 × $2,324) = $87/month.
  • October to December: rounded net $2,316; $808 − ceil(0.30 × $2,316) = $113/month.
  • Total: 9 × $87 + 3 × $113 = $1,122.

The hub's independent review recomputed these numbers and reproduced the failure.

The three questions from CLAUDE.md:

  1. Do you want this partner case's expected output changed to $1,122 / true?
  2. Has a team member been notified? (You, with this comment.)
  3. Has the API partner been notified? If the answer is yes to 1, who tells them, and should the PR wait for that?

If you say yes, the hub will update the case with the arithmetic above in its comment. The PR stays a draft until then.

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

Review: policy verified; partner request needs updating before merge

The policy holds up against the sources. California's MCE has no net income test for any household size, with or without an elderly or disabled member (ACL 12-62 examples 4–5, ACL 13-32). California denies zero-benefit households of three or more (ACL 14-63). SNAP isn't CARE or FERA income (7 U.S.C. 2017(b)). The test arithmetic matches the FY2026 CDSS figures.

Blocking

  • Partner request: this PR changes more partner cases than the request names. Besides the CA edge case, 12 signature cases (6 CA, 6 federal) move from ineligible to eligible. Now that 10033 is merged, the 11 households it pinned as ineligible would also become eligible again. Please update from main, run the partner suite and list every changed case with old and new values, so I can approve them together.
  • Merge conflict: snap_child_support_integration.yaml conflicts with 10033. Keep this PR's version (eligible, $24). The snap_utility_allowance: 0 input is no longer needed, because the model now gives $0 for that household.

Please fix

  • Remove changelog.d/hub-ca-care-excludes-snap-1010.fixed.md. 10065 already merged with that entry.
  • In ca_snap_meets_allotment_requirement.py, drop the hard-coded size < 3. One- and two-person units always get the positive minimum, so allotment > 0 alone gives the same result.
  • Replace test_ca_snap_eligibility.py with YAML cases. It adds about 143 seconds, and YAML covers the same behavior.

Optional

  • The in_ca check in is_snap_eligible.py is redundant, because the CA variable already defaults to true outside California.
  • Add #page=1 to the ACL 11-11 reference.
  • Some new fixtures have unneeded 2026: input keys.

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.

2 participants