Skip to content

Count Colorado's in-kind support and maintenance for AND-CS clients in another person's household - #10183

Open
MaxGhenis wants to merge 11 commits into
co-and-cs-payment-floor-3549from
co-adult-financial-ism
Open

MaxGhenis wants to merge 11 commits into
co-and-cs-payment-floor-3549from
co-adult-financial-ism

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Stacked on #10161 (base co-and-cs-payment-floor-3549). Review only the diff from #10161's head 3371fc5573, which this branch has merged. The hub retargets this PR to main once #10161 lands.

Summary

Colorado counts in-kind support and maintenance (ISM) as unearned income of Old Age Pension and AND-CS clients (9 CCR 2503-5 3.520.79). Since March 2, 2014, an SSI recipient whom SSA charges ISM is charged "a matching ISM" (3.520.79(B)(6), 3.520.71(E)).

Both programs counted only SSI's presumed maximum value (PMV). So an SSI recipient in another person's household got SSA's one-third reduction back in full: $331.33/month of AND-CS in 2026. With the matching ISM, that client's AND-CS grant is $20/month. OAP counted no ISM at all for that client, and none for any client without SSI.

  • New co_ssa_in_kind_support_and_maintenance (Person, MONTH) is the ISM Colorado counts. AND-CS (_and_cs_client_income.py) and OAP (co_oap_in_kind_support_and_maintenance, still in cents) read it.
  • It isn't restricted to Colorado residents: OAP deems a spouse's unearned income, matching ISM included (3.534(B)(1)), and the spouse may live elsewhere (3.534(C)). The programs that read it are Colorado-only.
  • New parameters under gov.states.co.ssa.ism:
    • maximum: the published monthly maximum, 2014-2026;
    • component_share.shelter and component_share.food: the 2007-2013 caps.

What the sources say

Colorado counts ISM for a client in another person's household. Every primary source says so, and has since at least 2003.

Source What it says
9 CCR 2503-5 3.520.79 (2026) (A) an ISM amount "shall be determined and counted as unearned income" for clients not paying their fair share of shelter costs. (C)(3) a client "paying no shelter costs" is counted the current maximum. (B)(6) an SSI recipient charged ISM by SSA "shall be charged a matching ISM".
3.520.71(E) "The county department shall deduct an identical ISM amount for Adult Financial programs until the SSA ISM is removed."
3.520.79 as first adopted (eff. 3/2/14) (D) an SSI recipient charged ISM by SSA "shall be charged a matching ISM."
9 CCR 2503-2 3.250.22 (2012) and 9 CCR 2503-1 3.250.22 (with 2003 amendments) ISM for OAP and AND/SSI-CS clients not paying their fair share of housing costs is counted as unearned income, capped at the shelter and utility component of the grant standard.
AND/SSI-CS component tables: 2004, 2007, 2014 Shelter and utilities 37.0% (2004) and 36.6% (from 1/1/07) of the standard; food 20.5%. From 1/1/14 shelter is one-third of the SSI standard plus $20, $260, with no food component.
CDHS rulemaking packet 2025-00596 (p. 4) The 2026 ISM rises from $342 to $351, and Colorado "matches the SSA's COLA which includes the application of an ISM to certain AF recipients."
SSA, State Assistance Programs for SSI Recipients, Colorado, 2002 through 2011 (secondary) People in another's household get the living-independently standard, and the "state supplement is increased to offset the reduced federal payment."

SSA's sentence is the only source for a full offset. Colorado's rule text counted ISM in every year SSA's reports cover, and the same reports call Colorado's income rules federal, which 3.549 and 3.250.22 contradict. The sentence reads as a description of the payment formula (standard − SSI − income), which does grow when SSI shrinks, before ISM is counted.

Reading of the ISM amount

This PR follows 3.520.79(B)(6) and 3.520.71(E). (B)(6): "The client shall be charged a matching ISM for Adult Financial programs, unless good cause is provided due to SSA backlog." 3.520.71(E): "The county department shall deduct an identical ISM amount for Adult Financial programs until the SSA ISM is removed." So an SSI recipient whom SSA charges an ISM gets a matching ISM, SSA's one-third value ($331.33 in 2026), and AND-CS pays that client $20 a month. The table shows the other amounts the rule's general computation and SSA's reports could suggest:

Reading ISM (2026) AND-CS, single, no other income AND-CS, SSI couple, each Basis
(a) matching: SSA's ISM (implemented) 331.33 $20.00 $258.50 (B)(6) "matching ISM", 3.520.71(E) "identical ISM amount", 20 CFR 416.1131(a)
(b) Colorado's maximum 351 $0.33, raised to the $13 floor $156.00 (C)(3) "current maximum ISM amount"
(c) no ISM 0 $331.33 $497.00 SSA's 2002-2011 Colorado reports only

(B)(6) and 3.520.71(E) address this client (an SSI recipient whom SSA charges ISM) and speak to the amount, while (C) is the general computation. Under (a), Colorado's $20 unearned disregard (3.549(A)(2)(c)) applies to the matched ISM like any other unearned income, and that disregard is the $20 grant. Switching to (b) changes one line in _ssa_ism; round 1's mutant of that line fails the ISM and AND-CS YAML files.

The model

Period Who ISM
2002 – 2006 everyone SSI's PMV ISM, halved for a couple, as #10161 counted it, until we audit the pre-2014 base. Under the one-third reduction SSI counts no PMV ISM, so AND-CS still offsets the reduction in full (January 2005: 604 − 386 = $218).
2007 – 2013 everyone not exempt shelter: 36.6% of the AND-CS standard when others supply shelter; separately, food: 20.5% of the standard when others pay all meals
Jan – Feb 2014 everyone not exempt who receives shelter from others $260
Mar 2014 – SSI recipients SSA's ISM: one-third of the benefit rate under the one-third reduction, otherwise the PMV ISM (halved for a couple)
Mar 2014 – others not exempt who receive shelter from others the published maximum ($351 in 2026)
  • Exempt (3.520.79(B)(1)-(3); 3.250.22(A), (B), (G)): clients who own and live in their home, receive housing assistance, or are homeless. For SSI recipients charged ISM, (B)(6) overrides these.
  • Medical confinement (3.520.786(B); 3.250.32 before 2014): a client without SSI in a medical treatment facility is counted no ISM (Case 18). An SSI recipient is charged whatever ISM SSA charges: the earlier review found that a facility resident on SSI whose care Medicaid doesn't mostly pay, with outside shelter support, is charged SSA's $351.33 in 2026. PolicyEngine's inputs can't separate room and board furnished during medical confinement from separate shelter support.
  • Inputs: Colorado's amount depends on what the client pays, not on what the shelter is worth. PolicyEngine has no input for the payment, the fair share or the market value, so a client who receives shelter from others is taken to pay none and is counted the maximum ((C)(3)).
  • 2002-2006: the rule counted ISM then. But the table effective January 1, 2004 (shelter 37.0%) prints a $513 AND/SSI-CS maximum grant, where PolicyEngine's grant standard is $601, so the component's base is unsettled. Until the pre-2014 standards are audited, these years keep Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's count. For a single 2004 client that's 564 / 3 + 20 = $208, between the two bases' shelter components ($189.81 and $222.37).
  • Grant cents: 3.581(E) (p. 134) keeps cents when SSI reduces the grant.

Worked cases (YAML)

Monthly unless noted. "Before" is #10161's head 8707792d09.

Case Before After Rule
AND-CS 2026, single, another's household (SSI 662.67) $331.33 $20.00 994 − 662.67 − (331.33 − 20)
AND-CS 2026, same with SSDI $100 $331.33 $0 582.67 + 100 + 331.33 − 20 = 994: not eligible
AND-CS 2026, SSI couple, another's household (497 each) $497.00 each $258.50 each 994 − 497 − (248.50 − 10)
AND-CS 2026, single, outside shelter support (PMV) $0 $0 unchanged
AND-CS 2025, single, another's household $322.33 $20.00 967 − 644.67 − 302.33
AND-CS 2014 (year), single, another's household $2,884/yr $200.67/yr Jan-Feb 721 − 480.67 − 240 = 0.33; Mar-Dec 20
AND-CS 2012, single, another's household $232.67 $0 ISM 255.47 + 143.09 = 398.56
AND-CS January 2004, single renter, outside shelter support (SSI 376) $37 $37 601 − 376 − (208 − 20)
OAP 2026, ISM of an SSI recipient (65) in another's household 0 331.33 994 / 3; own countable 311.33
OAP 2026, same person living in Nevada (a spouse elsewhere) 0 331.33 not restricted to Colorado
OAP 2026, ISM of a client without SSI, outside shelter support 0 351 (C)(3) maximum

co_state_supplement.yaml Case 28 (single, another's household, 2026) is the one existing AND-CS case whose value moves: $3,976/yr to $240/yr, i.e. 12 × (994 − 662.67 − 311.33). OAP's co_oap_own_countable_income.yaml Case 10 (62, no SSI, outside shelter support) moves from $0 to $3,972/yr: 12 × (351 − 20).

Invariants

policyengine_us/tests/core/test_co_ism_invariants.py checks Hypothesis-drawn SSI clients (single or couple, SSDI and earnings, either arrangement, a drawn support value), each beside a twin with no support, plus non-SSI clients aged 62, in 2026:

  1. Matching (differential): an SSI recipient's ISM equals SSA's. Under the one-third reduction, that is the twins' difference in ssi_amount_if_eligible. Otherwise it is SSI's PMV ISM, halved for a couple.
  2. Bounds: 0 ≤ ISM ≤ the PMV, for SSI recipients.
  3. No backfill: in-kind support lowers SSI + AND-CS by at least SSA's ISM, less the client's share of the $20 disregard, less the floor top-up the rule allows (max(0, $13 − grant) for a positive grant). The top-up comes from the rule, not from the supplement under test.
  4. Payment, not value: a client without SSI who receives shelter from others is counted the $351 maximum whatever the shelter is worth.

Tests

  • YAML: co_ssa_in_kind_support_and_maintenance.yaml (19; Case 19 pins the homeless exemption), co_state_supplement.yaml (41; Case 28 updated, Cases 36-41 new; Cases 33-35 come from Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161), co_oap_in_kind_support_and_maintenance.yaml (5; three new), co_oap_own_countable_income.yaml (15; Case 10 updated), co_oap_deemed_income.yaml (21; Case 21 deems a Nevada spouse's Colorado ISM: 1,000 + 351 − 1,032 = 319), and the other CO AND-CS and OAP files.
  • Python: test_co_ism_invariants.py, test_co_and_cs_invariants.py, test_co_oap_invariants.py, test_ssi_state_supplement_couple_invariants.py, test_ssi_state_supplement_medicaid_dependency.py. The ISM invariants run in core: about 1.0 GB peak RSS and 45 s with import, measured locally on Linux.

Not modeled

  • 3.520.79(C)(1)-(2) by payment, fair share and market value: PE has no such inputs.
  • Life estates (D), and the pre-2014 educational-grant and boarder rules.
  • Pre-2014 in-kind items other than food and shelter.
  • The SSA-backlog good-cause exception.
  • Pre-2014 OAP components: PE models OAP from 2023.
  • Colorado's own component base for 2002-2006 (see "The model").

Overlap with open PRs

impact: the hub will measure

axiom: (hub files pe-parity before landing)


Generated by Claude Code

MaxGhenis and others added 4 commits October 12, 2026 20:44
9 CCR 2503-5 3.520.79 counts in-kind support and maintenance as unearned
income of OAP and AND-CS clients. Since March 2, 2014 an SSI recipient
whom SSA charges ISM is charged a matching ISM (3.520.79(B)(6),
3.520.71(E)). AND-CS counted only SSI's presumed maximum value, so a
client on SSI's one-third reduction (20 CFR 416.1131) was paid the whole
reduction back: $331.33/month in 2026 instead of $20.

co_ssa_in_kind_support_and_maintenance matches SSA's ISM for SSI
recipients (the one-third reduction or the presumed maximum value, halved
for a couple), counts up to the published maximum for other clients
(3.520.79(C)), and before 2014 caps shelter at the grant standard's
shelter component and counts food supplied in full (3.250.22,
3.250.222). AND-CS reads it; OAP will once its income rewrite lands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… is worth

3.520.79(C) sets the amount from what the client pays: the maximum less
the payment, the lesser of the fair share and the maximum less the
payment, or the maximum for a client paying nothing. It never uses the
value of the shelter. With no input for the payment, a client receiving
shelter from others is taken to pay none and is counted the maximum;
ssi_shelter_support_value no longer caps Colorado's own amount (it still
feeds SSA's ISM, which SSI recipients match). Applies the GPT-6.1 Sol
review of 9cb7d30.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…re invariant

Applies the GPT-6.1 Sol review (round 2) of 0c4370a:
- 3.520.786(B) (3.250.32 before 2014) exempts room and board furnished
  during medical confinement and paid by a third party, so a client in a
  medical treatment facility is counted no ISM.
- The January 2004 AND/SSI-CS table prints a $513 maximum grant against a
  $601 grant standard, so the base of its 37% shelter and 20.5% food
  components is unsettled. The pre-2014 formula now starts with the 2007
  table (36.6%, 20.5%); 2002-2006 are left for the standards audit.
- The no-backfill invariant subtracts any state supplementary payment that
  raises a grant to the $13 floor; the review's counterexample (a couple
  earning $1,145 and $106 a month) is pinned as a Hypothesis example.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis force-pushed the co-adult-financial-ism branch from 09e2819 to 8e69c97 Compare October 13, 2026 00:53
MaxGhenis added a commit that referenced this pull request Oct 13, 2026
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>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Handing this PR to the US + core hub at the hub's request. GPT-6.1 Sol's latest review requests changes at this head, so the fixes below come first.

Review findings

  1. AND-CS loses a deduction for 2002-2006 (blocks merge). co_ssa_in_kind_support_and_maintenance has no formula before 2007, so it returns $0 in those years, where Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161 counts SSI's presumed maximum value. Take a single disabled 40-year-old renter with no income and outside shelter support in January 2004. Both heads compute SSI of $376. Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161 counts $188 of income and computes AND-CS of $37, and this head counts none and computes $225.

    Colorado counted ISM for this client then: 3.250.221(C) counts "the maximum ISM amount in effect at the time" when others supply all shelter costs. The 37% shelter share gives $189.81 of the table's $513 or $222.37 of PolicyEngine's $601 standard, for a grant of $55.19 or $22.63, and Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's $37 falls between them. I recommend a formula_2002 that returns Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's count, halved for a couple, until the pre-2014 audit settles the base, with a YAML case for this client at $37 a month. The variable's comment and the body's pre-2014 rows need the same change.

  2. Invariant 3 misses an excessive grant (doesn't block). test_co_ism_invariants.py:153 takes the floor top-up from the supplement under test. If the pinned couple's supported client got $313 where the rule pays $13, the allowed drop would move with it and the assertion would still pass. Derive the allowance from the rule instead, as max(0, payment_floor - grant) for a positive grant. Current output stays correct.

  3. The body needs two corrections (doesn't block). "All 101 CO SSA cases" should read 106, the count at this head. "A client in a medical treatment facility is counted no ISM" holds for a client without SSI (Case 18). A facility resident on SSI whose care Medicaid doesn't mostly pay, with outside shelter support, gets SSA's $351.33 in 2026. PolicyEngine's inputs can't separate medical room and board from separate shelter assistance, and the review found no confirmed legal defect there. That sentence, the SSI bullet below it and the formula_2014_03 comment need only that qualifier.

OAP

#10176 merged, so OAP no longer waits on it. Main's co_oap_in_kind_support_and_maintenance counts only SSI's presumed maximum value, and its comment lists the one-third reduction and Colorado's own ISM as unmodeled. The swap belongs in that variable's formula, keeping cents, and not in co_oap_own_countable_income as the body says.

The swap needs YAML cases computed from the rule, plus one for a spouse outside Colorado: co_oap_deemed_income reads this variable for a spouse who may live elsewhere (3.534(C)), and co_ssa_in_kind_support_and_maintenance carries defined_for = StateCode.CO. This PR can take the swap once it merges main; otherwise the next PR takes it.

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

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

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

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

…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>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: 64a74c5bf7219fada7853ba579e067fea2f5355c (draft; base co-and-cs-payment-floor-3549, left as it stands for the hub to retarget).

I continue earlier sessions' work on this brief. They pushed nothing here. I kept this PR's four earlier commits and merged #10161's new head (8707792d09) into it without rebasing: 48f0100d73, with no conflicts. #10161's change to _and_cs_client_income.py (the married-half spillover) and this PR's (reading co_ssa_in_kind_support_and_maintenance) sit side by side there.

The hub hand-off's review findings (GPT-6.1 Sol at 8e69c97d13)

  1. 2002-2006 lost the ISM deduction (blocked merge). Fixed. formula_2002 in co_ssa_in_kind_support_and_maintenance.py:95-111 returns Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's count: SSI's PMV ISM, halved for a couple. New co_state_supplement.yaml Case 38 is the review's client: January 2004, single disabled 40-year-old renter, no income, outside shelter support. Hand: PMV 564 / 3 + 20 = 208; SSI 564 − 188 = 376; AND-CS countable 208 − 20 = 188; grant 601 − 376 − 188 = $37. YAML expects SSI 376, ISM 208, countable 188, AND-CS 37. The variable's comment and the body's model table and caveat say the same.
  2. Invariant 3 took the floor top-up from the supplement under test. Fixed in test_co_ism_invariants.py:152-156: max(0, payment_floor − grant) for a grant positive in cents, else 0.
  3. Body corrections. I rewrote the body. It lists per-file case counts instead of a total. The medical-confinement statement now applies to clients without SSI, and the SSI qualifier is in the body and in the formula_2014_03 comment (co_ssa_in_kind_support_and_maintenance.py:140-151).

OAP swap. Done in co_oap_in_kind_support_and_maintenance.py:16-21, keeping cents. co_ssa_in_kind_support_and_maintenance drops defined_for = StateCode.CO (comment at :80-83), so OAP's deeming of a spouse who lives elsewhere still reads it. New OAP YAML cases:

  • an SSI recipient (65) in another's household: ISM 331.33 (994 / 3), own countable 311.33. Main counted 0.
  • the same person in Nevada: 331.33.
  • a client without SSI and with outside shelter support: 351, the (C)(3) maximum. Main counted 0.

co_oap_own_countable_income.yaml Case 10 asserted the old "not modeled" behavior. Now it's 12 × (351 − 20) = $3,972/yr.

Values that move

  • co_state_supplement.yaml Case 28 (2026, single SSI recipient in another's household): $3,976/yr → $240/yr. Before: SSI 662.67 (two-thirds of $994), no ISM counted, so 994 − 662.67 = 331.33/month. After: the matching ISM of 331.33 less the $20 disregard is 311.33, and 994 − 662.67 − 311.33 = 20/month.
  • No other existing AND-CS expectation changes (diff against Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's head). Cases 33-38 are new.
  • co_oap_own_countable_income.yaml Case 10: $0 → $3,972/yr, as above.

Tests run (this head, Linux, Python 3.14)

  • YAML, one file per process: co_ssa_in_kind_support_and_maintenance.yaml 18, co_state_supplement.yaml 38, co_state_supplement_countable_income 4, _deemed_income 10, _deeming_exempt 11, _eligible 11, _own_countable_income 7; co_oap.yaml 36, co_oap_deemed_income 20, co_oap_deeming_exempt 9, co_oap_eligible 5, co_oap_in_kind_support_and_maintenance 5, co_oap_own_countable_income 15. All pass.
  • All CO YAML (gov/states/co, batched per-subdir, one worker): 834 passed in 6 batches, one worker (peak RSS 8.0 GB).
  • Python, with Hypothesis: test_co_ism_invariants.py 2/2 (1.0 GB peak RSS, 44 s with import), test_co_and_cs_invariants.py 4/4 (1.26 GB), test_co_oap_invariants.py 2/2 (1.24 GB), test_ssi_state_supplement_couple_invariants.py 6/6 (1.22 GB), test_ssi_state_supplement_medicaid_dependency.py 28/28 (2.99 GB, 209 s). The test_co_and_cs_invariants.py failure the earlier hand-off reported, a $0.50/yr drop in countable income for a married client with shelter support, is gone: Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161 limited that countable-income assertion to clients without in-kind support, as the review there asked.
  • Partner fixtures, run only: analytics_coverage/edge_cases/state/co/state_supplement.yaml 3/3, .../co/oap.yaml 3/3, my_friend_ben/2025.yaml 1/1. No partner output moves.

Mutants (each in its own process, code restored after)

Mutant Killed by
2002-2006 ISM returns 0 co_state_supplement.yaml: 1 failure (Case 38)
OAP reads SSI's PMV ISM again co_oap_in_kind_support_and_maintenance.yaml: 4 failures; co_oap_own_countable_income.yaml: 1
ISM restricted to Colorado again co_oap_in_kind_support_and_maintenance.yaml: 3 failures, including the Nevada case
AND-CS pays $300 over the floor whenever the floor applies (the review's $313-for-$13 grant) test_co_ism_invariants.py: invariant 3 fails

The earlier session's mutants for readings (b) and (c) are in the body. I didn't rerun them.

CI

Not run: the PR is a draft and CI skips drafts.

Judgment calls

  1. The ISM amount (d1446): reading (a), SSA's matching ISM. The hub now rules on single readings and logs them. 3.520.79(B)(6) "matching ISM" and 3.520.71(E) "identical ISM amount" address exactly this client, so the PR keeps (a). (b), Colorado's $351 maximum, is a one-line change in _ssa_ism. This needs the hub's ruling before landing.
  2. 2002-2006 keeps SSI's PMV ISM, as the review recommended, rather than a Colorado component. For the review's 2004 client it sits between the two candidate shelter components ($189.81 on a $513 base, $222.37 on $601). The pre-2014 standards audit is still owed.
  3. Colorado's ISM for a non-Colorado spouse. Dropping the Colorado restriction means a spouse elsewhere who isn't on SSI and receives shelter support is counted Colorado's (C)(3) maximum when OAP deems their income. That follows from 3.534(B)(1) counting the spouse's unearned income and (C) setting no residence condition. The alternative is to count only SSA's matching ISM for a spouse outside Colorado.
  4. OAP now counts Colorado's own ISM for clients without SSI ((C)(3)), the behavior main's comment listed as unmodeled. Clients receiving shelter from others are taken to pay none, as for AND-CS.

What I couldn't check

This session's network policy blocks www.sos.state.co.us and web.archive.org, so I couldn't fetch 9 CCR 2503-1/-2/-4/-5 or the CDHS packet. The rule quotes and table figures in the body come from the PR's earlier body and the hub's hand-off comment. My hand computations use those figures and SSA's published rates.

Proposed follow-up

  • Audit Colorado's pre-2014 AND-CS grant standards and ISM components. The 2004 table prints a $513 maximum grant against PolicyEngine's $601. Settle the base, then replace formula_2002's PMV stand-in with Colorado's 2002-2006 shelter and food components.

Generated by Claude Code

@MaxGhenis
MaxGhenis marked this pull request as ready for review November 3, 2026 23:55
@MaxGhenis

MaxGhenis commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Hub review in progress

The final review for head 64a74c5bf7219fada7853ba579e067fea2f5355c is at #10183 (comment) and replaces these interim notes.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: APPROVE
64a74c5
METHODOLOGY_CHOICE: yes

Independent review of this PR's own diff, 8707792d09..64a74c5bf7 (#10161's head to this head). The head hasn't moved since the hand-off. This approval covers the code, the arithmetic and the tests. I couldn't read any primary source (see "What I couldn't check"), so the readings of 9 CCR 2503-5 and 20 CFR 416.1131/416.1140 below are the PR's own quotes, unconfirmed. METHODOLOGY_CHOICE is yes: the PR picks reading (a), SSA's matching ISM, over (b) Colorado's $351 maximum and (c) no ISM. It also keeps SSI's PMV as a 2002–2006 stand-in, and charges a spouse outside Colorado Colorado's (C)(3) maximum. The hub's ruling on the reading is still owed, as the hand-off says.

Findings

P2. In 2002–2006 the one-third backfill remains, and neither the body nor the code comment says so

policyengine_us/variables/gov/states/co/ssa/co_ssa_in_kind_support_and_maintenance.py:95-111 (formula_2002) counts SSI's PMV ISM, as the earlier review asked. SSI's PMV ISM is $0 for a client under the one-third reduction (ssi_in_kind_support_and_maintenance applies only when ssi_pmv_applies). So in 2002–2006, AND-CS still restores SSA's one-third reduction in full for the PR title's client: an SSI recipient in another person's household. Its own "Summary" says Colorado counted ISM for this client "since at least 2003". The body's model table reads "2002 – 2006 | everyone | SSI's PMV ISM", which a reader takes to mean a positive count.

Witness: a single disabled 40-year-old in another person's household, receiving shelter and all meals, CO, January 2005. I ran it on main, on #10161's head and on this head with period-keyed inputs:

main  2005-01 VTR | ssi=[386.0] co_state_supplement=[218.0]
base  2005-01 VTR | ssi=[386.0] co_state_supplement=[218.0]
head  2005-01 VTR | ssi=[386.0] co_state_supplement=[218.0]

That is 604 − 386 = $218, the full offset. The same client in 2007 or later gets $0 or $20. Behavior is unchanged from base, so this is a text fix, not a code fix. Replacement for the body's model-table row:

| 2002 – 2006 | everyone | SSI's PMV ISM, halved for a couple (as #10161 counted it), until the pre-2014 base is audited. Under the one-third reduction that is $0, so AND-CS still offsets the reduction in full (January 2005: 604 − 386 = $218). |

Add to the formula_2002 comment, after "halved for a couple as SSI splits it.":

        # SSI's presumed maximum value is $0 under the one-third reduction,
        # so a client in another person's household is counted no ISM in
        # these years and AND-CS still offsets that reduction in full.

The pre-2014 audit follow-up the hand-off proposes should name this client.

P2. No CI has run at this head, and none will until the base is main

.github/workflows/pr.yaml triggers on pull_request with branches: [main]. Every other workflow is workflow_call, push to main, release or schedule. With base co-and-cs-payment-floor-3549, marking the PR ready ran nothing. actions/runs?head_sha=64a74c5bf7… returns no runs, and commits/64a74c5bf7…/check-runs is empty. #10161's head 8707792d09 has a successful Pull request run (41721281741). This PR's diff has no CI evidence until the hub retargets it to main, and the landing gate should wait for that run.

P3. No test reaches OAP's deeming of a spouse outside Colorado, the reason the PR drops defined_for = StateCode.CO

The Nevada case in co_oap_in_kind_support_and_maintenance.yaml checks the variable for a lone person. It doesn't check that the value reaches co_oap_deemed_income. Restoring defined_for = StateCode.CO (mutant M3 below) leaves co_oap_deemed_income.yaml at 20/20 passed. On a cross-household couple, M3 changes the client's deemed income from $319 to $0:

head  NV spouse | co_ssa_in_kind_support_and_maintenance=[0.0, 351.0] co_oap_deemed_income=[319.0, 0.0]
M3    NV spouse | co_ssa_in_kind_support_and_maintenance=[0.0, 0.0]   co_oap_deemed_income=[0.0, 0.0]

The hand computation is 3.534(B): 1,000 pension + 351 ISM − 1,032 standard = $319. Suggested case for co_oap_deemed_income.yaml, modeled on its Case 14:

- name: Case 21, a spouse in another state with shelter support has Colorado's ISM deemed.
  # The client, 66, lives in Colorado. The spouse, 50, lives in Nevada, has a
  # $1,000/month pension and outside shelter support, and isn't on SSI.
  # 3.520.79(C)(3) counts the spouse the $351 maximum, and 3.534(B) deems
  # 1,000 + 351 - 1,032 = 319.
  period: 2026-01
  input:
    people:
      head:
        age: 66
        is_tax_unit_head: true
      spouse:
        age: 50
        pension_income: 12_000
        ssi_receives_outside_shelter_support: true
        is_tax_unit_spouse: true
    tax_units:
      tax_unit:
        members: [head, spouse]
    marital_units:
      marital_unit:
        members: [head, spouse]
    households:
      head_household:
        members: [head]
        state_code: CO
      spouse_household:
        members: [spouse]
        state_code: NV
  output:
    co_oap_deemed_income: [319, 0]

I ran this situation in Python, not as YAML. Check the case number against the file.

P3. Invariant 2's upper bound runs before the SSI filter and passes only because $351 ≤ $351.33

policyengine_us/tests/core/test_co_ism_invariants.py:139 asserts ism[s] <= individual_pmv for every supported twin, then filters if ssi[s] <= 0: continue at :140. A twin without SSI is counted Colorado's maximum, so the bound holds only because the 2026 maximum ($351) is below 994 / 3 + 20 = $351.33. In 2023 the published maximum is $325 and 914 / 3 + 20 = $324.67, so the same check would fail spuriously if YEAR moved. The docstring says the bound is "for SSI recipients". Replacement for lines 139-141:

            assert ism[s] >= -TOLERANCE, c
            if ssi[s] <= 0:
                continue
            assert ism[s] <= individual_pmv + TOLERANCE, c

Checked and sound

  • The defect reproduces. Case 28's client (2026, single SSI recipient in another person's household) gets AND-CS of $3,976/yr on main (25c4253483) and on Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's head, and $240/yr here. The same client in 2014 gets $2,884 on main and $200.67 here; in 2012, $2,792 and $0. OAP for the same client aged 65 is $369.33/month on main and $189 here.
  • Hand values, computed before reading the code. I used the repo's SSI rates and AND-CS standards, and the rule as the PR quotes it:
    • Case 28: 994 × 2/3 = 662.67; matching ISM 994 / 3 = 331.33; 331.33 − 20 = 311.33; 994 − 662.67 − 311.33 = $20/month, $240/yr. ISM 3,976/yr; countable 3,736/yr.
    • Case 33: SSI 662.67 − 80 = 582.67 (6,992/yr); countable 100 + 331.33 − 20 = 411.33 (4,936/yr); total 994, so $0.
    • Case 34: 1,491 / 3 = 497; SSI 497 each; ISM 248.50 − 10 = 238.50; 994 − 497 − 238.50 = 258.50 (3,102/yr).
    • Case 35: 0.366 × 698 + 0.205 × 698 = 398.56 (4,782.7/yr); 698 − 465.33 − 378.56 < 0.
    • Case 36: 2 × (721 − 480.67 − 240) + 10 × 20 = 200.67.
    • Case 37: 967 − 644.67 − 302.33 = 20 (240/yr).
    • Case 38: 564 / 3 + 20 = 208; SSI 376; 601 − 376 − 188 = $37.
    • OAP: 994 / 3 = 331.33 in CO and in NV; $351 = round(994 / 3 + 20); Case 10 12 × (351 − 20) = $3,972. The OAP 65 VTR client's 1,032 − 662.67 − 311.33 = $58 is raised to the $189 floor.
    • ISM file: Cases 2 (351.33), 5 (258.50), 14 (2 × 260 + 10 × 240.33 = 2,923.33), 16 (255.47) and 17 (0.366 × 648 + 0.205 × 648 = 370.01).
    • ism/maximum.yaml: every year 2014–2026 equals round(standard / 3 + 20), except 2021: $284 published where the formula gives $285, as the file says.
  • The earlier review's fixes.
    • Finding 1: formula_2002 restores Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's count. Case 38 asserts $37, and mutant M1 fails it.
    • Finding 2: invariant 3 now takes the floor top-up from the rule (max(0, payment_floor − grant) for a positive grant, test_co_ism_invariants.py:154-156). Mutant M4 fails test_properties.
    • Finding 3: the body's medical-confinement wording now applies to clients without SSI. I ran the SSI case it describes: a facility resident, Medicaid not paying most of the care, with outside shelter support, gets ISM 351.33. With Medicaid paying most of the care: SSI $30, ISM 0.
  • Code applies the rule in every period it reaches.
    • 2002–2006: PMV stand-in (P2 above).
    • 2007–2013: 36.6% shelter plus 20.5% food of the grant standard, with exemptions.
    • January–February 2014: $260 for everyone not exempt.
    • From March 2014: SSA's ISM for anyone with ssi > 0 or receives_ssi. ssi_amount_if_eligible × rate / (1 − rate) recovers FBR / 3, or couple FBR / 6 per spouse. Mutant M7, which reads paid SSI instead of the rate, fails Case 33.
    • Others: (C)(3) maximum, with owned-home, housing-assistance, homeless and medical-confinement exemptions.
    • Couples: PMV halved under ssi_couple_computation_applies.
    • Children: in the parental household, $0.
  • Readers.
    • co_ssa_in_kind_support_and_maintenance is read only by _and_cs_client_income (used by co_state_supplement_own_countable_income and co_state_supplement_deemed_income) and co_oap_in_kind_support_and_maintenance. The latter is read by co_oap_own_countable_income and co_oap_deemed_income.
    • The gov.states.co.ssa.ism.* parameters are read only by the new variable.
    • AND-CS spousal deeming uses the spouse's ssi_unearned_income, not ISM, so a spouse's ISM doesn't reach AND-CS. OAP deeming does take it: judgment call 3, and witness above.
    • Nothing outside Colorado's programs reads the variable.
  • Cost of dropping defined_for: none for population runs. Core's calculate runs the formula over everyone and masks afterwards (simulation.py:1762-1781, 1932). A run with no Colorado person never reaches it, because it is reached only through co_oap, co_oap_deemed_income and the AND-CS variables, which are gated by co_oap_eligible or co_state_supplement_eligible (both defined_for = StateCode.CO). The new inputs it reads (receives_housing_assistance, is_homeless, the SSI living-arrangement flags) are plain inputs with no formula.
  • Tests on this head, one file per process.
    • ISM and OAP files: co_ssa_in_kind_support_and_maintenance.yaml 18; co_oap.yaml 36; co_oap_deemed_income 20; co_oap_deeming_exempt 9; co_oap_eligible 5; co_oap_in_kind_support_and_maintenance 5; co_oap_own_countable_income 15.
    • AND-CS files: co_state_supplement.yaml 38; _countable_income 4; _deemed_income 10; _deeming_exempt 11; _eligible 11; _own_countable_income 7.
    • Python: test_co_ism_invariants.py 2 passed (10.5 s); test_co_and_cs_invariants.py 4; test_co_oap_invariants.py 2; test_ssi_state_supplement_couple_invariants.py 6. All pass.
    • Note: test_properties exists only when hypothesis is importable. It's in the dev extra, which CI installs (uv sync --locked --extra dev); without it, pytest collects one test and M4 survives.
  • Mutants, each in its own process on a scratch worktree, restored after (git status clean):
Mutant Result
M1 formula_2002 returns 0 killed: co_state_supplement.yaml 1 failed (Case 38)
M2 OAP variable replaced with main's file killed: co_oap_in_kind_support_and_maintenance.yaml 3 failed; co_oap_own_countable_income.yaml 1 failed
M3 defined_for = StateCode.CO restored killed by co_oap_in_kind_support_and_maintenance.yaml (3 failed); survives co_oap_deemed_income.yaml (P3)
M4 AND-CS pays $300 over the floor killed: test_co_ism_invariants.py::test_properties
M5 reading (b): $351 for the one-third reduction killed: ISM file 3 failed; co_state_supplement.yaml 5 failed
M6 reading (c): no ISM for the one-third reduction killed: ISM file 3 failed; co_state_supplement.yaml 5 failed
M7 (mine) the one-third ISM from paid SSI, not the rate survives the ISM file; killed by co_state_supplement.yaml 1 failed (Case 33)
M8 (mine) the pre-2014 food component dropped killed: ISM file 2 failed
M9 (mine) PMV not halved for a couple killed: ISM file 1 failed
  • Partner tests.
    • No file under policyengine_us/tests/policy/baseline/partners/ or .github/ changes (git diff --stat 8707792d09 64a74c5bf7 -- partners .github is empty).
    • Every partner fixture that reads Colorado's SSA programs passes unchanged on this head: my_friend_ben/2025.yaml 1/1. Under analytics_coverage: edge_cases/state/co/state_supplement.yaml 3/3, oap.yaml 3/3, care_worker_credit.yaml 4/4, family_affordability_credit.yaml 4/4, eitc_ctc.yaml 2/2, tax_credits_composition.yaml 2/2, and signatures/co.yaml 6/6.
  • Body and docs. The impact: and axiom: lines are present. The per-file case counts match my runs.
    • The before/after table matches my main and base runs: 331.33, 322.33, $2,884, $232.67 and $37.
    • The readings table matches the arithmetic. Under (b), 994 − 662.67 − 331 = 0.33, raised to $13; couple 994 − 497 − 341 = $156.
    • The changelog fragment is top-level changelog.d/co-adult-financial-ism.fixed.md.
  • Baseline movement. The diff moves output only for people with ssi_lives_in_another_persons_household, ssi_receives_shelter_from_others_in_household, ssi_others_pay_all_meals or ssi_receives_outside_shelter_support set. Those are inputs defaulting to False; the PMV path for SSI recipients is unchanged. OAP's SSI test moves from ssi_paid(ssi) > 0 to ssi > 0, which differs only below half a cent. The population check: does the dataset set any of those four flags for Colorado records? If not, baseline impact is nil. If so, expect lower AND-CS and OAP for those records.
  • Overlap.

What I couldn't check

  • Primary sources. This session's network policy refuses www.sos.state.co.us, www.ecfr.gov, www.govinfo.gov, uscode.house.gov, www.ssa.gov, web.archive.org, www.law.cornell.edu and cdhs.colorado.gov, for both curl and fetch. I couldn't read 9 CCR 2503-5 3.520.79 (A), (B)(6), (C)(3) or (E), 3.520.71(E), 3.520.786(B), 3.534, the 2503-1/-2/-4 tables, the CDHS 2025-00596 packet, or 20 CFR 416.1131 and 416.1140. I quote none of them. Web search snippets (not the text) agree that 416.1131 counts one-third of the FBR, and one-sixth of the couple rate to each spouse. The reading choice and the 2002–2006 base need a reviewer who can reach those sites.
  • The deeming case under the one-third reduction. For an SSI recipient with an ineligible spouse whose income is deemed, ssi_amount_if_eligible uses the couple rate, so the matching ISM would be couple FBR / 3. My runs didn't trigger deeming, so I couldn't test whether SSA charges that amount.
  • Couples without SSI. Colorado charges each of them the full $351. I couldn't check whether the rule halves it for a couple.
  • Data. I have no population data, and the hub measures impact. I couldn't check peak memory: /usr/bin/time isn't installed here.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

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
Under the one-third reduction SSI counts no presumed maximum value, so in
2002-2006 AND-CS counts no ISM for a client in another person's household
and still offsets the reduction in full. Behaviour is unchanged; the comment
now says so.

Also from review round 1:
- co_oap_deemed_income Case 21 deems a Nevada spouse's Colorado ISM
  (1,000 + 351 - 1,032 = 319), so restoring defined_for = StateCode.CO now
  fails a deeming test, not only the ISM variable's own file;
- invariant 2's upper bound applies only to twins on SSI, as its docstring
  says, instead of passing for non-SSI twins only because $351 <= $351.33.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LwQq6GVxJNmuxpvgfooGjd
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: c9cd35d0ddbd3479f908a06c596edbbb8c8a61b6

Round 1 fixes (items 7 to 11). The branch was at the named head 64a74c5bf7 when I started, and no one else pushed while I worked. Two commits on top:

The base is still co-and-cs-payment-floor-3549.

Items

  1. Pick-up and the base. I pushed Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161 first, then merged co-and-cs-payment-floor-3549 with a merge commit.
  2. P2, the 2002-2006 backfill, in text. The four lines from the item are in co_ssa_in_kind_support_and_maintenance.py's formula_2002, after the 2004 worked example that ends the sentence "... halved for a couple as SSI splits it." (lines 106-109).
    • Judgment call: I put them after the example rather than between the sentence and its example, so the example stays with the sentence it illustrates.
    • Behaviour is unchanged.
    • The body's "2002 – 2006" model row is the item's text.
  3. P3, tests.
    • Case 21: co_oap_deemed_income.yaml Case 21 is the review's case: a Colorado client, 66, with a Nevada spouse, 50, who has a $1,000 pension and outside shelter support. The spouse's deemed income is 1,000 + 351 − 1,032 = 319. The file had 20 cases, so it keeps the number 21.
    • Mutant M3 (restoring defined_for = StateCode.CO) now fails this file at Case 21: 1 failed, 20 passed.
    • Invariant bound: in test_co_ism_invariants.py:139-142, the lower bound runs for every supported twin, and the upper bound ism[s] <= individual_pmv + TOLERANCE runs only after the ssi[s] <= 0 filter, as the review gave it.
  4. The body: the reading.
    • "Reading of the ISM amount": it no longer says the sources "leave two defensible amounts". It says plainly that the PR follows 3.520.79(B)(6) and 3.520.71(E) and quotes both. An SSI recipient whom SSA charges an ISM gets a matching ISM, SSA's one-third value ($331.33 in 2026), so AND-CS pays $20 a month. The (a)/(b)/(c) table stays as a comparison.
    • Other sentences this round made false, now fixed:
    • Left as is: "Before" in the worked-case table still names 8707792d09, because those values were measured there. The impact: and axiom: lines are unchanged.
    • I read the whole body back. It matches what I sent, apart from a trailing newline.

Tests at this head, one file per process (uv sync --extra dev)

File Result
co_state_supplement.yaml 41 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 21 passed
co_oap_in_kind_support_and_maintenance.yaml 5 passed
co_ssa_in_kind_support_and_maintenance.yaml 18 passed
test_co_ism_invariants.py 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 two Python files this round changed. The merge brought in #10161's files, which were already checked there.

Mutants

Mutant Result
M3: defined_for = StateCode.CO restored on co_ssa_in_kind_support_and_maintenance killed by co_oap_deemed_income.yaml Case 21 (1 failed, 20 passed); restored with git checkout, git status clean

CI

No run, as expected. pr.yaml runs only for PRs into main, and the base is co-and-cs-payment-floor-3549. CI starts when the hub moves the base.

Not checked

  • I didn't fetch 9 CCR 2503-5. The quotes in the body are the hub's quoted text of 3.520.79(B)(6) and 3.520.71(E), each under 25 words.
  • No microsimulation or population impact (per the brief).
  • No partner or .github/ file changed.

Proposed follow-up

Audit Colorado's 2002-2006 AND-CS ISM base and the one-third-reduction offset. formula_2002 stands in SSI's PMV ISM, so an SSI recipient in another person's household still has the one-third reduction fully offset (January 2005: $218). This needs the pre-2014 grant-standard components settled first.


Generated by Claude Code

@MaxGhenis

MaxGhenis commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Hub review in progress

The final round 2 review for head c9cd35d0ddbd3479f908a06c596edbbb8c8a61b6 is at #10183 (comment) and replaces these interim notes.


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: APPROVE
c9cd35d
METHODOLOGY_CHOICE: yes

Round 2 delta review: the round 1 fixes from 64a74c5bf7 to c9cd35d0dd. They are the merge 13051d9818 of #10161's head 3371fc5573 and the fix commit c9cd35d0dd. I judged this PR's own diff against its base co-and-cs-payment-floor-3549 (3371fc5573), and left #10161's changes to #10161. The head hasn't moved since the hand-off.

METHODOLOGY_CHOICE stays yes. The PR picks the matching reading, SSA's one-third ISM for an SSI recipient in another person's household ($331.33 in 2026), over Colorado's $351 maximum and over counting no ISM. It also keeps SSI's PMV as a stand-in for 2002–2006.

Every round 1 item is done, the merge lost nothing, and every test I ran passes. My findings are an overlap the body doesn't name, a stale case number, and an untested exemption.

Findings

P2. #10146 conflicts with this PR in two files, and its monthly ISM change also has to reach this PR's new variable. The body names neither.

#10146 (open, base main) does two things that touch this PR:

  • It edits co_oap_in_kind_support_and_maintenance.py and its YAML.
  • It replaces ssi_in_kind_support_and_maintenance's formula with a sum of a new ssi_in_kind_support_and_maintenance_monthly. Its new OAP case asserts that "Matching SSI ISM follows each month's amount rather than the annual average".

This PR moves that read into co_ssa_in_kind_support_and_maintenance.py, at _ssa_ism (lines 58-60) and formula_2002 (lines 110-113). Both take the annual variable over 12, which is the averaging #10146 removes.

$ git merge-tree --write-tree --name-only c9cd35d0dd pr-10146
CONFLICT (content): Merge conflict in .../co/ssa/oap/co_oap_in_kind_support_and_maintenance.yaml
CONFLICT (content): Merge conflict in .../co/ssa/oap/co_oap_in_kind_support_and_maintenance.py
CONFLICT (content): Merge conflict in .../co/ssa/state_supplement/co_state_supplement_countable_income.py   (#10161's deletion)

Failure scenario. #10146 lands second, and its author resolves the conflict by keeping this PR's one-line OAP formula. Then _ssa_ism and formula_2002 still average the year. #10146's own new OAP case (January 300, February 120, expecting 150 and 60) would then get 17.50 a month. Resolving it the other way would drop this PR's ISM.

Fix. Add an overlap bullet to the body:

#10146 (open) moves SSI's ISM to a monthly variable, ssi_in_kind_support_and_maintenance_monthly, and edits co_oap_in_kind_support_and_maintenance.py, which this PR reduces to a read of co_ssa_in_kind_support_and_maintenance. Whichever lands second moves _ssa_ism and formula_2002 in co_ssa_in_kind_support_and_maintenance.py to the monthly variable, and moves #10146's OAP case to that variable's YAML. #10141 (open) edits co_oap_deemed_income.yaml, where this PR adds Case 21; the two merge cleanly.

#10141 merges with this head without conflict (git merge-tree reports none). Round 1 said #10141 "shares no file with this diff". That's no longer true now that Case 21 is in co_oap_deemed_income.yaml.

P3. A test docstring still cites the old case number, so the hand-off's "Nothing else in the branch cites those case numbers" is false

policyengine_us/tests/core/test_co_ism_invariants.py:166 says co_state_supplement YAML Cases 28 and 34. After the renumbering, Case 34 is #10161's "a $1 higher pension doesn't end the head's grant". The SSI couple in another person's household, with 248.50 ISM and 258.50 AND-CS each, is now Case 37:

$ sed -n 772,812p .../co_state_supplement.yaml | grep -n "name\|co_state_supplement:"
1:- name: Case 37, an SSI couple in another person's household.
39:    co_state_supplement: [3_102, 3_102]

Replace """co_state_supplement YAML Cases 28 and 34, monthly: a single client in with """co_state_supplement YAML Cases 28 and 37, monthly: a single client in. A grep for Case(s) N across the CO SSA tests, variables and the invariant files found no other stale reference.

P3. No test covers the homeless exemption in _ism_exempt

co_ssa_in_kind_support_and_maintenance.py:24-26 exempts a homeless client (3.520.79(B)(3), as the docstring cites it). My mutant M10 drops homeless from the return, and every CO SSA test file I ran still passes: the ISM file gives 18 passed. No CO SSA test sets is_homeless. Suggested Case 19 for co_ssa_in_kind_support_and_maintenance.yaml:

- name: Case 19, a homeless client without SSI is not charged ISM.
  # 3.520.79(B)(3).
  period: 2026-01
  input:
    people:
      person:
        age: 62
        pension_income: 6_000
        ssi_receives_outside_shelter_support: true
    households:
      household:
        members: [person]
        state_code: CO
        is_homeless: true
  output:
    co_ssa_in_kind_support_and_maintenance: 0

I ran it as a separate file. It gives 1 passed at the head and 1 failed under M10.

Checked and sound

  • The merge. I split co_state_supplement.yaml into case blocks at 64a74c5bf7, 3371fc5573 and the head, and compared each block's text with its Case N, prefix removed.
  • The 2002–2006 text. ssi_in_kind_support_and_maintenance is pmv_applies * ism_value, and ssi_pmv_applies requires OWN_HOUSEHOLD. So under the one-third reduction the PMV ISM is 0, and the new comment at co_ssa_in_kind_support_and_maintenance.py:106-109 is accurate. Behaviour is unchanged. A disabled single client in another person's household, with shelter and all meals from others, in January 2005 gets the same on main (25c4253483), on the base and on the head: ssi 386.0 co_state_supplement 218.0, i.e. 604 − 386. The body's 2002–2006 row says the same.
  • The defect reproduces at main. The same client in January 2026 gets ssi 662.67 co_state_supplement 331.33 on main and on the base, and 20.0 on the head.
  • Case 21, computed before reading the test's output.
    • The 2026 ISM maximum is 351 (ism/maximum.yaml). That equals round(994 / 3 + 20) = round(351.33).
    • The 2026 OAP grant standard is 1_032 (oap/grant_standard.yaml).
    • The Nevada spouse, 50 and not on SSI, takes formula_2014_03's Colorado path and is counted 351.
    • 3.534(B) then deems 1,000 + 351 − 1,032 = 319 to the client. The spouse's own value is 0 (defined_for = StateCode.CO).
    • My run matches: co_oap_in_kind_support_and_maintenance [0.0, 351.0], co_oap_deemed_income [319.0, 0.0] at the head. On main and the base both are [0.0, 0.0].
  • The bound change at test_co_ism_invariants.py:139-142 is the round 1 replacement verbatim. The lower bound runs for every supported twin, and the PMV upper bound runs only after if ssi[s] <= 0: continue, as the docstring says ("for SSI recipients").
  • The reading. The body's quotes of 3.520.79(B)(6) ("The client shall be charged a matching ISM for Adult Financial programs, unless good cause is provided due to SSA backlog.") and 3.520.71(E) ("The county department shall deduct an identical ISM amount …") match the assignment's text word for word. No sentence still says the reading awaits a decision: a grep for await, decision, ruling, defensible, pending and judgment finds none.
  • Mutants, each in its own process on a scratch worktree at the head, restored with git checkout, git status --short empty after each:
Mutant Result
M3: defined_for = StateCode.CO added to co_ssa_in_kind_support_and_maintenance killed: co_oap_deemed_income.yaml 1 failed, 20 passed; Case 21 [0. 0.] differs from [319. 0.]
M10 (mine): homeless dropped from _ism_exempt survives the ISM file (18 passed); killed by the suggested Case 19 (P3 above)
  • Tests at the head, one file per process (uv sync --extra dev):
File Result
co_state_supplement.yaml 41 passed
co_oap_deemed_income.yaml 21 passed
co_ssa_in_kind_support_and_maintenance.yaml 18 passed
co_oap_in_kind_support_and_maintenance.yaml 5 passed
co_oap_own_countable_income.yaml 15 passed
co_state_supplement_deemed_income.yaml 12 passed
co_state_supplement_deeming_exempt.yaml 11 passed
co_state_supplement_own_countable_income.yaml 8 passed
co_oap.yaml 36 passed
test_co_ism_invariants.py 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 Python files in this PR's diff against its base.

  • Readers.
    • co_ssa_in_kind_support_and_maintenance is read by _and_cs_client_income (used by co_state_supplement_own_countable_income and co_state_supplement_deemed_income) and by co_oap_in_kind_support_and_maintenance. The latter is read by co_oap_own_countable_income and co_oap_deemed_income.
    • The gov.states.co.ssa.ism.* parameters are read only by the new variable.
    • After the merge, co_state_supplement_deemed_income calls and_cs_client_income for the client's own disregard use, so the client's own ISM uses up the client's share of the $20. The spouse's or parent's deemed income still uses ssi_unearned_income without ISM. Round 1 noted the same for AND-CS.
    • No reader made worse that I could find.
  • Baseline. This round changes no formula: one comment, one YAML case and one test assertion. The PR as a whole still moves output only for people with one of the four SSI living-arrangement or shelter flags set, as round 1 found. The population check is unchanged: does the dataset set those flags for Colorado records?
  • Body. The impact: and axiom: lines are present. The per-file counts (41, 21, 18, 5, 15) match my runs. The two test files named under "Python" exist. The "Before" values (331.33 for 2026, $218 for January 2005) match my main and base runs.
  • Scope. git diff --stat 3371fc5573 c9cd35d0dd -- .github policyengine_us/tests/policy/baseline/partners is empty.
  • CI. No run exists at this head: actions/runs?head_sha=c9cd35d0dd… returns 0 runs and check-runs returns 0. .github/workflows/pr.yaml triggers on pull_request with branches: [main], and the base is co-and-cs-payment-floor-3549, so this isn't a failure. The Pull request run at Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's head 3371fc5573 (41859948897) succeeded. This PR's own CI evidence comes only once the hub moves the base to main, and the landing gate should wait for that run.

What I couldn't check

  • Primary sources. From this VM, curl gets a 403 from the proxy, and WebFetch can't resolve the hosts, for www.sos.state.co.us, www.ecfr.gov, www.govinfo.gov, uscode.house.gov, www.ssa.gov, web.archive.org, www.law.cornell.edu, cdhs.colorado.gov and leg.colorado.gov. I checked the body's quotes only against the assignment's quoted text, not against 9 CCR 2503-5 itself. I quote no law from my own reading. That includes (C)(3), (B)(3) and 3.534, and 20 CFR 416.1131 and 416.1140.
  • Population impact and peak memory of test_co_ism_invariants.py: I have no population data, and /usr/bin/time isn't installed.
  • This PR's CI, until the base is main.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Picking this up for the US hub. I'll post a hand-off comment here when it's ready.


Generated by Claude Code

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
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review

Head: f7724ea64d776f436ec6cb7cefc48cd6bb1d478c

This round builds on c9cd35d0dd, the head the item named. No commit landed on the branch between that head and my push.

Items

Item Resolution
3. Merge #10161's new head 1ffa99eef9 merges #10161's head 96859129b5 with a merge commit (no rebase). No conflicts. The merge brings only #10161's Case 12 in co_state_supplement_deeming_exempt.yaml (+28 lines).
4. Stale case number (P3) policyengine_us/tests/core/test_co_ism_invariants.py:166 now reads "co_state_supplement YAML Cases 28 and 37". At this head, co_state_supplement.yaml:772 is "Case 37, an SSI couple in another person's household."
5. Homeless exemption (P3) co_ssa_in_kind_support_and_maintenance.yaml, the last case: "Case 19, Colorado counts no ISM for a homeless client without SSI." It has the review's inputs and output (0), and the name and comment the item gave.
6. Overlaps See below. I left the overlap bullets unchanged.
7. Runs, body counts See below. The body's YAML line now reads co_ssa_in_kind_support_and_maintenance.yaml (19; Case 19 pins the homeless exemption). I read it back after the PATCH, and nothing else in the body changed.

Tests at the head (one file per process)

File Result
co_ssa_in_kind_support_and_maintenance.yaml 19 passed
test_co_ism_invariants.py 2 passed (with hypothesis installed via uv sync --extra dev; before that, 1 passed with the property test absent)
co_state_supplement.yaml 41 passed
co_state_supplement_deeming_exempt.yaml 12 passed (includes #10161's new Case 12)
co_oap_in_kind_support_and_maintenance.yaml 5 passed
co_oap_deemed_income.yaml 21 passed

ruff format --check ("1 file already formatted") and ruff check ("All checks passed!") are clean on test_co_ism_invariants.py, the only Python file this round changed.

Mutant

Mutant Change Result
M10 co_ssa_in_kind_support_and_maintenance.py:26, return owns_home | subsidized | homeless | medical_confinement becomes return owns_home | subsidized | medical_confinement Killed. 1 failed, 18 passed: Case 19, co_ssa_in_kind_support_and_maintenance@2026-01: [351.] differs from 0.0. I restored the file, and git status was clean.

The value of 351 under the mutant is the 2026 Colorado maximum, which this client (no SSI, outside shelter support) would be counted without the exemption.

Overlaps (git merge-tree --write-tree --name-only, head f7724ea64d)

CI

No run exists at this head (actions/runs?head_sha=f7724ea64d… returns total_count 0). The PR's base is co-and-cs-payment-floor-3549, not main, so the Pull request workflow doesn't trigger. This PR gets its own CI evidence only once its base moves to main.

#10161's Pull request run at its new head 96859129b5, 41943988631, was still in progress when I posted this. I report its conclusion on #10161.

Judgment calls

What I couldn't check

  • 9 CCR 2503-5 3.520.79(B)(3) itself: I didn't fetch the rule. The comment repeats the citation the item supplied and the variable's docstring already uses.
  • Population impact and microsimulation, per the brief.

Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Hub review in progress

Round 3 delta review of f7724ea64d776f436ec6cb7cefc48cd6bb1d478c (the head hasn't moved).

So far:


Generated by Claude Code

@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Ready for hub review
VERDICT: APPROVE
f7724ea
METHODOLOGY_CHOICE: yes

Round 3 delta review, from c9cd35d0dd (the round 2 review's head) to f7724ea64d. The head hasn't moved since the hand-off. The delta has three commits:

METHODOLOGY_CHOICE stays yes, for the reasons round 2 gave: the matching ISM ($331.33 in 2026) over Colorado's $351 maximum or no ISM, and SSI's PMV as a stand-in for 2002–2006. This round changes no formula.

Items 3–7 are done. The merge lost nothing, every test I ran passes, and each mutant is killed. One sentence in the body is stale.

Findings

P3. The body's first line points reviewers at #10161's old head

The body's first line reads: "Review only the diff from #10161's head 3371fc5573, which this branch has merged." The branch now merges #10161's head 96859129b5.

Failure scenario. A reviewer who diffs from 3371fc5573 sees #10161's Case 12 (+28 lines in co_state_supplement_deeming_exempt.yaml) as part of this PR.

$ git diff --stat 3371fc5573 96859129b5
 .../co_state_supplement_deeming_exempt.yaml | 28 ++++++++++++++++++++++
$ git log -1 --format=%P 1ffa99eef9
c9cd35d0dd... 96859129b5...

Replacement: **Stacked on #10161** (base co-and-cs-payment-floor-3549). Review only the diff from #10161's head 9685912, which this branch has merged. The hub retargets this PR to main once #10161 lands.

Checked and sound

  • The merge (item 3).
  • Item 4. test_co_ism_invariants.py:166 reads "Cases 28 and 37". At co_state_supplement.yaml:772, Case 37 is "an SSI couple in another person's household". It has 248.50 matching ISM, an AND-CS grant of 258.50 a month and co_state_supplement: [3_102, 3_102], as the docstring says. A grep for Case(s) N in the invariant file and variables/gov/states/co/ssa finds no other reference.
  • Item 5, Case 19.
    • Its inputs and output are the round 2 review's. Cases in the file now number 1–19 with no gaps.
    • I computed it by hand from co_ssa_in_kind_support_and_maintenance.py before running it. The person is 62, not disabled and has a $500/month pension, so not on SSI, and formula_2014_03 takes the Colorado path. Outside shelter support makes _colorado_shelter_ism return the 2026 maximum of 351 (ism/maximum.yaml) unless _ism_exempt. is_homeless makes the person exempt, so the expected value is 0, or 351 without the exemption.
    • At the head the file gives 19 passed.
    • Mutants, each run in its own process on a scratch worktree, restored with git checkout, git status --short empty after each:
Mutant Result
M10: homeless dropped from _ism_exempt's return killed by Case 19: [351.] differs from 0.0, 1 failed, 18 passed
M12 (mine): homeless = person.household("is_homeless", …) & person("ssi_receives_shelter_from_others_in_household", period), so the exemption covers only shelter from the household killed by Case 19: [351.] differs from 0.0, 1 failed, 18 passed
MB (#10161): exempt = receives_ssi | receives_oap killed by co_state_supplement_deeming_exempt.yaml Case 12
File Result
co_ssa_in_kind_support_and_maintenance.yaml 19 passed
test_co_ism_invariants.py (with hypothesis, uv sync --extra dev) 2 passed
co_state_supplement.yaml 41 passed
co_state_supplement_deeming_exempt.yaml 12 passed
co_oap_in_kind_support_and_maintenance.yaml 5 passed
co_oap_deemed_income.yaml 21 passed
co_oap_own_countable_income.yaml (named in the body) 15 passed

These match the body's counts (19, 41, 5, 15, 21) and the hand-off's table. ruff format --check ("1 file already formatted") and ruff check ("All checks passed!") are clean on test_co_ism_invariants.py, the only Python file this round changed.

  • The defect still reproduces at main. I ran Case 28's inputs (a disabled single client in another person's household, 2026), asserting co_state_supplement: 0. Main gives [3975.9993] differs from 0.0, which is 331.33 a month. The head gives [240.] differs, which is 20 a month.
  • Readers. This round changes no formula or parameter, so round 2's reader list stands. At baseline, the round can't move any output. The PR as a whole still moves output only for records with an SSI living-arrangement or shelter flag set in Colorado, and that is the population check the hub needs to run.
  • Body. The impact: and axiom: lines are present, and I left them alone.
  • Scope. git diff --stat from c9cd35d0dd and from 96859129b5 to the head, limited to .github and policyengine_us/tests/policy/baseline/partners, is empty.
  • CI. No run exists at this head (total_count 0): the base isn't main, so the Pull request workflow doesn't trigger. Apply Colorado's AND-CS payment floor and 3.549 income rules to every client #10161's Pull request run at 96859129b5, 41943988631, finished success. This PR's own CI comes once the hub retargets it to main.

What I couldn't check

  • 9 CCR 2503-5 3.520.79(B)(3), or any other source. From this VM, curl gets a 403 from the proxy for www.sos.state.co.us, www.ecfr.gov, www.govinfo.gov, uscode.house.gov and cdhs.colorado.gov. WebFetch can't resolve www.sos.state.co.us. So I confirmed Case 19's citation only against the variable's docstring (3.520.79(B)(1)-(3)), not against the rule. I quote no law here.
  • Population impact, and peak memory of test_co_ism_invariants.py: I have no population data, and /usr/bin/time isn't installed.
  • This PR's CI, until its base is main.

Generated by Claude Code

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