Repository navigation
Apply Colorado's AND-CS payment floor and 3.549 income rules to every client - #10161
Conversation
The Colorado AND-CS, Texas Medicaid-facility and New Mexico adult residential care supplements gated on is_ssi_eligible_individual, which is false for the tax-unit-spouse member of an SSI couple. Each state's rule pays every SSI recipient on their own (9 CCR 2503-5 3.546-3.548; HHSC MEPD H-1500 and H-6000; 8.106.400.10(C) and 8.106.500.10 NMAC), so gate on SSI receipt instead, the repo's convention for SSI-recipient programs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One vectorized simulation of 48 married couples checks that eligibility is SSI receipt, that the result does not depend on which spouse is the tax-unit head, that two citizen spouses are treated alike, and that a spouse failing the SSI citizenship condition is never eligible. main fails the first three; the is_ssi_eligible_individual | is_ssi_eligible_spouse alternative fails the fourth. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review round 1 (GPT-6.1 Sol): - Colorado: 9 CCR 2503-5 3.549(A) counts each AND-CS client's own income, with the $20 disregard split between spouses and no deeming between SSI-recipient spouses (3.549(F)). The model used ssi_countable_income, which halves a joint claim's pooled income. New co_state_supplement_countable_income does the per-client count where SSI's couple computation applies and keeps the federal amount elsewhere. - Texas: H-6000 keeps a facility resident eligible for SSI when countable income "does not exceed" the $30 reduced standard, and 42 USC 1382(a)(1)(A) agrees, so gate on SSI eligibility within the limit (a $0 payment included) plus take-up, or reported receipt. - One reference per document for the CO rule PDF. Also reverts the partner fixture edit: partner API contract tests change only after Ziming Hua approves (CLAUDE.md). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ients 3.549(A)(2)(f) applies "the difference between the gross unearned income and the $20.00 deduction" to earnings only when the client's unearned income is under $20, and (A)(2)(a) counts unearned income "from all sources", SSI included. So an AND-CS client, who always receives SSI, gets no share of the disregard on earnings unless their gross unearned income is under $20. This matches Axiom's encoding of 3.549 (us-co:regulations/9-ccr-2503-5/3.549). co_state_supplement_countable_income becomes MONTH so it can read that month's SSI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…n CO Review round 2 (GPT-6.1 Sol): - Texas: testing uncapped_ssi admitted an SSI-abolished resident and a resident on the own-household rate whose income equalled it. Test H-6000's condition directly: countable income not over the $30 reduced standard, with SSI not abolished. - Colorado: a joint couple's in-kind support and maintenance is one presumed maximum value (ssi_pmv_amount), which SSI splits between the spouses; count half of it for each spouse, not all of it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>
|
Stacked follow-up: #10183 (draft) does this PR's 'Colorado ISM for clients in another person's household' follow-up, based on head 🤖 Generated with Claude Code |
…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>
hua7450
left a comment
There was a problem hiding this comment.
Review at aaa00d545d: the policy checks out; the tests and the merge need work
The payment floor ($13 from 2026-01-01, positive grants only), 3.549(A) for every client, (C)–(E) deeming and the 2020-03-01 date for (F) all match 9 CCR 2503-5.
Please fix
co_state_supplement_medicaid_enrolledignoresreceives_medicaid. 3.549(F) and 3.534(C) both say "receiving ... Medicaid", and #10176'sco_oap_medicaid_enrolledcounts reported coverage. Keep that route when the two variables merge.co_state_supplement_deeming_exempt.yaml:- Cases 1, 2 and 4 pass through Medicaid: the default person is an enrolled adult with no income, so the SSI and OAP routes are untested. Add
co_state_supplement_medicaid_enrolled: false, as Case 7 does. - Cases 8–10 use
2020-02/2020-03with scalar inputs for YEAR variables (co_state_supplement_medicaid_enrolled,state_code). Those inputs are stored for a year starting that month and ignored, so Case 9 passes through the default CA household's Medicaid. Useperiod: 2020with month-keyed outputs, or key the inputs by year.
- Cases 1, 2 and 4 pass through Medicaid: the default person is an enrolled adult with no income, so the SSI and OAP routes are untested. Add
- Merging main (#10145 and #10176 have landed; 7 files conflict, each changed on one side only):
- Merge the two Medicaid branches into one Adult Financial variable, with the reported-coverage route and OAP's skip guard, so AND-CS and OAP don't open nested branches.
- Judge OAP receipt by month, as main's OAP does, rather than
co_oap(year) > 0. - Use one reading in both programs for the (f) spillover (full $20 here, the married half in OAP) and for whether an SSI recipient needs the income test (OAP applies it, AND-CS doesn't).
- The PR body puts the Medicaid dependency test in Rest/core; the Makefile runs it in heavy-a. Re-measure after the merge.
Optional
- 2014–2020: 3.545(B)(1) based the spillover on "unearned income from all sources except SSI". It changes countable income only, not payments; worth a line under "Readings to check".
- References:
earned_share.yamlputs a single page in its title;assistance_exemption_applies.yamldates 3.545(F) January 1, 2020, but the section is marked "Eff. 3/2/14";payment_floor.yamlcould cite packet page 1. - Invariant 4: scope only the countable-income assertion; the supplement check still holds.
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
|
Picking this up for the US hub. I'm continuing an earlier session's work on this brief; that session stopped before pushing anything here. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
…tests - Merge co_oap_medicaid_enrolled and co_state_supplement_medicaid_enrolled into co_adult_financial_medicaid_enrolled, keeping OAP's reported-coverage route (3.549(F) and 3.534(C) say "receiving ... Medicaid") so AND-CS and OAP share one private branch and never nest one inside the other. - 3.549(F): judge Old Age Pension receipt month by month on the spouse's own income, as co_oap_deeming_exempt does; apply the income limit to SSI recipients too, as OAP applies its limit; and compute Medicaid only for people near an AND-CS client who are not exempt otherwise. - 3.549(A)(2)(f): the spillover to earnings is from the client's own share of the $20 (half when married), as OAP's 3.533(A)(2)(f) reads, so no more than $20 applies to the couple. Deemed-income Case 8 changes accordingly. - Rebuild the deeming-exemption YAML around a real client and spouse, with year-keyed inputs for the 2020 cases, plus SSI-above-limit and reported-coverage cases. - Invariant 4 scopes only the countable-income check to clients without ISM. - Reference titles: one-page title, 3.545(F)'s 2014 date, packet page 1. - Drop #10145's changelog fragment, which main has released. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Picking this up for the US hub. I'm continuing earlier sessions' work on this brief; they stopped before pushing anything here. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
|
Readings at
That settles item 2 under "Readings to check" and the SSI-recipient part of item 1. It doesn't cover the rest of item 1, which is how "the SSI limit" is defined. I'm marking this PR ready for review so CI can run. This isn't an approval: I read the code at this head but haven't run any tests, and I'll review the results once CI finishes and your hand-off is posted. |
…heck - 2002-2006: co_ssa_in_kind_support_and_maintenance had no formula, so AND-CS lost the presumed maximum value #10161 counted (a 2004 renter with outside shelter support went from $37 to $225). formula_2002 keeps that count, halved for a couple, until the pre-2014 component base is audited. New co_state_supplement.yaml Case 38 pins $37. - OAP: co_oap_in_kind_support_and_maintenance reads Colorado's ISM, so OAP clients get SSA's one-third reduction matched (3.520.79(B)(6)) and Colorado's maximum without SSI (3.520.79(C)(3)). The ISM variable drops its Colorado-only restriction: OAP deems a spouse's ISM and the spouse may live elsewhere (3.534(C)). OAP own-income Case 10 now counts $351 - $20. - Invariant 3 takes the floor top-up from the rule, max(0, floor - grant) for a positive grant, not from the supplement under test. - The medical-confinement comment says an SSI recipient in a facility with outside shelter support is still charged SSA's ISM. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Ready for hub review Head: I continue earlier sessions' work on this brief. They pushed nothing here, so every commit after What changed
hua7450's review, item by itemPlease fix
Optional
Also: #10145's changelog fragment came back in the merge after main had released it ( Hand computations (2026, monthly)
Tests run (this head, Linux, Python 3.14)
Mutants (each in its own process, code restored after)
CIPull request run 41721281741 at Judgment callshua7450 accepted calls 1 (the SSI-recipient part) and 2 at this head (comment). How to define "the SSI limit" itself is still open.
What I couldn't checkThis session's network policy blocks www.sos.state.co.us and web.archive.org, so I couldn't fetch 9 CCR 2503-5. The rule quotes in the body come from the PR's earlier body and hua7450's review, not from my own reading. The hand computations use those quoted rules and SSA's published rates. Proposed follow-up
Generated by Claude Code |
|
Hub review in progress Reviewing head FindingsP2-1. The PR removes
|
| Spouse pension / month | main: SSI, AND-CS (head, spouse) | PR: SSI, AND-CS (head, spouse) |
|---|---|---|
| 1,000 | 255.50 each; 738.50, 0 | 255.50 each; 738.50, 0 |
| 1,014 | 248.50 each; 745.50, 0 | 248.50 each; 745.50, 0 |
| 1,015 | 248.00 each; 746.00, 0 | 248.00 each; 0, 0 |
| 1,200 | 155.50 each; 838.50, 0 | 155.50 each; 0, 0 |
At $1,015 the spouse's own countable income is 995 > 994, so the spouse is no longer exempt. The head's countable income becomes 995 (1,015 less the couple's remaining $20), and 248 + 995 ≥ 994 ends the head's grant. A $1 pension rise costs the couple $746 a month. Under the other reading (the couple rate for a couple member, i.e. SSI receipt alone), the head keeps $746–$838.50. This follows from the reading the body states, and hua7450 accepted that the income test applies to SSI recipients. But the amount is what the hub decides when it defines "the SSI limit", so add the 1,014/1,015 pair to co_state_supplement.yaml so that the choice is visible and pinned.
P3-3. No test covers the 3.549(E) under-18 gate
policyengine_us/variables/gov/states/co/ssa/state_supplement/co_state_supplement_deemed_income.py:79.
Mutant M5 drops person("is_child", year) *, which deems parents' income to adult clients aged 18–59. It survives all six AND-CS YAML files and both OAP files I ran. Every parental case has a child aged 1, 10 or 17. Add a co_state_supplement_deemed_income.yaml case: a disabled SSI client aged 18 (or 20) in a household with a parent earning $24,000/year, expecting co_state_supplement_deemed_income: 0. Pair it with a 17-year-old, who gets 967.50.
P3-4. Overlap with open PRs #10146 and #10141
- Limit SSI spousal-deeming child allocations to the couple's co-resident children #10146 (open, head
0b6e566ff4) editsco_state_supplement_countable_income.pylines 29 and 47 (it readsssi_in_kind_support_and_maintenance_monthlyandssi_countable_income_monthly). This PR deletes that formula. Whichever lands second must move Limit SSI spousal-deeming child allocations to the couple's co-resident children #10146's monthly reads into_and_cs_client_income.py:18,23,26, and into the gross income reads inco_state_supplement_deemed_income.py:37-38andco_state_supplement_deeming_exempt.py:39-40. Otherwise AND-CS keeps reading annual SSI income as a monthly average. That is the same on main, so it is a follow-up, not this PR's defect. - Apply 416.1163(e)(2) to deemed SSI and identify SSI couples by marriage, not tax roles #10141 (open, head
5bc46f232f) editsco_oap_deeming_exempt.py:45, three lines above this PR's rename at line 54. Expect a conflict or near-conflict there. - Count Colorado's in-kind support and maintenance for AND-CS clients in another person's household #10183 is stacked on this branch and touches
co_state_supplement.yamland_and_cs_client_income.py, as its comment says.
P3-5. The property tests disappear without a skip when hypothesis isn't installed
policyengine_us/tests/core/test_co_and_cs_invariants.py:260-266 (and main's test_co_oap_invariants.py).
After a plain uv sync, pytest reported test_co_and_cs_invariants.py 3 passed and test_co_oap_invariants.py 1 passed, with no skip. Once I installed --extra dev, they were 4 passed and 2 passed. CI installs --extra dev (.github/workflows/python-tests.yaml:34,100,178), so CI runs them. A local run can still look like a full pass without the property test. Replace the try/except ImportError with hypothesis = pytest.importorskip("hypothesis") at module level for the property test, or define a skipped placeholder test in the else branch, so that its absence shows up as a skip.
Generated by Claude Code
|
Ready for hub review Independent review of head FindingsP2-1. The PR removes
|
| Spouse pension / month | main: SSI, AND-CS (head, spouse) | PR: SSI, AND-CS (head, spouse) |
|---|---|---|
| 1,000 | 255.50 each; 738.50, 0 | 255.50 each; 738.50, 0 |
| 1,014 | 248.50 each; 745.50, 0 | 248.50 each; 745.50, 0 |
| 1,015 | 248.00 each; 746.00, 0 | 248.00 each; 0, 0 |
| 1,200 | 155.50 each; 838.50, 0 | 155.50 each; 0, 0 |
At $1,015 the spouse's own countable income is 995 > 994, so the spouse is no longer exempt. The head's countable income becomes 995 (1,015 less the couple's remaining $20), and 248 + 995 ≥ 994 ends the head's grant. A $1 pension rise costs the couple $746 a month. Under the other reading (the couple rate for a couple member, i.e. SSI receipt alone), the head keeps $746–$838.50. This follows from the reading the body states, and hua7450 accepted that the income test applies to SSI recipients. But the amount is what the hub decides when it defines "the SSI limit", so add the 1,014/1,015 pair to co_state_supplement.yaml so that the choice is visible and pinned.
P3-3. No test covers the 3.549(E) under-18 gate
policyengine_us/variables/gov/states/co/ssa/state_supplement/co_state_supplement_deemed_income.py:79.
Mutant M5 drops person("is_child", year) *, which deems parents' income to adult clients aged 18–59. It survives all six AND-CS YAML files and both OAP files I ran. Every parental case has a child aged 1, 10 or 17. Add a co_state_supplement_deemed_income.yaml case: a disabled SSI client aged 18 (or 20) in a household with a parent earning $24,000/year, expecting co_state_supplement_deemed_income: 0. Pair it with a 17-year-old, who gets 967.50.
P3-4. Overlap with open PRs #10146 and #10141
- Limit SSI spousal-deeming child allocations to the couple's co-resident children #10146 (open, head
0b6e566ff4) edits main'sco_state_supplement_countable_income.pyformula, switching its ISM and SSI countable income reads tossi_in_kind_support_and_maintenance_monthlyandssi_countable_income_monthly. This PR deletes that formula. Whichever lands second must move Limit SSI spousal-deeming child allocations to the couple's co-resident children #10146's monthly reads into_and_cs_client_income.py:18,23,26, and into the gross income reads inco_state_supplement_deemed_income.py:37-38andco_state_supplement_deeming_exempt.py:39-40. Otherwise AND-CS keeps reading annual SSI income as a monthly average. That is the same on main, so it is a follow-up, not this PR's defect. - Apply 416.1163(e)(2) to deemed SSI and identify SSI couples by marriage, not tax roles #10141 (open, head
5bc46f232f) editsco_oap_deeming_exempt.py:45, three lines above this PR's rename at line 54. Expect a conflict or near-conflict there. - Count Colorado's in-kind support and maintenance for AND-CS clients in another person's household #10183 is stacked on this branch and touches
co_state_supplement.yamland_and_cs_client_income.py, as its comment says.
P3-5. The property tests disappear without a skip when hypothesis isn't installed
policyengine_us/tests/core/test_co_and_cs_invariants.py:260-266 (and main's test_co_oap_invariants.py).
After a plain uv sync, pytest reported test_co_and_cs_invariants.py 3 passed and test_co_oap_invariants.py 1 passed, with no skip. Once I installed --extra dev, they were 4 passed and 2 passed. CI installs --extra dev (.github/workflows/python-tests.yaml:34,100,178), so CI runs them. A local run can still look like a full pass without the property test. Replace the try/except ImportError with hypothesis = pytest.importorskip("hypothesis") at module level for the property test, or define a skipped placeholder test in the else branch, so that its absence shows up as a skip.
Mutants
Each mutant ran in its own copy of the head, against the six AND-CS YAML files plus co_oap_deeming_exempt.yaml and co_oap.yaml, one file per process. The copy was deleted after each run, and git status in the PR worktree is clean.
| Mutant | Change | Result |
|---|---|---|
| M1 (hand-off) | spillover from the full $20: disregard → p.unearned in _and_cs_client_income.py:44 |
killed: co_state_supplement_deemed_income.yaml Case 8 (only) |
| M2 (hand-off) | SSI receipt skips the income limit: exempt = receives_ssi | (within_limit & receives_oap) |
killed: co_state_supplement_deeming_exempt.yaml Case 7 (only) |
| M3 (hand-off) | Medicaid drops receives_medicaid on the pre-2027 path (co_adult_financial_medicaid_enrolled.py:32) |
killed: co_state_supplement_deeming_exempt.yaml Case 11 (only; neither OAP file I ran covers reported coverage) |
| M4 (hand-off) | OAP route removed from the AND-CS exemption | killed: co_state_supplement_deeming_exempt.yaml Case 4 (only) |
| M5 (mine) | 3.549(E) under-18 gate dropped (co_state_supplement_deemed_income.py:79) |
survives all 8 files (P3-3) |
| M6 (mine) | the body's (A)(2)(f) wording: own share less non-SSI unearned, gated on unearned + SSI < $20 | survives all 8 files (P3-1) |
| M7 (mine) | payment floor without the eligibility gate (co_state_supplement.py:36) |
killed: co_state_supplement.yaml Cases 24, 26, 27, 30, 32 |
| M8 (mine) | Medicaid skip guard limited to the marital unit (co_state_supplement_deeming_exempt.py:65-69) |
killed: co_state_supplement_deemed_income.yaml Case 6 |
The hand-off's four mutants die where it says.
Checked and sound
-
The author's brief. It asked for: main merged (done at
06d34c12e6, and it still merges cleanly); every review item answered (below); hand-computed YAML with source comments; Hypothesis property tests with stated reasons; a mutant per fix; a rewritten body with theimpact:andaxiom:lines; a changelog fragment. All of these are present. The fragment misses the removal (P2-1). Two property gaps are the P3-1 and P3-3 cases. The brief's Count Colorado's in-kind support and maintenance for AND-CS clients in another person's household #10183 item is outside this PR. -
Head and scope. The head is
8707792d09, as the hand-off says.git diff origin/main...pr-10161is empty for.github/andpolicyengine_us/tests/policy/baseline/partners/, and the PR's file list (25 files) has nothing under either. -
CI. Pull request run 41721281741 at this head: conclusion success, and all 36 jobs concluded success, none cancelled or skipped. Those jobs include Household API Partners, all 11 Baseline shards, 9 Rest Python shards, Microsimulation and 9 Contrib shards. The plan put the heavy-a group (
REST_HEAVY_A_TESTS, 5 files) in Rest Python shard 8. Its log showsheavy-a (5 files)with 74 passed in 680.75 s, including all 28test_ssi_state_supplement_medicaid_dependency.pytestsPASSED. The core-1 group ran all fourtest_co_and_cs_invariants.pytests,test_propertiesincluded, and bothtest_co_oap_invariants.pytests; all passed. The earlier run at that SHA (41719043321) was skipped while the PR was a draft. -
The defect reproduces at main. The PR's
co_state_supplement.yaml, run against main's code, fails 6 of 32 cases: 20, 23 and 25 (floor) and 29, 30 and 31 (deeming). The other 26 pass on both. -
Hand values, computed before reading the code (2026 SSI $994/$1,491 and 2019 $771/$1,157, confirmed in
gov/ssa/ssi/amount/*.yaml):- Couple, head pension $487: SSI (1,491 − 467) / 2 = 512 each; own 487 − 10 = 477; 994 − 512 − 477 = 5, raised to 13.
- Pension $497: SSI 507 each; own 487; 507 + 487 = 994, which is not below the standard, so 0 and no floor.
- SSDI $300, spouse pension $400: 290 + (400 − 10) = 680.
- Case 8: the $10 interest uses the client's $10 share; (200 − 65) / 2 = 67.50; spouse 50 − 10 = 40.
- Case 7: (2,074 − 20 − 65) / 2 = 994.50 > 994, so not exempt.
- Spouse earning $1,500 on Medicaid: SSI deems (1,500 − 85) / 2 = 707.50 against the couple rate, SSI 783.50; (F) deems nothing; 994 − 783.50 = 210.50.
- Client SSI only, spouse earning $300: (300 − 65) / 2 = 117.50. Child, parent earning $2,000: (2,000 − 65) / 2 = 967.50.
- 2019 couple, spouse pension $100: SSI (1,157 − 80) / 2 = 538.50; deemed 100 − 20 = 80; 771 − 538.50 − 80 = 152.50.
All of these match the YAML and the hand-off.
-
Tests at this head, one file per process. AND-CS YAML:
co_state_supplement32,_countable_income4,_deemed_income10,_deeming_exempt11,_eligible11,_own_countable_income7, all passed. OAP YAML:co_oap36,_deemed_income20,_deeming_exempt9,_eligible5,_in_kind_support_and_maintenance2,_own_countable_income15, all passed. Python:test_co_and_cs_invariants.py4/4 andtest_co_oap_invariants.py2/2 (withhypothesis),test_ssi_state_supplement_couple_invariants.py6/6,test_ssi_state_supplement_medicaid_dependency.py28/28 (153 s of tests, 216 s with import). -
hua7450's review, item by item.
receives_medicaidis ORed in on both paths (co_adult_financial_medicaid_enrolled.py:32,66). Deeming-exempt Case 11 setsreceives_medicaid: trueandmedicaid_enrolled: false, and mutant M3 shows that case is what kills the regression.- Deeming-exempt Cases 1, 2, 4, 7 and 8 set
co_adult_financial_medicaid_enrolled: false. Cases 9 and 10 useperiod: 2020with year-keyedstate_codeand Medicaid inputs and month-keyedssiand outputs. - One Medicaid variable; OAP receipt by month (
co_state_supplement_deeming_exempt.py:52-56); OAP's readings for (f) and for the SSI income test; heavy-a in the body.
The optional items are done too: reading 4 is in the body; the
earned_share.yamltitle has no page; theassistance_exemption_applies.yaml3.545(F) title says "effective March 2, 2014";payment_floor.yamlopens the packet at page 1 and is titled#page 1,4,9; invariant 4 scopes only the countable assertion (test_co_and_cs_invariants.py:164-168). The OAP test and variable edits are pure renames: every changed line swapsco_oap_medicaid_enrolledforco_adult_financial_medicaid_enrolled. -
No Medicaid loop.
co_adult_financial_medicaid_enrolledoverrides itself with reported coverage inside its branch (:56-66) and pops the branch infinally. Both deeming exemptions read only it, and only past their skip guards (co_oap_deeming_exempt.py:51-55,co_state_supplement_deeming_exempt.py:64-74). I probed a mixed couple neither test covers: an OAP client aged 66 married to a disabled AND-CS client aged 45, spouse on SNAP workfare, pension $300 or $800, in 2026 and 2030.co_oap,co_state_supplement,snap,medicaid_enrolledand both exemptions were identical in forward and reverse calculation order, noco_adult_financial_medicaid*branch survived, and nothing recursed. -
Readers.
co_state_supplementis read by SNAP unearned income (gov/usda/snap/income/sources/unearned.yaml:27),household_state_benefits(four lists),spm_unit_benefits,programs.yamland four reforms (Tlaib x3, TX rebate), all as a plain sum.co_state_supplement_countable_income,_own_countable_income,_deemed_incomeand_deeming_exempthave one reader each, inside AND-CS.co_adult_financial_medicaid_enrolledis read only by the two deeming exemptions.payment_flooris read only byco_state_supplement(OAP reads its own).assistance_exemption_appliesis read only byco_state_supplement_deeming_exempt. No reader becomes reachable that wasn't before. The comment that "SNAP counts both grants as income" holds:co_oapandco_state_supplementare both in SNAP's unearned sources. -
Code claims. Since 2012 the AND-CS grant standard has equalled the SSI individual rate in every year (
grant_standard.yamlagainstindividual.yaml, 2012–2026), asco_state_supplement.py:24-28says. The floor is $0 before 2026 (Case 21) and applies only when the grant is positive (Cases 24, 26 and 32). The (F) exemption is off before 2020-03 (Case 9's month split). -
Body and hand-off claims. The test counts, the line references (
co_adult_financial_medicaid_enrolled.py:29-32,co_state_supplement_deeming_exempt.py:29-45, 48-56, 58-74,_and_cs_client_income.py:36-44) and the CI run all match. Commit1392313e09, cited for Pay CO, TX and NM SSI supplements to both members of an SSI couple #10145's released fragment, is main's release commit; the PR adds only its own fragment. Theimpact:andaxiom:lines are present as the brief set them. -
Can it move baseline outputs? Yes.
co_state_supplementchanges for CO AND-CS clients: up at the 2026 floor and where a Medicaid spouse or parent is now exempt, down where non-SSI spousal or parental income below SSI's deeming threshold is now deemed, for SSI couples before March 2020, and for couple members above $994 of own income (P3-2). Through SNAP,spm_unit_benefitsand household net income follow. The hub's population run should report CO AND-CS spending and recipients for 2019, 2020–2025 and 2026, plus CO SNAP, against main, and break 2026 out by SSI couples and floor recipients. The body's cited caseload, about 250, is the scale to compare against.
What I couldn't check
- 9 CCR 2503-5 itself. This session's network policy refuses www.sos.state.co.us (CONNECT 403; WebFetch doesn't resolve it), and also web.archive.org, ecfr.gov, govinfo.gov, law.cornell.edu, ssa.gov, cdhs.colorado.gov and leg.colorado.gov. So I confirmed no quote of 3.510, 3.520.781(A), 3.520.786, 3.545, 3.546 or 3.549 (A)–(H), nor the 2020 and 2014 dating. That includes the $13 floor, the married $10 share, the (A)(2)(f) wording behind P3-1, the "SSI limit" in (F), "unemancipated child under 18" in (E), and the CDHS packet's caseload and cost. I relied on the code's and hua7450's statements of the rule. The hub, or a session that can reach the Secretary of State's site, should check the (A)(2)(f) and (F) text against P3-1 and P3-2.
- Population impact and microsimulation (not run, per the brief).
- The memory figures in the hand-off (3.0 GB, 1.25 GB peak RSS). This VM has no
/usr/bin/time, so I measured wall time only.
Generated by Claude Code
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
A spouse or parent who receives SSI now meets 3.549(F)'s income condition by receiving it, since SSI's own test already held their countable income within the limit SSI applies to them (the couple rate in an eligible couple), as 3.570.43 uses the phrase. Someone on Old Age Pension or Medicaid without SSI still faces the individual federal benefit rate on their own countable income. This removes a $746 cliff where a $1 pension rise ended an SSI couple head's grant; new co_state_supplement Cases 33-35 pin the payment at $1,014, $1,015 and $1,200 pensions. Also from review round 1: - the 3.549(A)(2)(f) comment now describes what the code does (own share less gross unearned income, SSI included), pinned by a case with $5 SSI; - cases for 3.549(E)'s under-18 gate (client 18 vs 17); - the property tests report a skip when hypothesis isn't installed; - a removed fragment for co_oap_medicaid_enrolled, which shipped in 2.52.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GVxJNmuxpvgfooGjd
Brings in #10161's round 1 fixes. Both branches appended co_state_supplement cases from Case 33: #10161's three SSI-couple cases keep 33-35, and this branch's six ISM cases become 36-41. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6GVxJNmuxpvgfooGjd
|
Ready for hub review Head: Round 1 fixes (items 1 to 6). The branch was at the named head Items
Tests at this head, one file per process (
|
| File | Result |
|---|---|
co_state_supplement.yaml |
35 passed |
co_state_supplement_deeming_exempt.yaml |
11 passed |
co_state_supplement_deemed_income.yaml |
12 passed |
co_state_supplement_own_countable_income.yaml |
8 passed |
co_oap_deemed_income.yaml |
20 passed |
co_oap_in_kind_support_and_maintenance.yaml |
2 passed |
test_co_and_cs_invariants.py |
4 passed |
test_co_oap_invariants.py |
2 passed |
ruff format --check and ruff check are clean on the four changed Python files.
Mutants
Each mutant ran in its own process on the working tree, and I restored the file with git checkout after each one (git status clean).
| Mutant | Killed by |
|---|---|
MA: exempt = within_limit & (receives_ssi | receives_oap) |
_deeming_exempt Case 7; co_state_supplement Cases 34, 35 (_deemed_income 12/12 pass) |
M5: drop person("is_child", year) * |
_deemed_income Case 11 |
| M6: spillover gated on unearned + SSI < share, less non-SSI unearned only | _own_countable_income Case 8 |
CI
Pull request run 41859948897 at 3371fc5573: conclusion success, all 36 jobs success, none cancelled or skipped. It took about 66 minutes; the last job to finish was Contrib other-shard-3.
Not checked
- I didn't fetch 9 CCR 2503-5. The (F), 3.570.43 and (A)(2) wording in the code comment and body is the hub's quoted text.
- No microsimulation or population impact (per the brief).
- No partner or
.github/file changed.
Proposed follow-up
None beyond the #10146 overlap the body already names.
Generated by Claude Code
|
Hub review in progress (superseded) The final review is at #10161 (comment). Generated by Claude Code |
|
Ready for hub review This is round 2, a delta review of head
The fixes do what round 1 and items 1 to 6 of the assignment asked. I found no wrong result, no failing test or CI job, and no false claim in the body. One P3 remains: no test pins the individual-rate limit on the Old Age Pension route, so my own mutant MB, which drops that limit, passes every existing case. The PR picks one reading of the undefined "SSI limit" in 9 CCR 2503-5 3.549(F), so METHODOLOGY_CHOICE is yes. The hub settled that reading, and the code applies it as settled. FindingsP3-1. No test pins the individual-rate limit on the Old Age Pension route
The hub's reading: "Someone on Old Age Pension or Medicaid without SSI meets it when their own monthly countable income ... doesn't exceed the individual federal benefit rate". The Medicaid half is pinned by Failure scenario. Mutant MB,
A future edit could drop the limit unnoticed. Fix. Add this case to - name: Case 12, an Old Age Pension spouse above the individual rate is not exempt.
# The spouse is 65, on OAP but not SSI or Medicaid, with a $1,030/month
# pension. OAP: own countable 1,030 - 10 = 1,020, below the $1,032 standard,
# so OAP is paid. SSI countable income 1,030 - 20 = 1,010 exceeds the $994
# individual rate, so 3.549(F)'s income condition fails.
period: 2026-01
input:
people:
head:
age: 40
is_ssi_disabled: true
ssi: 500
spouse:
age: 65
ssi: 0
pension_income: 12_360
co_adult_financial_medicaid_enrolled: false
marital_units:
marital_unit:
members: [head, spouse]
households:
household:
members: [head, spouse]
state_code: CO
output:
co_state_supplement_deeming_exempt: [true, false]Notes for the hub (not defects in this PR)
MutantsEach mutant ran in its own worktree of the head, one test process per file, against the 6 AND-CS YAML files plus
Checked and sound
What I couldn't check
Generated by Claude Code |
|
Picking this up for the US hub. I'll post a hand-off comment here when it's ready. Generated by Claude Code |
…xemption No test covered an OAP spouse not on SSI whose own SSI countable income exceeds the individual rate while OAP is still paid, so dropping the limit (exempt = receives_ssi | receives_oap) passed every case. Case 12 covers that spouse and fails under that mutant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6K4hbmpvP2YevFmELw
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6K4hbmpvP2YevFmELw
No test set is_homeless, so dropping homeless from _ism_exempt passed every CO SSA case; Case 19 pins it. The ISM invariants docstring cited co_state_supplement Case 34, which the merge of #10161 renumbered to 37. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LwQq6K4hbmpvP2YevFmELw
|
Ready for hub review Head: This round builds on Items
Tests at the head (one file per process)
No Python file changed, so ruff had nothing to check. Mutant
Hand computation (2026, from the case's comment and the review)
The mutant's flip to CIPull request run 41943988631 at The body has no CI status sentence to update. Its only CI mention is the heavy-a timing at the round 1 head (run 41721281741), a measurement labelled with its head, which I left as it was. Judgment calls
What I couldn't check
Generated by Claude Code |
|
US + core hub merge audit, us#10161 at
🤖 Generated with Claude Code |
Main's Colorado AND-CS rules (#10161) found a client's spouse through the marital unit. In a situation that omits marital units, that unit holds every member, so a married client got the full $20 disregard and a third adult's income was deemed as a spouse's. The $20 disregard split (3.549(A)(2)(c)(1)) now reads state_is_married, and spouse deeming (3.549(C)-(D)) reads state_couple_total, as Old Age Pension does. Both keep a declared spouse who lives apart and count only SSI's identified spouse in a default unit. Case 42 covers a couple beside a claimed third adult. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
This PR changes Colorado AND-CS (
co_state_supplement) in three ways under 9 CCR 2503-5 (ruleVersionId 12428). It builds on #10145 and #10176 (OAP).main, 3.549(A) applies only to SSI couples, and everyone else uses federalssi_countable_income. This PR applies 3.549 to every client:co_adult_financial_medicaid_enrolledreplaces OAP'sco_oap_medicaid_enrolled. It keeps OAP's reported-coverage route (receives_medicaid). Both deeming exemptions read it, so AND-CS and OAP share one private branch and never open one inside the other.The payment floor
History. The floor first appears in the January 1, 2026 emergency rule (ruleVersionId 12318). Before then, 3.546(C) allowed only discretionary MOE lump sums (ruleVersionId 11861). So
payment_floor.yamlholds $0 until 2026 and $13 from 2026-01-01.Who gets it. CDHS's rulemaking packet 2025-00596 (p. 4) gives the AND-CS caseload as about 250 people and the cost of meeting the floor as $285. Paying the floor to every disabled SSI recipient under 60 with a $0 grant would cost thousands of times that, so the 3.520.781(A) reading fits.
3.546's "but are not receiving the full SSI benefit standard". Since 2012 the AND-CS grant standard has equaled the SSI individual rate ($994 in 2026). A single client on the full rate 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 ($745.50 each) doesn't receive the full individual standard and stays a client, as in #10145.
3.549 outside SSI couples
ssi_countable_income(before)Dating (F). The current (F) took effect March 1, 2020 (ruleVersionId 8577). The earlier 3.545(F) (effective March 2, 2014; version in force January 1, 2020) excluded only "the income from those benefits", which the deemed sources here never include. So
income/deeming/assistance_exemption_applies.yamlholds false before 2020-03-01. Before March 2020, AND-CS deems each SSI couple member's non-SSI income to the other (Case 31: in 2019 the head gets $152.50 rather than $232.50).OAP receipt for (F). The PR judges it month by month on the spouse's own income, as
co_oap_deeming_exemptdoes: OAP-eligible, with the OAP standard less own countable income positive.Medicaid for (F). From 2027, membership in a household that receives SNAP can meet the community engagement requirement (42 CFR 435.554(c)(7)), and SNAP counts both grants as income.
co_adult_financial_medicaid_enrolledcomputesmedicaid_enrolledin a private branch where only reported coverage exempts anyone, so the branch settles enrollment while AND-CS still deems every other Medicaid spouse's or parent's income. The result does not depend on calculation order (tested). AND-CS asks for it only for someone within the limit, not exempt otherwise, and sharing a marital unit, tax unit or household with an AND-CS client.Worked cases (all in YAML)
2026, monthly unless noted.
Invariants
policyengine_us/tests/core/test_co_and_cs_invariants.pychecks 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.Tests
co_state_supplement.yaml(35),co_state_supplement_own_countable_income.yaml(8),co_state_supplement_deemed_income.yaml(12),co_state_supplement_countable_income.yaml(4),co_state_supplement_eligible.yaml(11), and the OAP files, which now use the shared Medicaid variable.co_state_supplement_deeming_exempt.yaml(12) builds each case around a real client and spouse, with year-keyed inputs for the 2020 cases, and Case 12 pins the individual-rate limit on the Old Age Pension route.test_co_and_cs_invariants.py(4),test_co_oap_invariants.py(2; in both, the property test reports a skip when the environment lackshypothesis),test_ssi_state_supplement_couple_invariants.py(6) andtest_ssi_state_supplement_medicaid_dependency.py(28).test_ssi_state_supplement_medicaid_dependency.pyruns in heavy-a (MakefileREST_HEAVY_A_TESTS), not Rest/core. The invariants files run in core. Local Linux measurements (one process per file, peak RSS): Medicaid dependency 3.0 GB, 215 s with import; each invariants file about 1.25 GB, 50 s. On Linux CI (run 41721281741, at an earlier head of this PR), heavy-a's 5 files ran 74 tests in 681 s.Readings to check
Overlap
co_state_supplement_countable_incometo SSI's monthly ISM and countable income, and this PR deletes that formula. Whichever lands second moves those monthly reads into_and_cs_client_income.py,co_state_supplement_deemed_income.pyandco_state_supplement_deeming_exempt.py. Apply 416.1163(e)(2) to deemed SSI and identify SSI couples by marriage, not tax roles #10141 (open) editsco_oap_deeming_exempt.pythree lines above this PR's rename, and Count Colorado's in-kind support and maintenance for AND-CS clients in another person's household #10183 builds on this branch.Not modeled
Microsimulation impact
We compared
mainat the merge base25c4253483with this head,96859129b5, on the default dataset for 2026. We estimate that AND-CS (co_state_supplement) pays $0 on both sides, and that SNAP, taxes, benefits and household net income don't change.co_state_supplement_eligible. All five receive SSI, and none has a spouse in the household. Onmain, SSI plus AND-CS countable income equals the $994 grant standard for each of them, so each grant comes to $0.co_state_supplement_eligible, and neither one's own countable income exceeds $994. So no weighted record tests the couple cases above.co_state_supplement_countable_incomefalls by $4.30tn because the two sides compute it for different people. Onmainit carries nodefined_for, so the model computes it for people in every state, mostly as SSI countable income. On this branch, its two parts carrydefined_for = "co_state_supplement_eligible". Onlyco_state_supplementreads it, and that variable has the samedefined_foron both sides, so no payment changes.maintotal, 2026co_state_supplementco_state_supplement_countable_incomesnapincome_taxstate_income_taxhousehold_net_income(households)household_benefitsimpact: on the default dataset in 2026, AND-CS pays $0 on both sides, and SNAP, taxes, benefits and household net income don't change. Two sample clients who work (20,769 weighted) count $10 a month more income, and their grant stays $0.
axiom: TheAxiomFoundation/rulespec-us#1716 queued, extended with a comment (payment floor); TheAxiomFoundation/rulespec-us#1717 queued, extended with a comment (parental deeming, married disregard, SSI limit)
🤖 Generated with Claude Code