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.
PR Review: Add Iowa state supplementation for 2026PR #8017 (author: hua7450, head SummaryThe PR adds Iowa's State Supplementary Assistance (
Most of the 2026 policy content is right:
One critical item:
Three should-fix items:
Six suggestions (backdating, the IHHRC ceiling conflict, couple readings, Case 58, Child Care Assistance wiring, polish). Earlier review (Pavel) — status at
|
| Review / item | Point | Status | Evidence |
|---|---|---|---|
| Apr C1 | Dependent-person couple used the individual rate, and an unsupported $503 cap | Fixed | The limit is the couple rate + $518 (+$22 per blind spouse), and the cap is removed (ia_ssa_federal.py:42-60). Integration Cases 3–4 give 259 / 270 each |
| Apr C2 | $20 exclusion wrongly allowed for residential care, family-life home and IHHRC | Fixed | ia_ssa_care_countable_income.py:63 uses general_exclusion=0; Case 17 (308.57) and Case 24 (380) |
| Apr C3 | Ineligible dependent spouse's resources not counted at $3,000 | Fixed in code | ia_ssa_eligible.py:23-33 combines spouse resources for the community categories (51.5(2)). No case pins it (Suggestion 3) |
| Apr C4 | Five wrong IAC subsection citations | Fixed | All citations are current: 51.5(1), 51.7(6), 52.1(1)–(7), and 177.2 / 177.8 after ARC 0460D |
| Apr C5 | Residential care and IHHRC deductions missing | Partly | The $65 + ½ exclusion is applied per household (integration Case 7), and child deeming is now modeled. Pavel named the dependent allowance as computable, but it is still input-only (Should 1) |
| Apr S1, S13 | Family-life home history; no 2011 test | Moot | History removed; values are 2026-only (Suggestion 1) |
| Apr S2 | SMME used the SPM-unit poverty guideline | Fixed for singles; new bug for couples | Now uses the marital-unit guideline, but joint couples are tested on half their income (Critical 1) |
| Apr S3, S12 | Duplicate cap; income gates inherited the $20 | Fixed | Cap removed; no $20 in the care income |
| Apr S4 | Inputs lack formulas or defaults for microsimulation | Declined, documented | PR body: in microsimulation "only the blind supplement is paid"; accepted (see the microsimulation check) |
| Apr S5 / May SA6 | Missing default_value |
Mostly | Four plain inputs (ia_ssa_dependent_countable_income, ia_ssa_ihhrc_monthly_cost, ia_ssa_rcf_daily_rate, ia_ssa_smme_coverage_eligible) rely on implicit defaults. Harmless (polish) |
| Apr S6 | Acronyms | Fixed in descriptions | Labels still say "Iowa SSA …" and "SMME" (polish) |
| Apr S7–S11 | Period comment; reference anchors; landing page | Fixed or moot | Manual references carry #page= anchors; the general-letter and landing-page references are gone |
| Apr S14 | No blind + aged dependent-person couple test | Fixed | Integration Case 4 |
| Apr S15–S19 | Boundary and routing tests | Mostly | Added: SMME Cases 56–57, IHHRC Cases 22–23, negative income Case 55, NONE category. Routing tests are moot under a single category input. Exact-FBR and participation-equals-cost boundaries weren't added (low value) |
| Apr G1 | $3,031 dependent-person standard | Resolved | 6-B PDF p.26 now prints $2,031 |
| Apr G5, G10 | Default the residential care rate to the maximum; $17.86 flat rate | Not done | Case 20 pays 0 without a rate; see Should 3(a) |
| May C1, C2 | IHHRC participation left out SSI; Ms. A example | Fixed | ia_ssa_care_countable_income.py:57-67 adds ssi; Case 24: participation 20, payment 380 |
| May C3 | POMS reference for the SSA computation | Fixed | ia_ssa_federal.py:18 cites SI 01415.058 F (the current section) |
| May SA1 | Stale 51.6 citations | Fixed | None remain |
| May SA2 | Duplicated logic | Fixed | Shared ia_ssa_ihhrc_participation and ia_ssa_ihhrc_amount |
| May SA3 | Family-life home $142 history | Moot | $142 is derived as 162 − 20 |
| May SA4 | State-specific resource parameters | Declined with reason | The comment at ia_ssa_eligible.py:35-38 says 6-B prints the SSI limits under 416.1202; accepted |
| May SA5 | 12 boundary tests | Mostly | Still open: an SMME two-person case (which would have caught Critical 1), SMME with one spouse covered, and residential care with one spouse resident |
| May SA7–SA13 | Template, anomaly anchor, comment density, booleans, income basis, anchors | Fixed | House-template descriptions; NOTE cites POMS F.1 code C; the deliberate income-basis split is commented |
| May G1–G13 | Case count, numbering, NOTEs, references | Fixed or moot | 85 cases = CI. Still open: G5 ($3,000 couple tests, Suggestion 3) and G7 (the new federal file cites Cornell, polish) |
Critical (must fix)
1. SMME couples are tested on half the couple's income against the two-person guideline, so qualifying couples get $0.
-
Where.
ia_ssa.py:60-65builds the guideline fromperson.marital_unit.nb_persons().ia_ssa.py:73-78compares it withia_ssa_smme_countable_income, which isssi_countable_income + ssi(ia_ssa_smme_countable_income.py:15).- For a joint claim,
ssi_countable_incomeis the couple's combined countable income divided by 2 (ssi_countable_income.py:where(both_eligible, personal_countable / 2, ...)).ssi_claim_is_jointneeds only two aged, blind or disabled spouses, with no income test, so every aged couple is joint.
-
The law.
- 441 IAC 51.7(6): "Income of a recipient must be within the income limit for the person's Medicaid eligibility group, but must exceed 120 percent of the federal poverty level."
- 6-B PDF p.77: "income is determined according to SSI income criteria".
- There are two coherent readings: each spouse's own income against the one-person guideline, or the couple's combined SSI income against the two-person guideline. The model mixes them: half the couple's income against the two-person guideline.
-
Probe at the head (policyengine-core 3.32.29; January 2026; both aged 70, SMME category, coverage entered, Social Security $1,700 a month each):
Household SMME income per person Threshold ia_ssaOwn-income reading Couple reading Married couple 1,690 ((3,400 − 20) / 2) 1.2 × 21,640 / 12 = 2,164 [0, 0] 1,680 > 1,596: $1 each 3,380 > 2,164: $1 each Same person, single 1,680 1.2 × 15,960 / 12 = 1,596 1 $1 $1 So the same person gets $1 when single and $0 when married to a spouse with the same income, which no reading of 51.7(6) supports. In effect the couple must have more than twice 120% of the two-person guideline.
-
Why critical. It is a wrong result in the claimed year, contrary to the rule, for every SMME couple whose income lies between the rule's threshold and twice it. The amount is $1 a month, but the batch rule is "however rare the case". Pavel's May SA5 items 4 and 10 asked for exactly these couple cases.
-
Fix.
- Keep the marital-unit guideline, which the PR adopted after Pavel's S2, and compare it with the couple's combined income. For example, use
where(joint, person.marital_unit.sum(smme_income), smme_income), withjoint = ssi_couple_computation_applies. This matches howia_ssa_federal.py:38-41already sums the couple's income for the dependent-person test. - Decide and document the ineligible-spouse case too. There
ssi_countable_incomeholds only the income SSI deems, but the guideline is still for two people. - Add the couple above as a case expecting [1, 1], plus one just below 2,164 combined expecting [0, 0].
- Add both to Update New York tax rules for 2022 #1837's companion tests.
- Keep the marital-unit guideline, which the PR adopted after Pavel's S2, and compare it with the couple's combined income. For example, use
Should address
1. The IHHRC dependent allowance is a rule-level deduction, but the model doesn't compute it. The manual's own examples come out wrong by default.
-
Where.
ia_ssa_ihhrc_participation.py:28-31deducts only $994, or $1,491 with a spouse.- The
ia_ssa_care_additional_deductionsdocumentation asks users to enter "dependent and spouse allocations".
-
The law.
- 441 IAC 177.2(1)"f"(3) lists among the disregards from gross income: "The amount of the SSI standard for a dependent plus any established unmet medical needs for each dependent living in the home. Any income of the dependent shall be applied to the dependent's needs before making this disregard."
- 6-B PDF p.43: "$ 497 Maximum additional allowance for each dependent ... Subtract a dependent's income from the additional home maintenance allowance".
-
Probe at the head.
6-B example Manual participation Model participation Model ia_ssa(cost $400)PDF p.43 Run black formatting on docs #2, Mr. B: Social Security $1,400; child $125 1,400 − 994 − 372 = 34 (pays 366) 406 0 PDF p.44 Implement SNAP rules at the national level #3, Ms. C: $1,300; child $210 19 306 (by the same code path) 94 instead of 381 PDF p.42: spouse earns $4,500; two children (4,500 − 65) / 2 − 1,491 − 994 → 0 726.50 0 instead of 400 -
Why should, not critical. The PR documents the input workaround, as Ohio (Add Ohio state supplementation for 2026 #10164 Should 1) did for its Medicaid group. But the default household result is wrong in the claimed year for any IHHRC adult who lives with a child. The model already has what it needs:
ssi_ineligible_child_allocation(497 less the child's income) is read three files over for the sibling allowance in child deeming. -
Fix.
- Add the summed allocation of the co-resident ineligible children to the maintenance deduction in
ia_ssa_ihhrc_participation, at the same household level as the couple allowance. - Narrow the input's documentation to unmet medical needs, and to dependents who aren't children (if any).
- Add Mr. B (34 / 366) and the p.42 household (0 / 400) as cases.
- The residential care spouse and dependent diversions in 52.1(3)"a"(3)–(4) can stay input-only. They depend on a spouse at home after the residents are split into separate marital units.
- Add the summed allocation of the co-resident ineligible children to the maintenance deduction in
2. Case 45 pins full participation for a resident who enters on January 7, contrary to 52.1(3)"a"(6).
- Where.
ia_ssa.yaml:988-1030: "Entry on January 7: the day of entry through January 31", 25 days, expectingia_ssa97.75 (961.75 − 864).ia_ssa.py:28-34charges the full monthly participation in a partial month.
- The law.
- 441 IAC 52.1(3)"a"(6): "The income of recipients of state supplementary assistance or Medicaid needed to pay the cost of care in another residential care facility, a family-life home, an in-home health-related care provider, a home- and community-based waiver setting, or a medical institution is not available to apply to the cost of care. The income of a resident who lived at home in the month of entry will not be applied to the cost of care except to the extent the income exceeds the SSI benefit for one person or for a married couple if the resident also had a spouse living in the home in the month of entry."
- 6-B PDF p.63: "When a client lived at home for part of the month before entry to a facility, deduct the SSI benefit rate for one person from the client's countable income for that month."
- What the rule gives. For Case 45's SSI-only resident coming from home, participation is max(994 − 130 − 994, 0) = 0, so the payment is 38.47 × 25 = 961.75, not 97.75. A transfer from another facility also reduces participation, under the rule's first sentence.
- The documentation. The input calls this deduction "approved first-month expenses of the previous living arrangement". The rule's version is a fixed amount (the SSI rate). The manual's p.64 text ("may keep enough ... but do not disregard an amount that is over the SSI standard") is closer to expenses, so cite both.
- Fix (either):
- (a) Relabel Case 45 as a discharge or death month ("discharged January 26"). 97.75 is right then, because 52.1(3)"b" pays "for the date of entry ... but not the date of death or discharge" and participation is unchanged. Add an entry-from-home case with 994 entered as the deduction, expecting 961.75. Rewrite the input documentation around the rule.
- (b) Add an entry-month flag like
ia_ssa_ihhrc_initial_partial_monththat deducts the SSI individual rate, or the couple rate when a spouse lived at home.
3. Two undocumented conflicts with 441 IAC 52.1 that affect results.
- (a) Residential care is paid at the maximum daily rate since July 2017, but the model pays $0 without a facility rate.
- Where.
ia_ssa.py:32caps theia_ssa_rcf_daily_rateinput at $38.47. Its documentation says "Leave at 0 when no rate is approved". Case 20 ("RCF requires a facility rate") pins 0. - The rule:
- 441 IAC 52.1(3): "For periods of eligibility before July 1, 2017, the department will reimburse ... on a flat per diem rate or on a cost-related reimbursement system with a maximum per diem rate ... For periods of eligibility beginning July 1, 2017, and thereafter, payment to a recipient in a licensed residential care facility will be based on the maximum per diem rate."
- 441 IAC 51.4(3) agrees: "income eligible when the income ... is less than 31 times the maximum per diem rate."
- The manual. 6-B PDF p.72 still describes "two options": a facility-specific cost-related rate up to $38.47, or "A flat per diem rate ... $17.86 beginning February 1, 2004". The 2004 date suggests that text predates the 2017 rule.
- Recommendation. Follow the rule. Use $38.47 as the rate for a certified resident, keeping the input only as an override if the author confirms Iowa still pays facility-specific rates. Case 20 then expects 328.57 (Case 14's value). Record the conflict in a NOTE and in Update New York tax rules for 2022 #1837's conflicts comment. Pavel's April Suggestions 5 and 10 raised the same point.
- Where.
- (b) The $22 blind standard is for a recipient "not receiving another type of state supplementary assistance", yet the model pays it alongside residential care and IHHRC.
- Where.
ia_ssa_federal.py:78-79and Cases 16 and 27 pay $22 on top of residential care and IHHRC. The PR body bases this on "Iowa is a concurrent-category state, POMS F.1 NOTE". - The rule. 441 IAC 52.1(4): "The standard for a blind recipient not receiving another type of state supplementary assistance is $22 per month."
- The manual and POMS support the model:
- 6-B PDF p.20: "the blind supplement is not countable income to determine client participation or eligibility for the RCF supplement";
- 6-B PDF p.42: "Do not count the $22 special blind allowance when determining client participation";
- POMS F.1 code A covers a blind recipient "who does not live in any other State living arrangement variation". Those variations are the SSA-paid C, D, H and I, not the state-run programs.
- The cited NOTE. It says Iowa "permits SSI recipients to receive the highest categorical supplement for which they can qualify" (SI 00501.300B.3). That is about multi-category eligibility (aged and blind), not about receiving two supplement types.
- Recommendation. Keep the model's result. Add a NOTE that quotes 52.1(4) against 6-B pp.20 and 42 and POMS code A. Correct the PR body's basis, and add the conflict to Update New York tax rules for 2022 #1837.
- Where.
- Why should. The batch rule makes an authoritative-source conflict a should-fix item with a clear recommendation. (a) changes the default payment for every certified resident who has no rate entered.
Suggestions
1. Re-add the 2025 values that earlier commits had (deferral documented in the PR body).
-
The leak. Every Iowa value is dated only
2026-01-01, so 2015–2025 get the 2026 levels. The 2023–2025household_state_benefitsblocks includeia_ssa. -
The earlier commits. At
4a12735448the PR encoded 2025 values that Pavel's May review confirmed against the January 2025 manual (general letter 6-B-46):- dependent person $503 (now $518);
- maximum residential care rate $37.60 (now $38.47);
- personal needs allowance $126 (now $130).
Values for 2017 and 2018 are also there (Iowa SSP 2017, 2018, 2019 #8974).
-
Why it's a suggestion. The PR claims only 2026 and says so. This matches Add Utah state supplementation for 2026 #10170 Suggestion 1 and Add Ohio state supplementation for 2026 #10164 Suggestion 1.
-
Fix. Restore the
2025-01-01entries with the 6-B-46 reference. The blind $22, family-life home $162 and $480.55 values were the same in 2025.
2. The IHHRC cost-ceiling conflict is narrower than described: 441 IAC 177.9(4) supports the manual.
- The current NOTE.
ihhrc_cost_limit.yamland conflict 2 on Update New York tax rules for 2022 #1837 say 441 IAC 177 "instead limits countable income to $480.55 and caps the payment". - What the rule also says. 441 IAC 177.9(4) (IAC 8/5/26) makes IHHRC terminate "Excessive costs. When the cost of care exceeds the maximum established in subrule 177.9(3)". The cross-reference should read 177.8(3). Iowa Code 249.3(2)(a)(2) ("so long as the cost of the nursing care does not exceed standards") points the same way.
- What this means. Cases 22–23 follow the rule as well as the manual.
- Fix. Cite 177.9(4) in the NOTE and in the conflicts comment.
3. Couple and certification readings that no case pins.
- (a) Dependent person set for one spouse only. If only one spouse of a joint couple has
DEPENDENT_PERSON, the helper averages the two couple rates (518 / 2 + 0) and then gives that recipient double the half. The couple gets $259 instead of $518. The category documentation says to set both, so this needs inconsistent input, as in Add Utah state supplementation for 2026 #10170 Suggestion 2(b). Either treat the couple as dependent-person when either spouse is certified, or pin the documented behavior. - (b) Spouse resources at $3,000. The fix for Pavel's C3 (a community-category recipient with an ineligible spouse, combined resources at $3,000) has no case; Pavel's May G5 asked for one. For example: an IHHRC recipient aged 65 and a spouse aged 50, with $2,500 + $400 (eligible) and $2,500 + $600 (not eligible).
- (c) The dependent's own resources. 441 IAC 51.5(2) sets "The resource limitation for a recipient and a dependent child or parent" at $2,000, which reads as including the dependent's resources. Say in the
ia_ssa_categorydocumentation thatDEPENDENT_PERSONcertification covers this test, or add an input for it.
4. Case 58 pins a federal SSI gap.
- What it pins.
ia_ssa.yaml:1240-1291expectsssi0 for a child with $1,500 of child support, because federal SSI doesn't yet apply 20 CFR 416.1124(c)(11) (Apply the SSI one-third child support exclusion for children #10242). - After Apply the SSI one-third child support exclusion for children #10242. SSI becomes 994 − (1,000 − 20) = 14, participation 1,000 + 14 − 994 = 20, and
ia_ssa380, not 394. The manual's p.49 arithmetic ignores SSI. - Fix. Add a comment linking the expectation to Apply the SSI one-third child support exclusion for children #10242, so the change is expected when it lands.
5. Wire ia_ssa into Iowa Child Care Assistance in this PR.
ia/hhs/cca/income/countable_income/unearned_sources.yamlalready countsssi, and the PR body cites 441 IAC 170.2(1)"c"(1).- Iowa CCA: count the State Supplementary Assistance payment (ia_ssa) as income #10304 defers this until after merge only because the variable doesn't exist on
mainyet. Adding one line here avoids a follow-up PR. - If the IHHRC reimbursement should be excluded there too, use the SNAP-style variant.
6. Polish.
- References and labels:
smme_minimum_fpg_rate.yamlcites only 6-B p.77. Add 441 IAC 51.7(6), the binding text.- The new
child_support_share.yamlcites Cornell, not eCFR (Pavel's May G7). - The labels still abbreviate "Iowa SSA" (easily read as the Social Security Administration) and "SMME".
- Code comments and inputs:
- The comment at
ia_ssa.py:30-31says residential care eligibility "uses a 31-day ceiling", but no code applies one. Payment is 0 anyway when participation exceeds the month's cost (52.1(3)"d"), so reword the comment. - Four plain inputs rely on implicit defaults.
ia_ssa_care_additional_deductionsis subtracted after the one-half earnings exclusion. A user entering impairment-related work expenses (52.1(3)"a"(1)) should enter half the amount. Say so, or handle them before the exclusion.
- The comment at
- Registry and tests:
programs.yamlnotes: say that microsimulation pays only the blind supplement (see Verified), as Add Montana state supplementation for 2026 #8233 Suggestion 4 asked for Montana.- Case 54's comment says income "must be below" the standard. 6-B PDF p.34 says it "must not be more than $1,156". At equality the payment is 0 either way.
- Update New York tax rules for 2022 #1837. Update it for whichever items land: the SMME couple rule and cases, the dependent allowance, the entry-month rule, the two 52.1 conflicts, and 177.9(4).
Verified correct
-
Batch cross-cutting checks:
# Check Verdict 1 Axiom line Valid: TheAxiomFoundation/rulespec-us#1837 queued; see the Axiom line assessment2 House-template descriptions All eight Iowa files follow it ("Iowa provides this amount as … under the State Supplementary Assistance program"; "Iowa limits … to this amount …"; "Iowa sets this share …"), and so does the federal child_support_share.yaml3 Backdating 2026-only values leak back to 2015. The 2025 levels differ for three parameters; documented deferral (Suggestion 1) 4 tx_rebate.pycopyOmits ia_ssa. The PR body defers this to Keep one spm_unit_benefits list so reforms that add a benefit stop dropping baseline programs #10226 (open), as the siblings did; accepted5 Aggregate wiring Complete, with no double count. Child Care Assistance is deferred to Iowa CCA: count the State Supplementary Assistance payment (ia_ssa) as income #10304 (Suggestion 5) 6 Income attribution Pinned: blind couples, the dependent-person couple and mixed couple, the family-life home couple, IHHRC with an ineligible spouse and one earnings exclusion, and child deeming (integration Cases 1–7, 10; four deeming cases). The SMME couple is wrong (Critical 1); three readings are unpinned (Suggestion 3) 7 Sibling conflicts Now real: see Branch status 8 CI All green on the head 9 State law Verified (below), apart from the findings above -
Amounts, with sources (6-B pages as PDF pages; the manual mixes "Revised March 7, 2025" and "Revised May 22, 2026" pages):
Parameter Value Source blind_amount22 52.1(4) (p.2); 6-B p.20 "$1,016 for an individual ($994 + $22)"; POMS F.2.a code A "Blind 994.00 22.00" dependent_amount518 6-B p.24 "more than $518", p.25 "less than $518"; p.26 table: $1,512 / $2,009 / $1,534 / $2,031 / $2,053; POMS code C "Aged 994.00 518.00" family_life_supplement162 6-B p.35 "$162 ($1,156 - $994 SSI standard) ... a maximum payment of only $142"; POMS code D: 142, blind 164, couple 801, Aged/Blind 823, Blind/Blind 845 rcf_daily_limit38.47 6-B p.72 "The maximum cost-related per diem rate is $38.47, beginning January 1, 2026" rcf_personal_needs130 6-B p.62 "a personal needs allowance of $130 per month"; 52.1(3)"a"(2) ihhrc_cost_limit480.55 6-B p.41; 177.2(1)"f" (p.1); 177.8(3) (p.4) smme_amount1 52.1(7) (p.2); 6-B p.78 "$1.00 per month" smme_minimum_fpg_rate1.2 51.7(6); 6-B p.77 "exceeds 120%" child_support_share1/3 20 CFR 416.1124(c)(11); 177.2(1)"g"(2)3; 6-B p.49 Every
#page=anchor shows its value, and each reference is one entry per document. -
Administration.
- 6-B p.6: "The Department administers SSA for: In-home health-related care, Residential care facilities, and Medicare and Medicaid eligibles. The Department and the Social Security Administration jointly administer SSA for: Dependent persons and Family-life homes. The Social Security Administration administers: Mandatory SSA and The blind allowance."
- POMS SI 01415.058 A lists Iowa. F's NOTE names the three state-run programs.
- So routing only the blind, dependent-person and family-life home rows through the SSA helper (rounding, $1 minimum after the couple split) is right, and so is paying the state rows unrounded.
-
The five documented conflicts:
- Blind dependent-person couple: $2,031, not $2,053. POMS F.2.b code C prints Aged/Blind 562. That contradicts F.1's "increases by $22 for each blind recipient" and every other row (code H Aged/Blind 540, code D 823). The manual is right.
- IHHRC ceiling. See Suggestion 2: the rule also supports the manual.
- $65 for parental earnings only. The rule's "an additional basic SSI standard" has no $65, but the manual's D and E examples subtract it. The manual is the reasonable reading.
- SMME "at least" vs "exceed". The statute is discretionary ("At the discretion of the department"), and the rule and manual say "exceed".
- A dependent's income of exactly $518. 51.5(1) and p.25 say "less than".
-
The family-life home top-up. 6-B p.35: "For a recipient who has only SSI and no other income ... an additional $20 payment is necessary". This matches
ia_ssa.py:41-57and Cases 9 and 11–12. The couple shares one $20, matching POMS's couple $801 = 2 × 1,156 − 1,491 − 20. -
IHHRC rules:
- participation counts SSI (p.43 Ms. A: $543 + $471 − $994 = $20) and excludes the $20 and the $22 blind allowance (p.42);
- $65 + ½ applies "per household";
- the couple allowance applies "even if only one spouse receives" care (p.43);
- a first partial month has no participation (177.8(2)"b");
- children follow the Iowa deeming method: p.46 "do not rely on SSI deeming calculations for children"; the p.48 examples give 56, 159 and 259, and p.49 gives 0.
-
Take-up.
- 6-B p.10: "SSA applicants and recipients must also apply for SSI or FIP if they might be eligible".
- The SSA-paid rows also require an SSI application "even if the applicant's income is above SSI standards" (pp.22 and 32). The helper's
takes_up_ssi_if_eligibleterm does that. - The state rows require take-up only of people whose income would qualify (Cases 48–50).
-
SNAP and HUD.
- 7-E PDF p.34: "Count payments from State Supplementary Assistance as unearned income. Exclude State Supplementary Assistance payments made for in-home health-related care as a reimbursement."
- 24 CFR 5.609(b)(6) ("specifically for, or in reimbursement of, the cost of health and medical care expenses") and (b)(19) both read as quoted (eCFR, current).
- Integration Case 9 counts only the $264 blind amount.
-
The New Hampshire bug pattern can't occur.
- The PR has no breakdown parameters.
ia_ssa_categoryhas nodefined_for, defaults toREGULAR, and is compared with==.- The state-gated int
ia_ssa_care_partial_month_daysis used only inwhere(partial > 0, ...). - Case 29 covers a Nebraska resident. CI's Microsimulation and both Rest (Python) jobs pass.
- The PR body's four-state probe (IA, MA, NC, VA) agrees.
-
Other batch lessons.
- Oklahoma Add Oklahoma state supplementation for 2026 #10165 doesn't apply. Iowa uses SSI income policy (6-B p.5: "determined using policies of the federal ... SSI program"), so federal gross-wage treatment is the state rule.
- Integrate modeled state unemployment insurance into income flows #9558 is satisfied:
has_other_incomeiterates the federal source list, which usestotal_unemployment_compensation. - Document disjoint health premium inputs and correct consumer treatment #10046: the PR touches no premium list.
-
Microsimulation (the Utah check). The Utah over-count can't occur; the bias runs downward and is documented.
- No inputs in the data. No dataset sets
ia_ssa_category, care costs or SMME coverage, so only the blind supplement is paid. - The over-income path. It is narrow (within $22 of the FBR) and needs
takes_up_ssi_if_eligiblethrough the helper. - The size of the gap. SSA's Annual Statistical Supplement, 2026, Table 7.B reports 734 Iowa recipients of federally administered supplementation in December 2025, averaging $248.07, and about $2.1 million paid in 2025. SSA blocks automated fetches, so I confirmed this through SSA-domain search results. Most of that is dependent-person and family-life home, plus the unpublished state-run programs, so the understatement is of that order.
- Precedent. This matches Montana Add Montana state supplementation for 2026 #8233 and Ohio Add Ohio state supplementation for 2026 #10164 (Suggestion 6 covers the
programs.yamlnote).
- No inputs in the data. No dataset sets
-
Code.
- There are no hard-coded policy values. The $20, $65 and ½, FBRs and resource limits come from federal parameters, with comments citing Iowa's adoption.
- YEAR inputs are read through
period.this_year. - The one-month inputs have zero formulas (Cases 46–47 show they don't carry forward).
- The deeming helpers reuse main's
_ssi_parental_resource_pool. - Variable references use comment page lists, with no titles.
-
Hand checks (2026 FBR $994 / $1,491; 2027 $1,029 / $1,544):
ia_ssa.yaml:- Case 3: 12,240 / 12 = 1,020; − 20 = 1,000; 22 − 6 = 16.
- Case 11: Social Security 100; SSI countable 80 < 994, so 142, and there is other income, so no top-up.
- Case 13: 1,100 < 1,156; 142 − (1,080 − 994) = 56 (= 1,156 − 1,100).
- Case 14: 38.47 × 31 = 1,192.57; 994 − 130 = 864; 328.57.
- Case 15: × 28 = 1,077.16 − 864 = 213.16.
- Case 17: 543 + 471 = 1,014 − 130 = 884; 308.57.
- Case 25: 1,400 − 994 − 100 = 306; 400 − 306 = 94.
- Case 26: 400 × 16 / 31 = 206.45.
- Case 48: 1,080 − 994 gives
uncapped_ssi−86; 1,100 − 130 = 970; 222.57. - Case 49: 1,100 − 994 = 106; 294.
- Case 52: 1,029 − 130 = 899; 293.57.
- Cases 56–57: 1.2 × 15,960 / 12 = 1,596.
- Couples (
integration.yaml):- Case 1: couple rates 44 / 0 average to 11 each; × 2 / 1 recipient = [22, 0].
- Case 3: 1,491 < 2,009; 518 / 2 = 259 each.
- Case 4: (562 + 518) / 4 = 270 each.
- Case 5: 2 × 1,156 − 1,491 − 20 = 801; 400.50 + 10 = 410.50.
- Case 6: 1,700 − 1,491 = 209; 191.
- Case 7: (3,000 − 65) / 2 = 1,467.50; SSI 1,491 − 1,457.50 = 33.50; 1,501 − 1,491 = 10; 790 / 2 = 395.
- Case 9: (400 + 22) × 12 = 5,064; SNAP and HUD 11,928 + 264 = 12,192.
- Case 10: 2 × 1,191 − 1,544 − 20 = 818, so 409 + 10 = 419.
- Deeming:
- Income Case 2: 4,200 − 65 − 2,982 − 994 = 159; SSI 944.50; participation 109.50; 290.50.
- Income Case 3: 4,000 − 65 − 2,982 − 694 = 259.
- Resources Case 6: 5,600 − 3,000 = 2,600 > 2,000.
- Resources Case 7: 900 + 200 = 1,100.
-
Changelog:
changelog.d/ia-ssp.added.mdis top-level, typedadded, and accurate. -
PR body:
- The case count is right: 85 = 58 + 10 + 7 + 6 + 4, matching CI.
- The shared files it lists match the diff.
- Two claims need correcting: the concurrent-category basis (Should 3(b)), and the description of the 177 conflict (Suggestion 2).
-
Partner tests: the PR touches none, and Household API Partners passes.
Axiom line assessment
Valid: axiom: Iowa Code 249.3; 441 IAC 51.5(1), 51.7(6), 52.1(1)-(4), 52.1(7), 177.2(1)"f"-"g", 177.8(2); Iowa HHS Employees' Manual 6-B, 7-E; POMS SI 01415.058 F TheAxiomFoundation/rulespec-us#1837 queued.
- Issue state.
- The PR author filed Update New York tax rules for 2022 #1837 on 2026-10-20. It is open, labelled
pe-parity, and the only rulespec-us issue that a search for "Iowa supplementary" finds. - rulespec-us
main(5796861e58) has no module.us-ia/holds onlypolicies/cms,policies/income_tax,regulations/iac/441/41andstatutes/422. Soqueuedis the right form.
- The PR author filed Update New York tax rules for 2022 #1837 on 2026-10-20. It is open, labelled
- Dispatch-ready on the Add AMT parameters for 2020-2023 #1467 model:
- Module paths: 249.3, 52.1, 51.5 / 51.7, 177.2 / 177.8, the 6-B manual, and POMS F modules that import the DC/DE common module.
- Corpus citations. I confirmed these on axiom-corpus
main(393127f8b2):us-ssa-poms-si-2026-09-10.yamlholdsssa-poms-si-01415-058(us/manual/ssa/poms/si/01415.058, expression date 2026-08-28);us-dc-ossp-ssa-poms.yamlholdsus/guidance/ssa/poms/si-01415-058/2026;us-ia-snap-manual.yamlholdsus-ia/manual/hhs/em/7-e.
- The recorded blocker. The Iowa Code, IAC chapters and 6-B are "Needs ingest"; no Iowa manifest covers them.
- Verbatim law. I checked the quotes from 249.3, 52.1, 177.8(2), 6-B and the POMS F.2 rows against the live sources.
- Companion tests A–Q come from the sources and map to PolicyEngine cases.
- The conflicts comment covers the five readings, with pinned cases.
- Matches the head: the variable and parameter names, the 85 cases, and the readings.
- If the findings land: add the SMME couple case, the dependent allowance, the entry-month rule, the two 52.1 conflicts and 177.9(4) to Update New York tax rules for 2022 #1837.
CI status
All 27 checks pass (gh pr checks 8017, rechecked at the end of the review). The three "skipping" entries belong to the superseded run 39398177587.
- The run. Run 39398361007 (
pull_request) on head3b9e925f43, created 2026-10-20 09:07 UTC and completed 12:27 UTC. - Quick Feedback ran all five Iowa files:
ia_ssa.yaml58,ia_ssa_income_deemed_from_parents.yaml4,ia_ssa_nonfinancial_eligible.yaml6,ia_ssa_resources_deemed_from_parents.yaml7 andintegration.yaml10, all passed. - The rest. All 11 Baseline shards pass, as do the nine Contrib shards, Microsimulation, both Rest (Python) jobs, Package and compatibility, PR validation and Household API Partners.
- Local runs. Because CI is green, I ran only one small probe at the head (policyengine-core 3.32.29). It covered the SMME couple, the IHHRC dependent examples and the residential care default above.
Branch status
- Position: 4 commits behind
main(bda23eac4c) and 32 ahead. - Merge.
git merge-tree --write-tree PolicyEngine/main 3b9e925f43now conflicts in:policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml;policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py.
- Cause (branch note). The cause is the sibling Montana SSP (Add Montana state supplementation for 2026 #8233), merged into
mainasbda23eac4ctoday. Against the commit before it (79a393dedd), the merge is clean (tree8a3be0b80a). - Fix. Merge
mainand keep both themt_sspandia_ssaentries. The other open batch PRs will need the same rebase.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes for 1 critical and 3 should items; details in the report above. The amounts, the administration split and the five documented source conflicts check out against Manual 6-B, 441 IAC 51/52/177, Iowa Code 249.3 and POMS SI 01415.058 F. 30 expectations were hand-checked, rulespec-us#1837 is valid, and CI is green. Most of Pavel's earlier items are fixed (status table in the report). Critical 1: SMME couples compare half the couple's income (ssi_countable_income/2) with the 2-person 120% FPL limit. Example: each spouse with $1,700 of Social Security gets [0, 0] married, but $1 when single. That contradicts 441 IAC 51.7(6) under any reading. (1) The IHHRC dependent allowance (177.2(1)"f"(3), $497 less the child's income) isn't computed, so the Manual 6-B examples pay $0 by default. (2) Case 45 pins full participation for a January 7 RCF entry, but 52.1(3)"a"(6) shields income up to the SSI rate in the entry month. (3) Two undocumented 52.1 conflicts: RCF pays $0 without a facility rate where 52.1(3)/51.4(3) give the $38.47 maximum, and the $22 blind standard is limited under 52.1(4). Branch note: this now conflicts with main in HUD unearned.yaml and spm_unit_benefits.py since Montana #8233 merged.
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
IDs: C = critical, SA = should address, G = suggestion. C1-C3, SA1-SA13 and G1-G13 keep their May 14 IDs; new findings start at C4, SA14 and G14. Items that DTrim99 also raised (review at the same head) say "(also raised by DTrim99)".
Source Documents
- Reviewed head SHA: 3b9e925
- Mode: incremental from 4a12735. The PR was largely rewritten after that review (69 PR-scope files changed; 13 variables and 12 parameters deleted), so the whole Iowa implementation was re-audited.
- Scope: 20 Iowa variables, 8 Iowa parameters, federal
child_support_share.yaml, 5 test files (85 cases), changelog, 5 shared list/registry files. Iowa values are dated 2026-01-01 only. - Sources (6-B "p.NN" = PDF page = printed page + 4):
- Iowa HHS Employees' Manual 6-B (pages revised 3/7/2025 and 5/22/2026): https://hhs.iowa.gov/media/3987/download?inline=
- 441 IAC ch. 52 (IAC 5/28/25): https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf
- 441 IAC ch. 51 (IAC 6/10/26): https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf
- 441 IAC ch. 177, IAC 8/5/26 (effective 10/1/26): https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf ; IAC 2/5/25 (in force Jan-Sep 2026): https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf
- Iowa Code ch. 249: https://www.legis.iowa.gov/docs/code/249.pdf
- POMS SI 01415.058 F (TN 95): https://secure.ssa.gov/poms.nsf/lnx/0501415058#f
- 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
- Manual 8-E: https://hhs.iowa.gov/media/4011/download?inline ; 7-E: https://hhs.iowa.gov/media/3997#page=34 ; eCFR 20 CFR 416.1124: https://www.ecfr.gov/current/title-20/section-416.1124
Branch Status
- 32 ahead, 11 behind
main(645fcd3); merge-base f198773; GitHubCONFLICTING/DIRTY. - Conflicts:
policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml:27andpolicyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py:29. Main filled the same slot withmt_ssp(#8233),ok_ssp(#10165),ny_ssp(#10158),ri_ssp(#10168),sd_ssp(#10169) andva_ag(#10172), merged 2026-10-20. - Resolution: merge
main, keep all six main entries and add the one Iowa line in each file (order has no effect).household_state_benefits.yaml, SNAPunearned.yamlandprograms.yamlauto-merge correctly. This is C5.
Prior findings
May 14 (29 IDs): 20 resolved, 1 accepted decline, 1 out of scope, 1 n/a, 6 open or partial.
| ID | Status | Evidence at the head |
|---|---|---|
| C1 IHHRC participation left out SSI | RESOLVED | ia_ssa_care_countable_income.py:53-67 adds ssi; Case 24 = 20 / 380 |
| C2 Tests locked the bug | RESOLVED | Case 24 mirrors 6-B Ms. A |
| C3 POMS reference | RESOLVED | ia_ssa_federal.py:18 cites SI 01415.058 F |
| SA1 Stale 51.6 cites | RESOLVED | Comments cite 51.5(1), 51.7(2), 51.7(6) |
| SA2 Duplicated logic | RESOLVED | Shared ia_ssa_ihhrc_participation / _amount |
| SA3 FLH $142 history | RESOLVED (moot) | $142 = 162 - 20 (ia_ssa_federal.py:72) |
| SA4 State resource parameters | ACCEPTED DECLINE | Comment ia_ssa_eligible.py:35-38; 6-B p.12 cites 416.1202 |
| SA5 12 boundary tests | PARTIAL | #2, #8, #9, #11, #12 done; #3, #6 moot; #4, #10 now in C4; #1, #5, #7 open |
SA6 default_value |
PARTIAL | 4 inputs still implicit |
| SA7 Template | RESOLVED | All 8 YAMLs |
| SA8 $2,031 anchor | RESOLVED | 6-B p.26 prints $2,031; NOTE ia_ssa_federal.py:81-86 |
| SA9 Comment density | RESOLVED | ia_ssa.py 91 lines |
| SA10 Booleans | RESOLVED | Rewritten (G32) |
| SA11 FLH income basis | RESOLVED | ia_ssa_federal.py:61-66; new split is SA21 |
| SA12 Ch. 50 anchor | RESOLVED (moot) | Removed |
| SA13 Anchors | PARTIAL | Code 249 still #page=1 |
| G1-G4 | RESOLVED | 85 cases, sequential, Case N,; SMME coverage input |
| G5 $3,000 couple tests | OPEN, raised to SA | Removing the pooling still passes 85 |
| G6 DP couple boundary | OPEN | No group_income == need case |
| G7 Cornell vs eCFR | OUT OF SCOPE | Now main's child_support_share.yaml (#10165); #10242 |
| G8 177 maximum benefit | RESOLVED | ihhrc_cost_limit.yaml:21 cites 177.8(3) |
| G9 51.7(6) / 249.3(4)(g) on the 120% file | OPEN | Cites only 6-B p.77 |
| G10-G12 | RESOLVED | Input docs; Iowa child deeming; tuples |
| G13 | n/a |
April 23 items still open: C5 deductions (PARTIAL) -> SA14, SA17; S5 -> SA6; S6 -> G22; S15 -> G6; S16 -> SA5 #1; Sugg 5 and 10 -> SA15; Sugg 9 -> G21; Sugg 12 -> G36. S4 (microsimulation inputs) stays declined and documented.
Critical (Must Fix)
C4. SMME couples: half the couple's income is tested against the 2-person guideline (also raised by DTrim99)
- Where:
ia_ssa.py:60-65sizes the guideline bymarital_unit.nb_persons();:73-78compares it withia_ssa_smme_countable_income=ssi_countable_income + ssi(ia_ssa_smme_countable_income.py:15), which is half the couple's income for a joint claim. - Example (2026-01, both 66, SMME, coverage set, Social Security $1,700/month each): model 1,690 each vs 1.2 x 2-person FPG = 2,164, so
ia_ssa= [0, 0]. Unmarried, the same people get [1, 1]. The rule gives [1, 1] under either reading (own 1,680 > 1,596; combined 3,380 > 2,164). Coverage on one spouse gives [0, 0], not [1, 0]. - Rule: 51.7(6) "Income of a recipient ... must exceed 120 percent of the federal poverty level" (IAC 51 p.2); "SSI income criteria", no family size (6-B p.77). The
ia_ssa.py:58-59comment says 6-B gives the unit size; it does not. - Test gap: Cases 32-35, 56, 57 input the SMME income; only Case 50 (single) runs the formula.
- Fix: choose and document a reading. Couple reading (as
ia_ssa_federal.py:38-41andmsp_countable_income/msp_fpg):smme_income = where(joint, person.marital_unit.sum(smme_income), smme_income)withjoint = ssi_couple_computation_applies. Document the ineligible-spouse case. Add: couple at $1,700 each -> [1, 1]; combined 2,164.00 -> [0, 0], 2,164.02 -> [1, 1] (SS 13,104 / 13,104.12 a year each); one spouse covered -> [1, 0]; single through the formula (SS 19,392 -> 0; 19,392.12 -> 1).
C5. Merge conflict; CI never tested the merged tree (also raised by DTrim99)
- See Branch Status. The 27-pass run (39398361007) finished 12:27 UTC; the first conflicting main commit merged 15:00 UTC, and GitHub builds no merge ref while DIRTY.
- Fix: merge
main, keep both sets of entries,make format, push, and let CI run (integration Cases 8-9 read both lists).
C6. Residential care couples stay combined and halved after the month of entry
- Where:
ia_ssa_care_countable_income.py:25, 27, 54-56, 68setscombine = ssi_couple_computation_appliesfor non-IHHRC care and halves the couple's income and SSI in every month. Theia_ssa_category.py:29docstring gives no Iowa input; the only route is overriding federalssi_claim_is_joint(YEAR), which also changes federal SSI. - Examples ($38.47/day, aged spouses):
- 6-B Mr. K, April (resident SS $175, spouse at home $100): manual 175 + 839 - 130 = 884, pays 30 x 38.47 - 884 = 270.10; model 528.60.
- Both residents, SS $1,500 / $500, month after entry: manual 0 + 308.57; model 322.57 + 322.57 = 645.14.
- Example 4 (no SSI before entry; Mr. B $890, Mrs. B $870): manual uses 890 from entry; model 880, and $404.10 vs $270.10 in June.
- Rule: "treat the spouses as a couple during the month of entry, then as individuals beginning the month after", and separately from entry when neither received SSI (6-B p.60); p.61, p.68, p.70.
- Fix: for RESIDENTIAL_CARE, budget each spouse on own SSI-method income plus an individual SSI amount after the entry month (and from entry when neither had SSI); keep the couple budget only for the entry month (input from SA16). Document the SSA-side assumption (p.61: the lower-income spouse "must apply for and accept SSI"). Add Mr. K April (270.10), the $1,500 / $500 couple (0 / 308.57) and one spouse in RCF (SA5 #7).
Should Address
SA14. IHHRC dependent allowance not computed (also raised by DTrim99)
ia_ssa_ihhrc_participation.py:25-31deducts only $994 / $1,491 plus the input.- 6-B (cost $400 where silent): Mr. B (SS 1,400, child 125): manual 1,400 - 994 - 372 = 34, pays 366; model 406, pays 0. Ms. C (1,300; child 210): 19 / 381 vs 306 / 94. p.42 household (spouse earns 4,500, two children): 0 / 400 vs 726.50 / 0.
- Rule: 177.2(1)"f"(3) "the SSI standard for a dependent ... for each dependent living in the home" (IAC 177 p.1); "$497 Maximum additional allowance for each dependent" (6-B p.43).
- Fix: add the sum of
ssi_ineligible_child_allocationover co-resident children (372 / 287 / 497 + 497 here; already used atia_ssa_income_deemed_from_parents.py:58-62). Narrow the input documentation to medical needs; add the three examples; NOTE the p.42 bullet that names only the couple allowance.
SA15. Residential care with no rate entered pays $0 (also raised by DTrim99)
ia_ssa_rcf_daily_rate.py:11(implicit 0, "Leave at 0 when no rate is approved");ia_ssa.py:32-34; Case 20 (ia_ssa.yaml:247) pins 0.- Direction and magnitude: $0 vs 31 x 38.47 - 864 = 328.57 at the maximum rate (up to $1,192.57/month). No microsimulation effect.
- Sources conflict: 52.1(3) "beginning July 1, 2017 ... payment ... will be based on the maximum per diem rate" (IAC 52 p.1); Code 249.12(3) (p.5); 6-B still lists facility rates and the 2004 $17.86 flat rate (6-B p.72).
- Fix: choose the no-rate reading, record the conflict in a NOTE and on rulespec-us#1837, rewrite the input documentation, re-pin Case 20.
SA16. RCF month of entry: Case 45 pins full participation (also raised by DTrim99)
- Case 45 (
ia_ssa.yaml:988, "Entry on January 7", 25 days) expects 97.75. For a resident from home, participation is max(994 - 130 - 994, 0) = 0, so the payment is 961.75. SS $1,200 entrant: model 0 vs 885.75. - Rule: 52.1(3)"a"(6) income "will not be applied ... except to the extent the income exceeds the SSI benefit for one person or for a married couple" (IAC 52 p.2); 6-B p.63.
- Fix: relabel Case 45 as a discharge month (52.1(3)"b") and add an entry-from-home case (961.75), or add an entry-month input that deducts the SSI individual rate (couple rate with a spouse at home). Rewrite the deductions-input documentation around the rule.
SA17. RCF impairment-related work expenses applied after the one-half exclusion
ia_ssa_care_countable_income.py:28-32, 57-65has no IRWE step; the deductions input is subtracted after $65 + 1/2 (ia_ssa.py:33).- 6-B Mr. L (income 700, earnings 333, IRWE 100): manual 654; model 704 without the entry, 604 with it (error IRWE / 2). An SSI recipient who enters IRWE is overpaid by the full IRWE.
- Rule: 52.1(3)"a"(1) IRWE "plus $65 plus one-half" (IAC 52 p.1); Mr. L (6-B p.65).
- Fix: an IRWE input subtracted from earnings before
_apply_ssi_exclusions, or document the IRWE / 2 entry for non-SSI residents. Add Mr. L.
SA18. RCF personal needs allowance frozen, but Iowa Code sets its uprating
rcf_personal_needs.yaml:9-11says 52.1 "publishes no method"; Case 52 (ia_ssa.yaml:1153, 2027-01) keeps 130 and pays 293.57.- Rule: Code 249.9A(1) increases the PNA "by the same percentage and at the same time as" the SSI COLA (Code 249 p.4); practice 126 x 1.028 -> 130.
- 2027 (3.6%): PNA about 134.68-135; Case 52 about 298.25-298.57.
- Fix: uprate by the SSI COLA (state the rounding as inferred), cite 249.9A, re-pin Case 52. In
rcf_daily_limit.yaml:9-11cite Code 249.12(3) (appropriations) and call the 2027 $38.47 a frozen projection.
SA19. 2026 levels back-fill 2015-2025 while ia_ssa is in the 2023-2025 aggregates (also raised by DTrim99)
- Iowa parameters start 2026-01-01; the PR adds
ia_ssatohousehold_state_benefits.yaml:90, 198, 311(resolved back to 2015) and to the SNAP and HUD lists. - GL 6-B-46 2025 levels: dependent $503, per diem $37.60, PNA $126 (p.28, p.64, p.74). Model 2025-01: DP 518 vs 503; RCF 355.57 vs 324.60.
- Fix: add
2025-01-01entries citing GL 6-B-46 and a 2025 case; for 2024 and earlier add letters (not acquired) or dropia_ssafrom the 2023-2024 blocks.
SA20. family_life_supplement.yaml:15 opens a page without the value
#page=30shows only $1,156 / $1,026 / $130; "$162 ($1,156 - $994 SSI standard)" and $142 are on 6-B p.35. Fix:#page=35.
SA13 (carried, PARTIAL). Code 249 anchors open the heading only
ia_ssa.py:12,ia_ssa_eligible.py:12,ia_ssa_nonfinancial_eligible.py:12use#page=1; 249.3(1)-(4) incl. (4)(a)(2), (4)(g) start on Code 249 p.2. Fix:#page=2.
SA21. Care income drops all interest and dividends with no source
ia_ssa_care_countable_income.py:36-44; federalssi, the SSA-paid rows and SMME still count them (#10079 open).- RCF SSI recipient, $50/month interest: model
ssi964, care income 964,ia_ssa358.57; under (c)(22) 994 / 994 / 328.57 (same total; $30 moves to Iowa). FLH SSI-only resident with $5/month interest: the gate excludes it but the top-up test (ia_ssa.py:43-49) counts it, so it pays 142 instead of 162. - Rule: 20 CFR 416.1124(c)(22) "Interest and dividend income from a countable resource" (eCFR); 8-E with listed exceptions (8-E p.23).
- Fix: NOTE citing (c)(22), 8-E and #10079 (remove the subtraction when #10079 lands, or it double-excludes); move the sources to a referenced parameter; use the same basis for
has_other_income; add a case.
SA22. Spouse and child tests count marital-unit members
ia_ssa_eligible.py:32,ia_ssa_care_countable_income.py:27,ia_ssa_ihhrc_participation.py:28-30,ia_ssa.py:60,ia_ssa_resources_deemed_from_parents.py:50. Withoutmarital_units, everyone shares one unit.- Aged IHHRC parent (SS $9,600/yr, cost $400) with an adult child earning $60,000 (tax dependent), no marital units: couple allowance plus pooled earnings, participation 1,990.50, pays 0; explicit units pay 380, and federal SSI does not pair them (SSI 214). A disabled IHHRC child with two parents ($6,000) and no units is paid 400 instead of 0.
- Rule: the IHHRC budget counts the "individual and spouse living in the home" (IAC 177 p.1); resources pool only "with a spouse" (6-B p.12).
- Fix:
_ssi_spouse_index(person, period) >= 0orssi_couple_computation_appliesfor "has a spouse", the federal child test (SA24), and one case withoutmarital_units.
SA23. SSA rounding and $1 minimum untested
ia_ssa_federal.py:105-112: replaced byreturn payment, all 85 cases pass. Blind, SS $12,426/yr: raw 0.50, head pays $1; SS $12,365.34/yr: 5.555 -> 5.56.- Fix: add both cases (SI 02001.005).
SA24. Iowa parental resource deeming overrides SSA's finding for SSI children
ia_ssa_resources_deemed_from_parents.py:48-52omits the exclusions inis_ssi_resource_deeming_child;ia_ssa_eligible.py:34adds the result for every category.- Blind child 10, two parents with $6,000, deeming waiver: SSA deems 0 and pays SSI 994; Iowa deems 3,000, so the $22 becomes 0.
- Rule: "For an SSI recipient, accept the Social Security Administration's determination" (6-B p.9).
- Fix: build on
is_ssi_resource_deeming_child(checked: no cycle, 85 pass) and keep the IHHRC branch (6-B p.46), or NOTE the omitted exclusions.
G5 (carried, raised to Should Address). $3,000 spouse-resource limit untested (also raised by DTrim99)
ia_ssa_eligible.py:23-33; removing the pooling passes 85. IHHRC recipient 65 + spouse 50: 2,500 + 400 -> 400; 2,500 + 600 -> 0 (6-B p.12). Fix: add both cases.
SA5 (carried, PARTIAL). Remaining boundary tests
- #1 RCF participation equal to the month's cost; #5 FLH with $10/month other income (no top-up; pin it, 6-B p.35); #7 one spouse in RCF (with C6).
SA6 (carried, PARTIAL). Implicit defaults
- Add
default_valuetoia_ssa_dependent_countable_income,ia_ssa_ihhrc_monthly_cost,ia_ssa_rcf_daily_rateandia_ssa_smme_coverage_eligible.
Suggestions
- G6 (carried) DP group income at need - 0.01 ($1) and at need (0).
- G9 (carried)
smme_minimum_fpg_rate.yaml: add 51.7(6) (IAC 51 p.2) and 249.3(4)(g); link IAC 51 inia_ssa.py,ia_ssa_federal.py,ia_ssa_nonfinancial_eligible.py. - G14 Blind $22 with RCF/IHHRC is right; NOTE 52.1(4) (IAC 52 p.2) vs 6-B p.20, p.42 and POMS code A; fix the PR body's "concurrent category" basis (also raised by DTrim99).
- G15
ihhrc_cost_limit.yaml:9-17overstates the conflict: 177.9(4) (IAC 177 p.5, "177.9(3)" typo) and 177.11(4) (2/5/25) support the manual (also raised by DTrim99). - G16 Cite the 2/5/25 edition of ch. 177 (p.2, p.5) in the five IHHRC files (177.10(2)"b" for the partial month); "IAB" -> "IAC 8/5/26" (
ihhrc_cost_limit.yaml:21). - G17 DEPENDENT_PERSON on one spouse pays [259, 0], not $518: treat as a DP couple or pin it (also raised by DTrim99).
- G18 Document that DEPENDENT_PERSON certification covers the dependent's resources (51.5(2)) (also raised by DTrim99).
- G19 Case 58 (
ia_ssa.yaml:1240): comment that it becomes 380 with #10242; NOTE atia_ssa_care_countable_income.py:33-35; routechild_support_share.yamlnits to #10242 (also raised by DTrim99). - G20 Add
ia_ssato Iowa CCA unearned sources now (#10304) (also raised by DTrim99). - G21
ia_ssa.py:30-31"31-day ceiling" describes absent code; cite 52.1(3)"d" (also raised by DTrim99). - G22 Spell out "State Supplementary Assistance" in labels, not "Iowa SSA" / "SMME" (also raised by DTrim99).
- G23
programs.yamlnote: microsimulation pays only the blind supplement, so results run low (SSA: 734 Iowa recipients, average $248.07, December 2025) (also raised by DTrim99). - G24 Case 54 comment: "must not be more than $1,156" (6-B p.34) (also raised by DTrim99).
- G25 Move Cases 36-43 and resources 3-5 to 2026-01; comment Case 15's 28-day month.
- G26 Case 43 (
ia_ssa.yaml:886): one SPM unit and family span two households; split them. - G27 SMME: reuse
fpg()ormsp_fpginstead of the inlineCONTIGUOUS_USguideline;addsif the income stays a plain sum. - G28 Share the SSA rounding (
ia_ssa_federal.py:109-112copies_ssi_state_supplement.py:47-52). - G29
ia_ssa_countable_for_snap/_for_hudare identical; covered days duplicated (ia_ssa.py:28-29,ia_ssa_ihhrc_amount.py:25-26). - G30 Case 26 expect 206.45; Case 13 name ("state-only" is the SSA row); integration Cases 1-7 assert only
ia_ssa; resources Case 2 echoes its input. - G31 Tell users to enter a shared deduction on one spouse (
ia_ssa_ihhrc_participation.py:30). - G32 Simplify the five-way OR (
ia_ssa_eligible.py:23-29); NOTE YEARssi_claim_is_jointvs MONTHssi_couple_computation_applies. - G33 Comment pages: 52.1(4) is IAC 52 p.2 (
ia_ssa_federal.py:14-15); add 6-B 40, 46, 58 (ia_ssa_care_countable_income.py:18), 40, 57-61 (ia_ssa_category.py:21); POMS#f2a/#f2unverified (use#f); 416.1205 for the limits. - G34 DP/FLH continue up to 3 months in a medical institution (6-B p.11);
ia_ssa_federal.py:74-75, 92stops them at once. - G35 Document: DP $20 allocation and need-based income (6-B p.26); 177.2(1)"g"(1)2 child standard; SMME blind under 65 (Code 249.3(4)"a"); IHHRC child earnings; SMME spouse resources by Medicaid group; bed-day caps; RCF child under 16.
- G36 Low cases: 2026 FLH gate with real income; FLH couple, one with income; blind FLH couple 823 / 845; unequal IHHRC costs; RCF rate below cap; SSI parent or two children in deeming; adult with child support.
Investigated and cleared
- Page lists in reference titles: prescribed by the repo
CLAUDE.md:150-155(#10009); 64 such titles on main. Not a finding. - Non-January case periods as CRITICAL: plugin-only rule; CI ran all 85; 118 such periods on main. Kept as G25.
- Federal
child_support_share.yaml: identical on main (#10165); out of scope (G19). - Blind $22 with RCF/IHHRC, also for an over-income resident: matches 6-B p.20, p.42 and POMS code A (600-dpi re-read); NOTE only (G14).
- SMME "exceed" vs 249.3(4)(g) "at least": follows 51.7(6) and 6-B; documented; Cases 56-57.
- Case 43: no SPM-unit or family variable in the
ia_ssatree; corrected variants give [0, 400]. - $2,031 vs POMS $2,053, FLH gate
<vs "not more than", $961.10 couple limit, IHHRC ceiling as eligibility: supported or no dollar effect. - SA4 decline accepted. All 9 2026 values match their sources.
PDF Audit Summary
| Category | Count |
|---|---|
| Documents | 5 PDFs (6-B, IAC 52, 177, 51, Code 249) + POMS F, 7-E, GL 6-B-46/47, IAC 177 2/5/25, 8-E, eCFR |
| Confirmed matches | 135 |
| 2026 values mismatched | 0 of 9 |
| Rule mismatches (code run + page re-read) | 7: C4, C6, SA14-SA18 |
| Out-of-year value mismatch | 1: SA19 (2025) |
| Rejected / false positives | 2 PDF items, 2 house-rule items |
| Anchors | 47: 40 correct, 4 refinable, 3 wrong (SA13); 1 href on the wrong page (SA20); 0 missing |
Validation Summary
| Check | Result |
|---|---|
| Regulatory | C4, C6; SA14-SA19, SA21 |
| References | SA13, SA20; G9, G14-G16, G33 |
| Code patterns | SA6, SA22, SA24; G27-G32 |
| Tests | 0 of 20 variables untested; gaps SA5, SA23, G5, C4; Cases 20, 45, 52 pin contested values |
| CI | 27 pass / 3 skipping (superseded run) on 3b9e925; predates the conflict |
| Local | 85/85 passed at the head (13.4 s) |
| Partner tests | None touched |
Review Severity: REQUEST_CHANGES
Three critical items (C4, C5, C6) and 15 should-address items are open. The May criticals are fixed, and every 2026 value matches its source.
Next Steps
- Merge
main, resolve the two lists (C5), and let CI run. - Fix C4 and C6 with the couple cases.
- Address SA14-SA24, G5, SA5, SA6, SA13; re-pin Cases 20, 45, 52.
- Update rulespec-us#1837 for C4, C6, SA14-SA16, SA18, G14, G15.
- To apply fixes:
/fix-pr 8017.
…tance - SMME tests an eligible couple's combined income against the couple guideline. - In-home care deducts the dependent child allowance; residential care defaults to the maximum per diem, shields income up to the SSI rate in the entry month, and budgets spouses as individuals after the entry month. - The residential care personal needs allowance rises with the SSI COLA (Iowa Code 249.9A(1)). - Interest and dividends are excluded consistently (20 CFR 416.1124(c)(22)). - The spouse test uses SSI's spouse definition, and SSA's resource-deeming finding stands for SSI children. - Certifying either spouse applies the dependent-person couple level. - New source-conflict NOTEs, page anchors, defaults and boundary tests; child_support_share.yaml is left as on main (issue 10242). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SMME income qualifies at exactly 120 percent of the poverty guideline (Iowa Code 249.3(4)(g), "at least"), and SMME requires age 65 or disability (249.3(4)(a)); 441 IAC 51.7(6) and 51.7(2) read otherwise. Both follow the statute-first rule and are queued as source-conflict candidates. - Remove 12 test cases that repeated a kept case's branch and outcome, and retarget two boundary cases so they pin the comparison operator. - Update case citations in NOTEs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The model follows Iowa Code 249.3(4)(g) and (4)(a) over 441 IAC 51.7(6) and 51.7(2); the entries wait in source_conflicts/candidates.yaml until they are registered. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, David. This round's changes are in 040662b; Critical 1, SMME couples: fixed.
Should 1, the IHHRC dependent allowance: fixed.
Should 2, the residential care entry month: fixed (your options a and b together).
Should 3(a), the residential care rate: fixed.
Should 3(b), the blind $22 with a care supplement: documented.
Suggestion 1, 2025 values: declined. Years before 2026 are out of scope for this batch. The body still says earlier years are unverified estimates, and #8974 tracks history. Suggestion 2, 177.9(4): documented. The Suggestion 3:
Suggestion 4, Case 58 (now 46): fixed. A comment links the expectation to #10242: once SSI applies (c)(11), SSI is 14, participation 20 and Suggestion 5, Child Care Assistance: declined. It changes another program's income definition, so it stays in #10304 for after this merges. Suggestion 6:
Branch note, main's statute-first rule (#10287): SMME income and SMME for a blind person under 65 now follow Iowa Code 249.3(4)(g) and (4)(a), not the "exceed" of 51.7(6) that you reviewed and the SSI categories of 51.7(2), under PolicyEngine-US's statute-first rule (CONTRIBUTING.md, "Source conflicts", merged on 2026-10-20). Cases 44-45 pin "at least" 120% (1,596 pays 1, and 1,595.99 pays 0), and Cases 72 and 76 pin a blind applicant under 65 without and with a disability (0 and 1). 040662b lists both in Branch note, the shared-list conflicts: resolved. The CI: the red jobs come from one test, 105 Iowa supplement cases pass locally (76 in |
|
Thanks, Pavel. These changes are in 040662b; C4, SMME couples: fixed (David's review).
C5, the merge conflict: fixed. C6, residential care couples after the month of entry: fixed.
SA14, the IHHRC dependent allowance: fixed (David's review); NOTE added.
SA15, residential care with no rate entered: fixed (David's review). With no rate entered, the model pays the $38.47 maximum (52.1(3); 51.4(3)). SA16, the residential care entry month: fixed (David's review).
SA17, impairment-related work expenses: documented.
SA18, the personal needs allowance: fixed.
SA19, 2025 values: declined. Years before 2026 are out of scope for every supplement PR in this batch. The body labels earlier years as unverified estimates, and #8974 tracks history. SA20, the family-life home anchor: fixed. SA13, the Code 249 anchors: fixed. The hrefs in SA21, interest and dividends: fixed.
SA22, spouse tests: fixed.
SA23, SSA rounding and the $1 minimum: fixed with tests. Case 66 ($12,426 a year, raw 0.50) pays $1. Case 67 ($12,365.34, raw 5.555) pays 5.56. SA24, parental resource deeming for an SSI child: fixed. The child test is now G5, the $3,000 couple limit: fixed (David's review). Cases 54 and 55: $2,500 + $400 gives [400, 0], and $2,500 + $600 gives [0, 0]. SA5, the remaining boundary tests: fixed with tests.
SA6, implicit defaults: fixed (David's review). The four inputs have explicit G6, the dependent-person boundary: fixed with tests. Case 70 (group income 1,511.99) pays $1. Case 71 now pins "less than": $1,492 of Social Security (1,472 countable) and $40 of dependent income make group income exactly 1,512, so it pays 0, where "not more than" would pay 40. G9, the 120% citations: fixed. G14, the blind $22 with care: documented (David's review). A NOTE in G15, the cost ceiling: documented (David's review). G16, the 2/5/25 edition: fixed. The five in-home care files cite the IAC 2/5/25 edition of chapter 177, with 177.10(2)"b" for the first partial month. The G17, dependent person on one spouse: fixed (David's review). Certifying either spouse applies the couple level: integration Case 11 gives [259, 259], and Case 12 gives [259, 659]. G18, the dependent's resources: documented (David's review) in the G19, child support: fixed.
G20, Child Care Assistance: declined. Counting G21, the "31-day ceiling" comment: fixed (David's review). It now explains 51.4(3) and 52.1(3)"d". G22, labels: declined. Labels abbreviate the program by house convention, 6-B itself uses "SSA", and the descriptions spell it out. G23, the registry note: fixed (David's review). The G24, Case 54 (now 42): fixed (David's review). Its comment quotes p.34's "must not be more than". G25, case periods: partly fixed. Case 15 (now 10) explains the 28-day month. Your Cases 36-43 (now 25-31, as Case 36 was removed) and resources Cases 3-5 key their YEAR inputs by G26, Case 43 (now 31): fixed. The family and SPM unit are split by household. The result is still [0, 400]. G27, the inline guideline: declined. Reusing G28, shared rounding: declined. Sharing it means editing the shared G29, the SNAP and HUD variables: declined. They have separate legal bases (7 CFR 273.9(c)(5); 24 CFR 5.609(b)(6), (b)(19)), and the covered-days logic is one line in each file. G30, test details: fixed.
G31, shared deductions: fixed. The G32, the five-way OR: declined. The OR stays. The YEAR G33, comment pages: partly fixed. The page comments in G34, temporary institutionalization: declined. Continued dependent-person and family-life home payments for up to three months need new inputs. The body lists them under "Not modeled". G35, documentation gaps: documented.
G36, low-priority cases: declined. These cover branches already tested. Cases 56, 63 and 64 now cover a lower facility rate and the family-life home with real income. Branch note, main's statute-first rule (#10287): SMME now follows Iowa Code 249.3(4)(g) and (4)(a) over 441 IAC 51.7(6) and 51.7(2) (C4 and G35 above), which reverses the "exceed" reading your review cleared. Income of exactly 120% qualifies (Case 44 pays 1, and Case 45, at 1,595.99, pays 0), and a blind person under 65 needs a disability (Case 72 pays 0, Case 76 pays 1). 040662b lists both in TheAxiomFoundation/rulespec-us#1837 and its conflicts comment are updated for C4, C6, SA14-SA16, SA18, G14 and G15, with companion tests AB-AP and conflicts 9-11. Test consolidation. Your review saw 85 cases; this round adds 32 and removes 12 that each repeated a kept case's branch and outcome, leaving 105. By your numbers, with the kept case in the new numbering: 2 (integration Case 8), 3 (67), 4 (4), 11 (64), 14 (14 and 33), 21 (32 and 16), 25 (35), 26 (32 and 34), 27 (integration Case 9), 30 ( CI: the red jobs come from one test, 105 Iowa supplement cases pass locally (76 in |
PR Review (round 2): Add Iowa state supplementation for 2026PR #8017 (author: hua7450). This round reviews head
SummaryZiming fixed the round-1 critical item and all three should items. He fixed or documented four of the six suggestions; the other two (2025 values and Child Care Assistance) are declined with reasons I accept.
Review of the rewrite.
The wage lesson (OK #10165, NH #10156 round 3) finds nothing for Iowa: this is the Ohio pattern.
The NH #10156 key check finds nothing.
Other checks.
CI and branch.
Prior findings status
Pavel's newer items that this rewrite took up changed results: C6 (couple budget), SA18 (allowance uprating), SA21 (interest), SA22 (spouse test), SA23 (rounding), SA24 (deeming child) and G6 (the "less than" boundary). I reviewed them as new code below. They are his findings to clear, but I found no defect in them. New findingsCritical (must fix)None. Should addressNone. Suggestions1. Apply the SGA exception in SMME's disability test. It is a one-line fix, and I recommend it.
2. In a situation without marital units, SMME's income test mixes the couple and single readings.
3. Record why the care income may read SSI's wage count (optional). This is the same as Ohio's round-2 Suggestion 1.
4. Polish.
Verified
Axiom line assessmentValid:
CI status25 pass, 2 fail, 0 pending (
Branch status
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Round 2: the round-1 critical (SMME couples) is fixed for 2026, with combined income against the two-person guideline, and all three should items are fixed. I reviewed the rewrite as new code: every new or changed expectation hand-checks, and the couple budget matches 6-B's Mr. K/B/A examples. The care income correctly follows SSI policy for wages (52.1(3)"a"; 6-B p.59). Both merge blocks keep every sibling's line. The two red checks are the known FL/SD LIHEAP ratchet failure. Four suggestions; I recommend Suggestion 1 (apply the statute's SGA exception in SMME, a one-line fix). Full report in the comment above.
Iowa Code 249.3(4)(a)(2), 441 IAC 51.7(2) and 6-B p.10 say substantial gainful activity does not preclude SMME disability, so the SMME branch reads meets_ssi_disability_criteria. SSI counts no income for a person it does not treat as aged, blind or disabled, so SMME income applies SSI's exclusions to that person's own income (Case 77). Also name SMME correctly in the candidate entry and correct Case 65's comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
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.
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 rate and entry month, where it follows the rule. For SMME income and SMME for a blind person under 65, it follows the Iowa Code, under PolicyEngine-US's statute-first rule (CONTRIBUTING.md, "Source conflicts", merged with Tie source-conflict markers to the register shared with Axiom #10287). Both are listed in
source_conflicts/candidates.yaml(us-ia:smme-income-at-least-120-percent,us-ia:smme-blind-under-65) until they are registered. For a dependent's income of exactly $518 and the in-home dependent allowance, the rule agrees with the reading taken. The in-home cost ceiling is no longer a conflict. The rulespec-us issue's conflicts comment quotes each side.The 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 the two SMME statute-conflict entries.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.Earlier years 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 328d172. 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