Skip to content

Add Oklahoma state supplementation for 2026 - #10165

Open
hua7450 wants to merge 6 commits into
mainfrom
ok-ssp-2026
Open

hua7450 wants to merge 6 commits into
mainfrom
ok-ssp-2026

Conversation

@hua7450

@hua7450 hua7450 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Oklahoma's State Supplemental Payment (SSP) was missing from PolicyEngine-US. Add ok_ssp for 2026 under OAC 340:15-1-4 and 340:15-1-5, the OAC 317:35-5-42 countable income rules and OKDHS Appendix C-1 Schedule VIII. Oklahoma administers and funds the SSP itself (340:15-1-4(1)-(2)), so the payment follows the state's own budget: the standard for the case type less countable income, capped at $40 a month.

  • Standards: $1,034 for an individual and $1,571 for a couple. These are derived as FBR + $40 and couple FBR + 2 × $40 (340:15-1-4(9)(B)(i)).
    • The ineligible-spouse standard is $1,532 and the child allocation is $498.
    • Both follow the SSI cost-of-living adjustment through gov.ssa.uprating (340:15-1-4(9)(A)-(B)), so later years are projections until OKDHS publishes a new C-1.
    • The $40 cap stays flat, since (9)(A) adjusts payments to hold spending level.
  • Case types (340:15-1-5(c)):
    • Eligible couples split the remainder, and one member gets the odd dollar.
    • An individual with an ineligible spouse is tested on own income first, then on the couple's income after the children's allocation.
    • A blind or disabled minor adds deemed parental income.
  • Ineligible spouse: any spouse living together who isn't SSP-eligible. This includes an aged, blind or disabled spouse who declines SSI or is barred (317:35-5-42(k)(1), applied by 340:15-1-4(10)). The spouse's in-kind support and SSI are excluded ((l)(12), (l)(2)).
  • Countable income (317:35-5-42):
    • Each monthly source is rounded ((i)).
    • Interest and dividends are excluded ((f)(22)), as are one-third of a child's child support ((f)(11)), $500 of a blind person's earnings ((g)(5)) and pre-tax health premiums.
    • The SSI exclusions follow. SSI itself and the one-third value are added without the $20 exclusion ((f)(12), (b)(8)(A)).
    • An SSI couple's presumed maximum value counts once.
  • Who qualifies:
    • The person is, or would be, SSI-eligible by age, blindness or disability (340:15-1-5(a)), including a person ineligible for SSI only because of income ((a)(2)(A)).
    • The person isn't in a medical facility or incarcerated.
    • The person isn't barred under (b). The bars are entered through ok_ssp_is_excluded.

The SSP is added to the household and SPM benefit totals, SNAP and HUD unearned income, and Oklahoma's gross household income for Forms 538-H and 538-S (68 O.S. 2904(3), 5012; OAC 710:50-15-96(c)).

References

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

Coverage limits

The registry marks Oklahoma as partial, verified for 2026.

Not modeled:

  • essential spouses, who take the ineligible-spouse path;
  • persons whose spouse or children are in a TANF case;
  • the grandfathered institutional supplement ((a)(2)(B)).

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

Related:

Test plan

  • 39 Oklahoma SSP YAML cases (21 in ok_ssp.yaml, 18 in integration.yaml). They cover:
    • each case type, the odd-dollar split and the own-income pre-test;
    • rounding, the interest, blind earnings, child support and pre-tax premium exclusions;
    • spouses who decline SSI or are barred, and in-kind support for ineligible spouses and couples;
    • minors with deemed income, facility and incarceration bars;
    • the 2027 projection;
    • SNAP, HUD and household benefit wiring.
  • A new ok_gross_income.yaml case: an aged homeowner on SSI with gross household income 12,408 and no property tax credit.
  • After merging main: all 402 Oklahoma cases (SSP and tax) and the federal SSI suite pass locally, and the aggregate list integrity and program registry tests pass (677 passed, 10 skipped).
  • ruff format and git diff --check.
  • Changelog fragment in changelog.d/.

axiom: OAC 340:15-1-4, 340:15-1-5; OAC 317:35-5-42; OKDHS Appendix C-1 Sch. VIII TheAxiomFoundation/rulespec-us#1780 queued

hua7450 and others added 3 commits October 12, 2026 14:26
…and inputs

- Build income totals without builtin sum() over entity calls (code-health rule)
- Gate on is_ssi_eligible so parental resource deeming applies
- Count the one-third reduction value once in the couple test
- Treat only a co-resident spouse who is not aged, blind or disabled as an ineligible spouse
- Drop the TANF-unit and essential-spouse inputs; move excluded income sources to a parameter
- Registry placement and comments, SNAP reference title, shorter programs.yaml note, Appendix C-1 page locators
- Realistic households and new eligibility, couple and child-support 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 Oklahoma state supplementation for 2026

PR #10165 (author: hua7450, head e4b706d421, merge-base 2e9eea7e6e). 21 files (+959/−4), 3 commits.

Summary

The PR adds Oklahoma's State Supplemental Payment (SSP), a state-administered and state-funded supplement for aged, blind and disabled people:

  • Parameters (gov.states.ok.dhs.ssp, all dated 2026-01-01):
    • maximum_payment: $40
    • ineligible_spouse_standard: $1,532
    • child_allocation: $498
    • blind_earned_exclusion: $500
    • excluded_unearned_sources: dividends and interest
    • A new federal gov.ssa.ssi.income.exclusions.child_support_share of 1/3.
    • The individual and couple standards aren't parameters. ok_ssp.py:16-17 derives them as FBR + $40 = $1,034 and couple FBR + 2 × $40 = $1,571.
  • Variables (all Person, MONTH):
    • ok_ssp_eligible (defined_for = StateCode.OK) requires all of: is_ssi_eligible (categories, resources, immigration, no income test), not in a medical treatment facility, not incarcerated, not ok_ssp_is_excluded, and SSI take-up.
    • ok_ssp_is_excluded is an input for the 340:15-1-5(b) bars (public facility, long psychiatric stay, resource transfer, benefit pursuit, state-paid child placement).
    • ok_ssp_own_countable_income and ok_ssp_countable_income both use a private helper, _ok_ssp_income.py. The helper:
      • rounds each monthly source
      • drops interest and dividends
      • excludes 1/3 of a child's child support
      • adds deemed parental income and presumed-value in-kind support (ISM)
      • applies the student exclusion, the $500 blind exclusion and the SSI $20 / $65 + ½ exclusions
      • adds the SSI payment and, in another person's household, the one-third value
      • in combined mode, subtracts the child allocation from the ineligible spouse's income and sums the marital unit
    • ok_ssp_spouse_child_allocation is $498 per non-ABD child in the family, less the child's income.
    • ok_ssp picks the couple, ineligible-spouse or individual test, splits a couple's grant with the odd dollar to the second member, and caps each person at $40.
  • Aggregates and registry. household_state_benefits (all four year blocks), spm_unit_benefits, SNAP unearned income, HUD unearned income, and a programs.yaml entry (partial, verified_years: '2026').
  • Tests: 35 YAML cases, 20 in ok_ssp.yaml and 15 in integration.yaml.

The 2026 policy content is right:

  • Amounts. $40, $1,034, $1,532, $1,571 and $498 match OKDHS Appendix C-1, Schedule VIII.A and VIII.C. Two editions cover 2026 and both show the same amounts: 4/1/2026 (archived June 2026) and 7/1/2026. The 4/1/2025 and 7/1/2025 editions already show the $40 cap. So January–March 2026 is bracketed, and the derived standards follow the 2026 FBR.
  • Formula. It matches OAC 340:15-1-5(c):
    • couples: half the remainder each, one member getting the higher share
    • individuals
    • the two-step ineligible-spouse test
    • the child allocation, net of the children's income
    • minors with deemed parental income
  • Income rules. Countable income follows 317:35-5-42: (f)(11), (f)(12), (f)(22), (g)(3), (g)(5), (i) rounding, and the (b)(8)(A) one-third value.
  • Administration. It is state-administered (340:15-1-4(1)–(3)). Oklahoma isn't on SSA's January 2026 list of federally administered supplements, so the PR correctly doesn't use SSA rounding or the $1 floor.
  • Tests, CI and branch. All 35 expectations check by hand and pass at the head. CI is green and the branch merges cleanly with main.

Five should-fix items remain:

  1. The axiom: needed line isn't valid for a staff PR.
  2. Four parameter descriptions are off-template.
  3. Oklahoma's own gross household income for Forms 538-H and 538-S still has ok_state_supplement commented out. It doesn't count the new SSP, so an aged SSI-only homeowner keeps a $200 property tax credit they no longer qualify for.
  4. The couple test counts an ineligible spouse's presumed-value in-kind support, which 317:35-5-42(l)(12) excludes.
  5. The PR body still describes the pre-review design.

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)":
    • "Put one line in the PR body: axiom: <legal id> encoded-correct | <rulespec PR> encoded | <rulespec issue> queued | n/a: <reason>."
    • "If you are an external contributor and cannot complete the Axiom work, use axiom: needed; a maintainer will follow up." 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." None of the n/a grounds applies.
  • Nothing to point to yet.
  • 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: OAC 340:15-1-4, 340:15-1-5; OAC 317:35-5-42; OKDHS Appendix C-1 Sch. VIII TheAxiomFoundation/rulespec-us#NNNN queued. The issue needs:
    • Module paths, following the us-ok/regulations/oac/710/50/ layout proposed in rulespec-us#1637:

      • us-ok/regulations/oac/340/15/340-15-1-5.yaml for the payment computation by case type
      • us-ok/regulations/oac/340/15/340-15-1-4.yaml for "100 percent of the FBR, plus the maximum SSP amount"
      • us-ok/regulations/oac/317/35/317-35-5-42.yaml for (b)(8)(A), (f)(11), (f)(12), (f)(22), (g)(5), (i) and (l)(12)
      • us-ok/policies/okdhs/appendix-c-1/2026/schedule-viii.yaml for the amounts
    • Corpus citations, plus the blocker if a source isn't in the corpus yet.

    • Verbatim law: the passages quoted under Verified correct.

    • Required outputs (Person, monthly):

      • Money parameters: the $40 cap, the $1,532 ineligible-spouse standard and the $498 allocation.
      • A Judgment: is or would be SSI-eligible by age, blindness or disability; not barred by 340:15-1-5(b); not living in an institution.
      • Money outputs for each case type under 340:15-1-5(c)(1)–(6), each min(cap, standard − countable income) and 0 when income is equal to or above the standard. The couple remainder is split in half, with one member getting the higher share.
    • Companion tests from C-1 Schedule VIII.A and 340:15-1-5(c), not from PolicyEngine output:

      Case Countable income SSP
      SSI-only individual 994 40
      SSP-only individual 1,000 34
      Individual at the standard 1,034 0
      SSI-only couple 1,491 40 + 40
      Couple with an odd remainder 1,530 20 + 21
      Individual with ineligible spouse (own 0) couple 1,520 12
      Individual with ineligible spouse (own 1,040) — 0

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

  • Where:
    • parameters/gov/states/ok/dhs/ssp/maximum_payment.yaml:1: "Oklahoma uses this maximum payment per recipient for its State Supplemental Payment."
    • ineligible_spouse_standard.yaml:1: "Oklahoma uses this need standard for an individual with an ineligible or essential spouse for its State Supplemental Payment."
    • child_allocation.yaml:1: "Oklahoma uses this allocation for an ineligible child for its State Supplemental Payment."
    • blind_earned_exclusion.yaml:1: "Oklahoma excludes this additional amount of monthly earned income of a blind individual before the standard earned income exclusions."
  • The template: "one sentence, spell the program out fully (no acronyms), [State] [verb] ... under the [Full Program Name] program."
    • None of the four has the "under the ... program" clause.
    • excluded_unearned_sources.yaml in this PR already follows it: "Oklahoma excludes these unearned income sources from countable income under the State Supplemental Payment program."
    • So do the siblings on main. For example, ks/kdhe/sspp/payment/amount.yaml: "Kansas provides this amount as the monthly cash payment under the State Supplemental Payment Program." And ga/dhs/ssp/amount.yaml: "Georgia provides this amount as the monthly supplement under the State Supplementary Payment program."
  • Fix:
    • maximum_payment.yaml: "Oklahoma limits each recipient's monthly payment to this amount under the State Supplemental Payment program."
    • ineligible_spouse_standard.yaml: "Oklahoma sets this amount as the monthly need standard for an individual with an ineligible or essential spouse under the State Supplemental Payment program."
    • child_allocation.yaml: "Oklahoma allocates this monthly amount for each ineligible child under the State Supplemental Payment program."
    • blind_earned_exclusion.yaml: "Oklahoma excludes this amount of a blind individual's monthly earned income under the State Supplemental Payment program."
  • Acceptable as written: the federal child_support_share.yaml matches the other descriptions in its ssi/income/exclusions/ folder.

3. Oklahoma's gross household income for Forms 538-H and 538-S leaves out the new SSP. Its placeholder is still commented out.

  • Where: parameters/gov/states/ok/tax/income/credits/gross_income_sources.yaml:27-29 reads - ssi, then # - ok_state_supplement, then - general_assistance.
    • The list feeds ok_gross_income.
    • That gates ok_ptc, the Form 538-H property tax credit (ok_ptc.py:64-65, $12,000 limit). It also gates ok_stc, the Form 538-S sales tax credit (ok_stc.py:72-86).
  • The sources:
    • 2025 Form 538-H, line 10 (PDF p. 1), gives as examples of nontaxable income: "support money and public assistance (housing assistance, cash, etc.)".
    • Its instructions (PDF p. 3): "'Gross Household Income' means the amount of income of every type, regardless of the source (except for gifts) ... This includes, but is not limited to, pensions, annuities, social security, unemployment payments, veterans disability compensation, school grants or scholarships, public assistance payments".
    • The 2025 Form 538-S instructions (511 packet, PDF p. 52): "Total gross household income ... includes, but is not limited to, public assistance payments".
    • OAC 710:50-15-96(c): "the gross income of every type received by all persons occupying the same household".
    • The SSP is cash public assistance: 340:15-1-4(2), "The State of Oklahoma provides all funding for the SSP Program."
  • Why it is a finding now.
    • Before this PR the SSP wasn't modeled, so the placeholder had nothing to point at. The variable now exists, and the list was written to receive it.
    • The checklist treats this as missing wiring, the same as Add Pennsylvania state supplementation for 2026 #10167's Pennsylvania PTRR finding.
  • Probe at the head (2026): an aged SSI-only homeowner with $500 of real estate tax.
    • SSI is 11,928 and ok_ssp is 480.
    • ok_gross_income is 11,928, so ok_ptc is $200.
    • Pinning gross income at 11,928 + 480 = 12,408, above the $12,000 limit, gives ok_ptc $0. The model overstates this household's credit by $200.
    • The same household in 2025 (FBR 967) also crosses the limit: 11,604 + 480 = 12,084.
  • Fix:
    • Replace the placeholder with - ok_ssp.
    • Add a 538-H case: an aged SSI-only homeowner in 2026 with ok_gross_income 12,408 and ok_ptc 0.
    • rulespec-us#1637 encodes the same gross household income lines, so the new axiom issue can cross-reference it.

4. The couple test counts an ineligible spouse's presumed-value in-kind support.

  • Where: variables/gov/states/ok/dhs/ssp/_ok_ssp_income.py:26-30 adds ssi_in_kind_support_and_maintenance to every member's unearned income. In combined mode, :52-53 then sums the marital unit.
    • The one-third (VTR) value right below is limited to eligible members, shelter * eligible at :55-57. Its comment says it counts "once, for the individual or the eligible couple, never for an ineligible spouse."
    • The presumed-value ISM gets no such limit. ssi_pmv_applies checks only the living arrangement and the shelter flags, not SSI eligibility.
  • The law.
    • 317:35-5-42(l): "Income excluded for an ineligible spouse or parent per 20 C.F.R. § 416.1161 include: ... (12) The value of in-kind support and maintenance as described in OAC 317:35-5-42(b)(8)".
    • 340:15-1-4(10) applies 317:35-5-42 to SSP need.
    • 340:15-1-5(c)(4)(B) compares "the total countable income of the couple".
  • Probe at the head (2026-01): an aged claimant A and a 50-year-old spouse B with $700 a month of Social Security.
    • Both flagged ssi_receives_outside_shelter_support: B's ISM is 351.33, ok_ssp_countable_income is 1,862.33, and ok_ssp is [0, 0].
    • Only A flagged: ok_ssp_countable_income is 1,511 and ok_ssp is [21, 0].
    • SSI is 572.50 in both runs, so federal SSI already ignores B's ISM. Only the state test counts it.
  • Reach. The shelter flags are inputs with no formula, so microsimulation is unaffected. It hits household calculations that flag the shared shelter support on both spouses.
  • Fix:
    • In combined mode, count ISM only for eligible members, as the VTR term does. For example, compute eligible before the sums and multiply the ISM by it.
    • Add the both-flagged household to integration.yaml, asserting the same ok_ssp as the A-only run.

5. The PR body describes the pre-review design.

  • Where: the "What and why" and "Test plan" sections.
    • "Optional community SSP, including the distinct ineligible/essential spouse tests".
      • The third commit is "Drop the TANF-unit and essential-spouse inputs".
      • ok_ssp.py:20-23 says: "Essential spouses (in the case before 1974) are not modeled separately."
      • An essential spouse now runs through the ineligible-spouse path. That includes the individual-income pre-test, which 340:15-1-5(c)(3) doesn't have.
    • "Procedural exclusions and individual TANF membership require inputs". No TANF input exists any more. ok_ssp_eligible.py:17-19 says the TANF bar and spouse exceptions are "Neither ... modeled".
    • "29 source-based YAML cases passed". The PR has 35 (20 + 15).
  • Fix: match the body to the programs.yaml note: "Essential spouses, persons in a TANF case and grandfathered institutional payments are not modeled". Also give the case count as 35.

Suggestions

  1. Amounts before 2026 (deferral documented in the PR body and Oklahoma SSP 2017, 2018, 2019 #8689).
    • The deferral. The PR body says "Parameter backfilling does not establish verified historical coverage" and "historical backdating remains separate". programs.yaml claims only verified_years: '2026', and Oklahoma SSP 2017, 2018, 2019 #8689 ("Oklahoma SSP 2017, 2018, 2019") is open.

    • What Appendix C-1 shows (Schedule VIII.A and VIII.C):

      Edition Cap Individual Ineligible spouse Couple Child allocation
      2017 (OKDHS income standards page) $41 $776 $1,144 $1,185 —
      7/1/2023 (TANF State Plan, PDF p. 25) $41 $955 $1,412 $1,453 $458
      4/1/2025 and 7/1/2025 (archived) $40 $1,007 $1,491 $1,530 $484
      4/1/2026 and 7/1/2026 $40 $1,034 $1,532 $1,571 $498
    • The pattern.

      • In every edition, individual = FBR + cap and couple = couple FBR + 2 × cap. The PR's derivation reproduces them, given the right cap.
      • The ineligible-spouse standard is couple FBR + $41 in every edition, even after the cap fell to $40.
      • The cap moved from $41 to $40 between the 7/1/2023 and 4/1/2025 editions.
    • The leak. Probes at the head:

      • An SSI-only single gets 40 in 2015-01, 2018-01, 2023-07 and 2025-01. The 2017 and 2023 editions give 41.
      • Ineligible-spouse case, 2025-07, with the spouse's Social Security at $1,520 a month: countable income 1,500 and ok_ssp 32. The 7/1/2025 standard of $1,491 gives 0.
      • Ineligible-spouse case, 2023-07, spouse at $1,450 a month: ok_ssp 40. The $1,412 standard gives 0.
    • Fix:

      • Widen Oklahoma SSP 2017, 2018, 2019 #8689 to 2015–2025, and date the cap change.
      • Consider parameterizing the $41 increment over the couple FBR, so the ineligible-spouse standard follows the FBR. Otherwise, add dated values. The same goes for the child allocation, which is always FBR difference + $1.
  2. The Texas rebate reform's copy of spm_unit_benefits now omits ok_ssp.
    • Where: policyengine_us/reforms/states/tx/rebate/tx_rebate.py:45-127 redefines spm_unit_benefits nationwide with a hard-coded list. It lacks ok_ssp, and it already lacks ca_state_supplement.
    • Probe at the head: an Oklahoma aged SSI-only single in 2027.
      • spm_unit_benefits is 13,370.26 at baseline and 12,890.26 under the reform, a drop of exactly the $480 of ok_ssp.
      • spm_unit_net_income falls by the same amount.
      • household_net_income is unchanged at 14,061.26.
    • Fix: insert "ok_ssp", # Oklahoma 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. A spouse who is aged, blind or disabled but not SSP-eligible (integration Cases 5 and 6).
    • The PR's reading. 340:15-1-2 defines the ineligible-spouse case as "a spouse who is not 65 years of age and older, blind, or disabled". The PR uses that definition as the only route to the $1,532 test. An ABD spouse who declines SSI (Case 5) or is barred (Case 6) therefore leaves the claimant on the individual test.
    • The other reading.
      • 317:35-5-42(k)(1) defines the spouse whose income is deemed: "An ineligible spouse is a spouse who lives in the same household with the eligible individual and is not eligible for Supplemental Security Income (SSI)."
      • 340:15-1-4(10) applies 317:35-5-42 to SSP need.
      • Under (m)(5), Case 5's couple would be combined: 500 + 1,500 − 20 = 1,980. That is above $1,532, so 0.
    • Effect. Case 5 pays $40 to a couple with $2,000 a month of Social Security between them. If both applied, they'd get 0 (1,980 ≥ 1,571). The model's federal SSI already treats them as a joint couple (SSI 0), so the state test is the only one that ignores the spouse.
    • Why it is only a suggestion. The reading is documented (ok_ssp.py:20-23) and pinned.
    • Fix: consider deeming per 317:35-5-42(m) for an ABD spouse who isn't eligible for SSI. Or say in ok_ssp's documentation that this reading is generous by design.
    • Related, minor. The blind or disabled child path uses federal deeming, with an ineligible-child allocation of $497. C-1 Schedule VIII.C gives $498 for "Deeming income to blind or disabled minor children". The difference is $1 per ineligible sibling.
  4. The new federal child_support_share parameter is used only by Oklahoma.
    • gov.ssa.ssi.income.exclusions.child_support_share implements 20 CFR 416.1124(c)(11), "One-third of support payments made to or for you by an absent parent if you are a child". But federal SSI doesn't read it.
    • Integration Case 14's comment says so: "Federal SSI counts all child support: 994 - (400 + 263.5 - 20) = 350.5". With the exclusion, SSI would be 483.83.
    • Fix: open a follow-up issue to apply the share in ssi_unearned_income, or say in the parameter's metadata that federal SSI doesn't use it yet.
  5. Boundary and wiring tests.
    • Boundaries. No case puts combined income exactly at a standard, the "equal to or greater than the standard" denial in 340:15-1-5(c)(1)(A) and (c)(4)(B)(i). Suggested cases:
      • An ineligible spouse with $1,552 a month of Social Security: combined 1,532, so 0.
      • A couple where one member has $1,591 a month: combined 1,571, so [0, 0].
    • Wiring. Integration Case 10 asserts SNAP and HUD income but not household_state_benefits or spm_unit_benefits. Removing ok_ssp from either list would pass every test. Add household_state_benefits: 480.
  6. Polish.
    • Blank lines. The PR adds a stray blank line before metadata: in household_state_benefits.yaml (line 408) and in hud/annual_income/sources/unearned.yaml (line 33). Neither relates to Oklahoma.
    • Edition dates. The C-1 URL is overwritten every quarter. It served the 4/1/2026 edition until mid-2026 and now serves 7/1/2026. Put the edition in the reference titles, for example "Appendix C-1 (7/1/2026), Schedule VIII.A", so they stay corroborating after the next replacement.
    • Citations.
      • ok_ssp.py:16-17 derives the standards as FBR + cap. Cite 340:15-1-4(9)(B)(i): "Countable income for SSP must be less than 100 percent of the FBR, plus the maximum SSP amount."
      • 340:15-1-2 is cited only in a comment. Add it to the reference tuple next to 340:15-1-5.

Verified correct

  • Legal basis and administration.
    • 340:15-1-1(b): "The legal basis for the SSP Program is vested in Article XXV of the State of Oklahoma Constitution and Section 161 et seq. of Title 56 of the Oklahoma Statutes."
    • 340:15-1-4:
      • (1) "The SSP plan is a state-administered program in effect in all Oklahoma counties."
      • (2) "The State of Oklahoma provides all funding for the SSP Program."
      • (3) It is administered by "Oklahoma Human Services (OKDHS) Adult and Family Services".
    • POMS SI 01415.058 A (January 2026) lists California, Delaware, DC, Hawaii, Iowa, Michigan, Montana, Nevada, New Jersey, Pennsylvania, Rhode Island and Vermont. Oklahoma is absent.
    • So there is no SSA rounding and no $1 floor, and not using the shared _ssi_state_supplement helper is right.
  • Standards and cap.
    • C-1 Schedule VIII.A (7/1/2026, PDF p. 3): "State Supplemental Payment (SSP) not living in an institution. Monthly countable income must be less than the following standards. SSP amount is determined by deducting countable income from the appropriate standard, but cannot exceed $40." It lists "$1,034", "$1,532" and "$1,571 ($785 for one spouse and $786 for the other spouse)".
    • Schedule VIII.C (PDF p. 4) gives "$994 | $1,491 | $498".
    • The 4/1/2026 edition (archived June 17, 2026) prints identical rows. The 4/1/2025 and 7/1/2025 editions already show "cannot exceed $40", so January–March 2026 is covered.
    • 340:15-1-4(9)(B)(i), "less than 100 percent of the FBR, plus the maximum SSP amount", supports deriving $1,034 and $1,571 from the FBR.
  • Eligibility. 340:15-1-5:
    • (a): "eligible for a SSP when he or she is, or would be, eligible for Supplemental Security Income (SSI) because of age or disability".
    • (a)(1)(A): "having countable income, including SSI, that is less than the SSP need standard".
    • (a)(2)(A): "be ineligible for SSI based on income; but have income less than the SSP maximum". That supports Case 3, an SSP-only payment of 34.
    • The (b) bars are covered by the facility and incarceration gates and the ok_ssp_is_excluded input. The grandfathered mandatory supplement in (a)(2)(B) is documented as unmodeled.
    • The "not living in an institution" heading in VIII.A supports excluding medical facility residents (Cases 18, 20 and 13).
  • Payment by case type (340:15-1-5(c)):
    • "The maximum payment must not exceed the maximum payment shown on OKDHS Appendix C-1, Schedule VIII.A. for an individual." That is min_(payment, p.maximum_payment).
    • (c)(1)(B): "The SSP for each member of the couple is one-half of the remainder. When the SSP cannot be divided equally, one member of the couple receives a higher SSP". That is the floor split (Case 2: [20, 21]).
    • (c)(4): first "comparing the total countable income of the individual with the SSP standard for the eligible individual", then "the total countable income of the couple with the SSP standard for an eligible individual with an essential or ineligible spouse". That is own_test and combined (Cases 3 and 4).
    • (c)(5)(iii): "deducts the child(ren)'s allocation, minus the child(ren)'s income, from the spouse's income". (v): "The dependent child(ren)'s income is never deemed to the adult." That is ok_ssp_spouse_child_allocation, applied to unearned income first (Cases 7, 8 and 15).
    • (c)(6): "adding the child's income to the amount deemed from the child's parents". That is the deemed-income term (Cases 12, 14 and 11).
  • Countable income (317:35-5-42):
    • (i): "Once the monthly amount of each income source is established, cents are rounded to the nearest dollar, one (1) to forty-nine (49) cents is rounded down, and fifty (50) to ninety-nine (99) cents is rounded up." That is np.floor(x + 0.5) per source (Cases 7 and 8).
    • (f)(12): "The twenty dollars ($20) exclusion does not apply to a needs-based benefit that is totally or partially funded by the federal government". So SSI is added after the exclusions.
    • (f)(11): "One-third (1/3) of child support payments received on behalf of the minor child with disabilities" (Case 14).
    • (f)(22): "Interest and dividend income from a countable resource" (Case 9).
    • (g)(5): "The first five-hundred dollars ($500) of the monthly earnings of an individual who is blind" (Case 6). 340:15-1-2's "Countable income" definition points blind individuals to "(g)(3)(5), (9), and (10)".
    • (b)(8)(A): "one-third (1/3) of the SSI federal benefit rate ... is counted as income", and (i): "no income exclusions are applied to the reduction amount". That is the shelter term (Cases 19 and 12).
    • (i)(5): "any change in countable income does not affect ... the State Supplemental Payment (SSP) payment amount as long as the changed income amount does not cause SSI ineligibility". That is consistent with every SSI recipient getting $40: their countable income plus SSI equals the FBR.
  • Kept out of SSI income. 317:35-5-42(f)(2) excludes "Need-based assistance that is wholly funded by a State ... State need-based assistance programs include the SSP program". ok_ssp isn't in the SSI income sources, so there is no circularity. It holds only the state payment, so summing it with ssi doesn't double-count.
  • Counted for SNAP and HUD. 7 CFR 273.9(b)(2)(i) counts "other assistance programs based on need". The SNAP reference consolidation matches the batch, and so does the HUD addition.
  • Code:
    • Vectorized. Python branching happens only on parameter lists and the combined flag. Arrays use where/max_/min_/np.floor.
    • Periods. YEAR stocks use period.this_year (is_blind, is_child, is_ssi_aged_blind_disabled, takes_up_ssi_if_eligible). YEAR flows auto-divide. is_incarcerated and is_ssi_eligible are MONTH.
    • No hard-coded policy values. The 0.5 is the rounding offset, and the 2 is couple size.
    • References. C-1 #page=3 and #page=4 open VIII.A and VIII.C.
    • Callers. ok_ssp appears only in the lists this PR edits. It is missing from tx_rebate.py (Suggestion 2). It is in all four household_state_benefits year blocks (2023–2026), so the integrity guard passes.
  • Hand checks: all 35 expectations. The 2026 FBR is $994 for an individual and $1,491 for a couple.
    • ok_ssp.yaml:
      • Case 1: 1,034 − 994 = 40.
      • Case 2: $20 of Social Security is absorbed by the exclusion, so SSI is 994 and the SSP 40.
      • Case 3: 12,240 / 12 = 1,020; 1,020 − 20 = 1,000 is above 994, so SSI is 0; 1,034 − 1,000 = 34.
      • Case 4: 12,648 / 12 = 1,054; 1,054 − 20 = 1,034 isn't below the standard, so 0.
      • Case 5: 30,000 / 12 = 2,500; (2,500 − 85) / 2 = 1,207.50, so 0.
      • Case 6: (2,500 − 500 − 85) / 2 = 957.50, and SSI is 0; min(76.50, 40) = 40.
      • Cases 7 and 8: 1,020.49 rounds to 1,020, giving 34; 1,020.50 rounds to 1,021, giving 1,001 and 33.
      • Case 9: $100 of interest is excluded, so 34.
      • Cases 10 and 11: resources of 2,000 give 40; 2,001 give 0.
      • Case 12: (1,256.67 − 85) / 2 = 585.83 is below the 994 parent allocation, so nothing is deemed and the child gets [0, 40].
      • Cases 13–17: Texas, age 40, no take-up, incarceration and the exclusion input each give 0.
      • Cases 18 and 20: a facility gives 0.
      • Case 19: 662.67 + 331.33 = 994, so 40.
    • integration.yaml:
      • Case 1: 745.50 × 2 = 1,491; 1,571 − 1,491 = 80, so [40, 40].
      • Case 2: 1,550 − 20 = 1,530, and SSI is 0; 41 splits as [20, 21].
      • Case 3: the spouse's 1,540 − 20 = 1,520, and SSI is 0; own income is 0; 1,532 − 1,520 = 12.
      • Case 4: own 1,060 − 20 = 1,040 is at least 1,034, so [0, 0].
      • Cases 5 and 6: own 500 − 20 = 480, so 40 (the reading in Suggestion 3).
      • Case 7: (3,467 − 498 − 85) / 2 = 1,442; plus SSI of 48.67 gives 1,490.67; 41.33 caps at 40.
      • Case 8: the allocation is 498 − 400 = 98; (3,467 − 98 − 85) / 2 = 1,642, at least 1,532, so 0.
      • Case 9: the spouse's 3,001 of resources exceed 3,000, so 0.
      • Case 10: 12 × 40 = 480; SNAP and HUD unearned income are 11,928 + 480 = 12,408.
      • Case 11: 9,000 − 3,000 = 6,000 deemed exceeds 2,000; the child's countable income is (1,832.50 − 1,491) − 20 = 321.50.
      • Case 12: 380 + 662.67 + 331.33 = 1,374, so 40.
      • Case 13: separate computation: SSI is 994 − 580 = 414; own is 580 + 414 = 994, so 40.
      • Case 14: deemed is (2,600 − 85) / 2 − 994 = 263.50; 266.67 + 263.50 − 20 = 510.17, plus SSI of 350.50 gives 860.67, so 40.
      • Case 15: the allocation is (498 − 300) + 498 = 696; (3,467 − 696 − 85) / 2 = 1,343, plus 147.17 gives 1,490.17, so 40.
  • Changelog: changelog.d/ok-ssp-2026.added.md is top-level, typed added, and accurate.
  • Registry:
    • The programs.yaml entry sits under ssi_state_supplement.state_implementations, after WA, with the WA/MO fields.
    • partial fits the unmodeled essential-spouse, TANF and grandfathered paths.
    • parameter_prefix resolves.

Batch checks

  1. Axiom line: SHOULD (Should 1). axiom: needed is invalid for a staff PR. rulespec-us has no Oklahoma SSP module or issue, so a dispatch-ready pe-parity issue and a queued line are needed.
  2. Parameter descriptions: SHOULD (Should 2). maximum_payment.yaml, ineligible_spouse_standard.yaml, child_allocation.yaml and blind_earned_exclusion.yaml are off-template. excluded_unearned_sources.yaml and the federal child_support_share.yaml are fine.
  3. Backdating: SUGGESTION (Suggestion 1).
    • 2026 is right in every quarter.
    • The $40 cap leaks into years when C-1 shows $41 (2017 through at least 7/1/2023).
    • The $1,532 ineligible-spouse standard leaks over $1,491 (2025) and $1,412 (2023).
    • $498 leaks over $484 / $458.
    • The PR documents the deferral, and Oklahoma SSP 2017, 2018, 2019 #8689 is open.
  4. tx_rebate.py copy: SUGGESTION (Suggestion 2). It omits ok_ssp, cutting spm_unit_benefits by $480 in 2027. ca_state_supplement is still missing too.
  5. Aggregate wiring:
    • spm_unit_benefits, all four household_state_benefits blocks, HUD unearned, SNAP unearned and programs.yaml are present, with no double count with ssi.
    • Oklahoma's own 538-H / 538-S gross household income still has ok_state_supplement commented out (Should 3, $200 property tax credit probe).
  6. Income attribution:
    • Pinned: couples combined with the odd dollar split, the two-step ineligible-spouse test, child allocations net of child income, minors with deemed parental income, one-third value once, and a spouse in a facility tested alone.
    • The ineligible spouse's presumed-value ISM is wrongly counted (Should 4).
    • The ABD-but-not-eligible spouse reading is documented but generous (Suggestion 3).
  7. Sibling conflicts (branch note):
  8. CI: all 26 checks pass on head e4b706d421, with no failing job.
  9. State law first: done.
    • Read OAC 340:15-1-1 through 1-6, OAC 317:35-5-42, and C-1 editions 2017, 7/1/2023, 4/1/2025, 7/1/2025, 4/1/2026 and 7/1/2026. Also POMS SI 01415.058 A, the 2025 Forms 538-H and 538-S, and OAC 710:50-15-96.
    • SSA's "State Assistance Programs for SSI Recipients" Oklahoma page returned HTTP 403, so administration rests on 340:15-1-4 and POMS.
    • Every 2026 amount, state administration and the January 2026 effective values check out. All 35 expectations check by hand.

Axiom line assessment

Invalid (Should 1).

CI status

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

  • The run. Run 38367918336 (pull_request, 2026-10-13 08:14 UTC) on head e4b706d421, conclusion success.
  • Main since then. In the files this PR depends on, main has changed only in Integrate modeled state unemployment insurance into income flows #9558 (the unemployment_compensation → total_unemployment_compensation rename in the shared lists and tx_rebate.py) and Add California's 2026 SSI/SSP payment standards #9709 (a California programs.yaml note). The helper loops over the SSI source list, so the rename flows through. Neither touches the lines this PR adds.
  • Local run. The two new test files at the head with policyengine-core 3.33.3: 35 passed.
  • Partner tests. The PR touches no partner test files, and the Household API Partners job passes.

Branch status

  • Position: 34 commits behind main, 3 ahead.
  • Merge: git merge-tree --write-tree PolicyEngine/main e4b706d421 is clean (tree c94bc2b5c5).
  • Sibling conflicts. The sibling SSP PRs insert lines at the same places, in household_state_benefits.yaml, hud/.../unearned.yaml, snap/.../unearned.yaml, programs.yaml and spm_unit_benefits.py.

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 policy is correct: the $40 cap, the $1,034 / $1,532 / $1,571 standards and the $498 allocation match OKDHS Appendix C-1 Sch. VIII, the formula follows OAC 340:15-1-5(c), and all 35 cases check by hand. Five should items (see the comment above): (1) 'axiom: needed' isn't valid for staff and rulespec-us has no OK SSP module, so file a pe-parity issue and add a queued line; (2) four descriptions are off the template; (3) OK 538-H/538-S gross income still has ok_state_supplement commented out (an aged SSI-only homeowner keeps a $200 credit they'd lose once the SSP counts); (4) the couple test counts an ineligible spouse's PMV in-kind support, which 317:35-5-42(l)(12) excludes; (5) the PR body describes handling the last commit removed, and the case count is out of date.

hua7450 and others added 3 commits October 15, 2026 16:05
- Count Oklahoma SSP in gross household income for Forms 538-H and 538-S.
- Exclude an ineligible spouse's in-kind support and SSI from the couple
  test, and count an SSI couple's presumed maximum value once.
- Treat any spouse living together who is not SSP-eligible as an
  ineligible spouse (OAC 317:35-5-42(k)(1)).
- Uprate the ineligible-spouse standard and child allocation with the SSI
  cost-of-living adjustment (OAC 340:15-1-4(9)).
- Update descriptions, references and documentation, and add tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mirror main's ssi_earned_income exclusion (POMS SI 00820.102) in the
per-source rounding loop.

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 50bb3a7, followed by a merge of main (6fcf729) and 8d2de3b.

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

  • your module paths;
  • the verbatim OAC 340:15, 317:35-5-42 and C-1 text;
  • the required outputs;
  • your seven companion cases mapped to the PE cases.

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

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

Should 3 (538-H / 538-S): replaced the placeholder with - ok_ssp.

  • 68 O.S. 2904(3) and 5012 count "public assistance payments", as does OAC 710:50-15-96(c).
  • The 538-H reference title now cites line 10.
  • A new ok_gross_income.yaml case pins your homeowner: gross income 12,408 and ok_ptc 0.
  • I traced ok_ssp's dependencies; it reads no Oklahoma tax variable, so there's no cycle.

Should 4 (spouse's in-kind support): in the couple test, ISM now counts only for SSP-eligible members ((l)(12)).

  • Integration Case 16 is your household with both spouses flagged: ok_ssp [21, 0], the same as the A-only run.
  • A probe also showed the opposite problem for an eligible couple. ssi_pmv_amount gives each spouse the whole couple PMV (517), which federal SSI counts once, but the state test summed it twice: [0, 0] instead of [40, 40]. ISM is now halved under an SSI couple computation; Case 17 pins [40, 40].
  • The same branch now leaves out an ineligible spouse's own SSI ((l)(2)), which can be nonzero now that a barred aged, blind or disabled spouse counts as ineligible (Suggestion 3).

Should 5 (PR body): rewritten.

  • The essential-spouse, TANF-input and override claims are gone.
  • The coverage limits match programs.yaml.
  • The case count is updated, and the C-1 reference spans pages 3-4.

Suggestion 1 (history): history stays out of scope, and I didn't widen #8689. Your table did show a problem going forward, though.

  • The frozen $1,532 falls below the projected 2027 couple FBR (about 1,532.75). Every ineligible-spouse case where SSI is partial would pay 0 from January 2027.
  • ineligible_spouse_standard and child_allocation now uprate with gov.ssa.uprating, rounded to the dollar. This cites 340:15-1-4(9)(A)-(B): SSP standards "are based on the federal benefit rates" and pass along the SSI COLA.
  • The $40 cap stays flat, since (9)(A) adjusts payments to hold spending.
  • Integration Case 18 pins the Case 3 household in 2027 at [40, 0].
  • I didn't encode the "+$41" pattern, which no rule states. The 1/1/2025 C-1 also breaks it ($1,492 = 1,450 + 42).

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 (aged, blind or disabled spouse who isn't eligible): adopted the 317:35-5-42(k)(1) reading. Any spouse living together who isn't SSP-eligible is an ineligible spouse.

  • 340:15-1-2's narrower definition is silent on this spouse, and 340:15-1-4(10) applies 317:35-5-42, as SSI deeming does. A NOTE in ok_ssp.py records the choice.
  • Cases 5 and 6 are now [0, 0] (couple income 1,980 ≥ 1,532).
  • ok_ssp_is_excluded's documentation now says to set the facility or incarceration input for a spouse who lives away.
  • Child allocation ($497 vs $498): kept as a documented limitation. The child path reuses federal parental deeming, where the allocation is computed inline. The difference is at most $1 per sibling.

Suggestion 4 (child_support_share): opened #10242 to apply 416.1124(c)(11) in federal SSI. It applies on the eligible child's path only, since POMS SI 00830.420 says the exclusion "does not apply when determining the income of ineligible children in a deeming computation". The YAML stays byte-identical with Iowa's copy in #8017, and the helper comment links the issue.

Suggestion 5 (tests):

  • Integration Case 10 now asserts household_state_benefits: 480.
  • I didn't add the two at-standard cases. We avoid incomes set to land exactly on a threshold, and ok_ssp.yaml Case 4 already puts countable income at exactly 1,034.

Suggestion 6 (polish):

  • I kept the blank lines before metadata:. They come from our formatting pass and are harmless.
  • The C-1 titles name the 7/1/2026 edition.
  • ok_ssp.py cites 340:15-1-5, -4, -2 and 317:35-5-42, with a comment quoting (9)(B)(i) on the derived standards.

Other fixes:

  • Override advice removed. ok_ssp_spouse_child_allocation and the countable income variables are formulas. Entering one for one person resets everyone else in the simulation to 0, so the "override" advice is gone from the documentation and the body.
  • Pre-tax health premiums. After the merge, ssi_earned_income leaves pre-tax health premiums out of wages (POMS SI 00820.102). The Oklahoma per-source rounding loop now does the same; ok_ssp.yaml Case 21 pins it.
  • Minor's income limit. I found one more conflict. 340:15-1-4(9)(B)(iii) and C-1 VIII.C say a minor's countable income "must be less than" the FBR, while 340:15-1-5(c)(6) tests it against the $1,034 SSP standard. The model follows (c)(6), the payment procedure, and records it in a NOTE and in the conflict comment.
  • Federal deeming. Federal spousal deeming applies the $20 exclusion twice when the eligible spouse has ISM, and runs a couple computation for an aged spouse who isn't eligible. Both are in Fix SSI spousal deeming for in-kind support and for aged, blind or disabled spouses who are not eligible #10243. Case 16's 21 reflects the first.

On the merged head, these pass locally: all 402 Oklahoma cases (SSP and tax), the federal SSI suite, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).

@hua7450
hua7450 requested a review from DTrim99 October 15, 2026 20:11
@DTrim99

DTrim99 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator

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

PR #10165 (author: hua7450). This round reviews head 8d2de3b22f; round 1 reviewed e4b706d421. Three commits landed in between:

  • 50bb3a7d94, the review-response commit. It does the following:
    • counts ok_ssp in Oklahoma's gross household income for Forms 538-H and 538-S;
    • drops an ineligible spouse's in-kind support and SSI from the couple test, and counts an SSI couple's presumed maximum value once;
    • treats any spouse living together who isn't SSP-eligible as an ineligible spouse (317:35-5-42(k)(1));
    • uprates the ineligible-spouse standard and the child allocation with the SSI COLA;
    • rewrites the four descriptions, the references and the documentation, and adds four cases.
  • A merge of main at 6fcf7290ab. Its tree (08cde96b95) is identical to an automatic merge, so it has no hand edits.
  • 8d2de3b22f, "Exclude pre-tax health premiums from Oklahoma SSP wages". It mirrors main's Document disjoint health premium inputs and correct consumer treatment #10046 change to ssi_earned_income in the state's per-source wage loop and adds ok_ssp.yaml Case 21.

Summary

Ziming fixed all five round-1 should items. The axiom line now points to rulespec-us#1780, which is open, labelled pe-parity, dispatch-ready and consistent with the head except on the pre-tax premium. He acted on every suggestion: he fixed most of them, deferred two to new issues (#10226, #10242) and declined the history and two small points with reasons. The New Hampshire bug pattern doesn't occur: mixed-state simulations match single-state ones. All 39 SSP cases and the touched Oklahoma tax files pass locally and in Quick Feedback.

One new should item comes from the last commit. Excluding pre-tax health premiums from wages is right for federal SSI (POMS SI 00820.102). But Oklahoma's own countable-income rule counts wages "before deductions, such as ... cafeteria plans are subtracted" (317:35-5-42(b)(9)(A)). So Case 21 pins $39.83 where the state rule gives $0. CI is still running: 12 pass, 5 pending and none failed.

Round-1 findings status

Finding Status Evidence
Should 1: axiom: needed isn't valid for a staff PR that adds a program Fixed The PR body now ends axiom: OAC 340:15-1-4, 340:15-1-5; OAC 317:35-5-42; OKDHS Appendix C-1 Sch. VIII TheAxiomFoundation/rulespec-us#1780 queued. #1780 is open, labelled pe-parity and dispatch-ready. See the Axiom line assessment. It needs one addition under new Should 1, and Suggestion 1 adds (l)(2).
Should 2: four parameter descriptions are off-template Fixed All four use round 1's sentences, ending "under the State Supplemental Payment program": maximum_payment.yaml, ineligible_spouse_standard.yaml, child_allocation.yaml and blind_earned_exclusion.yaml.
Should 3: 538-H / 538-S gross household income left out the SSP Fixed The list. gross_income_sources.yaml:28 replaces # - ok_state_supplement with - ok_ssp, and the 538-H reference title now cites line 10 (public assistance). The test. A new ok_gross_income.yaml case pins round 1's probe: ok_ssp 480, ok_gross_income 12,408 and ok_ptc 0. Before the change it was 11,928 and $200. No double count. ssi is the federal payment only, and nothing else in the list contains ok_ssp. No cycle. ok_gross_income feeds only ok_ptc and ok_stc, and ok_ssp's inputs read no Oklahoma tax variable. The tests and mixed-state probes compute without a cycle error. Effect on 538-S. An SSI couple gets gross income 18,852 and ok_stc 80, still within the limit.
Should 4: the couple test counted an ineligible spouse's presumed-value in-kind support Fixed The code. _ok_ssp_income.py:62-68 adds ISM only for SSP-eligible members in combined mode (ism * eligible, citing (l)(12)). The test. Integration Case 16 is round 1's household with both spouses flagged, and it now gives ok_ssp [21, 0], the same as the A-only run. Two related fixes, both correct. An SSI couple's ISM is halved, because ssi_pmv_amount gives each member the whole couple PMV: Case 17 gives [40, 40], where the old code gave [0, 0]. And benefit * eligible drops an ineligible spouse's own SSI under (l)(2), which names "SSI, State Supplemental Payment (SSP), TANF" among the excluded public income-maintenance payments.
Should 5: the PR body described the pre-review design Fixed (one new inaccuracy, see new Should 1) Removed: the essential-spouse, TANF-input and override claims. Matches the registry: the coverage limits match programs.yaml. Counts: "39 Oklahoma SSP YAML cases (21 in ok_ssp.yaml, 18 in integration.yaml)" matches the 21 and 18 collected. The C-1 reference spans pages 3-4. New inaccuracy: the body now lists "pre-tax health premiums" among the 317:35-5-42 exclusions.
Suggestion 1: amounts before 2026 leak, and the standards freeze after 2026 Fixed going forward; history declined with a reason (accepted) Going forward. ineligible_spouse_standard and child_allocation uprate with gov.ssa.uprating, rounded to the dollar, citing 340:15-1-4(9)(A)-(B). This gives 1,575 and 512 in 2027 (× 326.149 / 317.265 = 1.0280). The $40 cap stays flat, with a reason. Integration Case 18 pins 2027, where a frozen $1,532 would pay 0. Declined. History is out of scope and #8689 isn't widened. The body says earlier years are "unverified historical estimates", so this is a documented deferral, as in the siblings.
Suggestion 2: the spm_unit_benefits copy in tx_rebate.py omits ok_ssp Declined with a reason (deferred to #10226) #10226 (open) proposes one shared list that reforms append to. At the head, tx_rebate.py still goes from "fl_oss" (line 65) to "ks_sspp" (line 66). This matches the sibling SSP PRs.
Suggestion 3: an aged, blind or disabled spouse who isn't eligible stayed on the individual test Fixed (adopted the (k)(1) reading) The code. ok_ssp.py:40 defines the ineligible spouse as ~eligible & ~apart, with a NOTE weighing 340:15-1-2 against (k)(1). The tests. Cases 5 and 6 are now [0, 0] (1,980 ≥ 1,532). ok_ssp_is_excluded now says to set the facility or incarceration input for an excluded spouse who lives away. Kept as a documented limitation: the child path's $497 allocation, which is in a NOTE in _ok_ssp_income.py:34-36 and in #1780 conflict 2.
Suggestion 4: the federal child_support_share is used only by Oklahoma Deferred to #10242 (accepted) #10242 (open) applies 416.1124(c)(11) to the eligible child in federal SSI. The helper comment at _ok_ssp_income.py:24-25 links it.
Suggestion 5: boundary and wiring tests Wiring fixed; boundaries declined with a reason (accepted) Integration Case 10 now asserts household_state_benefits: 480, so dropping ok_ssp from that list fails a test. Declined: the couple and ineligible-spouse at-standard cases. ok_ssp.yaml Case 4 already puts income exactly at the $1,034 standard.
Suggestion 6: polish Fixed except the blank lines (declined, accepted) Done. The C-1 titles name "(7/1/2026)". ok_ssp.py cites 340:15-1-5, -4, -2 and 317:35-5-42, and quotes (9)(B)(i) on the derived standards. Kept. The two blank lines before metadata: stay, a harmless formatting artifact accepted in every sibling.

New findings

Critical (must fix)

None.

Should address

1. The new pre-tax premium exclusion contradicts Oklahoma's own wage definition.

  • Where:

    • _ok_ssp_income.py:13-19 (commit 8d2de3b22f) subtracts pre_tax_health_insurance_premiums from employment_income before rounding each source. The comment cites only POMS SI 00820.102.
    • ok_ssp.yaml Case 21 pins it: ok_ssp_own_countable_income 994.17 and ok_ssp 39.83.
    • The PR body lists "pre-tax health premiums" among the 317:35-5-42 exclusions.
  • Federal SSI is right to exclude them.

    • POMS SI 00820.102 (Cafeteria Benefit Plans): "Amounts used to purchase qualified benefits under a cafeteria-plan with a salary-reduction agreement are not the employee's wages and are not considered income for SSI purposes". By contrast, "The amounts of voluntary payroll deductions are the employee's wages".
    • 20 CFR 416.1110(a)(1) makes SSI wages "the same ... as for the social security retirement program's earnings test", which excludes section 125 salary reductions.
    • So main's ssi_earned_income (Document disjoint health premium inputs and correct consumer treatment #10046) is right, and the ssi term in the state test should keep using it.
  • Oklahoma's rule says the opposite for the state's own count.

    • 317:35-5-42(b)(9)(A) ("Revised 09-12-22"): "Wages include the gross income earned for work performed as an employee before deductions, such as taxes, bonds, pensions, union dues, credit union payments, or cafeteria plans are subtracted."
    • 317:35-5-42(i): "The total gross amount of earned and unearned income available to the eligible individual and eligible or ineligible spouse is determined before subtracting applicable unearned and earned income exclusions per (d) through (g)". Neither (d)-(g) nor the (l) list for an ineligible spouse names salary-reduction premiums.
    • 340:15-1-4(10): "When determining need for an SSP, OKDHS considers the person's countable income and resources, per OAC 317:35-5-41 and 317:35-5-42, and federal and state law."
    • The round-1 head counted gross wages, which matches the rule. The merge of main changed only the federal SSI input. The new commit then took the premium out of the state's own wage count too.
  • Effect at the head (2026-01, probes on the extracted tree):

    Household Head Under (b)(9)(A)
    Case 21: disabled worker, $15,080 wages, $1,200 pre-tax premiums; SSI 458.17 1,157 → (1,157 − 85) / 2 = 536; 536 + 458.17 = 994.17; ok_ssp 39.83 1,256.67 → 1,257 → 586; 586 + 458.17 = 1,044.17 ≥ 1,034; 0
    Aged claimant with no income; spouse aged 63 earns $19,200 with $1,200 pre-tax premiums; SSI 783.50 combined 707.50 + 783.50 = 1,491; ok_ssp [40, 0] (1,600 − 85) / 2 = 757.50; 757.50 + 783.50 = 1,541 ≥ 1,532; [0, 0]
    • At the head the premium no longer affects the state test at all. Case 21 without the premium also gives 994.17 and 39.83, with SSI 408.17, because the rise in SSI exactly offsets the lower state wage.
    • Under (b)(9)(A), a working SSI recipient's state income is the FBR plus half the premium. So a salary-reduction premium of $80 a month or more ends the SSP.
  • Reach.

    • pre_tax_health_insurance_premiums is an uprated dataset input. It reaches household calculations, and also microsimulation wherever the dataset fills it.
    • The effect is at most $40 a month per person.
    • I rated it should, as round 1 rated Should 4, a comparable income-rule contradiction with narrow reach.
  • Fix:

    • Revert 8d2de3b22f's change to the wage loop, so the state test counts gross wages again, and add a NOTE citing (b)(9)(A). ssi keeps SSA's treatment.
    • Change Case 21 to ok_ssp_own_countable_income: 1_044.17 and ok_ssp: 0, with the arithmetic above.
    • Drop "pre-tax health premiums" from the body's countable-income bullet.
    • Optionally, extend the parental-deeming NOTE at _ok_ssp_income.py:34-36. The child path reuses federal deeming, so it inherits SSI's premium exclusion for the parents' wages as well as the $497 allocation.
    • If you'd rather keep SSA's treatment, reading 340:15-1-4(10)'s "federal and state law" as importing it, then document it. Cite (b)(9)(A) in the code NOTE, say so in the body, and add it to Add summation logic across tax unit to Part C of MO Pension/SS/SSD Deduction #1780's source conflicts with Case 21 as the pinning case. As it stands, neither the code nor Add summation logic across tax unit to Part C of MO Pension/SS/SSD Deduction #1780 mentions (b)(9)(A).

Suggestions

1. #1780 relies on (l)(2) but doesn't quote it or list it as a provision.

  • Where. Add summation logic across tax unit to Part C of MO Pension/SS/SSD Deduction #1780's "Interpretations" cite "(l)(12), (l)(2)" for the ineligible spouse's ISM and SSI. Its provision list for 317-35-5-42.yaml stops at (l)(12), and its verbatim text has no (l)(2).
  • The text. 317:35-5-42(l)(2): "Any public income-maintenance payments the ineligible spouse or parent receives and any income that was counted or excluded in figuring the amount of that payment. Per 20 C.F.R ' 416.1142, these payments include SSI, State Supplemental Payment (SSP), TANF ...".
  • Fix:
    • Add (l)(2) to the provision list and the verbatim block.
    • Optionally, note in _ok_ssp_income.py that the clause "any income that was counted or excluded in figuring the amount of that payment" isn't modeled. The model excludes only the spouse's SSI. This matters only for a spouse who is barred under 340:15-1-5(b) but still lives at home on SSI, so the case is narrow.

Verified

  • The New Hampshire bug pattern doesn't occur here.

    • The pattern. Add New Hampshire state supplementation for 2026 #10156 failed because a state-gated integer variable with a default of 0 indexed a parameter with no key 0.

    • This PR's Oklahoma variables. Only ok_ssp_eligible (bool) is gated by StateCode.OK, and ok_ssp is gated by it. None is used as a parameter or breakdown key:

      • ok_ssp_is_excluded is a bool input.
      • ok_ssp_own_countable_income, ok_ssp_countable_income and ok_ssp_spouse_child_allocation are floats with no defined_for.
      • Parameters are read by attribute (maximum_payment, ineligible_spouse_standard, child_allocation, blind_earned_exclusion). excluded_unearned_sources is only used with Python in.
      • The new code creates new arrays (amount - min_(...), unearned + ...). Nothing writes into a cached array.
    • Reproduced at the head (policyengine-core 3.32.29; each household has its own units):

      Population (2026) Result
      An Oklahoma SSI-only single with $500 of property tax, a Texas single with the same, an Oklahoma aged couple, a Massachusetts single and a California single, in one simulation ok_ssp_eligible [1, 0, 1, 1, 0, 0]. ok_ssp [40, 0, 40, 40, 0, 0] for January and [480, 0, 480, 480, 0, 0] for the year. ok_gross_income [12,408, 0, 18,852, 0, 0], ok_ptc all 0, ok_stc [40, 0, 80, 0, 0]. spm_unit_benefits [13,038, 12,702, 20,550, 15,429.84, 16,644.72] and household_net_income [13,729, 13,353, 21,932, 15,429.84, 17,294.72], each equal to its single-state simulation.
      The Oklahoma and Texas singles and the Oklahoma couple as a YAML case (monthly), and the two singles as an annual YAML case both pass: ok_ssp [40, 0, 40, 40]; ok_gross_income [12,408, 0], ok_ptc [0, 0], household_state_benefits [480, 0]
    • CI evidence. Microsimulation and all four state shards pass on this head. Rest (Python, shard-1 + variables), which holds test_every_state_with_a_claimed_spouse, is still running.

  • The 538-H / 538-S wiring (Should 3) is checked in the table above. The two forms' consumers are ok_ptc and ok_stc only.

  • The ISM changes (Should 4) follow 317:35-5-42(l): "Income excluded for an ineligible spouse or parent per 20 C.F.R. ' 416.1161 include: ... (12) The value of in-kind support and maintenance as described in OAC 317:35-5-42(b)(8)". The halving is applied only under ssi_couple_computation_applies, so a deeming case keeps POMS's 1/6 couple FBR + $10. The NOTE records that federal SSI also runs a couple computation for an aged, blind or disabled spouse who isn't eligible (Fix SSI spousal deeming for in-kind support and for aged, blind or disabled spouses who are not eligible #10243).

  • The (k)(1) ineligible-spouse reading (Suggestion 3). 317:35-5-42(k)(1): "An ineligible spouse is a spouse who lives in the same household with the eligible individual and is not eligible for Supplemental Security Income (SSI)." 340:15-1-4(10) brings it in "per OAC 317:35-5-41 and 317:35-5-42". A spouse in a facility or incarcerated is excluded (~apart), which matches the "living with" wording of 340:15-1-2.

  • The COLA uprating. 340:15-1-4(9)(A): "SSP standards are based on the mandatory 'Pass-Along Provision' of Section 1618 of the Social Security Act ... that requires states to pass along cost of living adjustments (COLA)". (9)(B): standards "are based on the federal benefit rates (FBR), per OKDHS Appendix C-1, Schedule VIII".

    • 2027 projection. 1,532 × 1.0280 = 1,574.90 → 1,575 and 498 → 511.94 → 512.
    • Against the historical pattern (couple FBR + $41, and FBR difference + $1), these are within $2 of the rounded 2027 FBRs. The next C-1 edition replaces them, as the parameter comment says.
  • Federal SSI and the pre-tax premium. The exclusion is correct for SSI (POMS SI 00820.102 C, quoted under Should 1) and wrong only for the state's own wage count.

  • New and changed expectations, checked by hand. The 2026 FBRs are $994 for an individual and $1,491 for a couple.

    • ok_ssp.yaml Case 21:
      • SSI: (15,080 − 1,200) / 12 = 1,156.67; (1,156.67 − 85) / 2 = 535.83; 994 − 535.83 = 458.17.
      • Head arithmetic: 536 + 458.17 = 994.17 and 39.83. This is internally right but contradicts (b)(9)(A) (Should 1).
    • integration.yaml:
      • Cases 5 and 6: own 500 − 20 = 480 < 1,034 passes the pre-test; combined 500 + 1,500 − 20 = 1,980 ≥ 1,532, so [0, 0].
      • Case 10: 12 × 40 = 480 in household_state_benefits; my probe gives 480 too.
      • Case 16:
      • Case 17:
        • PMV 1,491 / 3 + 20 = 517, counted once.
        • SSI (1,491 − 497) / 2 = 497 each.
        • Combined 258.50 × 2 − 20 + 994 = 1,491; (1,571 − 1,491) / 2 = 40 each.
      • Case 18 (2027):
        • Couple FBR 1,491 × 1.0280 = 1,532.75, and the individual FBR is 1,021.83.
        • The spouse's 1,540 − 20 = 1,520, so SSI is 12.75 and combined income is 1,532.75.
        • 1,575 − 1,532.75 = 42.25, capped at 40; own 12.75 < 1,061.83. So [40, 0]. At $1,532 it would be 0.
    • ok_gross_income.yaml new case: 11,928 + 480 = 12,408 > 12,000, so ok_ptc 0. At 11,928 it was min(200, 500 − 119.28) = 200.
  • The main merge. It brought in Document disjoint health premium inputs and correct consumer treatment #10046 (pre-tax premiums excluded from ssi_earned_income), Project Medicaid LTC home equity limits with CMS's rounded CPI-U increase #10162 and Stop Rest after cancellation, run Contrib after Baseline at 11 jobs, and share YAML runners by memory #10231 (CI). Through ssi, Document disjoint health premium inputs and correct consumer treatment #10046 is what makes the state's gross-wage count differ from SSI's (Should 1).

  • Wiring at the head:

    • all four household_state_benefits blocks (2023–2026);
    • SNAP unearned income;
    • HUD unearned income;
    • spm_unit_benefits.py;
    • Oklahoma's 538-H / 538-S gross income (new);
    • programs.yaml (partial, verified_years: '2026', prefix gov.states.ok.dhs.ssp).

    ok_ssp is still not an SSI income source (317:35-5-42(f)(2)).

  • Follow-up issues exist and are open: Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs #10226, Apply the SSI one-third child support exclusion for children #10242 and Fix SSI spousal deeming for in-kind support and for aged, blind or disabled spouses who are not eligible #10243 (all filed 2026-10-14/15), and Oklahoma SSP 2017, 2018, 2019 #8689.

  • Changelog: changelog.d/ok-ssp-2026.added.md is unchanged, top-level and typed added.

  • Tests:

    • Locally (policyengine-core 3.32.29), 75 of 75 pass:
      • the two SSP files (21 + 18);
      • ok_gross_income.yaml, ok_ptc.yaml, ok_stc.yaml and the two Oklahoma tax integration files (6 + 8 + 11 + 8 + 1);
      • my two-state cases (2).
    • test_aggregate_list_integrity.py and test_programs_registry.py: 677 passed and 10 skipped.
    • In CI: Quick Feedback ran the three touched test files: 18, 21 and 6 passed.

Axiom line assessment

Valid in form: axiom: OAC 340:15-1-4, 340:15-1-5; OAC 317:35-5-42; OKDHS Appendix C-1 Sch. VIII TheAxiomFoundation/rulespec-us#1780 queued.

  • Issue state.
  • Dispatch-ready on the Add AMT parameters for 2020-2023 #1467 model:
    • Module paths:
      • us-ok/regulations/oac/340/15/340-15-1-5.yaml and 340-15-1-4.yaml;
      • us-ok/regulations/oac/317/35/317-35-5-42.yaml;
      • us-ok/policies/okdhs/appendix-c-1/2026/schedule-viii.yaml.
    • Corpus citations. I confirmed all three manifests on axiom-corpus main:
      • us-ok-ssi-state-supplement.yaml (OAC 340:15 from rules.ok.gov);
      • us-ok-medicaid-eligibility-manual.yaml, which has us-ok/manual/ohca/medicaid/317-35-5-42;
      • us-ok-ssi-state-supplement-standards-manual.yaml (C-1, 7/1/2026).
    • Verbatim law. The 340:15-1-2, -1-4 and -1-5 passages, 317:35-5-42 (b)(8)(A), (f)(11), (f)(12), (f)(22), (g)(5), (i), (k)(1) and (l)(12), and C-1 Schedule VIII.A and VIII.C. I checked them against the sources.
    • Required outputs. Seven rows: the three money parameters, the derived standards, eligibility, countable income and the SSP by case type.
    • Companion tests A–G come from C-1 Schedule VIII.A and 340:15-1-5(c), not PolicyEngine output. Each maps to a PolicyEngine case by name.
    • The source-conflict comment lists four conflicts. Each names the reading the PR takes and, where one exists, the case that pins it:
      • the ineligible-spouse definition;
      • $498 against $497;
      • the PMV with an ineligible spouse;
      • the minor's income limit.
  • Matches the head:
    • the variable and parameter names, the uprating and the 21 / 18 case counts;
    • the (k)(1) reading and the ISM and SSI exclusions;
    • the 2027 projection.
  • Gaps:

CI status

12 pass, 5 pending, 0 failed (run 38799749473 on head 8d2de3b22f, pull_request, started 2026-10-15 20:10 UTC, still in progress at 20:52 UTC).

  • Passed:
    • PR validation, and Package and compatibility;
    • Quick Feedback (the three touched Oklahoma test files);
    • Household API Partners;
    • Microsimulation;
    • Baseline household, irs, ssa-usda and states-shard-1 to -4.
  • Still pending:
  • Partner tests: the PR touches none.

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 five round-1 should items are fixed. rulespec-us#1780 is open and pe-parity labelled, the descriptions are rewritten, ok_ssp is in 538-H/538-S gross income with no double count, the ineligible spouse's ISM is excluded, and the PR body is current. The NH-sibling bug doesn't occur here, and 75 of 75 tests pass. New Should 1: commit 8d2de3b excludes pre-tax health premiums from the state's own wage count. That's right for federal SSI (POMS SI 00820.102), but OAC 317:35-5-42(b)(9)(A) counts wages "before deductions, such as ... cafeteria plans are subtracted". So Case 21 gives 39.83 where the rule gives 0 (1,044.17 ≥ 1,034), and a spouse-wage household gives 40 where the rule gives 0. Fix: revert the SSP wage count to gross wages (SSI unchanged), and update Case 21 and the body. If you keep the exclusion, document it as a conflict on #1780 instead. Five CI jobs were still running when I posted, with none failing.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants