Repository navigation
Conversation
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 Report✅ All modified and coverable lines are covered by tests. 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
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
- 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>
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
left a comment
There was a problem hiding this comment.
Iowa State Supplementary Payment (SSP) — PR #8017 Review
Source Documents
- PDFs reviewed:
- IAC 441 Chapter 52 (Payment Standards) — https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.52.pdf
- IAC 441 Chapter 51 (Eligibility) — https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.51.pdf
- IAC 441 Chapter 177 (IHHRC) — https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf
- SSA "State Assistance Programs for SSI Recipients" — Iowa, January 2011 — https://www.ssa.gov/policy/docs/progdesc/ssi_st_asst/2011/ia.pdf (via Wayback Machine)
- Iowa HHS General Letter 6-B-46 (effective 2025-01-01) — https://hhs.iowa.gov/media/15607/download
- Iowa HHS State Supplementary Assistance current rates page (HTML) — https://hhs.iowa.gov/assistance-programs/state-supplementary-assistance
- Year coverage: 2011, 2017, 2018, 2025, 2026
- Scope: Full PR diff (38 files; new state program implementation — 17 variables, 13 parameters, 5 test YAMLs, plus SPM-unit roll-up registration and program registry)
Critical (Must Fix)
-
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_fbris clamped toindividual_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. Thestate_supplementYAML is back-calculated againstindividual_fbrfor every configuration, producing wildly inflated raw values that the author then bounds withmax_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.yamlanddependent_income_limit.yamlare byte-identical across all four years (379, 387, 503, 518), confirming the conflation. - Code-path verifier confirmed: for
BLIND_WITH_BLIND_SPOUSE_AND_DEPENDENT2025 with zero countable income, code returns $503; regulation requires $547 (= $1,997 standard − $1,450 couple FBR). $44/month error, locked in by testia_ssa.yamlCase 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)). Removemax_per_person_cap.
- Location:
-
$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, butssi_countable_incomealready 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.yamlRCF 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_disregardhelper that adds backmin(unearned_monthly, $20), and use it in RCF/FLH/IHHRC payment formulas and in the corresponding routing-layer gates.
- Location:
-
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_jointto flip both the resource pool (individual vs. marital sum) and the cap ($2,000 vs. $3,000).ssi_claim_is_jointreturns 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 ania_ssa_dp_*variable that already enumerates dependents) and sum resources across all 51.5-covered dependent relatives.
- Location:
-
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.yaml441—51.4(1) 441—51.5(1) 3 parameters/.../ssa/dp/max_per_person_cap.yaml441—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.pyline 39 commentIAC 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.
-
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.
- Location:
Should Address
-
FLH
state_supplementhistorical (pre-2025) values disagree with SSA published baselines —flh/state_supplement.yamlencodes $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.) -
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. Usepersonal_fpgfor individual claims and 2-person FPG for joint claims. (Regulatory S2.) -
DP
max_per_person_capparameter is duplicative and undocumented — Identical values todependent_income_limitacross all years. Conflates two regulatory concepts. Remove and replace with per-configuration state supplement encoding (related to Critical #1). (Regulatory S3.) -
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_diemare 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., defaultia_ssa_has_medicare_part_btois_medicare_eligible) where a federal PE variable already encodes the concept. (Regulatory S5/S6, Suggestion G1.) -
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 setsdefault_value = Falseonia_ssa_has_full_medicaidandia_ssa_has_medicare_part_bbut is inconsistent for the rest. (Code S2.) -
FBR acronym in parameter descriptions —
dp/state_supplement.yamlandflh/state_supplement.yamluse "(FBR)" in the description field, violating the parameter-patterns "no acronyms" rule. (Code S4.) -
Period-bridging convention undocumented —
ia_ssa.py:29,ia_ssa_living_arrangement.py:37,ia_ssa_smme_eligible.py:16access YEAR-period inputs (ssi_claim_is_joint,is_ssi_aged_blind_disabled) withperiod.this_yearfrom MONTH formulas. Technically correct but consider a single explanatory comment near the top ofia_ssa.py. (Code S1.) -
#page=anchor mismatch in IHHRCmax_cost_single.yaml— Reference for441-177.10(3)uses#page=4but the rule is on file page 5. (Reference S1.) -
Iowa Code 249.9A reference missing
#page=anchor —rcf/personal_needs_allowance.yaml. (Reference S2.) -
Iowa HHS GL 6-B-46 download URL has no page anchor — Multiple files cite
hhs.iowa.gov/media/15607/downloadbare. Add#page=1for explicitness or cite the manual chapter URL. (Reference S3.) -
Bare HHS landing page reference for 2026 values is insufficient —
hhs.iowa.gov/assistance-programs/state-supplementary-assistanceis dynamic. Add a Wayback snapshot URL or a(retrieved YYYY-MM-DD)note. (Reference S4.) -
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 contaminatedcountable_monthly, so cases at or within $20 of the boundary may be mis-classified. (Regulatory S7 — addressed by Critical #2 fix.) -
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.) -
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.) -
V-shape boundary at
countable == FBRnot directly tested — None of the BLIND/DP/FLH cases use asocial_security_retirementvalue engineered to putssi_countable_incomeexactly atindividual_fbr. (Test C3.) -
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.)
-
IHHRC combined countable equal to caps not tested —
ihhrc_countable_after_disregard <= ihhrc_capuses<=. No case sits exactly at $480.55 single or $961.10 couple. (Test C5.) -
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.) -
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 == 0boundary not tested, ineligible-person variants missing, DPhas_eligible_dependent: falsewith non-NONE configuration not tested. (Test S6, S8, S10, S11, S12, S13.)
Suggestions
-
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.) -
Default
ia_ssa_has_medicare_part_btois_medicare_eligible— Would let SMME fire automatically in microsim. (Code G1.) -
Extract DRY intermediate variables —
countable_monthly,ssi_monthly,basic_ssi_disregard,combined_countableare re-derived in bothia_ssa.pyandia_ssa_living_arrangement.py. Consider sharedia_ssa_countable_income_monthlyetc. per the variable-patterns "intermediate variables for code reuse" rule. (Code G1.) -
Add YAML comments in
dependent_income_limit.yamlandmax_per_person_cap.yamlclarifying they are intentionally not breakdowns — Prevents a future contributor from "fixing" them. (Code S3.) -
RCF
cost_per_diemdefault top.rcf.max_per_diemwhen resident is flagged as in RCF — Behavioral improvement so the default supplement is non-zero. (Code G2.) -
ia_ssa_resources_eligibledescription should note monthly recomputation of an annual SSI resource test. (Code G4.) -
Consolidate 2017/2018 IAC supplement citations with effective-date parentheticals. (Reference G1.)
-
Tighten SSA 2011 footnote-a documentation in
dp/state_supplement.yaml. (Reference G2.) -
Add YAML comment in
rcf/days_multiplier.yamlexplaining the "31 = largest possible days-in-a-month" derivation. (Reference G3.) -
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.)
-
Standardize
absolute_error_margin: 0.01across YAML test cases. (Test S19.) -
Test variants: negative income, explicit
ssi_claim_is_jointtoggling on couples, RCF per-diem exactly at cap, days-multiplier sensitivity, entity-scaffolding cleanup foria_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_eligiblechecks 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) passesis_ssi_eligibleand 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 onlyia_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
- 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. - Strip $20 disregard for RCF/FLH/IHHRC — Add an
ia_ssa_countable_income_no_disregardhelper that adds backmin(unearned_monthly, $20); use in RCF/FLH/IHHRC payment formulas and routing-layer income gates. - Fix resource-limit dispatcher — Replace
ssi_claim_is_jointwith an Iowa-specificia_ssa_has_dependent_spousethat covers ineligible-but-financially-dependent spouses per IAC 441-51.5(4). - Correct IAC subsection citations (5 locations) —
smme/minimum_income_fpl_multiplier.yaml(51.6(6)→51.7(6));dp/dependent_income_limit.yamlanddp/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:39comment (51.3(3)→51.4(3)). - Add minimum-recommended deductions — $65+½ earned-income disregard and dependent diversions for RCF and IHHRC.
…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.
|
Thanks, David. Suggestions 1 and 4 are in 24231f8, and 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 106 Iowa supplement cases pass locally (77 in |
PavelMakarchuk
left a comment
There was a problem hiding this comment.
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
- Reviewed head SHA: 4fabd46
- Mode: incremental from 3b9e925
- Commits since round 3: 0231a57 and fb5eeee (round-3 fixes, statute-first SMME, +32 / -12 cases); 24acb4f (merge of
main); 040662b (twocandidates.yamlentries; DTrim99 approved this SHA); 24231f8 (SMME SGA path, Case 77, candidate wording, Case 65 comment; after DTrim99's approval); 4fabd46 (merge ofmain, with #10334). - Scope: 22 Iowa variables (new
ia_ssa_has_spouseandia_ssa_rcf_couple_budget;ia_ssa_care_initial_partial_monthreplacesia_ssa_ihhrc_initial_partial_month, with no caller left), 9 Iowa parameters (newexcluded_unearned_sources.yaml), 5 test files (106 cases), and the PR's lines in 6 shared files. No 2026 value changed. - Sources ("p.NN" = PDF page; 6-B PDF page = printed + 4; 8-E PDF page = printed + 5):
- Iowa HHS Employees' Manual 6-B: https://hhs.iowa.gov/media/3987/download?inline=
- 441 IAC ch. 52: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf ; ch. 51: https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf ; ch. 177 (IAC 8/5/26): https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf and (IAC 2/5/25): https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf
- Iowa Code ch. 249 (2026): https://www.legis.iowa.gov/docs/code/249.pdf
- Manual 8-E: https://hhs.iowa.gov/media/4011/download?inline ; GL 6-B-46 (2025 levels): https://hhs.iowa.gov/media/15607/download ; GL 6-B-47 (2026): https://hhs.iowa.gov/media/18744/download?inline ; POMS SI 01415.058 F: https://secure.ssa.gov/poms.nsf/lnx/0501415058#f ; eCFR 20 CFR 416.1124: https://www.ecfr.gov/current/title-20/section-416.1124
- New this round (SA25 only): 441 IAC ch. 75: https://www.legis.iowa.gov/docs/iac/chapter/441.75.pdf ; desk aid RC-0130: https://hhs.iowa.gov/media/6948/download ; GL 8-F-111: https://hhs.iowa.gov/media/18751/download ; GL 8-E-106: https://hhs.iowa.gov/media/18750/download
Branch and CI
- 38 ahead, 0 behind
main(328d172); GitHubMERGEABLE. C5 is resolved: the HUD unearned list andspm_unit_benefits.pykeepmt_ssp,ok_ssp,ny_ssp,ri_ssp,sd_sspandva_agand 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:104sizes the guideline byia_ssa_has_spouse(size = where(has_spouse, 2, 1)).ia_ssa_smme_countable_income.py:36, 44-55adds a spouse's income only whenssi_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 atia_ssa.py:100-103says 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-35covers 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)andsize = 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 atia_ssa.py:100-103and the NOTEs atia_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_FACILITYon 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; spousepension_income5,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-109readsparameters(period).gov.hhs.fpgat 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 thecandidates.yaml:1831example ("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.pyfpg_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(defaultp.rcf_daily_limit, $38.47). The NOTE at:33-42quotes 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-20cites 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-ratein 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 atia_ssa.py:33-42. No# Source conflictmarker until the entry is registered. - Test: no new YAML case; Case 15 is the example, and
test_source_conflicts.pychecks 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_budgetremoved, 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_100on person1. Head: Marchia_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_budgetMarch [true, false], April [false, false];ia_ssa_eligibleMarch [true, true], April [false, true];ia_ssaMarch [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), andia_ssais inhousehold_state_benefits.yaml:97, 213, 334(and 455), the SNAP list (2009 block), the HUD list (2024 block) and the undatedspm_unit_benefits.py:35. The NOTE atrcf_personal_needs.yaml:13-15itself 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_reliefis 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-01entries (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). Removingia_ssafrom the 2023-2025 blocks is weaker: SNAP, HUD andspm_unit_benefitsstill count the back-filled levels. - Test to add: residential care, SSI only, 31 days, period 2025-01:
ia_ssa324.60 (and, optionally, an aged dependent-person recipient: 503).
Suggestions
- G36 (still open) Four branches can still be removed with all cases passing: the
~adultguard on child support, the family-life homemarital_unit.any(has_other_income), the family-life homerecipientssplit, 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 atia_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-64applies it when either spouse is certified, and federaljointkeeps 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_monthsets 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 theia_ssa_categoryand 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-53sums 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'sis_ssi_ineligible_childusesis_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-16infers 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, considerhttps://www.legis.iowa.gov/docs/code/2026/249.pdf(same pages;:1761already usescode/2026/422.pdf). - G45 Page lists and titles: add 6-B p.76 to
ia_ssa_nonfinancial_eligible.py:15and p.60 toia_ssa_eligible.py:13; "PDF pages 1-2, 4" on the 8/5/26 line ofia_ssa_ihhrc_participation.py:12-13("g" is p.2, 177.8(2) is p.4); "PDF pages 1-2" atia_ssa_care_additional_deductions.py:13; label the bare URLs atia_ssa_has_spouse.py:14-15andia_ssa_smme_countable_income.py:20, and cite 249.3(4)(a)(2) at:16. The titles atihhrc_cost_limit.yaml:21andsmme_minimum_fpg_rate.yaml:10say "(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); useadd(person, period, ["ssi_countable_income", "ssi"])atia_ssa_smme_countable_income.py:36andia_ssa_federal.py:37-39. - G47 Removing
dividend_incomefromexcluded_unearned_sources.yamlpasses 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_spousehas no directtrueassertion: 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 withoutmin_); 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 asis_ssi_disabled: truenow gets SMME 0 (1 before). Cleared:is_ssi_disabledismeets_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 onlymeets_ssi_disability_criteria, and the app shows only formula-free inputs. Optional: also OR inis_ssi_disabledfor 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_spouseas 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_federalis not counted twice withssi; the deletedia_ssa_ihhrc_initial_partial_monthhas 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
- Fix C7 with the guideline-size change and its four cases.
- Add Iowa's April adoption month for the guideline (SA25) and re-anchor the SMME boundary cases and the candidate example.
- Add the per diem candidate and the 249.12(3) cite (SA26), and the entry-month pooling case (SA27).
- Add the three 2025 values and one 2025 case (SA19).
- Ask DTrim99 to review 24231f8 and these fixes; let CI finish.
- To apply fixes:
/fix-pr 8017.
PR Review (round 3): Add Iowa state supplementation for 2026SummaryPR #8017 (author: hua7450). This round reviews head What changed since our approval
Merge-resolution check
New findingsCritical (must fix)1. The own-income path for an SMME applicant working above SGA skips the student earned income exclusion and in-kind support and maintenance, both of which SSI's income rules apply.
Should addressNone. SuggestionsNone new. Axiom, CI and branch
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Round 3: thanks for adding the SGA exception. The eligibility side is right, and Case 77 pays $1. One critical in the new own-income path: it skips two SSI income rules that 6-B p.77 applies to SMME, the student earned income exclusion (416.1112(c)(3)) and in-kind support and maintenance (416.1130/1140). A disabled full-time student with Case 77's income gets $1 (should be $0), and an SGA worker with shelter support gets $0 (should be $1). The fix is small: mirror ssi_countable_income's personal computation and add the two cases. Full report in the comment above.
- Size SMME's poverty guideline by whether SMME income includes a spouse's income (couple computation or SSI spousal deeming), per 6-B p.77 and 8-E p.12 (Cases 81-84). - Use the prior year's poverty guideline before April, when Iowa adopts the new one (441 IAC 75.1; Cases 78-80); move the SMME boundary cases to April. - List the residential care per diem statute conflict as a candidate and cite Iowa Code 249.12(3) in the NOTE. - Add the 2025 dependent amount, per diem and personal needs allowance from General Letter 6-B-46 (Case 86), and a test of entry-month resource pooling (Case 85). - Describe the model's child test in Case 65's comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Pavel. These changes are in 8cbe544, and C7, the SMME guideline size: fixed as proposed.
SA25, Iowa's April 1 guideline: fixed.
SA26, the per diem candidate: fixed. SA27, entry-month resource pooling: fixed. New Case 85 is your Case 57 variant with $2,100 of resources. March is [true, false] for the couple budget, [true, true] eligible and [846.34, 0]. April is [false, false], [false, true] and [0, 0]. SA19, 2025 values: fixed. G43, Case 65's comment: fixed. It now says the model's SSI child test ( The other suggestions (G36-G42 and G44-G50) are not in this round. TheAxiomFoundation/rulespec-us#1837 is updated: 115 cases, the SMME guideline-size and April bullets, and companion tests AR-AX for Cases 78-86. 115 Iowa supplement cases pass locally (86 in |
PR Review (round 4): Add Iowa state supplementation for 2026SummaryPR #8017 (author: hua7450). This round reviews head The commit handles Pavel's round 4 well, and I reviewed all of it as new code:
I checked by hand every new or changed expectation (Cases 38, 44-49, 65, 76-86), and all of them are right. I also checked the three 2025 values against General Letter 6-B-46 itself. No new variable was added, so the NH #10156 state-gated key lesson does not apply. The new Our round-3 critical is still open. The commit doesn't touch it, and there is no reply to it. Only Pavel's items are answered. The SGA own-income path in
The documentation, the code comment, the PR body and rulespec-us#1837 all still say "SSI's exclusions". CI shows 19 passing and 8 pending (seven Contrib shards and Rest Python), with no failures. Quick Feedback ran all 86 Prior findings
Evidence for round-3 Critical 1.
Re-trace of round-3 Critical 1 at
|
| Case | Period | Hand computation | Expected | Result |
|---|---|---|---|---|
| 38 (comment only) | 2026-01 | 2,000 − 20 = 1,980 ≥ January's 1.2 × 15,650 / 12 = 1,565 | 1,980; $1 | Correct |
| 44 (moved to April) | 2026-04 | 1,596 ≥ 1.2 × 15,960 / 12 = 1,596 ("at least") | $1 | Correct |
| 45 (moved) | 2026-04 | 1,595.99 < 1,596 | $0 | Correct |
| 47 (moved) | 2026-04 | Couple SSI 3,400 − 20 = 3,380 > 1,491, so SSI is 0 and countable income is 1,690 each; combined 3,380 ≥ 1.2 × 21,640 / 12 = 2,164 | [1, 1] | Correct |
| 48 (moved) | 2026-04 | 2,186 − 20 = 2,166 ≥ 2,164; only person1 has coverage | [1, 0] | Correct |
| 49 (moved) | 2026-04 | 2,182 − 20 = 2,162 < 2,164 | [0, 0] | Correct |
| 65 (comment only) | 2026-01 | No value changed; the comment now describes is_child (under 18) |
380 | Correct |
| 76 (comment only) | 2026-01 | 2,020 − 20 = 2,000 ≥ 1,565 | 2,000; $1 | Correct |
| 77 (comment only) | 2026-01 | (900 − 20) + (2,000 − 65) / 2 = 1,847.50 ≥ 1,565 | 1,847.50; $1 | Correct (as coded; see the open critical) |
| 78 | 2026-01 | 1,565 ≥ 1,565 | $1 | Correct |
| 79 | 2026-01 | 1,564.99 < 1,565 | $0 | Correct |
| 80 | 2026-01 | 1,068 × 2 − 20 = 2,116 > 1,491, so SSI is 0; combined 2,116 ≥ 1.2 × 21,150 / 12 = 2,115 (below April's 2,164) | [2,116, 2,116]; [1, 1] | Correct |
| 81 | 2026-04 | person2 is in a medical treatment facility with Medicaid paying most of the care, so ssi_couple_computation_applies is [false, false] (416.414(b)(3)); each 1,700 − 20 = 1,680 ≥ the one-person 1,596 |
[1,680, 1,680]; [1, 1] | Correct |
| 82 | 2026-04 | person1 is above SGA and not counted by SSI: 1,847.50 ≥ 1,596 (one person). person2's own (1,000 − 20 − 65) / 2 = 457.50; person2 has no category | [1,847.50, 457.50]; [1, 0] | Correct |
| 83 | 2026-04 | The spouse's 497 is not more than 1,491 − 994 = 497, so no deeming; 1,620 − 20 = 1,600 ≥ 1,596. person2's own 497 − 20 = 477 | deeming [false, false]; [1,600, 477]; [1, 0] | Correct |
| 84 | 2026-04 | 498 > 497, so deeming applies; the deemed amount is (2,118 − 20) − (1,620 − 20) = 498; 2,098 < the two-person 2,164. person2 478 | deeming [true, false]; [2,098, 478]; [0, 0] | Correct |
| 85 | 2026 | March: couple budget (SSI was paid; 6-B p.60), so resources are 2,100 ≤ 3,000 and the payment is 38.47 × 22 − 0 = 846.34. April: the resident is tested alone (p.12), 2,100 > 2,000; the spouse at home is still tested as a couple | budget [T, F] / [F, F]; eligible [T, T] / [F, T]; [846.34, 0] / [0, 0] | Correct |
| 86 | 2025-01 | 37.60 × 31 = 1,165.60; SSI 967; participation 967 − 126 = 841; 1,165.60 − 841 = 324.60 | 324.60 | Correct |
Other checks.
- Test periods. Every non-January case keys its YEAR inputs by
2026:(or uses an annual period with month-keyed outputs, as in Case 85), so none hits the non-January YEAR-input build error. Quick Feedback ran all 86ia_ssa.yamlcases green at this head. - Source-conflict ratchet. The commit adds no comment that matches
CONFLICT_COMMENT_RE, and no Iowa file is inKNOWN_UNMARKED. CI's Rest shard-1 run oftest_source_conflicts.pypassed on the merge ref created at 13:51 UTC, after Tie source-conflict markers to the register shared with Axiom #10287 and Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334. The twomaincommits since then (Add Georgia LIHEAP regular heating assistance #9968 Georgia LIHEAP and a version bump) don't touch the guard or any Iowa file. - Shared wiring after the sibling merge.
spm_unit_benefits.pyaddsia_ssaonce and keeps every sibling line. The HUD and SNAP lists useia_ssa_countable_for_hud/_for_snap, andhousehold_state_benefits.yamlhas four Iowa entries.tx_rebate.pyis still deferred to Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs #10226, as for the siblings. No partner test file is touched. - Batch lessons.
- OK Add Oklahoma state supplementation for 2026 #10165 and NH round 3: SMME follows "SSI income criteria", so reading
ssi_earned_incomethere is right. The care budgets were cleared in earlier rounds. - Integrate modeled state unemployment insurance into income flows #9558 and the LIHEAP floor don't apply.
- OK Add Oklahoma state supplementation for 2026 #10165 and NH round 3: SMME follows "SSI income criteria", so reading
Axiom line assessment
The line reads TheAxiomFoundation/rulespec-us#1837 queued. It is valid: the issue is OPEN and labelled pe-parity, and it was updated at 13:52 UTC, three minutes after 8cbe544ae7.
- It matches the head for this round's changes: 115 cases, companion tests AR-AX for Cases 78-86, and the guideline-size, April and history bullets.
- Once round-3 Critical 1 is fixed, it needs two more companion rows (Examples A and B). It also needs its SGA bullet ("applies SSI's exclusions to that person's own income") extended to name the student exclusion and ISM.
CI status
gh pr checks 8017, rechecked at 15:21 UTC: 19 pass, 8 pending, 0 failing.
- The 8 pending checks are Contrib states-shard-1/2/3, congress, other-shard-1/2b/3, and Python Rest (Python + variables).
- Passed checks include Quick Feedback (all five Iowa files), all baseline shards, Rest shard-1 (2,518 passed, including the source-conflict guard), Microsimulation, Household API Partners and PR validation.
- Run 39790563134 is on
0cd88d1536. No local runs this round.
Branch status
- 40 ahead and 2 behind
main(Add Georgia LIHEAP regular heating assistance #9968 Georgia LIHEAP and a version bump; neither touches Iowa, SSI or the shared SSP lists). git merge-tree --write-tree PolicyEngine/main 0cd88d1536is clean (treea3ad4a11b6). GitHub showsMERGEABLEandBLOCKED(pending reviews).0cd88d1536absorbed the six merged sibling SSP PRs with an automatic merge; its tree equalsgit merge-treeof its parents.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Round 4: Pavel's round-4 items are all correct, and every new or changed expectation hand-checks. But our round-3 critical looks like it slipped through: this commit doesn't change it and there's no reply. The SMME SGA own-income path still skips SSI's student earned income exclusion (416.1112(c)(3)) and in-kind support and maintenance (416.1130/1140), so Example A (a student) still pays $1 instead of $0 and Example B (shelter support) still pays $0 instead of $1, while the docs and #1837 say 'SSI's exclusions'. The fix is the same small one as in round 3, plus two cases and two #1837 rows. Full report in the comment above.
A disabled SMME applicant working above the SGA level is budgeted on own income. That income now subtracts SSI's student earned income exclusion (20 CFR 416.1112(c)(3)) and adds in-kind support and maintenance (416.1130, 416.1140), as ssi_countable_income does (Cases 87-88). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, David, and sorry I missed your round-3 critical. It came in after my last status check, and I didn't check again before pushing the round-4 fixes. It's fixed in 647fdf4. Round-3 Critical 1, the SMME SGA path: fixed as proposed.
117 Iowa supplement cases pass locally (88 in |
PR Review (round 5): Add Iowa state supplementation for 2026SummaryPR #8017 (author: hua7450). This round reviews head The round-3 critical is fixed, as proposed. In
I traced both round-3 households at the new head, and they now match SSI's income rules. Example A (Case 87) gets $0 with SMME income 1,442.08. Example B (Case 88) gets $1 with SMME income 1,648.83. Nothing is counted twice. ISM is not among SSI's unearned income sources, and the I have no new critical or should findings. There is one optional suggestion: #1837's paste-ready dispatch text still says "cases A to AP". CI is still running on Prior findings
New findingsCritical (must fix)None. Should addressNone. Suggestions
VerifiedThe formula (
The law. 6-B Income (SMME) p.77 says income "is determined according to SSI income criteria". Those criteria include 20 CFR 416.1112(c)(3), the student earned income exclusion, and 416.1130 and 416.1140, ISM valued under the presumed maximum value rule. Case inputs and periods.
Hand-checked expectations. Cases 87 and 88 are new. Cases 77 and 82 are unchanged, but they run through the changed formula, so I re-traced them.
Documentation, comment, body and #1837.
Other checks.
Axiom line assessmentThe line reads
CI status
Branch status
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Round 5: the round-3 critical is fixed as proposed. The SMME SGA path now applies SSI's student earned income exclusion and in-kind support and maintenance without double counting, Case 87 (student) gives $0 and Case 88 (shelter support) gives $1, and the docs, body and #1837 (rows AY/AZ) match. Thanks for the quick turnaround. CI was still running when I checked (Quick Feedback ran all 117 Iowa cases green), so please let it finish green before merging. One minor suggestion on the #1837 text. Full report in the comment above.
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review (round 5): Add Iowa state supplementation for 2026
IDs: C = critical, SA = should address, G = suggestion. Round-4 IDs keep their numbers. New findings start at SA28 and G51. There is no new critical item, so C8 is not used. DTrim99 approved this head (647fdf4). SA28 concerns a NOTE that he accepted; SA29, SA30 and the SA19 residual are not in his reviews.
Source Documents
- Reviewed head SHA: 647fdf4
- Mode: incremental from 4fabd46
- Commits since round 4: 8cbe544 (round-4 fixes: C7, SA19 for 2025, SA25, SA26, SA27, G43); 0cd88d1 (merge of
mainwith the six sibling SSP PRs; no Iowa file changed); 647fdf4 (SMME SGA path: student exclusion and in-kind support, DTrim99's critical; Cases 87-88). - Scope: 7 Iowa files (+441 / -38): 2025 values in 3 parameters, new
fpg_year_start_month.yaml,ia_ssa.py,ia_ssa_smme_countable_income.pyandia_ssa.yaml(77 to 88 cases). Also one newsource_conflicts/candidates.yamlentry. At the head: 22 Iowa variables, 10 Iowa parameters, 5 test files (117 cases). The PR's lines in the 6 shared files are byte-identical to round 4. No 2026 value changed. - Sources ("p.NN" = PDF FILE page; 6-B and 8-F FILE = printed + 4; 8-E FILE = printed + 5):
- Reused: 6-B https://hhs.iowa.gov/media/3987/download?inline= ; 8-E https://hhs.iowa.gov/media/4011/download?inline ; 441 IAC 51, 52, 75 https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf , https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf , https://www.legis.iowa.gov/docs/iac/chapter/441.75.pdf ; Iowa Code 249 https://www.legis.iowa.gov/docs/code/249.pdf ; GL 6-B-46 https://hhs.iowa.gov/media/15607/download ; RC-0130 Rev. 04/26 https://hhs.iowa.gov/media/6948/download and Rev. 04/25 https://web.archive.org/web/20250319223420/https://hhs.iowa.gov/media/6948/download ; GL 8-E-106 https://hhs.iowa.gov/media/18750/download
- New this round: GL 6-B-45 (2024 levels) https://hhs.iowa.gov/media/12206/download ; Iowa HHS "State Supplementary Assistance Standards, Effective January 1, 2023" (one page) https://hhs.iowa.gov/media/9237/download ; manual 8-F, Medicaid Coverage Groups https://hhs.iowa.gov/media/4012/download?inline ; eCFR 20 CFR 416.1160 https://www.ecfr.gov/current/title-20/section-416.1160
Branch Status and CI
- Branch: 41 ahead, 5 behind
main(2bc4ccc). The 5 commits are #9968 (Georgia LIHEAP), #10238 (school meals), #9973 (Arkansas LIHEAP) and 2 version bumps. None touches Iowa, SSI, the HUD or SNAP lists,household_state_benefitsorspm_unit_benefits.git merge-tree 2bc4ccc970 HEADis clean, and GitHub showsMERGEABLE. A rebase is not necessary for review. - CI: 26 pass, 1 cancelled ("Python tests / Full Suite - Microsimulation", cancelled, not a test failure); no failures at review time
- Local run at 647fdf4: 117/117 Iowa YAML cases pass (
ia_ssa88, integration 12, resources deemed 7, nonfinancial 6, income deemed 4). 848 passed and 10 skipped in the source-conflict guard, programs registry and aggregate-list tests. 163 code-health tests pass, andruffis clean on the 22 Iowa variables. - No partner test file is touched.
Fixed since round 4
- C7 (guideline size):
ia_ssa.py:110-113uses the two-person guideline only whenssi_couple_computation_applies | is_ssi_spousal_deeming_applies. Cases 81-84 pin each branch. By probe, all four round-4 rows now give the rule's result ([1, 1], [1, 1], [1, 0], [1, 0]). Cases 38 and 47-49 do not change. I accept the decline of my test (c): row 4 gives [1, 0] under both readings, and Case 83 (1,600 against 1,596; combined 2,097 < 2,164) is the case that separates them. - SA25 (April 1 guideline):
fpg_year_start_month.yaml(4) andia_ssa.py:114-119. Probe: 2026-03 uses 1,565 and 2026-04 uses 1,596. 2025-01 uses 1,506 and 2025-04 uses 1,565, which agrees with RC-0130 Rev. 04/25. Cases 78-80 pin January, and Cases 44-49 now run in April. Test gap: SA29. - SA26 (per diem candidate):
candidates.yaml:1778-1810has the three sources,follows: statute, the "privately operated" note and the correct example (328.57 against $0). The NOTE atia_ssa.py:33-45quotes 249.12(3) word for word. Year span: G51. - SA27 (entry-month pooling): Case 85. A mutation run without
| ia_ssa_rcf_couple_budgetatia_ssa_eligible.py:42-44fails Case 85 only (1 failed, 116 passed). - DTrim99's SGA critical:
ia_ssa_smme_countable_income.py:46-53subtracts the student earned income exclusion and adds in-kind support and maintenance. Case 87 (1,442.08, so 0) and Case 88 (1,648.83, so 1) recompute by hand. ISM is not counted twice. - G43: the Case 65 comment now describes
is_child(under 18). - SA19, 2025 part: 503 / 37.60 / 126 match GL 6-B-46 p.1-2, and Case 86 gives 324.60. The 2023-2024 part stays open (below).
Critical (Must Fix)
None.
Should Address
SA28. The SMME SGA path ignores the spouse's income, but SSI deeming and MEPD family income both count it
For a disabled applicant who works above the SGA level, ia_ssa_smme_countable_income uses only the person's own income, and ia_ssa then uses the one-person guideline. SSI's deeming variables apply only to people SSI treats as eligible, so a spouse's income never enters this path. The sources count the spouse on every route that they give. The error goes in both directions, and in two households it changes the result under either guideline size. In round 4 I said that the "Not modeled" line for spouse income on this path could stay. I did not test that line against deeming then. DTrim99 also accepted the NOTE in round 5. 8-F p.120 and the deeming exceptions on 8-E p.11 were not part of either check.
- Where:
ia_ssa_smme_countable_income.py:43-45(NOTE: "not combined with a spouse's, and none is deemed") and:46-61(own-income path).ia_ssa.py:110-112readsis_ssi_spousal_deeming_applies, which hasdefined_for = is_ssi_eligible_individual, so it is false for an SGA worker. Case 82 (ia_ssa.yaml:2378-2420). - Source:
- 6-B Income (SMME): "Income for eligibility is determined according to SSI income criteria. See 8-E, Income." (6-B p.77)
- SSI income "includes any income deemed from a parent, spouse, or sponsor" (8-E p.8).
- Deem for "State Supplementary Assistance coverage groups according to SSI policies except for" Medically Needy, in-home care, dependent person and MEPD (8-E p.11). SMME is not an exception.
- At $497 or less, "Process as a one-person household"; above $497, combine both incomes and compare with the couple standard (8-E p.12, p.13).
- MEPD, the group open to an SGA worker under 65: "The total income of the family is considered for eligibility." (8-F p.120)
- Code 249.3(4)(c), "would be eligible for supplemental security income benefits but for ... being engaged in substantial gainful activity and having excess income" (Code 249 p.2), and 51.7(2) (IAC 51 p.2) treat the person as an SSI claimant. The PR already uses this reading for the student exclusion and ISM on this path (Cases 87-88).
- Counter-text: "If Mr. M's own income makes him ineligible for SSI, it's not necessary to consider Mrs. M's income" (8-E p.14). Read literally, it stops deeming on every SMME path, because SMME income is always above $994. That would also make Case 84 wrong. It does not support a carve-out for the SGA path only.
- Failing inputs (April 2026; applicant under 65 with
meets_ssi_disability_criteria, SMME category and coverage set; spouse aged 45, not disabled; model run at the head; 120% = 1,596 for one person, 2,164 for two):
| Household (monthly) | Model: SMME income, ia_ssa |
Rule (8-E deeming; 8-F family income) |
|---|---|---|
| Row 1: wages $1,700; spouse wages $3,000 | 807.50: [0, 0] | (1,700 + 3,000 - 20 - 65) / 2 = 2,307.50 >= 2,164: [1, 0] |
| Row 2: wages $3,085; spouse wages $1,500 | 1,500: [0, 0] | (3,085 + 1,500 - 85) / 2 = 2,250 >= 2,164: [1, 0] |
| Row 3: wages $3,277; spouse wages $600 | 1,596: [1, 0] | (3,277 + 600 - 85) / 2 = 1,896 < 2,164: [0, 0] |
| Row 1 with the applicant aged 70 (SSI path) | 2,307.50: [1, 0] | Same as the rule |
- Why should address: rows 1 and 2 give $1 under any guideline size, and only the repo's own-income reading gives $0. The same household gets the opposite result at age 70. The NOTE states a mechanism, not a source. Under the documented-choice rule, a NOTE does not save a choice that contradicts 8-E p.11-13 and 8-F p.120; round 4 applied the same test to C7's NOTE. This is not critical: the rule reaches this path by the "would be eligible but for" inference, the effect is $1 a month, the population is input-gated (a married SGA worker under 65 with coverage set), and my round-4 text let the line stay.
- Fix: on the own-income path, deem as 8-E p.12-13 do. Take the spouse's income after the ineligible-child allocations. If it is more than $497 (couple FBR minus individual FBR), put both spouses' earned and unearned income through
_apply_ssi_exclusionsonce. Then use the two-person guideline, for example by adding that flag tospouse_incomeatia_ssa.py:110-112. The federalssi_*_deemed_from_ineligible_spousevariables cannot be reused as they are, because they multiply byis_ssi_aged_blind_disabled. Rewrite the NOTE at:43-45and the Case 82 comment. Alternative: keep own income, cite a source for the carve-out, and record asource_conflictscandidate. No review role found such a source. - Tests: add row 1:
ia_ssa_smme_countable_income[2,307.50, 1,457.50],ia_ssa[1, 0]. Add row 3: [1,896, 257.50], [0, 0]. Update Case 82: [2,347.50, 457.50] ((900 - 20) + (2,000 + 1,000 - 65) / 2);ia_ssastays [1, 0]. Add a control: Case 82's worker with a spouse pension of $497 and no wages gives [1,847.50, 477] and [1, 0] (nothing deemed, one-person guideline).
SA29. No case pins the April switch month; a start month of 2 or 3 passes every test
The SMME cases in 2026 run in January (Cases 78-80) or April (Cases 44-49, 81-84, 87-88). None runs in February or March. So the tests show that the switch is after January and not after April, but not that it is in April.
- Where:
fpg_year_start_month.yaml:3(2026-01-01: 4) andia_ssa.py:116-119. - Source: the federal poverty level is "revised annually on April 1" (IAC 75 p.2); RC-0130 Rev. 04/26 gives $1,596 / $2,164 "Effective 4/1/26" (RC-0130 p.2).
- Probe (coordinator, scratch copy, snapshot not changed): start month 2 gives 117 passed; start month 3 gives 117 passed; start month 5 fails Cases 45 and 49.
- Why should address: this is a missing edge case for a tested variable, and the month is the point of SA25.
- Fix: add this case. It fails with start month 2 or 3, because March would then use 1,596. With Case 45 (April, 1,595.99, so 0; fails at month 5 or later), only month 4 passes. A one-cent-below March case (1,564.99, so 0) passes under any start month from 2 to 4, so the case must sit at or above 1,565.
- name: Case 89, in March SMME income at the prior year's 120 percent still qualifies.
period: 2026-03
absolute_error_margin: 0.01
input:
state_code:
2026: IA
age:
2026: 65
ia_ssa_category: SMME
ia_ssa_smme_coverage_eligible: true
ia_ssa_smme_countable_income: 1_565
output:
# 1.2 * 15,650 / 12 = 1,565 until April (441 IAC 75.1; RC-0130 Rev. 04/25).
ia_ssa: 1Optional formula version: period: 2026, age 70, social_security_retirement: 19_200, month-keyed category and coverage for 2026-03 and 2026-04. Then SMME income is 1,580 in both months, and ia_ssa is {2026-03: 1, 2026-04: 0}.
SA30. The fpg_year_start_month.yaml description does not follow the parameter description template
The description at fpg_year_start_month.yaml:1 reads "Iowa begins applying the current calendar year's federal poverty guidelines to the State Supplementary Assistance SMME income test in this month." The template in the policyengine-model-development skill (parameters.md, and the implementation validator's "Parameter formatting — SHOULD ADDRESS" item) asks for one sentence, an allowed verb (limits, provides, sets, excludes, deducts, uses), the program name spelled out with no acronym, and the ending "under the [Full Program Name] program". This description has three breaks: the verb, the acronym "SMME", and no program ending. The 9 sibling Iowa parameters follow the template; smme_amount.yaml:1 and smme_minimum_fpg_rate.yaml:1 spell out "Supplement for Medicare and Medicaid Eligibles".
- Why should address: a formatting and pattern item, the same class as round-1 SA7 on this PR. CI does not check descriptions. The federal TANF
fpg_year_start_month.yamluses "begin applying", but the acronym and the missing ending have no precedent in the Iowa files. - Fix: use this exact text:
description: Iowa uses the current calendar year's federal poverty guidelines from this month for the Supplement for Medicare and Medicaid Eligibles income test under the State Supplementary Assistance program.
SA19 (PARTIAL). 2023 and 2024 still back-fill the 2025 levels while ia_ssa is in the 2023 and 2024 aggregates (also raised by DTrim99 in round 1)
The 2025 part is fixed. 2023 and 2024 now return the 2025 levels. Iowa published lower levels for both years, and this round read them. The NOTE in rcf_personal_needs.yaml states $123 for 2024, but the parameter returns 126. Round 4 asked for an issue for 2020-2024 if the values were not added. There is no issue and no reply to that part (gh: #8974 is open with 0 comments and covers 2017-2019 only; no other issue covers Iowa 2020-2024).
- Where: the first value is
2025-01-01independent_amount.yaml:3,rcf_daily_limit.yaml:3andrcf_personal_needs.yaml:3; NOTE atrcf_personal_needs.yaml:14-17.ia_ssais inhousehold_state_benefits.yaml:109(2023) and:237(2024), the SNAP list (gov/usda/snap/income/sources/unearned.yaml:37, from 2009), the HUD list (gov/hud/annual_income/sources/unearned.yaml:39, from 2024) and the undatedspm_unit_benefits.py:40. - Source: GL 6-B-45, "Effective Date January 1, 2024": "The income limit and payment standard for a dependent relative is $490 per month", "The maximum residential care per diem rate is $36.82", and the personal needs allowance "is $123" (GL 6-B-45 p.1; per diem also on p.24). The 2023 standards sheet gives a dependent-person "Maximum Payment" of $474, an RCF "Personal Needs Allowance" of $120 and a "Maximum Cost-Related per Diem Rate" of $35.89 (2023 standards, one page). Both pages were read as images. The blind $22 and the family-life home supplement $162 back-fill correctly.
- Error (model run at the head; age 70, January, 31 days):
| Household | 2024 model / law | 2023 model / law |
|---|---|---|
| Residential care, SSI only | 348.60 / 321.42 (+27.18) | 377.60 / 318.59 (+59.01) |
| Dependent person, SSI only, dependent income 100 | 503 / 490 (+13) | 503 / 474 (+29) |
| Dependent person, dependent income 495 (2024) or 480 (2023) | 503 / 0 | 503 / 0 |
Hand check for 2024: 31 x 36.82 - (943 - 123) = 321.42. Microsimulation reaches only the blind $22, which is correct in both years, so the aggregate effect is nil. The error is per household, for web-app users who select a category.
- Why still should address: the sources do not leave 2023-2024 open, which is the reason round 4 gave for 2025. The tracking step that would make this a documented choice was not done. This is not critical: the microsimulation effect is nil, and the PR claims only 2025-2026.
- Fix (either option closes SA19; option A is stronger and about as cheap):
- A. Add
2024-01-01values 490 / 36.82 / 123 with GL 6-B-45#page=1, and2023-01-01values 474 / 35.89 / 120 with the 2023 standards sheet. Test: residential care, SSI only, 31 days,period: 2024-01,ia_ssa321.42. Back-fill before 2023 is then the batch convention, which is a suggestion. - B. File an issue for Iowa 2020-2024 levels (or widen #8974) that names both sources. Add a NOTE line to the three files: "Values before 2025 back-fill the 2025 level; see #N."
- Removing
ia_ssafrom the 2023 and 2024 blocks ofhousehold_state_benefitsalone is weaker, because SNAP, HUD andspm_unit_benefitsstill count the back-filled levels. - With option A, also correct the rounding NOTE at
rcf_personal_needs.yaml:14-17: 120 x 1.032 = 123.84, but Iowa published $123, so nearest-dollar rounding does not fit 2024. This affects only projected years (2027 and later).
- A. Add
Suggestions
New:
- G51 The per diem candidate covers 2026 only (
candidates.yaml:1780-1783,from: 2026), but the PR now applies the maximum rate in 2025 (rcf_daily_limit.yaml, Case 86). The 2025 manual has the same "two options": "$37.60, beginning January 1, 2025" and the $17.86 flat rate (GL 6-B-46 p.74). 2025 example: 324.60 against $0 (31 x 17.86 = 553.66 < 841). Setfrom: 2025, and optionally add GL 6-B-46#page=74as the 2025 manual source. - G52 The 8-E p.12 rule now sets the guideline size (
ia_ssa.py:103-113), but 8-E is cited only in comments. Neitherreferencetuple (ia_ssa.py:10-19,ia_ssa_smme_countable_income.py:15-21) links it. Add"https://hhs.iowa.gov/media/4011/download?inline#page=12", # 8-E Deeming from an Ineligible Spouse; PDF pages 11-12, 14to both. This is not higher: both tuples cite 6-B p.77 ("See 8-E, Income"), the comment cites are verified, and round-1 G8 rated the same pattern a suggestion. - G53 FPG timing notes (
fpg_year_start_month.yaml,ia_ssa.py:114-115). (a) 75.1's definitions "apply to 441—Chapters 74 through 88" (IAC 75 p.1), and SMME is in chapter 51. Add 6-B p.77 to the parameter's references and one sentence: SMME uses the Medicaid group's poverty level (6-B p.77, RC-0130). (b) 8-E p.7 (revised May 22, 2026) still prints $1,565 / $2,115 after April 2026, because GL 8-E-106 p.1 dates that content October 15, 2025. Name this in a NOTE. (c)media/6948/downloadis a rolling URL. Cases 78-80 cite "(RC-0130)" for $1,565 / $2,115, which only Rev. 04/25 p.2 shows; cite that capture. (d) Optional: add2025-01-01: 4with Rev. 04/25, so that 2025 does not rely on back-fill. - G54 The SGA-path student exclusion inherits two federal simplifications. Document them in the Case 87 comment or the NOTE at
ia_ssa_smme_countable_income.py:43-45. (a) The annual cap is averaged. SSA's monthly method gives Case 87's household 880 in January-April, 982.50 in May and 1,847.50 from June, so the rule pays $1 a month for 7 months where the model pays $0 (1,442.08 in every month). (b) The federal eligibility tests only age and full-time study, but 8-E p.19 also requires "Not married" and "Not the head of the household". Both come from main's federal method; DTrim99 noted (a). - G55 An FPG reform that does not start on January 1 reaches Iowa SMME one year late, because
ia_ssa.py:119always reads{year}-01-01. Probe: a reform from 2026-04-01 changes nothing until 2027-04.wic_income_limit.pyandtanf_non_cash_fpg.pyhave the same limit, so this is not a pattern violation. Optional: readparameters(period)from the start month on, or reuse theyear_laghelper intax_unit_fpg.py(which would also answer G27). - G56 2025 tests. The start month exists only from 2026-01-01, so 2025 relies on back-fill, and no 2025 SMME case pins it. Add
period: 2025, age 70, Social Security $18,720 a year (1,540): March 1 (>= 1,506) and April 0 (< 1,565). The 2025 dependent-person amount is also unpinned: addperiod: 2025-01,DEPENDENT_PERSON, dependent income 100, which gives 503 (518 under the old back-fill).
Carried (author: "not in this round"; no regression found): G36, G37, G38, G39, G40, G41, G42, G47 and G50 stay as written in round 4. Updates:
- G44 (partial): GL 6-B-46 is now linked in three parameters. GL 6-B-45 (now located: https://hhs.iowa.gov/media/12206/download#page=1) and GL 6-B-47 are still not linked for the rounding NOTE. The new candidate URL at
candidates.yaml:1789is another undatedcode/249.pdf. - G45:
ia_ssa_smme_countable_income.py:16still says "Iowa Code 249.3(4)(g)", while the comment at:37-38relies on 249.3(4)(a)(2).:20is still an unlabeled URL. - G46: one more manual sum at
ia_ssa_smme_countable_income.py:51-53. House form:add(person, period, ["ssi_unearned_income", "ssi_in_kind_support_and_maintenance"]). - G48, values for SA25's months: April single, Social Security $19,392 a year (1,596, so 1); April couple, $13,104 each (2,164, so [1, 1]); January couple, $12,816 + $12,804 (2,115, so [1, 1]); SGA switch at wages $20,280 against $20,280.12 with SSDI $10,800 (both 1; the two income paths agree).
- G49: add
ia_ssa_has_spouse: [true, true]to Case 83. It also shows C7's point (spouse present, one-person guideline).
Prior findings
Round 4 and earlier (84 IDs): 59 resolved, 3 partial, 13 still open, 9 accepted declines. Of the 21 items open after round 4: 5 resolved, 3 partial, 13 still open.
| ID | Status | Evidence at the head |
|---|---|---|
| C1-C6, SA1-SA3, SA5-SA18, SA20-SA24, G1-G6, G8-G19, G21, G23, G24, G26, G30, G31, G33, G35 | RESOLVED (before round 5) | No regression. C4 (Cases 38, 47-49) and SA23 (Cases 66-67) re-checked because the SMME lines changed. |
| C7 SMME guideline size | RESOLVED | ia_ssa.py:110-113; Cases 81-84; all four round-4 rows give the rule's result. Test (c) decline accepted. Spouse income on the SGA path: SA28 |
| SA25 April guideline | RESOLVED | fpg_year_start_month.yaml; Cases 78-80 and 44-49; probe 1,565 / 1,596 by month. Month not pinned: SA29 |
| SA26 Per diem candidate | RESOLVED | candidates.yaml:1778-1810; NOTE at ia_ssa.py:33-45. Years: G51 |
| SA27 Entry-month pooling | RESOLVED | Case 85; the mutation fails Case 85 only |
| SA19 Pre-2026 back-fill | PARTIAL | 2025 fixed (GL 6-B-46; Case 86). 2023-2024 open: SA19 above |
| G43 Case 65 comment | RESOLVED | The comment describes is_child (under 18) |
| G25 Case periods | PARTIAL (accepted part stands) | June periods unchanged. The new April periods follow SA25; Case 85 uses period: 2026 with month keys |
| G44 Source links | PARTIAL | See G44 above |
| G36-G42, G45-G50 | STILL OPEN | Suggestions; G36's four removable branches are still untested |
| SA4, G7, G20, G22, G27, G28, G29, G32, G34 | ACCEPTED DECLINE | Unchanged. G27's lines were rewritten for C7 and SA25; the guideline is still inline (G55 names a helper) |
DTrim99: his round-3 and round-4 critical (the SGA path skipped the student exclusion and ISM) is resolved in 647fdf4, and he approved this head. His round-5 suggestion (rulespec-us#1837 dispatch text "A to AP" to "A to AZ") is issue-only, and I do not repeat it. His reviews do not cover the SA19 residual or SA28-SA30.
Investigated and cleared
- 8-E p.12 only in comments, as a missing reference (verify-4): rejected as critical and as should address. Both tuples are non-empty and cite the governing rule (249.3(4)(g), 51.7(6), 6-B p.77). The guideline size is not a parameter value. Merged state SSP variables cite secondary sources in comments in the same way. Kept as G52.
- FPG year logic: the
ifacts on scalars only (period.start.monthand an integer parameter). Readingparameters(f"{year}-01-01")is a house pattern, and reforms from January 1 flow through.unit: monthandperiod: yearmatch the federal TANF precedent. - Month-keyed
ssi_federal_living_arrangement: a month-keyed override is averaged as a couple by the YEAR federalssi_countable_income(1,690 instead of 1,680). This is a federal period issue that also affects SSI. Case 81's facility and Medicaid inputs are the robust form. - 8-E p.11, "do not apply the deeming procedure if the applicant's income alone ... is over income limits": for SMME the limit is the Medicaid group's limit (6-B p.77), so Case 84 is consistent.
- 441 IAC 75.6(5) COLA disregard until April 1: it applies to QMB, SLMB and E-SLMB only. SMME needs full Medicaid, so there is no gap.
- January-March 2025 levels (1,506 / 2,044): RC-0130 Rev. 04/24 is not on disk, but Rev. 04/25 "Effective 4/1/25" implies the switch, and the PR claims 2026.
is_ssi_spousal_deeming_appliesas an annual test (12 x $497) against 8-E's monthly test: edge cases only, in a federal variable.- SGA-path arithmetic: MONTH reads of YEAR variables times 12 into
_apply_ssi_exclusionsand divided by 12 give the annual form (probe 1,793.42 both ways). ISM is not ingov.ssa.ssi.income.sources.unearned, andwhere(counted_by_ssi, ...)selects one branch. - Candidate entry: same keys and order as the two earlier Iowa entries; ids in order; the example and the "From April 2026" example recompute; the guard passes.
PDF Audit Summary
| Category | Count |
|---|---|
| Documents | Reused: 6-B, 8-E, IAC 51, 52, 75, Code 249, GL 6-B-46, RC-0130 Rev. 04/25 and 04/26, GL 8-E-106. New: GL 6-B-45, 2023 standards sheet, 8-F, eCFR 416.1160 |
| Values, rules, anchors and candidate readings confirmed | 29 (9 values, 6 derived 2025 levels, 6 rules, 5 anchors, 3 candidate readings and examples) |
| 2025 and 2026 values mismatched | 0 |
| Rule mismatches (code run + page re-read) | 1: SA28 |
| Out-of-year value mismatches | 6 (3 parameters x 2023-2024): SA19 |
| Source-conflict record gap | 1 year span: G51 |
| Rejected or narrowed | 1 rejected as should address (8-E reference tuple, G52); FPG notes kept as a suggestion (G53) |
| Page citations | 26 checked: 22 correct, 0 wrong; 4 eCFR sections not on disk (416.414 and 416.1112 read on LII; 8-E p.53 and p.56 give 416.1130 and 416.1140) |
| References | 23 of 23 corroborate (5 parameter entries, 3 candidate URLs, 15 comment citations) |
Validation Summary
| Check | Result |
|---|---|
| Regulatory | SA28; SA19 partial; G51, G53, G54 |
| References | 23 of 23 correct, none missing; G44 partial, G45 open; G52 |
| Code patterns | SA30; G55; one more G46 instance. 163 code-health tests pass; ruff clean |
| Tests | 20 items recomputed by hand (Cases 44, 45, 47-49, 78-88; comments in 38, 65, 76, 77), all correct; no non-functional test. Mutation probes: Case 85 pins SA27; start month 2 or 3 passes all cases (SA29). G56 |
| Local runs | 117/117 Iowa YAML cases; 848 passed, 10 skipped (guard, registry, aggregate lists). CI: see Branch Status and CI |
| Branch | 41 ahead, 5 behind main; clean merge; MERGEABLE |
| Partner tests | None touched |
Next Steps
- Fix SA28: deem the spouse's income on the SGA path, or cite a source and record a candidate. Add rows 1 and 3, update Case 82, and add the $497 control.
- Add the March 2026 case (SA29).
- Replace the
fpg_year_start_monthdescription (SA30). - Add the 2023-2024 values, or file the issue and add the NOTE line (SA19).
- Optional: G51-G56 and the carried suggestions.
- Ask DTrim99 to look at SA28, because it changes a NOTE that he accepted. To apply fixes:
/fix-pr 8017.
Review Severity: REQUEST_CHANGES
Four should-address items are open (SA19 partial, SA28, SA29, SA30) and no critical item is open; C7, SA25, SA26, SA27 and DTrim99's SGA critical are resolved.
- Deem a spouse's income to an SMME applicant working above the SGA level as 8-E pp.12-13 do, and use the two-person guideline when it is deemed (ia_ssa_smme_spousal_deeming_applies; Case 82 updated, Cases 90-92). - Pin the April guideline switch with a March case (Case 89). - Reword the fpg_year_start_month description to the parameter template. - Add the 2023 and 2024 dependent amount, per diem and personal needs allowance (General Letter 6-B-45 and the 2023 standards; Case 93), and correct the rounding NOTE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Pavel. These changes are in 1738284, and SA28, spouse income on the SMME SGA path: fixed as proposed.
SA29, the March case: fixed. Case 89 is your case: March, $1,565, pays 1. SA30, the description: fixed with your exact text. SA19, 2023 and 2024: fixed (option A).
The optional suggestions (G44-G56) are not in this round. TheAxiomFoundation/rulespec-us#1837 is updated: 122 cases, the 2023-2025 values, companion test AU and the SGA interpretation bullet rewritten for deeming, new rows BA-BE, and the dispatch range now runs "A to BE". 122 Iowa supplement cases pass locally (93 in |
PR Review (round 6): Add Iowa state supplementation for 2026SummaryPR #8017 (author: hua7450). This round reviews head
SA28 is correct. I reviewed it as new code.
Tests and the other replies.
Findings and verdict.
Prior findings
Pavel's round-5 items (Ziming's reply), checked as new code:
New findingsCritical (must fix)None. Should addressNone. Suggestions
VerifiedThe rule.
The code.
Edge cases I checked and am not raising.
SA19's values and references.
Hand-checked expectations (all new or changed). The 2026 figures are: SSI 994 / 1,491, SGA 1,690 (">"), and 120% of the guideline at 1,596 / 2,164 from April and 1,565 / 2,115 before April.
Other checks.
Axiom line assessmentThe line reads
CI status
Branch status
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Round 6: SA28 is correct as new code. The SMME spousal deeming for SGA workers matches 8-E pp.11-13 and 416.1163(b)(3)/(d) (child allocations first, nothing deemed at $497 or less, exclusions applied once, two-person guideline), it can't overlap the SSI couple or deeming paths, and Cases 87/88/77 are unchanged. Every new or changed case hand-checks, and Pavel's SA29/SA30/SA19 are fixed. CI hadn't started any suite on this head when I checked, so please let it finish green before merging. Three suggestions, including a case with a child for the allocation step. Full report in the comment above.
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review (round 6): Add Iowa state supplementation for 2026
IDs: C = critical, SA = should address, G = suggestion. Prior IDs keep their numbers. New findings start at SA31 and G57. There is no new critical item, so C8 is not used. DTrim99 approved this head with three suggestions. They are credited below as SA33, G64 and G65.
Source Documents
- Reviewed head SHA: 5837b95
- Mode: incremental from 647fdf4
- Commits since round 5: 1738284 "Address Pavel's round-5 review of Iowa SSA" (9 Iowa files, +260 / -17); 5837b95 (merge of
mainat 2bc4ccc; among PR-scope files onlyprograms.yamlandsource_conflicts/candidates.yamlchanged, both frommain). - Scope: new
ia_ssa_smme_spousal_deeming_applies.pyand helper_smme_spouse_income.py; changes toia_ssa.pyandia_ssa_smme_countable_income.py; 2023 and 2024 values independent_amount.yaml,rcf_daily_limit.yamlandrcf_personal_needs.yaml;fpg_year_start_month.yaml:1;ia_ssa.yaml(Case 82 changed, Cases 89-93 new; 93 cases, 122 Iowa cases in total). The PR's own lines in the shared files are unchanged. - Sources ("p.NN" = PDF FILE page; 6-B and 8-F FILE = printed + 4; 8-E FILE = printed + 5; GL 6-B-45 FILE = PDF index):
- Reused: 6-B https://hhs.iowa.gov/media/3987/download?inline= ; 8-E https://hhs.iowa.gov/media/4011/download?inline ; 8-F https://hhs.iowa.gov/media/4012/download?inline ; GL 6-B-45 https://hhs.iowa.gov/media/12206/download ; 2023 standards sheet (one page) https://hhs.iowa.gov/media/9237/download ; Iowa Code 249 https://www.legis.iowa.gov/docs/code/249.pdf ; 441 IAC 75 https://www.legis.iowa.gov/docs/iac/chapter/441.75.pdf ; RC-0130 Rev. 04/25 https://web.archive.org/web/20250319223420/https://hhs.iowa.gov/media/6948/download ; eCFR 20 CFR 416.1160.
- New this round (eCFR versioner, 2026-10-01): 20 CFR 416.1163, 416.1161, 416.1167, 416.1149, 416.1112, 416.1856 and 416.1861 (https://www.ecfr.gov/current/title-20/section-416.1163 and siblings); 42 U.S.C. 1382a and 1382c (LII).
Branch Status
- 43 ahead, 14 behind
main(12b899c);MERGEABLE.git merge-tree --write-tree 12b899c11a 5837b95c64is clean. - The 14 commits change no Iowa file, no SSI variable or parameter, and no Iowa entry in
candidates.yamlorprograms.yaml. They touch Social Security benefit-tax revenue, other states' programs, a newprograms.yamlentry and othercandidates.yamlentries. Verifiers 1 and 4 confirmed that the federal SSI deeming, status and couple-computation files are the same at the head and onmain. The staleness did not affect any finding. A rebase is not necessary for review. (DTrim99's "0 behind" was measured against 2bc4ccc.) - CI: 27 pass, 0 fail.
- Local run at 5837b95: 122/122 Iowa YAML cases pass; 448 code-health and aggregate-list tests pass (1 skipped);
ruff format --checkandruff checkare clean on the 24 Iowa variable files. - No partner test file is touched. The changelog fragment is unchanged. Record only:
programs.yamlstill saysverified_years: "2026", while three parameters now carry 2023-2024 values.
What round 6 got right
- SA28, the core fix, is correct. The new flag and helper follow 8-E steps 1-8 (8-E p.12, p.13) and 20 CFR 416.1163(b)(3) and (d).
- Child allocations come off the spouse's unearned income first, then off earned income.
- Nothing is deemed at $497 or less. The test is
>, and Case 92 pins it. - Both spouses' income goes through
_apply_ssi_exclusionsonce (ia_ssa_smme_countable_income.py:58-67), andia_ssa.py:112-117uses the two-person guideline. - My four round-5 rows now give the rule's result. For a spouse at home, the age-50 and age-70 paths agree.
- The flag requires
~is_ssi_aged_blind_disabled, so it cannot overlapjointoris_ssi_spousal_deeming_applies. - You were right not to reuse the federal deeming variables: each one is gated on aged, blind or disabled (ABD) status.
- Cases 82 and 90-92 recompute by hand.
- SA29 is fixed. Case 89 (
ia_ssa.yaml:2618, March 2026, 1,565, pays 1) pins April. In the coordinator's probes, start months 2 and 3 fail Case 89, and start month 5 fails Cases 45 and 49. - SA30 is fixed.
fpg_year_start_month.yaml:1is the exact proposed text. - SA19 is fixed (option A). The 2023 values (474 / 35.89 / 120) and the 2024 values (490 / 36.82 / 123) match the 2023 sheet and GL 6-B-45 p.1 and p.24. Four reports read these pages as images. The effective dates are right, Case 93 gives 321.42, and the rounding NOTE is corrected (120 x 1.032 = 123.84, but $123 was published).
- No regression in C4, C7, SA23, SA25, SA27 or DTrim99's SGA critical. Cases 77, 87 and 88 are one-person cases, so the new flag is false for them.
- All 8 new reference entries and all 14 new or changed comment citations corroborate. No printed page number is used.
The four new should-address items are all in the new SA28 code. Two are rule gates that the flag does not test (SA31, SA32). Two are rule steps that no test pins (SA33, SA34).
Round-5 status
| ID | Status | Evidence at 5837b95 |
|---|---|---|
| SA28 SGA-path spouse income | RESOLVED | New flag and helper; ia_ssa_smme_countable_income.py:58-61; ia_ssa.py:115; Cases 82, 90-92. Gaps in the new code: SA31-SA34 |
| SA29 April switch month | RESOLVED | Case 89; months 2 and 3 fail Case 89, month 5 fails Cases 45 and 49 |
| SA30 description | RESOLVED | fpg_year_start_month.yaml:1, exact text |
| SA19 2023-2024 levels | RESOLVED | Values match the sources (images); Case 93 = 321.42; NOTE fixed. The 2023 values and the 2024 DP amount are not pinned: G63 |
| G25 case periods | PARTIAL (accepted part stands) | The new periods 2026-03, 2026-04 and 2024-01 fit their cases |
| G36 removable branches | STILL OPEN (no reply) | The four branches are unchanged. The new child-allocation gap is SA33 |
| G37 "discretion" reading | STILL OPEN (no reply) | Iowa candidates.yaml entries and the NOTE at ia_ssa.py:128-135 unchanged |
| G38 DP couple level into RCF | STILL OPEN (no reply) | ia_ssa_federal.py unchanged |
| G39 SMME upper bound in the input only | STILL OPEN (no reply) | Unchanged. New point below |
| G40 one flag, two rules | STILL OPEN (no reply) | Files unchanged |
| G41 integration Case 12 | STILL OPEN (no reply) | integration.yaml unchanged |
| G42 IHHRC allowance over the tax unit | STILL OPEN (no reply) | ia_ssa_ihhrc_participation.py:49-51 unchanged |
| G44 source links | PARTIAL (deferred) | GL 6-B-45 is now linked in 3 parameters. GL 6-B-47 (named in the NOTE for $130) is not linked; the undated code/249.pdf stays |
| G45 page lists and titles | STILL OPEN (deferred) | ia_ssa_smme_countable_income.py:19 still says "249.3(4)(g)" while :40-41 relies on (a)(2); :23 is unlabeled |
| G46 manual sums | STILL OPEN (deferred) | ia_ssa_smme_countable_income.py:37, 55-57, ia_ssa_federal.py:37-39, ia_ssa_rcf_couple_budget.py:32; no new instance |
| G47 RCF dividends case | STILL OPEN (deferred) | No case |
| G48 formula boundaries | STILL OPEN (deferred) | The guideline lines are still input overrides; Case 92 pins only the $497 boundary |
G49 ia_ssa_has_spouse true |
STILL OPEN (deferred) | Only Case 65's [false, false]. Case 82's flag depends on it only indirectly (verifier 4) |
| G50 other branches | STILL OPEN (deferred) | Unchanged |
| G51 per diem candidate years | STILL OPEN, wider | candidates.yaml:1793-1795 still has from: 2026, but the maximum rate now applies from 2023 (Cases 86, 93). GL 6-B-45 p.24 and the 2023 sheet give the same two options. 2024: 321.42 against $0; 2023: 318.59 against $0 (31 x 17.86 = 553.66) |
| G52 8-E in reference tuples | PARTIAL | The new flag links 8-E #page=11; ia_ssa.py:10-19 and ia_ssa_smme_countable_income.py:18-24 still do not |
| G53 FPG timing notes | STILL OPEN (deferred) | fpg_year_start_month.yaml:10-14 unchanged. Case 89 names "RC-0130 Rev. 04/25" in text only; Cases 78-80 (:2263) still say "(RC-0130)" (verifier 4) |
| G54 SGA-path student exclusion | STILL OPEN; (b) is now documentation only | (a) unchanged. (b): every deemed applicant is married, so the case is now reachable. But verifier 4 found that 8-E p.19's "Not married" conflicts with the current 416.1112(c)(3) and 42 U.S.C. 1382a(b)(1), amended in 2004, which have no marital test. The repo follows current law, so do not zero the exclusion. Add the NOTE in the list below |
| G55 FPG reform timing | STILL OPEN (deferred) | ia_ssa.py:123 still reads f"{year}-01-01" |
| G56 2025 tests | STILL OPEN (deferred) | No 2025 SMME or DP case. The 2025 deeming threshold is 1,450 - 967 = 483 |
Tally: 25 IDs were open after round 5. Now 4 are resolved, 3 are partial (G25, G44, G52), 18 are still open and 0 are declined. You deferred G44-G56 ("not in this round") and did not reply on G36-G42. A deferral is acceptable for suggestions, and none of them blocks.
Critical (Must Fix)
None.
Should Address
SA31. The new flag deems income from a spouse who lives in a medical facility
- What is wrong:
ia_ssa_smme_spousal_deeming_appliesdeems whenever the marital unit has a spouse. It does not test whether the spouse lives in the same household. A spouse in a medical treatment facility for the whole month is not a household member, so nothing is deemed. For an ABD spouse (the usual facility resident), the SSI path already budgets the applicant alone (Case 81; 416.414(b)(3)). So the age-50 and age-70 paths now disagree for the same household, and that parity was the reason for SA28. The regulatory role found this, and verifier 1 confirmed it. - Where:
ia_ssa_smme_spousal_deeming_applies.py:34-38.ia_ssa_has_spouse.py:25-26tests only the marital unit and SSI's spouse index. - Source: Deeming applies when "An eligible person was living for any part of a month in the same household with an ineligible spouse" (8-E p.11), and it counts the spouse's income when "an ineligible spouse lives in the same household" (8-E p.12). Under 20 CFR 416.1167(a), an absent spouse stays a household member only if the spouse "leaves the household but intends to and does return in the same month or the month immediately following". (a)(2) covers only the eligible person. 416.1160 defines the ineligible spouse as "someone who lives with you". 416.1149 is about valuing in-kind support, so it does not change this.
- Evidence (verifier 1,
v1/parity_probe*.out): April 2026. The applicant is aged 50, disabled and above SGA, with SMME category and coverage. The spouse hasssi_lives_in_medical_treatment_facilityandssi_medicaid_pays_majority_of_care.
| Household (monthly) | Head: SMME income, ia_ssa |
Rule | Applicant aged 70, same household |
|---|---|---|---|
| Wages 3,277; disabled spouse, pension 520, in a facility | 2,106, [0, 0] | own 1,596, [1, 0] | 1,596, [1, 0] |
| Wages 1,700; disabled spouse, pension 3,000, in a facility | 3,797.50, [1, 0] | own 807.50, [0, 0] | 994, [0, 0] |
| Wages 3,277; spouse aged 70, pension 520, in a facility | 2,106, [0, 0] | own 1,596, [1, 0] | 1,596, [1, 0] |
- Why should address: The rule is clear, and the code is new this round. The facility signal is already used and tested (Case 81). It is not critical: the effect is $1 a month, the population is input-gated, and SMME is input-only in microsimulation.
- Fix: On a copy of the branch, the 122 existing cases and the new case pass, and the new case fails at the head. Add
"https://www.ecfr.gov/current/title-20/section-416.1167",toreference. Then add this term before the return at:34, and& ~apartin the return (the combined return is under SA32):
# 8-E p.11 deems only while the applicant lives "in the same
# household" with the spouse. Under 20 CFR 416.1167(a)(1) an absence
# is temporary only if the person returns in the same or the next
# month, so a spouse (or the applicant) in a medical treatment
# facility for the month is not a household member and nothing is
# deemed (ia_ssa.yaml Case 96).
# NOTE: Intent to return is not modeled, as in
# ssi_couple_computation_applies.
apart = person.marital_unit.any(
person("ssi_lives_in_medical_treatment_facility", period)
)The regulatory role's variant (ssi_federal_living_arrangement == MEDICAL_TREATMENT_FACILITY) gives the same results for every Medicaid-paid stay. But it still deems for a private-pay stay, and 416.1167 does not support that.
- Test (append; this is verifier 1's case, renumbered):
- name: Case 96, nothing is deemed to an SMME applicant working above the SGA level from a spouse who lives in a medical facility.
period: 2026-04
absolute_error_margin: 0.01
input:
people:
person1:
age:
2026: 50
meets_ssi_disability_criteria:
2026: true
employment_income:
2026: 39_324
ia_ssa_category: SMME
ia_ssa_smme_coverage_eligible: true
person2:
age:
2026: 70
pension_income:
2026: 6_240
ssi_lives_in_medical_treatment_facility: true
ssi_medicaid_pays_majority_of_care: true
marital_units:
couple:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
spm_units:
spm_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code:
2026: IA
output:
# 20 CFR 416.1167(a)(1); 8-E p.11-12 "same household": the spouse's 520
# pension is not deemed. person1's own income is (3,277 - 20 - 65) / 2 =
# 1,596, at least the one-person 1,596 (with deeming it would be 2,106,
# below the two-person 2,164). person2's 2,106 comes from SSI's federal
# deeming, which does not yet apply 20 CFR 416.1163(f)(5).
ia_ssa_smme_spousal_deeming_applies: [false, false]
ia_ssa_smme_countable_income: [1_596, 2_106]
ia_ssa: [1, 0]SA32. The new flag deems from a spouse who is not an "ineligible spouse"
- What is wrong: The flag deems from any spouse whose income after allocations is above $497. But 8-E defines the ineligible spouse by status. An ABD spouse who gets SSI or SSA, or who qualifies for a Medicare Savings Program, is in a non-MAGI group, so that spouse is not an ineligible spouse. Under "SSI policies", the pair is then budgeted as an eligible couple: the income is combined, the couple standard applies, and there is no $497 test and no child allocation. Main's
is_ssi_ineligible_spouseis false for each such spouse, but the helper sums all of the spouse's income. Three households flipia_ssa. The pdf-rules role found the gap but saw no payment effect. Verifier 2 found the flips. - Where:
ia_ssa_smme_spousal_deeming_applies.py:32-38;_smme_spouse_income.py:8-14. - Source: "An ineligible spouse is a spouse who is not eligible for SSI or non-MAGI-related Medicaid, or State Supplementary Assistance" (8-E p.12). The non-MAGI groups are for "People who are aged, blind, or disabled", and the list includes SSI and SSA recipients and "People in Medicare savings programs". Workers must "Use the Supplemental Security Income program policies" for these groups (8-F p.73, p.74). 8-E p.11 deems "according to SSI policies".
- Evidence (verifier 2,
v2/v2_probe.out; April 2026; applicant aged 50, disabled, above SGA, SMME; spouse aged 70 at home):
| Household (monthly) | Head: SMME income, ia_ssa |
Rule (eligible couple, combined) | Applicant aged 70 on main |
|---|---|---|---|
| Wages 3,277; spouse SS 400 | 1,596, [1, 0] | (400 - 20) + (3,277 - 65) / 2 = 1,986 < 2,164: [0, 0] | 1,986, [0, 0] |
| Wages 3,277; spouse SS 300 with SSI 102; two children | 1,596, [1, 0] | 1,886: [0, 0] | 1,886, [0, 0] |
| Wages 3,500; spouse with no income | 1,707.50 (one person), [1, 0] | 1,707.50 < 2,164: [0, 0] | 1,707.50, [0, 0] |
The head and the couple method agree when the spouse's income is above $497 and there are no children. That is the case for Cases 82 and 90-92 and for the control rows in verifier 2's probe. Verifier 2 rejected the "budget each spouse alone" values in the queue (pdf-rules P6 807.50 and P8 [1, 0]; tests NEW-5(b)), because SSI policy has no such step. It also found that main's MSP combines these couples, and that at the head one applicant could be SLMB-eligible and SMME-eligible in the same month.
- Why should address: The definition is clear, and main already encodes a status test. The choice is not documented. It is not critical: the structure is otherwise right, the couple method is inferred from "SSI policies", the effect is $1, and the population is very small and input-gated.
- Fix: This fix is
ruffclean and passes 122/122 on a copy of the branch. The three rows above become [0, 0], and Cases 82 and 90-92, the control rows and DTrim99's child case do not change. Replace_smme_spouse_income.pywith:
from policyengine_us.model_api import *
def smme_spouse_is_aged_blind_disabled(person, period):
"""Whether the other member of a two-person marital unit is a person SSI
treats as aged, blind or disabled. For an applicant whom SSI does not
count, any such member of the marital unit is the spouse."""
abd = person("is_ssi_aged_blind_disabled", period.this_year)
return person.marital_unit.sum(abd) - abd > 0
def smme_spouse_income(person, period):
"""A spouse's SSI earned and unearned income. For an ineligible spouse,
allocations for ineligible children are deducted, from unearned income
first (20 CFR 416.1163(b)(3)). A spouse whom SSI treats as aged, blind or
disabled is not an ineligible spouse, and the couple's income is combined
as for an eligible couple, with no allocations."""
earned = person("ssi_earned_income", period)
unearned = person("ssi_unearned_income", period)
spouse_earned = person.marital_unit.sum(earned) - earned
spouse_unearned = person.marital_unit.sum(unearned) - unearned
allocations = add(
person.tax_unit, period, ["ssi_ineligible_child_allocation"]
) * ~smme_spouse_is_aged_blind_disabled(person, period)
unearned_left = max_(spouse_unearned - allocations, 0)
earned_left = max_(spouse_earned - max_(allocations - spouse_unearned, 0), 0)
return earned_left, unearned_leftIn the flag, import smme_spouse_is_aged_blind_disabled. Then replace :32-38 with the code below, which includes SA31's apart from above. Each fix was run alone on a copy of the branch, but the combined form was not run as one, so run the suite once.
# 8-E p.12: "An ineligible spouse is a spouse who is not eligible for
# SSI or non-MAGI-related Medicaid, or State Supplementary
# Assistance." Those groups are for aged, blind or disabled people
# (8-F PDF pages 73-74), so, as is_ssi_ineligible_spouse does, a spouse
# SSI treats as aged, blind or disabled is not an ineligible spouse: the
# couple's income is combined with no $497 test, as SSI and
# msp_countable_income combine an eligible couple's income.
# NOTE: 8-E tests eligibility for SSI, non-MAGI-related Medicaid or
# State Supplementary Assistance. The model uses SSI's aged, blind or
# disabled status, so an aged, blind or disabled spouse who qualifies
# for none of them is combined rather than deemed.
eligible_spouse = smme_spouse_is_aged_blind_disabled(person, period)
earned, unearned = smme_spouse_income(person, period)
p = parameters(period).gov.ssa.ssi.amount
return (
applicant
& person("ia_ssa_has_spouse", period)
& ~apart
& (eligible_spouse | (earned + unearned > p.couple - p.individual))
)Also update the comments at ia_ssa_smme_countable_income.py:45-48 and ia_ssa.py:103-111 ("a spouse's income above the couple rate less the individual rate, or an aged, blind or disabled spouse's income"). Optionally, add "https://hhs.iowa.gov/media/4012/download?inline#page=73" to the tuple. A NOTE alone does not fix a contradiction with a clear rule. Gating alone (budgeting each spouse alone when the spouse is ABD) is also wrong: it breaks the case of an aged spouse whose income is too high for SSI (wages 1,700, spouse SS 3,000: [1, 0] is correct today).
- Test (append; verifier 2's case, renumbered; it passes with the fix and fails at the head):
- name: Case 97, an aged spouse is not an ineligible spouse, so an SMME applicant working above the SGA level is budgeted as a couple.
period: 2026-04
absolute_error_margin: 0.01
input:
people:
person1:
age:
2026: 50
meets_ssi_disability_criteria:
2026: true
employment_income:
2026: 39_324
ia_ssa_category: SMME
ia_ssa_smme_coverage_eligible: true
person2:
age:
2026: 70
social_security_retirement:
2026: 4_800
marital_units:
couple:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
spm_units:
spm_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code:
2026: IA
output:
# 8-E p.12: an ineligible spouse is "not eligible for SSI or
# non-MAGI-related Medicaid, or State Supplementary Assistance". The
# spouse is aged, so the couple's income is combined with no $497 test:
# (400 - 20) + (3,277 - 65) / 2 = 1,986 < 2,164. Alone, 1,596 would
# qualify against the one-person 1,596.
ia_ssa_smme_spousal_deeming_applies: [true, false]
ia_ssa_smme_countable_income: [1_986, 1_986]
ia_ssa: [0, 0]Optional second case: the spouse gets SSI and there are two children aged 10 (second row above). The expected values are SMME income [1,886, 1,491], ia_ssa [0, 0] and ssi [0, 102].
SA33. No test pins the child-allocation step (DTrim99's suggestion 1)
- What is wrong: No SMME case has a child, so nothing tests
_smme_spouse_income.py:12-14. You can drop the allocation, reverse the order, or skip the carry-over to earned income, and all 122 cases still pass. DTrim99 raised this first. He rated it a suggestion because the arithmetic mirrors main's federal variables. But the helper is a separate implementation, written to avoid main's earned-income variable, and only two Iowa variables call it. So main's tests do not cover it. - Where:
_smme_spouse_income.py:12-14;ia_ssa.yaml(no SMME case with a person under 18). - Source: 8-E steps 1-2 (8-E p.12): subtract "an allocation for each ineligible child" from the spouse's unearned income, then "any remaining balance" from earned income. 416.1163(b)(3) gives the same order. Your SA28 fix text named this step.
- Evidence (verifier 3,
v3/): Each one-line mutant passes all 122 cases, and the proposed case fails on each of them. Each mutant also flipsia_ssafrom 0 to 1.
| Mutant | person1 SMME income | ia_ssa |
Existing 122 | Case 94 |
|---|---|---|---|---|
| Head | 2,099 | 0 | pass | pass |
Allocations zeroed (the coordinator's noalloc probe) |
2,437.50 | 1 | pass | fails |
| Allocation from earned income first | 2,189 | 1 | pass | fails |
| No carry-over to earned income | 2,247.50 | 1 | pass | fails |
DTrim99's case (Case 82 plus a child with no income: [2,099, 457.50, 0], [0, 0, 0]) is correct. It catches the first and third mutants. It misses the order, because his spouse has no unearned income. Case 94 catches all three.
- Why should address: This is a missing edge case for an already-tested variable, in new code. It is the same class as SA29, where a probe showed that a rule step could change with every test passing. It is not critical, because the code is correct today.
- Fix (no code change; append after Case 93 with one blank line before it; this is verifier 3's text byte for byte, and it passes at the head):
- name: Case 94, a child's allocation comes off a spouse's pension first and then wages before deeming to an SMME applicant working above the SGA level.
period: 2026-01
absolute_error_margin: 0.01
input:
people:
person1:
age:
2026: 50
meets_ssi_disability_criteria:
2026: true
# Wages of $1,700 a month, above the $1,690 SGA level.
employment_income:
2026: 20_400
ia_ssa_category: SMME
ia_ssa_smme_coverage_eligible: true
person2:
age:
2026: 45
# A pension of $200 and wages of $2,880 a month.
pension_income:
2026: 2_400
employment_income:
2026: 34_560
person3:
age:
2026: 10
marital_units:
couple:
members: [person1, person2]
child:
members: [person3]
tax_units:
tax_unit:
members: [person1, person2, person3]
spm_units:
spm_unit:
members: [person1, person2, person3]
households:
household:
members: [person1, person2, person3]
state_code:
2026: IA
output:
# 8-E steps 1-3: the child's 497 allocation takes the spouse's 200 of
# pension and 297 of wages, leaving 2,880 - 297 = 2,583 > 497 to deem.
# (1,700 + 2,583 - 20 - 65) / 2 = 2,099, below January's two-person 2,115.
# person2's own income is (200 - 20) + (2,880 - 65) / 2 = 1,587.50.
ssi_ineligible_child_allocation: [0, 0, 497]
ia_ssa_smme_spousal_deeming_applies: [true, false, false]
ia_ssa_smme_countable_income: [2_099, 1_587.5, 0]
ia_ssa: [0, 0, 0]SA34. No test deems a spouse's unearned income on the SGA path
- What is wrong: In Cases 82, 90 and 91 the spouse has wages only, and in Case 92 the spouse's pension is not deemed. So the unearned term at
ia_ssa_smme_countable_income.py:61always adds 0, and the unearned summand of the flag test is never decisive. The $497.01 side of the threshold is also untested on this path. - Where:
ia_ssa_smme_countable_income.py:61(unearned + deemed * spouse_unearned);ia_ssa_smme_spousal_deeming_applies.py:37(earned + unearned). - Source: 8-E step 4 combines "the applicant's unearned income and the ineligible spouse's remaining unearned income" (8-E p.13). The deeming test is "over $497" (8-E p.12).
- Evidence (verifier 3): If you drop the
:61term, all 122 cases pass. The proposed case then gives 1,847.50 against the two-person 2,115, soia_ssaflips from 1 to 0. If the flag tests earned income only (:37), all 122 cases pass, and the proposed case fails on the flag. With Cases 94 and 95 both appended, the Iowa folder gives 124 passed at the head. Each case pins its own step. - Why should address: This is a missing edge case for an already-tested variable, and the mutant flips eligibility. It is not critical, because the code is correct.
- Fix (append after Case 94; this is verifier 3's text byte for byte, and it passes at the head). With Case 92, it pins the
>test from both sides:
- name: Case 95, a spouse's 497.01 dollar pension is deemed to an SMME applicant working above the SGA level.
period: 2026-01
absolute_error_margin: 0.01
input:
people:
person1:
age:
2026: 50
meets_ssi_disability_criteria:
2026: true
# Case 77's worker: SSDI of $900 and wages of $2,000 a month.
social_security_disability:
2026: 10_800
employment_income:
2026: 24_000
ia_ssa_category: SMME
ia_ssa_smme_coverage_eligible: true
person2:
age:
2026: 45
# A pension of $497.01 a month and no wages.
pension_income:
2026: 5_964.12
marital_units:
couple:
members: [person1, person2]
tax_units:
tax_unit:
members: [person1, person2]
spm_units:
spm_unit:
members: [person1, person2]
households:
household:
members: [person1, person2]
state_code:
2026: IA
output:
# 497.01 is more than 1,491 - 994 = 497, so the pension is deemed as
# unearned income: (900 + 497.01 - 20) + (2,000 - 65) / 2 = 2,344.51, at
# least January's two-person 2,115. person2's own income is 497.01 - 20.
ia_ssa_smme_spousal_deeming_applies: [true, false]
ia_ssa_smme_countable_income: [2_344.51, 477.01]
ia_ssa: [1, 0]Append the cases in number order (94, 95, 96, 97). Cases 94, 95 and 92 have a spouse aged 45 who is not in a facility, so the SA31 and SA32 fixes do not change them.
Suggestions
New:
- G57. The spouse's income on the new path copies three federal deeming simplifications. This comes from regulatory NEW-2, code NEW-1 and verifier 4.
- Where:
_smme_spouse_income.py:8-14. - (a) Court-ordered support and alimony that the spouse pays are not deducted. 8-E says "Deduct support payments from the income of the ineligible spouse ... first from unearned income" (8-E p.12), and 416.1161(a)(10) says the same. Probe (April 2026): with wages 3,277 and spouse wages 600 that pay child support 200, the model gives [0, 0] and the rule gives [1, 0]. With wages 1,700 and spouse wages 3,000 that pay alimony 2,600, the model gives [1, 0] and the rule gives [0, 0].
- (b) Children are found through the applicant's tax unit. When the spouses file separately and the child is on the spouse's return, nothing is allocated (Case 82 plus a child: 2,347.50, [1, 0, 0]; rule 2,099, [0, 0, 0]).
- (c) The 416.1163(b) exception for a child who receives public income-maintenance is not applied.
- Why a suggestion: main's federal deeming has all three gaps, and the age-70 SSI path gives the same results. A helper-only fix would split the two paths again (verifier 4, Part C). On main, the same gap also underpays SSI itself. An aged applicant with SS 500, whose spouse has wages 1,500 and pays support 1,200, gets SSI 293.50 instead of 514.
- Fix: name (a)-(c) in the helper docstring, citing 8-E p.12 and 416.1161(a)(10). File a federal issue to deduct
child_support_expenseandalimony_expenseinssi_{earned,unearned}_income_deemed_from_ineligible_spouse, with that SSI household as the test. No open issue covers 416.1161(a)(10).
- Where:
- G58. Main's SSI deeming ignores a stay in a medical facility, in both directions. This comes from regulatory NEW-3 and verifier 1, section 7.
- (a) An SMME applicant in a facility still gets income deemed from a spouse at home. 416.1163(f)(5) says that when "the $30 Federal benefit rate applies, we do not deem your ineligible spouse's income to you". Probe: the applicant is aged 70 and in a facility with own income 1,600, and the spouse is aged 45 at home with a pension of 520. The model gives 2,120 and [0, 0]; the rule gives 1,600 and [1, 0].
- (b) A non-ABD spouse in a facility is still deemed on the SSI path. With an applicant aged 70, wages 3,277 and a spouse aged 45 with a pension of 520 in a facility, the model gives 2,106 and [0, 0]; the rule gives 1,596 and [1, 0].
- Where:
ia_ssa.py:114andia_ssa_smme_countable_income.py:37read the federal variables. - This is federal code, it also affects
ssi, and SA31 cannot reach it. Fix: file a federal issue. Optionally, add a NOTE besideia_ssa.py:112-116.
- G59. The new comments give the 8-E exception list the wrong scope, and two cites can be more exact. This comes from regulatory NEW-4, references NEW-1 and pages note 2.
ia_ssa_smme_spousal_deeming_applies.py:21-23calls the exceptions "State Supplementary Assistance groups", but Medically Needy and MEPD are Medicaid groups (8-E p.11). Use:8-E p.11 determines deemed income "for non-MAGI-related Medicaid and State Supplementary Assistance coverage groups according to SSI policies", except the Medically Needy, in-home health-related care, dependent person and MEPD groups.- Cite "416.1163(b)(3)" at
_smme_spouse_income.py:6. SA32's docstring already does. - Optionally, add
https://www.legis.iowa.gov/docs/code/249.pdf#page=2to the flag's tuple, because the comment at:26relies on 249.3(4)(a)(2) and (c).
- G60. Reference titles. This comes from references NEW-2 and pages note 1.
- The 2023 sheet titles at
dependent_amount.yaml:27,rcf_daily_limit.yaml:28andrcf_personal_needs.yaml:38read "Iowa HHS 2023 State Supplementary Assistance standards". Use the document's own title and date:Iowa HHS State Supplementary Assistance Standards (effective January 1, 2023). - Optional: end the GL 6-B-45 titles with "#page 1,3" at
dependent_amount.yaml:25(FILE 3 has the $490 DP income limit) and "#page 1,16" atrcf_personal_needs.yaml:36(FILE 16 has the $123), asrcf_daily_limit.yaml:26does.
- The 2023 sheet titles at
- G61. Helper and label naming. This comes from code NEW-2.
- Four of the six state helper modules carry the program prefix (
_nh_ssp_couple.py,_ok_ssp_income.py,_ga_liheap_housing.py,_ky_combined_separate.py). Rename the module to_ia_ssa_smme_spouse_income.pyand the function toia_ssa_smme_spouse_income. - The label at
ia_ssa_smme_spousal_deeming_applies.py:10is a clause, but the other Iowa labels are noun phrases. Use "Iowa SMME spousal deeming applies to an applicant working above the SGA level". - In the docstring, say that "marital-unit sum minus own" is the spouse only because callers gate on
ia_ssa_has_spouse.
- Four of the six state helper modules carry the program prefix (
- G62. Two gate operands are not pinned. This comes from tests NEW-3 (static trace; run once). If you remove
~is_ssi_aged_blind_disabled(ia_ssa_smme_spousal_deeming_applies.py:29-31) oria_ssa_has_spouse(:36), every case still passes. The first operand is the guarantee against double counting.- Fix: add
ia_ssa_smme_spousal_deeming_applies: [false, false, false, false]to Case 51 (ia_ssa.yaml:1309). Its disabled person1 has a spouse who earns 4,500, so without~ABDthe flag would be true. - For the second operand, use a Case 94 variant with no
marital_units. It gives flag [false, false, false], SMME income 807.50 for person1 andia_ssa0.
- Fix: add
- G63. The 2023 values and the 2024 dependent amount are not pinned. This comes from tests NEW-4. Add these cases, in the shape of Cases 4 and 93. Each one fails if its year's entry is removed, and the regulatory probe gives the same values.
2023-01, age 70,RESIDENTIAL_CARE, SSI only:ia_ssa318.59 (31 x 35.89 - (914 - 120)).2024-01, age 65,DEPENDENT_PERSON,ia_ssa_dependent_countable_income: 100:ia_ssa490.2023-01, the same household:ia_ssa474.
- G64. The PR body has one stale clause (DTrim99's suggestion 2). The SMME coverage bullet still lists "an SGA worker with a spouse ... (Cases 81-84)", but Case 82 now deems. Drop that clause, and change "(Cases 81-84)" to "(Cases 81, 83 and 84)". After SA31-SA34, add Cases 94-97 to the test list and update the counts.
- G65. rulespec-us#1837 has stale details (DTrim99's suggestion 3; issue only).
- Step 1 says "Parameters from 2026-01-01", but rows AX and BE need the 2023-2025 values.
- The "14 formulas" count and the Required outputs table do not include
ia_ssa_smme_spousal_deeming_applies. - The Payment row still says "for the recipient and any spouse".
- Row BD does not say "April 2026".
- After the fixes, add rows for Cases 94-97.
Still open from earlier rounds (as written in rounds 4 and 5, with the updates noted):
- G36 Four removable branches: the
~adultchild-support guard, the FLHmarital_unit.any, the FLHrecipientssplit, and parental deeming with an SSI parent or two eligible children. - G37 Add the "At the discretion of the department" reading of Code 249.3(4) to the candidate and the NOTE at
ia_ssa.py:128-135. - G38 The DP couple level continues on a spouse in residential care (6-B p.66, p.71). Add a NOTE or a "Not modeled" line.
- G39 The 249.3(4)(g) upper bound is carried only by
ia_ssa_smme_coverage_eligible. New point: 6-B p.77 also excludes a person who must pay a premium, and an MEPD member whose gross income is above 150% FPL pays one (8-F p.121). So Cases 77, 82, 88 and 92 imply a group with no premium. Say both in the input's documentation. - G40
ia_ssa_care_initial_partial_monthdrives two rules with different scopes. Align the documentation or split the trigger. - G41 Integration Case 12 certifies DEPENDENT_PERSON with no dependent in the household.
- G42 The IHHRC dependent allowance is summed over the tax unit (
ia_ssa_ihhrc_participation.py:49-51). - G44 Link GL 6-B-47 (https://hhs.iowa.gov/media/18744/download?inline) in
rcf_personal_needs.yaml. Consider the datedcode/2026/249.pdf. - G45 Relabel
ia_ssa_smme_countable_income.py:19as 249.3(4)(a)(2), label:23, and apply the round-4 page-list items. - G46 Use
add()atia_ssa_smme_countable_income.py:37and:55-57and atia_ssa_federal.py:37-39, and re-wrapia_ssa_rcf_couple_budget.py:32. - G47 Add an RCF dividends case (SS 13,200 +
qualified_dividend_income600 a year: care income 1,100, pays 222.57). - G48 Add the formula boundaries: single at 1,596, and couple at 2,164. The SGA switch (wages 20,280 against 20,280.12) is now also a switch between the two deeming paths. In January, with SSDI 10,800 and spouse wages 12,000, both give about 2,192.50 and [1, 0] (static).
- G49 Add
ia_ssa_has_spouse: [true, true]to Case 83. - G50 Pin the IHHRC couple sum, the day-count
min_, the third-decimal truncation, earnings after entry and a later-entering spouse. - G51 Set
from: 2023atcandidates.yaml:1794. Optionally, add GL 6-B-45#page=24and the 2023 sheet as manual sources. - G52 Add
"https://hhs.iowa.gov/media/4011/download?inline#page=12", # 8-E Deeming from an Ineligible Spouse; PDF pages 12-13to the tuples atia_ssa.py:10-19andia_ssa_smme_countable_income.py:18-24. - G53 (a) Add the 6-B p.77 reference and a scope sentence. (b) Add a NOTE on the stale 8-E p.7 figures. (c) Link the RC-0130 Rev. 04/25 capture from Cases 78-80 and 89. (d) Optionally, add
2025-01-01: 4. - G54 (a) Document the cap averaging. (b) Add this NOTE at
ia_ssa_smme_countable_income.py:49: "The student exclusion follows 20 CFR 416.1112(c)(3) and 42 U.S.C. 1382a(b)(1) as amended in 2004, which have no marital or head-of-household test. 8-E p.19 still lists 'Not married' and 'Not the head of the household'." - G55 An FPG reform that does not start on January 1 reaches Iowa a year late (
ia_ssa.py:123). - G56 Add 2025 tests: SS 18,720 a year gives 1 in March and 0 in April, and a DP case in 2025-01 with dependent income 100 gives 503.
Investigated and cleared
- 8-E p.11, "income alone ... over income limits": SMME's test is a floor. Case 91 follows p.12 ("also consider the ineligible spouse's income").
- 8-F p.120, MEPD family income: this is the MEPD group's own test, and the coverage input carries it. 8-E p.11 sends only MEPD to 8-F. The results are the same under either reading.
- 8-E p.13 "lesser of" and 416.1163(e)(2): these limit the SSI payment, not countable income.
- ISM on the deeming path: the individual PMV ($351.33) is the only figure in 8-E. The spouse's ISM is excluded (416.1161(a)(11)).
- Timing of the $497 threshold: 8-E uses the current month. The second-prior-month rule is for the benefit amount.
- MONTH reads of YEAR variables in the helper: these divide by 12 (allocation 497 less the child's monthly income).
- The married student on the deemed path (verifier 4): the repo follows current federal law, so G54(b) is documentation only.
- LII href for 416.1163: this is the house form, and its text agrees with the eCFR.
- 2023 sheet URL: the media id still serves the 2023 sheet in October 2026.
- The dependent-income boundary at exactly $490 or $474 gives 0 (
<). This choice predates this round.
PDF Audit Summary
| Category | Count |
|---|---|
| Documents | Reused: 6-B, 8-E, 8-F, GL 6-B-45, 2023 standards sheet, Code 249, IAC 75, RC-0130 Rev. 04/25, eCFR 416.1160. New: eCFR 416.1163, 416.1161, 416.1167, 416.1149, 416.1112, 416.1856, 416.1861; 42 U.S.C. 1382a, 1382c |
| Values, rules, anchors and cites confirmed (pdf-rules) | 36 (8 new values and dates, 1 unchanged-values check, 9 derived 2023/2024 levels and cases, 11 deeming rules, 7 anchors and cites) |
| Value mismatches | 0 |
| Rule mismatches (code run, page re-read, verifier-confirmed) | 2: SA31 (spouse in a facility), SA32 (spouse status) |
| Rule steps with no test (mutation-proven) | 2: SA33, SA34 |
| Inherited federal gaps | G57, G58 (suggestions; federal issues); G54(b) documentation only |
| Source-conflict record gap | 1 year span: G51 (now 2023-2026) |
| Rejected | "Budget each spouse alone" values (pdf-rules P6 and P8, tests NEW-5(b)); zeroing a married student's exclusion (regulatory) |
| Page citations | 21 checked, 21 correct, 0 wrong |
| References | 22 of 22 corroborate (6 parameter entries, 2 variable hrefs, 14 comment citations) |
Validation Summary
| Check | Result |
|---|---|
| Regulatory | SA28 and SA19 resolved; SA31; G57, G58, G59; G51 wider; G39 premium point |
| References | 22/22 correct; G44 and G52 partial; G45 and G53 open; G59, G60 |
| Code patterns | No critical or should-address item; SA30 resolved; G61; no duplicate of a federal variable; ruff clean |
| Tests | Cases 82 and 89-93 (and their comments) recompute, all correct; Cases 77, 87, 88 unchanged; no non-functional test; SA33, SA34; G62, G63 |
| PDF rules | 36 matches, 0 value mismatches; spouse-status gap (SA32 after verifier 2) |
| Pages | 21/21 correct |
| Verifiers | 1: facility gap CONFIRMED (SA31). 2: spouse status CONFIRMED with three flips (SA32); "budget alone" values REJECTED. 3: Cases 94 and 95 CONFIRMED (SA33, SA34); 124 pass with both. 4: support and alimony CONFIRMED as a federal gap (G57); married student NOT CONFIRMED as a mismatch (G54(b) NOTE); G53 and G49 STILL OPEN |
| Local runs | 122/122 Iowa YAML; 448 code-health and aggregate-list tests pass, 1 skipped; 4 coordinator mutation runs (start month 2, 3, 5; no allocation) |
| Branch | 43 ahead, 14 behind main; clean merge; MERGEABLE; staleness did not affect findings |
| Partner tests | None touched |
Review Severity: REQUEST_CHANGES
Four should-address items are open (SA31-SA34), all in the new SA28 code. No critical item is open. SA28, SA29, SA30 and SA19 are resolved.
Next Steps
- SA31 and SA32: add the household test and the spouse-status test to
ia_ssa_smme_spousal_deeming_applies(combined code in SA32), and append Cases 96 and 97. - SA33 and SA34: append Cases 94 and 95. No code change is needed.
- Run the Iowa suite once with all four changes, and update the comments at
ia_ssa_smme_countable_income.py:45-48andia_ssa.py:103-111. - Update the PR body (G64) and rulespec-us#1837 (G65) for Cases 94-97.
- Optional: G57-G63 and the carried suggestions. File the federal issues for G57(a) and G58.
- To auto-fix issues: run the fix-pr workflow for this PR.
- Deem nothing on the SMME SGA path from a spouse in a medical treatment facility, who is not a household member (20 CFR 416.1167; 8-E p.11; Case 96). - Treat a spouse SSI counts as aged, blind or disabled as an eligible spouse, combining the couple's income with no $497 test or child allocations (8-E p.12; 8-F pp.73-74; Case 97). - Pin the child-allocation order and a deemed spouse pension at $497.01 (Cases 94-95). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Pavel. All four are applied as you wrote them, in 99f005d, and
The optional suggestions (G57-G63 and the carried ones) are not in this round. 126 Iowa supplement cases pass locally (97 in |
What and why
Iowa's State Supplementary Assistance was missing from PolicyEngine-US. Add
ia_ssafor 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.
ia_ssa_federalcomputes 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.2026 levels:
Payment:
ia_ssa_care_initial_partial_monthmarks that month.ia_ssa_rcf_couple_budgetmarks 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).Who qualifies:
is_ssi_aged_blind_disabledinia_ssa_nonfinancial_eligible, oris_ssi_agedormeets_ssi_disability_criteriafor SMME, since SMME disability ignores substantial gainful activity (Iowa Code 249.3(4)(a)(2); 441 IAC 51.7(2); 6-B p.10)takes_up_ssi_if_eligibleoruncapped_ssi <= 0. An applicant whose income would qualify for SSI must take it up; an applicant over income needn'timmigration_statusoris_ssi_qualified_noncitizenis_incarceratedbarsssi_countable_resources, plusia_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_spouseidentifies the spouseia_ssa_categoryinputdefined_for = StateCode.IAChildren 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_parentstherefore deems parental income by the Iowa method:Couples:
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.
Inputs: all are Person and monthly, and all default to 0, false or
REGULAR.ia_ssa_categoryrecords the certified arrangement.NONEexcludes the person, including from the blind supplement.ia_ssa_dependent_countable_income,ia_ssa_ihhrc_monthly_costandia_ssa_rcf_daily_ratecarry forward until changed.ia_ssa_rcf_daily_rateis only for a facility rate below the maximum; 0 pays the maximum.ia_ssa_smme_coverage_eligibleis 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) andia_ssa_care_additional_deductionsare one-month entries. They have zero formulas, so an entry stays in its month.ia_ssa_care_additional_deductionsat 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.Source conflicts: where the sources disagree, the model follows the manual, except for the residential care entry month, where it follows the rule. For SMME income, SMME for a blind person under 65 and the residential care rate, 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). All three are listed in
source_conflicts/candidates.yaml(us-ia:smme-income-at-least-120-percent,us-ia:smme-blind-under-65,us-ia:rcf-maximum-per-diem-rate) 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 supplement is added to
household_state_benefits(all four year blocks, under a new# Iowa benefitscomment) and tospm_unit_benefits. SNAP and HUD count it throughia_ssa_countable_for_snapandia_ssa_countable_for_hud, which leave out the in-home care payment:Files:
Shared files:
household_state_benefits.yamlgains one Iowa entry per year block.income/sources/unearned.yamlandspm_unit_benefits.pyeach gain one Iowa entry.programs.yamlIowa entry changes fromin_progresstopartial.source_conflicts/candidates.yamlgains three statute-conflict entries: the two SMME entries and the residential care per diem.gov/ssa/ssi/income/exclusions/child_support_share.yaml, the one-third exclusion of 20 CFR 416.1124(c)(11), came tomainwith Add Oklahoma state supplementation for 2026 #10165. This PR leaves it as onmain.ia_ssa_care_countable_incomereads it, as Oklahoma's supplement does._ssi_parental_resource_pool, andia_ssa_has_spouseimports SSI's_ssi_spouse_index. The shared state supplement helper andminimum_payment.yamlare 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:
ia_ssa_care_additional_deductions.DEPENDENT_PERSONcertification covers;ia_ssa_care_additional_deductions;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:
ia_ssa_category, the care costs and rates, oria_ssa_smme_coverage_eligible. So in microsimulation only the blind supplement is paid.The dependent amount, the residential care per diem and the personal needs allowance carry 2023-2025 values from the 2023 standards and General Letters 6-B-45 and 6-B-46 (Cases 86 and 93). Other earlier-year values use parameter backfilling and are unverified historical estimates; no historical coverage is claimed.
Related:
spm_unit_benefits(such as the Texas rebate's), which this PR leaves unchanged.Test plan
ia_ssa.yaml, 12 inintegration.yaml, 7 inia_ssa_resources_deemed_from_parents.yaml, 6 inia_ssa_nonfinancial_eligible.yaml, 4 inia_ssa_income_deemed_from_parents.yaml) pass locally in onepolicyengine-corerun on this branch merged withmainat 6a92d6a. They cover:household_state_benefitsandspm_unit_benefitstotals, with the in-home payment left out of SNAP and HUD income.ia_ssa_nonfinancial_eligible.yamlCase 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".ia_ssa, and eachhousehold_net_incomematches its single-state control.ruff format,ruff checkandgit diff --check. The code-health tests' helper functions report no violations in the Iowa files; the code-health suite itself wasn't run.changelog.d/.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