Skip to content

Apply Colorado's AND-CS payment floor and 3.549 income rules to every client - #10161

Draft
MaxGhenis wants to merge 5 commits into
ssi-supplement-couple-spouse-eligibilityfrom
co-and-cs-payment-floor-3549
Draft

MaxGhenis wants to merge 5 commits into
ssi-supplement-couple-spouse-eligibilityfrom
co-and-cs-payment-floor-3549

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #10145 (base ssi-supplement-couple-spouse-eligibility). This retargets to main once #10145 merges. Review only the commits after 3d1da21317.

Summary

Colorado AND-CS (co_state_supplement) gets two changes under 9 CCR 2503-5 (ruleVersionId 12428):

  1. Payment floor. From January 1, 2026, a grant below the $13 payment floor standard is raised to it (3.546(C)(2), (E); 3.549(B), (H)). The floor applies only to a positive grant: under 3.520.781(A), a client whose total countable income, SSI included, "equals or exceeds" the grant standard is not eligible.
  2. 3.549 for every client. Pay CO, TX and NM SSI supplements to both members of an SSI couple #10145 applied 3.549(A) only to SSI couples. Everyone else used federal ssi_countable_income. Now:
    • 3.549(A), every client's own income: half the $20 disregard if married; none when SSI is the only unearned income; the unused $20 reaches earnings only when gross unearned income, SSI included, is under $20.
    • 3.549(C)-(D): a spouse's income is deemed without SSI's deeming threshold or child allocations. Earned: (gross − 65) / 2. Unearned: less whatever is left of the couple's combined $20.
    • 3.549(E): a child's parents' income is deemed "using the same calculations as a spouse".
    • 3.549(F), from March 1, 2020: nothing is deemed from a spouse or parent on SSI, Old Age Pension or Medicaid with income within the SSI limit. Before then 3.545(F) excluded only the benefit income itself.

The payment floor

Source What it says
3.546(E) "Effective January 1, 2026, the payment floor standard for AND-CS is $13."
3.549(B), (H) "If the grant payment is less than the AND-CS payment floor standard ..., a state supplementary payment will be issued to raise the grant payment to meet the payment floor standard."
3.510 "Payment Floor Standard" is "the minimum Adult Financial grant payment that an eligible ... (AND-CS) ... client may receive."
3.520.781(A) "If a client's total countable income equals or exceeds the Adult Financial program grant standard, the client shall not be eligible for that specific Adult Financial program."

History. I extracted 3.546 from all 51 versions of 9 CCR 2503-5 on the SOS site (2012-09-15 through 2026-03-02). The floor first appears in the January 1, 2026 emergency rule (ruleVersionId 12318). Before then, 3.546(C) allowed only discretionary "MOE" lump sums, and SSA's 2002 and 2011 Colorado reports give the pass-along method as "maintaining total expenditures". So payment_floor.yaml is $0 until 2026 and $13 from 2026-01-01.

Who gets it. CDHS's rulemaking packet (2025-00596) gives the AND-CS caseload as "approximately 250 individuals" and the "Estimated amount to meet payment floor" as $285. If the floor paid every disabled SSI recipient under 60 with a $0 grant, it would cost thousands of times that. The 3.520.781(A) reading matches.

3.546's "but are not receiving the full SSI benefit standard". 3.510 defines the SSI benefit standard as the maximum federal SSI amount (20 CFR 416.405-415). Since 2012 the AND-CS grant standard has equaled the individual rate ($994 in 2026). A single client receiving the full individual rate therefore already has total countable income of at least $994, which 3.520.781(A) excludes. So the PR adds no separate gate. A member of an SSI couple (each $745.50) is not on the full individual standard and stays a client, as #10145 and SSA's 2011 Colorado table (couple standard $1,398 = 2 × $699) have it. Axiom's and_cs_client_qualifies_for_program takes this as a leaf input, client_receives_full_ssi_benefit_standard_under_section_3_510.

3.549 outside SSI couples

Rule Federal ssi_countable_income (before) This PR
(A)(2)(c)(2) SSI is the only unearned income $20 general exclusion moves to earnings no unearned disregard; none reaches earnings
(A)(2)(f) unused $20 always moves to earnings only when gross unearned income incl. SSI is under $20
(A)(2)(c)(1) married whole $20 (individual) $10 each
SSI student earned income exclusion excluded counted: 3.520.786 limits exempt income to the items it lists
(C) spouse's earnings deemed only above the $497 threshold, after child allocations (gross − 65) / 2
(D) spouse's unearned income as above gross − (20 − client's use of the $20)
(E) parents' income to a child after parental and child allocations combined income of the parents the child's ids name (any age; without ids, the tax unit's unlinked parents), spouse calculation, in full to each child client
(F) spouse or parent on SSI — not deemed, from 2020-03-01
(F) spouse or parent on OAP or Medicaid, SSI countable income ≤ the $994 individual rate — not deemed, from 2020-03-01

Dating (F). The current (F) took effect March 1, 2020 (ruleVersionId 8577). The 2014–2020 rule (3.545(F), effective 3/2/14) read: "If a spouse or parent is receiving assistance under another category of public assistance, SSI benefits, or medical assistance, the income from those benefits shall not be considered as available to the client". That excludes only the benefit income, which the deemed sources here never include, so income/deeming/assistance_exemption_applies.yaml is false before 2020-03-01 and no one is exempt. Two consequences:

  • Before March 2020, the members of an SSI couple deem each other's non-SSI income, as the text says (Case 31: in 2019 the head gets $152.50 rather than $232.50). This reads the 2014–2020 rule literally rather than following SSA's pre-2014 tables, which report a pooled couple standard.
  • Before 2020, PE's Medicaid model, whose parameters start in 2015, is never reached.

Medicaid enrollment for (F). From 2027 the Medicaid community engagement requirement can be met by belonging to a household that receives SNAP (42 CFR 435.554(c)(7)). SNAP counts AND-CS as income, so a spouse's Medicaid enrollment can depend on the client's supplement. co_state_supplement_medicaid_enrolled computes medicaid_enrolled in a private branch where the variable itself is false for everyone. Before work requirements apply, it is medicaid_enrolled. In the branch, AND-CS deems every Medicaid spouse's or parent's income, so it is no higher than its final value and SNAP is no lower: one step toward the fixed point, from the conservative side. The branch keeps the SNAP route to enrollment, which matters for spouses: PE's caretaker exemption covers disabled dependents, not a disabled spouse. The parent never holds the variable before computing it, so the branch always shares the parent's cache, and the answer is the same whatever is calculated first. #10176 uses the same design for OAP (co_oap_medicaid_enrolled). Whichever PR lands second merges the two into one Adult Financial variable. medicaid_enrolled_for_ssi_state_supplement, used by IN and KS, would drop the SNAP route, and it answers from the cache when Medicaid was calculated first.

The disregard amounts ($65, one half, $20) are Colorado parameters (income/disregards/), not SSI's. A reform to SSI's exclusions no longer changes AND-CS.

Worked cases (all in YAML)

2026, monthly unless noted. "Before" is #10145's head.

Case Before This PR Rule
Couple, head pension $487, spouse none (SSI $512 each) head $5, spouse $482 head $13, spouse $482 994 − 512 − 477 = 5 → floor
Couple, head pension $497 (SSI $507 each) head $0 head $0 507 + 487 = 994: ineligible, no floor
Grant inputs: SSI 985, no other income $9 $13 floor
Grant inputs: SSI 993.50 total $0.50 $13 floor
2025, SSI 958 $9 $9 no floor before 2026
Single, SSDI $300 (SSI 714) $0 $0 total 994: no floor
Single, SSI only, earns $500 countable 207.50 countable 217.50 (A)(1), (A)(2)(c)(2)
Single disabled student earning $500 countable 0 countable 217.50 3.520.786
Client, no income; spouse earns $1,500, on Medicaid (SSI 783.50) $0 $210.50 SSI deems 707.50; (F) deems nothing
Same, spouse not on Medicaid $0 $0 (C) deems 717.50
Client SSI only; spouse earns $300 countable 0 countable 117.50 (C); SSI's threshold deems 0
Client SSDI $300; spouse pension $400 countable 280 countable 680 (A) 290 + (D) 390
Child; parent earns $2,000, other parent none countable 0 countable 967.50 (E)
Single in another's household (SSI 662.67) $331.33 $331.33 unchanged; see #10183
2019 SSI couple, spouse pension $100 (SSI 538.50 each) head $232.50, spouse $142.50 head $152.50, spouse $142.50 3.545(C), (F): pension deemed less the head's unused $20
Single, $7,174/yr pension and outside shelter support $13 (float leak) $0 total countable income exactly $994
Infant named as the mother's child; grandfather earns $865, mother none — $494, nothing deemed (E) "the child's parents"
17-year-old parent earns $865; disabled infant — $94: $400 deemed (E) age limit is on the client
2030, spouse with $800 pension on Medicaid through SNAP receipt — client paid ($1,723.79/yr) in either calculation order (F) via 42 CFR 435.554(c)(7)

Clients with a positive grant are mostly members of SSI couples (#10145), people in another person's household, and clients whose spouse is exempt under (F) while SSI deems the spouse's income. A single client in their own household has no positive grant: 3.549(A) never counts less than SSI does, and the standard equals the SSI rate. The property tests check this. Eligibility is tested on the grant in cents: in single precision such a client could otherwise be left a grant of $0.00006, which the floor would raise to $13. The property test found this; YAML Case 32 pins it.

Invariants

policyengine_us/tests/core/test_co_and_cs_invariants.py checks these on Hypothesis-drawn single and married clients (15 examples of up to 8 households, one simulation each). Each married household appears four ways: spouse on Medicaid, spouse not, more spousal earnings, roles swapped.

  1. Payment. The supplement is the standard less total countable income when that is positive, raised to the floor if below it, and 0 otherwise. So it is 0 or between $13 and $994.
  2. Singles. A single client in their own household is never paid. For a client who receives SSI, 3.549(A) countable income is ≥ SSI's countable income. The two are equal (a differential check against SSI's implementation) when the client has no earnings or at least $20 of other unearned income.
  3. Exemption. A spouse's Medicaid enrollment within the SSI limit only lowers countable income and only raises the supplement.
  4. Monotonicity. More earnings for a non-exempt spouse never raise the supplement, and never lower countable income for a client who keeps SSI.
  5. Roles. Swapping tax-unit head and spouse changes nothing.

#10145's six couple invariants (test_ssi_state_supplement_couple_invariants.py) still pass. A mutation check confirmed both files and the YAML fail when the floor is paid on $0 grants or the (F) exemption is dropped.

Tests

  • YAML: co_state_supplement.yaml Cases 20-32, plus Cases 1-13 now feeding co_state_supplement_countable_income (they fed ssi_countable_income, which the variable no longer reads). New files: co_state_supplement_own_countable_income.yaml (7), co_state_supplement_deemed_income.yaml (10), co_state_supplement_deeming_exempt.yaml (10). co_state_supplement_countable_income.yaml Case 1 is rewritten and Case 4 added. Every expectation is computed from the rule in the case's comment. All 74 CO AND-CS cases pass, as do all CO YAML (6 batches) and 314 cases in 16 files elsewhere with CO households.

  • test_ssi_state_supplement_medicaid_dependency.py: AND-CS now reads Medicaid for (F), so CO joins the SSP/SNAP/Medicaid calculation-order test (2027, 2030, 2035). New test_co_and_cs_spouse_medicaid_through_snap checks a 2030 couple both ways, with SNAP computed and SNAP supplied: a spouse on Medicaid through SNAP receipt is exempt, and the results do not depend on calculation order. The all-states poverty test there already covers CO. Measured locally on macOS:

    • the file: 15 → 20 tests; peak RSS 4.30 → 4.50 GB (with the two invariants files in the same process);
    • all-states poverty test, interleaved runs at load ~15: 9.0/8.9/7.2 s on Pay CO, TX and NM SSI supplements to both members of an SSI couple #10145's head, 8.9/8.2/6.9 s here, no measurable change;
    • test_co_and_cs_invariants.py: about 20-30 s, 1.3 GB peak RSS, nearly all of it model import.

    Both files run in the Rest/core group. Linux CI times are not measured.

  • Partner fixtures: all CO fixtures and my_friend_ben/2025.yaml pass except co_state_supplement_disabled_ssi_couple_positive. That case is Pay CO, TX and NM SSI supplements to both members of an SSI couple #10145's change, already put to @hua7450 there. This PR changes no other partner output.

Readings to check

  1. "The SSI limit" in (F) is undefined in the rule. I read it as SSI's income test for an individual: countable income after 20 CFR 416.1112/416.1124 exclusions ≤ $994. The alternative, gross income ≤ $994 + $20 (3.520.71(B)(4)'s screen), would deem more from working Medicaid spouses.
  2. Parents in (E). The parents' income is combined (one $65 and the child's remaining $20) and deemed in full to each child client. SSI divides parental income among eligible children; 3.549 does not say to.
  3. Married share of the (A)(2)(f) spillover. It is computed against the full $20, as Axiom does. The combined $20 cap is then enforced when offering the remainder to the spouse. This only matters when SSI plus other unearned income is under $20.

Not modeled

  • Sponsor deeming (3.549(G)).
  • The institutionalized spouse's MMMNA (3.549(F)).
  • The $79 PNA reduction for facility residents (3.548(F)).
  • AND-SO and HCA as exempting Adult Financial programs (PE-US does not model them).
  • Colorado ISM for clients in another person's household (3.520.79; follow-up chip).
  • The OAP floor of $189 (follow-up chip).
  • 3.549(E) does not say whether stepparents are deemed. Parent ids name natural, adoptive or step parents alike. Deem SSI parental income from the child's co-resident parents, not the tax unit #10159 (draft) adds ssi_parental_deemors, which could replace the local selection once it merges.

Impact

No microsimulation yet. The hub's impact queue compares merge-base(main) with the head, so it runs at the final head after #10145 merges (co_state_supplement).

Axiom

axiom: us-co:regulations/9-ccr-2503-5/3.549 (A), (C)-(D), (F) encoded-correct for the cases both encode (companion tests client_income_disregards_and_grant, ssi_only_client_has_no_unearned_disregard, married_client_standard_spouse_deeming, spouse_assistance_exception_blocks_standard_deeming) | TheAxiomFoundation/rulespec-us#1716 queued (3.546/3.549 floor must require 3.520.781(A)) | TheAxiomFoundation/rulespec-us#1717 queued (3.549(E) parental deeming, (H) total, combined $20, effective dates)

Review

Round 1 (GPT-6.1 Sol, 96f5c6e2d4): REQUEST_CHANGES. It confirmed the floor gate (total $994 gives $0; $993.50 gives $13). Five findings, all addressed in 87281e2751:

  1. (P1) medicaid_enrolled_for_ssi_state_supplement dropped the SNAP route and answered from the cache, so a spouse's exemption depended on calculation order. Fixed with co_state_supplement_medicaid_enrolled, plus a regression test.
  2. (P1) The property tests compared countable income for people who had left SSI. Fixed, with the review's examples as a regression test. Re-running them exposed the float-leak bug above, now fixed.
  3. (P2) Grandparents counted as parents. Fixed with parent ids (Case 9).
  4. (P2) Parents under 18 were excluded. Fixed (Case 10).
  5. (P2) Before March 2020, SSI recipients were wrongly exempt. Fixed (Case 31).

Round 2: pending.

🤖 Generated with Claude Code

9 CCR 2503-5 3.546(E) sets a $13 AND-CS payment floor from January 1,
2026, and 3.549(B), (H) raise a grant below it with a state
supplementary payment. Under 3.520.781(A) a client whose total countable
income equals or exceeds the grant standard is not eligible, so the floor
tops up only positive grants.

co_state_supplement_countable_income now applies 3.549 to every client,
not only SSI couples: own income under 3.549(A), plus income deemed from
a spouse (3.549(C)-(D)) or from a child's parents (3.549(E)), except
from a spouse or parent on SSI, Old Age Pension or Medicaid with income
within the SSI limit (3.549(F), dated March 1, 2020).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test_co_and_cs_invariants.py checks, over Hypothesis-drawn single and
married clients in one simulation per example: the payment rule and its
bounds, that 3.549(A) never counts less than SSI for a single client (and
the same where SSI's and Colorado's disregards coincide), that the 3.549(F)
Medicaid exemption only lowers countable income, monotonicity in a
non-exempt spouse's earnings, and invariance to tax-unit roles.

AND-CS now reads medicaid_enrolled_for_ssi_state_supplement for the
3.549(F) exemption, so Colorado joins the SSP/SNAP/Medicaid calculation
order test.

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

Copy link
Copy Markdown
Contributor Author

Stacked follow-up: #10183 (draft) does this PR's 'Colorado ISM for clients in another person's household' follow-up, based on head 96f5c6e2d4. It replaces the ISM block in _and_cs_client_income.py with co_ssa_in_kind_support_and_maintenance. That keeps SSI's PMV halved for couples, and adds SSA's one-third reduction (3.520.79(B)(6) matching), Colorado's own amount for non-SSI clients, and the pre-2014 rule. It updates co_state_supplement.yaml Case 28 ($3,976/yr becomes $240/yr) and appends Cases 31-35. It does not touch test_co_and_cs_invariants.py. I'll rebase #10183 when this branch moves. The ISM amount reading is queued for Max (d1446) and gates #10183's merge, not this PR's.

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits October 12, 2026 20:43
…oat floor

- 3.549(F) Medicaid prong: read co_state_supplement_medicaid_enrolled,
  computed in a private branch with January's AND-CS set to zero. It keeps
  the SNAP route to Medicaid's community engagement exemption (SNAP counts
  AND-CS as income) and gives the same answer whatever is calculated
  first. medicaid_enrolled_for_ssi_state_supplement drops that route and
  answers from the cache when Medicaid was calculated first.
- 3.549(E): deem from the parents the child's parent ids name, whatever
  their age; without ids, the tax unit's unlinked parents other than the
  child. A grandparent named only as the mother's parent no longer counts,
  and a 17-year-old parent now does.
- Before March 2020, 3.545(F) excluded only the benefit income itself, so
  no spouse or parent is exempt from deeming, SSI recipients included.
- The payment floor tests eligibility on the grant in cents: a single
  client whose 3.549(A) income equals SSI's sits exactly at the standard,
  and single precision left a grant of $0.00006 that the floor raised to
  $13 (found by the property test; YAML Case 32).
- Property tests compare countable income only for clients who receive
  SSI, as 3.546 requires; regression test for the review's examples.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
co_state_supplement_medicaid_enrolled now computes medicaid_enrolled in a
branch where it is itself false for everyone, rather than one where
January's AND-CS is zero. AND-CS in the branch deems every Medicaid
spouse's or parent's income, so it is no higher than its final value and
SNAP is no lower: one step from the final fixed point, from the
conservative side. The parent never holds this variable before computing
it, so get_override_branch always shares the parent's cache. This matches
co_oap_medicaid_enrolled in #10176, so the two can merge into one
Adult Financial variable.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.520.79(B)(6) charges an AND-CS client the ISM SSA charges, and SSA's
presumed maximum value halves once spousal deeming starts. Spousal
earnings that cross SSI's deeming threshold therefore lower the client's
ISM by about as much as the deemed earnings rise, and countable income can
fall by cents. Found by Hypothesis in the ISM session (#10183); pinned by
test_ism_basis_switch_at_ssi_deeming_threshold.

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.

1 participant