Skip to content

Add Iowa state supplementation for 2026 - #8017

Open
hua7450 wants to merge 38 commits into
PolicyEngine:mainfrom
hua7450:ia-ssp
Open

hua7450 wants to merge 38 commits into
PolicyEngine:mainfrom
hua7450:ia-ssp

Conversation

@hua7450

@hua7450 hua7450 commented Apr 16, 2026 •

Copy link
Copy Markdown
Collaborator

What and why

Iowa's State Supplementary Assistance was missing from PolicyEngine-US. Add ia_ssa for 2026 under Iowa Code 249.3, 441 IAC 51.7, 52.1 and chapter 177, POMS SI 01415.058 F and the Iowa HHS Employees' Manual 6-B (revised May 22, 2026). It covers the blind, dependent-person, family-life home, residential care, in-home health-related care and Medicare-and-Medicaid (SMME) supplements.

Refs #7733.

  • Who administers and funds it (6-B p.6; Iowa Code 249.2): Iowa funds every supplement and reimburses SSA for the ones SSA pays.

    • SSA pays the blind supplement, and with Iowa certifying eligibility, the dependent-person and family-life home supplements. ia_ssa_federal computes these rows with the shared state supplement helper, then applies SSA's rounding and $1 minimum after splitting a couple's amount between its recipients.
    • Iowa pays residential care, in-home health-related care, SMME and the $20 family-life home top-up. These amounts aren't rounded.
  • 2026 levels:

    Supplement Paid by 2026 amount Source
    Blind SSA $22 a month for each blind recipient 441 IAC 52.1(4); 6-B p.20; POMS F.2 code A
    Dependent person SSA $518, once per recipient or couple. The total income limits are $1,512, $1,534 for a blind client, $2,009 for a couple, $2,031 for a blind client with an aged or disabled spouse, and $2,053 for two blind spouses 6-B pp.24, 26; POMS code C
    Family-life home SSA, plus $20 from Iowa Standard $1,156, which is the $994 SSI rate plus $162. SSA pays up to $142 (the $162 less SSI's $20 exclusion), or $801 for a couple. Iowa adds $20 when SSI is the recipient's only income 6-B pp.30, 34-35; POMS code D
    Residential care Iowa The $38.47 maximum daily rate, or a lower facility rate when one is entered, times covered days, less income above the $130 personal needs allowance (plus the SSI rate in a month of entry from home) 6-B pp.61-64, 72; 441 IAC 51.4(3), 52.1(3)
    In-home health-related care Iowa The approved cost, up to $480.55 per recipient, less income above the $994 home maintenance allowance ($1,491 with a spouse) and each SSI-ineligible child's $497 allowance, net of the child's income 6-B pp.41-44; 441 IAC 177.2(1)"f", 177.8(2)
    SMME Iowa $1 a month 441 IAC 52.1(7); 6-B p.78
  • Payment:

    • SSA-paid rows: the supplement less countable income above the federal benefit rate (FBR). A blind person also gets $22 alongside residential care or in-home care. 6-B pp.20 and 42 leave the $22 out of care participation, and POMS F.1 code A covers a blind recipient outside SSA's other Iowa variations. 441 IAC 52.1(4) reads otherwise (source conflicts below).
    • Residential care and in-home care: "client participation" uses SSI countable income without the $20 exclusion, plus the SSI payment (6-B pp.42, 59). Interest and dividends are excluded (20 CFR 416.1124(c)(22); Manual 8-E pp.23, 36). It's applied to the cost of care.
      • In-home care costing more than $480.55 makes the person ineligible (6-B p.41).
      • A first in-home month that is less than a full month has no participation and pays for the days of service (441 IAC 177.8(2)"b").
      • Residential care pays the covered days entered for a partial month (441 IAC 52.1(3)"b").
      • In the month a resident enters from home, income up to the SSI rate for one person, or for a couple when a spouse lived at home, isn't applied to the cost of care (441 IAC 52.1(3)"a"(6); 6-B pp.63-64). ia_ssa_care_initial_partial_month marks that month.
      • A resident and an eligible spouse are budgeted as a couple only in the month of entry, and only when either spouse received SSI or both enter that month (6-B pp.60-61; 441 IAC 51.4(3)). ia_ssa_rcf_couple_budget marks that month. From the next month, a married resident's care income is own income plus the SSI individual amount computed from it, as SSA then pays each spouse as an individual (6-B pp.61, 68-71), and the resident's resources are tested alone (6-B p.12).
    • Family-life home: SSA's amount, plus the $20 top-up when SSI is the only income (6-B p.35). Interest and dividends don't count as other income (20 CFR 416.1124(c)(22)). The couple's top-up is shared.
    • SMME: $1 when the coverage input is set, countable income is at least 120% of the poverty guideline for the recipient and any spouse, and no SSA-paid supplement is paid (Iowa Code 249.3(4)(g); 441 IAC 51.7(3), (6); 6-B pp.76-77). An eligible couple's incomes are combined. A disabled person working above the SGA level, whom SSI doesn't count, is budgeted on own income after SSI's exclusions.
  • Who qualifies:

    Requirement Source How modeled
    Aged, blind or disabled under SSI definitions; for SMME, aged or disabled 6-B p.10; Iowa Code 249.3(4)(a) is_ssi_aged_blind_disabled in ia_ssa_nonfinancial_eligible, or is_ssi_aged or meets_ssi_disability_criteria for SMME, since SMME disability ignores substantial gainful activity (Iowa Code 249.3(4)(a)(2); 441 IAC 51.7(2); 6-B p.10)
    Receives SSI, or would except for excess income Iowa Code 249.3(2)(b), (3)(b); 6-B pp.6, 8 The categorical, resource and citizenship tests follow SSI. Payments use Iowa's budgets, so people over the SSI income limit can be paid
    Must apply for SSI "if they might be eligible" 6-B p.10 takes_up_ssi_if_eligible or uncapped_ssi <= 0. An applicant whose income would qualify for SSI must take it up; an applicant over income needn't
    U.S. citizen or qualified noncitizen 6-B pp.10-12 immigration_status or is_ssi_qualified_noncitizen
    Not an inmate 6-B p.8 ("all SSI eligibility criteria except for the income limit") is_incarcerated bars
    Resources of $2,000, or $3,000 for a couple living together, counting the spouse. A residential care resident is tested alone after the month of entry. A child adds parental resources above $2,000 for one parent or $3,000 for two; for an SSI recipient, Iowa accepts SSA's determination 6-B pp.9, 12, 60; 20 CFR 416.1202 The federal limits and ssi_countable_resources, plus ia_ssa_resources_deemed_from_parents. That variable uses main's _ssi_parental_resource_pool, so a co-resident stepparent's resources are deemed, and deems only to a child SSA would deem to (is_ssi_resource_deeming_child). ia_ssa_has_spouse identifies the spouse
    Certified dependent-person household, family-life home, residential care facility, in-home care plan or SMME coverage 6-B pp.24, 34, 41, 59, 76 ia_ssa_category input
    Lives in Iowa 6-B p.10; 441 IAC 51.6 defined_for = StateCode.IA
  • Children in in-home care (6-B pp.46-49; 441 IAC 177.2(1)"g"): the manual says "do not rely on SSI deeming calculations for children". ia_ssa_income_deemed_from_parents therefore deems parental income by the Iowa method:

    • Earnings only: less $65 and twice the parents' SSI allowance.
    • Earned and unearned: $65 and one-half of the remaining earnings, then the allowance.
    • Unearned only: less the allowance.
    • In every case, the result is also reduced by $497, less the sibling's own income, for each ineligible sibling.
    • The deemors are the co-resident parents and their spouses. A parent who receives SSI isn't one.
    • One-third of child support from an absent parent is excluded (6-B p.49).
  • Couples:

    • Blind spouses get $22 each.
    • The dependent-person supplement is paid once per couple, $259 each. Certifying either spouse applies the couple level.
    • A family-life home couple gets $801 plus a shared $20, $410.50 each.
    • In-home care counts the spouse's income, gives the $1,491 couple allowance "even if only one spouse receives in-home health-related care", and allows one $65 and one-half exclusion per household.
    • SMME compares an eligible couple's combined income with the two-person poverty guideline.
    • Residential care couples are budgeted together only in the month of entry, as described under Payment.
    • Spouses are identified with SSI's spouse test (ia_ssa_has_spouse). Without explicit marital units, a parent isn't paired with an adult child the parent claims, and a default unit of three or more people budgets each member alone.
  • COLA: 441 IAC 52.1 adjusts the assistance standards each January 1 for SSA's COLA but publishes no method.

    • The family-life home standard and couple amount follow the FBR: $1,191 and $818 in 2027.
    • So do the in-home home maintenance allowances.
    • The $130 personal needs allowance rises by the SSI COLA under Iowa Code 249.9A(1), to $135 in 2027. Rounding to the nearest dollar is inferred from General Letters 6-B-45 to 6-B-47 ($123, $126 and $130).
    • The $38.47 daily maximum is set through appropriations (Iowa Code 249.12(3)), so 2027 carries it as a frozen projection. The $518 dependent-person amount also stays at its 2026 value (parameter NOTEs).
    • The $22, $480.55 and $1 amounts are set in rule text.
  • Inputs: all are Person and monthly, and all default to 0, false or REGULAR.

    • ia_ssa_category records the certified arrangement. NONE excludes the person, including from the blind supplement.
    • ia_ssa_dependent_countable_income, ia_ssa_ihhrc_monthly_cost and ia_ssa_rcf_daily_rate carry forward until changed. ia_ssa_rcf_daily_rate is only for a facility rate below the maximum; 0 pays the maximum.
    • ia_ssa_smme_coverage_eligible is full Medicaid without a spenddown or premium, plus Medicare Part B.
    • ia_ssa_care_partial_month_days (0 is a full month), ia_ssa_care_initial_partial_month (a first in-home month, or the month of entry to residential care from home) and ia_ssa_care_additional_deductions are one-month entries. They have zero formulas, so an entry stays in its month.
    • Impairment-related work expenses for residential care are entered in ia_ssa_care_additional_deductions at one-half for a resident without SSI, because that input is subtracted after the one-half earnings exclusion (441 IAC 52.1(3)"a"(1)). An SSI recipient enters none, because SSA's payment already offsets them (6-B p.59). A deduction a couple shares is entered on one spouse.
    • Entering partial days for one resident leaves another resident's full month unchanged (Cases 32 and 33).
  • Source conflicts: where the sources disagree, the model follows the manual, except for the residential care rate and entry month, where it follows the rule. For SMME income and SMME for a blind person under 65, it follows the Iowa Code, under PolicyEngine-US's statute-first rule (CONTRIBUTING.md, "Source conflicts", merged with Tie source-conflict markers to the register shared with Axiom #10287). Both are listed in source_conflicts/candidates.yaml (us-ia:smme-income-at-least-120-percent, us-ia:smme-blind-under-65) until they are registered. For a dependent's income of exactly $518 and the in-home dependent allowance, the rule agrees with the reading taken. The in-home cost ceiling is no longer a conflict. The rulespec-us issue's conflicts comment quotes each side.

    • The blind dependent-person couple: the manual's $2,031 (a $540 supplement) is used, not POMS's $2,053 for Aged/Blind (code NOTE).
    • The in-home cost ceiling (resolved): the manual makes care costing more than $480.55 ineligible, and 441 IAC 177.9(4) agrees: it ends in-home care when "the cost of care exceeds the maximum" (its cross-reference to 177.9(3) should read 177.8(3)). The IAC 2/5/25 edition has the same rule at 177.11(4), so this holds before and after ARC 0460D (effective October 1, 2026).
    • All-earned parental income: the manual deducts $65; 177.2(1)"g"(1) doesn't.
    • SMME income: 441 IAC 51.7(6) and the manual require income that "exceeds" 120% of the poverty guideline, where Iowa Code 249.3(4)(g) says "at least". The model follows the statute: Case 44 (exactly 120%) pays 1, and Case 45 (one cent below) pays 0 (code NOTE).
    • A dependent's income of exactly $518: 6-B p.24 excludes only income "more than $518", while p.25 and 441 IAC 51.5(1) require "less than".
    • The residential care rate: 441 IAC 52.1(3) says payment "will be based on the maximum per diem rate" from July 1, 2017, and 51.4(3) tests income against "31 times the maximum per diem rate". 6-B p.72 still describes "two options": a facility rate up to $38.47, or a flat $17.86. The model pays the $38.47 maximum unless a lower facility rate is entered (code NOTE).
    • The blind $22 with a care supplement: 441 IAC 52.1(4) sets $22 for "a blind recipient not receiving another type of state supplementary assistance". 6-B p.20 treats the blind supplement as received "simultaneously" with the residential care supplement, p.42 leaves it out of in-home participation, and POMS F.1 code A excludes only SSA's own Iowa variations. The model follows the manual and POMS (code NOTE).
    • The residential care entry month: 441 IAC 52.1(3)"a"(6) and 6-B pp.63-64 deduct the SSI rate for one person, or for a couple when a spouse lived at home. Later on p.64, the manual lets clients "keep enough of the first month's income to meet maintenance or living expenses from the previous living arrangement", up to the SSI standard. The model deducts the fixed SSI rate (code NOTE).
    • SMME for a blind person under 65: Iowa Code 249.3(4)(a) names a person "Sixty-five years of age or older" or "Disabled as defined by 42 U.S.C. §1382c(a)(3)". 441 IAC 51.7(2) requires "all eligibility requirements for supplemental security income benefits other than limits on substantial gainful activity and income", and 6-B pp.10 and 76 include blindness. The model follows the statute, so Case 72, a blind 50-year-old who isn't disabled, pays 0, and Case 76, a blind 50-year-old who is disabled, pays 1 (code NOTE).
    • The in-home sibling allowance in child deeming: 441 IAC 177.2(1)"g"(1)2 allows "The amount of the basic SSI standard for a dependent for each ineligible child in the home". 6-B pp.47-49 allow a "maximum of $497 per child" and say "Subtract any income of the dependent from the maximum deduction". The model follows the manual (code NOTE).
    • The in-home dependent allowance: the 6-B p.42 bullet gives the couple allowance "if there is a spouse living with the client or a dependent living with an eligible person". 441 IAC 177.2(1)"f"(3) applies "Any income of the dependent ... to the dependent's needs before making this disregard", and p.43 says "Subtract a dependent's income". The model follows the rule and p.43 (code NOTE).

The supplement is added to household_state_benefits (all four year blocks, under a new # Iowa benefits comment) and to spm_unit_benefits. SNAP and HUD count it through ia_ssa_countable_for_snap and ia_ssa_countable_for_hud, which leave out the in-home care payment:

  • Iowa's SNAP manual 7-E says "Exclude State Supplementary Assistance payments made for in-home health-related care as a reimbursement" (7 CFR 273.9(c)(5)).
  • HUD excludes it under 24 CFR 5.609(b)(6) and (b)(19).
  • The blind, dependent-person and family-life home amounts paid alongside it stay countable.

Files:

policyengine_us/parameters/gov/states/ia/hhs/ssa/              blind_amount, dependent_amount, excluded_unearned_sources, family_life_supplement,
                                                               ihhrc_cost_limit, rcf_daily_limit, rcf_personal_needs, smme_amount, smme_minimum_fpg_rate
policyengine_us/variables/gov/states/ia/hhs/ssa/               ia_ssa, ia_ssa_eligible, ia_ssa_nonfinancial_eligible, ia_ssa_federal,
                                                               ia_ssa_care_countable_income, ia_ssa_rcf_couple_budget, ia_ssa_has_spouse,
                                                               ia_ssa_income_deemed_from_parents,
                                                               ia_ssa_resources_deemed_from_parents, ia_ssa_ihhrc_participation,
                                                               ia_ssa_ihhrc_amount, ia_ssa_smme_countable_income,
                                                               ia_ssa_countable_for_snap, ia_ssa_countable_for_hud, and the eight inputs above
policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/   ia_ssa, integration, ia_ssa_resources_deemed_from_parents,
                                                               ia_ssa_nonfinancial_eligible, ia_ssa_income_deemed_from_parents

Shared files:

  • household_state_benefits.yaml gains one Iowa entry per year block.
  • SNAP and HUD income/sources/unearned.yaml and spm_unit_benefits.py each gain one Iowa entry.
  • The programs.yaml Iowa entry changes from in_progress to partial.
  • source_conflicts/candidates.yaml gains the two SMME statute-conflict entries.
  • Federal parameter: gov/ssa/ssi/income/exclusions/child_support_share.yaml, the one-third exclusion of 20 CFR 416.1124(c)(11), came to main with Add Oklahoma state supplementation for 2026 #10165. This PR leaves it as on main.
  • Parental resource and income deeming import main's _ssi_parental_resource_pool, and ia_ssa_has_spouse imports SSI's _ssi_spouse_index. The shared state supplement helper and minimum_payment.yaml are unchanged.

References

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

Coverage limits

The registry marks Iowa as partial, verified for 2026. The levels were checked against the May 22, 2026 manual pages, 441 IAC 52.1 and POMS SI 01415.058 F.2 in October 2026.

Not modeled:

  • the mandatory minimum-income-level supplement for December 1973 recipients and their essential persons (441 IAC 52.1(6); Iowa Code 249.3(1)), and conditional benefits;
  • continued dependent-person and family-life home payments for up to three months of temporary institutionalization (6-B p.11). A resident of a medical treatment facility gets no SSA-paid supplement;
  • for an SMME applicant working above the SGA level, a spouse's income and income deemed from a spouse or parent. The model counts that person's own income only (code NOTE);
  • first-month spouse deeming in residential care, Medicaid-category deductions for SMME and state-only sibling eligibility (variable documentation);
  • the unmet medical needs of parents and ineligible children in in-home child deeming (code NOTE). The recipient's own deductions can be entered through ia_ssa_care_additional_deductions.
  • for SMME with a spouse who isn't aged, blind or disabled, the spouse income that SSI doesn't deem, although the guideline is for two people (code NOTE);
  • the dependent's own resources (441 IAC 51.5(2)), which the DEPENDENT_PERSON certification covers;
  • the joint budget of a couple in the residential care entry month (6-B p.70, Mr. W). The model splits an eligible couple's care income and the couple rate equally between the spouses; a dependent's allowance can be entered through ia_ssa_care_additional_deductions;
  • a spouse who enters residential care after the other spouse's month of entry. That spouse deducts the SSI couple rate in the entry month, and gets the couple budget when either spouse received SSI, while the spouse already in the facility stays on the individual budget. 441 IAC 51.4(3) and 6-B p.61 address spouses who enter together, and 52.1(3)"a"(6) gives the couple rate for a spouse living in the home, so the sources don't settle this case;
  • after the month of entry, the spouse at home is still tested with the resident's resources, because federal SSI keeps the couple (code NOTE);
  • an RCF child under 16, who needs written approval (6-B p.55), and the reserve bed-day limits of 30 visitation days a year and 20 hospital days a month (441 IAC 52.1(3)"e"-"f"). The covered-days input takes the authorized days;
  • the dependent-person rule that income based on need gets no $20 disregard (6-B p.26);
  • SMME couple resources by Medicaid group. The model uses SSI's spouse rule.

When one of two co-resident parents receives SSI, the in-home child deeming keeps the two-parent allowance. The Iowa sources don't address this case; SSI's parental allocation counts only ineligible parents. The model applies SSI's $65 and one-half exclusions to an in-home care child's own earnings; whether 441 IAC 177 allows them wasn't verified.

Microsimulation and model limits:

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

Related:

Test plan

  • 106 Iowa supplement YAML cases (77 in ia_ssa.yaml, 12 in integration.yaml, 7 in ia_ssa_resources_deemed_from_parents.yaml, 6 in ia_ssa_nonfinancial_eligible.yaml, 4 in ia_ssa_income_deemed_from_parents.yaml) pass locally in one policyengine-core run on this branch merged with main at 328d172. They cover:
    • each supplement and its boundaries:
      • dependent income at the $518 limit, and group income one cent below, at and over the standard;
      • the family-life home top-up with SSI only, with interest only, with $10 of other income and with earnings, plus SSA's amount without federal SSI;
      • residential care in 31- and 28-day months, the rate cap, the maximum rate when no facility rate is entered, a lower facility rate, participation equal to the month's cost, deductions, impairment-related work expenses for a resident without SSI, the month of entry from home (alone or with a spouse), negative self-employment income and interest, which care income excludes;
      • in-home care at and one cent above $480.55, the manual's Ms. A and Mr. B examples, its working-spouse household with two children (the $497 child allowance) and the first partial month;
      • SMME at, and one cent below, 120% of the poverty guideline, and couples whose combined income is well above, $2 above (with one spouse covered) or $2 below the two-person guideline, and a blind applicant under 65 who isn't disabled and one who is, and a disabled applicant working above the SGA level (Case 77);
    • the blind supplement alongside care, its absence in a medical facility, SSA's rounding up to the cent and $1 minimum, and SMME not stacking with it;
    • resources, including the $3,000 couple limit for an in-home recipient with an ineligible spouse, parental deeming with a co-resident stepparent, the manual's Child A example, a blind SSI child exempt from parental deeming, and the sibling allocation;
    • the manual's four parental income deeming examples and its child support example;
    • the age 65 boundary, incarceration, immigration status, no category, another state, declining SSI, and over-income applicants who need not take up SSI;
    • partial days entered for one resident (an in-home first month and a residential care discharge month), and one-month entries that don't carry into the next month;
    • couples: blind, dependent-person (including one spouse certified), the mixed blind dependent-person couple, family-life home, and in-home care with an ineligible spouse and one earnings exclusion;
    • residential care couples in and after the month of entry: the manual's Mr. K, Mr. B and Mr. A examples, spouses sharing a room, spouses entering together, and a resident's resources tested alone;
    • situations without marital units: an in-home care parent with a claimed adult child, and parental resources deemed to an in-home care child;
    • 2027 SSI rates with the FBR-linked family-life home standard and couple amount, and the personal needs allowance raised by the COLA;
    • the annual SNAP, HUD, household_state_benefits and spm_unit_benefits totals, with the in-home payment left out of SNAP and HUD income.
  • Consolidation: 12 cases were removed because each repeated a kept case's branch and outcome. By their numbers at the previous head (3b9e925), with the kept case: 2 (integration Case 8), 3 (67), 4 (4), 11 (64), 14 (14 and 33), 21 (32 and 16), 25 (35), 26 (32 and 34), 27 (integration Case 9), 30 (ia_ssa_nonfinancial_eligible.yaml Case 6), 32 (44) and 36 (26). Two cases now pin the operators. Case 45 has SMME income of 1,595.99, one cent below 120%, and pays 0, so with Case 44 (exactly 1,596, which pays 1) it brackets the statute's "at least". Case 71 has group income of exactly $1,512 (Social Security of $17,904 a year and $40 of dependent income), so it pays 0 under "less than" and would pay 40 under "not more than".
  • Local probes:
    • In one simulation with Iowa, Massachusetts, North Carolina and Virginia residents, only the Iowa residents get ia_ssa, and each household_net_income matches its single-state control.
    • An input entered for one person leaves the other person at their control value.
  • The aggregate list integrity and program registry tests pass locally (727 passed, 10 skipped).
  • ruff format, ruff check and git diff --check. The code-health tests' helper functions report no violations in the Iowa files; the code-health suite itself wasn't run.
  • Changelog fragment in changelog.d/.
  • CI passes. This includes the code-health tests, which weren't run locally.

axiom: Iowa Code 249.3, 249.9A(1), 249.12(3); 441 IAC 51.4(3), 51.5(1)-(2), 51.7(2), 51.7(6), 52.1(1)-(4), 52.1(7), 177.2(1)"f"-"g", 177.8(2), 177.9(4), and 177.4(1), 177.10(2) (IAC 2/5/25); 20 CFR 416.1124(c)(22); Iowa HHS Employees' Manual 6-B, 7-E, 8-E; POMS SI 01415.058 F TheAxiomFoundation/rulespec-us#1837 queued

hua7450 added 2 commits April 16, 2026 12:59
Adds Iowa SSA (Iowa Code Ch 249; IAC 441 Chs 50-52, 54, 177) covering:
- Blind supplement (flat $22/month)
- Dependent Person (DP) supplement (5 household configurations)
- Family-Life Home (FLH) supplement (max $142/month)
- In-Home Health-Related Care (IHHRC) supplement (cost-based, max $480.55/$961.10)
- Residential Care Facility (RCF) supplement (cost-related per diem)
- Supplement for Medicare and Medicaid Eligibles (SMME) (flat $1/month)

Closes PolicyEngine#7733
@codecov

codecov Bot commented Apr 16, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.16%. Comparing base (cc5bd64) to head (4a12735).
⚠️ Report is 3278 commits behind head on main.

Additional details and impacted files
@@             Coverage Diff             @@
##             main    #8017       +/-   ##
===========================================
+ Coverage   71.72%   98.16%   +26.44%     
===========================================
  Files        4658       16     -4642     
  Lines       67710      327    -67383     
  Branches      341        2      -339     
===========================================
- Hits        48563      321    -48242     
+ Misses      19140        6    -19134     
+ Partials        7        0        -7     
Flag Coverage Δ
unittests 98.16% <100.00%> (+26.44%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 14 commits April 17, 2026 16:32
- Verified $3,031 DP BLIND_WITH_AGED configuration against Iowa HHS; replaced typo comment with verification note
- Fixed 4 broken PDF page anchors (blind.yaml, SMME + DP docstrings)
- Added formulas to ia_ssa_has_full_medicaid / ia_ssa_has_medicare_part_b delegating to federal medicaid_enrolled / medicare_enrolled, making SMME reachable in microsim
- Added IAC 441-177.4(1)(c) own-home eligibility check to IHHRC category
- Extracted ia_ssa_ihhrc_both_need_care variable; removed hard-coded 2 duplicated in two files
- Reworked 5 non-functional ineligible tests to exercise ia_ssa_resources_eligible via ssi_countable_resources
- Added ia_ssa_resources_eligible.yaml with boundary coverage (single/couple x below/at/above)
- Added couple IHHRC test cases (at cap, above cap, one-spouse fallback)
- Expanded category priority from 4 to 11 cases (IHHRC/DP/BLIND/SMME pairings)
- Locked in blind combinability: blind RCF resident -> $0 blind supplement
- Documented IAC 441-52.1(4) mutual exclusivity in ia_ssa_blind_supplement docstring
- Consolidated test files to one-per-variable: merged integration_* and test_2025_to_2026_transition cases into variable-specific files with ssi + ia_ssa outputs side-by-side

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior formulas used `max(0, -uncapped_ssi) + ssi` as a proxy for total
monthly income. That expression equals `|FBR − countable_income|`, not
actual income, which caused material errors:

- RCF eligibility and client participation understated income for anyone
  with outside income below the FBR, overpaying the supplement by hundreds
  and classifying high-income residents as eligible.
- IHHRC cap (IAC 441—177.4(1)(f)) was compared against excess-over-FBR
  instead of monthly countable income, letting recipients with countable
  income far above the $480.55 cap qualify whenever they were below the FBR.
- DP and FLH phase-out (federally-administered per POMS SI 01415.050.F) did
  not use the federal SSP formula, paying the full cap in income bands where
  the supplement should phase down dollar-for-dollar.

Fixes:
- RCF and IHHRC (state-administered) use monthly SSI countable income +
  federal SSI payment as total income, matching IAC 441—52.1 rules.
- DP and FLH (federally-administered) use
  `max(0, total_standard − max(countable, FBR))`, matching POMS SSP rules.
- Delete unused flh.personal_needs_allowance parameter (dead code — FLH
  assistance standard is a lumped sum that already includes the allowance).
- Add regression tests for each bug.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…into ia-ssp

# Conflicts:
#	policyengine_us/parameters/gov/household/household_state_benefits.yaml
#	policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py
- Add IAC 441—51.7(6) 120% FPL income floor for SMME eligibility
- Restructure smme.yaml to smme/ folder (amount.yaml + minimum_income_fpl_multiplier.yaml)
- Remove documentation= field from 3 variables (not PolicyEngine convention)
- Fix days_multiplier.yaml description wording
- Update programs.yaml: Iowa SSA status in_progress -> complete, add variable=ia_ssa
- Rewrite tests with realistic income inputs (age, social_security_retirement) instead of bypass inputs (is_ssi_eligible, meets_ssi_resource_test, is_ssi_aged_blind_disabled); verify full federal-state chain
- Add boundary and negative cases (SMME 120% FPL boundary, IHHRC countable income cap, FLH phase-down)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
IHHRC (IAC 441—177.10(3) and 441—177.4(1)(f)):
- Maximum benefit payable is $480.55 per person, always — not $961.10
  per person when both need care. The $961.10 is the combined couple
  INCOME cap in 441—177.4(1)(f), not a payment cap.
- Income eligibility now compares combined marital-unit countable
  income against $961.10 when both spouses need care, and individual
  countable income against $480.55 otherwise.
- Updated parameter descriptions and tests; dropped the now-irrelevant
  441—52.1(5) reference on max_cost_couple (that subsection defers to
  Chapter 177, which sets the per-person payment cap at $480.55).

Blind (IAC 441—52.1(4)):
- Applied federally-administered SSP V-shape formula (like DP/FLH):
  max(0, FBR + state_standard - max(countable, FBR)). A blind recipient
  with countable income above $989 now correctly phases to $0 instead
  of receiving a flat $22 regardless of income.

Medicare Part B (IAC 441—51.7(4)):
- Documented that PolicyEngine's medicare_enrolled does not distinguish
  Part A from Part B. SMME statutorily requires Part B; using
  medicare_enrolled as the closest proxy, acknowledging Part A-only
  enrollees are not filtered out.

RCF eligibility PNA check reviewed and confirmed correct per statute:
441—51.4(3) compares "income according to 441—paragraph 52.1(3)(a)"
which already incorporates the PNA as disregard (2) before the
31 × max_per_diem threshold test. No change needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Blind (IAC 441—52.1(4)):
- Added income gate to BLIND category assignment that matches the
  federally-administered V-shape ceiling (FBR + state standard = $989).
  A blind person whose countable income exceeds $989 now falls through
  to the next applicable category (e.g., SMME if income is also above
  120% FPL) rather than being labeled BLIND with a $0 supplement.

Medicare Part B (IAC 441—51.7(4)):
- Converted ia_ssa_has_medicare_part_b to a pure input variable with
  default False. Previously the formula defaulted to medicare_enrolled
  (Part A and/or B), which pulled Part A-only enrollees into SMME.
  SMME is a $1/month program for a narrow dual-eligible population; a
  False default with explicit opt-in matches both the statutory
  requirement ("currently eligible for Medicare Part B") and the real
  caseload better than an overbroad proxy.

RCF eligibility PNA check re-verified: IAC 441—51.4(3) references "the
income according to 441—paragraph 52.1(3)(a)," and 52.1(3)(a) defines
"Income applied to meet the cost of care" as (countable + SSI benefit)
minus five disregards including the PNA (disregard 2). The current
code applies the PNA as the statute directs. No change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
IAC 441—51.4(3) compares "the income according to 441—paragraph
52.1(3)(a)" against 31 × max_per_diem. Section 52.1(3)(a) describes
two concepts: the gross income input (SSI countable + SSI benefit)
and the post-disregard "Income applied to meet the cost of care"
(client participation). The statute is textually ambiguous as to
which "the income" refers to, but:

- 31 × max_per_diem is approximately the monthly cost of RCF care at
  the maximum per-diem rate. Comparing gross monthly income against
  that cost is the meaningful substantive test — it excludes people
  who could afford care on their own income.

- Standard benefit-program convention uses gross income for
  eligibility tests, with disregards (including personal needs
  allowances) applied in the benefit amount calculation.

- Under the post-disregard reading, the test barely screens anyone
  out: income must exceed ~$1,292 (threshold + PNA + other
  disregards) to be ineligible at the 2025 per-diem rate, so the
  eligibility gate had almost no substantive effect.

Switched ia_ssa_category.py to compare total_rcf_income (pre-PNA)
against 31 × max_per_diem. The PNA remains in ia_ssa_rcf_supplement
where it belongs: reducing client participation in the payment
calculation.

Cross-verified against SSA POMS SI 01415.050.F: RCF is state-
administered by Iowa HHS, so this is a state policy interpretation,
not a federal SSP formula question.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The prior "2017-07-01" effective date was incorrect — those values were
copied from Iowa HHS's current web page (which shows 2025 values) and
backdated to 2017 without historical verification. Replaced with
properly sourced historical tiers:

- **2011-01-01**: SSA State Assistance Programs for SSI Recipients —
  Iowa (January 2011), Table 1. Provides frozen values ($22 blind, $142
  FLH aged max supplement, $480.55 / $961.10 IHHRC) and 2011 baselines
  for COLA-adjusted parameters.

- **2017-01-01**: Iowa Administrative Code 01-04-2017 supplement.
  Provides 441—52.1 dollar amounts (FLH $897, DP $1,114/$1,482/$1,136/
  $1,504/$1,526, RCF per diem $30.11, PNA $100) and 441—51.4(1)
  dependent-relative income limit $379.

- **2018-01-01**: Iowa Administrative Code 03-28-2018 rule update for
  441—52.1. Provides 2018 COLA values (FLH $912, DP $1,137/$1,512/
  $1,159/$1,534/$1,556, RCF per diem $30.60, PNA $99).

- **2025-01-01**: Iowa HHS General Letter 6-B-46 (effective January 1,
  2025). Corresponds to the values previously misdated 2017-07-01.
  Preserves test expectations at 2025-01 period.

- **2026-01-01**: Iowa HHS current State Supplementary Assistance
  Standards web page (unchanged).

SMME parameters (amount $1, 120% FPL multiplier) start at 2017-01-01 —
the program existed since October 1, 2003 but the SSA 2011 report does
not publish the $1 amount directly, so we cite only what we can verify.

DP dependent_income_limit and max_per_person_cap start at 2017-01-01
because the SSA 2011 report does not publish these specific Iowa-only
concepts; the 2017 IAC supplement is the earliest direct source.

All 73 Iowa SSA tests continue to pass at 2025-01 and 2026-01 periods.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- RCF income gate now compares post-PNA client participation against
  31 x max_per_diem per IAC 441-51.3(3) cross-ref to 52.1(3)"a"
- IHHRC income gate applies the SSI FBR disregard and checks combined
  marital-unit countable against the applicable cap symmetrically
- IHHRC payment subtracts client participation per IAC 441-177.10(2)(a),
  split evenly across marital-unit members
- DP dependent-income-eligible check moved into ia_ssa_category so a
  person with a disqualifying dependent falls through to BLIND / SMME
  instead of receiving a zero DP supplement
- Resource test sums marital-unit resources for joint SSI claims
- ia_ssa_has_full_medicaid converted to an explicit input with
  default_value=False, matching ia_ssa_has_medicare_part_b, so Medicaid
  pathways outside "full Medicaid" (spenddown, MEPD premium) do not
  trigger SMME
- Fix citation typos: SMME minimum_income_fpl_multiplier cites
  441-51.6(6); RCF days_multiplier cites 441-51.3(3) with unit /1 and
  period eternity
- Strengthen 2026 DP BLIND_WITH_AGED_OR_DISABLED_SPOUSE_AND_DEPENDENT
  comment documenting the +53.5% jump vs 2.85% COLA anomaly
- Add 2017 DP and 2018 RCF historical test cases; add DP fallthrough
  category test; update IHHRC and resources tests for new rules; remove
  obsolete sources/working_references.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…into ia-ssp

# Conflicts:
#	policyengine_us/parameters/gov/household/household_state_benefits.yaml
Replace the six supplement variables (ia_ssa_blind_supplement,
ia_ssa_dp_supplement, ia_ssa_flh_supplement, ia_ssa_ihhrc_supplement,
ia_ssa_rcf_supplement, ia_ssa_smme_supplement) with a single
payment formula in ia_ssa that selects over ia_ssa_living_arrangement.

Rename ia_ssa_category -> ia_ssa_living_arrangement (enum and variable)
to match the reality of what the enum represents.

Helper variables that represent genuine inputs (residency flags,
cost-of-care, DP configuration, Medicaid/Part B flags, SMME eligibility,
both-need-care) remain unchanged.

Tests reorganized:
- ia_ssa_living_arrangement.yaml holds routing/priority tests
- ia_ssa.yaml consolidates the six per-category payment tests with
  outputs renamed to ia_ssa; one BLIND-in-RCF case updated to assert
  the routed RCF payment rather than the zero blind value.

All 77 Iowa SSA YAML tests pass; microsim unaffected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Parameter normalization:
- Rename dp/assistance_standard.yaml -> dp/state_supplement.yaml
- Rename flh/assistance_standard.yaml -> flh/state_supplement.yaml
- Values are now the state portion above FBR (consistent with blind.yaml),
  so all three federally-administered arrangements use one formula shape:
  max(0, (FBR + state_supplement) - max(countable, FBR)).

P2 #1 — FLH Department top-up for SSI-only recipients:
  The Iowa FLH state supplement ($162 from 2017 onward) exceeds the
  federally-administered max_supplement cap ($142) by exactly $20, the SSI
  general-income disregard. Per IAC 441-52.1(1), when the recipient has
  no other income (so SSA's $20 disregard is unused), Iowa HHS issues an
  additional Department payment equal to (state_supplement - max_supplement)
  to close the gap and bring total income to the full standard. In 2011
  the state supplement equals the cap so no top-up is owed; from 2017
  onward the top-up is $20.

P2 #2 — IHHRC client participation charged to sole recipient:
  When only one spouse needs IHHRC, charge the entire combined client
  participation to that spouse instead of splitting it evenly across the
  marital unit. The split remains correct for both-need-care couples
  where both members compute the supplement independently.

Tests:
- FLH Cases 1 and 4 (zero-income) now expect $162 (was $142)
- New IHHRC Case 12 exercises the sole-recipient participation rule:
  couple with $800/mo SS each, one needs care -> supplement $270 instead
  of $335 under the old 50/50 split.

77 + 1 = 78 Iowa SSA tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hua7450
hua7450 marked this pull request as ready for review April 23, 2026 04:45
Address three P2 review items:

1. 2026 DP BLIND_WITH_AGED_OR_DISABLED_SPOUSE_AND_DEPENDENT: Iowa HHS's
   published $3,031 breaks the "-$22 when only one spouse is blind"
   footnote rule that's held for 2011/2017/2018/2025 and inflates the
   phase-down ceiling so high-income 2026 cases still receive DP when
   they should phase to zero. Encoded as the COLA-consistent total
   $2,031 (state portion $1,037). YAML comment documents the suspected
   Iowa HHS publication error and the basis for the override.

2. DP max_per_person_cap and dependent_income_limit now carry
   2018-01-01: $387, matching the base state_supplement 2018 tier.
   Prior gap left 2018-2024 DP payments and eligibility understated
   against the 2017 $379 values.

3. FLH blind recipients receive the $22 blind increment on top of the
   federally-administered $142 cap (POMS OS code I: state portion
   $164 for blind FLH residents). The blind increment replaces — not
   adds to — the SSI-only Department top-up; $22 > $20 always. New
   FLH test case 7 locks in the $164 figure for a blind FLH resident.

79 Iowa SSA tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

@PavelMakarchuk PavelMakarchuk 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.

Iowa State Supplementary Payment (SSP) — PR #8017 Review

Source Documents


Critical (Must Fix)

  1. DP supplement formula uses individual FBR for couple configurations and applies an unjustified per-person cap

    • Location: policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa.py:39-43; parameters/.../dp/state_supplement.yaml; parameters/.../dp/max_per_person_cap.yaml.
    • The formula is dp_raw = max_(0, (individual_fbr + dp_state_supplement) - countable_or_fbr); dp_amt = min_(dp_raw, p.dp.max_per_person_cap). countable_or_fbr is clamped to individual_fbr ($967) even when the configuration represents an eligible couple — federal SSI for an eligible couple fills to the couple FBR ($1,450), not the individual FBR. The state_supplement YAML is back-calculated against individual_fbr for every configuration, producing wildly inflated raw values that the author then bounds with max_per_person_cap = $503.
    • The $503 cap has no regulatory basis as a payment ceiling — it is the dependent relative's income eligibility limit (per IAC 441-51.5(1) / GL 6-B-46 cover page), repurposed here. max_per_person_cap.yaml and dependent_income_limit.yaml are byte-identical across all four years (379, 387, 503, 518), confirming the conflation.
    • Code-path verifier confirmed: for BLIND_WITH_BLIND_SPOUSE_AND_DEPENDENT 2025 with zero countable income, code returns $503; regulation requires $547 (= $1,997 standard − $1,450 couple FBR). $44/month error, locked in by test ia_ssa.yaml Case 3.
    • Other affected 2025 configurations: BLIND_WITH_DEPENDENT (true $525, code $503); BLIND_WITH_AGED_OR_DISABLED_SPOUSE_AND_DEPENDENT (true $525, code $503).
    • PDF citation: Iowa HHS GL 6-B-46 ("Making the Dependent Person Payment", manual lines 1714–1720): "Only the income of the eligible person or eligible couple is subtracted from the applicable assistance standard." 2025 standards listed at GL pp. 22 (image p. 28).
    • Fix: Parameterize the assistance standard directly per configuration and select individual vs. couple FBR based on whether the configuration includes an eligible spouse, then supplement = max(0, standard − max(countable, applicable_fbr)). Remove max_per_person_cap.
  2. $20 SSI general disregard incorrectly included in RCF/FLH/IHHRC client participation

    • Location: ia_ssa.py:22-26, 56-70, 71-80, 90-100; ia_ssa_living_arrangement.py:28-33, 39-66.
    • All three programs derive countable_monthly = ssi_countable_income / 12, but ssi_countable_income already applies the federal $20 general income exclusion (gov.ssa.ssi.income.exclusions.general) inside _apply_ssi_exclusions.py. The Iowa rules enumerate disregards exhaustively and omit the $20 exclusion:
      • RCF — IAC 441-52.1(3)(a) / GL 6-B-46 p. 58: "NOTE: Do not allow the SSI $20 income disregard."
      • FLH — GL 6-B-46 p. 30: "EXCEPTION: Do not allow the $20 income disregard."
      • IHHRC — IAC 441-177.4(1)(f) / GL 6-B-46 p. 36: "EXCEPTION: Do not allow the $20 disregard."
    • Code-path verifier confirmed: test ia_ssa.yaml RCF Case 6 (SS $1,000/mo) expects $311.60; correct value is $291.60. $20/month understatement of client participation = $20/month overstatement of supplement for any recipient with non-SSI unearned income ≥ $20/mo. The same error contaminates the income-eligibility gates (rcf_income_eligible, ihhrc_income_eligible, blind_income_eligible) within $20 of the cap.
    • Fix: Introduce an Iowa-specific ia_ssa_countable_income_no_disregard helper that adds back min(unearned_monthly, $20), and use it in RCF/FLH/IHHRC payment formulas and in the corresponding routing-layer gates.
  3. Iowa SSA resource-limit dispatcher under-includes ineligible dependent spouses

    • Location: policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_resources_eligible.py:12-24.
    • Code uses joint = ssi_claim_is_joint to flip both the resource pool (individual vs. marital sum) and the cap ($2,000 vs. $3,000). ssi_claim_is_joint returns True only when both spouses are SSI-categorically-eligible heads/spouses. IAC 441-51.5(2) extends the $3,000 cap whenever the recipient has "a dependent spouse," and 51.5(4) defines that to include an "ineligible spouse … who is financially dependent upon the recipient." Also affects the third sentence of 51.5(2): "recipient, spouse, and dependent child or parent: $3,000."
    • Concrete failure: aged SSI recipient married to a 50-year-old non-disabled spouse with no income → ssi_claim_is_joint = False → tested individually against $2,000 instead of marital-unit against $3,000.
    • Fix: Replace the dispatcher with an Iowa-specific ia_ssa_has_dependent_spouse (or extend an ia_ssa_dp_* variable that already enumerates dependents) and sum resources across all 51.5-covered dependent relatives.
  4. Wrong IAC subsection citations (5 locations) — all 4 verifier claims confirmed

    # File Wrong Correct
    1 parameters/.../ssa/smme/minimum_income_fpl_multiplier.yaml (both refs) 441—51.6(6) 441—51.7(6)
    2 parameters/.../ssa/dp/dependent_income_limit.yaml 441—51.4(1) 441—51.5(1)
    3 parameters/.../ssa/dp/max_per_person_cap.yaml 441—51.4(1) 441—51.5(1)
    4 parameters/.../ssa/rcf/days_multiplier.yaml (both refs) 441—51.3(3) 441—51.4(3)
    5 variables/.../ssa/ia_ssa_living_arrangement.py line 39 comment IAC 441—51.3(3) IAC 441—51.4(3)
    • 441-51.3 ("Supplementation") and 441-51.6 ("Residence") have no numbered subsections, so the cited references literally do not exist. The correct subsections (51.7(6) for the 120% FPL rule, 51.5(1) for dependent-relative income, 51.4(3) for RCF income eligibility) all match the parameter content verbatim.
  5. RCF and IHHRC client-participation formulas omit required regulatory deductions

    • Location: ia_ssa.py:71-100.
    • RCF (IAC 441-52.1(3)(a) / GL 6-B-46 p. 57): Required deduction order is (1) impairment-related work expenses, (2) $65 + ½ remaining earned income, (3) $126 PNA, (4) diversion to spouse at home, (5) diversion to dependent child, (6) unmet medical needs of resident, (7) unmet medical needs of spouse/dependent, (8) first-month previous-living expenses. Code applies only #3.
    • IHHRC (IAC 441-177.4(1)(f) / GL 6-B-46 p. 38): Required deductions are basic SSI standard, $65+½ earned income, dependent SSI standard plus unmet medical needs, ineligible-spouse medical needs, applicant medical needs. Code applies only the basic SSI standard. Entire 177.4(1)(g) child-deeming branch (parental income deemed to a child needing IHHRC, with 1/3 child-support disregard etc.) is unmodeled.
    • PR description acknowledges the "5-step disregard cascade not modeled," but at minimum the $65+½ earned income disregard (a federal SSI primitive already in PE) and the $483-per-dependent diversions are computable and materially affect working/dependent households.
    • Minimum recommended fix: Apply $65+½ earned-income disregard and the dependent diversions for RCF and IHHRC; document the omitted deductions explicitly in variable docstrings.

Should Address

  1. FLH state_supplement historical (pre-2025) values disagree with SSA published baselines — flh/state_supplement.yaml encodes $142 (2011), $162 (2017), $162 (2018), but the SSA 2011 Iowa baseline (PDF 4 lines 99–115) shows the Iowa FLH state supplement was $344 (aged/disabled individual) / $366 (blind individual) in January 2011. The encoded $142 appears to be the SSA-administered cap, not the historical state supplement. (Regulatory S1.)

  2. SMME income test uses SPM-unit FPG instead of individual/couple FPG — smme/ia_ssa_smme_eligible.py:27-29: fpg_monthly = person.spm_unit("spm_unit_fpg", period.this_year) / MONTHS_IN_YEAR. IAC 441-51.7(6) tests the recipient's income against 120% FPL for one (or two if joint claim). A single SSI-eligible aged person living with two adult children (SPM unit of 3) faces a 120% threshold of ~$2,665/mo instead of the correct ~$1,565/mo and would fail the test even though they should pass. Use personal_fpg for individual claims and 2-person FPG for joint claims. (Regulatory S2.)

  3. DP max_per_person_cap parameter is duplicative and undocumented — Identical values to dependent_income_limit across all years. Conflates two regulatory concepts. Remove and replace with per-configuration state supplement encoding (related to Critical #1). (Regulatory S3.)

  4. DP/Blind/FLH input variables lack formula derivations and microsim defaults — ia_ssa_dp_has_eligible_dependent, ia_ssa_dp_dependent_countable_income, ia_ssa_dp_configuration, ia_ssa_resides_in_family_life_home, ia_ssa_resides_in_residential_care_facility, ia_ssa_needs_in_home_health_related_care, ia_ssa_ihhrc_cost_of_care, ia_ssa_rcf_cost_per_diem are pure user-input variables. In a microsim run on enhanced CPS none will be populated, so DP/FLH/RCF/IHHRC will never fire. Acceptable as a manual-input pathway, but add at least minimal default formulas (e.g., default ia_ssa_has_medicare_part_b to is_medicare_eligible) where a federal PE variable already encodes the concept. (Regulatory S5/S6, Suggestion G1.)

  5. 5 input variables omit default_value — ia_ssa_dp_dependent_countable_income, ia_ssa_dp_has_eligible_dependent, ia_ssa_resides_in_family_life_home, ia_ssa_ihhrc_cost_of_care, ia_ssa_needs_in_home_health_related_care, ia_ssa_rcf_cost_per_diem, ia_ssa_resides_in_residential_care_facility. The PR sets default_value = False on ia_ssa_has_full_medicaid and ia_ssa_has_medicare_part_b but is inconsistent for the rest. (Code S2.)

  6. FBR acronym in parameter descriptions — dp/state_supplement.yaml and flh/state_supplement.yaml use "(FBR)" in the description field, violating the parameter-patterns "no acronyms" rule. (Code S4.)

  7. Period-bridging convention undocumented — ia_ssa.py:29, ia_ssa_living_arrangement.py:37, ia_ssa_smme_eligible.py:16 access YEAR-period inputs (ssi_claim_is_joint, is_ssi_aged_blind_disabled) with period.this_year from MONTH formulas. Technically correct but consider a single explanatory comment near the top of ia_ssa.py. (Code S1.)

  8. #page= anchor mismatch in IHHRC max_cost_single.yaml — Reference for 441-177.10(3) uses #page=4 but the rule is on file page 5. (Reference S1.)

  9. Iowa Code 249.9A reference missing #page= anchor — rcf/personal_needs_allowance.yaml. (Reference S2.)

  10. Iowa HHS GL 6-B-46 download URL has no page anchor — Multiple files cite hhs.iowa.gov/media/15607/download bare. Add #page=1 for explicitness or cite the manual chapter URL. (Reference S3.)

  11. Bare HHS landing page reference for 2026 values is insufficient — hhs.iowa.gov/assistance-programs/state-supplementary-assistance is dynamic. Add a Wayback snapshot URL or a (retrieved YYYY-MM-DD) note. (Reference S4.)

  12. Income-eligibility gates inherit the $20-disregard error — ia_ssa_living_arrangement.py:39-66: RCF income gate (< $1,165.60), IHHRC gates (<= $480.55 / <= $961.10), and Blind income gate (< $989) all use the contaminated countable_monthly, so cases at or within $20 of the boundary may be mis-classified. (Regulatory S7 — addressed by Critical #2 fix.)

  13. No 2011 historical-tier test anywhere — Parameters define 2011-01-01 values (blind, RCF PNA $93, max_per_diem $28.14, dp.state_supplement, flh.max_supplement, etc.) but no test uses period: 2011-01. The 2011→2017 transitions are unverified. (Test C1.)

  14. Missing payment test for BLIND_WITH_AGED_OR_DISABLED_SPOUSE_AND_DEPENDENT — Only 4 of 5 non-NONE DP configurations are exercised; this config is the one with the disputed 2026 value, so a payment test pinning 2025 and 2026 is essential. (Test C2.)

  15. V-shape boundary at countable == FBR not directly tested — None of the BLIND/DP/FLH cases use a social_security_retirement value engineered to put ssi_countable_income exactly at individual_fbr. (Test C3.)

  16. RCF post-PNA client-participation boundary not tested — Existing cases sit far above or far below the $1,165.60 threshold; no case engineered to land just below, exactly at, or one cent above. (Test C4.)

  17. IHHRC combined countable equal to caps not tested — ihhrc_countable_after_disregard <= ihhrc_cap uses <=. No case sits exactly at $480.55 single or $961.10 couple. (Test C5.)

  18. Missing pair-wise priority routing tests — RCF > IHHRC, RCF > FLH, RCF > DP, RCF > SMME, FLH > DP, FLH > SMME are not directly tested. Cheap to add and protect against select(...) reordering bugs. (Test S9.)

  19. SMME 120% FPL boundary partially covered, full-Medicaid vs. medically-needy distinction not covered, FLH blind add-on at 2026 not tested, FLH Department top-up countable_monthly == 0 boundary not tested, ineligible-person variants missing, DP has_eligible_dependent: false with non-NONE configuration not tested. (Test S6, S8, S10, S11, S12, S13.)


Suggestions

  1. 2026 BLIND_WITH_AGED_OR_DISABLED_SPOUSE_AND_DEPENDENT $1,037 is an editorial guess — Iowa HHS publishes $3,031 for 2026; PR encodes $1,037 (state portion) on the theory that $3,031 is a typo. Already disclosed in YAML comment and PR description as intentional. Either confirm with Iowa HHS in writing and add response as comment, or fall back to the published $3,031 with a TODO. Documented as intentional — not blocking. (Regulatory S4 / Code G3 / PDF audit b.1.)

  2. Default ia_ssa_has_medicare_part_b to is_medicare_eligible — Would let SMME fire automatically in microsim. (Code G1.)

  3. Extract DRY intermediate variables — countable_monthly, ssi_monthly, basic_ssi_disregard, combined_countable are re-derived in both ia_ssa.py and ia_ssa_living_arrangement.py. Consider shared ia_ssa_countable_income_monthly etc. per the variable-patterns "intermediate variables for code reuse" rule. (Code G1.)

  4. Add YAML comments in dependent_income_limit.yaml and max_per_person_cap.yaml clarifying they are intentionally not breakdowns — Prevents a future contributor from "fixing" them. (Code S3.)

  5. RCF cost_per_diem default to p.rcf.max_per_diem when resident is flagged as in RCF — Behavioral improvement so the default supplement is non-zero. (Code G2.)

  6. ia_ssa_resources_eligible description should note monthly recomputation of an annual SSI resource test. (Code G4.)

  7. Consolidate 2017/2018 IAC supplement citations with effective-date parentheticals. (Reference G1.)

  8. Tighten SSA 2011 footnote-a documentation in dp/state_supplement.yaml. (Reference G2.)

  9. Add YAML comment in rcf/days_multiplier.yaml explaining the "31 = largest possible days-in-a-month" derivation. (Reference G3.)

  10. HHS rates page lists "Flat per Diem Rate $17.86" — likely informational only post-2017 transition to cost-related per diem. Confirm with author whether to encode. (PDF payment-standards audit c.1.)

  11. Standardize absolute_error_margin: 0.01 across YAML test cases. (Test S19.)

  12. Test variants: negative income, explicit ssi_claim_is_joint toggling on couples, RCF per-diem exactly at cap, days-multiplier sensitivity, entity-scaffolding cleanup for ia_ssa_dp_configuration.yaml. (Test S14, S15, S16, S17, S20.)


Investigated and Cleared (False Positives)

  • SMME categorical contradiction (PDF eligibility audit Mismatch #1) — Rejected. Federal is_ssi_eligible checks ABD + resources + immigration only; it does NOT encode an income test. The SMME-target population (income > 120% FPL with full Medicaid + Part B + ABD + SSI resource/immigration eligibility) passes is_ssi_eligible and the SMME branch fires correctly. Verified end-to-end with a worked example (aged 70, $1,600/mo income, $1,500 resources → SMME = $1).
  • IHHRC $961.10 income cap "missing" (PDF IHHRC audit framing concern) — Rejected. The cap IS enforced — at ia_ssa_living_arrangement.py:64 (routing layer), where eligibility cutoffs belong in this codebase's pattern. The reviewer searched only ia_ssa.py (payment layer) and stopped one file short. Same routing/payment split is used for RCF and Blind in the same file.

PDF Audit Summary

Category Count
Confirmed correct (parameters reconciled to PDFs) 27 (8 Ch.52 payment standards, 5 IHHRC 2025 + 2011 baseline values, 7 eligibility/routing rules per Ch.51, 5 DP 2025 standards from GL 6-B-46, 2 SMME)
Mismatches confirmed (deliberate) 1 (2026 DP BLIND_WITH_AGED_OR_DISABLED_SPOUSE_AND_DEPENDENT: repo $1,037 vs HHS $3,031, documented as intentional editorial override)
Mismatches rejected 2 (SMME categorical gate, IHHRC $961.10 income cap routing)
Unmodeled items acknowledged in PR 5+ (5-step IHHRC disregard cascade; RCF disregards #1/2/4-8; child IHHRC deeming branch 177.4(1)(g); first-month proration 177.10(2)(b); 15-day temporary absence rules)
New unmodeled items flagged 8 (FIP application requirement 51.2; supplementation income reduction 51.3; physician-cert / facility-licensing inputs 51.4(1)/(2); RCF couple-room initial-month special rule 51.4(3); dependent earnings $65 work expense 51.5(1); full-month absence rule 51.5(3); SMME living-arrangement enumeration 51.7(5); SSN furnishing 51.9; income from room-and-board 51.8)

Validation Summary

Check Result
Regulatory Accuracy 3 critical (DP couple FBR, $20 disregard, RCF/IHHRC missing deductions), 7 should
Reference Quality 4 critical citation errors (3 YAML + 1 covered under critical #4 group), 4 should
Code Patterns 0 critical, 5 should, 4 suggestions
Test Coverage 5 critical gaps, 8 should
PDF Value Audit 0 unintentional mismatches; 1 deliberate (2026 DP override, documented)
CI Status All 24 checks passing

Review Severity: REQUEST_CHANGES

Justification: four confirmed code/regulatory bugs materially affect output dollars in real cases — (1) DP couple-FBR formula bug is a $44/month error encoded into a passing test; (2) $20 SSI disregard misapplication understates RCF/FLH/IHHRC client participation by $20/month for any recipient with non-trivial unearned income; (3) resource-limit dispatcher under-includes ineligible dependent spouses, denying eligibility to households entitled to the $3,000 cap; (4) five regulatory citations point to non-existent or unrelated subsections, undermining auditability. The deliberate 2026 DP override is acceptable as documented, but the structural bugs warrant fixes before merge.


Top Priorities for Author

  1. Fix DP couple-FBR / per-person-cap issue — Parameterize assistance standard per configuration; pick individual vs couple FBR based on whether configuration has an eligible spouse; remove max_per_person_cap.
  2. Strip $20 disregard for RCF/FLH/IHHRC — Add an ia_ssa_countable_income_no_disregard helper that adds back min(unearned_monthly, $20); use in RCF/FLH/IHHRC payment formulas and routing-layer income gates.
  3. Fix resource-limit dispatcher — Replace ssi_claim_is_joint with an Iowa-specific ia_ssa_has_dependent_spouse that covers ineligible-but-financially-dependent spouses per IAC 441-51.5(4).
  4. Correct IAC subsection citations (5 locations) — smme/minimum_income_fpl_multiplier.yaml (51.6(6)→51.7(6)); dp/dependent_income_limit.yaml and dp/max_per_person_cap.yaml (51.4(1)→51.5(1)); rcf/days_multiplier.yaml (51.3(3)→51.4(3)); ia_ssa_living_arrangement.py:39 comment (51.3(3)→51.4(3)).
  5. Add minimum-recommended deductions — $65+½ earned-income disregard and dependent diversions for RCF and IHHRC.

@hua7450
hua7450 marked this pull request as draft April 28, 2026 14:27
hua7450 and others added 9 commits May 4, 2026 15:01
…mit, IAC citations, SMME FPG

- DP: replace state_supplement (back-calculated against individual FBR) with
  per-config assistance_standard from GL 6-B-46 p. 22; pick couple FBR for
  spouse-inclusive configs. Removes the unjustified $503 max_per_person_cap
  that was conflated with the dependent_income_limit. Fixes 2025 BLIND
  configs that were understated by $22-$44/mo.
- RCF/IHHRC: add ia_ssa_countable_income_no_disregard helper to reverse the
  SSI \$20 general exclusion (GL 6-B-46 pp. 36, 54-58 omit it). Accounts for
  SSI couple computation by sharing the add-back across the marital unit.
  FLH/DP/Blind keep ssi_countable_income — they are SSA-administered and the
  \$20 disregard is real money the recipient receives.
- Resource limit: dispatch on marital_unit.nb_persons() > 1 instead of
  ssi_claim_is_joint, so an aged recipient with an ineligible-but-co-resident
  spouse correctly gets the IAC 441-51.5(2) couple \$3,000 limit.
- IAC citations: 51.6(6) -> 51.7(6) for SMME 2026 ref, 51.4(1) -> 51.5(1)
  for DP dependent income limit, 51.3(3) -> 51.4(3) for RCF days_multiplier
  and the matching comment.
- SMME income test: size FPG by 1-person (or 2-person on joint claim) per
  IAC 441-51.7(6) "income of a recipient", not by full SPM unit.
- Tests: refresh DP/RCF/IHHRC expected values for the new formulas; add a
  resources test for ineligible-co-resident-spouse; restructure DP cases 3,
  4, 8 with realistic 3-person setups instead of single person tagged with
  couple-inclusive configurations.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…dd-back

- Add 2011 historical values to dp/dependent_income_limit ($344, verified
  from SSA 2011 Iowa Table 1 Code C state portion = $1,018 - $674 FBR),
  smme/amount ($1 token, SMME enacted by 2004 Iowa Acts ch. 1085), and
  smme/minimum_income_fpl_multiplier (1.2, 120% FPL test in Iowa Code
  249.3(4)(g) since 2004). Eliminates ParameterNotFoundError on pre-2017
  RCF/Blind/etc. simulations where these values are read unconditionally.
- Restore the earned-income portion of the SSI $20 general disregard
  add-back per 20 CFR § 416.1112: when unearned < $20, the leftover
  applies inside the earned flat ($65 + leftover) and is then reduced by
  the 50% earned-share rule. The helper now adds back
  applied_to_unearned + applied_to_earned * (1 - earned_share) instead of
  only min(unearned, $20). Verified against GL 6-B-46 p. 55 example
  ($500/mo earned -> RCF countable $977 = SSI standard + $10).
- Tests: add 2011 RCF historical regression and a $500/mo earned-only RCF
  case that matches the manual's $977 countable income walkthrough.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The helper reconstructs where the SSI $20 general exclusion landed, so its
inputs must mirror _apply_ssi_exclusions exactly: marital unearned + parent
deemed + ISM on the unearned side, and marital earned − blind/disabled
working-student exclusion on the earned side. The previous version saw only
ssi_unearned_income / ssi_earned_income, so it under-detected when the $20
landed on ISM or parental-deemed unearned income (e.g., $100/mo ISM with
$500/mo earnings under-counted client participation by $10/mo).

Also drops redundant period.this_year / MONTHS_IN_YEAR conversions on
flow variables — period auto-converts annual flows to monthly inside a
MONTH formula.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Remove ungrounded $22 blind add-on from FLH supplement (IAC 441-52.1(4)
  excludes the $22 standard for recipients of any other SSP); replace
  fragile float-equality with tolerance-based gap branch.
- Fix three PDF page anchors: ihhrc/max_cost_single 4→5, rcf/days_multiplier
  2→1, and rcf/ia_ssa_resides_in_residential_care_facility.py 2→1.
- Fix dp/dependent_income_limit.yaml 2017 supplement section title from
  441-51.5(1) to 441-51.4(1).
- Refactor: replace 3 input booleans with one ia_ssa_living_arrangement_input
  enum, matching the MA/MI/AK/CT/IN state SSP pattern. Net -2 files.
- Update Case 7 expected value $164 → $162 to reflect the FLH blind add-on
  removal.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Formula bugs uncovered while expanding test coverage:

* IHHRC supplement was always zero in production. ia_ssa_ihhrc_cost_of_care
  had no formula, so cost defaulted to zero and ihhrc_amt collapsed to
  max(0, 0 - participation) = 0. Add a formula that imputes max_cost_single
  when ia_ssa_living_arrangement is IHHRC; users can still override with
  actual care-cost data.

* DP supplement double-attributed to spouses. When both spouses encoded the
  same couple-FBR DP configuration, both computed the full per-couple
  supplement and the SPM-unit total doubled. Add a per-marital-unit divisor
  guard that splits the supplement across claimants.

* DP and SMME compared per-spouse income to couple-level thresholds. For
  joint SSI claims, ssi_countable_income returns combined / 2 per spouse,
  but the DP couple-FBR comparison and the SMME 2-person FPL gate were
  written against per-spouse values. Aggregate countable across the
  marital unit before the comparison when the threshold is couple-level.

Reference and registry fixes:

* dp/dependent_income_limit.yaml: cite operative IAC 441-51.5(1) and the
  HHS Manual; remove the misleading 2018 Ch.52 reference.
* flh/max_supplement.yaml: cite HHS Manual GL 6-B-46 page 31 for the $142
  SSA-administered cap.
* programs.yaml: add parameter_prefix to the IA SSA entry.

Code cleanup: drop the redundant period.this_year / MONTHS_IN_YEAR pattern
in favor of period directly. PolicyEngine auto-divides FLOW-type YEAR
variables when accessed at a MONTH period.

New tests (Cases 9-14 in ia_ssa.yaml):

* Case 9 / 14: BLIND_WITH_DEPENDENT 2025 and 2011 (state portion matches
  SSA 2011 Iowa Table 1, Code C blind: $366).
* Case 10: BLIND_WITH_BLIND_SPOUSE_AND_DEPENDENT 2025.
* Case 11: regression test for the marital-unit divisor when both spouses
  set the same couple-FBR DP config.
* Case 12: regression test for joint-claim DP phaseout when combined
  income exceeds couple FBR.
* Case 13: AGED_OR_DISABLED_WITH_DEPENDENT 2011 (state portion matches
  SSA 2011 Iowa Table 1, Code C aged: $344).

All 88 IA SSA YAML tests pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
BLIND: For joint SSI claims with both spouses blind, ssi_countable_income
returns combined / 2 per spouse — so the previous per-spouse comparison
against (individual_fbr + $22) admitted couples whose combined income
exceeded the couple-level ceiling. Aggregate marital countable, compare
against (couple_fbr + 2 × $22), then split equally to avoid SPM-unit
double-counting (mirrors the DP couple-FBR fix).

FLH: Replace the all-or-nothing $20 top-up (triggered whenever
ssi_countable_income == 0) with a gap-based formula. Department fills
the gap from total income to the FLH standard, so a recipient with
$10/mo of other unearned income needs only a $10 top-up (was $20).
Defensive cap at (state_supplement − max_supplement) so artificially
low ssi_monthly cannot explode the supplement.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rce limit

BLIND one-blind joint: previous gate `joint_claim & sum(is_blind) == 2`
only applied couple-FBR basis when both spouses were blind. For joint
SSI claims with one blind spouse, ssi_countable_income still returns
combined / 2 per spouse and the federal piece is paid against couple
FBR, so the per-spouse comparison against individual FBR overpaid.
Generalize: any joint claim uses (couple_fbr + N × $22) where N is the
number of blind people in the marital unit; split only when both blind.
Mirror the same logic in the living-arrangement gate.

ia_ssa_eligible: replace federal `is_ssi_eligible` (which applies the
$2,000 individual resource test for non-joint married claimants) with
ABD + immigration + Iowa's own resource test. Iowa's $3,000 marital
limit (IAC 441—51.5(2)) was unreachable for cases like a claimant with
$2,500 marital resources and a non-ABD spouse. IAC 441—51.1 lets Iowa
pay recipients who would qualify for SSI except for excess income, so
the federal resource test should not gate Iowa eligibility.

Adds Cases 15-16 as regression tests for both fixes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- ia_ssa_living_arrangement: gate FLH and DP at the living-arrangement level
  by recipient/marital countable income vs the FLH standard
  (FBR + state_supplement) and the selected DP assistance standard, so
  high-income households fall through to SMME instead of being classified
  into a clamped-to-zero category. Use marital countable income for couple
  DP configurations to match the marital-unit-level standard.
- ia_ssa_living_arrangement and ia_ssa: IHHRC home-maintenance disregard
  selects the couple SSI standard whenever a spouse lives in the home
  (per IAC 441-177.4(1)(f)(1) "as applicable" and Iowa HHS GL 6-B-46),
  not only when both spouses are SSI-categorically eligible. Renamed to
  ihhrc_basic_ssi_disregard to scope it to IHHRC; BLIND keeps joint_claim
  per IAC 441-52.1(4).
- ia_ssa_resources_eligible: replace the IAC 441-51.5(2)-only citation
  with the broader umbrella authority (IAC 441-50.2) plus the federal SSI
  resource rules that govern non-DP arrangements (SSA POMS SI 01110.003,
  SI 01110.530, 20 CFR 416.1202(a)). Substantive policy unchanged: the
  $2k/$3k schedule applies whether the spouse is SSI-eligible or not,
  per federal SSI itself.
@hua7450
hua7450 requested a review from DTrim99 October 20, 2026 09:07
@hua7450

hua7450 commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator Author

Status of @PavelMakarchuk's April 23 and May 14 reviews at 3b9e925, after this round of fixes (eb4e86a) and a merge of main (3b9e925):

April 23

  • C1 (dependent-person couple FBR and the cap): fixed earlier; the helper uses the couple rate and the cap is gone (integration Cases 3-4).
  • C2 (the $20 disregard): fixed earlier (general_exclusion 0; Case 17).
  • C3 (spouse resources): fixed for the community categories in ia_ssa_eligible.
  • C4 (IAC citations): the parameters were restructured; every parameter now cites its rule or manual page with #page anchors.
  • C5 (deductions): handled through the $65 and one-half exclusions and the deductions input.
  • S2 (SPM poverty guideline): fixed earlier (marital-unit guideline).
  • S5 (default_value): fixed earlier.
  • S6 (acronyms): parameter descriptions and labels are rewritten in full words.

May 14

  • C1 and C2 (IHHRC participation adds SSI; Ms. A's $380): fixed earlier (Case 24 = 380).
  • C3 (POMS reference): fixed earlier in ia_ssa_federal.py.
  • SA2 (duplicated IHHRC logic): fixed. Participation and the payment are now ia_ssa_ihhrc_participation and ia_ssa_ihhrc_amount, read by both the payment and the SNAP/HUD exclusions.
  • SA4 (federal parameters standing in for state figures): each use now has a comment citing Iowa's adoption.
  • SA5 (boundaries): added for SMME at and one cent above 120% of the poverty guideline, no category and negative income; the IHHRC ceiling is Cases 22-23.
  • SA7, SA12, SA13 (descriptions, labels, NOTEs): rewritten to the house template, with NOTEs for each source conflict.
  • SA9, SA10: fixed earlier.

Other changes this round: plain zero-default inputs replace the formula variables users had to override; one-month inputs no longer carry into later months; the stepparent gap in parental resource deeming is closed by reusing main's _ssi_parental_resource_pool; over-income residential care, in-home care and SMME applicants no longer need to take up SSI. The PR body and TheAxiomFoundation/rulespec-us#1837 describe the program and the five source conflicts. All 85 Iowa cases pass locally.

@DTrim99

DTrim99 commented Oct 20, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Iowa state supplementation for 2026

PR #8017 (author: hua7450, head 3b9e925f43, merge-base f19877374a). 40 files (+3,260/−3), 32 commits. This is DTrim99's first review; PavelMakarchuk requested changes on 2026-04-23 (4f0bbd36a4) and 2026-05-14 (4a12735448).

Summary

The PR adds Iowa's State Supplementary Assistance (ia_ssa, Person, MONTH, defined_for = "ia_ssa_eligible"):

  • SSA-paid rows (ia_ssa_federal). These are the blind ($22), dependent-person ($518 per recipient or couple) and family-life home ($142, couple $801) supplements. They run through the shared ssi_state_supplement helper, with SSA rounding and the $1 minimum applied after the couple split.
  • Iowa-paid rows (in ia_ssa):
    • residential care: the daily rate, capped at $38.47, times the covered days, less income above the $130 allowance;
    • in-home health-related care (IHHRC): the cost (ineligible above $480.55) less participation above $994 / $1,491;
    • the $20 family-life home top-up;
    • the $1 supplement for Medicare and Medicaid eligibles (SMME) above 120% of the poverty guideline.
  • Supporting variables: care income without the $20 exclusion, Iowa's own parental income deeming for IHHRC children, parental resource deeming, and SNAP and HUD variants that leave out the IHHRC payment.
  • Inputs: eight Person inputs. ia_ssa_category is the certified arrangement, defaulting to REGULAR.
  • Aggregates and tests: household_state_benefits (four blocks), spm_unit_benefits, SNAP and HUD unearned income, a programs.yaml entry (partial, 2026), and 85 YAML cases.

Most of the 2026 policy content is right:

  • Amounts and administration. Every amount matches the sources: 6-B (pages revised May 22, 2026), 441 IAC 52.1, POMS SI 01415.058 F.2 (TN 95) and 441 IAC 177 (IAC 8/5/26). So do the split between SSA and Iowa administration and the couple levels.
  • Source conflicts. The author found five, documented them in code and on rulespec-us#1837, and pinned each with a test. I agree with all five readings, including the $2,031 blind dependent-person couple against POMS's $2,053 row.
  • Pavel's points. All three of his April criticals that changed dollars are fixed, as are both May criticals (table below).
  • Axiom. The line is valid: Update New York tax rules for 2022 #1837 is open, labelled pe-parity, dispatch-ready and matches the head.
  • Batch checks. The New Hampshire bug pattern can't occur (there are no breakdown keys). Microsimulation understates the program, and the PR documents that. I checked 30 expectations by hand.
  • CI. All 27 checks pass on the head.
  • Branch. It no longer merges cleanly: Montana Add Montana state supplementation for 2026 #8233, merged into main today, conflicts in two shared lists (branch note).

One critical item:

  • SMME couples. A married SMME applicant is tested on half the couple's income against the two-person poverty guideline. That denies the $1 to couples who qualify under any reading of 441 IAC 51.7(6).

Three should-fix items:

  • IHHRC dependent allowance. 441 IAC 177.2(1)"f"(3) requires it, but the model doesn't compute it. All three of the manual's examples that use it come out wrong by default.
  • Residential care entry month. Case 45 pins full client participation for a resident who enters on January 7, contrary to 441 IAC 52.1(3)"a"(6).
  • Two undocumented conflicts with 441 IAC 52.1. Residential care is paid at the maximum daily rate since July 2017, but the model pays $0 without a facility rate. The $22 blind standard is for a recipient "not receiving another type of state supplementary assistance".

Six suggestions (backdating, the IHHRC ceiling conflict, couple readings, Case 58, Child Care Assistance wiring, polish).

Earlier review (Pavel) — status at 3b9e925f43

Review / item Point Status Evidence
Apr C1 Dependent-person couple used the individual rate, and an unsupported $503 cap Fixed The limit is the couple rate + $518 (+$22 per blind spouse), and the cap is removed (ia_ssa_federal.py:42-60). Integration Cases 3–4 give 259 / 270 each
Apr C2 $20 exclusion wrongly allowed for residential care, family-life home and IHHRC Fixed ia_ssa_care_countable_income.py:63 uses general_exclusion=0; Case 17 (308.57) and Case 24 (380)
Apr C3 Ineligible dependent spouse's resources not counted at $3,000 Fixed in code ia_ssa_eligible.py:23-33 combines spouse resources for the community categories (51.5(2)). No case pins it (Suggestion 3)
Apr C4 Five wrong IAC subsection citations Fixed All citations are current: 51.5(1), 51.7(6), 52.1(1)–(7), and 177.2 / 177.8 after ARC 0460D
Apr C5 Residential care and IHHRC deductions missing Partly The $65 + ½ exclusion is applied per household (integration Case 7), and child deeming is now modeled. Pavel named the dependent allowance as computable, but it is still input-only (Should 1)
Apr S1, S13 Family-life home history; no 2011 test Moot History removed; values are 2026-only (Suggestion 1)
Apr S2 SMME used the SPM-unit poverty guideline Fixed for singles; new bug for couples Now uses the marital-unit guideline, but joint couples are tested on half their income (Critical 1)
Apr S3, S12 Duplicate cap; income gates inherited the $20 Fixed Cap removed; no $20 in the care income
Apr S4 Inputs lack formulas or defaults for microsimulation Declined, documented PR body: in microsimulation "only the blind supplement is paid"; accepted (see the microsimulation check)
Apr S5 / May SA6 Missing default_value Mostly Four plain inputs (ia_ssa_dependent_countable_income, ia_ssa_ihhrc_monthly_cost, ia_ssa_rcf_daily_rate, ia_ssa_smme_coverage_eligible) rely on implicit defaults. Harmless (polish)
Apr S6 Acronyms Fixed in descriptions Labels still say "Iowa SSA …" and "SMME" (polish)
Apr S7–S11 Period comment; reference anchors; landing page Fixed or moot Manual references carry #page= anchors; the general-letter and landing-page references are gone
Apr S14 No blind + aged dependent-person couple test Fixed Integration Case 4
Apr S15–S19 Boundary and routing tests Mostly Added: SMME Cases 56–57, IHHRC Cases 22–23, negative income Case 55, NONE category. Routing tests are moot under a single category input. Exact-FBR and participation-equals-cost boundaries weren't added (low value)
Apr G1 $3,031 dependent-person standard Resolved 6-B PDF p.26 now prints $2,031
Apr G5, G10 Default the residential care rate to the maximum; $17.86 flat rate Not done Case 20 pays 0 without a rate; see Should 3(a)
May C1, C2 IHHRC participation left out SSI; Ms. A example Fixed ia_ssa_care_countable_income.py:57-67 adds ssi; Case 24: participation 20, payment 380
May C3 POMS reference for the SSA computation Fixed ia_ssa_federal.py:18 cites SI 01415.058 F (the current section)
May SA1 Stale 51.6 citations Fixed None remain
May SA2 Duplicated logic Fixed Shared ia_ssa_ihhrc_participation and ia_ssa_ihhrc_amount
May SA3 Family-life home $142 history Moot $142 is derived as 162 − 20
May SA4 State-specific resource parameters Declined with reason The comment at ia_ssa_eligible.py:35-38 says 6-B prints the SSI limits under 416.1202; accepted
May SA5 12 boundary tests Mostly Still open: an SMME two-person case (which would have caught Critical 1), SMME with one spouse covered, and residential care with one spouse resident
May SA7–SA13 Template, anomaly anchor, comment density, booleans, income basis, anchors Fixed House-template descriptions; NOTE cites POMS F.1 code C; the deliberate income-basis split is commented
May G1–G13 Case count, numbering, NOTEs, references Fixed or moot 85 cases = CI. Still open: G5 ($3,000 couple tests, Suggestion 3) and G7 (the new federal file cites Cornell, polish)

Critical (must fix)

1. SMME couples are tested on half the couple's income against the two-person guideline, so qualifying couples get $0.

  • Where.

    • ia_ssa.py:60-65 builds the guideline from person.marital_unit.nb_persons().
    • ia_ssa.py:73-78 compares it with ia_ssa_smme_countable_income, which is ssi_countable_income + ssi (ia_ssa_smme_countable_income.py:15).
    • For a joint claim, ssi_countable_income is the couple's combined countable income divided by 2 (ssi_countable_income.py: where(both_eligible, personal_countable / 2, ...)). ssi_claim_is_joint needs only two aged, blind or disabled spouses, with no income test, so every aged couple is joint.
  • The law.

    • 441 IAC 51.7(6): "Income of a recipient must be within the income limit for the person's Medicaid eligibility group, but must exceed 120 percent of the federal poverty level."
    • 6-B PDF p.77: "income is determined according to SSI income criteria".
    • There are two coherent readings: each spouse's own income against the one-person guideline, or the couple's combined SSI income against the two-person guideline. The model mixes them: half the couple's income against the two-person guideline.
  • Probe at the head (policyengine-core 3.32.29; January 2026; both aged 70, SMME category, coverage entered, Social Security $1,700 a month each):

    Household SMME income per person Threshold ia_ssa Own-income reading Couple reading
    Married couple 1,690 ((3,400 − 20) / 2) 1.2 × 21,640 / 12 = 2,164 [0, 0] 1,680 > 1,596: $1 each 3,380 > 2,164: $1 each
    Same person, single 1,680 1.2 × 15,960 / 12 = 1,596 1 $1 $1

    So the same person gets $1 when single and $0 when married to a spouse with the same income, which no reading of 51.7(6) supports. In effect the couple must have more than twice 120% of the two-person guideline.

  • Why critical. It is a wrong result in the claimed year, contrary to the rule, for every SMME couple whose income lies between the rule's threshold and twice it. The amount is $1 a month, but the batch rule is "however rare the case". Pavel's May SA5 items 4 and 10 asked for exactly these couple cases.

  • Fix.

    • Keep the marital-unit guideline, which the PR adopted after Pavel's S2, and compare it with the couple's combined income. For example, use where(joint, person.marital_unit.sum(smme_income), smme_income), with joint = ssi_couple_computation_applies. This matches how ia_ssa_federal.py:38-41 already sums the couple's income for the dependent-person test.
    • Decide and document the ineligible-spouse case too. There ssi_countable_income holds only the income SSI deems, but the guideline is still for two people.
    • Add the couple above as a case expecting [1, 1], plus one just below 2,164 combined expecting [0, 0].
    • Add both to Update New York tax rules for 2022 #1837's companion tests.

Should address

1. The IHHRC dependent allowance is a rule-level deduction, but the model doesn't compute it. The manual's own examples come out wrong by default.

  • Where.

    • ia_ssa_ihhrc_participation.py:28-31 deducts only $994, or $1,491 with a spouse.
    • The ia_ssa_care_additional_deductions documentation asks users to enter "dependent and spouse allocations".
  • The law.

    • 441 IAC 177.2(1)"f"(3) lists among the disregards from gross income: "The amount of the SSI standard for a dependent plus any established unmet medical needs for each dependent living in the home. Any income of the dependent shall be applied to the dependent's needs before making this disregard."
    • 6-B PDF p.43: "$ 497 Maximum additional allowance for each dependent ... Subtract a dependent's income from the additional home maintenance allowance".
  • Probe at the head.

    6-B example Manual participation Model participation Model ia_ssa (cost $400)
    PDF p.43 Run black formatting on docs #2, Mr. B: Social Security $1,400; child $125 1,400 − 994 − 372 = 34 (pays 366) 406 0
    PDF p.44 Implement SNAP rules at the national level #3, Ms. C: $1,300; child $210 19 306 (by the same code path) 94 instead of 381
    PDF p.42: spouse earns $4,500; two children (4,500 − 65) / 2 − 1,491 − 994 → 0 726.50 0 instead of 400
  • Why should, not critical. The PR documents the input workaround, as Ohio (Add Ohio state supplementation for 2026 #10164 Should 1) did for its Medicaid group. But the default household result is wrong in the claimed year for any IHHRC adult who lives with a child. The model already has what it needs: ssi_ineligible_child_allocation (497 less the child's income) is read three files over for the sibling allowance in child deeming.

  • Fix.

    • Add the summed allocation of the co-resident ineligible children to the maintenance deduction in ia_ssa_ihhrc_participation, at the same household level as the couple allowance.
    • Narrow the input's documentation to unmet medical needs, and to dependents who aren't children (if any).
    • Add Mr. B (34 / 366) and the p.42 household (0 / 400) as cases.
    • The residential care spouse and dependent diversions in 52.1(3)"a"(3)–(4) can stay input-only. They depend on a spouse at home after the residents are split into separate marital units.

2. Case 45 pins full participation for a resident who enters on January 7, contrary to 52.1(3)"a"(6).

  • Where.
    • ia_ssa.yaml:988-1030: "Entry on January 7: the day of entry through January 31", 25 days, expecting ia_ssa 97.75 (961.75 − 864).
    • ia_ssa.py:28-34 charges the full monthly participation in a partial month.
  • The law.
    • 441 IAC 52.1(3)"a"(6): "The income of recipients of state supplementary assistance or Medicaid needed to pay the cost of care in another residential care facility, a family-life home, an in-home health-related care provider, a home- and community-based waiver setting, or a medical institution is not available to apply to the cost of care. The income of a resident who lived at home in the month of entry will not be applied to the cost of care except to the extent the income exceeds the SSI benefit for one person or for a married couple if the resident also had a spouse living in the home in the month of entry."
    • 6-B PDF p.63: "When a client lived at home for part of the month before entry to a facility, deduct the SSI benefit rate for one person from the client's countable income for that month."
  • What the rule gives. For Case 45's SSI-only resident coming from home, participation is max(994 − 130 − 994, 0) = 0, so the payment is 38.47 × 25 = 961.75, not 97.75. A transfer from another facility also reduces participation, under the rule's first sentence.
  • The documentation. The input calls this deduction "approved first-month expenses of the previous living arrangement". The rule's version is a fixed amount (the SSI rate). The manual's p.64 text ("may keep enough ... but do not disregard an amount that is over the SSI standard") is closer to expenses, so cite both.
  • Fix (either):
    • (a) Relabel Case 45 as a discharge or death month ("discharged January 26"). 97.75 is right then, because 52.1(3)"b" pays "for the date of entry ... but not the date of death or discharge" and participation is unchanged. Add an entry-from-home case with 994 entered as the deduction, expecting 961.75. Rewrite the input documentation around the rule.
    • (b) Add an entry-month flag like ia_ssa_ihhrc_initial_partial_month that deducts the SSI individual rate, or the couple rate when a spouse lived at home.

3. Two undocumented conflicts with 441 IAC 52.1 that affect results.

  • (a) Residential care is paid at the maximum daily rate since July 2017, but the model pays $0 without a facility rate.
    • Where. ia_ssa.py:32 caps the ia_ssa_rcf_daily_rate input at $38.47. Its documentation says "Leave at 0 when no rate is approved". Case 20 ("RCF requires a facility rate") pins 0.
    • The rule:
      • 441 IAC 52.1(3): "For periods of eligibility before July 1, 2017, the department will reimburse ... on a flat per diem rate or on a cost-related reimbursement system with a maximum per diem rate ... For periods of eligibility beginning July 1, 2017, and thereafter, payment to a recipient in a licensed residential care facility will be based on the maximum per diem rate."
      • 441 IAC 51.4(3) agrees: "income eligible when the income ... is less than 31 times the maximum per diem rate."
    • The manual. 6-B PDF p.72 still describes "two options": a facility-specific cost-related rate up to $38.47, or "A flat per diem rate ... $17.86 beginning February 1, 2004". The 2004 date suggests that text predates the 2017 rule.
    • Recommendation. Follow the rule. Use $38.47 as the rate for a certified resident, keeping the input only as an override if the author confirms Iowa still pays facility-specific rates. Case 20 then expects 328.57 (Case 14's value). Record the conflict in a NOTE and in Update New York tax rules for 2022 #1837's conflicts comment. Pavel's April Suggestions 5 and 10 raised the same point.
  • (b) The $22 blind standard is for a recipient "not receiving another type of state supplementary assistance", yet the model pays it alongside residential care and IHHRC.
    • Where. ia_ssa_federal.py:78-79 and Cases 16 and 27 pay $22 on top of residential care and IHHRC. The PR body bases this on "Iowa is a concurrent-category state, POMS F.1 NOTE".
    • The rule. 441 IAC 52.1(4): "The standard for a blind recipient not receiving another type of state supplementary assistance is $22 per month."
    • The manual and POMS support the model:
      • 6-B PDF p.20: "the blind supplement is not countable income to determine client participation or eligibility for the RCF supplement";
      • 6-B PDF p.42: "Do not count the $22 special blind allowance when determining client participation";
      • POMS F.1 code A covers a blind recipient "who does not live in any other State living arrangement variation". Those variations are the SSA-paid C, D, H and I, not the state-run programs.
    • The cited NOTE. It says Iowa "permits SSI recipients to receive the highest categorical supplement for which they can qualify" (SI 00501.300B.3). That is about multi-category eligibility (aged and blind), not about receiving two supplement types.
    • Recommendation. Keep the model's result. Add a NOTE that quotes 52.1(4) against 6-B pp.20 and 42 and POMS code A. Correct the PR body's basis, and add the conflict to Update New York tax rules for 2022 #1837.
  • Why should. The batch rule makes an authoritative-source conflict a should-fix item with a clear recommendation. (a) changes the default payment for every certified resident who has no rate entered.

Suggestions

1. Re-add the 2025 values that earlier commits had (deferral documented in the PR body).

  • The leak. Every Iowa value is dated only 2026-01-01, so 2015–2025 get the 2026 levels. The 2023–2025 household_state_benefits blocks include ia_ssa.

  • The earlier commits. At 4a12735448 the PR encoded 2025 values that Pavel's May review confirmed against the January 2025 manual (general letter 6-B-46):

    • dependent person $503 (now $518);
    • maximum residential care rate $37.60 (now $38.47);
    • personal needs allowance $126 (now $130).

    Values for 2017 and 2018 are also there (Iowa SSP 2017, 2018, 2019 #8974).

  • Why it's a suggestion. The PR claims only 2026 and says so. This matches Add Utah state supplementation for 2026 #10170 Suggestion 1 and Add Ohio state supplementation for 2026 #10164 Suggestion 1.

  • Fix. Restore the 2025-01-01 entries with the 6-B-46 reference. The blind $22, family-life home $162 and $480.55 values were the same in 2025.

2. The IHHRC cost-ceiling conflict is narrower than described: 441 IAC 177.9(4) supports the manual.

  • The current NOTE. ihhrc_cost_limit.yaml and conflict 2 on Update New York tax rules for 2022 #1837 say 441 IAC 177 "instead limits countable income to $480.55 and caps the payment".
  • What the rule also says. 441 IAC 177.9(4) (IAC 8/5/26) makes IHHRC terminate "Excessive costs. When the cost of care exceeds the maximum established in subrule 177.9(3)". The cross-reference should read 177.8(3). Iowa Code 249.3(2)(a)(2) ("so long as the cost of the nursing care does not exceed standards") points the same way.
  • What this means. Cases 22–23 follow the rule as well as the manual.
  • Fix. Cite 177.9(4) in the NOTE and in the conflicts comment.

3. Couple and certification readings that no case pins.

  • (a) Dependent person set for one spouse only. If only one spouse of a joint couple has DEPENDENT_PERSON, the helper averages the two couple rates (518 / 2 + 0) and then gives that recipient double the half. The couple gets $259 instead of $518. The category documentation says to set both, so this needs inconsistent input, as in Add Utah state supplementation for 2026 #10170 Suggestion 2(b). Either treat the couple as dependent-person when either spouse is certified, or pin the documented behavior.
  • (b) Spouse resources at $3,000. The fix for Pavel's C3 (a community-category recipient with an ineligible spouse, combined resources at $3,000) has no case; Pavel's May G5 asked for one. For example: an IHHRC recipient aged 65 and a spouse aged 50, with $2,500 + $400 (eligible) and $2,500 + $600 (not eligible).
  • (c) The dependent's own resources. 441 IAC 51.5(2) sets "The resource limitation for a recipient and a dependent child or parent" at $2,000, which reads as including the dependent's resources. Say in the ia_ssa_category documentation that DEPENDENT_PERSON certification covers this test, or add an input for it.

4. Case 58 pins a federal SSI gap.

5. Wire ia_ssa into Iowa Child Care Assistance in this PR.

6. Polish.

  • References and labels:
    • smme_minimum_fpg_rate.yaml cites only 6-B p.77. Add 441 IAC 51.7(6), the binding text.
    • The new child_support_share.yaml cites Cornell, not eCFR (Pavel's May G7).
    • The labels still abbreviate "Iowa SSA" (easily read as the Social Security Administration) and "SMME".
  • Code comments and inputs:
    • The comment at ia_ssa.py:30-31 says residential care eligibility "uses a 31-day ceiling", but no code applies one. Payment is 0 anyway when participation exceeds the month's cost (52.1(3)"d"), so reword the comment.
    • Four plain inputs rely on implicit defaults.
    • ia_ssa_care_additional_deductions is subtracted after the one-half earnings exclusion. A user entering impairment-related work expenses (52.1(3)"a"(1)) should enter half the amount. Say so, or handle them before the exclusion.
  • Registry and tests:
    • programs.yaml notes: say that microsimulation pays only the blind supplement (see Verified), as Add Montana state supplementation for 2026 #8233 Suggestion 4 asked for Montana.
    • Case 54's comment says income "must be below" the standard. 6-B PDF p.34 says it "must not be more than $1,156". At equality the payment is 0 either way.
  • Update New York tax rules for 2022 #1837. Update it for whichever items land: the SMME couple rule and cases, the dependent allowance, the entry-month rule, the two 52.1 conflicts, and 177.9(4).

Verified correct

  • Batch cross-cutting checks:

    # Check Verdict
    1 Axiom line Valid: TheAxiomFoundation/rulespec-us#1837 queued; see the Axiom line assessment
    2 House-template descriptions All eight Iowa files follow it ("Iowa provides this amount as … under the State Supplementary Assistance program"; "Iowa limits … to this amount …"; "Iowa sets this share …"), and so does the federal child_support_share.yaml
    3 Backdating 2026-only values leak back to 2015. The 2025 levels differ for three parameters; documented deferral (Suggestion 1)
    4 tx_rebate.py copy Omits ia_ssa. The PR body defers this to Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs #10226 (open), as the siblings did; accepted
    5 Aggregate wiring Complete, with no double count. Child Care Assistance is deferred to Iowa CCA: count the State Supplementary Assistance payment (ia_ssa) as income #10304 (Suggestion 5)
    6 Income attribution Pinned: blind couples, the dependent-person couple and mixed couple, the family-life home couple, IHHRC with an ineligible spouse and one earnings exclusion, and child deeming (integration Cases 1–7, 10; four deeming cases). The SMME couple is wrong (Critical 1); three readings are unpinned (Suggestion 3)
    7 Sibling conflicts Now real: see Branch status
    8 CI All green on the head
    9 State law Verified (below), apart from the findings above
  • Amounts, with sources (6-B pages as PDF pages; the manual mixes "Revised March 7, 2025" and "Revised May 22, 2026" pages):

    Parameter Value Source
    blind_amount 22 52.1(4) (p.2); 6-B p.20 "$1,016 for an individual ($994 + $22)"; POMS F.2.a code A "Blind 994.00 22.00"
    dependent_amount 518 6-B p.24 "more than $518", p.25 "less than $518"; p.26 table: $1,512 / $2,009 / $1,534 / $2,031 / $2,053; POMS code C "Aged 994.00 518.00"
    family_life_supplement 162 6-B p.35 "$162 ($1,156 - $994 SSI standard) ... a maximum payment of only $142"; POMS code D: 142, blind 164, couple 801, Aged/Blind 823, Blind/Blind 845
    rcf_daily_limit 38.47 6-B p.72 "The maximum cost-related per diem rate is $38.47, beginning January 1, 2026"
    rcf_personal_needs 130 6-B p.62 "a personal needs allowance of $130 per month"; 52.1(3)"a"(2)
    ihhrc_cost_limit 480.55 6-B p.41; 177.2(1)"f" (p.1); 177.8(3) (p.4)
    smme_amount 1 52.1(7) (p.2); 6-B p.78 "$1.00 per month"
    smme_minimum_fpg_rate 1.2 51.7(6); 6-B p.77 "exceeds 120%"
    child_support_share 1/3 20 CFR 416.1124(c)(11); 177.2(1)"g"(2)3; 6-B p.49

    Every #page= anchor shows its value, and each reference is one entry per document.

  • Administration.

    • 6-B p.6: "The Department administers SSA for: In-home health-related care, Residential care facilities, and Medicare and Medicaid eligibles. The Department and the Social Security Administration jointly administer SSA for: Dependent persons and Family-life homes. The Social Security Administration administers: Mandatory SSA and The blind allowance."
    • POMS SI 01415.058 A lists Iowa. F's NOTE names the three state-run programs.
    • So routing only the blind, dependent-person and family-life home rows through the SSA helper (rounding, $1 minimum after the couple split) is right, and so is paying the state rows unrounded.
  • The five documented conflicts:

    • Blind dependent-person couple: $2,031, not $2,053. POMS F.2.b code C prints Aged/Blind 562. That contradicts F.1's "increases by $22 for each blind recipient" and every other row (code H Aged/Blind 540, code D 823). The manual is right.
    • IHHRC ceiling. See Suggestion 2: the rule also supports the manual.
    • $65 for parental earnings only. The rule's "an additional basic SSI standard" has no $65, but the manual's D and E examples subtract it. The manual is the reasonable reading.
    • SMME "at least" vs "exceed". The statute is discretionary ("At the discretion of the department"), and the rule and manual say "exceed".
    • A dependent's income of exactly $518. 51.5(1) and p.25 say "less than".
  • The family-life home top-up. 6-B p.35: "For a recipient who has only SSI and no other income ... an additional $20 payment is necessary". This matches ia_ssa.py:41-57 and Cases 9 and 11–12. The couple shares one $20, matching POMS's couple $801 = 2 × 1,156 − 1,491 − 20.

  • IHHRC rules:

    • participation counts SSI (p.43 Ms. A: $543 + $471 − $994 = $20) and excludes the $20 and the $22 blind allowance (p.42);
    • $65 + ½ applies "per household";
    • the couple allowance applies "even if only one spouse receives" care (p.43);
    • a first partial month has no participation (177.8(2)"b");
    • children follow the Iowa deeming method: p.46 "do not rely on SSI deeming calculations for children"; the p.48 examples give 56, 159 and 259, and p.49 gives 0.
  • Take-up.

    • 6-B p.10: "SSA applicants and recipients must also apply for SSI or FIP if they might be eligible".
    • The SSA-paid rows also require an SSI application "even if the applicant's income is above SSI standards" (pp.22 and 32). The helper's takes_up_ssi_if_eligible term does that.
    • The state rows require take-up only of people whose income would qualify (Cases 48–50).
  • SNAP and HUD.

    • 7-E PDF p.34: "Count payments from State Supplementary Assistance as unearned income. Exclude State Supplementary Assistance payments made for in-home health-related care as a reimbursement."
    • 24 CFR 5.609(b)(6) ("specifically for, or in reimbursement of, the cost of health and medical care expenses") and (b)(19) both read as quoted (eCFR, current).
    • Integration Case 9 counts only the $264 blind amount.
  • The New Hampshire bug pattern can't occur.

    • The PR has no breakdown parameters.
    • ia_ssa_category has no defined_for, defaults to REGULAR, and is compared with ==.
    • The state-gated int ia_ssa_care_partial_month_days is used only in where(partial > 0, ...).
    • Case 29 covers a Nebraska resident. CI's Microsimulation and both Rest (Python) jobs pass.
    • The PR body's four-state probe (IA, MA, NC, VA) agrees.
  • Other batch lessons.

  • Microsimulation (the Utah check). The Utah over-count can't occur; the bias runs downward and is documented.

    • No inputs in the data. No dataset sets ia_ssa_category, care costs or SMME coverage, so only the blind supplement is paid.
    • The over-income path. It is narrow (within $22 of the FBR) and needs takes_up_ssi_if_eligible through the helper.
    • The size of the gap. SSA's Annual Statistical Supplement, 2026, Table 7.B reports 734 Iowa recipients of federally administered supplementation in December 2025, averaging $248.07, and about $2.1 million paid in 2025. SSA blocks automated fetches, so I confirmed this through SSA-domain search results. Most of that is dependent-person and family-life home, plus the unpublished state-run programs, so the understatement is of that order.
    • Precedent. This matches Montana Add Montana state supplementation for 2026 #8233 and Ohio Add Ohio state supplementation for 2026 #10164 (Suggestion 6 covers the programs.yaml note).
  • Code.

    • There are no hard-coded policy values. The $20, $65 and ½, FBRs and resource limits come from federal parameters, with comments citing Iowa's adoption.
    • YEAR inputs are read through period.this_year.
    • The one-month inputs have zero formulas (Cases 46–47 show they don't carry forward).
    • The deeming helpers reuse main's _ssi_parental_resource_pool.
    • Variable references use comment page lists, with no titles.
  • Hand checks (2026 FBR $994 / $1,491; 2027 $1,029 / $1,544):

    • ia_ssa.yaml:
      • Case 3: 12,240 / 12 = 1,020; − 20 = 1,000; 22 − 6 = 16.
      • Case 11: Social Security 100; SSI countable 80 < 994, so 142, and there is other income, so no top-up.
      • Case 13: 1,100 < 1,156; 142 − (1,080 − 994) = 56 (= 1,156 − 1,100).
      • Case 14: 38.47 × 31 = 1,192.57; 994 − 130 = 864; 328.57.
      • Case 15: × 28 = 1,077.16 − 864 = 213.16.
      • Case 17: 543 + 471 = 1,014 − 130 = 884; 308.57.
      • Case 25: 1,400 − 994 − 100 = 306; 400 − 306 = 94.
      • Case 26: 400 × 16 / 31 = 206.45.
      • Case 48: 1,080 − 994 gives uncapped_ssi −86; 1,100 − 130 = 970; 222.57.
      • Case 49: 1,100 − 994 = 106; 294.
      • Case 52: 1,029 − 130 = 899; 293.57.
      • Cases 56–57: 1.2 × 15,960 / 12 = 1,596.
    • Couples (integration.yaml):
      • Case 1: couple rates 44 / 0 average to 11 each; × 2 / 1 recipient = [22, 0].
      • Case 3: 1,491 < 2,009; 518 / 2 = 259 each.
      • Case 4: (562 + 518) / 4 = 270 each.
      • Case 5: 2 × 1,156 − 1,491 − 20 = 801; 400.50 + 10 = 410.50.
      • Case 6: 1,700 − 1,491 = 209; 191.
      • Case 7: (3,000 − 65) / 2 = 1,467.50; SSI 1,491 − 1,457.50 = 33.50; 1,501 − 1,491 = 10; 790 / 2 = 395.
      • Case 9: (400 + 22) × 12 = 5,064; SNAP and HUD 11,928 + 264 = 12,192.
      • Case 10: 2 × 1,191 − 1,544 − 20 = 818, so 409 + 10 = 419.
    • Deeming:
      • Income Case 2: 4,200 − 65 − 2,982 − 994 = 159; SSI 944.50; participation 109.50; 290.50.
      • Income Case 3: 4,000 − 65 − 2,982 − 694 = 259.
      • Resources Case 6: 5,600 − 3,000 = 2,600 > 2,000.
      • Resources Case 7: 900 + 200 = 1,100.
  • Changelog: changelog.d/ia-ssp.added.md is top-level, typed added, and accurate.

  • PR body:

    • The case count is right: 85 = 58 + 10 + 7 + 6 + 4, matching CI.
    • The shared files it lists match the diff.
    • Two claims need correcting: the concurrent-category basis (Should 3(b)), and the description of the 177 conflict (Suggestion 2).
  • Partner tests: the PR touches none, and Household API Partners passes.

Axiom line assessment

Valid: axiom: Iowa Code 249.3; 441 IAC 51.5(1), 51.7(6), 52.1(1)-(4), 52.1(7), 177.2(1)"f"-"g", 177.8(2); Iowa HHS Employees' Manual 6-B, 7-E; POMS SI 01415.058 F TheAxiomFoundation/rulespec-us#1837 queued.

  • Issue state.
    • The PR author filed Update New York tax rules for 2022 #1837 on 2026-10-20. It is open, labelled pe-parity, and the only rulespec-us issue that a search for "Iowa supplementary" finds.
    • rulespec-us main (5796861e58) has no module. us-ia/ holds only policies/cms, policies/income_tax, regulations/iac/441/41 and statutes/422. So queued is the right form.
  • Dispatch-ready on the Add AMT parameters for 2020-2023 #1467 model:
    • Module paths: 249.3, 52.1, 51.5 / 51.7, 177.2 / 177.8, the 6-B manual, and POMS F modules that import the DC/DE common module.
    • Corpus citations. I confirmed these on axiom-corpus main (393127f8b2):
      • us-ssa-poms-si-2026-09-10.yaml holds ssa-poms-si-01415-058 (us/manual/ssa/poms/si/01415.058, expression date 2026-08-28);
      • us-dc-ossp-ssa-poms.yaml holds us/guidance/ssa/poms/si-01415-058/2026;
      • us-ia-snap-manual.yaml holds us-ia/manual/hhs/em/7-e.
    • The recorded blocker. The Iowa Code, IAC chapters and 6-B are "Needs ingest"; no Iowa manifest covers them.
    • Verbatim law. I checked the quotes from 249.3, 52.1, 177.8(2), 6-B and the POMS F.2 rows against the live sources.
    • Companion tests A–Q come from the sources and map to PolicyEngine cases.
    • The conflicts comment covers the five readings, with pinned cases.
  • Matches the head: the variable and parameter names, the 85 cases, and the readings.
  • If the findings land: add the SMME couple case, the dependent allowance, the entry-month rule, the two 52.1 conflicts and 177.9(4) to Update New York tax rules for 2022 #1837.

CI status

All 27 checks pass (gh pr checks 8017, rechecked at the end of the review). The three "skipping" entries belong to the superseded run 39398177587.

  • The run. Run 39398361007 (pull_request) on head 3b9e925f43, created 2026-10-20 09:07 UTC and completed 12:27 UTC.
  • Quick Feedback ran all five Iowa files: ia_ssa.yaml 58, ia_ssa_income_deemed_from_parents.yaml 4, ia_ssa_nonfinancial_eligible.yaml 6, ia_ssa_resources_deemed_from_parents.yaml 7 and integration.yaml 10, all passed.
  • The rest. All 11 Baseline shards pass, as do the nine Contrib shards, Microsimulation, both Rest (Python) jobs, Package and compatibility, PR validation and Household API Partners.
  • Local runs. Because CI is green, I ran only one small probe at the head (policyengine-core 3.32.29). It covered the SMME couple, the IHHRC dependent examples and the residential care default above.

Branch status

  • Position: 4 commits behind main (bda23eac4c) and 32 ahead.
  • Merge. git merge-tree --write-tree PolicyEngine/main 3b9e925f43 now conflicts in:
    • policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml;
    • policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py.
  • Cause (branch note). The cause is the sibling Montana SSP (Add Montana state supplementation for 2026 #8233), merged into main as bda23eac4c today. Against the commit before it (79a393dedd), the merge is clean (tree 8a3be0b80a).
  • Fix. Merge main and keep both the mt_ssp and ia_ssa entries. The other open batch PRs will need the same rebase.

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 critical and 3 should items; details in the report above. The amounts, the administration split and the five documented source conflicts check out against Manual 6-B, 441 IAC 51/52/177, Iowa Code 249.3 and POMS SI 01415.058 F. 30 expectations were hand-checked, rulespec-us#1837 is valid, and CI is green. Most of Pavel's earlier items are fixed (status table in the report). Critical 1: SMME couples compare half the couple's income (ssi_countable_income/2) with the 2-person 120% FPL limit. Example: each spouse with $1,700 of Social Security gets [0, 0] married, but $1 when single. That contradicts 441 IAC 51.7(6) under any reading. (1) The IHHRC dependent allowance (177.2(1)"f"(3), $497 less the child's income) isn't computed, so the Manual 6-B examples pay $0 by default. (2) Case 45 pins full participation for a January 7 RCF entry, but 52.1(3)"a"(6) shields income up to the SSI rate in the entry month. (3) Two undocumented 52.1 conflicts: RCF pays $0 without a facility rate where 52.1(3)/51.4(3) give the $38.47 maximum, and the $22 blind standard is limited under 52.1(4). Branch note: this now conflicts with main in HUD unearned.yaml and spm_unit_benefits.py since Montana #8233 merged.

@PavelMakarchuk PavelMakarchuk 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.

Program Review

IDs: C = critical, SA = should address, G = suggestion. C1-C3, SA1-SA13 and G1-G13 keep their May 14 IDs; new findings start at C4, SA14 and G14. Items that DTrim99 also raised (review at the same head) say "(also raised by DTrim99)".

Source Documents

Branch Status

  • 32 ahead, 11 behind main (645fcd3); merge-base f198773; GitHub CONFLICTING / DIRTY.
  • Conflicts: policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml:27 and policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py:29. Main filled the same slot with mt_ssp (#8233), ok_ssp (#10165), ny_ssp (#10158), ri_ssp (#10168), sd_ssp (#10169) and va_ag (#10172), merged 2026-10-20.
  • Resolution: merge main, keep all six main entries and add the one Iowa line in each file (order has no effect). household_state_benefits.yaml, SNAP unearned.yaml and programs.yaml auto-merge correctly. This is C5.

Prior findings

May 14 (29 IDs): 20 resolved, 1 accepted decline, 1 out of scope, 1 n/a, 6 open or partial.

ID Status Evidence at the head
C1 IHHRC participation left out SSI RESOLVED ia_ssa_care_countable_income.py:53-67 adds ssi; Case 24 = 20 / 380
C2 Tests locked the bug RESOLVED Case 24 mirrors 6-B Ms. A
C3 POMS reference RESOLVED ia_ssa_federal.py:18 cites SI 01415.058 F
SA1 Stale 51.6 cites RESOLVED Comments cite 51.5(1), 51.7(2), 51.7(6)
SA2 Duplicated logic RESOLVED Shared ia_ssa_ihhrc_participation / _amount
SA3 FLH $142 history RESOLVED (moot) $142 = 162 - 20 (ia_ssa_federal.py:72)
SA4 State resource parameters ACCEPTED DECLINE Comment ia_ssa_eligible.py:35-38; 6-B p.12 cites 416.1202
SA5 12 boundary tests PARTIAL #2, #8, #9, #11, #12 done; #3, #6 moot; #4, #10 now in C4; #1, #5, #7 open
SA6 default_value PARTIAL 4 inputs still implicit
SA7 Template RESOLVED All 8 YAMLs
SA8 $2,031 anchor RESOLVED 6-B p.26 prints $2,031; NOTE ia_ssa_federal.py:81-86
SA9 Comment density RESOLVED ia_ssa.py 91 lines
SA10 Booleans RESOLVED Rewritten (G32)
SA11 FLH income basis RESOLVED ia_ssa_federal.py:61-66; new split is SA21
SA12 Ch. 50 anchor RESOLVED (moot) Removed
SA13 Anchors PARTIAL Code 249 still #page=1
G1-G4 RESOLVED 85 cases, sequential, Case N,; SMME coverage input
G5 $3,000 couple tests OPEN, raised to SA Removing the pooling still passes 85
G6 DP couple boundary OPEN No group_income == need case
G7 Cornell vs eCFR OUT OF SCOPE Now main's child_support_share.yaml (#10165); #10242
G8 177 maximum benefit RESOLVED ihhrc_cost_limit.yaml:21 cites 177.8(3)
G9 51.7(6) / 249.3(4)(g) on the 120% file OPEN Cites only 6-B p.77
G10-G12 RESOLVED Input docs; Iowa child deeming; tuples
G13 n/a

April 23 items still open: C5 deductions (PARTIAL) -> SA14, SA17; S5 -> SA6; S6 -> G22; S15 -> G6; S16 -> SA5 #1; Sugg 5 and 10 -> SA15; Sugg 9 -> G21; Sugg 12 -> G36. S4 (microsimulation inputs) stays declined and documented.

Critical (Must Fix)

C4. SMME couples: half the couple's income is tested against the 2-person guideline (also raised by DTrim99)

  • Where: ia_ssa.py:60-65 sizes the guideline by marital_unit.nb_persons(); :73-78 compares it with ia_ssa_smme_countable_income = ssi_countable_income + ssi (ia_ssa_smme_countable_income.py:15), which is half the couple's income for a joint claim.
  • Example (2026-01, both 66, SMME, coverage set, Social Security $1,700/month each): model 1,690 each vs 1.2 x 2-person FPG = 2,164, so ia_ssa = [0, 0]. Unmarried, the same people get [1, 1]. The rule gives [1, 1] under either reading (own 1,680 > 1,596; combined 3,380 > 2,164). Coverage on one spouse gives [0, 0], not [1, 0].
  • Rule: 51.7(6) "Income of a recipient ... must exceed 120 percent of the federal poverty level" (IAC 51 p.2); "SSI income criteria", no family size (6-B p.77). The ia_ssa.py:58-59 comment says 6-B gives the unit size; it does not.
  • Test gap: Cases 32-35, 56, 57 input the SMME income; only Case 50 (single) runs the formula.
  • Fix: choose and document a reading. Couple reading (as ia_ssa_federal.py:38-41 and msp_countable_income / msp_fpg): smme_income = where(joint, person.marital_unit.sum(smme_income), smme_income) with joint = ssi_couple_computation_applies. Document the ineligible-spouse case. Add: couple at $1,700 each -> [1, 1]; combined 2,164.00 -> [0, 0], 2,164.02 -> [1, 1] (SS 13,104 / 13,104.12 a year each); one spouse covered -> [1, 0]; single through the formula (SS 19,392 -> 0; 19,392.12 -> 1).

C5. Merge conflict; CI never tested the merged tree (also raised by DTrim99)

  • See Branch Status. The 27-pass run (39398361007) finished 12:27 UTC; the first conflicting main commit merged 15:00 UTC, and GitHub builds no merge ref while DIRTY.
  • Fix: merge main, keep both sets of entries, make format, push, and let CI run (integration Cases 8-9 read both lists).

C6. Residential care couples stay combined and halved after the month of entry

  • Where: ia_ssa_care_countable_income.py:25, 27, 54-56, 68 sets combine = ssi_couple_computation_applies for non-IHHRC care and halves the couple's income and SSI in every month. The ia_ssa_category.py:29 docstring gives no Iowa input; the only route is overriding federal ssi_claim_is_joint (YEAR), which also changes federal SSI.
  • Examples ($38.47/day, aged spouses):
    • 6-B Mr. K, April (resident SS $175, spouse at home $100): manual 175 + 839 - 130 = 884, pays 30 x 38.47 - 884 = 270.10; model 528.60.
    • Both residents, SS $1,500 / $500, month after entry: manual 0 + 308.57; model 322.57 + 322.57 = 645.14.
    • Example 4 (no SSI before entry; Mr. B $890, Mrs. B $870): manual uses 890 from entry; model 880, and $404.10 vs $270.10 in June.
  • Rule: "treat the spouses as a couple during the month of entry, then as individuals beginning the month after", and separately from entry when neither received SSI (6-B p.60); p.61, p.68, p.70.
  • Fix: for RESIDENTIAL_CARE, budget each spouse on own SSI-method income plus an individual SSI amount after the entry month (and from entry when neither had SSI); keep the couple budget only for the entry month (input from SA16). Document the SSA-side assumption (p.61: the lower-income spouse "must apply for and accept SSI"). Add Mr. K April (270.10), the $1,500 / $500 couple (0 / 308.57) and one spouse in RCF (SA5 #7).

Should Address

SA14. IHHRC dependent allowance not computed (also raised by DTrim99)

  • ia_ssa_ihhrc_participation.py:25-31 deducts only $994 / $1,491 plus the input.
  • 6-B (cost $400 where silent): Mr. B (SS 1,400, child 125): manual 1,400 - 994 - 372 = 34, pays 366; model 406, pays 0. Ms. C (1,300; child 210): 19 / 381 vs 306 / 94. p.42 household (spouse earns 4,500, two children): 0 / 400 vs 726.50 / 0.
  • Rule: 177.2(1)"f"(3) "the SSI standard for a dependent ... for each dependent living in the home" (IAC 177 p.1); "$497 Maximum additional allowance for each dependent" (6-B p.43).
  • Fix: add the sum of ssi_ineligible_child_allocation over co-resident children (372 / 287 / 497 + 497 here; already used at ia_ssa_income_deemed_from_parents.py:58-62). Narrow the input documentation to medical needs; add the three examples; NOTE the p.42 bullet that names only the couple allowance.

SA15. Residential care with no rate entered pays $0 (also raised by DTrim99)

  • ia_ssa_rcf_daily_rate.py:11 (implicit 0, "Leave at 0 when no rate is approved"); ia_ssa.py:32-34; Case 20 (ia_ssa.yaml:247) pins 0.
  • Direction and magnitude: $0 vs 31 x 38.47 - 864 = 328.57 at the maximum rate (up to $1,192.57/month). No microsimulation effect.
  • Sources conflict: 52.1(3) "beginning July 1, 2017 ... payment ... will be based on the maximum per diem rate" (IAC 52 p.1); Code 249.12(3) (p.5); 6-B still lists facility rates and the 2004 $17.86 flat rate (6-B p.72).
  • Fix: choose the no-rate reading, record the conflict in a NOTE and on rulespec-us#1837, rewrite the input documentation, re-pin Case 20.

SA16. RCF month of entry: Case 45 pins full participation (also raised by DTrim99)

  • Case 45 (ia_ssa.yaml:988, "Entry on January 7", 25 days) expects 97.75. For a resident from home, participation is max(994 - 130 - 994, 0) = 0, so the payment is 961.75. SS $1,200 entrant: model 0 vs 885.75.
  • Rule: 52.1(3)"a"(6) income "will not be applied ... except to the extent the income exceeds the SSI benefit for one person or for a married couple" (IAC 52 p.2); 6-B p.63.
  • Fix: relabel Case 45 as a discharge month (52.1(3)"b") and add an entry-from-home case (961.75), or add an entry-month input that deducts the SSI individual rate (couple rate with a spouse at home). Rewrite the deductions-input documentation around the rule.

SA17. RCF impairment-related work expenses applied after the one-half exclusion

  • ia_ssa_care_countable_income.py:28-32, 57-65 has no IRWE step; the deductions input is subtracted after $65 + 1/2 (ia_ssa.py:33).
  • 6-B Mr. L (income 700, earnings 333, IRWE 100): manual 654; model 704 without the entry, 604 with it (error IRWE / 2). An SSI recipient who enters IRWE is overpaid by the full IRWE.
  • Rule: 52.1(3)"a"(1) IRWE "plus $65 plus one-half" (IAC 52 p.1); Mr. L (6-B p.65).
  • Fix: an IRWE input subtracted from earnings before _apply_ssi_exclusions, or document the IRWE / 2 entry for non-SSI residents. Add Mr. L.

SA18. RCF personal needs allowance frozen, but Iowa Code sets its uprating

  • rcf_personal_needs.yaml:9-11 says 52.1 "publishes no method"; Case 52 (ia_ssa.yaml:1153, 2027-01) keeps 130 and pays 293.57.
  • Rule: Code 249.9A(1) increases the PNA "by the same percentage and at the same time as" the SSI COLA (Code 249 p.4); practice 126 x 1.028 -> 130.
  • 2027 (3.6%): PNA about 134.68-135; Case 52 about 298.25-298.57.
  • Fix: uprate by the SSI COLA (state the rounding as inferred), cite 249.9A, re-pin Case 52. In rcf_daily_limit.yaml:9-11 cite Code 249.12(3) (appropriations) and call the 2027 $38.47 a frozen projection.

SA19. 2026 levels back-fill 2015-2025 while ia_ssa is in the 2023-2025 aggregates (also raised by DTrim99)

  • Iowa parameters start 2026-01-01; the PR adds ia_ssa to household_state_benefits.yaml:90, 198, 311 (resolved back to 2015) and to the SNAP and HUD lists.
  • GL 6-B-46 2025 levels: dependent $503, per diem $37.60, PNA $126 (p.28, p.64, p.74). Model 2025-01: DP 518 vs 503; RCF 355.57 vs 324.60.
  • Fix: add 2025-01-01 entries citing GL 6-B-46 and a 2025 case; for 2024 and earlier add letters (not acquired) or drop ia_ssa from the 2023-2024 blocks.

SA20. family_life_supplement.yaml:15 opens a page without the value

  • #page=30 shows only $1,156 / $1,026 / $130; "$162 ($1,156 - $994 SSI standard)" and $142 are on 6-B p.35. Fix: #page=35.

SA13 (carried, PARTIAL). Code 249 anchors open the heading only

  • ia_ssa.py:12, ia_ssa_eligible.py:12, ia_ssa_nonfinancial_eligible.py:12 use #page=1; 249.3(1)-(4) incl. (4)(a)(2), (4)(g) start on Code 249 p.2. Fix: #page=2.

SA21. Care income drops all interest and dividends with no source

  • ia_ssa_care_countable_income.py:36-44; federal ssi, the SSA-paid rows and SMME still count them (#10079 open).
  • RCF SSI recipient, $50/month interest: model ssi 964, care income 964, ia_ssa 358.57; under (c)(22) 994 / 994 / 328.57 (same total; $30 moves to Iowa). FLH SSI-only resident with $5/month interest: the gate excludes it but the top-up test (ia_ssa.py:43-49) counts it, so it pays 142 instead of 162.
  • Rule: 20 CFR 416.1124(c)(22) "Interest and dividend income from a countable resource" (eCFR); 8-E with listed exceptions (8-E p.23).
  • Fix: NOTE citing (c)(22), 8-E and #10079 (remove the subtraction when #10079 lands, or it double-excludes); move the sources to a referenced parameter; use the same basis for has_other_income; add a case.

SA22. Spouse and child tests count marital-unit members

  • ia_ssa_eligible.py:32, ia_ssa_care_countable_income.py:27, ia_ssa_ihhrc_participation.py:28-30, ia_ssa.py:60, ia_ssa_resources_deemed_from_parents.py:50. Without marital_units, everyone shares one unit.
  • Aged IHHRC parent (SS $9,600/yr, cost $400) with an adult child earning $60,000 (tax dependent), no marital units: couple allowance plus pooled earnings, participation 1,990.50, pays 0; explicit units pay 380, and federal SSI does not pair them (SSI 214). A disabled IHHRC child with two parents ($6,000) and no units is paid 400 instead of 0.
  • Rule: the IHHRC budget counts the "individual and spouse living in the home" (IAC 177 p.1); resources pool only "with a spouse" (6-B p.12).
  • Fix: _ssi_spouse_index(person, period) >= 0 or ssi_couple_computation_applies for "has a spouse", the federal child test (SA24), and one case without marital_units.

SA23. SSA rounding and $1 minimum untested

  • ia_ssa_federal.py:105-112: replaced by return payment, all 85 cases pass. Blind, SS $12,426/yr: raw 0.50, head pays $1; SS $12,365.34/yr: 5.555 -> 5.56.
  • Fix: add both cases (SI 02001.005).

SA24. Iowa parental resource deeming overrides SSA's finding for SSI children

  • ia_ssa_resources_deemed_from_parents.py:48-52 omits the exclusions in is_ssi_resource_deeming_child; ia_ssa_eligible.py:34 adds the result for every category.
  • Blind child 10, two parents with $6,000, deeming waiver: SSA deems 0 and pays SSI 994; Iowa deems 3,000, so the $22 becomes 0.
  • Rule: "For an SSI recipient, accept the Social Security Administration's determination" (6-B p.9).
  • Fix: build on is_ssi_resource_deeming_child (checked: no cycle, 85 pass) and keep the IHHRC branch (6-B p.46), or NOTE the omitted exclusions.

G5 (carried, raised to Should Address). $3,000 spouse-resource limit untested (also raised by DTrim99)

  • ia_ssa_eligible.py:23-33; removing the pooling passes 85. IHHRC recipient 65 + spouse 50: 2,500 + 400 -> 400; 2,500 + 600 -> 0 (6-B p.12). Fix: add both cases.

SA5 (carried, PARTIAL). Remaining boundary tests

  • #1 RCF participation equal to the month's cost; #5 FLH with $10/month other income (no top-up; pin it, 6-B p.35); #7 one spouse in RCF (with C6).

SA6 (carried, PARTIAL). Implicit defaults

  • Add default_value to ia_ssa_dependent_countable_income, ia_ssa_ihhrc_monthly_cost, ia_ssa_rcf_daily_rate and ia_ssa_smme_coverage_eligible.

Suggestions

  • G6 (carried) DP group income at need - 0.01 ($1) and at need (0).
  • G9 (carried) smme_minimum_fpg_rate.yaml: add 51.7(6) (IAC 51 p.2) and 249.3(4)(g); link IAC 51 in ia_ssa.py, ia_ssa_federal.py, ia_ssa_nonfinancial_eligible.py.
  • G14 Blind $22 with RCF/IHHRC is right; NOTE 52.1(4) (IAC 52 p.2) vs 6-B p.20, p.42 and POMS code A; fix the PR body's "concurrent category" basis (also raised by DTrim99).
  • G15 ihhrc_cost_limit.yaml:9-17 overstates the conflict: 177.9(4) (IAC 177 p.5, "177.9(3)" typo) and 177.11(4) (2/5/25) support the manual (also raised by DTrim99).
  • G16 Cite the 2/5/25 edition of ch. 177 (p.2, p.5) in the five IHHRC files (177.10(2)"b" for the partial month); "IAB" -> "IAC 8/5/26" (ihhrc_cost_limit.yaml:21).
  • G17 DEPENDENT_PERSON on one spouse pays [259, 0], not $518: treat as a DP couple or pin it (also raised by DTrim99).
  • G18 Document that DEPENDENT_PERSON certification covers the dependent's resources (51.5(2)) (also raised by DTrim99).
  • G19 Case 58 (ia_ssa.yaml:1240): comment that it becomes 380 with #10242; NOTE at ia_ssa_care_countable_income.py:33-35; route child_support_share.yaml nits to #10242 (also raised by DTrim99).
  • G20 Add ia_ssa to Iowa CCA unearned sources now (#10304) (also raised by DTrim99).
  • G21 ia_ssa.py:30-31 "31-day ceiling" describes absent code; cite 52.1(3)"d" (also raised by DTrim99).
  • G22 Spell out "State Supplementary Assistance" in labels, not "Iowa SSA" / "SMME" (also raised by DTrim99).
  • G23 programs.yaml note: microsimulation pays only the blind supplement, so results run low (SSA: 734 Iowa recipients, average $248.07, December 2025) (also raised by DTrim99).
  • G24 Case 54 comment: "must not be more than $1,156" (6-B p.34) (also raised by DTrim99).
  • G25 Move Cases 36-43 and resources 3-5 to 2026-01; comment Case 15's 28-day month.
  • G26 Case 43 (ia_ssa.yaml:886): one SPM unit and family span two households; split them.
  • G27 SMME: reuse fpg() or msp_fpg instead of the inline CONTIGUOUS_US guideline; adds if the income stays a plain sum.
  • G28 Share the SSA rounding (ia_ssa_federal.py:109-112 copies _ssi_state_supplement.py:47-52).
  • G29 ia_ssa_countable_for_snap / _for_hud are identical; covered days duplicated (ia_ssa.py:28-29, ia_ssa_ihhrc_amount.py:25-26).
  • G30 Case 26 expect 206.45; Case 13 name ("state-only" is the SSA row); integration Cases 1-7 assert only ia_ssa; resources Case 2 echoes its input.
  • G31 Tell users to enter a shared deduction on one spouse (ia_ssa_ihhrc_participation.py:30).
  • G32 Simplify the five-way OR (ia_ssa_eligible.py:23-29); NOTE YEAR ssi_claim_is_joint vs MONTH ssi_couple_computation_applies.
  • G33 Comment pages: 52.1(4) is IAC 52 p.2 (ia_ssa_federal.py:14-15); add 6-B 40, 46, 58 (ia_ssa_care_countable_income.py:18), 40, 57-61 (ia_ssa_category.py:21); POMS #f2a / #f2 unverified (use #f); 416.1205 for the limits.
  • G34 DP/FLH continue up to 3 months in a medical institution (6-B p.11); ia_ssa_federal.py:74-75, 92 stops them at once.
  • G35 Document: DP $20 allocation and need-based income (6-B p.26); 177.2(1)"g"(1)2 child standard; SMME blind under 65 (Code 249.3(4)"a"); IHHRC child earnings; SMME spouse resources by Medicaid group; bed-day caps; RCF child under 16.
  • G36 Low cases: 2026 FLH gate with real income; FLH couple, one with income; blind FLH couple 823 / 845; unequal IHHRC costs; RCF rate below cap; SSI parent or two children in deeming; adult with child support.

Investigated and cleared

  • Page lists in reference titles: prescribed by the repo CLAUDE.md:150-155 (#10009); 64 such titles on main. Not a finding.
  • Non-January case periods as CRITICAL: plugin-only rule; CI ran all 85; 118 such periods on main. Kept as G25.
  • Federal child_support_share.yaml: identical on main (#10165); out of scope (G19).
  • Blind $22 with RCF/IHHRC, also for an over-income resident: matches 6-B p.20, p.42 and POMS code A (600-dpi re-read); NOTE only (G14).
  • SMME "exceed" vs 249.3(4)(g) "at least": follows 51.7(6) and 6-B; documented; Cases 56-57.
  • Case 43: no SPM-unit or family variable in the ia_ssa tree; corrected variants give [0, 400].
  • $2,031 vs POMS $2,053, FLH gate < vs "not more than", $961.10 couple limit, IHHRC ceiling as eligibility: supported or no dollar effect.
  • SA4 decline accepted. All 9 2026 values match their sources.

PDF Audit Summary

Category Count
Documents 5 PDFs (6-B, IAC 52, 177, 51, Code 249) + POMS F, 7-E, GL 6-B-46/47, IAC 177 2/5/25, 8-E, eCFR
Confirmed matches 135
2026 values mismatched 0 of 9
Rule mismatches (code run + page re-read) 7: C4, C6, SA14-SA18
Out-of-year value mismatch 1: SA19 (2025)
Rejected / false positives 2 PDF items, 2 house-rule items
Anchors 47: 40 correct, 4 refinable, 3 wrong (SA13); 1 href on the wrong page (SA20); 0 missing

Validation Summary

Check Result
Regulatory C4, C6; SA14-SA19, SA21
References SA13, SA20; G9, G14-G16, G33
Code patterns SA6, SA22, SA24; G27-G32
Tests 0 of 20 variables untested; gaps SA5, SA23, G5, C4; Cases 20, 45, 52 pin contested values
CI 27 pass / 3 skipping (superseded run) on 3b9e925; predates the conflict
Local 85/85 passed at the head (13.4 s)
Partner tests None touched

Review Severity: REQUEST_CHANGES

Three critical items (C4, C5, C6) and 15 should-address items are open. The May criticals are fixed, and every 2026 value matches its source.

Next Steps

  1. Merge main, resolve the two lists (C5), and let CI run.
  2. Fix C4 and C6 with the couple cases.
  3. Address SA14-SA24, G5, SA5, SA6, SA13; re-pin Cases 20, 45, 52.
  4. Update rulespec-us#1837 for C4, C6, SA14-SA16, SA18, G14, G15.
  5. To apply fixes: /fix-pr 8017.

hua7450 and others added 4 commits October 20, 2026 18:12
…tance

- SMME tests an eligible couple's combined income against the couple guideline.
- In-home care deducts the dependent child allowance; residential care
  defaults to the maximum per diem, shields income up to the SSI rate in the
  entry month, and budgets spouses as individuals after the entry month.
- The residential care personal needs allowance rises with the SSI COLA
  (Iowa Code 249.9A(1)).
- Interest and dividends are excluded consistently (20 CFR 416.1124(c)(22)).
- The spouse test uses SSI's spouse definition, and SSA's resource-deeming
  finding stands for SSI children.
- Certifying either spouse applies the dependent-person couple level.
- New source-conflict NOTEs, page anchors, defaults and boundary tests;
  child_support_share.yaml is left as on main (issue 10242).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SMME income qualifies at exactly 120 percent of the poverty guideline
  (Iowa Code 249.3(4)(g), "at least"), and SMME requires age 65 or
  disability (249.3(4)(a)); 441 IAC 51.7(6) and 51.7(2) read otherwise.
  Both follow the statute-first rule and are queued as source-conflict
  candidates.
- Remove 12 test cases that repeated a kept case's branch and outcome, and
  retarget two boundary cases so they pin the comparison operator.
- Update case citations in NOTEs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model follows Iowa Code 249.3(4)(g) and (4)(a) over 441 IAC 51.7(6)
and 51.7(2); the entries wait in source_conflicts/candidates.yaml until
they are registered.

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

hua7450 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. This round's changes are in 040662b; main is merged in 24acb4f. Each shared-list conflict keeps every state's line.

Critical 1, SMME couples: fixed.

  • ia_ssa_smme_countable_income now combines the couple's SSI countable income and SSI when the SSI couple computation applies. ia_ssa sizes the guideline by the recipient and any spouse (ia_ssa_has_spouse), so a couple's combined income is compared with the two-person threshold of 2,164.
  • New ia_ssa.yaml Case 47 is your couple ($1,700 of Social Security each): combined 3,380, so [1, 1]. It was [0, 0].
  • Case 48 is $2 above the threshold with one spouse covered (2,166, so [1, 0]), and Case 49 is $2 below it (2,162, so [0, 0]). These also close Pavel's May SA5 items for SMME.
  • With a spouse who isn't aged, blind or disabled, the model counts only the income SSI deems. A NOTE says so, and the body lists it under "Not modeled".

Should 1, the IHHRC dependent allowance: fixed.

  • ia_ssa_ihhrc_participation now deducts ssi_ineligible_child_allocation ($497 less the child's income), summed over the tax unit for a head or spouse recipient. The code quotes 177.2(1)"f"(3) and 6-B p.43.
  • New Case 50 is Mr. B (6-B p.43): participation 34, payment 366. It was 406 and 0.
  • New Case 51 is the p.42 household (a spouse earning $4,500, two children): participation 0, payment 400. It was 726.50 and 0.
  • Ms. C (p.44) now gives participation 19, as in the manual (payment 381 with a $400 cost, in a probe).
  • For in-home care, the ia_ssa_care_additional_deductions documentation now covers only other dependents and unmet medical needs.

Should 2, the residential care entry month: fixed (your options a and b together).

Should 3(a), the residential care rate: fixed.

Should 3(b), the blind $22 with a care supplement: documented.

Suggestion 1, 2025 values: declined. Years before 2026 are out of scope for this batch. The body still says earlier years are unverified estimates, and #8974 tracks history.

Suggestion 2, 177.9(4): documented. The ihhrc_cost_limit.yaml comment now cites 177.9(4) (IAC 8/5/26, with the cross-reference that should read 177.8(3)) and 177.11(4) of the 2/5/25 edition, and the reference adds p.5. The body and conflict 2 now call the ceiling resolved. Your Cases 22-23 (now 16-17) are unchanged.

Suggestion 3:

  • (a) Fixed. Certifying either spouse of an eligible couple now applies the dependent-person couple level. New integration Case 11 gives [259, 259]; it was [259, 0].
  • (b) Fixed with tests. New Cases 54 and 55 are an in-home recipient (65) with a spouse (50): $2,500 + $400 is eligible and pays 400; $2,500 + $600 is not and pays 0. This also closes Pavel's G5.
  • (c) Documented. The ia_ssa_category documentation says DEPENDENT_PERSON certification covers the dependent's own resources under 51.5(2).

Suggestion 4, Case 58 (now 46): fixed. A comment links the expectation to #10242: once SSI applies (c)(11), SSI is 14, participation 20 and ia_ssa 380. The expected values are unchanged.

Suggestion 5, Child Care Assistance: declined. It changes another program's income definition, so it stays in #10304 for after this merges.

Suggestion 6:

Branch note, main's statute-first rule (#10287): SMME income and SMME for a blind person under 65 now follow Iowa Code 249.3(4)(g) and (4)(a), not the "exceed" of 51.7(6) that you reviewed and the SSI categories of 51.7(2), under PolicyEngine-US's statute-first rule (CONTRIBUTING.md, "Source conflicts", merged on 2026-10-20). Cases 44-45 pin "at least" 120% (1,596 pays 1, and 1,595.99 pays 0), and Cases 72 and 76 pin a blind applicant under 65 without and with a disability (0 and 1). 040662b lists both in source_conflicts/candidates.yaml as us-ia:smme-income-at-least-120-percent and us-ia:smme-blind-under-65 until they are registered. These are conflicts 4 and 9 on TheAxiomFoundation/rulespec-us#1837.

Branch note, the shared-list conflicts: resolved. The main merge (24acb4f) keeps the mt_ssp line you flagged and the ok_ssp, ny_ssp, ri_ssp, sd_ssp and va_ag lines merged after your review, beside the Iowa lines in household_state_benefits, the SNAP and HUD unearned lists and spm_unit_benefits.py.

CI: the red jobs come from one test, test_conflict_sounding_comments_do_not_grow (the second red job only aggregates that shard). It flags main's Florida and South Dakota LIHEAP files, not this PR's. Main fixed it in #10334, so I'll merge main again after your review.

105 Iowa supplement cases pass locally (76 in ia_ssa.yaml, 12 in integration.yaml, 7 in ia_ssa_resources_deemed_from_parents.yaml, 6 in ia_ssa_nonfinancial_eligible.yaml, 4 in ia_ssa_income_deemed_from_parents.yaml). You reviewed 85; this round adds 32 and removes 12 that repeated a kept case's branch and outcome, so this reply uses the new case numbers, and the body's test plan maps each removed case to the case that covers it.

@hua7450

hua7450 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, Pavel. These changes are in 040662b; main is merged in 24acb4f. Items marked "(David's review)" were fixed for David's review of the same commit; your examples were re-checked against this head.

C4, SMME couples: fixed (David's review).

C5, the merge conflict: fixed. main is merged at 24acb4f. HUD unearned.yaml and spm_unit_benefits.py keep the mt_ssp, ok_ssp, ny_ssp, ri_ssp, sd_ssp and va_ag lines beside Iowa's, and CI has run on the merged tree (CI note below). child_support_share.yaml merges cleanly because this PR leaves it identical to main (G19).

C6, residential care couples after the month of entry: fixed.

  • New ia_ssa_rcf_couple_budget keeps the couple budget only in the month of entry, and only when either spouse received SSI or both enter that month (6-B pp.60-61; 441 IAC 51.4(3)). It reuses ia_ssa_care_initial_partial_month, so there is no new input.
  • After that, a married resident's care income is own income plus the SSI individual amount computed from it. The resident's resources are tested alone (p.12), and the entry-month deduction is halved only in a couple-budget month.
  • Results:
    • Mr. K in April gives 270.10 (it was 528.60). That is new Case 57, which also closes SA5 item 7.
    • Your $1,500 / $500 couple gives [0, 308.57] (it was [322.57, 322.57]). That is Case 58.
    • Mr. B's own $890 is used from the month of entry, and June gives 270.10 (it was 404.10). That is Case 60.
    • Mr. A in July gives participation 347.50 and 845.07, as on p.68 (it was 815.57). That is Case 73, which also gives 615.52 in June.
    • Spouses who enter together are a couple under 51.4(3): 721.84 each in Case 59. In Case 61, a resident's own $2,500 is tested alone and fails (it was eligible, at 577.07).
  • A NOTE records the p.61 assumption that SSA then pays each spouse as an individual ("must now apply for and accept SSI benefits"). PolicyEngine-US federal SSI has no input for spouses who live apart and keeps the couple amount, so that is a federal follow-up.
  • The body lists two edge cases under "Not modeled": a spouse who enters after the other spouse's month of entry, and the spouse at home, who is still tested with the resident's resources.

SA14, the IHHRC dependent allowance: fixed (David's review); NOTE added.

SA15, residential care with no rate entered: fixed (David's review). With no rate entered, the model pays the $38.47 maximum (52.1(3); 51.4(3)). ia_ssa_rcf_daily_rate is only for a lower facility rate. Case 20 (now 15) gives 328.57 (it was 0), and Case 56 (a rate of 35) gives 221. A NOTE quotes the rule against 6-B p.72's "two options". This is conflict 6.

SA16, the residential care entry month: fixed (David's review).

  • The renamed ia_ssa_care_initial_partial_month also marks the month a resident enters from home. That month deducts the SSI rate for one person, or the couple rate with a spouse at home (52.1(3)"a"(6); 6-B pp.63-64).
  • Your SSI-only entrant over 25 days gives 961.75, and your $1,200 entrant 885.75.
  • Case 45 (now 33) is now a discharge month (52.1(3)"b"), so 97.75 stands. Cases 52 and 53 cover an entrant alone (685.75) and one with a spouse at home (882.75).
  • The input documentation is rewritten around the rule. Conflict 8 records the later p.64 wording.

SA17, impairment-related work expenses: documented.

  • For a resident without SSI, entering one-half of the expenses in ia_ssa_care_additional_deductions reproduces 52.1(3)"a"(1). Case 62 ($1,100 of Social Security, with Mr. L's $333 of earnings and $100 of expenses) gives participation 1,054 under both the rule and the model, and pays 138.57.
  • For an SSI recipient, SSA's payment rises by the same one-half, so care income doesn't change (p.59). The documentation now says to enter none, and a NOTE explains both cases.
  • Mr. L's own figures can't be reproduced: with $700 of Social Security he would qualify for SSI, which the model requires him to take up (p.10). Federal SSI doesn't model these expenses yet (Deduct impairment-related work expenses from SSI countable earned income and SGA #3669).

SA18, the personal needs allowance: fixed.

  • rcf_personal_needs.yaml now uprates by gov.ssa.uprating under Iowa Code 249.9A(1), rounded to the nearest dollar. The rounding is inferred from $123, $126 and $130 in General Letters 6-B-45 to 6-B-47 (123 × 1.025 = 126.08; 126 × 1.028 = 129.53).
  • 2027 is $135, and Case 52 (now 40) gives 298.57 (it was 293.57).
  • rcf_daily_limit.yaml cites Iowa Code 249.12(3) and calls 2027's $38.47 a frozen projection.

SA19, 2025 values: declined. Years before 2026 are out of scope for every supplement PR in this batch. The body labels earlier years as unverified estimates, and #8974 tracks history.

SA20, the family-life home anchor: fixed. family_life_supplement.yaml now cites p.35, where "$162 ($1,156 - $994 SSI standard)" and the $142 appear.

SA13, the Code 249 anchors: fixed. The hrefs in ia_ssa.py, ia_ssa_eligible.py and ia_ssa_nonfinancial_eligible.py now go to p.2.

SA21, interest and dividends: fixed.

SA22, spouse tests: fixed.

  • New ia_ssa_has_spouse requires a two-person marital unit that SSI's spouse test pairs. It replaces the marital-unit size test in the four spouse tests you listed.
  • Your parent with a dependent adult child earning $60,000 and no marital units now gives 380 (it was 0). Case 65 pins a 22-year-old student variant at 380 (it was 400).
  • Your disabled child with two parents and no marital units is now deemed 3,000 and paid 0. Case 75 pins this branch with the manual's Child B (p.47): $5,500 less the $3,000 allowance deems 2,500, so it pays 0. Case 65 tests the spouse test without marital units.
  • The fifth place you listed, the child test, moves to is_ssi_resource_deeming_child (SA24).

SA23, SSA rounding and the $1 minimum: fixed with tests. Case 66 ($12,426 a year, raw 0.50) pays $1. Case 67 ($12,365.34, raw 5.555) pays 5.56.

SA24, parental resource deeming for an SSI child: fixed. The child test is now is_ssi_resource_deeming_child, so Iowa deems only where SSA would and accepts SSA's determination for an SSI recipient (6-B p.9). The in-home care branch (p.46) is kept. Your blind child under the deeming waiver keeps $22 (Case 68; it was 0). There is no cycle.

G5, the $3,000 couple limit: fixed (David's review). Cases 54 and 55: $2,500 + $400 gives [400, 0], and $2,500 + $600 gives [0, 0].

SA5, the remaining boundary tests: fixed with tests.

  • Item 1 is Case 69: participation equal to the month's cost pays 0.
  • Item 5 is Case 64: with $10 of other income, SSA pays 142 and there is no $20.
  • Item 7 is Case 57 (Mr. K, one spouse in residential care), alongside Case 53.

SA6, implicit defaults: fixed (David's review). The four inputs have explicit default_values.

G6, the dependent-person boundary: fixed with tests. Case 70 (group income 1,511.99) pays $1. Case 71 now pins "less than": $1,492 of Social Security (1,472 countable) and $40 of dependent income make group income exactly 1,512, so it pays 0, where "not more than" would pay 40.

G9, the 120% citations: fixed. smme_minimum_fpg_rate.yaml cites 51.7(6) (David's review) and now Iowa Code 249.3(4)(g). IAC 51 is now linked in ia_ssa_federal.py (51.5(1)) and ia_ssa_nonfinancial_eligible.py (51.2 and 51.7(2)). ia_ssa.py already linked it for David's review (51.4(3) and 51.7(6)).

G14, the blind $22 with care: documented (David's review). A NOTE in ia_ssa_federal.py quotes 52.1(4) against 6-B pp.20 and 42 and POMS code A. The body no longer cites "concurrent category". This is conflict 7. The page comment now gives IAC 52 pp.1-2 (G33).

G15, the cost ceiling: documented (David's review). ihhrc_cost_limit.yaml cites 177.9(4), whose cross-reference should read 177.8(3), and 177.11(4) of the 2/5/25 edition. Conflict 2 is marked resolved.

G16, the 2/5/25 edition: fixed. The five in-home care files cite the IAC 2/5/25 edition of chapter 177, with 177.10(2)"b" for the first partial month. The ihhrc_cost_limit.yaml title now says "IAC 8/5/26".

G17, dependent person on one spouse: fixed (David's review). Certifying either spouse applies the couple level: integration Case 11 gives [259, 259], and Case 12 gives [259, 659].

G18, the dependent's resources: documented (David's review) in the ia_ssa_category documentation (51.5(2)).

G19, child support: fixed.

G20, Child Care Assistance: declined. Counting ia_ssa there changes another program's income definition, so it stays in #10304.

G21, the "31-day ceiling" comment: fixed (David's review). It now explains 51.4(3) and 52.1(3)"d".

G22, labels: declined. Labels abbreviate the program by house convention, 6-B itself uses "SSA", and the descriptions spell it out.

G23, the registry note: fixed (David's review). The programs.yaml note says microsimulation pays only the blind supplement. I didn't add the SSA recipient figures, because I haven't re-checked them.

G24, Case 54 (now 42): fixed (David's review). Its comment quotes p.34's "must not be more than".

G25, case periods: partly fixed. Case 15 (now 10) explains the 28-day month. Your Cases 36-43 (now 25-31, as Case 36 was removed) and resources Cases 3-5 key their YEAR inputs by 2026:, which works in a non-January month, so they stay.

G26, Case 43 (now 31): fixed. The family and SPM unit are split by household. The result is still [0, 400].

G27, the inline guideline: declined. Reusing fpg() or msp_fpg is a refactor with no change in Iowa results.

G28, shared rounding: declined. Sharing it means editing the shared _ssi_state_supplement.py helper, which this PR leaves unchanged.

G29, the SNAP and HUD variables: declined. They have separate legal bases (7 CFR 273.9(c)(5); 24 CFR 5.609(b)(6), (b)(19)), and the covered-days logic is one line in each file.

G30, test details: fixed.

  • Your Case 26 is removed; Cases 32 and 34 cover it. Both expect 206.45, with a comment.
  • Case 13 (now 9) is renamed "the Social Security Administration pays ... without federal SSI". Your Case 3, also named "state-only", is removed; Case 67 covers it.
  • Integration Cases 1-7 also assert ssi, Cases 1-5 also assert ia_ssa_federal, and Case 7 also asserts care income and participation.
  • Resources Case 2 stays, because it pins the stock behaviour (no division by 12).

G31, shared deductions: fixed. The ia_ssa_care_additional_deductions documentation says to enter a shared deduction on one spouse, because in-home care adds the couple's entries together.

G32, the five-way OR: declined. The OR stays. The YEAR ssi_claim_is_joint read is gone from ia_ssa_eligible (C6 and SA22), and no Iowa file reads it now, so the NOTE isn't needed.

G33, comment pages: partly fixed. The page comments in ia_ssa_federal.py, ia_ssa_care_countable_income.py and ia_ssa_category.py are fixed, and ia_ssa_eligible.py cites 20 CFR 416.1205. The POMS #f2 and #f2a anchors exist in the page HTML, so they stay.

G34, temporary institutionalization: declined. Continued dependent-person and family-life home payments for up to three months need new inputs. The body lists them under "Not modeled".

G35, documentation gaps: documented.

G36, low-priority cases: declined. These cover branches already tested. Cases 56, 63 and 64 now cover a lower facility rate and the family-life home with real income.

Branch note, main's statute-first rule (#10287): SMME now follows Iowa Code 249.3(4)(g) and (4)(a) over 441 IAC 51.7(6) and 51.7(2) (C4 and G35 above), which reverses the "exceed" reading your review cleared. Income of exactly 120% qualifies (Case 44 pays 1, and Case 45, at 1,595.99, pays 0), and a blind person under 65 needs a disability (Case 72 pays 0, Case 76 pays 1). 040662b lists both in source_conflicts/candidates.yaml as us-ia:smme-income-at-least-120-percent and us-ia:smme-blind-under-65 until they are registered.

TheAxiomFoundation/rulespec-us#1837 and its conflicts comment are updated for C4, C6, SA14-SA16, SA18, G14 and G15, with companion tests AB-AP and conflicts 9-11.

Test consolidation. Your review saw 85 cases; this round adds 32 and removes 12 that each repeated a kept case's branch and outcome, leaving 105. By your numbers, with the kept case in the new numbering: 2 (integration Case 8), 3 (67), 4 (4), 11 (64), 14 (14 and 33), 21 (32 and 16), 25 (35), 26 (32 and 34), 27 (integration Case 9), 30 (ia_ssa_nonfinancial_eligible.yaml Case 6), 32 (44) and 36 (26). Two cases were retargeted to pin the operators. Case 45 has SMME income one cent below 120% and pays 0, so with Case 44 (exactly 120%, which pays 1) it pins "at least". Case 71 pins "less than" for the dependent-person standard (G6). This reply uses the new numbers.

CI: the red jobs come from one test, test_conflict_sounding_comments_do_not_grow (the second red job only aggregates that shard). It flags main's Florida and South Dakota LIHEAP files, not this PR's. Main fixed it in #10334, so I'll merge main again after your review.

105 Iowa supplement cases pass locally (76 in ia_ssa.yaml, 12 in integration.yaml, 7 in ia_ssa_resources_deemed_from_parents.yaml, 6 in ia_ssa_nonfinancial_eligible.yaml, 4 in ia_ssa_income_deemed_from_parents.yaml).

@DTrim99

DTrim99 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator

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

PR #8017 (author: hua7450). This round reviews head 040662b003; round 1 reviewed 3b9e925f43. The branch is 36 commits ahead of main and 4 behind. Four commits landed since round 1. The three author commits are large (about 3,900 diff lines), so I treated this round as a substantial rewrite and reviewed the new code as if it were a first review.

  • 0231a5751b, "Address David's and Pavel's reviews" (29 files, +1,633/−121). It does the following:
    • combines an SMME couple's income;
    • adds the in-home dependent allowance, the residential care entry-month deduction, the maximum daily rate as the default, the residential care couple budget (ia_ssa_rcf_couple_budget), ia_ssa_has_spouse and the interest and dividend exclusion (excluded_unearned_sources.yaml);
    • uprates the personal needs allowance by the COLA;
    • adds the NOTEs and 32 test cases.
  • fb5eeee563, "Follow the Iowa Code for SMME and consolidate duplicate tests" (12 files, +293/−444). SMME now qualifies at exactly 120% of the poverty guideline (Iowa Code 249.3(4)(g)) and requires age 65 or disability (249.3(4)(a)). It also removes 12 duplicate cases.
  • 24acb4f560, a merge of main at 1f678c72cd, with two hand-resolved blocks: HUD unearned and spm_unit_benefits.py.
  • 040662b003, which lists the two SMME statute conflicts in source_conflicts/candidates.yaml.

Summary

Ziming fixed the round-1 critical item and all three should items. He fixed or documented four of the six suggestions; the other two (2025 values and Child Care Assistance) are declined with reasons I accept.

  • Critical 1 (SMME couples): fixed in 2026, the only claimed year.
    • An eligible couple's combined SSI countable income plus SSI is now compared with the two-person guideline.
    • My round-1 couple (Social Security of $1,700 each) gets [1, 1]; the old head gave [0, 0].
    • Cases 47-49 pin the couple at $1,700 each, $2 above the threshold with one spouse covered, and $2 below it. I traced all three by hand.
  • Should 1 (in-home dependent allowance): fixed. The manual's Mr. B gives 34 / 366 (Case 50), and its working-spouse household gives 0 / 400 (Case 51).
  • Should 2 (residential care entry month): fixed.
    • The month of entry from home deducts the SSI rate for one person, or the couple rate with a spouse at home (Cases 52-53).
    • My Case 45 is now a discharge month (Case 33).
  • Should 3(a) (maximum daily rate): fixed. With no rate entered, residential care pays $38.47 (Case 15: 328.57).
  • Should 3(b) (blind $22 alongside care): documented with a NOTE that quotes both sides. The PR body's basis is corrected.

Review of the rewrite.

  • Hand checks. I checked every new or changed expectation by hand: 30 new ia_ssa.yaml cases, 4 changed cases, 2 new integration cases and the outputs added to integration Cases 1-7.
  • The new couple logic follows the manual's examples. That covers the couple budget only in the month of entry, the SSI individual amount afterwards, and resources tested alone after entry. Mr. K, Mr. B and Mr. A on 6-B pp.67-70 all reproduce.
  • No new defect changes a result for a household entered with marital units.
  • Two narrow gaps are suggestions.
    • The SMME branch still drops the statute's substantial gainful activity (SGA) exception. meets_ssi_disability_criteria would fix that in one line.
    • In a situation without marital units, SMME's income test mixes the couple and single readings.

The wage lesson (OK #10165, NH #10156 round 3) finds nothing for Iowa: this is the Ohio pattern.

  • Iowa administers residential care, in-home care and SMME itself, but measures their income by SSI policy:
    • 441 IAC 52.1(3)"a": "the income considered available to the resident pursuant to supplemental security income (SSI) policy";
    • 6-B p.40: for non-SSI recipients, "determine countable income using SSI policies as defined in 8-E";
    • 6-B p.6: Iowa uses the SDX income figures for SSI recipients;
    • 8-E bases wages on 20 CFR 416.1110.
  • Reading ssi_earned_income, which nets cafeteria-plan premiums, is therefore right.
  • 6-B p.59's own figure confirms it: an SSI recipient with earnings over $85 "will commonly have countable income ... equal to ... $1,004". The model reproduces that figure for a worker with pre-tax premiums, and a gross-wage count would not.
  • An optional NOTE, as for Ohio, is Suggestion 3.

The NH #10156 key check finds nothing.

  • The PR has no parameter or breakdown keyed by a variable.
  • The state-gated int ia_ssa_care_partial_month_days is only compared.
  • ia_ssa_category (not gated, default REGULAR) is only compared. That covers every living arrangement: residential care, in-home care, family-life home, dependent person and SMME.
  • The Nebraska case passes.

Other checks.

  • Merge resolutions: both blocks keep every sibling line and add Iowa's once. All five shared lists match main plus Iowa.
  • Microsimulation default: microsimulation still pays only the blind supplement, and programs.yaml now says so.
  • Source-conflict guard: the two statute-first readings are in candidates.yaml on the backlog path, as New Hampshire's is.

CI and branch.

Prior findings status

Finding Status Evidence
Critical 1: a married SMME applicant was tested on half the couple's income against the two-person guideline Fixed The code. ia_ssa_smme_countable_income.py:33-35 returns where(joint, person.marital_unit.sum(income), income), where income is ssi_countable_income + ssi and joint is ssi_couple_computation_applies. ia_ssa.py:104-109 sizes the guideline as where(has_spouse, 2, 1) and compares with >= (lines 118-125). The trace for my round-1 couple (2026-01; both 70, covered; $1,700 each): SSI is joint, 3,400 − 20 = 3,380 > 1,491, so SSI is 0. ssi_countable_income is 1,690 each, and the sum is 3,380. The threshold is 1.2 × (15,960 + 5,680) / 12 = 2,164, and 3,380 ≥ 2,164, so each gets $1. Case 47 asserts ia_ssa_smme_countable_income [3,380, 3,380] and ia_ssa [1, 1]. Boundaries. Case 48: 2 × 1,093 − 20 = 2,166 ≥ 2,164, but only person 1 is covered, so [1, 0]. Each spouse's own 1,073 is below 1,596, so this case pins the combined reading. Case 49: 2,162 < 2,164, so [0, 0]. Singles are unchanged: Case 38 (1,980) pays 1, and Cases 44-45 bracket 1,596. Years. The PR claims only 2026, and the logic doesn't depend on the year. In 2027 it uses the 2026 guideline until HHS publishes the next one. The ineligible-spouse case, which I asked to be decided: a NOTE (lines 28-32) and the body's "Not modeled" list record that only the income SSI deems counts while the guideline is for two people. I accept that. The rule names no family size, and the result follows the combined reading whenever SSI deems. #1837 has companion tests R-T.
Should 1: the in-home dependent allowance of 441 IAC 177.2(1)"f"(3) wasn't computed Fixed The code. ia_ssa_ihhrc_participation.py:49-53 subtracts head_or_spouse * tax_unit.sum(ssi_ineligible_child_allocation), which is $497 less each SSI-ineligible child's income. The comment quotes (f)(3) and 6-B p.43. The tests. Case 50 (Mr. B, 6-B p.43): 1,400 − 994 − (497 − 125) = 34, and 400 − 34 = 366. Case 51 (the p.42 household): (4,500 − 65) / 2 = 2,217.50, and 2,217.50 − 1,491 − 994 < 0, so 0 and 400. The same path gives Ms. C 1,300 − 994 − 287 = 19 (p.44). Other changes. The documentation of ia_ssa_care_additional_deductions now covers only other dependents and unmet medical needs. The p.42 couple-allowance bullet is recorded as conflict 11, following the rule and p.43. I agree with that reading.
Should 2: Case 45 pinned full participation for a resident entering on January 7 Fixed (both options) The code. ia_ssa.py:63-68 deducts entry: the SSI couple rate if ia_ssa_has_spouse, otherwise the individual rate, halved in a couple-budget month, and applied only when ia_ssa_care_initial_partial_month is set. The tests. Case 52: 1,400 − 130 − 994 = 276, and 38.47 × 25 − 276 = 685.75. Case 53 (the spouse at home isn't aged, blind or disabled): 1,700 − 130 − 1,491 = 79, and 961.75 − 79 = 882.75. Old Case 45 is now Case 33, "Discharged January 26", with 97.75 under 52.1(3)"b". The sources match. 52.1(3)"a"(6) and 6-B pp.63-64 deduct the SSI rate for one person or "for a married couple". Mr. T's April budget (p.68: 1,150 − 130 − 1,491 − 497) shows that the couple rate applies in the month of entry even when the spouses are treated separately, as the code does for Mr. B (Case 60). Conflict 8 records the later p.64 wording.
Should 3(a): residential care paid $0 without an entered rate, contrary to 52.1(3) Fixed ia_ssa.py:43-48 uses p.rcf_daily_limit unless a positive rate is entered, and caps an entry at the maximum. Case 15 gives 328.57, Case 56 (a rate of 35) gives 1,085 − 864 = 221, and Case 14 (a rate of 100) gives 328.57. The NOTE at lines 33-42 quotes 52.1(3), 51.4(3) and 6-B p.72's "two options". Iowa Code 249.12(3) ("reimbursed based on the maximum per diem rates established by the general assembly") supports the rule. This is conflict 6 on #1837.
Should 3(b): the $22 blind standard is for a recipient "not receiving another type of state supplementary assistance" Documented (as recommended) The NOTE at ia_ssa_federal.py:80-93 quotes 52.1(4) against 6-B pp.20 and 42 and POMS F.1 code A, citing Case 11 and integration Case 9. The body no longer cites the concurrent-category NOTE. This is conflict 7.
Suggestion 1: re-add the 2025 values Declined (accepted) Years before 2026 are out of scope for every PR in the batch. The body says earlier years are "unverified historical estimates", programs.yaml gives verified_years: "2026", and #8974 (open) tracks history. This matches #10164, #10170 and #10171.
Suggestion 2: cite 177.9(4) for the cost ceiling Fixed The ihhrc_cost_limit.yaml comment cites 177.9(4) (IAC 8/5/26, "Excessive costs. When the cost of care exceeds the maximum established in subrule 177.9(3)") and 177.11(4) of the 2/5/25 edition (which cites 177.10(3)). I confirmed both on their p.5. Conflict 2 is marked resolved.
Suggestion 3: couple and certification readings Fixed (a, b); documented (c) (a) ia_ssa_federal.py:62-63 gives the couple level when either spouse is certified. Integration Case 11 gives [259, 259]. (b) Cases 54 (2,900, so 400) and 55 (3,100, so ineligible). (c) The ia_ssa_category documentation says certification covers the dependent's own resources under 51.5(2).
Suggestion 4: Case 58 pins the federal child-support gap Fixed Case 46's comment links #10242 and gives the post-fix values (SSI 14, participation 20, 380). The care-income NOTE says to remove the read once #10242 lands.
Suggestion 5: wire ia_ssa into Iowa Child Care Assistance Declined (accepted) It changes another program's income definition, so it stays in #10304 (open). The body says so.
Suggestion 6: polish Fixed, except (b) moved and (c) declined (a) smme_minimum_fpg_rate.yaml cites 51.7(6) and Iowa Code 249.3(4)(g). (b) child_support_share.yaml is now identical to main's (#10165), so its eCFR link moves to #10242; I accept that. (c) The labels keep "Iowa SSA", following house style and 6-B's own usage; I accept that. (d) The "31-day ceiling" comment is replaced (ia_ssa.py:69-71). (e) The four inputs have explicit defaults. (f) The impairment-related work expenses guidance is documented and pinned by Case 62 (1,054 under both the rule and the model). (g) The programs.yaml note now says "microsimulation pays only the blind supplement". (h) Case 42 quotes "must not be more than". (i) #1837 is updated (see Axiom).
Round-1 branch note: Montana #8233 conflicts Resolved 24acb4f560 keeps mt_ssp and the later siblings (see Verified).

Pavel's newer items that this rewrite took up changed results: C6 (couple budget), SA18 (allowance uprating), SA21 (interest), SA22 (spouse test), SA23 (rounding), SA24 (deeming child) and G6 (the "less than" boundary). I reviewed them as new code below. They are his findings to clear, but I found no defect in them.

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

1. Apply the SGA exception in SMME's disability test. It is a one-line fix, and I recommend it.

  • Where.
    • ia_ssa_nonfinancial_eligible.py:46-48 builds the SMME category test from is_ssi_aged | is_ssi_disabled.
    • is_ssi_disabled is meets_ssi_disability_criteria & ~ssi_engaged_in_sga.
    • The NOTE at lines 30-34 and the body's "Not modeled" list say the exception "is not modeled, because is_ssi_disabled excludes people working above the SGA level".
  • The law. All three sources keep SGA workers in:
    • Iowa Code 249.3(4)(a)(2): "Disabled as defined by 42 U.S.C. §1382c(a)(3), except that being engaged in substantial gainful activity shall not preclude a determination of disability for the purpose of this subparagraph"; (c): "Would be eligible for supplemental security income benefits but for having excess income or but for being engaged in substantial gainful activity and having excess income."
    • 441 IAC 51.7(2): "other than limits on substantial gainful activity and income".
    • 6-B p.10: "EXCEPTION: For the Supplement for Medicare and Medicaid Eligibles, an applicant must meet disability standards other than the inability to engage in substantial gainful activity."
  • Worked by hand. Take a disabled 50-year-old with SMME coverage, Social Security disability of $900 and wages of $2,000 a month, which is above the $1,690 SGA level.
    • SMME income is 880 + (2,000 − 65) / 2 = 1,847.50, which is at least 1,596. So the statute, the rule and the manual all pay $1.
    • The model pays $0, because ssi_engaged_in_sga is true.
  • Why only a suggestion.
    • The gap is documented, and round 1 accepted the "Not modeled" list.
    • The affected group is small: disabled people working above SGA, with countable income of at least 120% of the poverty guideline and full Medicaid without a premium or spenddown. The amount is $1.
    • But the rewritten line now applies 249.3(4)(a) statute-first for blindness, and main already has the pre-SGA variable. So the stated reason no longer holds.
  • Fix.
    • Use person("is_ssi_aged", ...) | person("meets_ssi_disability_criteria", ...) for the SMME branch.
    • Delete the NOTE and the body line.
    • Add the case above (expected 1), and add it to Update New York tax rules for 2022 #1837.

2. In a situation without marital units, SMME's income test mixes the couple and single readings.

  • Where.
    • ia_ssa_smme_countable_income.py:34-35 combines income when ssi_couple_computation_applies holds. ssi_claim_is_joint is marital_unit.sum(aged_blind_disabled & head_or_spouse) > 1.
    • ia_ssa.py:104 sizes the guideline with ia_ssa_has_spouse, which requires marital_unit.nb_persons() == 2.
  • What happens.
    • When marital units are omitted, Core puts the whole household in one default unit.
    • For an aged couple living with a child, joint is true but has_spouse is false. So the whole unit's income is compared with the one-person guideline.
    • Example: Social Security of $850 each. Combined countable income is 1,680, and 1,680 ≥ 1,596 pays $1 each. With explicit marital units, 1,680 < 2,164 pays $0.
    • This contradicts ia_ssa_has_spouse's own NOTE ("A default unit of three or more people budgets each member alone").
  • Why only a suggestion. CONTRIBUTING.md says marital units never hold children, so these situations are malformed. The household also needs SMME certification inputs. The federally paid rows' joint sums predate this PR and are shared by the batch.
  • Fix. Combine on joint & has_spouse in ia_ssa_smme_countable_income, so the guideline and the income use the same couple test. Alternatively, pin the current behavior in a case.

3. Record why the care income may read SSI's wage count (optional). This is the same as Ohio's round-2 Suggestion 1.

  • Why it looks like the New Hampshire pattern. Residential care, in-home care and SMME are state-administered. 177.2(1)"f" applies its disregards "from gross income". 8-E p.50 says "Count the gross amount of wages". Yet ia_ssa_care_countable_income.py:45-49 and the parental deeming read ssi_earned_income, which nets pre-tax premiums since Document disjoint health premium inputs and correct consumer treatment #10046.
  • Why it is right for Iowa.
    • 52.1(3)"a" counts "the income considered available to the resident pursuant to supplemental security income (SSI) policy plus the SSI benefit".
    • 6-B p.40: "For people who are not SSI recipients, determine countable income using SSI policies as defined in 8-E". p.61 uses the same 8-E basis for residential care.
    • p.6: "In Department-administered programs, the income information transmitted by the SDX is to be used in computing client participation." The SDX "Gross earned income" field (p.41) is SSA's own wage figure.
    • 8-E p.50 gives 20 CFR 416.1110 as the legal reference for wages. SSA reads that rule with the cafeteria-plan exclusion (POMS SI 00820.102 C.2).
    • No Iowa source has an Oklahoma-style clause that keeps salary reductions in wages.
  • A worker with pre-tax premiums, worked by hand (January 2026):
    • Residential care, SSI recipient. Wages are $500 a month, with $100 of pre-tax premiums.
      • ssi_earned_income is 400. SSI is 994 − (400 − 85) / 2 = 836.50.
      • Care income is (400 − 65) / 2 + 836.50 = 1,004. That is the figure 6-B p.59 gives for "earned income of more than $85".
      • Participation is 874, so ia_ssa is 1,192.57 − 874 = 318.57.
      • A gross-wage count would give 1,054 and 268.57, which contradicts p.59.
    • In-home care, no SSI. Social Security is $1,000, wages $600, premiums $100 and cost $400.
      • SSI is 0, because 980 + 217.50 > 994.
      • Care income is 1,217.50, participation 223.50 and the payment 176.50. A gross-wage count would give 126.50.
  • Fix (optional). Add a NOTE at ia_ssa_care_countable_income.py:45 citing 52.1(3)"a", 6-B pp.6, 40 and 59, and 8-E p.50. Add the first worker as a case (318.57), and add a "Wages" line to Update New York tax rules for 2022 #1837.

4. Polish.

  • source_conflicts/candidates.yaml. The us-ia:smme-blind-under-65 question expands SMME as "Iowa's supplement for people with medical expenses". It is the Supplement for Medicare and Medicaid Eligibles. This text will go into the register shared with Axiom.
  • ia_ssa.yaml Case 65's comment. It says the 22-year-old student "is not under 18, so there is no dependent-child allowance". SSI's child test also reaches students under 22, so the reason is that a 22-year-old is not under 22. The result is right; only the comment needs rewording.

Verified

  • The rewrite against the sources. I re-read the Iowa Code (249.pdf), 441 IAC 51 (IAC 6/10/26), 52, 177 (IAC 8/5/26) and its 2/5/25 edition, 6-B (May 22, 2026 pages) and 8-E.

    • Iowa Code 249.3(4)(g): "Have income of at least one hundred twenty percent of the federal poverty level". (4)(a) names only "(1) Sixty-five years of age or older" and "(2) Disabled as defined by 42 U.S.C. §1382c(a)(3)". So both statute-first readings follow the text, and CONTRIBUTING.md's "Source conflicts" rule (from Tie source-conflict markers to the register shared with Axiom #10287) requires them.
    • Iowa Code 249.9A(1): the allowance rises "by the same percentage and at the same time as federal supplemental security income ... are increased". So uprating by gov.ssa.uprating is right: 130 × 328.746 / 317.265 = 134.70, which rounds to 135. The nearest-dollar rounding matches 123 to 126 to 130.
    • 6-B p.29: "The income of the dependent is not considered when calculating the supplement amount. Only the income of the eligible person or eligible couple is subtracted". This confirms Case 4 and the arithmetic in Case 71.
    • 6-B pp.60-61, 67-70. Spouses are a couple only in the month of entry when either received SSI, and are separate from entry when neither did (p.60). Spouses sharing a room are "a couple" in the first month (p.61; 51.4(3)). The Mr. A (pp.67-68), Mr. B (p.68) and Mr. K (pp.69-70) budgets match Cases 73, 60 and 57.
    • The in-home rule is unchanged across ARC 0460D. 177.4(1)"f"(3) of the 2/5/25 edition reads the same as 177.2(1)"f"(3).
  • Every new or changed expectation, checked by hand (2026 FBR $994 and $1,491; 2027 $1,029; guideline 15,960 / 5,680; residential care month 38.47 × 31 = 1,192.57).

    • ia_ssa.yaml:
      • 47-49: above.
      • 50-51: above.
      • 52-53: above.
      • 54: 2,900 ≤ 3,000; SSI 994; 994 − 1,491 < 0, so 400.
      • 55: 3,100 > 3,000, so ineligible for both.
      • 56: 221.
      • 57:
        • March: SSI couple 1,236; (275 + 1,236) / 2 = 755.50; 755.50 − 130 − 745.50 < 0; 38.47 × 22 = 846.34.
        • April: 994 − 155 = 839; 175 + 839 − 130 = 884; 38.47 × 30 − 884 = 270.10.
      • 58: after the month of entry, each spouse is alone. 1,500 − 130 ≥ 1,192.57, so 0. 500 + 514 − 130 = 884, so 308.57.
      • 59: both enter: 2,000 / 2 − 130 − 745.50 = 124.50; 846.34 − 124.50 = 721.84 each.
      • 60:
        • May: no SSI, so separate; 890 − 130 − 1,491 < 0; 38.47 × 20 = 769.40.
        • June: 124 + 890 = 1,014; 884; 270.10.
      • 61: own 2,500 > 2,000, so [false, true]; [0, 0].
      • 62: 1,100 + 134 − 130 − 50 = 1,054; 138.57.
      • 63: interest excluded; SSA 142 + Iowa 20 = 162.
      • 64: care income 1,004; 142 with no $20.
      • 65: no spouse; 994 − 780 = 214; 1,014 − 994 = 20; 380.
      • 66: 994 + 22 − 1,015.50 = 0.50, so $1.
      • 67: 1,016 − 1,010.445 = 5.555, so 5.56.
      • 68: waiver child; deemed 0; 22.
      • 69: 1,322.57 − 130 = 1,192.57, so 0.
      • 70: 518 − 517.99 = 0.01, so $1.
      • 71: 1,472 + 40 = 1,512, which is not less than 1,512, so 0.
      • 72: blind 50, not disabled, so not nonfinancially eligible; 0.
      • 73:
        • June: SSI 1,491 − 647.50 = 843.50; 1,043.50 − 130 − 1,491 < 0; 38.47 × 16 = 615.52.
        • July: 814 + 200 − 130 − 536.50 = 347.50; 845.07.
      • 74: interest excluded; care income 994; 328.57.
      • 75: 5,500 − 3,000 = 2,500 deemed; ineligible.
      • 76: disabled; 2,020 − 20 = 2,000 ≥ 1,596, so 1.
    • Changed ia_ssa.yaml cases:
      • 15: 328.57.
      • 40: 1,029 − 135 = 894; 298.57.
      • 44: 1,596 ≥ 1,596, so 1.
      • 45: 1,595.99 < 1,596, so 0.
    • integration.yaml:
      • Cases 1-5: ssi 745.50 each; ia_ssa_federal [22, 0], [22, 22], [259, 259], [270, 270], [400.50, 400.50].
      • Case 6: SSI 0; 191.
      • Case 7: SSI (3,000 − 85) / 2 = 1,457.50, so 33.50 and 16.75 each; care income 1,467.50 + 33.50 = 1,501; participation 10; 395.
      • Case 11: 1,491 < 2,009; 518 / 2 = 259 each.
      • Case 12: 259 each; in-home 1,491 − 1,491 = 0, so 400; [259, 659].
  • The consolidation is safe. Each of the 12 removed cases has a kept case on the same branch:

    • old 2 → integration Case 8;
    • old 3 → 67;
    • old 4 → 4;
    • old 11 → 64;
    • old 14 → 14 and 33;
    • old 21 → 16 and 32;
    • old 25 → 35;
    • old 26 → 32 and 34;
    • old 27 → integration Case 9;
    • old 30 → nonfinancial Case 6;
    • old 32 → 22;
    • old 36 → 26.

    The three variable test files are unchanged.

  • The wage lesson. See Suggestion 3 and the Summary. Both pre-tax premium workers were traced by hand.

    • The parental deeming (ia_ssa_income_deemed_from_parents) also reads ssi_earned_income. That is consistent with 8-E's deeming steps, which follow SSI.
    • The SSA-paid rows follow SSA's own figures, which is right for an SSA-administered payment.
  • The NH Add New Hampshire state supplementation for 2026 #10156 check:

    • No keyed reads. No Iowa formula reads a parameter by a variable key. The parameters are nine scalars and one list. The guideline reads fpg.first_person.CONTIGUOUS_US by attribute and multiplies by size − 1.
    • Gated variables. The gated variables are ia_ssa_care_partial_month_days (int, default 0, used only in where(partial > 0, ...)) and six booleans.
    • ia_ssa_category. It has no defined_for, defaults to REGULAR, and is used only in == and select across all six arrangements.
    • Coverage. Case 20 (Nebraska) passes, and the aggregate-list and mixed-state Python tests pass in CI.
    • No probe. No two-state probe was needed, because there is no keyed lookup to fail.
  • Merge resolutions (24acb4f560):

    • HUD annual_income/sources/unearned.yaml: nc_sa_countable_for_hud, nv_oss, mt_ssp, ok_ssp, ny_ssp, ri_ssp, sd_ssp and va_ag are kept, and ia_ssa_countable_for_hud follows va_ag, once.
    • spm_unit_benefits.py: "nj_ssp" through "va_ag" are kept, and "ia_ssa" follows "va_ag", once.
    • All five shared lists. Against the merge base 1f678c72cd, the only lines added are Iowa's: four in household_state_benefits.yaml (one per year block) and one in each of SNAP unearned, HUD unearned and spm_unit_benefits.py. programs.yaml changes Iowa's own entry in place.
    • Sibling counts. Every sibling's count equals main's: nj_ssp, pa_ssp, wy_ssp, nc_sa, nv_oss, mt_ssp, ok_ssp, ny_ssp, ri_ssp, sd_ssp and va_ag.
  • Microsimulation (the default rule for population effects).

    • What pays. ia_ssa_category defaults to REGULAR, and no dataset sets the category, care costs or SMME coverage. So a population run still pays only the blind supplement, through SSI take-up.
    • Nothing new reaches microsimulation:
      • the maximum-rate default, the entry month and the couple budget all sit behind RESIDENTIAL_CARE;
      • the dependent allowance and interest exclusion sit behind in-home care or the family-life home;
      • the allowance uprating applies only to residential care.
    • The registry. The programs.yaml note says so.
    • Cost. The new reads are cached SSI variables. ia_ssa_has_spouse reuses SSI's spouse helper, and CI's Microsimulation job passes.
  • The source-conflict guard (Tie source-conflict markers to the register shared with Axiom #10287).

    • The candidate entries. The SMME readings are listed as us-ia:smme-income-at-least-120-percent and us-ia:smme-blind-under-65, with follows: statute, state: ruled, code: [] and "Code not yet on main". That is the backlog form New Hampshire used (approved today).
    • CI. CI's candidate tests pass on this head, and the ratchet's grown set has no Iowa file.
    • The merged tree. main's Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334 only adds the Florida and South Dakota files to KNOWN_UNMARKED, and main hasn't changed candidates.yaml since the merge base. So the tree merged with main passes too.
    • The other readings. Iowa's other readings (conflicts 1, 3, 5-8, 10 and 11) set the rule or POMS against the manual, with no statute involved. So they need NOTEs, which they have, and no register entry.
  • References.

    • The new variable tuples have no titles and put # PDF pages ... comments above multi-page hrefs.
    • The parameter titles with page lists are quoted, with the href opening at the first page.
    • The 8-E anchor (p.23) and the 177.9(4) and 177.11(4) pages show their text.
  • Batch cross-cutting checks (one line each):

    # Check Verdict
    1 Axiom line Valid, rulespec-us#1837 queued; see below
    2 House-template descriptions All ten parameters follow it, including the new excluded_unearned_sources.yaml ("Iowa excludes these unearned income sources ...")
    3 Backdating Documented deferral (Suggestion 1, accepted); Iowa SSP 2017, 2018, 2019 #8974 open
    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: Iowa appears once in each list (four year blocks); SNAP and HUD use the in-home exclusion variants; no double count with ssi; Child Care Assistance deferred to Iowa CCA: count the State Supplementary Assistance payment (ia_ssa) as income #10304
    6 Income attribution Couples now follow 6-B pp.60-70 and the SMME couple rule; pinned by Cases 47-61, 73 and integration Cases 11-12; Suggestions 1-2 are the remaining gaps
    7 Sibling conflicts Branch note only (see Branch status)
    8 CI Two known failures caused by main, with no Iowa file (see CI status)
    9 State law Re-checked against Iowa Code 249.3, 249.9A and 249.12; 441 IAC 51.4-51.7, 52.1 and 177.2/177.8/177.9; 6-B; 8-E
  • The PR body.

    • Its "105 Iowa supplement YAML cases (76 ..., 12 ..., 7 ..., 6 ..., 4 ...)" matches CI's Quick Feedback.
    • Its conflict list matches the NOTEs and Update New York tax rules for 2022 #1837.
    • Its consolidation map matches the diff.
    • It lists the SGA exception under "Not modeled" (Suggestion 1).
  • The rest.

    • The changelog fragment changelog.d/ia-ssp.added.md is unchanged (top-level, added).
    • The PR touches no partner test files, and Household API Partners passes.
    • child_support_share.yaml is identical to main's.

Axiom line assessment

Valid: axiom: Iowa Code 249.3, 249.9A(1), 249.12(3); 441 IAC 51.4(3), 51.5(1)-(2), 51.7(2), 51.7(6), 52.1(1)-(4), 52.1(7), 177.2(1)"f"-"g", 177.8(2), 177.9(4), and 177.4(1), 177.10(2) (IAC 2/5/25); 20 CFR 416.1124(c)(22); Iowa HHS Employees' Manual 6-B, 7-E, 8-E; POMS SI 01415.058 F TheAxiomFoundation/rulespec-us#1837 queued.

  • Issue state.
    • Update New York tax rules for 2022 #1837 is open and labelled pe-parity. It was last updated on 2026-10-21 at 04:58 UTC, after the head was committed (04:55 UTC).
    • rulespec-us main (5796861e58, 2026-10-20) still has no module for this program: us-ia/regulations/iac/441/ holds only 41. A search finds no other Iowa supplementation issue. So queued is still the right form.
  • Dispatch-ready.
    • Module paths. The module table adds 249.9A, 249.12, 51.4 and 177.9, with both IAC editions and the 177.9(4) cross-reference note.
    • Verbatim law. It adds 249.9A(1), 249.12(3), 52.1(3)"a" and "a"(1), 177.2(1)"f"(3), 51.5(2), 416.1124(c)(22) with 8-E, and 6-B pp.60-61 and 76. These match the sources I downloaded.
    • Required outputs. They now include ia_ssa_has_spouse, ia_ssa_rcf_couple_budget, the dependent allowance, the entry-month deduction and the combined SMME couple, with the statute's "at least".
    • Companion tests. A-AP each have a source derivation. R-AP are new and map to Cases 15, 40, 47-76 and integration Case 11.
    • The conflicts comment. It has entries 1-11: 2 is marked resolved, 4 and 9 follow the statute and are queued for the register, and 6-8, 10 and 11 are new.
  • Matches the head: 105 cases (76 / 12 / 17), 14 formulas, 8 inputs and every reading.
  • If Suggestions 1-3 land: add the SGA exception (with its companion case), the default-unit reading and a "Wages" interpretation.

CI status

25 pass, 2 fail, 0 pending (gh pr checks 8017, rechecked at the end of the review). The run is 39546707750 (pull_request) on head 040662b003; it started 2026-10-21 04:55 UTC and finished 08:51 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,498 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 Iowa file is among them.
    • "Full Suite - Rest (Python + variables)" passes all its own tests (60, 55, 1,767 and 980). It fails only because it aggregates the shards: "Rest shards did not all succeed: shard-1=failure, shard-2=success".
    • Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334 (fec98b87c8) fixed the baseline on main at 13:24 UTC, after this run began. Merge main and re-run. Ziming says he will do that after this review.
  • Passed.
    • Quick Feedback ran all five Iowa files: ia_ssa.yaml 76, ia_ssa_income_deemed_from_parents.yaml 4, ia_ssa_nonfinancial_eligible.yaml 6, ia_ssa_resources_deemed_from_parents.yaml 7 and integration.yaml 12, all passed.
    • The rest. All 11 Baseline shards, all 9 Contrib shards, Microsimulation, Household API Partners, Package and compatibility, and PR validation pass. The Rest shard-1 log shows the program registry, aggregate-list, candidate and unemployment-reader tests passing.
  • Local runs: none completed. One small probe through the shared lock couldn't import this head: the local policyengine-core 3.26 lacks a function main now imports. CI covers every Iowa case at this head, so every trace above is 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 2: the round-1 critical (SMME couples) is fixed for 2026, with combined income against the two-person guideline, and all three should items are fixed. I reviewed the rewrite as new code: every new or changed expectation hand-checks, and the couple budget matches 6-B's Mr. K/B/A examples. The care income correctly follows SSI policy for wages (52.1(3)"a"; 6-B p.59). Both merge blocks keep every sibling's line. The two red checks are the known FL/SD LIHEAP ratchet failure. Four suggestions; I recommend Suggestion 1 (apply the statute's SGA exception in SMME, a one-line fix). Full report in the comment above.

hua7450 and others added 2 commits October 21, 2026 15:25
Iowa Code 249.3(4)(a)(2), 441 IAC 51.7(2) and 6-B p.10 say substantial
gainful activity does not preclude SMME disability, so the SMME branch
reads meets_ssi_disability_criteria. SSI counts no income for a person it
does not treat as aged, blind or disabled, so SMME income applies SSI's
exclusions to that person's own income (Case 77). Also name SMME correctly
in the candidate entry and correct Case 65's comment.

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

hua7450 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. Suggestions 1 and 4 are in 24231f8, and main is merged in 4fabd46, which brings in #10334 for the red check.

Suggestion 1, the SGA exception: fixed.

Suggestion 2, SMME without marital units: not changed. As you note, a household without marital units is malformed under CONTRIBUTING.md.

Suggestion 3, the care income's wage count: not changed. The code already follows 52.1(3)"a" and 6-B p.59, as you confirmed. I didn't add the NOTE.

Suggestion 4: fixed. The us-ia:smme-blind-under-65 question now names the Supplement for Medicare and Medicaid Eligibles, and Case 65's comment says SSI's child test reaches students only while they're under 22.

106 Iowa supplement cases pass locally (77 in ia_ssa.yaml), and test_source_conflicts.py passes on the merged tree.

@PavelMakarchuk PavelMakarchuk 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.

Program Review (round 4): Add Iowa state supplementation for 2026

IDs: C = critical, SA = should address, G = suggestion. Round-3 IDs keep their numbers; new findings start at C7, SA25 and G37. Commit 24231f8 landed after DTrim99 approved 040662b, so DTrim99 has not reviewed it; items that come from that commit say so.

Source Documents

Branch and CI

  • 38 ahead, 0 behind main (328d172); GitHub MERGEABLE. C5 is resolved: the HUD unearned list and spm_unit_benefits.py keep mt_ssp, ok_ssp, ny_ssp, ri_ssp, sd_ssp and va_ag and add Iowa once.
  • CI was still running at review time (17 pass / 10 pending, no failures); local run 106/106 Iowa YAML cases and 103/103 source-conflict guard tests pass at 4fabd46.
  • Branch note: the open sibling SSP PRs (#10156, #10164, #10166, #10170, #10171, #10173) will conflict with this branch on spm_unit_benefits.py (and most on the HUD list). Whichever lands first, the others keep both lines.
  • No partner test file is touched.

Critical (Must Fix)

C7. SMME compares one person's own income with the two-person guideline

  • Where: ia_ssa.py:104 sizes the guideline by ia_ssa_has_spouse (size = where(has_spouse, 2, 1)). ia_ssa_smme_countable_income.py:36, 44-55 adds a spouse's income only when ssi_couple_computation_applies, or when SSI deems spouse income above $497. On three paths the income is one person's own and the guideline is for two. The comment at ia_ssa.py:100-103 says the two-person line matches combined income; on these paths it does not. The SGA path (ia_ssa_smme_countable_income.py:37-53) came in 24231f8, after DTrim99's approval.
  • Rule: 6-B Income (SMME): "Income for eligibility is determined according to SSI income criteria. See 8-E, Income" (6-B p.77). 8-E applies SSI deeming to State Supplementary Assistance groups (8-E p.11); when the ineligible spouse's income is $497 or less, "Process as a one-person household" (8-E p.12); the poverty test then uses "a household size of one" (8-E p.14). SSI computes spouses separately when one is in a medical treatment facility (20 CFR 416.414(b)(3); the model's ssi_couple_computation_applies). The statute covers SGA workers ("shall not preclude a determination of disability", 249.3(4)(a)(2)) and people in "A medical facility" (249.3(4)(b)(4)) (Code 249 p.2); 441 IAC 51.7(5)"d" and (6) (IAC 51 p.2) set no family size. No source compares one person's own income with the two-person guideline. All pages re-read at 600 DPI.
  • Failing inputs (2026-01; SMME category and coverage set; 120% = 1,596 for one person, 2,164 for two; checked by running the model at the head):
Household Model Own income vs 1-person Combined vs 2-person
Both 70, Social Security $1,700 each; person2 in a medical treatment facility all year [0, 0] (no facility: [1, 1], Case 47) 1,680: [1, 1] 3,360: [1, 1]
Both SSDI $900 + wages $2,000 a month (above the $1,690 SGA level) [0, 0] (same couple at wages $1,600: [1, 1]) 1,847.50: [1, 1] 3,747.50: [1, 1]
Case 77 worker + spouse 45 earning $1,000 [0, 0] [1, 0] 2,347.50: [1, 0]
Aged 70, SS $1,700; spouse 60 with a $497 pension (SSI deems nothing) [0, 0] (at $498 SSI deems: [1, 0]) [1, 0] 2,177: [1, 0]
  • Why critical: the small, input-gated population argues for SHOULD ADDRESS; I keep it critical because it is the C4 pairing defect again, every reading pays $1 where the model pays $0, and round 3 rated C4 critical at the same $1. The NOTE at ia_ssa_smme_countable_income.py:31-35 covers only the last row, and 8-E p.12 contradicts that row, so the NOTE does not save it. A $90 rise in wages that crosses SGA moves a couple from [1, 1] to [0, 0], which is what 249.3(4)(a)(2) rules out.
  • Fix: size the guideline by whether the income includes a spouse's income, for example combined = joint | person("is_ssi_spousal_deeming_applies", period.this_year) and size = where(combined, 2, 1). A run at the head with only line 104 changed gives the rule's result in all four rows and leaves Cases 38, 47-49 and 77 unchanged. Rewrite the comment at ia_ssa.py:100-103 and the NOTEs at ia_ssa_smme_countable_income.py:24-35, 42-43 (cite 8-E p.12). The "Not modeled" line for spouse income on the SGA path can stay.
  • Tests to add: (a) row 1 with ssi_federal_living_arrangement: MEDICAL_TREATMENT_FACILITY on person2 for 2026: [1, 1]; (b) row 3 (SSDI 10,800 + wages 24,000 a year; spouse wages 12,000): ia_ssa_smme_countable_income [1,847.50, 457.50], ia_ssa [1, 0]; (c) row 4 (SS 20,400; spouse pension_income 5,964): [1, 0]; (d) the deeming pair: aged SS $1,620 a month + spouse $497 gives [1, 0], + spouse $498 gives [0, 0].

Should Address

SA25. SMME uses the 2026 poverty guideline in January-March 2026; Iowa adopts it on April 1

  • Where: ia_ssa.py:105-109 reads parameters(period).gov.hhs.fpg at the month, so January 2026 uses 15,960 / 5,680 (1,596 / 2,164). Cases 44-45 (ia_ssa.yaml:1031-1061), 47-49 (:1123-1258) and the candidates.yaml:1831 example ("exactly $1,596") all sit in 2026-01.
  • Rule: 441 IAC 75.1 defines the federal poverty level as the HHS levels "revised annually on April 1" (IAC 75 p.2; also 75.6(5), p.13). Iowa's desk aid RC-0130 gives 120% = $1,565 / $2,115 "Effective 4/1/25" (Rev. 04/25 p.2) and $1,596 / $2,164 "Effective 4/1/26" (Rev. 04/26 p.2). GL 8-F-111, effective January 1, 2026, still uses "$1,565 / $2,115" (p.18). The 8-E table with $1,565 / $2,115 (8-E p.7) is an October 15, 2025 snapshot reissued for a typo (GL 8-E-106, p.1), so it does not show that Iowa kept the 2025 levels all year. From April 2026 the model matches Iowa.
  • Failing input: Case 45 (single, SMME income 1,595.99, 2026-01): model 0; at Iowa's $1,565 the rule pays 1. Case 49 (couple, 2,162): model [0, 0]; at $2,115 the rule pays [1, 1]. A run of the PR's 12 SMME cases with the 2025 guideline flips exactly Cases 45 and 49; Cases 44 and 48 stop testing the boundary in January. The lag recurs every January-March.
  • Why should address, not critical: the April 1 date reaches SMME by inference (75.1 defines the term for the Medicaid chapters 74-88; the SSA chapters, Code 249.1 and 6-B p.77 do not define it), the repo's Medicaid and MSP variables also use the January guideline, and the effect is $1 a month for at most three months.
  • Fix: add a parameter for Iowa's adoption month (April), citing 441 IAC 75.1 and RC-0130, and read the prior year's guideline before it (pattern: tanf_non_cash_fpg.py fpg_year_start_month; wic_income_limit.py). At minimum, add a NOTE.
  • Tests: January 2026 boundary at $1,565 / $1,564.99 (single) and $2,115 / about $2,113 (couple; SSI couple totals are even); move Cases 44-45 and 47-49 to 2026-04 (or add April copies) for $1,596 and $2,164; make the candidate example say "from April 2026", and update the comments that state 1,596 or 2,164 for a January period.

SA26. The RCF per diem statute-vs-manual conflict is not in source_conflicts/candidates.yaml

  • Where: the deciding line is ia_ssa.py:43-48 (default p.rcf_daily_limit, $38.47). The NOTE at :33-42 quotes 52.1(3) and 51.4(3) against 6-B p.72 but does not cite Iowa Code 249.12(3); rcf_daily_limit.yaml:9-13, 19-20 cites 249.12(3) only for the appropriation.
  • Rule: Code 249.12(3): "Beginning July 1, 2017, privately operated licensed custodial facilities in Iowa shall be reimbursed based on the maximum per diem rates established by the general assembly" (Code 249 p.5); 52.1(3): "For periods of eligibility beginning July 1, 2017, and thereafter, payment ... will be based on the maximum per diem rate" (IAC 52 p.1); 6-B still gives "two options", a cost-related rate up to $38.47 or "A flat per diem rate ... $17.86 beginning February 1, 2004" (6-B p.72). Re-read at 600 DPI. CONTRIBUTING.md:82: "Every such conflict is recorded"; test_source_conflicts.py:36: candidates.yaml "lists every known conflict not yet registered".
  • Concrete input: SSI-only resident, no rate entered, January 2026: model 328.57 (Case 15); the manual's flat rate gives 31 x 17.86 = 553.66 < 864, so $0.
  • Why should address: the PR records its two other statute conflicts this way (candidates.yaml:1778-1839), and an issue comment on rulespec-us#1837 is neither the register nor the backlog. DTrim99's round 2 treated conflict 6 as rule-vs-manual with no statute; 249.12(3) puts a statute on one side. The guard checks only the entries that exist, so CI cannot catch this. Not critical: the model follows the statute.
  • Fix: add us-ia:rcf-maximum-per-diem-rate in the shape of :1778-1839: sources 249.12(3) #page=5 (statute), 52.1(3) #page=1 (regulation), 6-B #page=72 (manual); readings "based on the maximum per diem rates" vs the two options; example Case 15 ($328.57 vs $0); follows: statute, code: [], this PR, state: ruled, note "Code not yet on main: ia_ssa, ia_ssa_rcf_daily_rate" and that 249.12(3) names privately operated facilities. Add 249.12(3) to the NOTE at ia_ssa.py:33-42. No # Source conflict marker until the entry is registered.
  • Test: no new YAML case; Case 15 is the example, and test_source_conflicts.py checks the entry.

SA27. Entry-month resource pooling for a residential care couple is untested

  • Where: ia_ssa_eligible.py:42-44, couple = has_spouse & (community | ia_ssa_rcf_couple_budget). Only Cases 57 (March) and 59 set the couple budget, and both have no resources. With | ia_ssa_rcf_couple_budget removed, all 106 cases still pass (run at the head).
  • Rule: "When the applicant is living with a spouse, count the spouse's resources", and "$3,000 for a married couple living together" (6-B p.12); "follow SSI eligibility policy to determine if the spouse's income and resources must be considered" and "treat the spouses as a couple during the month of entry" (6-B p.60). Re-read at 600 DPI. The code is right; the test is missing.
  • Failing input: Case 57 (Mr. K) plus ssi_countable_resources: 2_100 on person1. Head: March ia_ssa_eligible [true, true], ia_ssa [846.34, 0]. Without the term: March [false, true], [0, 0].
  • Test to add (the Case 57 variant above, period: 2026): ia_ssa_rcf_couple_budget March [true, false], April [false, false]; ia_ssa_eligible March [true, true], April [false, true]; ia_ssa March [846.34, 0], April [0, 0]. It passes at the head and fails without the term.

SA19 (still open). 2026 levels back-fill 2025 while ia_ssa is in the 2023-2025 aggregates (also raised by DTrim99 in round 1)

  • Where: every Iowa parameter starts 2026-01-01 (dependent_amount.yaml:3, rcf_daily_limit.yaml:3, rcf_personal_needs.yaml:3), and ia_ssa is in household_state_benefits.yaml:97, 213, 334 (and 455), the SNAP list (2009 block), the HUD list (2024 block) and the undated spm_unit_benefits.py:35. The NOTE at rcf_personal_needs.yaml:13-15 itself quotes $123 and $126 for 2024-2025, but the parameter returns 130 for both years; the new uprating runs forward only.
  • Rule: GL 6-B-46: "The income limit and payment standard for a dependent relative is $503 per month", "The maximum residential care per diem rate is $37.60", personal needs allowance "$126" (GL 6-B-46 p.1); "Effective Date / January 1, 2025" (p.2). Re-read at 600 DPI.
  • Failing input (2025-01, age 70, SSI only; checked by running the model at the head): dependent person 518 vs 503 (+$15 a month); residential care, 31 days, 31 x 38.47 - (967 - 130) = 355.57 vs 31 x 37.60 - (967 - 126) = 324.60 (+$30.97). A dependent-person group with countable income from $1,470 to $1,485 is paid where the law pays 0. Microsimulation pays only the blind $22, which is right for 2025, so the aggregate effect is about nil; the error is per household.
  • Decision on the decline: not accepted. For it: twelve SSP PRs in this batch (six merged with DTrim99's acceptance, six open) put 2026-only programs in all four blocks, and the PR claims only 2026. Against it: #8974 covers only the 2017-2019 POMS levels and has no comments, and no issue covers 2020-2025, so "#8974 tracks history" is not accurate for 2025; Iowa's dependent amount, per diem and allowance change every January, so the back-filled 2025 levels are known wrong (unlike Montana's in #8233); the 2025 values are in a letter this review already holds; and the aggregate list allows start-year placement (nj_property_tax_relief is only in the 2026 block). The sources do not leave 2025 open, so the batch convention alone does not close SA19.
  • Fix: three 2025-01-01 entries (dependent amount 503, per diem 37.60, allowance 126) citing GL 6-B-46 p.1-2, then an issue for Iowa 2020-2024 levels (or widen #8974). Removing ia_ssa from the 2023-2025 blocks is weaker: SNAP, HUD and spm_unit_benefits still count the back-filled levels.
  • Test to add: residential care, SSI only, 31 days, period 2025-01: ia_ssa 324.60 (and, optionally, an aged dependent-person recipient: 503).

Suggestions

  • G36 (still open) Four branches can still be removed with all cases passing: the ~adult guard on child support, the family-life home marital_unit.any(has_other_income), the family-life home recipients split, and parental deeming with an SSI parent or two eligible children. The decline says these "cover branches already tested", which is not true for these four.
  • G37 candidates.yaml:1810-1839: Code 249.3(4) opens "At the discretion of the department" (Code 249 p.2). Under one reading, 51.7(6)'s "exceed" uses that discretion and is not a conflict. Add this reading to the entry and the NOTE at ia_ssa.py:110-117. Effect: only income of exactly 120%.
  • G38 Dependent-person couple level continues on a spouse in residential care: ia_ssa_federal.py:58-64 applies it when either spouse is certified, and federal joint keeps the couple after entry. 6-B tells the worker to "terminate the payment for the dependent relative" when a DP recipient enters an RCF (6-B p.66); Mrs. W at home "also receives a dependent person allowance" (p.71). Mr. W, June: model [529.10, 259], manual [270.10, 518]; same total (788.10), wrong split. Add a NOTE or a "Not modeled" line.
  • G39 Code 249.3(4)(g)'s upper bound, "not exceeding the medical assistance income limit for the eligibility group" (Code 249 p.3), is carried only by ia_ssa_smme_coverage_eligible. Say so in that input's documentation or in "Not modeled".
  • G40 One flag drives two rules with different scopes: ia_ssa_care_initial_partial_month sets the from-home deduction (ia_ssa.py:63-67) and the couple budget (ia_ssa_rcf_couple_budget.py:38). 52.1(3)"a"(6) covers only "a resident who lived at home in the month of entry" (IAC 52 p.2); 6-B p.60 applies to any entry. A resident entering from a hospital (SS $500, 20 days, aged spouse at home) gets 0 with the flag off, 143.90 under the couple budget alone, and the couple-rate deduction with the flag on. Align the ia_ssa_category and flag documentation, or split the trigger.
  • G41 Integration Case 12 (integration.yaml:269) certifies DEPENDENT_PERSON with no dependent relative in the household (6-B p.24). Add the dependent, and a NOTE that the DP payment stays out of in-home care income because 8-E excludes State Supplementary Assistance (8-E p.18; 416.1124(c)(2)).
  • G42 ia_ssa_ihhrc_participation.py:49-53 sums the dependent allowance over the tax unit. For a joint couple it is right and not double counted (515 on each row, applied once to the pooled cost). Spouses on separate returns get 515 / 1,509, so the household gets 105.71 or 79.29 instead of 185; without marital units each spouse takes the full child allowance (688). Optional: compute it once per couple, or comment that the tax unit stands in for "each dependent living in the home".
  • G43 Case 65 comment (ia_ssa.yaml:1881-1884, changed in 24231f8 after DTrim99's approval): "SSI's child test reaches students only while under 22". The model's is_ssi_ineligible_child uses is_child (age under 18), so a student aged 18-21 gets no allowance either. Reword the comment to describe the model, or note the gap.
  • G44 Link the sources behind the RCF NOTEs: rcf_personal_needs.yaml:13-16 infers rounding from GL 6-B-45 to 6-B-47 but links none (GL 6-B-46 p.1 shows $126 and $37.60; the 6-B-45 $123 is not checked). For the 2026-only candidate entries (candidates.yaml:1789, 1821) and new Code hrefs, consider https://www.legis.iowa.gov/docs/code/2026/249.pdf (same pages; :1761 already uses code/2026/422.pdf).
  • G45 Page lists and titles: add 6-B p.76 to ia_ssa_nonfinancial_eligible.py:15 and p.60 to ia_ssa_eligible.py:13; "PDF pages 1-2, 4" on the 8/5/26 line of ia_ssa_ihhrc_participation.py:12-13 ("g" is p.2, 177.8(2) is p.4); "PDF pages 1-2" at ia_ssa_care_additional_deductions.py:13; label the bare URLs at ia_ssa_has_spouse.py:14-15 and ia_ssa_smme_countable_income.py:20, and cite 249.3(4)(a)(2) at :16. The titles at ihhrc_cost_limit.yaml:21 and smme_minimum_fpg_rate.yaml:10 say "(revised May 22, 2026)", while 6-B p.41 and p.77 print "Revised March 7, 2025" (edition date vs page date).
  • G46 Style: re-wrap ia_ssa_rcf_couple_budget.py:32 (109 characters; the NOTE wraps at 88 elsewhere); use add(person, period, ["ssi_countable_income", "ssi"]) at ia_ssa_smme_countable_income.py:36 and ia_ssa_federal.py:37-39.
  • G47 Removing dividend_income from excluded_unearned_sources.yaml passes all cases, and no case would catch the double exclusion the NOTE warns about once #10079 lands (an SSI recipient's care income is the same either way). Add an RCF resident without SSI: SS $13,200 + qualified_dividend_income $600 a year gives care income 1,100 and pays 222.57 by hand (172.57 without the entry; 272.57 if double-excluded).
  • G48 SMME boundaries through the formula (Cases 44-45 set the income as an input): single from SS $19,392 a year (1,596: 1); couple at combined 2,164.00 (SS $13,104 a year each: [1, 1]); SGA switch at wages $20,280 vs $20,280.12 a year with SSDI $10,800 (both 1; the two income paths agree). Place them by SA25's months.
  • G49 ia_ssa_has_spouse has no direct true assertion: add [true, true] to Case 47 and [false, false, false] to Case 75 (the default unit of three is unpinned).
  • G50 Other branches no case pins: the in-home couple deduction sum (ia_ssa_ihhrc_participation.py:31; integration Case 6 with 100 on person2 gives 291, 191 without it); a day count of at least the month's length (ia_ssa.py:31; 40 days in January gives 328.57, 674.80 without min_); the SSA third-decimal truncation (ia_ssa_federal.py:127; raw 5.5501 gives 5.55); individual SSI with earnings after entry (Case 58 with person2 wages $500: 318.57); a spouse who enters after the other spouse's month of entry (NOTE only, ia_ssa_rcf_couple_budget.py:30-35).

Prior findings

Round 3 and earlier (66 IDs): 54 resolved, 2 still open, 1 partial, 9 accepted declines.

ID Status Evidence at the head
C1-C3, SA1-SA3, SA7-SA12, G1-G4, G8, G10-G13 RESOLVED (before round 3; no regression)
C4 SMME couples RESOLVED Combined couple income (ia_ssa_smme_countable_income.py:54-55), two-person size, >=; Cases 38, 44-49 recompute. Under the statute-first "at least", the round-3 example at 2,164.00 now gives [1, 1] (recorded as a candidate). The paths that are not combined are C7.
C5 Merge conflict RESOLVED 0 behind, MERGEABLE; all six main lines kept
C6 RCF couples after entry RESOLVED ia_ssa_rcf_couple_budget; Mr. K 270.10 (Case 57), [0, 308.57] (58), 721.84 each (59), Mr. B 890 and 270.10 (60), resources alone (61), Mr. A 845.07 (73). Pooling test: SA27
SA4 State resource parameters ACCEPTED DECLINE Unchanged
SA5 Boundary tests RESOLVED #1 Case 69, #5 Case 64, #7 Cases 53 and 57
SA6 Defaults RESOLVED default_value on all four inputs
SA13 Code 249 anchors RESOLVED #page=2 in ia_ssa.py:12, ia_ssa_eligible.py:12, ia_ssa_nonfinancial_eligible.py:12
SA14 IHHRC dependent allowance RESOLVED Cases 50 (34 / 366) and 51 (0 / 400); Ms. C 19 / 381 by run; no double count for a couple
SA15 RCF rate default RESOLVED $38.47 default; Cases 14, 15, 56. Register gap: SA26
SA16 RCF entry month RESOLVED Cases 52 (685.75), 53 (882.75); the round-3 961.75 and 885.75 reproduce; Case 33 is a discharge month (97.75)
SA17 IRWE RESOLVED (documented) Entering IRWE / 2 equals 52.1(3)"a"(1): Case 62, 1,054 / 138.57
SA18 PNA uprating RESOLVED gov.ssa.uprating, nearest $1; 2027 = 135; Case 40 = 298.57
SA19 2025 back-fill STILL OPEN Decline not accepted; see SA19 above
SA20 FLH anchor RESOLVED #page=35
SA21 Interest and dividends RESOLVED excluded_unearned_sources.yaml cites 416.1124(c)(22) and 8-E p.23, p.36; Cases 63 (162), 74 (328.57). Dividends untested: G47
SA22 Spouse tests RESOLVED ia_ssa_has_spouse in seven places; Case 65 (380)
SA23 Rounding RESOLVED Cases 66 ($1) and 67 (5.56)
SA24 SSI child deeming RESOLVED is_ssi_resource_deeming_child; Case 68 keeps $22
G5, G6 RESOLVED Cases 54-55; Cases 70-71
G9, G14, G15, G16, G21, G23, G24, G26 RESOLVED Citations, NOTEs, editions, comments and case splits as asked
G17 DP on one spouse RESOLVED Integration Case 11 [259, 259]; side effect G38
G18, G35 RESOLVED (documented) ia_ssa_category documentation; NOTEs and "Not modeled" list
G19 Child support RESOLVED NOTE and Case 46 comment link #10242
G25 Case periods PARTIAL Case 10 explains its 28 days; June periods kept (YEAR inputs keyed 2026:; accepted)
G30, G31, G33 RESOLVED Test details fixed; shared-deduction guidance (sum untested: G50); page comments fixed, and #f2 / #f2a exist in the POMS HTML
G7, G20, G22, G27, G28, G29, G32, G34 ACCEPTED DECLINE Out of scope or reasons accepted (#10242, #10304, house label style, refactors, OR kept with the YEAR read gone, "Not modeled"). C7's fix touches the lines G27 named.
G36 Low cases STILL OPEN See G36 above

DTrim99 round 2 (approved 040662b): Suggestion 1 (SGA) is fixed in 24231f8, after his approval; the single case is right, and the married cases are in C7. Suggestion 2 (default unit) declined; accepted as malformed input under CONTRIBUTING.md. Suggestion 3 (wage NOTE) not added; optional. Suggestion 4 fixed, but the new Case 65 wording describes SSI law, not the model (G43).

Investigated and cleared

  • SMME disability read from meets_ssi_disability_criteria (24231f8): a person entered only as is_ssi_disabled: true now gets SMME 0 (1 before). Cleared: is_ssi_disabled is meets_ssi_disability_criteria & ~ssi_engaged_in_sga, so under consistent inputs the change drops no one and adds the SGA workers that Code 249.3(4)(a)(2) and 6-B p.10 cover. The default dataset supplies only meets_ssi_disability_criteria, and the app shows only formula-free inputs. Optional: also OR in is_ssi_disabled for callers who override it.
  • Iowa uses the 2025 guideline for all of 2026 (8-E p.7): rejected; that page is an October 2025 snapshot, and RC-0130 shows the April 1, 2026 switch. Narrowed to SA25.
  • DP and in-home care on one spouse (integration Case 12, [259, 659]): only the blind $22 (52.1(4)) and SMME (51.7(3)) bar another type; 6-B p.20 expects programs received "simultaneously"; 8-E p.18 excludes the DP payment from care income. Test-data nit only (G41).
  • ia_ssa_has_spouse as a reinvented variable: it wraps the federal _ssi_spouse_index; no public Person/MONTH variable does the same.
  • C4 statute-first reversal: income of exactly 120% now qualifies under 249.3(4)(g), recorded as a candidate under CONTRIBUTING.md "Source conflicts". Accepted; G37 adds a reading.
  • Case 59 (both enter, no SSI, couple budget) vs p.60 "separately": p.60 is under "Spouses Living Separately"; p.61 and 51.4(3) cover spouses sharing a room. Consistent.
  • SA17 workaround edge: the IRWE / 2 entry differs from the rule only when earnings are below $65 plus IRWE ($32.50 of participation in a run). Accepted as documented.
  • SA18 uprating basis: the CPI-W ratio and the announced COLA percentage give the same allowance through 2031; a $1 difference appears from 2032, in forecast years only.
  • Merge and aggregates: every sibling line kept; ia_ssa_federal is not counted twice with ssi; the deleted ia_ssa_ihhrc_initial_partial_month has no remaining reference.
  • Tests: no margin of 1 or more, no duplicate case, no YEAR-input or period mistake in the new cases.

PDF Audit Summary

Category Count
Documents 5 PDFs (6-B, IAC 52, 177 in two editions, 51, Code 249) + POMS F, 8-E, GL 6-B-46/47, eCFR (reused); new: IAC 75, RC-0130 (Rev. 04/25 and 04/26), GL 8-E-106, GL 8-F-111
Values, rules, NOTE quotes and manual examples confirmed 102 (18 values, 44 rules, 17 anchors, 16 NOTE quotes, 7 manual examples)
2026 values mismatched 0 of 9 parameter files
Rule mismatches (code run + page re-read) 2: C7 (three paths), SA25 (January-March 2026)
Out-of-year value mismatch 1: SA19 (2025)
Source-conflict record gap 1: SA26
Documented source conflicts (not defects) 8
Rejected / narrowed 1 rejected (is_ssi_disabled input); 1 narrowed (guideline year)
Page citations and anchors 102 checked (40 hrefs, 6 candidate URLs, 22 code comments, 34 test comments): 101 correct, 1 refinable, 0 wrong. References: 75 of 75 corroborate

Validation Summary

Check Result
Regulatory C7, SA25, SA26; SA19 open; G37-G41
References 75 of 75 correct, none missing; SA13, SA20, G9, G16, G33 resolved; G44-G45
Code patterns C7 (two couple tests meet in one comparison); G42, G46. Code-health tests (201) and registry tests (705) pass; ruff clean
Tests 0 of 22 variables untested; no non-functional test; 37 new or changed ia_ssa.yaml cases and 10 integration cases recompute by hand. Gaps: SA27, C7 cases, G36, G47-G50
CI CI was still running at review time (17 pass / 10 pending, no failures); local run 106/106 Iowa YAML cases and 103/103 source-conflict guard tests pass at 4fabd46.
Branch 38 ahead, 0 behind main; MERGEABLE
Partner tests None touched

Review Severity: REQUEST_CHANGES

One critical item (C7) and four should-address items (SA19, SA25, SA26, SA27) are open. The round-3 criticals C4, C5 and C6 are resolved, and every 2026 value matches its source.

Next Steps

  1. Fix C7 with the guideline-size change and its four cases.
  2. Add Iowa's April adoption month for the guideline (SA25) and re-anchor the SMME boundary cases and the candidate example.
  3. Add the per diem candidate and the 249.12(3) cite (SA26), and the entry-month pooling case (SA27).
  4. Add the three 2025 values and one 2025 case (SA19).
  5. Ask DTrim99 to review 24231f8 and these fixes; let CI finish.
  6. To apply fixes: /fix-pr 8017.

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants