Skip to content

Add Oregon state supplementation for 2026 - #10166

Merged
hua7450 merged 11 commits into
mainfrom
or-ssp-2026
Oct 22, 2026
Merged

hua7450 merged 11 commits into
mainfrom
or-ssp-2026

Conversation

@hua7450

@hua7450 hua7450 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Oregon's state supplement was missing from PolicyEngine-US. Add or_ssp for 2026. Oregon administers it itself and pays it as Oregon Supplemental Income Program (OSIP) special-need payments to people eligible for OSIP Medical (OSIPM), under ORS 411.704 and 411.706 and OAR chapter 461.

  • Payments:
    • the $22 in-home supplement for SSI-only recipients of in-home services (461-155-0575);
    • the community-based care payment for spouses who each receive SSI, with one spouse's excess income applied to the other (0630(3));
    • the 0700(1) transitional payments (the OSIPM standard minus countable income, $994 in 2026) and the spousal diversion add-on (0700(1)(d));
    • the $773 room-and-board payments: suspended SSI (0700(2)), a temporary absence after the 461-160-0620 care liability (0630(2)(b)), incapacity with inaccessible income unavailable (0630(4); 461-140-0040(5)(e)(D)), and approved initial placement up to $773 (0630(2)(a));
    • the nursing facility payment, 79.07 minus countable income including SSI (461-155-0250(4)(c)).
  • Countable income: SSI, plus earned income as SSI counts it, plus gross unearned income, with bank and investment interest and dividends excluded (461-145-0030(4), 461-145-0108(1)(a)). Earned income excludes health premiums paid through a cafeteria plan by salary reduction (461-145-0120(5)(b)). A documented self-employment loss offsets only other earned income (461-150-0095(2)). No $20 or $65 deductions apply (461-001-0000).
  • Partial months: prorated by days and not rounded (461-160-0070(4)(b); 461-101-0010(17)).
  • Inputs: approved categories come from or_ssp_category. or_ssp_partial_month_days, or_ssp_care_liability, or_ssp_inaccessible_income, or_ssp_spousal_diversion_difference and or_ssp_approved_initial_room_board all default to 0, so entering one for one person leaves other household members unchanged.
  • Nursing facility figure: 0250(4)(c) prints $79.07, while (4)(b) and transmittal OEP-PT-25-045 raise the personal incidentals allowance to $81.28. The model follows (4)(c); a NOTE records the gap.
  • Health premiums: 461-140-0040(4) counts income "the gross before deductions", but only "Unless exclusions under another rule in chapter 461 apply". The model follows 0120(5)(b) and excludes salary-reduction premiums; a NOTE records the reading.

The payment is added to the household and SPM benefit totals. HUD counts it except the in-home supplement (or_ssp_countable_for_hud; 24 CFR 5.609(b)(19)). SNAP doesn't count it: OAR 461-145-0410(7)(c)(D) excludes these special-need payments as reimbursements.

References

Additional section and page citations are included alongside the parameters and formulas.

Coverage limits

The registry marks Oregon as partial, verified for 2026.

Not modeled:

  • other special needs (laundry, diet, accommodation, telephone and others) and historical mandatory supplements;
  • residents without SSI whose countable income is between $50 and $79.07, for the nursing facility payment, which is gated on SSI receipt. The SSI medical facility arrangement also includes hospitals;
  • a self-employment loss offsetting a spouse's earned income: 461-150-0095(2) applies a documented loss to other earned income of the financial group, but the model offsets only the person's own earned income;
  • an absent community-care resident's nursing facility payment in the same month, since a temporary absence pays only room and board.

Earlier years use parameter backfilling and are unverified historical estimates; no historical coverage is claimed.

Related:

Test plan

  • 44 Oregon SSP YAML cases (37 in or_ssp.yaml, 7 in integration.yaml) pass locally on this branch merged with main at 1f678c7. They cover:
    • each category and the couple excess-income transfer;
    • the nursing facility payment, partial months and the care liability and inaccessible income inputs;
    • two-person cases where only one person has an input;
    • an unmarried community-care recipient and spouses paid as individuals;
    • earned income: salary-reduction health premiums, a self-employment loss against wages, and a loss with only unearned income;
    • SNAP, HUD and household benefit wiring.
  • The aggregate list integrity and program registry tests pass locally (728 passed, 10 skipped).
  • ruff format and git diff --check.
  • Changelog fragment in changelog.d/.

axiom: ORS 411.704, 411.706; OAR 461-155-0250, -0270, -0575, -0630, -0700 TheAxiomFoundation/rulespec-us#1781 queued

hua7450 and others added 3 commits October 12, 2026 14:27
…d tests

- Replace builtin sum() over entity calls with a loop; move excluded sources to a parameter
- One program-neutral helper (payment excluding the in-home supplement) for SNAP and HUD, with its own references
- Revert shared SNAP comment and HUD metadata edits; registry placement and comments; SNAP title; programs.yaml note
- Accept reported SSI receipt for the in-home supplement; keep it out of the suspended-SSI category
- Governing OAR citations and page anchors
- Realistic couple integration case; SNAP/HUD flow, available-income and reported-receipt cases

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 marked this pull request as ready for review October 13, 2026 08:14
@hua7450
hua7450 requested a review from DTrim99 October 13, 2026 20:37
@DTrim99

DTrim99 commented Oct 13, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Oregon state supplementation for 2026

PR #10166 (author: hua7450, head 0fdaef588f, merge-base 2e9eea7e6e). 20 files (+826/−4), 3 commits.

Summary

The PR adds Oregon's state-administered supplement, which Oregon pays as Oregon Supplemental Income Program Medical (OSIPM) special-needs payments:

  • Parameters under gov.states.or.odhs.ssp:
    • in_home_amount: $22 a month from 2016-01-01 (OAR 461-155-0575(2))
    • room_and_board: $773 a month from 2026-01-01 (OAR 461-155-0270)
    • reduced_va_pension: $90 from 2024-10-01 (OAR 461-155-0700(1)(b))
    • excluded_income_sources: interest_income and dividend_income from 2018-04-01 (OAR 461-145-0030(4), 461-145-0108(1)(a))
    • The OSIPM one-person adjusted income standard is read from the federal SSI individual rate ($994).
  • Variables (Person, MONTH):
    • or_ssp_category is an input-only enum with 11 approved special-need categories and NONE.
    • or_ssp_countable_income is SSI plus every positive SSI earned and unearned source, minus the excluded sources.
    • or_ssp (defined_for = StateCode.OR) selects one path by category:
      • the $22 in-home supplement
      • the SSI-couple community-care payment, including the spouse's excess income
      • standard minus income for the interim-disability, naturalization, SSI-restoration and VA-restoration paths
      • room and board minus income for suspended SSI
      • spousal diversion
      • room and board minus available income for temporary absence and incapacity
      • an approved initial-placement amount capped at $773
      • day proration of all of the above
    • Input helpers: or_ssp_days_eligible, or_ssp_available_room_board_income (defaults to countable income), or_ssp_spousal_diversion_difference and or_ssp_approved_initial_room_board.
    • or_ssp_excluding_in_home_supplement feeds SNAP and HUD.
  • Aggregates and registry:
    • or_ssp is added to household_state_benefits (all four year blocks) and spm_unit_benefits.
    • or_ssp_excluding_in_home_supplement is added to SNAP and HUD unearned income.
    • A programs.yaml entry (partial, verified_years: "2026").
  • Tests: 33 YAML cases, 26 in or_ssp.yaml and 7 in integration.yaml.

Most of the 2026 policy content is right:

  • Amounts. $22, $773, $90 and the $994 / $1,491 standards match the 2026 rules and ODHS transmittal OEP-PT-25-045.
  • Formulas. Each modeled path matches the text of OAR 461-155-0575, 0630(2)–(4) and 0700(1)–(3).
  • Administration. Oregon administers the supplement itself. It isn't among the 12 states in SSA's January 2026 federally administered chart, and SSA's Oregon description says "state administered in local offices".
  • The standard. The OSIPM one-person standard has equaled the SSI federal benefit rate in every version of OAR 461-155-0250 since 2014.
  • Proration is unrounded, as OAR 461-160-0070(4)(b) and the ODHS manual require.
  • Tests and CI. All 33 expectations check by hand and pass at the head. CI is green and the branch merges cleanly with main.

Four should-fix items remain:

  1. The axiom: needed line isn't valid for a staff PR that adds a program.
  2. Three parameter descriptions don't follow the house template.
  3. The nursing-facility personal-incidentals payment in OAR 461-155-0250(4)(c) is neither modeled nor listed as excluded.
  4. The SNAP wiring counts special-needs payments that Oregon's own SNAP rule excludes.

Critical (must fix)

None.

Should address

1. axiom: needed isn't valid here, and this PR adds a program.

  • Where: the last line of the PR body, axiom: needed.
  • The rule. main's CLAUDE.md, "Axiom Parity (required for policy changes)", lists the accepted forms: encoded-correct, encoded, queued or n/a: <reason>. needed is reserved for external contributors who can't complete the Axiom work, and the author is PolicyEngine staff.
    • CONTRIBUTING.md#axiom-parity: "That covers a new program, a parameter or threshold update, an eligibility rule and a bug fix." This PR adds a new program, and none of the n/a grounds applies.
  • Nothing to point to yet.
    • On rulespec-us main, us-or/ holds only policies/cms/, policies/income_tax/, statutes/315/ and statutes/316/.
    • Issue searches for "Oregon supplemental", "OSIPM", "461-155", "Oregon SSP", "Oregon state supplement" and "us-or" find no SSP issue.
    • The only Oregon hit, MO Pension and SS or SSD Deduction #1463, is a Montana-led Medicaid issue. It cites OAR 461-155-0250(3) only for the aged, blind and disabled Medicaid income limit, not for the special-needs payments.
  • Precedent:
  • Fix: file a dispatch-ready pe-parity issue on the Add AMT parameters for 2020-2023 #1467 / DC CDCC #1708 model. Then add a line such as axiom: ORS 411.706; OAR 461-155-0250, -0270, -0575, -0630, -0700 TheAxiomFoundation/rulespec-us#NNNN queued. The issue needs:
    • Module paths:

      • us-or/statutes/411/706.yaml, with the ORS 411.704(1) definition of assistance. This follows the layout of us-or/statutes/315/264.yaml.
      • us-or/regulations/oar-461/461-155-0575.yaml, -0630.yaml, -0700.yaml, -0270.yaml and -0250.yaml (sections (3) and (4))
      • 461-145-0030.yaml (4), 461-145-0108.yaml (1)(a) and 461-160-0070.yaml
    • Verbatim law, quoted under Verified correct.

    • Required outputs (Person, monthly):

      • the $22 amount, with a Judgment: SSI is the only countable income AND the person receives in-home or State Plan Personal Care services
      • the couple community-care formula with the excess-income transfer
      • the four 0700(1) "standard minus countable income" payments and the 0700(1)(d) diversion add-on
      • the $773 standard and the room-and-board payments
      • unrounded proration
      • the 0250(4)(c) nursing-facility payment standard, once it is modeled (Should 3)
    • Companion tests from the same sources:

      Case Payment
      In-home, SSI only 22
      SSI couple in community-based care, no other income 994 − 1,491 / 2 = 248.50 each
      Leaving a nursing facility with $30 SSI 964
      Reduced VA pension of $90 904
      Suspended SSI, no income 773
      SSI restoration for 16 of 31 days 964 × 16 / 31 = 497.55, unrounded
      Nursing-facility resident with $30 SSI (if modeled) 49.07

2. Three parameter descriptions don't follow the house template.

  • Where:
    • parameters/gov/states/or/odhs/ssp/in_home_amount.yaml:1: "Oregon provides this monthly reimbursement to SSI-only recipients with authorized in-home care."
    • .../reduced_va_pension.yaml:1: "Oregon permits the restoration supplement for recipients leaving a nursing facility with a Veterans benefit no larger than this amount."
    • .../room_and_board.yaml:1: "Oregon uses this monthly room and board standard for OSIPM special needs payments."
  • The template: "one sentence, spell the program out fully (no acronyms), [State] [verb] ... under the [Full Program Name] program."
    • None of the three has the "under the ... program" clause.
    • Two use acronyms ("SSI", "OSIPM").
    • The fourth new file, excluded_income_sources.yaml, already follows the template: "Oregon excludes these income sources from countable income under the State Supplemental Payment program."
    • The sibling SSP parameters on main do as well. For example, ga/dhs/ssp/amount.yaml: "Georgia provides this amount as the monthly supplement under the State Supplementary Payment program."
  • Fix:
    • in_home_amount.yaml: "Oregon provides this amount as the monthly in-home supplement under the State Supplemental Payment program."
    • reduced_va_pension.yaml: "Oregon limits the nursing-facility restoration payment to recipients whose reduced Veterans pension is at most this amount under the State Supplemental Payment program."
    • room_and_board.yaml: "Oregon sets this amount as the monthly community-based care room and board standard under the State Supplemental Payment program."

3. The nursing-facility personal-incidentals payment (OAR 461-155-0250(4)(c)) is neither modeled nor listed as excluded.

  • Where:
    • or_ssp.py:58-84 has no path for a resident of a Medicaid nursing facility.
    • The programs.yaml notes (lines 1099-1101) say only "Other special needs and historical mandatory supplements are not modeled". This payment is neither. It is the OSIPM payment standard itself.
    • The PR body doesn't mention it.
  • The rule. OAR 461-155-0250, effective 1-01-26, PDF p. 1:
    • "(4) In the OSIPM (except ... OSIPM-EPD), an individual receiving Medicaid services in a nursing facility or an Intermediate Care Facility-Intellectually Disabled (ICF-ID) is allowed the following amounts for clothing and personal incidentals: (a) For an individual who receives a Veterans (VA) pension based on unreimbursed medical expenses (UME), $90 is allowed. (b) For all other individuals, $81.28 is allowed."
    • "(c) For an individual identified in subsection (b) of this section with countable income (including any SSI) that is less than $79.07, the payment standard is equal to the difference between the individual's countable income (including any SSI) and $79.07."
  • It has applied in every year the model covers. The rule history shows the same (b)/(c) pair in every version from 7-01-14 on, with one figure used in both places:
    • $60 (2014–2016), $60.18 (2017), $61.38 (2018), $63.10 (2019), $64.11 (2020), $64.94 (2021), $68.77 (2022), $74.75 (2023), $77.14 (2024) and $79.07 (2025)
    • The 1-01-14 version allowed "$30" and had no (c).
  • 2026 uses two different figures. The rule moved (b) to $81.28 but left $79.07 in (c). OEP-PT-25-045, PDF p. 8: "Nursing Facility PIF: The PIF for NF and ... ICF-IID residents who are not receiving VA aid and attendance benefits is increasing to $81.28."
  • It is a cash benefit, not a liability allowance.
  • Probe at the head (2026-01): an aged SSI-only resident with ssi_lives_in_medical_treatment_facility and ssi_medicaid_pays_majority_of_care gets SSI 30 and or_ssp 0.
    • The rule as published gives 79.07 − 30 = 49.07.
    • If (c) tracks (b), it gives 81.28 − 30 = 51.28.
  • Why it matters beyond one household.
    • SSI recipients are assumed eligible for OSIPM (OAR 461-135-0010), so this payment applies automatically to every SSI-only resident of an Oregon Medicaid nursing facility.
    • It would also be the PR's only path that works in microsimulation. Every other path needs the input-only or_ssp_category.
  • Fix: model it:
    • Add nursing_facility_payment_standard.yaml with 2026-01-01: 79.07, cited to 0250(4)(c) #page=1, with a comment that (b) prints $81.28.
    • Add a path to or_ssp for ssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY with SSI receipt, paying max_(standard − or_ssp_countable_income, 0).
    • Add tests: SSI-only resident gives 49.07; a resident whose countable income is at or above the standard gives 0.
    • If you defer it instead, name it in the programs.yaml notes and the PR body. That makes it a documented deferral.

4. The SNAP wiring counts special-needs payments that Oregon's SNAP rule excludes.

  • Where:
    • parameters/gov/usda/snap/income/sources/unearned.yaml:50 adds or_ssp_excluding_in_home_supplement.
    • The NOTE at or_ssp_excluding_in_home_supplement.py:20-23 acknowledges the conflict and follows 7 CFR 273.9(c)(5) instead.
  • Oregon's rule. OAR 461-145-0410(7), PDF p. 2:
    • "Benefits from the General Assistance (GA), Oregon Supplemental Income Program (OSIP) (except OSIPM-Independent Choices Program), REF, ... TANF, and Tribal TANF programs are treated as follows: ... (c) In the SNAP program: ..."
    • "(D) Ongoing special needs payments for laundry allowances, special diet or meal allowance, restaurant meals, accommodation allowances, and telephone allowances are treated as unearned income. All other special needs payments are excluded as reimbursements."
  • Every path the PR models is an excluded special need:
    • 461-155-0575 is "Special Need; In-home Supplement", 0630 is "Special Need; Community-Based Care", and 0700 is "Special Need; Personal Incidentals and Room and Board Allowances".
    • The OPEN's special-needs list (PDF p. 569) names all of them.
    • None is among the five counted types.
  • The federal rules don't clearly require counting.
    • 7 CFR 273.9(c)(1)(i)(F) (LII) excludes public-assistance vendor payments for "emergency and special assistance" that are "provided over and above the normal PA grant".
    • The room-and-board special needs can be paid straight to the facility (0630(2)(b); OPEN PDF p. 570).
    • The batch checklist counts an SSP in SNAP only "where the state counts it".
  • Probe at the head: integration Case 6's couple in 2026.
    • With the payment counted, SNAP unearned income is 23,856 and snap is 306 a year.
    • With it excluded, SNAP unearned income is 18,132 and snap is 1,914 a year.
    • So the household loses $1,608 of SNAP.
  • Fix:
    • Remove or_ssp_excluding_in_home_supplement from the SNAP list and keep it in HUD.
    • Rewrite the NOTE to cite 461-145-0410(7)(c)(D).
    • Change integration Case 6 (integration.yaml:135-136) to snap_unearned_income: 18_132 (12 × (1,200 + 311)).
    • If you keep the federal reading, the PR needs a sourced argument that Oregon's rule doesn't control. A NOTE isn't enough.

Suggestions

  1. Amounts before 2026 (deferral documented in the PR body: "Parameter backfilling does not establish verified historical coverage", Oregon SSP 2017, 2018, 2019 #9042).
    • The leak. room_and_board.yaml has only 2026-01-01: 773, so $773 carries back to 2015. Probe at the head, suspended-SSI recipient with no income: or_ssp is 773 in 2015-01, 2018-01, 2022-01 and 2025-01.
    • What Oregon paid. The 0270 history shows:
      • $570 (1-01-15), $571 (1-01-17), $583 (1-01-18), $599 (1-01-19), $608 (1-01-20) and $617 (1-01-21)
      • $654 (1-01-22), $711 (1-01-23), $733 (1-01-24) and $752 (1-01-25)
    • Rows that are already right:
      • $22 in-home: the rule has been "Effective 1-01-16".
      • The $994-linked standard: every 0250 version matches the federal benefit rate, from 733 (2015) to 967 (2025).
      • $90 VA: it appears in every version.
    • reduced_va_pension's 2024-10-01 date isn't supported. The 0700 history shows "$90" in (1)(b) from the 1-01-20 version on, and 0250(4)(a) has had it since 1-01-14. Backward extrapolation means this has no numeric effect.
    • Fix: widen Oregon SSP 2017, 2018, 2019 #9042 ("Oregon SSP 2017, 2018, 2019") to cover 2015–2025, the room-and-board history and the nursing-facility figures listed in Should 3. Date reduced_va_pension to 2014-01-01.
  2. The Texas rebate reform's copy of spm_unit_benefits now omits or_ssp.
    • Where: reforms/states/tx/rebate/tx_rebate.py redefines spm_unit_benefits nationwide with a hard-coded list that lacks or_ssp. It already lacks ca_state_supplement.
    • Probe at the head (2027): an Oregon couple who both receive SSI and community-based care (integration Case 1).
      • spm_unit_benefits is 24,824.01 at baseline and 18,693.01 under the reform, a drop of exactly the 2 × 3,065.50 or_ssp.
      • spm_unit_net_income falls by the same amount.
      • household_net_income is unchanged at 26,126.01.
    • Fix: insert "or_ssp", # Oregon benefits after "fl_oss", at line 65, as spm_unit_benefits.py does. Add ca_state_supplement while there, consistent with Add Wyoming state supplementation for 2026 #10174.
  3. Pin the remaining readings and assert the aggregates.
    • Unmarried community-care recipient. Probe: SSI 994 and or_ssp 0. That is right, since 0630(3) covers only "Spouses who each receive" SSI. Only the enum label says so, though.
    • A couple SSA pays as two individuals, for example in separate facilities, with 994 each: the formula gives 0. That is correct but untested.
    • Aggregates. No case asserts household_state_benefits or spm_unit_benefits, so removing or_ssp from either list would pass every test.
    • Fix: add the two cases to or_ssp.yaml. Add household_state_benefits: 264 to integration Case 5.
  4. References and citations.
    • Domain. All rule links use the Azure storage host odhsssprulesprdwu1st01.blob.core.windows.net. ODHS's own links, and main's Oregon Medicaid parameters, use https://ch461rules.odhs.oregon.gov/rules/.... Switch to the canonical host.
    • Anchors. Single-page rule PDFs (0575, 0270, 461-160-0070) are linked without #page=1.
    • Proration authority. OAR 461-160-0070 names "the GA, OSIP, REF, SNAP, and TANF programs", not OSIPM. ODHS applies the same text to OSIPM payments in the OPEN's Medical Related Payments section (PDF p. 583: "The prorated benefit is not rounded"). Add that page to or_ssp.py and or_ssp_days_eligible.py.
    • Manual edition. The OPEN is revised often. Add a # DHS 2818 (10/2026) comment next to its page-583 link in or_ssp_excluding_in_home_supplement.py.
    • Statutory basis. or_ssp.py cites no statute. ORS 411.706(1) ("shall provide assistance according to the rules of the Department of Human Services and on the basis of need") and 411.704(1)(b) ("Special need allowances for one-time or ongoing needs") are the basis.
    • OSIPM standard (optional). The OSIPM standard is read from gov.ssa.ssi.amount.individual. That is correct (see Verified correct) and matches main's uses_ssi_federal_benefit_rate treatment of Oregon. A short state parameter, or a reference to 461-155-0250(3) on that line, would make the state rule visible.
  5. Polish.
    • Blank lines. The PR adds a stray blank line before metadata: in household_state_benefits.yaml:412 and hud/annual_income/sources/unearned.yaml:33. Neither relates to Oregon.
    • Case count. The PR body says "29 source-based YAML cases". The PR has 33 (26 + 7).

Verified correct

  • Statute. ORS 411.706(1): "The Oregon Supplemental Income Program shall provide assistance according to the rules of the Department of Human Services and on the basis of need, taking into account the income and resources available to the applicant or recipient."
    • ORS 411.704(1): "'Assistance' means: (a) Cash payments or noncash benefits provided under ORS 411.706 ... or (b) Special need allowances for one-time or ongoing needs."
  • SSA's description. January 2011, Oregon:
    • "Mandatory Minimum Supplementation: No recipients."
    • "Administration: State Department of Human Services ... (state administered in local offices)."
    • "Scope of coverage: State-administered payments provided to some SSI recipients or to an individual who would be eligible for SSI except for income. Individuals meeting requirements for specific special need item receive supplementation."
    • "Spousal facility allowance: Spouses who each receive SSI and services in a community-based care facility are eligible for a payment that equals the difference between the OSIPM standard for a one-person need group and the individual's total countable income."
    • POMS SI 01415.058 A (January 2026) lists 12 federally administered states, and Oregon isn't one. So state administration, with no SSA rounding or $1 floor, is right for 2026.
  • The standard. OAR 461-155-0250(3), PDF p. 1: "AB/AD/OAA ... 994.00 ... 1,491.00".
    • The history gives the one-person figure as 733 (2015), 735 (2017), 750 (2018), 771 (2019), 783 (2020), 794 (2021), 841 (2022), 914 (2023), 943 (2024) and 967 (2025). Each equals the SSI federal benefit rate, so standard = federal.individual (or_ssp.py:24-26) is right in every year.
    • OEP-PT-25-045, PDF p. 7 repeats "994.00 / 1491.00" and "CBC Room and Board: $773.00". The parameter's #page=7 anchor shows the value.
  • In-home supplement. OAR 461-155-0575 (effective 1-01-16):
    • "(a) The individual must receive SSI as his or her only source of countable ... income. (b) The individual must receive home and community-based care ... in-home services or State Plan Personal Care Services".
    • "(2) An individual eligible under section (1) of this rule receives a $22 monthly payment. The payment is considered reimbursement for uncovered assistance needs."
    • The OPEN (p. 583) adds: "all eligible individuals will receive this amount ... so do not impact other program benefits."
    • in_home = IN_HOME & receives_ssi & (income == ssi) implements it. Excluding it from SNAP and HUD is supported by 461-145-0410(7)(c)(D) and by 24 CFR 5.609(b)(19).
  • Community-based care. OAR 461-155-0630:
    • Initial placement. (2)(a): "Payment for room and board may be authorized during the month of admission at the initial placement, limited to the approved rate". The cap is $773.
    • Temporary absence. (2)(b)(A)(iv): "does not have sufficient income to pay room and board after contributing available income to the liability". This is the or_ssp_available_room_board_income override.
    • Couples. (3), PDF p. 2: "the difference between the OSIPM standard for a one-person need group ... and the individual's total countable ... income. If one spouse ... has income above the OSIPM standard, the excess income is applied to the countable income of the other spouse." That is couple_payment = max_(standard − income − spouse_excess, 0).
    • Incapacity. (4)(d), PDF p. 3: "The payment is the difference between the countable income and the room and board standard".
  • Transitional allowances. OAR 461-155-0700:
    • (1)(a)(B), (1)(b)(B) and (1)(c)(B) each pay "the difference between the countable income of the individual and the OSIPM program adjusted income standard". (1)(b) applies to a person "limited to a maximum SSI payment of $30 or to a maximum Veterans benefit payment of $90", which gives the ssi <= medical_facility and veterans <= reduced_va_pension gates.
    • (1)(d)(B): "the amount calculated under paragraph (A) ... plus the difference between the OSIPM program adjusted income standard and the individual's countable income".
    • (2)(c), PDF p. 3: "the difference between the countable income of the individual and the OSIPM Room and Board Standard"; and (2)(d): "If SSI is reinstated ... the individual is no longer eligible". That gives ~receives_ssi.
    • (3): "The payment amount is prorated in the first month".
  • "Countable" before deductions. OAR 461-001-0000: "(3) 'Adjusted income' means the amount determined by subtracting income deductions from countable ... income"; and (19), PDF p. 5: "'Countable' means that an available asset ... is not excluded". So the PR is right to apply no $20 or $65 deductions (Case 8: 994 − 100 = 894).
  • Interest and dividends. OAR 461-145-0030(4), PDF p. 2: "In the OSIP, OSIPM, and QMB programs, interest and dividends earned on funds in a bank account are excluded as income."
    • 461-145-0108(1)(a) (effective 4-01-18) excludes dividends and interest on securities. That fits the 2018-04-01 date.
  • Proration. OAR 461-160-0070(2)–(3) divides by the days in the month, and (4)(b) says "the prorated benefit is not rounded".
  • No double count and no circularity.
    • Every path nets SSI inside or_ssp_countable_income, so ssi + or_ssp equals the standard (for example, 30 + 964 = 994).
    • or_ssp isn't in the SSI income sources.
  • HUD. Counting the non-in-home payments matches the batch convention. 24 CFR 5.609(b)(19) supports excluding the in-home supplement.
  • Code:
    • Vectorization. select, where, max_, min_ and clip throughout. The source loop runs over parameter names, not arrays, and floors each source so a loss can't offset another.
    • Policy values all come from parameters. period.days is calendar arithmetic.
    • Entities and periods are right: Person / MONTH, YEAR flows divided by 12, and annual totals that sum the months (integration Cases 5 and 6).
    • Callers. or_ssp appears only in the lists this PR edits, including all four household_state_benefits blocks (2023–2026), so the integrity guard passes. It is missing only from tx_rebate.py (Suggestion 2).
    • SNAP reference. The consolidation follows main's one-entry-per-document rule, as in the siblings.
    • Anchors. The page anchors for 0030 (p. 2), 0108 (p. 1), 0250 (p. 1), 0630 (p. 1), 0700 (pp. 1 and 2), 461-001-0000 (pp. 1 and 5), 461-145-0410 (p. 2) and OEP-PT-25-045 (p. 7) each open the cited text. The LII #c_5 anchor resolves.
  • Hand checks: all 33 expectations. The 2026 federal rates are $994 for an individual and $1,491 for a couple.
    • or_ssp.yaml:
      • Case 1: no category gives 0.
      • Case 2: income 994 equals SSI, so 22.
      • Case 3: $500 of Social Security gives SSI 514 and income 1,014, so 0.
      • Case 4: $652.17 of wages gives SSI 994 − 283.58 = 710.42, and income isn't SSI alone, so 0.
      • Case 5: $10 of interest is excluded, so 22.
      • Case 6: no SSI gives 0.
      • Cases 7 and 12: 994.
      • Case 8: 994 − 100 = 894.
      • Case 9: 994 − 30 = 964.
      • Case 10: SSI 994 is above $30, so 0.
      • Case 11: 1,080 / 12 = 90, so 994 − 90 = 904.
      • Case 13: 773.
      • Case 14: 0.
      • Case 15: 964 × 16 / 31 = 497.548.
      • Case 16: 994 × 14 / 28 = 497.
      • Case 17: 0.
      • Case 18: 100 + (994 − 800) = 294.
      • Case 19: 100 + 0 = 100.
      • Case 20: 773 − 200 = 573.
      • Case 21: 773.
      • Case 22: 500.
      • Case 23: min(900, 773) = 773.
      • Case 24: WA gives 0.
      • Case 25: reported receipt with income 0 = SSI 0 gives 22.
      • Case 26: 0.
    • integration.yaml:
      • Case 1: 994 − 745.50 = 248.50 each.
      • Case 2: couple SSI is 1,491 − 1,180 = 311, or 155.50 each. Countable income is [1,355.50, 155.50]. The excess is 361.50, so 994 − 155.50 − 361.50 = 477, and or_ssp is [0, 477].
      • Cases 3 and 4: [0, 0].
      • Case 5: 22 × 12 = 264. SNAP and HUD unearned income are both 11,928.
      • Case 6: SSI 1,866 each and or_ssp [0, 5,724]. SNAP unearned income is 12 × 1,988 = 23,856. HUD is [16,266, 7,590].
      • Case 7: SSI 514, so countable and available income are 1,014, and 773 − 1,014 < 0 gives 0.
  • Changelog: changelog.d/or-ssp-2026.added.md is top-level, typed added, and accurate.
  • Registry:
    • The programs.yaml entry sits under ssi_state_supplement.state_implementations with the WA/MO fields.
    • partial fits the unmodeled special needs. parameter_prefix resolves.

Batch checks

  1. Axiom line: invalid (needed). rulespec-us has no Oregon SSP module or issue; MO Pension and SS or SSD Deduction #1463 covers only the 0250(3) Medicaid income limit (Should 1).
  2. Parameter descriptions: in_home_amount.yaml, reduced_va_pension.yaml and room_and_board.yaml are off-template (Should 2). excluded_income_sources.yaml follows the template.
  3. Backdating:
    • The $773 room-and-board standard leaks into 2015–2025, where the 0270 history shows $570–$752.
    • The $22, the $90 and the federal-benefit-rate-linked standard are right back to at least 2016.
    • The nursing-facility payment is absent in every year (Should 3).
    • This is a documented deferral (Oregon SSP 2017, 2018, 2019 #9042), so Suggestion 1.
  4. tx_rebate.py copy: it omits or_ssp. The probe shows spm_unit_benefits down $6,131 for an Oregon couple in community-based care in 2027 (Suggestion 2).
  5. Aggregate wiring:
    • All four household_state_benefits blocks, spm_unit_benefits, HUD, SNAP and programs.yaml are present.
    • There is no double count with ssi.
    • SNAP counts payments that OAR 461-145-0410(7)(c)(D) excludes (Should 4).
  6. Income attribution:
    • Countable income is person-level: SSI plus gross sources, with interest and dividends excluded.
    • The 0630(3) spousal excess transfer is pinned by integration Cases 1–4.
    • The unmarried and separate-claim readings are correct but unpinned (Suggestion 3).
    • The nursing-facility arrangement is unmodeled (Should 3).
  7. Sibling conflicts:
  8. CI: all 26 checks pass on head 0fdaef588f, with no failing job.
  9. State law first:
    • Read: ORS 411.704 and 411.706; OAR 461-155-0250, 0270, 0575, 0630 and 0700; 461-160-0070; 461-145-0030, 0108 and 0410; 461-001-0000; the 0250, 0270 and 0700 histories; OEP-PT-25-045; the OPEN DHS 2818 (10/2026); SSA's 2011 Oregon description; and POMS SI 01415.058 A.
    • Every 2026 amount, the state administration and the effective dates check out.
    • All 33 expectations check by hand.

Axiom line assessment

Invalid (Should 1).

CI status

All 26 checks pass (gh pr checks 10166). Three "skipping" entries belong to the superseded run 38358263620.

  • The run. Run 38367921823 (pull_request, 2026-10-13 08:14 UTC) on head 0fdaef588f, conclusion success.
  • Main since then. In the files this PR depends on, main has changed only unemployment_compensation → total_unemployment_compensation in the HUD, SNAP and SSI lists, spm_unit_benefits.py and tx_rebate.py, plus three programs.yaml lines. or_ssp_countable_income reads the SSI source list at run time, so it picks up the rename after merge.
  • Local run. The two new test files at the head with policyengine-core 3.33.2: 33 passed.
  • Partner tests. The PR touches no partner test files, and the Household API Partners job passes.

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The 2026 amounts ($22, $773, $90, $994/$1,491) match OAR 461-155-0250/0270/0575/0700 and OEP-PT-25-045, the formulas match the rules, and all 33 cases check by hand. Four should items (see the comment above): (1) 'axiom: needed' isn't valid for staff, and rulespec-us has no OR SSP module, so file a pe-parity issue and add a queued line; (2) three descriptions are off the template; (3) the nursing-facility personal-incidentals payment (OAR 461-155-0250(4)(c)) is neither modeled nor listed as excluded (an SSI-only NF resident should get 49.07, not 0); (4) SNAP counts or_ssp_excluding_in_home_supplement, but OAR 461-145-0410(7)(c)(D) excludes all these special needs from SNAP (integration Case 6 SNAP is 306 instead of 1,914 a year).

hua7450 and others added 2 commits October 15, 2026 16:45
- Model the OAR 461-155-0250(4)(c) nursing facility payment.
- Stop counting the special-need payments as SNAP income
  (OAR 461-145-0410(7)(c)(D)); keep them in HUD as or_ssp_countable_for_hud.
- Replace the partial-month days and available room-and-board income
  formula inputs with zero-default inputs (partial-month days, care
  liability, inaccessible income), so entering one for one person leaves
  others unchanged.
- Update descriptions, references (ch461rules host, ORS 411) and the
  reduced VA pension date, and add tests.

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

hua7450 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. The fixes are in badb1c9, followed by a merge of main (711f3c9).

Should 1 (Axiom line): filed TheAxiomFoundation/rulespec-us#1781 (pe-parity). It has:

  • your module paths;
  • the verbatim ORS 411 and OAR 461 text;
  • the required outputs;
  • your seven companion cases mapped to the PE cases.

The source conflicts are in a separate comment on that issue, and the axiom line now points to it.

Should 2 (descriptions): the three files use your sentences.

Should 3 (nursing facility payment): modeled. A new nursing_facility_payment_standard is the last branch in or_ssp. An SSI recipient in a Medicaid facility gets 79.07 minus countable income including SSI.

  • or_ssp.yaml Case 29 pins your resident at 49.07. Cases 30 and 31 pin $1,200 of Social Security (0) and the $90 VA pension (0; 30 + 90 > 79.07).
  • Which figure: I followed (4)(c) as printed, $79.07, and a NOTE records that (4)(b) and OEP-PT-25-045 print $81.28. That looks like a missed COLA edit (79.07 × 1.028 = 81.28), but the operative text of (c) says 79.07. The conflict comment on 1781 lays out both.
  • The payment is gated on SSI receipt (461-135-0010 assumed eligibility). The NOTE and body name the limits:
    • residents without SSI with countable income of $50–79.07;
    • the SSI facility arrangement also covers hospitals.
  • One correction: neither facility input is populated in the microdata, so this path, like the category paths, only affects household calculations.

Should 4 (SNAP): removed from SNAP, as you suggest.

  • 461-101-0010(17) defines OSIP as these special-need payments, so 461-145-0410(7)(c)(D) applies. None of the modeled paths is a laundry, diet, meal, accommodation (0660) or telephone allowance.
  • HUD still counts them, through the renamed or_ssp_countable_for_hud, with the in-home supplement excluded under 24 CFR 5.609(b)(19).
  • A comment in the SNAP list explains why or_ssp isn't there. The nursing facility payment isn't a special need, but its recipients live in an institution (7 CFR 273.1(b)(7)(vi)).
  • Integration Case 6 is now 18,132.

Suggestion 1 (history): out of scope, and I didn't widen #9042.

  • I re-dated reduced_va_pension to 2020-01-01. That is the earliest 0700 version with the $90 cap (history p. 7).
  • The 2014 date you mention is 0250's $90 UME allowance, a different provision. It has no numeric effect either way.

Suggestion 2 (Texas rebate copy): #10226 tracks one spm_unit_benefits list that reforms append to, so this PR leaves tx_rebate.py unchanged.

Suggestion 3 (readings and aggregates):

  • or_ssp.yaml Case 27 pins an unmarried community-care recipient at 0. Case 28 pins spouses living apart, paid as individuals, at [0, 0].
  • Integration Case 5 asserts household_state_benefits: 264.

Suggestion 4 (references):

  • All rule links use ch461rules.odhs.oregon.gov; the files are byte-identical.
  • or_ssp.py cites ORS 411.704/411.706, 461-101-0010(17) and OPEN p. 583, the last with a # DHS 2818 (10/2026) comment. 461-101-0010(17) is what brings these payments under 461-160-0070's "OSIP".
  • The OSIPM standard line cites 0250(3).
  • 0575, 0270 and 461-160-0070 are one-page PDFs, so I left them without a page anchor.

Suggestion 5 (polish): I kept the blank lines before metadata:; they come from our formatting pass and are harmless. The body's case count is updated.

One more fix I found: or_ssp_days_eligible (formula: days in the month) and or_ssp_available_room_board_income (formula: countable income) were both formulas and inputs. Entering either one for one person reset everyone else in the simulation to 0.

  • With days, a second restoration resident got 0 instead of 964.
  • With available income, a second absent resident got the full 773 instead of 0.

They are replaced by zero-default inputs:

  • or_ssp_partial_month_days: 0 means a full month.
  • or_ssp_care_liability: the 461-160-0620 liability that 0630(2)(b)(A)(iv) subtracts during an absence.
  • or_ssp_inaccessible_income: income unavailable under 461-140-0040(5)(e)(D) for 0630(4)(d).

Related test changes:

  • Cases 32 and 33 pin two residents with an input on one only.
  • Case 20 now uses a resident with $1,200 of Social Security, since OPEN p. 545 says "SSI recipients do not have a liability".
  • Integration Case 3 used an ssi: 0 input that also reset person1's SSI; it now uses take-up.

On the merged head, these pass locally: all 492 Oregon cases (SSP and tax), the SNAP and HUD suites, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).

A formula-less monthly input carries forward to later months, so a
partial month also prorated every month after it. A formula that returns
0 keeps a one-month entry to that month.

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

hua7450 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

One follow-up to my reply, in 3311c3b. In policyengine-core, a monthly input with no formula carries forward to later months, so or_ssp_partial_month_days entered for January also prorated every later month. It now has a formula that returns 0. A one-month entry stays in its month, and entering it for one person still leaves other household members unchanged. or_ssp.yaml Case 34 pins a January entry followed by a full February.

@DTrim99

DTrim99 commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Add Oregon state supplementation for 2026

PR #10166 (author: hua7450). This round reviews head 3311c3b18f; round 1 reviewed 0fdaef588f. Three commits landed in between:

  • badb1c96c5, "Address review: Oregon SSP nursing facility payment, SNAP and inputs" (22 files, +353/−122). It does the following:
    • models the OAR 461-155-0250(4)(c) nursing-facility payment;
    • drops the payments from SNAP income and keeps them in HUD as or_ssp_countable_for_hud;
    • replaces the two formula-backed inputs with zero-default inputs (or_ssp_partial_month_days, or_ssp_care_liability, or_ssp_inaccessible_income);
    • updates descriptions and references, and adds Cases 27–33.
  • 711f3c9ebf, a merge of main at 9560e7f183 (61 commits) with no hand-resolved conflicts. Among other things, it brought in:
  • 3311c3b18f, "Stop Oregon SSP partial-month days from carrying into later months" (2 files, +22). It gives or_ssp_partial_month_days a formula that returns 0 and adds Case 34.

Summary

Ziming fixed all four round-1 should items:

He also acted on Suggestions 3 and 4, and gave reasons for the rest, which I accept. On his own he found that entering a formula-backed input for one person reset everyone else to 0. He replaced those inputs with zero-default ones, stopped partial-month days from carrying into later months, and pinned both fixes (Cases 32–34).

One new should item. or_ssp_countable_income adds raw employment_income and floors each earned source at 0. OSIPM's rules do two things differently:

  • they leave out health premiums paid through a cafeteria plan (OAR 461-145-0120(5)(b));
  • they let a documented self-employment loss offset other earned income (461-150-0095(2)).

This mirrors NH #10156 and OK #10165. Those states count gross wages, but the code used SSI's net figure. Here Oregon follows SSI, but the code counts gross. The premium half first showed up when #10046 arrived in this round's merge. The loss half was already there in round 1, where I listed the per-source floor as verified; that was my miss.

One optional suggestion: the case counts in the body and in #1781.

CI is 27/27 green on the head. The branch is 56 commits behind main and now conflicts with it in all five shared lists, because sibling SSP lines landed at the same spots (branch note).

Prior findings status

Finding Status Evidence
Should 1: axiom: needed isn't valid for a staff PR that adds a program Fixed The line now reads axiom: ORS 411.704, 411.706; OAR 461-155-0250, -0270, -0575, -0630, -0700 TheAxiomFoundation/rulespec-us#1781 queued. #1781 is open and labelled pe-parity; Ziming filed it on 2026-10-15. It has the module paths with corpus status and the verbatim ORS 411.704(1) and 411.706(1) text. It also quotes 461-101-0010(17), 0250(3)–(4), 0270, 0575, 0630, 0700, 0070, 0030(4), 0108(1)(a) and 0410(7)(c), and has a required-outputs table. Companion tests A–H are mapped to PE cases (H is Case 29, 49.07). A source-conflicts comment covers $79.07 vs $81.28 and the SNAP reading. More under Axiom line assessment.
Should 2: three parameter descriptions were off-template Fixed in_home_amount.yaml, reduced_va_pension.yaml and room_and_board.yaml use the proposed sentences. The new nursing_facility_payment_standard.yaml also follows the template: "Oregon pays a nursing facility resident the difference between countable income and this amount under the State Supplemental Payment program."
Should 3: the 0250(4)(c) nursing-facility payment was neither modeled nor listed as excluded Fixed The parameter. nursing_facility_payment_standard.yaml has 2026-01-01: 79.07 and the reference title "OAR 461-155-0250(4)(c) #page 1-2". The page range is right because (c) runs onto p. 2, which adds that countable income "includes income that would otherwise be countable for an individual who is assumed eligible under OAR 461-135-0010". A second reference cites OEP-PT-25-045 p. 8, and a NOTE records the $81.28 in (b). The formula. or_ssp.py:76-79 adds the branch nursing_facility = (arrangement == MEDICAL_TREATMENT_FACILITY) & receives_ssi, the last in the select, paying max_(79.07 − income, 0). SSI's facility arrangement requires Medicaid to pay most of the cost of care, which fits "receiving Medicaid services in a nursing facility". Tests. Cases 29 (49.07), 30 (0) and 31 (0). Still current. I re-read 0250 on ODHS's site: still "Effective 1-01-26", with $81.28 in (b) and $79.07 in (c). The limits are documented in the NOTE, the body and #1781: residents without SSI whose income is $50–79.07, hospitals and OSIPM-EPD.
Should 4: SNAP counted special-need payments that OAR 461-145-0410(7)(c)(D) excludes Fixed SNAP. or_ssp is no longer on the SNAP unearned list. A comment there cites 0410(7)(c)(D), and 7 CFR 273.1(b)(7)(vi) for nursing-facility residents. HUD. HUD still counts the payments through or_ssp_countable_for_hud, without the in-home supplement. Tests. Integration Case 6 is now 18,132 and asserts or_ssp_countable_for_hud [0, 5,724]. The OSIP link holds. 461-101-0010(17), p. 3: "OSIP; Oregon Supplemental Income Program. Cash supplements and special need payments to individuals who are determined eligible for OSIPM and meet the requirements set forth under OARs 461-155-0500 through 461-155-0710."
Suggestion 1: amounts before 2026; reduced_va_pension's date History declined (accepted); date fixed with a correction The history. The body says "Earlier years use parameter backfilling and are unverified historical estimates; no historical coverage is claimed", and the registry claims only "2026". That makes it a documented deferral; $773 still carries back to 2015. The date. reduced_va_pension is now 2020-01-01, citing the 0700 history, p. 7. Ziming's correction holds. The history has three earlier versions: 1-01-20 (p. 7), a temporary rule effective 1-01-22 and 5-01-22. Each has "$90" in (1)(b), and 1-01-20 is the earliest. The 2014 date I gave was 0250(4)(a)'s UME allowance, a different provision.
Suggestion 2: the Texas rebate's copy of spm_unit_benefits omits or_ssp Deferred to #10226 (accepted) #10226 is open. tx_rebate.py on main still goes straight from "fl_oss" to "ks_sspp" (lines 65-66), as in the sibling PRs.
Suggestion 3: pin the remaining readings and assert the aggregates Fixed Case 27 has an unmarried community-care recipient: SSI 994, or_ssp 0. Case 28 has spouses paid as individuals: [994, 994] and [0, 0]. Integration Case 5 asserts household_state_benefits: 264.
Suggestion 4: references and citations Fixed; one-page anchors declined (accepted) Host. Every Oregon rule link uses ch461rules.odhs.oregon.gov, and no Azure links remain in the PR's files. or_ssp.py cites ORS 411.704(1)(b) and 411.706(1), 461-101-0010(17) (which makes 461-160-0070's "OSIP" proration apply) and OPEN p. 583 with # DHS 2818 (10/2026). The standard line cites 0250(3) in a comment. Declined. 0575, 0270 and 0070 are one-page PDFs, so they stay without #page=1.
Suggestion 5: stray blank lines; the body's case count Partly fixed; the rest declined (accepted) The blank lines before metadata: stay (harmless). The count was updated, but it is one short again after Case 34 (Suggestion 1 below).

New findings

Critical (must fix)

None.

Should address

1. Oregon's countable earned income counts salary-reduction health premiums that OSIPM leaves out, and it drops self-employment losses that OSIPM nets against wages.

  • Where.
    • or_ssp_countable_income.py:23-26 starts from ssi. It then adds max_(person(name, period), 0) for every name in gov.ssa.ssi.income.sources.earned and .unearned, except the excluded interest and dividends.
    • On the earned side, that means raw employment_income, self_employment_income and sstb_self_employment_income, each floored at 0.
  • What changed underneath.
  • The rule, part (a): cafeteria-plan premiums.
    • Through 9-30-26. OAR 461-145-0120 (the version effective 7-01-18): "Earned income includes all of the following: ... (5) In: ... (b) All programs except the SNAP program, cafeteria plan benefits that an employee takes as cash, and funds placed in a flexible spending account."
    • From 10-01-26. The current version: "(b) The Medicare Savings Programs ... and Oregon Supplemental Income Program Medical (OSIPM), cafeteria plan benefits that an employee takes as cash."
    • What a cafeteria plan is. 461-001-0000(11) defines it as a plan where participants choose "from a menu of two or more cash or qualified benefits". Qualified benefits are ones "the Internal Revenue Service does not consider part of an employee's gross income", including "(A) Accident and health plans".
    • So: a premium paid by salary reduction buys a qualified benefit the employee doesn't take as cash, so it isn't OSIPM earned income. That is the treatment ssi_earned_income already applies.
    • The gross rule doesn't override this. 461-140-0040(4) counts "the gross before deductions, such as garnishments, taxes, or other payroll deductions" only "Unless exclusions under another rule in chapter 461 apply". It still covers every other payroll deduction, and ssi_earned_income keeps those too.
    • The direction of the fix. New Hampshire (He-W 601.04(m)) and Oklahoma count wages before payroll deductions. Oregon follows SSI here, so the fix runs the other way: use SSI's wage count instead of the gross sources.
  • The rule, part (b): self-employment losses.
    • 461-150-0095(2) (effective 10-01-15, "OSIP, OSIPM, QMB"): "Only net losses from self-employment that are documented are divided over the taxable year in the same way as net earnings and excluded only from other earned income of the financial group".
    • 461-145-0130 has the same rule: section (4) of the 7-01-23 version and (5) since 7-06-26. It reads "documented net losses from a self-employment business (see OAR 461-150-0095) are excluded from any other source of earned income of the financial group".
    • The per-source floor throws the loss away instead. Round 1 listed this floor under Verified ("floors each source so a loss can't offset another"); that was my miss.
  • Effect: probes at this head. The household is a 40-year-old Oregon resident with an approved DISABILITY_INTERIM category, no SSI and $12,000 a year of wages; the period is 2026-01.
    • With $1,200 a year of pre-tax health premiums.
      • At the head: ssi_earned_income is 900, but or_ssp_countable_income is 1,000, so or_ssp is 0.
      • Under 0120(5)(b): 994 − 900 = 94.
    • With a $2,400 a year self-employment loss instead.
      • At the head: ssi_earned_income is 800, or_ssp_countable_income is 1,000 and or_ssp is 0.
      • Under 0095(2): 994 − 800 = 194.
    • Other paths. Every path that subtracts countable income has the same error: the couple community-care payment, the 0700(1) payments, room and board, and the nursing-facility payment.
  • Reach and severity. It needs a working recipient with pre-tax premiums or a self-employment loss, which is rare, and every category except the nursing-facility path is input-only. It is still a wrong 2026 result against the rule, so it is a should item, as in NH and OK.
  • Fix.
    • The formula. In or_ssp_countable_income, take earned income as max_(person("ssi_earned_income", period), 0) and loop only over sources.unearned. That removes the salary-reduction premium from wages and lets a loss offset earned income but not unearned income. Cases 4 and 8 don't change.
    • A NOTE citing 0120(5)(b) and 0095(2). It should also say that the offset is per person, while 0095(2) allows a loss to offset other earned income of the financial group, such as a spouse's wages.
    • Tests. Add the two probe households as cases: 94 and 194, where this head gives 0 and 0.
    • Update Missouri income tax for 2023 #1781. Add 0120(5)(b) and 0095(2) to its verbatim law and to its definition of "countable".

Suggestions

1. Update the case counts.

  • The body says "40 Oregon SSP YAML cases (33 in or_ssp.yaml, 7 in integration.yaml)".
  • Update Missouri income tax for 2023 #1781 says "or_ssp.yaml (33 cases)".
  • The head has 34 + 7 = 41. Case 34 came in 3311c3b18f, after both were written.

Verified

  • The input redesign.
    • The three new inputs default to 0:
      • or_ssp_partial_month_days: 0 means a full month, through partial_month = (days > 0) & (days < period.days);
      • or_ssp_care_liability: subtracted on the absence path only, through room_board_income = where(absence, max_(income − liability, 0), income);
      • or_ssp_inaccessible_income: subtracted from countable income, floored at 0.
    • They match the rules:
      • 0630(2)(b)(A)(iv), p. 2: "after contributing available income to the liability (see OAR 461-160-0620), to the extent one is owed";
      • 0630(4)(d), p. 3;
      • 461-140-0040(5)(e)(D), p. 4: "Income that cannot be accessed due to incapacity shall be considered unavailable for up to three months".
    • The carry-over fix.
      • Ziming's diagnosis holds: system.py sets auto_carry_over_input_variables = True, and policyengine-core carries only inputs to variables without a formula.
      • The return 0 formula stops the carry, and Case 34 pins January at 11.35 and February at 22.
    • "A yearly value applies to every month" (the documentation) holds. A probe with a yearly 16 gives January 22 × 16 / 31 = 11.35 and February 22 × 16 / 28 = 12.57.
    • The other inputs still carry. The category, liability, inaccessible-income, diversion and initial-placement inputs still carry forward, along with the category itself, so their results stay consistent.
    • No leftovers. Nothing still refers to the three removed variables.
  • State-gated keys (NH Add New Hampshire state supplementation for 2026 #10156 check).
    • No Oregon variable keys a parameter or a breakdown.
      • The only enum, or_ssp_category, isn't state-gated, defaults to NONE and is only compared.
      • The gated integer or_ssp_partial_month_days only feeds comparisons.
    • A three-state probe ran without error. One simulation held an Oregon in-home recipient, an aged Washington resident and a Montana nursing-facility resident:
      • or_ssp [22, 0, 0];
      • or_ssp_countable_for_hud [0, 0, 0];
      • household_state_benefits [264, 426, 0];
      • SNAP unearned [11,928, 12,354, 360];
      • HUD unearned [11,928, 11,928, 360].
  • New citations. Each anchor opens the cited text:
    • 0250(4)(c), pp. 1–2;
    • 461-101-0010(17), p. 3;
    • 461-140-0040(5)(e)(D), p. 4;
    • 0630(2)(b)(A)(iv), p. 2;
    • 0700(3), p. 3, cited for or_ssp_partial_month_days;
    • the 0700 history, p. 7, which is the 1-01-20 version.
  • What the main merge changes for Oregon.
  • New and changed expectations, checked by hand. The 2026 FBRs are $994 and $1,491.
    • or_ssp.yaml:
      • Cases 8 and 16: only the age changed, to 40. 994 − 100 = 894, and 994 × 14 / 28 = 497.
      • Case 15: only the input was renamed. 964 × 16 / 31 = 497.548.
      • Case 17: 31 days is the whole month, so the full 22.
      • Case 20:
        • $1,200 of Social Security gives SSI 0;
        • 1,200 − 1,118.72 = 81.28 is available;
        • 773 − 81.28 = 691.72.
      • Case 21: countable income is max(1,200 − 1,200, 0) = 0, so 773.
      • Case 27: an unmarried recipient, so no couple: SSI 994 and 0.
      • Case 28: separate units and homes, so [994, 994] and [0, 0].
      • Case 29: SSI 30 in a Medicaid facility, so 79.07 − 30 = 49.07.
      • Case 30: $1,200 of Social Security gives SSI 0, so no SSI receipt and 0.
      • Case 31: countable income is 30 + 90 = 120, above 79.07, so 0.
      • Case 32: 964 × 16 / 31 = 497.548, and the second resident gets the full 964.
      • Case 33: [691.72, 0], since 773 − 1,200 < 0 for the resident with no liability.
      • Case 34: January 22 × 16 / 31 = 11.355; February 0 days gives 22.
    • integration.yaml:
      • Case 3: person 2 doesn't take up SSI, so only one spouse counts and the result is [0, 0].
      • Case 5: 22 × 12 = 264 for household_state_benefits.
      • Case 6:
        • or_ssp_countable_for_hud [0, 5,724];
        • SNAP is 12 × (1,200 + 155.50 + 155.50) = 18,132;
        • HUD is unchanged at [16,266, 7,590].
      • Case 7: only the removed output and a comment changed; the result is still 0.
  • Wiring at the head:
    • or_ssp is in all four household_state_benefits blocks (2023–2026) and in spm_unit_benefits.py;
    • HUD counts it through or_ssp_countable_for_hud, and SNAP leaves it out, with a comment;
    • programs.yaml is partial, verified_years: "2026", and its notes now name the nursing-facility payment;
    • or_ssp is still not an SSI income source.
  • Changelog. changelog.d/or-ssp-2026.added.md is unchanged, top-level and typed added.
  • Tests.
    • In CI: Quick Feedback ran the two Oregon files at the head: 34 and 7 passed.
    • Locally: one small probe, covering Should 1, the multi-state check and the yearly input.
  • Partner tests. The PR touches none, and Household API Partners passes.

Axiom line assessment

Valid: axiom: ORS 411.704, 411.706; OAR 461-155-0250, -0270, -0575, -0630, -0700 TheAxiomFoundation/rulespec-us#1781 queued.

  • Issue state.
    • Update Missouri income tax for 2023 #1781 is open and labelled pe-parity. It is still the only rulespec-us issue for Oregon's supplement.
    • rulespec-us main (5796861e58, 2026-10-20) has no OAR 461 module: us-or/ holds only .axiom/, policies/ and statutes/. So queued is still the right form.
  • Dispatch-ready. It has:
    • module paths with corpus status, and "Needs ingest" entries for ORS 411 and OEP-PT-25-045;
    • the verbatim law for every encoded provision;
    • seven required outputs;
    • companion tests A–H, derived from the rules and mapped to PE cases;
    • the interpretations that change a result;
    • a source-conflicts comment.
  • Matches the head, except for two things:
    • the or_ssp.yaml count (Suggestion 1);
    • once Should 1 is fixed, its "countable" definition needs 0120(5)(b) and 0095(2).

CI status

27 pass, 0 pending, 0 failed (run 38818622041 on head 3311c3b18f, pull_request, 2026-10-15 22:39 UTC to 2026-10-16 00:23 UTC).

  • Passed:
    • PR validation, and Package and compatibility;
    • Quick Feedback;
    • Household API Partners;
    • Microsimulation and both Rest (Python) jobs;
    • all 11 Baseline shards and all 9 Contrib shards.

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes for 1 new should item; details in the round-2 report above. All four round-1 should items are fixed: rulespec-us#1781 is queued, the descriptions are corrected, the 0250(4)(c) nursing-facility payment is $79.07, and the SNAP exclusion follows 0410(7)(c)(D). The zero-default and partial-month fixes check out, and CI is green. New Should 1: or_ssp_countable_income sums raw employment_income and floors each earned source at 0, but OSIPM follows SSI here. It excludes cafeteria-plan health premiums not taken as cash (OAR 461-145-0120(5)(b), exposed by #10046 in this round's merge), and it nets documented self-employment losses against other earned income (461-150-0095(2), which my round 1 missed). Examples: $1,200 of premiums gives 0 at head versus 94, and a $2,400 self-employment loss gives 0 versus 194. Fix: use max_(ssi_earned_income, 0) plus the unearned sources only, add two cases and a NOTE, and update #1781. Branch note: 56 behind main and conflicting in all five shared lists; keep both lines.

hua7450 and others added 3 commits October 20, 2026 16:08
OSIPM follows SSI here: salary-reduction cafeteria premiums are not wages
(OAR 461-145-0120(5)(b)) and a self-employment loss offsets other earnings
(461-150-0095(2)), so the countable income uses ssi_earned_income floored at
0. A NOTE records the 461-140-0040(4) gross rule and the financial-group
offset that is not modeled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 requested a review from DTrim99 October 21, 2026 15:56
@hua7450

hua7450 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. This round's changes are in 1dd63f0, with main merged. Each shared-list conflict keeps both lines.

Should 1, cafeteria-plan premiums and self-employment losses in countable income: fixed.

  • or_ssp_countable_income now takes earned income as max_(ssi_earned_income, 0) and loops only over SSI's unearned sources, less interest and dividends. Salary-reduction health premiums drop out (OAR 461-145-0120(5)(b)). A documented self-employment loss offsets other earned income but not unearned income (461-150-0095(2), 461-145-0130(5); OPEN p. 1026: "you do not get to reduce the unearned income").
  • New or_ssp.yaml Case 35 is your premium household: 94, where the old formula gave 0.
  • Case 36 uses OPEN Example 1 on p. 1240 instead of your $2,400 household, so the incomes are sourced: $650 of wages and a $1,000 annual loss give 427.33, where the old formula gave 344. Your household gives 194 under the fix.
  • Case 37 pins the floor: a $1,000 annual loss with only $180.42 of VA compensation leaves countable income at 180.42, so 813.58.
  • Cases 4 and 8 and every other existing expectation are unchanged.
  • Two NOTEs. The loss offset is per person, while 0095(2) applies it across the financial group, such as a spouse's wages; the body lists that under "Not modeled". And 461-140-0040(4)'s gross rule applies only "Unless exclusions under another rule in chapter 461 apply", so premiums follow 0120(5)(b).
  • The reference tuple adds 0120 (current and the 7-01-18 history), 0130 p. 2 and 0095 p. 1. 461-001-0000 now includes p. 2 for (11), and 461-140-0040 now opens at p. 2 for (4).
  • The in-home gate (SSI as the only countable income, 0575(1)(a)) now also ignores salary-reduction premiums, which follows from 0120(5)(b).
  • Encode Oregon's OSIPM special-need supplement (ORS 411.706; OAR 461-155-0250, -0270, -0575, -0630, -0700): the in-home, community care, transitional, room and board and nursing facility payments (PE-US PR 10166) TheAxiomFoundation/rulespec-us#1781 now quotes 0120(5)(b), 461-001-0000(11), 0095(2) and 0130(5), and its "countable" definition includes both rules. Companion tests I-K map to Cases 35-37. Its conflicts comment has a new entry 3 for the 0040(4) reading.

Suggestion 1, the case counts: fixed. The body and TheAxiomFoundation/rulespec-us#1781 now say 37 in or_ssp.yaml and 7 in integration.yaml.

CI: the red jobs come from one test, test_conflict_sounding_comments_do_not_grow, in Rest shard 1; the other red Rest job passes its own shard and fails only because it reports shard 1's result. The test flags main's Florida and South Dakota LIHEAP files, not this PR's. Main fixed it in #10334, so I'll merge main again after your review.

44 Oregon SSP cases pass locally (37 in or_ssp.yaml, 7 in integration.yaml).

@DTrim99

DTrim99 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 3): Add Oregon state supplementation for 2026

PR #10166 (author: hua7450). This round reviews head 1dd63f0edd; round 2 reviewed 3311c3b18f. The branch is 9 commits ahead of main and 4 behind. Three commits landed since round 2:

  • e28edfbacf, "Count Oregon SSP earnings as SSI does" (2 files, +83/−6). It does the following:
    • or_ssp_countable_income now takes earned income as max_(ssi_earned_income, 0) and loops only over SSI's unearned sources, less interest and dividends;
    • it adds two NOTEs (the 461-140-0040(4) gross rule, and the loss offset that stops at the person rather than the financial group);
    • it adds 0120 (current and the 7-01-18 history), 0130 p. 2 and 0095 p. 1 to the references, widens 461-001-0000 to pp. 1-2, 5, and moves 461-140-0040 to open at p. 2;
    • it adds or_ssp.yaml Cases 35-37.
  • 5ecd573afc, a merge of main at 07eba1aeea, with hand-resolved conflicts in five files: household_state_benefits.yaml (four year blocks), HUD unearned, SNAP unearned, programs.yaml and spm_unit_benefits.py.
  • 1dd63f0edd, a clean merge of main at 1f678c72cd. It brings in Tie source-conflict markers to the register shared with Axiom #10287 (the source-conflict guard) and the LIHEAP wave.

Summary

Ziming fixed the round-2 should item as I proposed it, and the optional suggestion too.

  • Should 1 (the wage count). Oregon's countable earned income now comes from ssi_earned_income, floored at 0.
    • Salary-reduction health premiums drop out, under OAR 461-145-0120(5)(b).
    • A documented self-employment loss offsets the person's other earned income but not unearned income, under 461-150-0095(2) and 461-145-0130(5).
    • My round-2 premium household now gets 94, where the old head gave 0 (Case 35).
    • Case 36 reproduces OPEN's own Example 1 (p. 1240): 566.67 countable and 427.33.
    • Case 37 pins the floor: a loss with only VA compensation gives 813.58.
    • My round-2 loss household gives 194 by hand under the new formula.
  • Suggestion 1 (case counts). The body and rulespec-us#1781 both say 37 in or_ssp.yaml and 7 in integration.yaml, which matches CI.

The wage lesson (NH #10156 round 3, OK #10165) is now resolved for Oregon, in the direction the rule requires.

  • Oregon administers the supplement itself. New Hampshire and Oklahoma count wages before payroll deductions, so there the fix was to stop using SSI's net figure.
  • OSIPM is the other way round. 0120(5)(b) counts only cafeteria plan benefits "that an employee takes as cash", and 461-140-0040(4)'s gross rule yields "Unless exclusions under another rule in chapter 461 apply". So SSI's wage count is the right one.
  • The model now uses it, and my hand trace of a worker with pre-tax premiums matches the rule.

Merge resolutions. All five hand-resolved files keep both sides.

  • Against the merge base, each shared list gains only Oregon's line, once.
  • No sibling line is dropped. New Jersey, Pennsylvania, Wyoming, North Carolina, Nevada, Montana, Oklahoma, New York, Rhode Island, South Dakota and Virginia are all still present.

Other checks.

  • NH Add New Hampshire state supplementation for 2026 #10156: nothing found. This round adds no variable, and the new read (ssi_earned_income) is federal and ungated.
  • Microsimulation default: Oregon's supplement is still $0 in microsimulation, because every path needs an input that the microdata don't populate. One optional suggestion is to say so in the registry notes, as Ohio now does.

Every new expectation checks by hand (3 cases, 9 outputs).

CI and branch.

Prior findings status

Finding Status Evidence
Should 1: countable earned income counted salary-reduction health premiums that OSIPM leaves out, and dropped self-employment losses that OSIPM nets against wages Fixed (as proposed) The code. or_ssp_countable_income.py:39-43 sets earned = max_(person("ssi_earned_income", period), 0) and income = person("ssi", period) + earned. It then adds max_(person(name, period), 0) for each SSI unearned source that isn't in excluded_income_sources. ssi_earned_income sums employment_income, self_employment_income and sstb_self_employment_income with no per-source floor, less min_(wages, pre_tax_health_insurance_premiums). The NOTEs at lines 28-38 quote 0120(5)(b), 0095(2)'s "only from other earned income" and 0040(4)'s "Unless exclusions under another rule in chapter 461 apply". They also record that the offset is per person, while 0095(2) reaches "other earned income of the financial group"; the body's "Not modeled" list says the same. The documentation says "Earned income excludes salary-reduction health premiums, and a reported self-employment loss offsets only the person's other earned income." The tests. Case 35 (94) is my premium household. Case 36 (427.33) uses OPEN Example 1 in place of my $2,400 loss household; that household gives 194 by hand under the new formula (below). Case 37 (813.58) pins the floor. Unchanged. The diff only appends Cases 35-37, so Cases 4 and 8 and every other expectation stay the same. CI's Quick Feedback ran 37 + 7 green on this head. #1781 quotes 0120(5)(b), 461-001-0000(11), 0095(2) and 0130(5). Its "countable" definition now includes both rules, companion tests I-K map to Cases 35-37, and conflict 3 records the 0040(4) reading.
Suggestion 1: update the case counts Fixed The body says "44 Oregon SSP YAML cases (37 in or_ssp.yaml, 7 in integration.yaml)". #1781 says "or_ssp.yaml (37 cases) and integration.yaml (7)". The head has 37 and 7 - name: entries, and CI collected 37 and 7.
Round-1 findings (four should items, five suggestions) Closed in round 2 Nothing in this round reopens them. The descriptions, the nursing-facility payment, the SNAP exclusion and the axiom line are unchanged.

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

1. Say in the registry notes that microsimulation pays no Oregon SSP (optional).

  • Why. Every path in or_ssp needs an input that the microdata don't populate:
    • or_ssp_category, which defaults to NONE, for the in-home, community-care, 0700 and room-and-board paths;
    • for the nursing-facility path, ssi_lives_in_medical_treatment_facility and ssi_medicaid_pays_majority_of_care, both boolean inputs that default to false.
      So a population run pays $0. Ziming said as much in his round-2 reply ("this path, like the category paths, only affects household calculations"), but neither the programs.yaml notes nor the body say it.
  • Precedent. Ohio (Add Ohio state supplementation for 2026 #10164) added "Care certification is an input, so microsimulation pays no RSS" to its notes in round 2.
  • Fix (optional). Add one sentence to the Oregon notes at programs.yaml:1260, such as "Categories and the facility arrangement are inputs, so microsimulation pays no Oregon SSP." Mirror it in the body's coverage limits.

Verified

  • The fix matches the OAR text. I re-read each cited rule on ODHS's site.
    • 461-145-0120, p. 1, "Effective 10-01-26": "Earned income includes all of the following: ... (5) In: ... (b) The Medicare Savings Programs (see OAR 461-001-0000) and Oregon Supplemental Income Program Medical (OSIPM), cafeteria plan benefits that an employee takes as cash."
      • The modeled payments are OSIPM payments: 0700 opens "In the Oregon Supplemental Income Program Medical (OSIPM) program", and 0575 opens "In the OSIPM program". So (5)(b) is the right paragraph. The OSIP cash program falls under (c) from 10-01-26, and (c) also counts only benefits "that an employee takes as cash".
      • Before 10-01-26, the 7-01-18 version (p. 1) reads "(b) All programs except the SNAP program, cafeteria plan benefits that an employee takes as cash, and funds placed in a flexible spending account". The premium treatment is the same all year.
    • 461-001-0000(11), p. 2: qualified benefits "are benefits other than cash that the Internal Revenue Service does not consider part of an employee's gross income", including "(A) Accident and health plans". So a premium paid by salary reduction is a benefit not taken as cash. (3) is on p. 1 and (19) "Countable" on p. 5, which matches the # PDF pages 1-2, 5 comment.
    • 461-140-0040(4), p. 2: "Unless exclusions under another rule in chapter 461 apply, the amount of income considered available is the gross before deductions, such as garnishments, taxes, or other payroll deductions including flexible spending accounts."
      • ssi_earned_income removes only salary-reduction premiums, so taxes, garnishments and other payroll deductions stay in.
      • (5)(e)(D)(i), the incapacity rule, is still on p. 4, which matches # PDF pages 2, 4.
    • 461-150-0095(2), p. 1, "OSIP, OSIPM, QMB": "Only net losses from self-employment that are documented are divided over the taxable year in the same way as net earnings and excluded only from other earned income of the financial group". The annual input divided by 12 matches "divided over the taxable year" (0095(1)).
    • 461-145-0130(5), p. 2, "Effective 7-06-26": "For Medicare Savings Programs and OSIPM, documented net losses from a self-employment business ... are excluded from any other source of earned income of the financial group".
    • OPEN (DHS 2818, 10/2026), p. 1026: "If there is no other source of earned income in the financial group, you would use $0 as the total earned income (you do not get to reduce the unearned income)." That is the floor in Case 37.
    • OPEN p. 1240, Example 1: "$1,000 / 12 = $83.33 ... $650 gross wages - $83.33 self-employment losses = $566.67 countable earned income". That is Case 36. Example 2 on the same page applies a wife's loss to her husband's receipts. That is the financial-group offset the NOTE and body list as not modeled.
    • The contrary hint is recorded. OPEN p. 309 describes "a cafeteria-style benefit" as "an amount above base earnings". That describes employer flex credits, not salary reduction. Update Missouri income tax for 2023 #1781's conflict 3 quotes it alongside 0040(4).
    • Federal floor. Oregon isn't a 209(b) state, so for OSIPM eligibility 42 CFR 435.601(d)(2) bars methodologies more restrictive than SSI's. SSI excludes these premiums (POMS SI 00820.102 C.2). Counting them would be more restrictive.
  • Worker with pre-tax premiums, traced by hand. No local run was needed: CI ran the new cases green at this head.
    • Case 35. A 40-year-old with an approved DISABILITY_INTERIM category, wages of $12,000 a year and $1,200 of pre-tax premiums, in 2026-01:
      • ssi_earned_income is (12,000 − min(12,000, 1,200)) / 12 = 900;
      • the person isn't aged, blind or disabled for SSI, so SSI is 0;
      • countable income is 0 + max(900, 0) + 0 = 900;
      • or_ssp is max(994 − 900, 0) = 94.
      • The round-2 head added raw employment_income, giving 1,000 and 0.
    • My round-2 loss household. Wages of $12,000 and a self-employment loss of $2,400 a year: ssi_earned_income is (12,000 − 2,400) / 12 = 800, so 994 − 800 = 194. The old head gave 0.
    • The in-home gate, which Ziming says now also ignores the premiums. Take a disabled SSI recipient with in-home services and $100 a month of wages, all paid as salary-reduction premiums.
      • ssi_earned_income is 0, so SSI is 994.
      • Countable income is 994, which equals SSI, so in_home holds and the payment is $22.
      • The old formula gave 1,094 ≠ 994, and $0.
      • That fits 0575(1)(a), "SSI as his or her only source of countable ... income", because under 0120(5)(b) the premium isn't earned income.
  • Every new expectation, checked by hand (2026 FBR $994; none of the three people is aged, blind or disabled, so ssi is 0 in each):
    • Case 35: countable 900, or_ssp 94 (above).
    • Case 36:
      • 7,800 / 12 = 650, and −1,000 / 12 = −83.33;
      • ssi_earned_income is 6,800 / 12 = 566.67, so countable 566.67;
      • 994 − 566.67 = 427.33.
    • Case 37:
      • ssi_earned_income is −83.33, floored to 0;
      • veterans_benefits 2,165.04 / 12 = 180.42, which is VA's 10% rate from December 2025 ($175.51 × 1.028); it is an SSI unearned source and isn't excluded;
      • countable 180.42, so 994 − 180.42 = 813.58.
  • Merge resolutions (5ecd573afc). There are five hand-resolved files. Each keeps main's sibling lines and adds Oregon's once.
    • household_state_benefits.yaml. In all four year blocks, main's ok_ssp is kept and # Oregon benefits / or_ssp follows it. In the 2024-2026 blocks, # New Jersey benefits / nj_ssp is kept after Oregon. At the head, or_ssp appears 4 times; nj_ssp, ok_ssp and the other siblings appear 4 times, as on main.
    • HUD annual_income/sources/unearned.yaml. nj_ssp through va_ag are kept, and or_ssp_countable_for_hud follows va_ag, once (line 33).
    • SNAP income/sources/unearned.yaml. wy_ssp is kept, and Oregon's "Not listed" comment follows it. or_ssp stays off the list.
    • programs.yaml. Main's New Jersey through Virginia entries are kept, and Oregon follows Virginia, once (line 1260). The registry tests pass in CI (319 passed, 10 skipped).
    • spm_unit_benefits.py. "nj_ssp" through "va_ag" are kept, and "or_ssp" follows "va_ag", once (line 35).
    • Overall. Against the merge base 1f678c72cd, all 22 changed files show additions only (+1,152/−0). Each sibling's count in each shared list matches main, including nc_sa, nc_sa_countable_for_hud and nv_oss. The second merge, 1dd63f0edd, had no hand-resolved files.
  • The NH Add New Hampshire state supplementation for 2026 #10156 check: nothing found.
    • This round adds no variable. The new read, ssi_earned_income, is a federal person variable with no defined_for.
    • As in round 2: the only enum, or_ssp_category, isn't state-gated, defaults to NONE and is only compared. The gated integer or_ssp_partial_month_days only feeds comparisons. Parameters are read by attribute, and nothing keys a parameter or breakdown by a variable.
  • Microsimulation (the default rule for population effects).
    • or_ssp stays $0 in microsimulation. The category defaults to NONE, and the facility arrangement needs two boolean inputs that default to false.
    • The new formula reads the cached ssi_earned_income in place of three earned sources, so it adds no cost.
    • The documentation gap is Suggestion 1.
  • What the merges bring in for Oregon. military_retirement_income (Wire military retirement pay and survivors into federal and state tax (#10181) #10182) and total_unemployment_compensation (Integrate modeled state unemployment insurance into income flows #9558) reach Oregon's countable income through the SSI unearned list. The 2027 COLA (Update Social Security and SSI parameters for the 2027 COLA #10225) doesn't touch 2026. No Oregon expectation changes, and the Integrate modeled state unemployment insurance into income flows #9558 reader guard passes in CI.
  • The source-conflict guard (Tie source-conflict markers to the register shared with Axiom #10287). The head contains Tie source-conflict markers to the register shared with Axiom #10287. CI's guard run on this head lists no Oregon file, so the new NOTEs and the parameter NOTE add nothing to the ratchet. The merged tree adds nothing either.
  • References. The variable's tuple follows CLAUDE.md: no titles, and # PDF pages ... comments above the multi-page hrefs. Each new anchor opens the cited text: 0120 p. 1, the 0120 history p. 1 (the 7-01-18 version), 0130 p. 2, 0095 p. 1, 461-001-0000 p. 2, and 461-140-0040 p. 2.
  • The PR body. It describes the new countable income, the health-premium reading and the not-modeled financial-group offset. Its counts match CI. Its axiom line is unchanged.
  • Unchanged since round 2 and still correct: the amounts, the nursing-facility payment, the input redesign, the SNAP exclusion and the HUD helper. The changelog fragment changelog.d/or-ssp-2026.added.md is unchanged. The PR touches no partner test files, and Household API Partners passes.
  • The Texas rebate copy. It is still deferred to Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs #10226 (open), as for the siblings.

Axiom line assessment

Valid: axiom: ORS 411.704, 411.706; OAR 461-155-0250, -0270, -0575, -0630, -0700 TheAxiomFoundation/rulespec-us#1781 queued.

  • Issue state.
    • Update Missouri income tax for 2023 #1781 is open and labelled pe-parity. It was last updated on 2026-10-21 at 04:58 UTC, after e28edfbacf.
    • rulespec-us main (5796861e58, 2026-10-20) still has no OAR 461 module: us-or/ holds only .axiom, policies and statutes. So queued is still the right form.
  • Dispatch-ready.
    • Module paths. The rule-module row now lists 461-145-0120.yaml, 461-145-0130.yaml and 461-150-0095.yaml, citing 0120(5)(b) with the 461-001-0000(11) definition, 0130(5) and 0095(2).
    • Verbatim law. It quotes 0120 (current and 7-01-18), 461-001-0000(11), 0095(2), 0130(5) (with the 7-01-23 (4)) and OPEN p. 1026.
    • Required outputs. "Countable" now says earned income leaves out salary-reduction premiums and is floored at 0.
    • Companion tests I, J and K come from the rules and OPEN, and map to Cases 35-37.
    • Interpretations and conflicts. The interpretation entry records the per-person offset (OPEN Example 2), and conflict 3 covers the 0040(4) reading.
  • Matches the head, including the 37 / 7 case counts.

CI status

25 pass, 2 fail, 0 pending (gh pr checks 10166, rechecked at the end of the review). The run is 39546252101 (pull_request) on head 1dd63f0edd; it started 2026-10-21 04:50 UTC and finished 08:41 UTC.

  • The two failures are the known main-caused ratchet failure, not a finding.
    • "Full Suite - Rest (Python, shard-1 + variables)" fails one test of 2,511: test_source_conflicts.py::test_conflict_sounding_comments_do_not_grow (1 failed, 2,499 passed, 11 skipped).
    • Its grown set lists only Florida and South Dakota LIHEAP files: fl_liheap_eligible.py, fl_liheap_income_limit.py, fl_liheap.py, fl/.../payment/base_amount.yaml and sd/.../limits/table/in_effect.yaml. No Oregon file is among them.
    • "Full Suite - Rest (Python + variables)" passes all its own tests (60, 55, 1,767 and 980). It fails only because it aggregates the shards: "Rest shards did not all succeed: shard-1=failure, shard-2=success".
    • Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334 (fec98b87c8) fixed the baseline on main at 13:24 UTC, after this run began. Merge main and re-run. Ziming says he will do that after this review.
  • Passed.
    • Quick Feedback ran both Oregon files: integration.yaml 7 passed and or_ssp.yaml 37 passed.
    • The rest. All 11 Baseline shards, all 9 Contrib shards, Microsimulation, Household API Partners, Package and compatibility, and PR validation pass.
    • Oregon-relevant tests in the Rest shards pass: the program registry (319 passed, 10 skipped), the aggregate-list integrity tests (22), the unemployment-reader guard (4) and the SSI state-supplement core tests (29).
  • Local runs: none. CI covers every touched file, and the traces above are by hand.

Branch status

Verdict: APPROVE

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 3: the wage-count item is fixed. Salary-reduction premiums now drop out under OAR 461-145-0120(5)(b), and a worker with $1,200/yr of pre-tax premiums gets $94 (it was $0). All five hand-resolved merge blocks keep every sibling's line and add Oregon's once. The two red checks are the known FL/SD LIHEAP ratchet failure from before #10334, so merge main and re-run. One optional suggestion. Full report in the comment above.

@DTrim99 DTrim99 mentioned this pull request Oct 21, 2026
6 of 7 tasks
hua7450 and others added 2 commits October 21, 2026 21:18
Each sibling SSP PR adds its line to the same unsorted lists, so the
entries now sit at different anchors and the PRs merge without conflicts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 merged commit 683d524 into main Oct 22, 2026
27 checks passed
@hua7450
hua7450 deleted the or-ssp-2026 branch October 22, 2026 05:35
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