Repository navigation
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@hua7450 This PR changes the model output for two partner contract cases. I have not edited the partner files; they wait for your answers.
Why: Colorado's OAP payment floor (new in 2026). 9 CCR 2503-5 3.530(C) (ruleVersionId 12428, PDF page 74): "Effective January 1, 2026, the payment floor standard for OAP is $189." 3.532(B) and 3.533(B): if the grant payment is less than the floor, "a state supplementary payment will be issued to raise the grant payment to meet the payment floor standard."
The floor applies only to a positive grant. A client whose total countable income equals or exceeds the $1,032 standard still gets 0 (3.533; 3.520.781(A)). So the other partner cases (the full-grant and resource-limit Stale comment (no expected value changes). Before I edit these files:
|
…er $20 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in deeming, spouse's household - Round the monthly grant to cents so float residue at the standard pays no floor - Read the spouse's Medicaid in a branch where no spouse is exempt for OAP deeming, so the result keeps SNAP's pass-through and does not depend on order - Exempt interest, dividends and child support (3.520.786(K), (N), (P)) - Count SSI in a non-exempt spouse's unearned income and in a child's income - Take the child allocation from the spouse's household; drop the CO mask on spouse-side variables - Scope invariants 2 and 4 to what the rule guarantees 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>
…se ISM, rental losses - Judge a positive grant, and OAP receipt in the 3.534(C) test, to a tenth of a cent: float residue is no grant, a half-cent grant is - Drop cents from payments not reduced by SSI (3.581(E)) - Count reported Medicaid coverage; skip the Medicaid branch when no spouse of an OAP-eligible client needs it; co_oap_deeming_exempt is true only for such a spouse - Deem a non-exempt spouse's matching ISM; count a child's own child support in the 3.534(B)(3) allocation; floor each unearned source at zero - Document how the Medicaid branch resolves a household with no self-consistent outcome, and test it in both orders Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Partner cases. Both $2,268 values are correct under the $189 OAP payment floor (9 CCR 2503-5 §3.530(C), §3.532(B), §3.533(B)):
Yes to the three partner-test questions, including fixing the stale comments in |
…ents convention; child budget - Seed the branch with reported Medicaid coverage, so a known exemption holds there; state exactly when the one-step rule is self-consistent - Treat monthly amounts as recorded in cents: a quarter cent separates the rule's half-cent grid from float residue and averaging remainders - Count a dependent child by TANF's ages (under 18, or under 19 in secondary school) and floor each of the child's income sources at zero - Precompute arrays before sum() (code-health rule) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Monthly income from each source, earnings, ISM and support to the nearest cent before budgeting; SSI raised to the next cent as SSA pays it (POMS SI 02001.010). A tenth of a cent now only absorbs float32 residue - Narrow the Medicaid branch's fixed-point statement to a single unresolved exemption in a linked group of households Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ts, mills margin - Round monthly amounts half a cent up, with slack for float residue - Pay a grant reduced by SSI to the cent (3.581(E) keeps its cents) - Fix the unit of ssi_paid's margin; gate matching ISM on SSI as paid - Pin PRECISION with direct-input cases; count SSI as paid in invariant 1 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…comments Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…imit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Hand-off to the US hub. Head Review. GPT-6.1 Sol approved in rounds 5, 6, 7 and 8; round 8 was at this head. Earlier rounds requested changes, all applied. Reports: Passed locally at this head (or at
Pending:
Coordination:
Axiom: TheAxiomFoundation/rulespec-us#1721, #1727 and #1722 are queued. Signed encoder runs need Max's approval. |
|
Already answered: yes to the three partner-test questions (comment). Please update the two |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #10176 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 9 +5
Lines 76 167 +91
Branches 2 3 +1
=========================================
+ Hits 76 167 +91
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
hua7450
left a comment
There was a problem hiding this comment.
Requesting changes only until the partner values are updated (my earlier comment); I'll approve on that head.
Summary
Colorado Old Age Pension (
co_oap) gets two changes under 9 CCR 2503-5 (ruleVersionId 12428):co_oapcountedssi_countable_income, which is 0 for anyone who is not SSI-eligible. So every Coloradan aged 60–64 who is not disabled and whose resources were under the limit got the full $1,032/month whatever their income. A 62-year-old earning $60,000 got $12,384 a year. OAP now counts income under 3.533 (the client's own income) and 3.534 (deemed spousal income), whether or not the client is SSI-eligible. Payments drop cents unless SSI reduces the grant (3.581(E)).The payment floor
History. The floor first appears in the January 1, 2026 emergency rule (ruleVersionId 12318, PDF page 58). Through 2025, 3.531(D) provided only discretionary "MOE" lump sums (ruleVersionId 11861). CDHS's rulemaking packet (2025-00596) says Colorado had met the SSI pass-along by the "Total Expenditures method". So
payment_floor.yamlis $0 until 2026 and $189 from 2026-01-01, as in #10161 for AND-CS.Who gets it. The same packet (PDF pages 4 and 8) gives about 15,529 OAP recipients and $13.7 million "to meet payment floor" (SFY 2023-24 basis). That fits a floor paid only on positive grants. CDHS's Adult Financial Reference Guide (December 2025) describes it the same way: a client "eligible for a $195 Grant Allotment" gets a state supplementary payment up to the floor.
Month by month, in cents.
co_oapstays annual. It loops over the year's months and payswhere(grant > 0, max_(grant, floor), 0)for each, so a year with six eligible months pays at most 6 × $189 from the floor (YAML Case 12).Colorado records monthly income and grants in dollars and cents, so the OAP variables take each monthly amount in cents (
oap/_precision.py):The rule's own arithmetic then stays on a half-cent grid, because earnings are halved. A tenth of a cent absorbs float32 residue (Cases 24–26 and 28–35). 3.581(E) then drops cents from every payment, "except in cases where SSI income reduces the grant"; those are paid to the cent (Cases 21, 27, 32).
OAP's income rules
ssi_countable_income(before)co_oap_in_kind_support_and_maintenance)Dating. The 3.533/3.534 text modeled here took effect March 1, 2020 (ruleVersionId 8577). From March 2014 to February 2020, 3.533 applied no disregards when total income equaled or exceeded the grant standard. PolicyEngine's OAP parameters start in 2023, so only the current text is modeled. The disregard parameters are dated March 2, 2014, when OAP moved into 9 CCR 2503-5. 3.581(E) has been in 9 CCR 2503-5 since March 1, 2020.
A conflict, flagged. CDHS's December 2025 guide says applicants "must have gross income below the maximum grant standard at initial application". That is the pre-2020 rule. The current 3.533 says "Disregards shall be applied before determining a client's total countable income", and 3.520.781(A) tests total countable income. This PR follows the rule.
Medicaid, SNAP and calculation order
3.534(C) exempts a spouse who is receiving Medicaid. From 2027, Medicaid's community engagement requirement has a SNAP pass-through (42 CFR 435.554(c)(7)), and SNAP counts OAP as income. So OAP, a spouse's Medicaid enrollment and SNAP depend on each other.
co_oap_medicaid_enrolledhandles this:medicaid_enrolledor reported coverage (receives_medicaid).medicaid_enrolledin a private branch where only reported coverage exempts a spouse's income from deeming. Enrollment is therefore decided on the SNAP the household receives while the spouse's income is still deemed. The spouse keeps every route to Medicaid, the SNAP/TANF pass-through and supplied inputs included, and the result does not depend on calculation order.co_oap_deeming_exemptis true only for the spouse of an OAP-eligible client. Medicaid is read only when some such spouse is within the limit and not otherwise exempt, so most simulations never build the branch.The first version used
medicaid_enrolled_for_ssi_state_supplement, which is meant for SSI and aged, blind or disabled candidates. It dropped the SNAP route and returned a cachedmedicaid_enrolledwhen one existed, so Sol's round-1 example gave $10,274 or $12,384 depending on order. #10161 has adopted the same design for AND-CS (co_state_supplement_medicaid_enrolled). Whichever of the two lands second merges them intoco_adult_financial_medicaid_enrolledand adds a test with both heads.Cost, measured on the hub's 10% sample (16,767 people, 2027, macOS under shared load):
household_net_incomeco_oapaloneThe branch costs little when SNAP and Medicaid are computed anyway, and a lot when OAP is requested first.
Readings to check
child_support_receivedhas no beneficiary or arrears attribute, so current support to a disabled adult child (C.R.S. 14-10-115(13)) aged 60 or older cannot be told apart. It would count under 3.520.785(B)(25).child_support_expenseplusalimony_expense, with alimony treated as court-ordered.Not modeled
co_ssa_in_kind_support_and_maintenance, and the amount for the one-third reduction is with Max as d1446. Once both PRs are on main, its session will swap that variable into OAP; the hook isco_oap_in_kind_support_and_maintenance.co_oap_eligibleis unchanged).mainwas $2,880/year short for that spouse, because it charged each spouse half the couple's SSI countable income.Invariants
policyengine_us/tests/core/test_co_oap_invariants.pychecks these on Hypothesis-drawn clients aged 60–80, single or married. It runs 15 examples of up to 8 households, one simulation each. The clients have pension, interest, Social Security, earnings, rental income or loss, child support and shelter support, and the spouses have earnings, pension and shelter support. Each married household appears four ways: spouse on Medicaid, spouse not, more spousal earnings, roles swapped._apply_ssi_exclusionson the same gross income, with interest and child support exempt and a rental loss counted as zero (a differential check). For a client on SSI with none of those, 3.533(A) never counts less than SSI.A one-off 400-example run passes. Mutation checks: the tests catch 34 of these 35 mutations (YAML unless noted):
The survivor tests the grant as
np.round(grant, 2) > 0. Cent-valued inputs produce no grant between a tenth of a cent and a half cent, so under the cents convention it is equivalent to the model.Tests
YAML in
policyengine_us/tests/policy/baseline/gov/states/co/ssa/oap/, 83 cases in all. Every expectation is computed from the rule in the case's comment.co_oap.yaml: 35 cases. Cases 1–4 now feedco_oap_countable_income; they fedssi_countable_income, whichco_oapno longer reads.co_oap_own_countable_income.yaml: 14 cases.co_oap_deemed_income.yaml: 20 cases.co_oap_deeming_exempt.yaml: 9 cases, rewritten as couples.co_oap_eligible.yaml: 5 cases, unchanged.test_ssi_state_supplement_medicaid_dependency.pyadds three tests:Each asserts the client's OAP in both orders. Measured locally on macOS under shared load, before and after on the same host: 15 → 23 tests, 84 s → 89 s, peak RSS 5.11 GB → 5.08 GB.
test_co_oap_invariants.py: about 22 s, 1.2 GB peak RSS, nearly all of it model import. Both Python files run in the Rest/core group. Linux CI times are not measured.All CO YAML (6 batches), the 29 other YAML files with Colorado households, and the code-health, aggregate-list and program-registry tests pass.
Partner fixtures: two cases change, both from the floor alone:
oap.yamlco_oap_age_65_earnings_reduce_grant_partial: 414 → 2,268.state_supplement.yamlco_state_supplement_age_60_handoff_to_oap: 456 → 2,268.I have not edited them; the three questions are with @hua7450 in this comment. All other CO fixtures and
my_friend_ben/2025.yamlpass.Impact
No full-file microsimulation yet. The hub's impact queue compares merge-base(main) with the final head; extra variables:
co_oap co_oap_countable_income. Expectco_oapto fall a lot from removing the full grants to people aged 60–64, and to rise from the floor for SSI recipients aged 65 and over.Axiom
axiom: TheAxiomFoundation/rulespec-us#1721 queued (3.532 floor must require 3.520.781(A); state supplementary payment from 2026-01-01; 3.581(E) cents on full-month payments) | TheAxiomFoundation/rulespec-us#1727 queued (3.533(A)(2)(f) spillover with no unearned income and the married share; 2020-03-01 date; 3.520.786(K), (N) companion tests) | TheAxiomFoundation/rulespec-us#1722 queued (3.534(B) unearned deeming, deemed-earnings floor, total with deemed income; 2020-03-01 date). Blocker for all three: signed encoder runs are OpenAI-billed and need Max's approval.
Review
GPT-6.1 Sol, eight rounds. Reports are kept with the US hub's state (
~/reviews/co-oap-floor-10176/).fda771a): request changes, 8 findings. Fixed inef440a5:ef440a5): request changes. Fixed in93cfe1c:93cfe1c): request changes.38d6068: reported coverage now seeds the branch; the fixed-point claim is narrowed; the child budget is floored, with TANF ages.38d6068): request changes. Fixed in479f0f6: explicit cents normalization, and SSI as SSA pays it.479f0f6): APPROVE. SSI interest was reclassified as a documented limitation, because total income is right andmainis far worse. Class (c) follow-ups were applied in858c0c0.858c0c0): APPROVE. Half-cent slack applied inec4d1c0.ec4d1c0): APPROVE, "No further changes are needed before merge."8d5abf1, head): APPROVE. The delta was a test margin and a comment only.Rounds 5–8 could not execute code; my executed results at each head are listed above. The readings in "Readings to check" are queued for Max as d1457.
🤖 Generated with Claude Code