Skip to content

Add Wisconsin state supplementation for 2026 - #10173

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

hua7450 merged 11 commits into
mainfrom
wi-ssp-2026

Conversation

@hua7450

@hua7450 hua7450 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Wisconsin's state SSI supplement was missing from PolicyEngine-US. Add wi_ssp for 2026 (Wis. Stat. 49.77 and 49.775). DHS, not SSA, pays it, and a monthly payment can have three parts.

  • Regular supplement (wi_ssp_regular; DMS Operations Memo 26-12). Any federal SSI payment brings the full state rate. The rates rise 10% on May 1, 2026:

    Arrangement Through April 2026 From May 2026
    Individual $83.78 $92.16
    Eligible couple (split between the spouses) $132.05 $145.26
    Recipient with an SSI-ineligible spouse $130.43 $143.47
    Household of another $135.05 $148.56

    Incarcerated recipients and those in a medical treatment facility are excluded, unless wi_ssp_institutional_continuation is set.

  • Exceptional Expense supplement (wi_ssi_e; SSI-E Handbook). $95.99, rising to $105.59, for a recipient certified by the county (wi_ssi_e_certified). A certified couple gets $345.36, rising to $379.90, split between the spouses. There is no SSI-E in another person's household.

  • Caretaker Supplement (wi_cts; Wis. Stat. 49.775; CTS Handbook). $275 for the first eligible child of an SSI parent and $165 for each additional child.

    • The AFDC-style filing unit is built from parent IDs, with the Buening test for a non-SSI co-parent.
    • The gross and net income tests use the Area I / Area II tables by group size, with the $90 work expense, the $30 and one-third disregards, child support paid, pregnancy allowances and the $1,000 asset limit.
    • Wages count before payroll deductions, so pre-tax health premiums stay in the income tests and the care cap (45 CFR 233.20(a)(6)(iii)-(iv), 1997 edition; CTS Handbook 3.2.1.2.2). Federal SSI still excludes them (POMS SI 00820.102 C.2).
    • The dependent care deduction comes only off the group's earned income left after the other disregards (45 CFR 233.20(a)(11)(i)(D), 1997 edition).
    • SSI recipients' income and assets are disregarded.
  • W-2. wi_works_eligible now excludes a unit whose custodial parents all receive SSI, in every year (Wis. Stat. 49.145(2)(i); W-2 Manual 2.2.1). Such parents may receive the Caretaker Supplement instead.

  • Inputs. All new inputs default to 0 or false, so entering one for one person leaves other household members unchanged:

    • wi_cts_tribal_area_i, for Oneida Tribe households outside the listed Area I counties;
    • wi_cts_other_qualifying_immigration_status, for statuses the immigration enum can't represent;
    • wi_cts_other_countable_resources, for Handbook 3.2.2 assets that SSI resources omit.

The supplement is added to the household and SPM benefit totals. FoodShare counts the regular supplement and the Caretaker Supplement but not SSI-E (FoodShare Handbook 4.3.4). HUD counts all of wi_ssp except SSI-E that pays a family member for home care in the assisted unit (wi_ssi_e_for_home_care).

References

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

Coverage limits

The registry marks Wisconsin as partial, verified for 2026.

Not modeled:

  • grandfathered state-only SSI recipients (Wis. Stat. 49.77(2)(a)3), so neither is their 10% May 2026 increase to a partial state payment (Memo 26-12, p. 2);
  • Huber Law childcare releases, incapacitated-adult care costs and income outside the SSI cash-income sources.

Microsimulation approximations:

  • Without parent IDs, the family is one filing unit and one SSI parent receives the whole award. Married SSI parents who each have their own child get [440, 0] instead of the handbook's 275 each (Scenario 1).
  • Without parent IDs, parenthood comes from own_children_in_household; with neither, the payment is 0.
  • Parent IDs can't tell a step-parent from a parent. Handbook 3.1.1 excludes step-parents, so a step-parent named in a child's parent IDs makes the child ineligible.
  • Groups larger than 12 need wi_cts_large_group_net_income_limit, so they get 0 by default.

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

Related:

Test plan

  • 102 Wisconsin YAML cases (55 in wi_cts.yaml, 17 in wi_ssp.yaml, 13 in wi_ssp_countable_for_hud.yaml, 10 in integration.yaml and 7 new in wi_works_eligible.yaml). They cover:
    • each regular and SSI-E rate before and after May 2026, couples and the institutional rules;
    • the Caretaker Supplement filing unit, both Buening examples and handbook Scenarios 4, 5, 7 and 8;
    • the income and asset tests, wages with pre-tax health premiums, disregards, the care deduction cap, incarceration and the one-third input;
    • two households with an input on one only;
    • the W-2 exclusion with and without parent IDs;
    • SNAP, HUD and household benefit wiring.
  • After merging main at 1f678c7: the 95 Wisconsin SSP cases pass locally, and the aggregate list integrity and program registry tests pass (728 passed, 10 skipped).
  • ruff format and git diff --check.
  • Changelog fragments in changelog.d/.

axiom: Wis. Stat. 49.77; Wis. Stat. 49.775; Wis. Stat. 49.145(2)(i); DMS Operations Memo 26-12; CTS Handbook P-23131 TheAxiomFoundation/rulespec-us#1788 queued

hua7450 and others added 3 commits October 12, 2026 14:37
…Caretaker Supplement groups

- Pay the one-eligible-spouse rate only with an SSI-ineligible spouse
- HUD SSI-E exclusion uses the HUD disability test (plus blindness); one boolean caregiver input
- Receipt gates use (ssi > 0) | receives_ssi in SSP, CTS and W-2; drop the state-only SSI input
- CTS: one group per SSI parent, co-parent filing unit fix, paroled children eligible, no marital-unit proxy
- Remove the redundant large-group input; SSI-E not payable in household of another
- Registry placement and comments, SNAP title, HUD metadata revert, programs.yaml note, references
- Tests for each fix; realistic households

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
@DTrim99 DTrim99 mentioned this pull request Oct 13, 2026
4 tasks done
@hua7450
hua7450 requested a review from DTrim99 October 13, 2026 20:38
@DTrim99

DTrim99 commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Wisconsin state supplementation for 2026

PR #10173 (author: hua7450, head 139139fbe9, merge-base 2e9eea7e6e). 69 files (+4,658/−5), 3 commits.

Summary

Wisconsin pays its own state SSI supplement. The Department of Health Services administers it, not SSA. A monthly state SSI payment can have up to three parts: the regular supplement, the SSI Exceptional Expense supplement (SSI-E) and the Caretaker Supplement (CTS) for SSI parents' children. The PR models all three as wi_ssp and also changes Wisconsin Works (W-2) eligibility.

What the diff contains:

  • Regular supplement and SSI-E (6 parameters, 9 variables):
    • wi_ssp_eligible (Person, MONTH, defined_for = StateCode.WI) requires SSI receipt (ssi > 0 or receives_ssi). It excludes incarcerated people and people in a medical treatment facility, unless the wi_ssp_institutional_continuation input is set.
    • wi_ssp_regular pays one of these:
      • $83.78 for an individual, rising to $92.16 from May 2026
      • half of $132.05 / $145.26 to each member of an eligible couple
      • $130.43 / $143.47 to a recipient with an SSI-ineligible spouse, or $135.05 / $148.56 in another person's household
    • wi_ssi_e pays $95.99 / $105.59, or half of $345.36 / $379.90 to each spouse when both are certified. It requires the wi_ssi_e_certified input and excludes the household-of-another arrangement.
    • Two income-routing variables:
      • wi_ssp_countable_for_snap counts the regular supplement and CTS, but not SSI-E.
      • wi_ssp_countable_for_hud counts all of wi_ssp, except SSI-E that pays for family-member care in the assisted unit. That exception needs the wi_ssi_e_for_home_care input.
  • Caretaker Supplement (22 parameters, 19 variables plus the helper module _wi_cts.py):
    • Filing unit. It builds the AFDC-style standard filing unit from parent links, including the Buening test for a non-SSI co-parent.
    • Income and asset tests. It applies the gross and net tests by area and group size, with the $90 work expense, $30 and one-third disregards, the dependent care deduction, child support paid, pregnancy allowances and the $1,000 asset limit.
    • Payment. It pays $275 for the first eligible child and $165 for each additional child to the caretaker parent.
    • Without parent links (as in microsimulation), it treats the family as one unit and pays one SSI parent.
  • W-2 (wi_works_eligible.py): an SPM unit is now ineligible when every custodial parent in it receives SSI.
  • Shared files: household_state_benefits (all four year blocks), spm_unit_benefits, SNAP and HUD unearned income (through the two routing variables), programs.yaml (partial, verified_years: "2026") and the changelog.
  • Tests: 91 new YAML cases:
    • wi_cts.yaml: 46 (1,875 lines, 40% of the diff)
    • wi_ssp.yaml: 17
    • wi_ssp_countable_for_hud.yaml: 13
    • integration.yaml: 10
    • wi_works_eligible.yaml: 5 added

What is right for 2026:

  • Amounts. Every regular and SSI-E amount, old and new, matches DMS Operations Memo 26-12 (p. 2), effective May 1, 2026.
    • The SSI-E state totals ($197.75 and $525.16) in the SSI-E Handbook's May 2026 rate table confirm that SSI-E is added on top of the regular supplement.
  • Caretaker Supplement amounts and limits. The $275 / $165 amounts match Wis. Stat. 49.775(4). All 72 income-limit cells match Handbook 5.2.1–5.2.5. The 20 Area I counties match 5.2.3.
  • Eligibility. The rules match Wis. Stat. 49.77 and 49.775, the CTS Handbook and the SSI Administration Handbook:
    • any federal SSI payment brings the full state rate
    • both co-resident parents must receive SSI
    • SSI children are excluded
    • the 18-year-old student rule
    • SSI people's income and assets are disregarded
    • Buening
    • one payment per child
  • The handbook's own examples reproduce. Both Buening examples (pp. 33–34) and Scenarios 1, 4, 5, 7, 8, 10 and 11 (pp. 68–75) come out as the handbook says, either through the PR's tests or my probes.
  • Benefit routing. FoodShare counts CTS but disregards SSI-E, as FoodShare Handbook 4.3.4 says.
  • W-2. The W-2 exclusion follows Wis. Stat. 49.145(2)(i).
  • Tests and CI. All 97 cases in the touched test files pass at the head, and the 45 I hand-checked add up. CI is green, and the branch merges cleanly with main.

I found no critical items. Four should-fix items remain:

  1. axiom: needed isn't valid for a staff PR. This is the same item as in the sibling reviews.
  2. 21 of the 22 Caretaker Supplement parameter descriptions are off the house template.
  3. The W-2 eligibility change isn't disclosed in the PR body or the changelog. In one probe it removes $7,836 a year of W-2 from an SSI parent.
  4. Three new branches have no test: the W-2 fallback without parent links (the path microsimulation takes), the Caretaker Supplement's incarceration exclusion for a child, and the additional one-third disregard input.

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)", requires one of 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 covers "a new program", and 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: Wis. Stat. 49.77; Wis. Stat. 49.775; DMS Operations Memo 26-12 TheAxiomFoundation/rulespec-us#NNNN queued. The issue needs:
    • Module paths, for example:
      • us-wi/statutes/49/49.77.yaml for (2)(a)2 and (3s)
      • us-wi/statutes/49/49.775.yaml for (2), (2m), (3) and (4)
      • us-wi/statutes/49/49.145.yaml for (2)(i)
      • us-wi/policies/dhs/dms-operations-memo-26-12/state-ssi-payment-levels.yaml for the May 2026 table
      • us-wi/policies/dhs/ssi-e-handbook/ for 2.1.9, 3.1.1 and 6.1
      • us-wi/policies/dhs/caretaker-supplement-handbook/ for 3.1.1–3.1.10, 3.2, 3.3.1 and the 5.2 tables
    • 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):
      • The Money parameters: the four regular rates and the two SSI-E rates, before and after May 2026; $275 / $165; the 5.2 tables; $90, $30, one-third, $175 / $200, $71 and $1,000.
      • A Judgment for the state supplement: receives federal SSI AND resides in Wisconsin AND is not incarcerated AND has not been in a nursing home past 90 days.
      • A Money output for the regular supplement by living arrangement and couple status.
      • SSI-E for a certified recipient who is not in the household-of-another arrangement.
      • A Money output for CTS: first child plus additional children, if the filing unit passes the gross, net and asset tests.
    • Companion tests from the same sources, not from PolicyEngine output:
      • SSI-only individual: 83.78 in April 2026 and 92.16 in May 2026 (memo p. 2).
      • Eligible couple, May 2026: 145.26 for the couple.
      • One spouse eligible: 143.47 living independently, 148.56 in another's household.
      • SSI-E individual: 92.16 + 105.59 = 197.75. Both spouses certified: 525.16 (SSI-E Handbook 6.1).
      • SSI-E recipient in the household of another: no SSI-E (SSI-E Handbook 3.1.1).
      • CTS with one child: 275; with three children: 605 (CTS Handbook 5.2.6).
      • Buening Example 1: 275; Example 2: 0 (CTS Handbook 3.3.1).
      • Scenario 1, married SSI parents each with their own child: 275 + 275 (CTS Handbook 5.4.1).
      • Custodial parent receiving SSI: not eligible for W-2 (Wis. Stat. 49.145(2)(i)).

2. 21 of the 22 Caretaker Supplement parameter descriptions are off the house template.

  • Where: line 1 of every file under parameters/gov/states/wi/dhs/ssp/cts/ except eligible_immigration_statuses.yaml. Examples:
    • first_child.yaml: "Wisconsin uses this amount as its Caretaker Supplement first eligible child benefit."
    • care_young_age.yaml: "Wisconsin uses this amount as its Caretaker Supplement young child care age limit." This value is an age, not an amount.
    • earned_fraction.yaml: "Wisconsin uses this amount as its Caretaker Supplement additional earned income disregard fraction." This value is a fraction.
    • student_hours_limit.yaml: "... part-time student weekly work limit." This value is a number of hours.
    • gross/area_1.yaml: "Wisconsin sets these Caretaker Supplement gross income limits for Area 1."
    • area_i_counties.yaml: "Wisconsin uses Area I Caretaker Supplement income limits in these counties."
  • The template: "one sentence, spell the program out fully (no acronyms), [State] [verb] ... under the [Full Program Name] program."
    • None of the 21 has the "under the ... program" clause.
    • The six regular and SSI-E files and eligible_immigration_statuses.yaml do. For example, amount/individual.yaml: "Wisconsin provides this amount as the individual payment under the State Supplementary Payment program."
  • Fix, using "Caretaker Supplement program" throughout. For example:
    • first_child.yaml: "Wisconsin provides this amount as the monthly payment for the first eligible child under the Caretaker Supplement program."
    • additional_child.yaml: "Wisconsin provides this amount as the monthly payment for each additional eligible child under the Caretaker Supplement program."
    • gross/area_1.yaml: "Wisconsin limits monthly gross income to these amounts by assistance group size in Area I counties under the Caretaker Supplement program." Use the same pattern for gross/area_2, gross_pregnant/* ("including one pregnancy allowance") and net/* ("net income (the assistance standard)").
    • care_young_age.yaml: "Wisconsin applies the higher dependent care deduction to children below this age under the Caretaker Supplement program."
    • earned_fraction.yaml: "Wisconsin disregards this share of remaining earned income under the Caretaker Supplement program."
    • student_hours_limit.yaml: "Wisconsin exempts a continuing part-time student's earnings when weekly work hours are below this number under the Caretaker Supplement program."
    • area_i_counties.yaml: "Wisconsin applies the Area I income limits in these counties under the Caretaker Supplement program."
    • The remaining files follow the same pattern.

3. The W-2 eligibility change isn't disclosed in the PR body or the changelog.

  • Where:
    • variables/gov/states/wi/dcf/works/eligibility/wi_works_eligible.py:27-56 adds ~all_custodial_parents_on_ssi to W-2 eligibility for every year.
    • The PR body's "What and why" describes only the state supplement. changelog.d/wi-ssp-2026.added.md mentions only the Caretaker Supplement and the state supplement.
  • The change is right in law, but it moves W-2 results.
    • Wis. Stat. 49.145(2)(i) makes an individual eligible for a W-2 position only if "The individual is not receiving supplemental security income under 42 USC 1381 to 1383c or state supplemental payments under s. 49.77".
    • W-2 Manual 2.2.1 says "Not receive SSI or state supplemental payments."
  • Probe (2026; disabled SSI parent aged 30 with a 3-year-old, with and without parent links):
    • At the merge-base, wi_works is 7,836, paid on top of SSI of 11,928.
    • At the head, wi_works is 0 and wi_cts is 3,300.
    • Reviewers and users of W-2 results should know this ships with the PR.
  • Fix:
    • Add a bullet to the PR body.
    • Add a sentence to the changelog, such as "Exclude custodial parents who receive SSI from Wisconsin Works under Wis. Stat. 49.145(2)(i)." It could go in a separate .fixed.md fragment.

4. Three new branches have no test.

  • Where:
    • The W-2 fallback. wi_works_eligible.py:39-44 falls back to is_parent when the household has no parent ids. That is the path microsimulation takes. The five new W-2 cases all set person_id and parent_1_id, and none of the six existing cases has an SSI recipient.
    • Child incarceration. wi_cts_child_eligible.py:30 excludes an incarcerated child (~is_incarcerated). No case sets it for a child; Case 13 of wi_ssp.yaml covers only an incarcerated recipient.
    • The one-third disregard input. In wi_cts_net_income.py:32-36, wi_cts_additional_fraction_disregard drives both the $30 and the one-third disregard. No case sets it. Case 20 reaches the one-third branch only through wi_cts_received_recently.
  • Why it matters. Each is a separate branch of new logic, and removing any of them would pass the suite.
  • Probes at the head (2026-01):
    • W-2 without links. SSI parent and child, own_children_in_household: 1: wi_works_eligible false. The same household without SSI: true.
    • Child incarceration. A 16-year-old child of an SSI parent with is_incarcerated: wi_cts_child_eligible false and wi_cts 0.
    • One-third input. An 18-year-old senior with $7,540 of wages and the fraction input, plus a 14-year-old sibling: net income is (628.33 − 90 − 30) × 2/3 = 338.89, and wi_cts is 440.
  • Fix: add these three cases to wi_works_eligible.yaml and wi_cts.yaml.

Suggestions

  1. Caretaker Supplement amounts before July 2023 (the PR body disclaims historical coverage).
    • The leak. cts/first_child.yaml:3 and cts/additional_child.yaml:3 have only 2026-01-01: 275 and 165, so both carry back to 2015.
      • Probe at the head: one child gives wi_cts 275 in 2015-01, 2020-01 and 2023-06; two children give 440.
    • The law before July 2023.
      • CTS Handbook 1.1, p. 6: "1999 Wisconsin Act 9 increased the benefit to $250 per month for the first eligible child and $150 per month for each subsequent eligible child. This change was effective in November 1999. 2023 Wisconsin Act 19 increased the benefit to $275 per month for the first eligible child and $165 per month for each subsequent eligible child. This change was effective in July 2023."
      • The SSI-E Handbook rate table, p. 29 dates the new amounts "Effective July 1, 2023".
      • So the model overstates by $25 for the first child and $15 for each additional child from 2015 to June 2023.
    • Fix:
      • first_child.yaml: 1999-11-01: 250 and 2023-07-01: 275.
      • additional_child.yaml: 1999-11-01: 150 and 2023-07-01: 165.
      • Add the Handbook 1.1 reference to both files.
    • The regular and SSI-E amounts need no change. They are right back to at least 2011. The memo says Wisconsin's state supplementary payments "had previously been unchanged since 1994", and the 2011 table in SSI Administration Handbook 4.1.7 shows the same $83.78 / $132.05 / $130.43 / $135.05, with SSI-E state totals of $179.77 / $477.41. So backdating them gives correct values.
  2. The Texas rebate reform's copy of spm_unit_benefits now omits wi_ssp.
    • Where: policyengine_us/reforms/states/tx/rebate/tx_rebate.py:53-122 redefines spm_unit_benefits with a hard-coded list. It already lacks ca_state_supplement, and after this PR it also lacks wi_ssp.
    • Probe at the head: a Wisconsin aged SSI-only single in 2027 has spm_unit_benefits of 13,807.18 at baseline and 12,701.26 under the reform. The drop is exactly the $1,105.92 wi_ssp (12 × 92.16).
    • Fix: insert "wi_ssp", # Wisconsin 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. The dependent care deduction applies against unearned income and when no one works.
    • What the code does. cts_financial_test subtracts wi_cts_dependent_care_deduction from each member's total net income. The deduction comes from pre_subsidy_childcare_expenses and doesn't require any earnings in the group.
    • The handbook. Handbook 3.2.1.2.3, p. 31 lists "Dependent care deduction of $200 per month for each child under the age of 2 and $175 per month for each incapacitated adult and each child age 2 or older" without saying what it comes off.
    • The AFDC rule the program inherits.
      • Wis. Stat. 49.775(2)(c) ties eligibility to the AFDC criteria.
      • Under that AFDC rule, the care disregard came from earnings: 45 CFR 233.20(a)(11)(i) (10-1-97 edition), p. 97. It reads "the State must disregard from the monthly earned income ... of each individual whose needs are included in the eligibility determination: ... (D) An amount equal to the actual cost for the care of each dependent child ... not to exceed $175 ... and not to exceed $200 for each dependent child who is under age two."
    • Fix: cap the group's care deduction at its earned income remaining after the other disregards. Or state the PR's reading in the variable documentation and pin a case with care costs and only unearned income.
  4. Write down the microsimulation approximations.
    • One payee per family. Without parent links, one SSI parent per family receives the whole award. Probe of Scenario 1 (married SSI parents, each with their own child), unlinked: wi_cts is [440, 0], but the handbook (p. 68) says "There will be two CTS supplements in the amount of $275 each". With links the PR gives [275, 275].
    • Parenthood comes from one input. The unlinked path depends on own_children_in_household. Without it (the YAML default), is_parent is false and the payment is 0.
    • Large groups. Groups larger than 12 need the wi_cts_large_group_net_income_limit input, so they get 0 by default.
    • Fix: list these in the programs.yaml notes, next to the grandfathered state-only recipients the notes already mention.
  5. Polish.
    • Blank lines. The PR adds a stray blank line before metadata: in household_state_benefits.yaml (line 412) and in hud/annual_income/sources/unearned.yaml (line 34). Neither relates to Wisconsin.
    • Case count. The PR body says "76 source-based YAML cases". The PR adds 91 (46 + 17 + 13 + 10 + 5).
    • defined_for. wi_ssp_countable_for_snap is a SNAP list member with no defined_for. It doesn't leak, because both components are Wisconsin-gated, but defined_for = StateCode.WI matches wi_ssp_countable_for_hud.
    • Consistency:
      • wi_ssi_e.py compares against arrangement.possible_values.ANOTHER_PERSONS_HOUSEHOLD, while wi_ssp_regular.py imports SSIFederalLivingArrangement. Pick one.
      • The bracket labels say "Area 1" and "Area 2" where the handbook says Area I and Area II.
    • PR body. The sentence beginning "The continuing April 2026 award receives ..." concerns only grandfathered state-only recipients, whom the PR doesn't model. Say that, or drop it.

Verified correct

  • Statutes:
    • Wis. Stat. 49.77(2)(a)2 entitles "Any needy person or couple residing in this state and receiving benefits under federal Title XVI".
    • (3s)(a) authorizes "an increased state supplement ... if the person needs at least 40 hours per month of supportive home care, daily living skills training or community support services". This is SSI-E.
  • Amounts and administration. DMS Operations Memo 26-12, "EFFECTIVE DATE May 1, 2026":
    • The table (p. 2): "Eligible individual $83.78 $92.16 / Eligible couple $132.05 $145.26 / Couple/one spouse eligible $130.43 $143.47". The household-of-another rows are the same except "Couple/one spouse eligible $135.05 $148.56". SSI-E: "Eligible individual $95.99 $105.59 / Eligible couple $345.36 $379.90". All 12 parameter values match.
    • Policy (p. 2): "Everyone who qualifies for federal SSI payments of any amount automatically gets the maximum state payment." That supports the flat payment with no income reduction (wi_ssp.yaml Case 7: SSI of 27.30 still gets 92.16).
    • No COLA (p. 2): "state supplementary payments are not subject to annual cost-of-living adjustments (COLA)". So freezing the amounts after May 2026 is right (2027 probe: 92.16 a month).
    • State administration. Wisconsin isn't on SSA's POMS SI 01415.058 A list of federally administered supplements for January 2026. CTS Handbook 1.1, p. 7: "DHS contracts with several data processing firms ... to process SSI payments, to which CTS benefits are added." So no SSA rounding applies.
  • Eligibility and termination. SSI Administration Handbook 2.1:
    • 2.1.1: "a person must first apply for and be found eligible to receive federal SSI".
    • 2.1.8 lists "Admission to a nursing home longer than 90 days, effective the first of the month following the 90th day after admission" and "Incarceration".
    • That matches wi_ssp_eligible and the continuation input (Cases 11–13, integration Case 9).
  • SSI-E. SSI-E Handbook (P-20679, May 2026):
    • Couples. 2.1.9, p. 10: "If both members of the couple are certified for SSI-E, the payment level is the couple rate for SSI-E" (integration Cases 4–5).
    • Household of another. 3.1.1, p. 13: "Such persons are considered in the SSI-B or SSI-D living arrangements ("household of another") and are not eligible for SSI-E" (Case 17).
    • Rate table. 6.1, p. 29: state payments of "$197.75" (individual) and "$525.16" (couple). Those equal 92.16 + 105.59 and 145.26 + 379.90, so SSI-E stacks on the regular supplement as the PR models.
  • FoodShare. FoodShare Handbook 4.3.4 counts "Caretaker Supplement (CTS) payments" and "Net Supplemental Security Income (SSI) payments". It also says "Disregard SSI-E income for FoodShare." That matches wi_ssp_countable_for_snap (integration Cases 7, 8 and 10).
  • HUD.
    • PIH 2023-27 G.11, p. 81 excludes state-authorized payments "to enable a family member who has a disability to reside in the family's assisted unit". It adds: "Both the person providing the care and the person who has the disability must be family members ... and must live in the same assisted household."
    • The PR applies that exclusion only through an opt-in input and otherwise counts SSI-E, as SSI-E Handbook 4.1.1 (p. 24) does. It counts CTS.
  • Caretaker Supplement. CTS Handbook P-23131 (Release 25-01) and Wis. Stat. 49.775:
    • Who qualifies:
      • 49.775(2)(b): "If the dependent child has 2 custodial parents, each custodial parent receives supplemental security income" (Case 21).
      • (2)(d): "The dependent child does not receive supplemental security income" (Case 3).
      • (3): "the department may not make more than one payment ... per month for the support of that dependent child" (Cases 22 and 35).
    • Amounts:
      • (4): "$250 per month and $25 per month for one dependent child and $150 per month and $15 per month for each additional dependent child", which is $275 / $165.
      • Handbook 5.2.6, p. 65 (Cases 1 and 2).
    • Parent's SSI receipt: 3.1.3, p. 19: "Parents in a CTS assistance group must be current recipients of SSI state supplemental benefit payments in Wisconsin". So wi_ssp_regular > 0 is the receipt test (Cases 4 and 5).
    • 18-year-olds: 3.1.10, p. 21: "Is enrolled in high school ... and Is expected to graduate high school or get a GED before turning 19" (Cases 6–8).
    • Excluded income and assets:
      • 3.2, p. 30: "Income and assets of any members of the household who receive SSI are disregarded" (Case 13).
      • 3.2.1.1, p. 30: "disregard all child support ... for the gross and net income tests" (Case 9).
    • Net test: 3.2.1.2.3, p. 31: "$90 work-related expense", "Disregard of $30 or $30 and one-third", "Child support paid to someone outside of the AG", and the four continuing-minor rules (Cases 16–20, 28, 43–46).
    • Assets: 3.2.2, p. 31: "$1,000 asset limit" (Cases 14, 15 and 30).
    • Buening: 3.3.1, pp. 33–34. Both worked examples reproduce exactly: 700 > 550, so 275 for Jill (Case 26); 500 ≤ 550 but 700 > 647, so 0 (Case 27).
    • Tables: 5.2.1–5.2.5, pp. 62–65. All 12 rows × 6 columns match, as do the "$25 per person for groups larger than 12" and "$71 for each additional pregnant woman" rules.
    • Areas: 5.2.3, p. 63 lists 20 Area I counties. All 20 enum names resolve. The Oneida and Winnebago tribal exceptions are left to the wi_cts_area_i override, and the documentation says so.
    • Scenarios: 5.4.1, pp. 68–75. Probes at the head reproduce Scenario 1 (275 + 275), Scenario 10 (the grandmother on SSI gets 275 for the minor parent, and the grandchild is outside the unit) and Scenario 11 (the minor SSI parent gets 275). A non-SSI step-parent earning $3,000 a month is kept out of the unit, so 275 (3.1.1, p. 18).
  • Immigration. Handbook 3.1.4, pp. 19–20 (permanent residents; 8 U.S.C. 1153/1157/1158/1160/1182; Cuban-Haitian entrants; PRUCOL) supports the eight listed statuses. That includes withholding of deportation, a PRUCOL category, and parole under 1182(d)(5) (Cases 24, 25 and 39).
  • W-2. Wis. Stat. 49.145(2)(i) and W-2 Manual 2.2.1, quoted in Should 3.
    • The PR keeps a non-SSI co-parent eligible (Case 9) and doesn't exclude a household for a child on SSI (Case 8). That matches "The individual is not receiving" being a condition on the applicant.
  • Kept out of SSI income. None of wi_ssp's parts is an SSI income source, so there is no circularity.
    • CTS Handbook 1.1, p. 7: "For SSI purposes, CTS benefits are viewed as part of Wisconsin's SSI state supplemental payment."
    • wi_ssp holds only state money, so summing it with ssi in the aggregates doesn't double-count.
  • Code:
    • Vectorized throughout (where, select, np.bincount, np.minimum.at, group sums). The filing-unit closure loop iterates over whole arrays until it converges.
    • No hard-coded policy values.
    • Periods are correct:
      • YEAR flows (ssi_earned_income, ssi_unearned_income, child_support_received, pre_subsidy_childcare_expenses, child_support_expense) use period, so they are divided by 12.
      • YEAR stocks and flags (age, resources, school status, is_ssi_ineligible_spouse, immigration, is_parent) use period.this_year.
    • List guard. wi_ssp carries defined_for = StateCode.WI, so test_members_are_state_gated passes. wi_ssp is in all four household_state_benefits blocks (2023–2026).
    • Callers. wi_ssp and wi_cts are referenced only in the lists and variables this PR edits.
    • References. Each is one entry per document, and every #page= anchor I opened shows the cited text: memo p. 2; CTS pp. 18, 19, 21, 30, 31, 33, 62–65; SSI-E pp. 7, 10, 13, 24, 29; PIH 2023-27 p. 81; PIH 2024-38 pp. 3–4. Multi-page titles use the #page a-b form.
  • Hand checks: 45 expectations across all five files, all of which add up. The 2026 FBR is $994 for an individual and $1,491 for a couple.
    • wi_ssp.yaml:
      • Case 5: 4 × 83.78 + 8 × 92.16 = 1,072.40.
      • Case 7: SSI = 994 − (986.70 − 20) = 27.30, so 92.16.
      • Case 8: 2,067.52 > 994, so 0.
      • Cases 9 and 10: 83.78 + 95.99 = 179.77; 92.16 + 105.59 = 197.75.
      • Case 17: SSI 662.67; SSI-E 0; 92.16.
    • integration.yaml:
      • Case 1: 145.26 ÷ 2 = 72.63 each.
      • Cases 2 and 3: 143.47; 148.56.
      • Case 4: (145.26 + 379.90) ÷ 2 = 262.58.
      • Case 5: 72.63 + 105.59 = 178.22, and 72.63.
      • Case 6: SNAP unearned income 11,928 + 1,072.40 = 13,000.40.
      • Case 7: wi_cts 12 × 275 = 3,300; wi_ssp 4,372.40; SNAP unearned income 11,928 + 1,072.40 + 3,300 = 16,300.40.
      • Case 8: HUD unearned income 11,928 + 2,301.08 = 14,229.08; SNAP unearned income 13,000.40.
      • Case 9: individual rate 92.16 with the spouse in a facility.
      • Case 10: spm_unit_benefits 11,928 + 2,301.08 = 14,229.08.
    • wi_cts.yaml:
      • Case 2: 275 + 2 × 165 = 605.
      • Cases 10, 11 and 12: 3,732 / 12 = 311 ≤ 311; 312 > 311; 305 > 301 (Area II).
      • Cases 16 and 17: 401 − 90 = 311; 402 − 90 = 312.
      • Cases 18 and 19: gross 576 ≤ 576; 577 > 576.
      • Case 20: (570 − 90 − 30) × 2/3 = 300 ≤ 311.
      • Case 28: 700 − 90 − min(200, 175) = 435 ≤ 550, so 440.
      • Case 41: gross 628.33 ≤ 707; net 0 ≤ 311 + 71 = 382.
      • Case 43: 628.33 − 90 − 30 = 508.33 ≤ 550.
      • Case 45: 538.33 − 200 = 338.33 ≤ 533 (Area II), with gross 628.33 ≤ 987.
      • Case 46: subgroup 500 − 85 = 415 ≤ 550; group 700 − 85 = 615 ≤ 647, so 275.
    • HUD and W-2:
      • HUD Case 4: SSI = 994 − (698.90 − 20) = 315.10.
      • HUD Case 12: 1,072.40 + 3,300 = 4,372.40.
      • W-2 Cases 7–11: the custodial-parent logic gives false / true / true / false / false.
  • Probes at the head:
    • A married SSI couple with a child in common gets one 275 payment, to the lower person_id parent, plus 72.63 each in regular supplement.
    • An eligible individual whose ineligible spouse earns $60,000 gets SSI 0 and wi_ssp 0.
  • Changelog: changelog.d/wi-ssp-2026.added.md is top-level and typed added (see Should 3 for the missing W-2 sentence).
  • Registry:
    • The programs.yaml entry sits under ssi_state_supplement.state_implementations, after WA, with the batch's fields.
    • partial fits the unmodeled grandfathered state-only recipients.
    • parameter_prefix resolves.

Batch checks

  1. Axiom line: SHOULD (Should 1). axiom: needed is invalid for a staff PR. rulespec-us us-wi/ has only CMS and income-tax policies and no SSP or CTS issue, so a dispatch-ready pe-parity issue and a queued line are needed.
  2. Parameter descriptions: SHOULD (Should 2). 21 of the 22 CTS files lack "under the ... program" (several call an age, fraction or hour count "this amount"). The six regular and SSI-E files and eligible_immigration_statuses follow the template.
  3. Backdating: SUGGESTION (Suggestion 1). CTS's $275 / $165 leaks into 2015 to June 2023, when the law paid $250 / $150 (effective November 1999). The regular and SSI-E amounts are correct back to at least 2011 ("unchanged since 1994"; the 2011 SSI Administration Handbook table). The PR claims only 2026 and disclaims backfilled years.
  4. tx_rebate.py copy: SUGGESTION (Suggestion 2). It omits wi_ssp, which cuts 2027 spm_unit_benefits by $1,105.92 for an aged single. ca_state_supplement is still missing too.
  5. Aggregate wiring: complete, with no double count.
    • wi_ssp is in spm_unit_benefits and all four household_state_benefits blocks.
    • The routing variables carry it into HUD unearned income (wi_ssp_countable_for_hud, which counts CTS and SSI-E unless the home-care exclusion applies) and SNAP unearned income (wi_ssp_countable_for_snap, regular plus CTS, without SSI-E per FoodShare 4.3.4).
    • It has a programs.yaml entry and holds only state amounts.
  6. Income attribution: pass, with items.
    • Pinned: an eligible couple split 50/50; the one-eligible-spouse rates only with an SSI-ineligible spouse (an SSI-eligible spouse in a facility leaves the individual rate, integration Case 9); deemed income affecting only the SSI > 0 gate (the probe with a step-parent earning $3,000 a month gives SSI 282 and the full $130.43 rate); SSI-E per certified person with the couple rate when both are certified; Caretaker Supplement income from the filing unit only, with SSI people excluded.
    • Not pinned: the unlinked one-payee approximation (Suggestion 4) and the dependent care deduction reading (Suggestion 3).
  7. Sibling conflicts (branch note):
  8. CI: all 26 checks pass on head 139139fbe9, with no failing job. The Rest job ran 1h28m9s, close to the 90-minute cap, as on the siblings.
  9. State law first: done.
    • Read:
      • Wis. Stat. 49.77, 49.775, 49.145(2) and 49.19(4)
      • DMS Operations Memo 26-12 (pp. 1–3)
      • CTS Handbook P-23131 (pp. 6–7, 17–34, 60–82)
      • SSI-E Handbook P-20679 (pp. 5–25, 29)
      • SSI Administration Handbook 2.1, 3.1 and 4.1
      • FoodShare Handbook 4.3.4
      • W-2 Manual 2.2.1
      • POMS SI 01415.058 A
      • HUD PIH 2023-27 (pp. 80–82) and PIH 2024-38 (pp. 1–4)
      • 45 CFR 233.20(a)(11) (1997 edition)
    • SSA's "State Assistance Programs for SSI Recipients" page returned 403 from here. The 2011 DHS table stood in for it.
    • Every 2026 amount by living arrangement, couple status and SSI-E certification checks out, as do the state administration and the May 1, 2026 effective date. 45 expectations check by hand.

Axiom line assessment

Invalid (Should 1).

CI status

All 26 checks pass (gh pr checks 10173). Three "skipping" entries belong to the superseded run 38361635754 (same head, 07:16 UTC).

  • The run. Run 38367946145 (pull_request, 2026-10-13 08:14 UTC) on head 139139fbe9, conclusion success.
  • Microsimulation. The Microsimulation job (36m16s) passes. The Caretaker Supplement filing-unit code runs nationally in it, because household_state_benefits includes wi_ssp.
  • Partner tests. The PR touches none, and the Household API Partners job passes.
  • Local runs with policyengine-core 3.33.3:
    • the four new Wisconsin SSP files plus wi_works_eligible.yaml: 97 passed (91 new, 6 existing)
    • the whole wi/dcf test directory: 197 passed
    • test_aggregate_list_integrity.py: 22 passed

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 4 should items. (1) axiom: needed is reserved for external contributors, and rulespec-us has no Wisconsin SSP or CTS module or issue. Please file a dispatch-ready pe-parity issue and add a queued line. (2) 21 of 22 CTS parameter descriptions are off the house template. (3) The W-2 eligibility change under Wis. Stat. 49.145(2)(i) is correct but isn't mentioned in the PR body or changelog. (4) Three branches have no tests: the W-2 fallback when no parent links exist, CTS child incarceration, and the additional fraction disregard input. The 2026 amounts all match DMS Ops Memo 26-12 and Handbook 5.2, and 97 of 97 tests pass. Details are in the full report above.

@hua7450

hua7450 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. The changes are in 0e2793d, followed by a merge of main (bd14e92).

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

  • your module paths;
  • the verbatim 49.77, 49.775, 49.145(2)(i), Memo 26-12, SSI-E Handbook and CTS Handbook text;
  • the required outputs;
  • your companion cases mapped to the PE cases.

The source conflicts are in a separate comment, and the axiom line now points to it:

  • which income the care deduction reduces (Suggestion 3);
  • the pregnancy step in the gross limit: the 5.2.2 cells sit $131–132 above 5.2.1, but the note adds $71 for each further pregnant woman, and the model follows the note;
  • step-parents: Handbook 3.1.1 leaves them out of the unit, while Wis. Stat. 49.19(4)(et), which 49.775(2)(c) adopts, deems a co-resident stepparent's income.

Should 2 (descriptions): all 21 now follow the template and end "under the Caretaker Supplement program". Ages, the one-third share, the hour limit and the county list are described as such, and the bracket labels say Area I and Area II.

Should 3 (W-2 disclosure): the body has a W-2 bullet. changelog.d/wi-ssp-2026.fixed.md says the W-2 unit is ineligible when every custodial parent receives SSI, under Wis. Stat. 49.145(2)(i), and that a custodial parent not on SSI can still qualify.

Should 4 (untested branches): all three added.

  • wi_works_eligible.yaml Cases 12 and 13 cover the fallback without parent IDs: false with SSI, true without.
  • wi_cts.yaml Case 47: an incarcerated child gets 0.
  • Case 48 is your one-third case: (628.33 − 90 − 30) × 2/3 = 338.89, so 440.

Suggestion 1 (history): history stays out of scope, so the $250 / $150 before July 2023 isn't added.

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 (care deduction): fixed.

  • The group's care deduction is now capped at its earned income left after the $90, $30 and one-third disregards. This follows 45 CFR 233.20(a)(11)(i)(D) (1997 edition) and the Family Support Act's "applied last" rule.
  • Case 49 pins your no-earnings case at 0 (440 without the cap).
  • New Case 53 pins a positive remainder. A teen working 5 hours a week has $67.08 left after the $90, which caps $200 of care, so the payment is 0 (440 uncapped).
  • AFDC took the disregard from each earner's own earnings. The model pools the group's earnings because it doesn't know who pays for care, and the comment and documentation say so.
  • Earned income after disregards is now its own variable, wi_cts_countable_earned_income. Both the net income and the cap read it.

Suggestion 4 (microsimulation approximations):

  • The programs.yaml note now says that without parent IDs the Caretaker Supplement pays one SSI parent per family, and that groups over 12 need a supplied net income limit.
  • The body's coverage section lists both, plus the dependence on own_children_in_household.

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.
  • wi_ssp_countable_for_snap has defined_for = StateCode.WI.
  • wi_ssp_regular now uses arrangement.possible_values, as wi_ssi_e does.
  • The "continuing April 2026 award" sentence is replaced. It now says grandfathered state-only recipients (49.77(2)(a)3) aren't modeled, so neither is their 10% May 2026 increase.

Other fixes I found:

  • Input-reset trap. Eight Caretaker Supplement formula variables told users to override them, and the tests set wi_ssp_regular as an input. Setting a formula variable as an input for one person resets everyone else to its default. With two unrelated households in one simulation:
    • setting wi_cts_area_i for one Portage caretaker moved a Milwaukee family out of Area I (275 → 0);
    • setting wi_cts_countable_resources for one child zeroed another family's $1,500 bank balance (0 → 275, an overpayment);
    • setting wi_ssp_regular for one parent zeroed every other recipient's supplement.
  • The three overrides that cover real gaps now read new plain inputs:
    • wi_cts_tribal_area_i (Household), for Oneida Tribe households outside the listed counties;
    • wi_cts_other_qualifying_immigration_status, for lawful temporary residents and verified PRUCOL that the enum can't represent;
    • wi_cts_other_countable_resources, for Handbook 3.2.2 assets that SSI resources omit.
  • The other five now state their limits instead. Buening needs parent IDs, and parent IDs can't tell a step-parent from a parent. Income outside the SSI cash sources, Huber Law releases and incapacitated-adult care aren't modeled.
  • The wi_ssp_regular inputs are gone from the tests, so those cases use the computed value. No expected value changed.
  • Cases 50–52 pin two households with an input on one only.

On the merged head, these pass locally: all 461 Wisconsin cases, and the aggregate list integrity and program registry tests (677 passed, 10 skipped).

@DTrim99

DTrim99 commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

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

PR #10173 (author: hua7450). This round reviews head bd14e92bd9; round 1 reviewed 139139fbe9. Two commits landed in between:

  • 0e2793d08f, "Address review: Wisconsin CTS descriptions, inputs, care cap and tests" (41 files, +583/−136). It does the following:
    • rewrites the 21 off-template Caretaker Supplement (CTS) descriptions and relabels the brackets Area I and Area II;
    • caps the group's dependent care deduction at its earned income left after the $90, $30 and one-third disregards. That remainder is now its own variable, wi_cts_countable_earned_income, which the net income test also reads;
    • replaces the formula overrides with three zero-default inputs: wi_cts_tribal_area_i (Household), wi_cts_other_qualifying_immigration_status and wi_cts_other_countable_resources. The tests no longer set wi_ssp_regular or wi_cts_countable_resources as inputs;
    • adds wi_cts.yaml Cases 47–53 and wi_works_eligible.yaml Cases 12–13;
    • adds changelog.d/wi-ssp-2026.fixed.md for W-2, the microsimulation notes in programs.yaml, defined_for on wi_ssp_countable_for_snap, and possible_values in wi_ssp_regular.
  • bd14e92bd9, a merge of main at 9560e7f183 with no hand-resolved conflicts. It leaves the Wisconsin SSP files untouched. Among other things, it brought in:

Summary

Ziming fixed all four round-1 should items and three of the five suggestions:

He gave reasons for the other two suggestions, and I accept them:

He also went further. Entering an override for one person reset everyone else in the simulation; three plain inputs replace those overrides, and two-household Cases 50–52 pin the behavior.

One new should item: the main merge brings the batch's wage finding (NH #10156 round 3, OK #10165, OR #10166 round 2, VT #10171 round 2) into the Caretaker Supplement.

  • The code. The CTS gross test, net test and care cap read ssi_earned_income. Since Document disjoint health premium inputs and correct consumer treatment #10046 arrived with the merge, that variable subtracts pre-tax health premiums from wages.
  • The rule. Unlike Virginia, the CTS rule counts wages before any deductions:
    • Wis. Stat. 49.775(2)(c) adopts the AFDC criteria.
    • 45 CFR 233.20(a)(6)(iii) (1997) reads: "For AFDC, earned income means gross earned income prior to any deductions for taxes or for any other purposes".
    • Handbook 3.2.1.2.2 tests "gross deemed, earned, and unearned income before applying any disregards".
  • Probe. I used Handbook Buening Example 2 with Dan earning wages in place of unemployment insurance. The error runs both ways:
    • Dan earns $700 a month with $100 of premiums: the model pays 0, where the rule pays 275.
    • Dan earns $600 a month with $100 of premiums: the model pays 275, where the rule pays 0.
  • Not affected. The regular supplement and SSI-E have no income test.

The NH #10156 check finds nothing. No Wisconsin parameter is keyed by a variable. In a two-state probe, a Minnesota family gets 0 with no error.

Every new expectation (9 cases) and every changed input checks by hand.

CI is 27/27 green on the head. The branch is 59 commits behind main and conflicts with it in five shared lists, where 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: Wis. Stat. 49.77; Wis. Stat. 49.775; Wis. Stat. 49.145(2)(i); DMS Operations Memo 26-12; CTS Handbook P-23131 TheAxiomFoundation/rulespec-us#1788 queued. #1788 is open and labelled pe-parity; Ziming filed it on 2026-10-15. It has: my proposed module paths with corpus status; the verbatim statutes, memo and handbook text; seven required outputs; and companion tests A–K mapped to PE cases. Its source-conflicts comment covers the care deduction, the pregnancy step and step-parents. The one gap is the earned-income definition (new Should 1).
Should 2: 21 of the 22 CTS parameter descriptions were off-template Fixed All 22 CTS files now end "under the Caretaker Supplement program", as do the six regular and SSI-E files. Wording. first_child.yaml, additional_child.yaml, area_i_counties.yaml, care_young_age.yaml, earned_fraction.yaml, student_hours_limit.yaml and the six table files use my wording or close to it. The ages, the one-third share, the hour limit and the county list are no longer called "this amount". Labels. They say Area I and Area II. pregnancy_allowance.yaml says it raises "the gross income limit for each pregnant woman after the first", which matches the code and #1788's conflict 2.
Should 3: the W-2 eligibility change wasn't disclosed Fixed Body. A W-2 bullet cites Wis. Stat. 49.145(2)(i) and W-2 Manual 2.2.1. Changelog. changelog.d/wi-ssp-2026.fixed.md: "Make Wisconsin Works (W-2) units ineligible when every custodial parent receives SSI, under Wis. Stat. 49.145(2)(i); a custodial parent not on SSI can still qualify." It is top-level and typed fixed, next to the existing added fragment.
Should 4: three new branches had no test Fixed W-2 without parent IDs. wi_works_eligible.yaml Case 12 gives false for an SSI parent and Case 13 true without SSI. Child incarceration. wi_cts.yaml Case 47 gives wi_cts_child_eligible [false, false] and 0. One-third input. Case 48 is my round-1 probe: 338.89 and 440.
Suggestion 1: CTS's $275 / $165 carries back before July 2023 Declined (accepted) Disclosure. The body says "Earlier years use parameter backfilling and are unverified historical estimates; no historical coverage is claimed". programs.yaml claims only verified_years: '2026'. #1788 records that CTS "paid $250 / $150 before July 2023 (Handbook 1.1)". Consistency. The sibling PRs handle history the same way.
Suggestion 2: the Texas rebate's copy of spm_unit_benefits omits wi_ssp Deferred to #10226 (accepted) #10226 ("Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs") is open. The body links it, as the sibling PRs do.
Suggestion 3: the dependent care deduction came off unearned income Fixed The code. _wi_cts.py:138-141 caps the group's care at cts_unit_sum(... wi_cts_countable_earned_income). Tests. Case 49 (no earnings) gives 0, against 440 uncapped. Case 53 ($67.08 of remaining earnings) gives 0, against 440 uncapped. Case 28 still gives 440. Documentation. wi_cts_dependent_care_deduction cites Handbook p. 31, 45 CFR 233.20 (1997) p. 14 and the Family Support Act p. 55. It explains the pooled cap.
Suggestion 4: microsimulation approximations weren't written down Fixed programs.yaml: "without parent IDs the Caretaker Supplement pays one SSI parent per family, and groups over 12 need a supplied net income limit". Body. Its coverage section adds the Scenario 1 result ([440, 0] against 275 each), the dependence on own_children_in_household and the step-parent limitation.
Suggestion 5: polish Mostly fixed; blank lines kept (accepted) Case count. The body says 100 (53 + 17 + 13 + 10 + 7), and CI ran 53, 17, 13, 10 and 13 (7 new W-2 cases plus 6 existing). defined_for. wi_ssp_countable_for_snap is gated. Consistency. wi_ssp_regular uses arrangement.possible_values, and the labels say Area I and Area II. PR body. The grandfathered-recipient sentence is rewritten. Blank lines. The two before metadata: stay; they are harmless, as in Vermont and Virginia.

New findings

Critical (must fix)

None.

Should address

1. The Caretaker Supplement now counts wages net of pre-tax health premiums, but its AFDC rule counts gross wages.

  • Where: three variables read ssi_earned_income:

    • wi_cts_gross_income.py:15, the gross test;
    • wi_cts_net_income.py:13, which splits off unearned income;
    • wi_cts_countable_earned_income.py:14, which feeds the net test and the care cap.

    Since Document disjoint health premium inputs and correct consumer treatment #10046, ssi_earned_income returns wages less min_(wages, pre_tax_health_insurance_premiums), following POMS SI 00820.102 C.2. At round 1's head it returned gross wages. So the change arrived with the main merge, and the CTS gross and net tests now use the smaller figure.

  • The rule counts wages before payroll deductions:

    • Wis. Stat. 49.775(2)(c) requires that the child "meets the eligibility criteria under the aid to families with dependent children program under s. 49.19 (1) to (19)".
    • CTS Handbook 3.3, p. 33: "CTS ... eligibility is based on criteria that applied to AFDC eligibility prior to the elimination of AFDC by the federal government in 1997".
    • Handbook 3.2.1.2.2, p. 31: "This test looks at gross deemed, earned, and unearned income before applying any disregards".
    • 45 CFR 233.20(a)(6)(iii) (10-1-97 edition), p. 95: "For AFDC, earned income means gross earned income prior to any deductions for taxes or for any other purposes, except as provided in paragraph (a)(6)(v)." Paragraph (a)(6)(v) covers only self-employment.
    • (a)(6)(iv), p. 96: for wages, earned income "means the total amount, irrespective of personal expenses, such as income-tax deductions".
    • (a)(11)(i), p. 97 takes the $90, the $30 and one-third, and the care disregards "from the monthly earned income, i.e., earned income as defined in § 233.20(a)(6)(iii)".
    • Wis. Stat. 49.19(4)(es): "all earned and unearned income of the applicant shall be considered", with exceptions only for the EITC.
    • No AFDC or CTS source has SSI's salary-reduction exclusion. Virginia's AG Manual § 17.1.1 has one, which is why Virginia came out the other way.
  • Who it reaches. SSI members' income is disregarded (Handbook 3.2), so the affected earners are the unit's non-SSI members:

    • the Buening co-parent, the member most likely to have employer health premiums;
    • working teens and 18-year-old students.
  • Probe at the head (2026-01; one simulation). The household is Handbook 3.3.1 Example 2 in Dane County (Area I). Mary receives SSI. Jill has $200 a month of survivors benefits. Tim is the child of Mary and Dan. Dan, who is not on SSI, earns wages in place of unemployment insurance. "Gross-wage rule" is the same household without the premiums; I checked it by hand.

    Model (with $100/mo pre-tax premiums) Gross-wage rule
    A. Dan earns $8,400 a year ($700 a month)
    Dan's CTS earned income 600 700
    Tim and Dan (net limit for 2: $550) 600 − 90 = 510, needy, so they stay in Jill's unit 700 − 90 = 610, not needy, so they're excluded
    Deciding test Group of 3: net 510 + 200 = 710 > 647 Jill alone: gross 200 ≤ 576, net 200 ≤ 311
    wi_cts (Mary) 0 275
    B. Dan earns $7,200 a year ($600 a month)
    Dan's CTS earned income 500 600
    Tim and Dan 500 − 90 = 410, needy 600 − 90 = 510, needy
    Group of 3 net 410 + 200 = 610 ≤ 647, gross 700 ≤ 1,197 net 510 + 200 = 710 > 647
    wi_cts (Mary) 275 0
    • In A, the model takes $3,300 a year from the family; in B, it pays $3,300 the rule doesn't.
    • wi_ssp is 83.78 against 358.78 in A, and 358.78 against 83.78 in B.
  • Severity. I rate it should, for consistency with the four sibling findings in this family.

  • Fix:

    • Add a CTS earned-income variable that sums the SSI earned sources before Document disjoint health premium inputs and correct consumer treatment #10046's netting, for example max_(add(person, period, parameters(period).gov.ssa.ssi.income.sources.earned), 0). Cite 45 CFR 233.20(a)(6)(iii) (#page=12) and Handbook p. 31.
    • Read it in all three places. In wi_cts_net_income, take unearned income as gross income minus this variable; otherwise the premiums would come back as unearned income.
    • Pin the two probe households in wi_cts.yaml, using employment_income: 8_400 (and 7_200) with pre_tax_health_insurance_premiums: 1_200. Expect wi_cts [275, 0, 0, 0] for A and [0, 0, 0, 0] for B.
    • In Correct MO social security deduction calculations #1788, add the definition to the "CTS net income" output ("earned = gross wages before any payroll deduction, 45 CFR 233.20(a)(6)(iii)–(iv)"). Add (a)(6) to the co-cited AFDC corpus row, and add the two households to the companion tests.

Suggestions

None.

Verified

  • Administration.
    • Wisconsin isn't on POMS SI 01415.058 A's list of federally administered supplements. CTS Handbook 1.1 says DHS's contractors "process SSI payments, to which CTS benefits are added".
    • So the wage lesson applies, and the PR correctly avoids SSA rounding and the shared _ssi_state_supplement helper.
  • The wage count (NH Add New Hampshire state supplementation for 2026 #10156 r3, OK Add Oklahoma state supplementation for 2026 #10165, OR Add Oregon state supplementation for 2026 #10166 r2, VT Add Vermont state supplementation for 2026 #10171 r2).
    • Regular supplement and SSI-E. Neither has an income test. Memo 26-12, p. 2: "Everyone who qualifies for federal SSI payments of any amount automatically gets the maximum state payment." So the premium netting only affects them through the SSI > 0 gate, which follows SSI as it should.
    • Caretaker Supplement: Should 1.
    • Unearned income reads ssi_unearned_income, which carries Integrate modeled state unemployment insurance into income flows #9558's total_unemployment_compensation. No Wisconsin SSP variable reads raw unemployment_compensation. The tests enter it as an input, and it reaches the total.
  • State-gated keys (NH Add New Hampshire state supplementation for 2026 #10156 check).
    • No parameter under gov.states.wi.dhs.ssp is a breakdown or is keyed by a variable. The income tables are scales read with .calc(size), and the county and immigration lists are used with np.isin.
    • The new gated inputs are bools (wi_cts_tribal_area_i, wi_cts_other_qualifying_immigration_status) and a float (wi_cts_other_countable_resources), used only in boolean logic or sums.
    • Ungated. The int wi_cts_caretaker_children is used only in arithmetic.
    • Two-state probe. The simulation that ran Should 1's households also held a Minnesota family in the same Buening layout. It gave wi_cts_area_i false, wi_cts_sfu_member false, wi_cts 0, wi_ssp 0 and household_state_benefits 0, with no error.
  • The care cap.
    • Applied last. Family Support Act of 1988 § 402(a), 102 Stat. 2397: "CHILD CARE DISREGARD TO BE APPLIED LAST.--Section 402(a)(8)(A)(iii) of the Social Security Act is amended-- (1) by inserting 'after applying the other clauses of this subparagraph,' before 'shall disregard'".
    • Order. 45 CFR 233.20(a)(11)(i) (p. 97) lists "(B) The first $90", then "(C) ... $30 plus one-third", then "(D) An amount equal to the actual cost for the care". So capping care at the earnings left after the $90, $30 and one-third is right.
    • Pooling. The cap pools the group's earnings, where AFDC applied it per earner. The code comment, the documentation and Correct MO social security deduction calculations #1788 all say so.
  • The input design.
    • No formula variables set as inputs. I checked every formula variable under wi/dhs/ssp against the four SSP test files: none is set as an input.
    • Defaults. The three new inputs default to false or 0, so entering one for one person leaves everyone else on the formula. Cases 50–52 pin this with two households.
    • Documentation. The removed overrides now state their limits: Buening needs parent IDs, step-parents named in parent IDs count as parents, and Huber Law releases and incapacitated-adult care aren't modeled.
    • Tribal households. The Winnebago Tribe needs no input, since La Crosse and Marathon are on the 5.2.3 county list.
    • Immigration. The TPS note follows 8 U.S.C. 1254a(f)(1).
  • New and changed expectations, checked by hand. Area I limits: gross 576, 1,018 and 1,197, and net 311, 550 and 647, for groups of 1–3.
    • wi_works_eligible.yaml:
      • Case 12: with no parent IDs, is_parent comes from own_children_in_household: 1. The only custodial parent has SSI 994, so the unit is ineligible: false.
      • Case 13: the same parent with SSI 0: true.
    • wi_cts.yaml:
      • Case 47: the 16-year-old is incarcerated, so wi_cts_child_eligible is [false, false] and wi_cts [0, 0]. wi_ssp is [83.78, 0], the January individual rate.
      • Case 48: 7,540 ÷ 12 = 628.33, and (628.33 − 90 − 30) × 2/3 = 338.89. Gross 628.33 ≤ 1,018 and net 338.89 ≤ 550, so 275 + 165 = 440, and wi_ssp 83.78 + 440 = 523.78.
      • Case 49: the care deduction is min(600, 200) = 200, but the group has no earnings, so the cap is 0. Net 600 > 550, so 0.
      • Case 50: Portage isn't an Area I county, so home 1 is Area I only through the input; Milwaukee is on the list. wi_cts_area_i is all true, and wi_cts is [275, 0, 275, 0].
      • Case 51: the undocumented child with the input is eligible, as are the citizen sibling and the other family's child. That gives [false, true, true, false, true] and [440, 0, 0, 275, 0].
      • Case 52: countable resources are [0, 500, 0, 1,500]. 500 ≤ 1,000 but 1,500 > 1,000, so [275, 0, 0, 0].
      • Case 53: 1,885 ÷ 12 = 157.08, and 157.08 − 90 = 67.08. Care is min(200, 67.08) = 67.08. Net 67.08 + 600 − 67.08 = 600 > 550, so 0. Gross 757.08 ≤ 1,018. Uncapped, the net would be 467.08 and the payment 440.
    • Changed inputs, unchanged outputs:
      • Cases 14, 15 and 30 now enter bank_account_assets of 1,000, 1,001 and 1,001, giving 275, 0 and 0 as before.
      • Case 22: the second unmarried parent, in her own marital unit, now has SSI 994 in place of a couple's 745.50. The payment is still 275 to the lower person_id.
      • The removed wi_ssp_regular inputs match the computed values: 83.78 for a single recipient and 132.05 ÷ 2 = 66.025 for each member of a couple.
  • Wiring at the head:
    • wi_ssp is in all four household_state_benefits blocks and in spm_unit_benefits.py;
    • wi_ssp_countable_for_snap and wi_ssp_countable_for_hud are on the SNAP and HUD unearned lists;
    • programs.yaml is partial, with verified_years: "2026".
  • Memo 26-12. It lists the Caretaker Supplement among its affected programs, but it raises only the regular and SSI-E rates. The CTS amounts are statutory (49.775(4)). The programs.yaml note now says "May 2026 regular and SSI-E rate increase", which is accurate.
  • Correct MO social security deduction calculations #1788's other source conflicts. I accept both readings:
    • Pregnancy step. The model follows the handbook's explicit "Add $71 for each additional pregnant woman" over the 185% pattern in the tables.
    • Step-parents. The model follows the Handbook 3.1.1 exclusion. The parent-ID limitation is documented, and the 49.19(4)(et) deeming question is recorded.
  • Tests.
    • In CI: Quick Feedback ran all five Wisconsin files at the head, with 13, 10, 53, 17 and 13 passing.
    • Locally: one small probe, covering Should 1 and the two-state check.
  • Partner tests. The PR touches none, and Household API Partners passes.

Axiom line assessment

Valid: axiom: Wis. Stat. 49.77; Wis. Stat. 49.775; Wis. Stat. 49.145(2)(i); DMS Operations Memo 26-12; CTS Handbook P-23131 TheAxiomFoundation/rulespec-us#1788 queued.

  • Issue state.

    • Correct MO social security deduction calculations #1788 is open and labelled pe-parity. A search for "Caretaker Supplement" finds no other rulespec-us issue.
    • rulespec-us main (5796861e58, 2026-10-20) has no module for it: us-wi/ holds only policies/cms/ and policies/income_tax/. So queued is still the right form.
  • Dispatch-ready. It has:

    • module paths with corpus status:
      • the SSI-E and SSI Administration handbooks are in the corpus;
      • 49.77 is listed in a manifest;
      • 49.775, 49.145, the memo, the CTS Handbook and the 1997 AFDC rules need ingest;
    • the verbatim law;
    • seven required outputs;
    • companion tests A–K from the memo, the two handbooks and the statutes, mapped to PE cases;
    • the interpretations that change a result: the care cap, the unlinked microsimulation path, large groups, grandfathered recipients, inputs and history;
    • a source-conflicts comment covering:
      • the care deduction (440 against 0);
      • the pregnancy step (0 against 440);
      • step-parents (275 against 0).
  • Matches the head:

    • the 53, 17, 10 and 13 SSP cases and W-2 Cases 7–13;
    • the variable and parameter lists;
    • every pinned value it quotes, including Cases 49 and 53.

    The only gap is the earned-income definition. It should be updated with Should 1's fix.

CI status

27 pass, 0 pending, 0 failed (run 38823768539 on head bd14e92bd9, pull_request, 2026-10-15 23:28 UTC to 2026-10-16 01:12 UTC). I re-checked gh pr checks 10173 at the end of this review.

  • Passed:
    • PR validation, and Package and compatibility;
    • Quick Feedback (Wisconsin: 13 + 10 + 53 + 17 + 13 passed);
    • Household API Partners;
    • Microsimulation (31m2s), which runs the CTS filing-unit code nationally;
    • both Rest (Python) jobs;
    • all 11 Baseline shards and all 9 Contrib shards.
  • Rest job. It ran 1h5m33s, down from 1h28m9s in round 1, when it was close to the 90-minute cap.

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#1788 is queued, the 22 CTS descriptions follow the template, the W-2 change is disclosed, and the three branches are tested. Suggestions 3–5 are fixed, the care cap checks out against 45 CFR 233.20(a)(11)(i), the NH-sibling bug doesn't occur here, and CI is green. New Should 1, exposed by #10046 in this round's main merge: the CTS gross test, net test and care cap read ssi_earned_income, which nets out pre-tax health premiums. But the CTS (AFDC) rule counts gross wages under 49.775(2)(c), 45 CFR 233.20(a)(6)(iii) ("gross earned income prior to any deductions") and Handbook 3.2.1.2.2. In Buening Example 2 with $100 a month of premiums, $700 gross gives 0 where the rule gives 275, and $600 gross gives 275 where the rule gives 0. Fix: add a gross CTS earned-income variable used in all three places, pin two cases, and update #1788. The regular supplement and SSI-E have no income test, so they're unaffected.

hua7450 and others added 3 commits October 20, 2026 16:11
45 CFR 233.20(a)(6)(iii)-(iv), adopted by Wis. Stat. 49.775(2)(c), counts
wages before any deductions, so the gross test, net test and countable
earnings (which also set the care cap) read a new wi_cts_gross_earned_income
instead of ssi_earned_income, which nets out pre-tax premiums.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The new source-conflict guard (#10287) registers statute conflicts only; this
NOTE compares a regulation with another regulation or a handbook.

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 31a3902, with main merged.

Should 1, CTS wages net of pre-tax health premiums: fixed.

  • New wi_cts_gross_earned_income sums SSI's earned sources (gov.ssa.ssi.income.sources.earned) and floors the total at 0, without Document disjoint health premium inputs and correct consumer treatment #10046's premium netting. That follows 45 CFR 233.20(a)(6)(iii) (10-1-97 edition): "gross earned income prior to any deductions for taxes or for any other purposes". It also follows (a)(6)(iv) and Handbook 3.2.1.2.2.

  • The gross test, the net test and the care cap all read it. wi_cts_net_income still takes unearned income as gross income minus this same figure, so the premiums can't come back as unearned income.

  • SSI keeps SSA's netting (POMS SI 00820.102 C.2). Self-employment keeps its existing treatment: net profit, as (a)(6)(v)(B) defines it. A NOTE records the reading, and the reference tuple cites the CFR (PDF pages 12-13) and Handbook page 31.

  • New wi_cts.yaml cases pin your two households:

    • Case 54 ($700 a month of wages, $100 of it premiums): Dan's net is 610 > 550, so Tim and Dan leave the unit. wi_cts is [275, 0, 0, 0] and wi_ssp 358.78. The old formula gave 0.
    • Case 55 ($600 of wages, $100 of it premiums): Dan's net is 510 ≤ 550, so they stay, and the group's net is 710 > 647. wi_cts is [0, 0, 0, 0] and wi_ssp 83.78. The old formula gave 275.
    • Every existing expectation is unchanged. With no premiums, the new variable equals the old max_(ssi_earned_income, 0).
  • Encode Wisconsin's state SSI supplement, SSI-E and Caretaker Supplement (Wis. Stat. 49.77, 49.775, 49.145(2)(i); DMS Operations Memo 26-12; CTS Handbook P-23131): 2026 rates and the CTS filing-unit tests (PE-US PR 10173) TheAxiomFoundation/rulespec-us#1788 is updated:

    • a new "CTS gross earned income" output defines earned income as wages before any payroll deduction, and the "CTS net income" output starts from it;
    • the co-cited AFDC row adds (a)(6), and the source text quotes (a)(6) and Handbook 3.2.1.2.2;
    • companion tests L and M map to Cases 54 and 55, and a new interpretation bullet records the reading.

    The conflicts comment is unchanged, since the CTS and AFDC sources agree.

Branch note, the main conflicts: resolved. The first main merge (2be1699) keeps the Wisconsin line next to each sibling state's line in household_state_benefits.yaml, the HUD and SNAP unearned lists, programs.yaml and spm_unit_benefits.py. The second, 31a3902, merged without conflicts.

Branch note, main's statute-first rule (#10287): 05d2c0e rewords a NOTE in wi_ssp_countable_for_hud. It now reads that HUD annual income follows 24 CFR 5.609(b)(19), which excludes this SSI-E, although SSI-E Handbook 4.1.1 lists SSI-E as countable. Neither source is a statute, so the register takes no entry, and the new wording keeps the ratchet test from counting the comment. The formula is unchanged.

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

95 Wisconsin SSP cases pass locally (55 in wi_cts.yaml, 17 in wi_ssp.yaml, 13 in wi_ssp_countable_for_hud.yaml, 10 in integration.yaml).

@DTrim99 DTrim99 mentioned this pull request Oct 21, 2026
6 of 7 tasks
@DTrim99

DTrim99 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator

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

PR #10173 (author: hua7450). This round reviews head 31a3902c13; round 2 reviewed bd14e92bd9. The branch is 9 commits ahead of main and 5 behind. Four commits landed since round 2:

  • daf750e79b, "Count gross wages in Wisconsin's Caretaker Supplement income tests" (5 files, +131/−3). It does the following:
    • adds wi_cts_gross_earned_income, which sums SSI's earned sources (gov.ssa.ssi.income.sources.earned) and floors the total at 0, without Document disjoint health premium inputs and correct consumer treatment #10046's premium netting. A NOTE cites 45 CFR 233.20(a)(6)(iii)-(iv) (1997) and POMS SI 00820.102 C.2;
    • points the gross test (wi_cts_gross_income), the net test (wi_cts_net_income) and countable earnings (wi_cts_countable_earned_income, which also sets the care cap) at the new variable instead of ssi_earned_income;
    • adds wi_cts.yaml Cases 54 and 55.
  • 2be1699f21, a merge of main at 07eba1aeea. Five files were resolved by hand: household_state_benefits.yaml (four year blocks), HUD unearned, SNAP unearned, programs.yaml and spm_unit_benefits.py.
  • 05d2c0ec62, which rewords the NOTE in wi_ssp_countable_for_hud.py so it no longer starts like a source-conflict marker. The formula is unchanged.
  • 31a3902c13, 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, with every part of the fix I listed.

  • Should 1 (the wage count). The Caretaker Supplement (CTS) now counts wages before pre-tax health premiums in all three places: the gross test, the net test and the care cap.
    • That follows Wis. Stat. 49.775(2)(c), which adopts the AFDC criteria, and the AFDC rule, 45 CFR 233.20(a)(6)(iii)-(iv) (1997): "gross earned income prior to any deductions for taxes or for any other purposes".
    • wi_cts_net_income still takes unearned income as gross income minus the same gross wage figure, so the premiums can't come back as unearned income.
    • SSI keeps SSA's exclusion, which is right for the federal payment.
    • Case 54 and Case 55 are my round-2 probe households, with my expected values: wi_cts [275, 0, 0, 0] and [0, 0, 0, 0]. The old head gave 0 and 275.
    • Correct MO social security deduction calculations #1788 has the new "CTS gross earned income" output, the (a)(6) text, companion tests L and M, and a "Wages" interpretation.

The wage lesson (NH #10156 round 3, OK #10165, VT #10171) is now resolved for Wisconsin, and it splits by program.

  • The Caretaker Supplement follows AFDC, which counts gross wages. That is the New Hampshire, Oklahoma and Vermont pattern. The fix is to stop reading SSI's net figure, which the model now does, the same way as New Hampshire's and Vermont's approved fixes.
  • The regular supplement and SSI-E follow SSI, as Iowa's rules do. Wis. Stat. 49.77(2)(a)2 pays "Any needy person or couple residing in this state and receiving benefits under federal Title XVI." 49.77(5) says "income shall be disregarded to the extent allowed by federal regulations." Memo 26-12 (p. 2) adds: "Everyone who qualifies for federal SSI payments of any amount automatically gets the maximum state payment." So the model is right to gate these two on ssi > 0 and to apply no state wage test of its own.
  • My hand traces of the two pre-tax premium workers in Cases 54 and 55 match the rule. So does a third trace, a working teen on the path microsimulation uses (see Verified).

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

  • Against the merge base, each shared list gains only Wisconsin's line, once (four times in household_state_benefits.yaml, once per year block).
  • No sibling line is dropped. New Jersey, Pennsylvania, Wyoming, North Carolina, Nevada, Montana, Oklahoma, New York, Rhode Island, South Dakota and Virginia have the same counts as on main in all five lists.

Other checks.

  • NH Add New Hampshire state supplementation for 2026 #10156: nothing found. The one new variable is an ungated float used only in arithmetic, and this round adds no parameter or keyed lookup.
  • Microsimulation default: the regular supplement pays through SSI take-up, SSI-E needs a certification input, and the CTS pays only on the documented path without parent IDs. The gross-wage count reaches microsimulation only through earning children in CTS units, and it moves those results toward the rule.
  • The source-conflict guard: the reworded NOTE was needed, because the old "# Source conflict:" line read as a malformed marker. It is accurate, and no Wisconsin file is in the guard's grown set.

Every new expectation checks by hand (2 cases, 10 outputs, 40 values).

CI and branch.

Prior findings status

Finding Status Evidence
Round-2 Should 1: the CTS gross test, net test and care cap read ssi_earned_income, which nets out pre-tax health premiums since #10046, while the AFDC rule counts gross wages Fixed (as proposed) The code. wi_cts_gross_earned_income.py:21-22: sources = parameters(period).gov.ssa.ssi.income.sources.earned and return max_(add(person, period, sources), 0). The sources are employment_income, self_employment_income and sstb_self_employment_income, the same list ssi_earned_income sums before it subtracts min_(wages, pretax_premiums). So the only change is that the premiums stay in. The readers. wi_cts_gross_income.py:15, wi_cts_net_income.py:13 and wi_cts_countable_earned_income.py:14 read it. No Wisconsin SSP variable reads ssi_earned_income any more (git grep at the head). The unearned split. wi_cts_net_income.py:14 keeps unearned = max_(gross_income - earned, 0) with the same earned, as I asked. The NOTE (lines 17-20) quotes (a)(6)(iii)-(iv) and cites POMS SI 00820.102 C.2 for the ssi variable. The reference tuple cites the 1997 CFR at #page=12 with a # PDF pages 12-13 comment, and Handbook #page=31. The tests. Case 54 (line 2191) and Case 55 (line 2245) are my households with my values (see Verified). Unchanged. No earlier case has premiums, so the new variable equals the old max_(ssi_earned_income, 0) there, and the diff only appends cases. CI's Quick Feedback ran wi_cts.yaml with 55 passed. #1788 has the output, the AFDC text, tests L and M, and the interpretation (see Axiom).
Round-1 findings (four should items, five suggestions) Closed in round 2 Nothing in this round reopens them. The axiom line, the 22 CTS descriptions, the W-2 disclosure and fragment, the branch tests, the care cap, and the microsimulation notes are unchanged. The two deferrals still hold: CTS history (disclosed in the body and #1788) and the Texas rebate copy (#10226, still open).

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

None.

Verified

  • The fix matches the rule text. I re-read each source.

    • Wis. Stat. 49.775(2)(c): "The dependent child of the custodian parent meets the eligibility criteria under the aid to families with dependent children program under s. 49.19 (1) to (19) or would meet the eligibility criteria under s. 49.19 but for the application of s. 49.19 (20)."
    • 45 CFR 233.20(a)(6)(iii) (10-1-97 edition), PDF p. 12: "For AFDC, earned income means gross earned income prior to any deductions for taxes or for any other purposes, except as provided in paragraph (a)(6)(v)."
    • (a)(6)(iv), PDF p. 13: "With reference to commissions, wages, or salary, the term earned income means the total amount, irrespective of personal expenses, such as income-tax deductions, lunches, and transportation to and from work". (v)(B) makes AFDC self-employment income "the total profit from business enterprise", which matches the net self_employment_income input.
    • No exclusion elsewhere. The 1997 section has no "cafeteria", "salary reduction", "premium" or "health insurance" text, so nothing takes salary-reduction premiums out of AFDC wages.
    • CTS Handbook 3.2.1.2.2, p. 31: "This test looks at gross deemed, earned, and unearned income before applying any disregards". 3.2.1.2.3 lists the net-test deductions: the $90 work expense, dependent care, the $30 and one-third, and child support paid. None is a premium deduction, and the Handbook has no "pre-tax", "cafeteria" or "payroll deduction" text.
  • The 49.77 parts follow SSI, so they need no change.

    • Wis. Stat. 49.77:
      • (2)(a)2: "Any needy person or couple residing in this state and receiving benefits under federal Title XVI."
      • (2)(a)3, for the grandfathered group that isn't modeled, uses "income, after deducting income excludable under federal Title XVI".
      • (5): "In determining the amount of aid to be granted a person applying for supplemental payments under this section, income shall be disregarded to the extent allowed by federal regulations."
    • DMS Operations Memo 26-12. Page 1: "If someone gets a federal SSI payment, they also get a state-funded supplementary SSI payment". Page 2: "Everyone who qualifies for federal SSI payments of any amount automatically gets the maximum state payment." SSI-E "is added to their state supplement".
    • The code. wi_ssp_eligible.py gates on (ssi > 0) | receives_ssi. wi_ssp_regular and wi_ssi_e pay flat rates under that gate and read no wages. So a pre-tax premium reaches them only through federal SSI eligibility, which follows POMS SI 00820.102 C.2, as 49.77(5) requires. This is the Iowa pattern for these two parts.
  • Workers with pre-tax premiums, traced by hand (2026-01; Dane County, Area I; gross limits 576, 1,018 and 1,197 and net limits 311, 550 and 647 for groups of 1-3; regular rate 83.78). No local run was needed, because CI ran both cases green at this head.

    • Case 54. This is Handbook Buening Example 2. Mary receives SSI 994. Jill (10) has survivors benefits of 2,400 a year. Tim (8) is the child of Mary and Dan. Dan (40, not on SSI) earns 8,400 a year with 1,200 of pre-tax premiums.
      • Dan's gross earned income is 8,400 / 12 = 700, and his net is 700 − 90 = 610. Jill's gross and net are 2,400 / 12 = 200.
      • Buening: Tim and Dan's gross is 700 ≤ 1,018, but their net of 610 > 550, so they are not needy and leave the unit.
      • Jill alone: gross 200 ≤ 576 and net 200 ≤ 311, so Mary gets 275, and wi_ssp is 83.78 + 275 = 358.78.
      • The old head used 600 − 90 = 510 ≤ 550, which kept them in. The group's net of 510 + 200 = 710 > 647 then paid 0.
    • Case 55. The same household, with Dan earning 7,200 a year and the same premiums.
      • Dan's gross is 600, and his net is 510 ≤ 550, so Tim and Dan are needy and stay.
      • Group of 3: gross 200 + 600 = 800 ≤ 1,197, but net 200 + 510 = 710 > 647, so 0. wi_ssp is 83.78.
      • The old head used a net of 410 + 200 = 610 ≤ 647 and a gross of 700 ≤ 1,197, so it paid 275.
    • A working teen on the path without parent IDs (not a PR case). Mary receives SSI and lives with two non-SSI children, 5 and 17, in Area I. The 17-year-old hasn't received CTS in the last four months and earns 680 a month, with 60 of it pre-tax premiums.
      • Rule: gross 680 ≤ 1,018, but net 680 − 90 = 590 > 550, so 0.
      • Old head: net 620 − 90 = 530 ≤ 550, so 275 + 165 = 440.
      • The new head gives the rule's 0. The code path is the same with or without parent IDs, because a single SSI parent has no Buening subgroup.
  • Every new expectation, checked by hand:

    • Case 54: wi_cts_gross_earned_income [0, 0, 0, 700], wi_cts_gross_income [0, 200, 0, 700], wi_cts_net_income [0, 200, 0, 610], wi_cts [275, 0, 0, 0], wi_ssp [358.78, 0, 0, 0].
    • Case 55: [0, 0, 0, 600], [0, 200, 0, 600], [0, 200, 0, 510], [0, 0, 0, 0] and [83.78, 0, 0, 0].
    • The zeros. Mary's SSI is an input and not CTS income. Jill, Tim and Dan aren't aged, blind or disabled, so they get no SSI and no state payment. Dan's premiums deem to nobody, because no one in the household is his SSI spouse or SSI child.
  • Merge resolutions (2be1699f21; git show --remerge-diff). There are five hand-resolved files; each keeps both sides.

    • household_state_benefits.yaml. In the 2023 block, main's va_ag is kept after va_child_care_subsidies, then # Wisconsin benefits / wi_ssp, then main's # Wyoming benefits / wy_ssp. In the 2024, 2025 and 2026 blocks, wi_ssp sits after wv_child_care_subsidies and before main's wy_ssp.
    • HUD annual_income/sources/unearned.yaml. Main's nj_ssp through va_ag are kept, including mt_ssp, ok_ssp, ny_ssp, ri_ssp, sd_ssp and nc_sa_countable_for_hud. wi_ssp_countable_for_hud follows va_ag, once, with its comment.
    • SNAP income/sources/unearned.yaml. wi_ssp_countable_for_snap sits between wa_ssp and main's wy_ssp, once, in alphabetical order.
    • programs.yaml. Main's New Jersey through Virginia entries are kept, and Wisconsin's entry follows Virginia, once, with the round-2 notes unchanged. It stays in the SSI state-supplement list; CI's registry tests pass ssi_state_supplement/WI/Wisconsin SSP.
    • spm_unit_benefits.py. "nj_ssp" through "va_ag" are kept, and "wi_ssp" follows "va_ag", once.
    • Overall.
      • Against the merge base 1f678c72cd, the five shared lists differ only by Wisconsin's lines: 4 in household_state_benefits.yaml and 1 in each of the other four.
      • In every list, each sibling's count matches main and the merge base: nj_ssp, pa_ssp, wy_ssp, nc_sa (nc_sa_countable_for_hud in HUD), nv_oss, mt_ssp, ok_ssp, ny_ssp, ri_ssp, sd_ssp and va_ag. So do the NJ, PA, WY, NC, NV, MT, OK, NY, RI, SD and VA entries in programs.yaml; WI goes from 2 entries to 3.
      • The second merge, 31a3902c13, had no hand-resolved files (its remerge diff is empty).
      • Against the merge base, the whole PR is +5,229/−1. The one deletion is the W-2 line in wi_works_eligible.py that round 2 reviewed.
  • What the merges bring in for Wisconsin's SSP. From main, the only SSI income change is military_retirement_income in SSI's unearned sources. It reaches wi_cts_gross_income through ssi_unearned_income, and AFDC also counted retirement pay as unearned income. No test sets it, and no Wisconsin SSP expectation changes. Main's newer Wisconsin commits touch only the income tax.

  • The NH Add New Hampshire state supplementation for 2026 #10156 check: nothing found.

    • wi_cts_gross_earned_income is an ungated float, used only in sums and differences. Its one parameter read, gov.ssa.ssi.income.sources.earned, is a list read by attribute, and add reads three ungated federal inputs.
    • This round adds no parameter and no keyed lookup. The existing lookups are scales read with .calc(size) and lists used with np.isin, as round 2 found, and round 2's two-state probe (a Minnesota family beside the Buening household: all zeros, no error) still applies.
  • Microsimulation (the default rule for population effects).

    • What pays. The regular supplement pays to Wisconsin SSI recipients through SSI take-up, at the flat rates.
    • What doesn't. SSI-E needs wi_ssi_e_certified, which defaults to false, so it pays 0 by default. The registry says "certified Exceptional Expense".
    • The CTS pays on the path without parent IDs. Parenthood comes from own_children_in_household, a family with any non-SSI parent has no eligible child, and one SSI parent gets the whole award. The registry notes and the body say so, and round 2 accepted them.
    • What changes this round. On that path, the only non-SSI earners in a CTS unit are the children. So the gross-wage count reaches microsimulation only through working children with pre_tax_health_insurance_premiums in the data. It moves them toward the rule, as in the teen trace above.
    • Cost. The new add reads three cached inputs. The Microsimulation job took 40m28s, against 42m07s and 42m01s for the New Hampshire and Vermont runs started in the same minutes, so nothing here is Wisconsin-specific.
  • The source-conflict guard (Tie source-conflict markers to the register shared with Axiom #10287).

    • Why the rewording was needed. The old comment began "# Source conflict:". On a tree with Tie source-conflict markers to the register shared with Axiom #10287, that starts like a marker but names no registered entry, which fails invariant 2.
    • The new wording is accurate and needs no register entry. It reads "HUD annual income follows 24 CFR 5.609(b)(19), which excludes this SSI-E, although SSI-E Handbook 4.1.1 lists SSI-E as countable." The guard's docstring registers choices "When a statute conflicts with a regulation, form, instructions, manual or stated agency practice". This NOTE sets a regulation against a state handbook, so it needs no register entry and no candidate. The formula is unchanged, and round 2 accepted the reading.
    • CI on this head. The marker tests pass, and the ratchet's grown set has no Wisconsin file. Neither the reworded NOTE nor the new NOTE in wi_cts_gross_earned_income.py adds to it.
    • On the tree merged with main. Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334 only adds the five Florida and South Dakota files to KNOWN_UNMARKED, and main hasn't changed source_conflicts/ since the merge base. So the merged tree passes too.
  • The PR body.

    • The Caretaker Supplement bullet now says "Wages count before payroll deductions, so pre-tax health premiums stay in the income tests and the care cap (45 CFR 233.20(a)(6)(iii)-(iv), 1997 edition; CTS Handbook 3.2.1.2.2). Federal SSI still excludes them (POMS SI 00820.102 C.2)."
    • Its "102 Wisconsin YAML cases (55 ..., 17 ..., 13 ..., 10 ... and 7 new ...)" matches CI's Quick Feedback (55, 17, 13, 10 and 13 passed, the last being 7 new W-2 cases plus 6 existing ones).
    • The axiom line is unchanged.
  • Batch cross-cutting checks (one line each):

    # Check Verdict
    1 Axiom line Valid, rulespec-us#1788 queued; see below
    2 House-template descriptions Unchanged since round 2; all follow it (this round adds no parameter)
    3 Backdating Documented deferral (round-1 Suggestion 1, accepted); verified years stay 2026
    4 tx_rebate.py copy 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
    5 Aggregate wiring Complete: Wisconsin appears once in each list (4 year blocks); no double count with ssi
    6 Income attribution CTS wages now count gross for the co-parent and earning children; pinned by Cases 54 and 55. The 49.77 parts follow SSI receipt
    7 Sibling conflicts Branch note only (see Branch status)
    8 CI Two known failures caused by main, no Wisconsin file (see CI status)
    9 State law The fix re-checked against 49.775(2)(c), 45 CFR 233.20(a)(6)(iii)-(v) (1997), Handbook 3.2.1.2.2-3, and 49.77(2)(a) and (5) with Memo 26-12
  • Unchanged since round 2 and still correct:

    • the regular and SSI-E rates and the May 2026 increase;
    • the CTS filing unit, the Buening test, the care cap and the inputs;
    • the W-2 exclusion;
    • the SNAP and HUD wiring;
    • the changelog fragments changelog.d/wi-ssp-2026.added.md and wi-ssp-2026.fixed.md (top-level).

    The PR touches no partner test files, and Household API Partners passes.

Axiom line assessment

Valid: axiom: Wis. Stat. 49.77; Wis. Stat. 49.775; Wis. Stat. 49.145(2)(i); DMS Operations Memo 26-12; CTS Handbook P-23131 TheAxiomFoundation/rulespec-us#1788 queued.

  • Issue state.
    • Correct MO social security deduction calculations #1788 is open and labelled pe-parity. It was last updated on 2026-10-21 at 04:58 UTC, after the head was committed (04:53 UTC).
    • rulespec-us main (5796861e58, 2026-10-20) still has no module for it: us-wi/ holds only policies/. A search for "Caretaker Supplement" still finds no other issue. So queued is still the right form.
  • Dispatch-ready, with the round-2 additions.
    • Module paths. The co-cited AFDC row now lists "45 CFR 233.20(a)(3)(xiii), (a)(6)(iii)-(v), (a)(11)(i) (1997)", with the ingest URL.
    • Verbatim law. It quotes (a)(6)(iii), (iv) and (v)(B) and Handbook 3.2.1.2.2. Each matches the PDFs.
    • Required outputs. A new "CTS gross earned income" output reads "Wages before any payroll deduction (pre-tax health premiums included) plus self-employment profit, with the total floored at 0". The "CTS net income" output starts from it.
    • Companion tests L and M derive Cases 54 and 55 from the rules (275 and 0).
    • The interpretation "CTS wages count before payroll deductions" cites (a)(6)(iii)-(iv), 49.775(2)(c), Handbook 3.2.1.2.2 and POMS SI 00820.102 C.2.
    • The conflicts comment is unchanged. Ziming's reason holds: POMS governs the federal payment and AFDC governs CTS, so the two don't conflict.
  • Matches the head, including the 17 / 10 / 55 / 13 SSP case counts and W-2 Cases 7-13.

CI status

25 pass, 2 fail, 0 pending (gh pr checks 10173, rechecked at the end of the review). The run is 39546503693 (pull_request) on head 31a3902c13; it started 2026-10-21 04:53 UTC and finished 08:43 UTC.

  • The two failures are the known ratchet failure caused by main, not a finding.
    • "Full Suite - Rest (Python, shard-1 + variables)" fails one test: 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 Wisconsin file is among them.
    • "Full Suite - Rest (Python + variables)" passes all its own tests (60, 55, 1,768 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 all five Wisconsin files: wi_works_eligible.yaml 13, integration.yaml 10, wi_cts.yaml 55, wi_ssp.yaml 17 and wi_ssp_countable_for_hud.yaml 13, all passed.
    • The rest. All 11 Baseline shards, all 9 Contrib shards, Microsimulation, Household API Partners, Package and compatibility, and PR validation pass.
    • Wisconsin-relevant tests in the shard-1 log pass:
      • the program registry (ssi_state_supplement/WI/Wisconsin SSP status, variable and prefix);
      • the aggregate-list integrity tests (defined members, state gating, no silent removals between year blocks);
      • the unemployment-reader guard;
      • the source-conflict marker tests.
  • 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 CTS wage-count item is fixed. wi_cts_gross_earned_income counts gross wages per 49.775(2)(c) and 45 CFR 233.20(a)(6)(iii)-(iv), while the 49.77 supplement and SSI-E correctly follow SSI. Cases 54-55 hand-check. All five hand-resolved merge blocks keep every sibling's line. The two red checks are the known FL/SD LIHEAP ratchet failure from before #10334, so merge main and re-run. Nothing else is open. Full report in the comment above.

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 a582646 into main Oct 22, 2026
27 checks passed
@hua7450
hua7450 deleted the wi-ssp-2026 branch October 22, 2026 05:12
MaxGhenis added a commit that referenced this pull request Oct 22, 2026
Main's #10173 (Wisconsin state supplementation for 2026) changed Wisconsin files; the merge is clean.

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