diff --git a/changelog.d/ia-ssp.added.md b/changelog.d/ia-ssp.added.md new file mode 100644 index 00000000000..a9f28ee7a15 --- /dev/null +++ b/changelog.d/ia-ssp.added.md @@ -0,0 +1 @@ +Add Iowa State Supplementary Assistance for 2026. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 9cac50c50f9..e01d10fc5e2 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -105,6 +105,8 @@ values: - ma_eaedc # DC benefits - dc_ossp + # Iowa benefits + - ia_ssa # Kansas benefits - ks_sspp # Hawaii benefits @@ -231,6 +233,8 @@ values: - ma_eaedc # DC benefits - dc_ossp + # Iowa benefits + - ia_ssa # Kansas benefits - ks_sspp # Hawaii benefits @@ -362,6 +366,8 @@ values: # DC benefits - dc_ossp - dc_child_care_subsidies + # Iowa benefits + - ia_ssa # Kansas benefits - ks_sspp # Hawaii benefits @@ -493,6 +499,8 @@ values: # DC benefits - dc_ossp - dc_child_care_subsidies + # Iowa benefits + - ia_ssa # Kansas benefits - ks_sspp # Hawaii benefits diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index cb3bf88efd4..0e697250259 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -36,6 +36,7 @@ values: - sd_ssp - vt_aabd - va_ag + - ia_ssa_countable_for_hud - general_assistance - total_unemployment_compensation - child_support_received diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/blind_amount.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/blind_amount.yaml new file mode 100644 index 00000000000..16e62203137 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/blind_amount.yaml @@ -0,0 +1,15 @@ +description: Iowa provides this amount as the monthly blind supplement under the State Supplementary Assistance program. +values: + 2026-01-01: 22 + +metadata: + unit: currency-USD + period: month + label: Iowa SSA blind supplement + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Blind Supplement + href: https://hhs.iowa.gov/media/3987/download?inline=#page=20 + - title: 441 IAC 52.1(4) + href: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=2 + - title: SSA POMS SI 01415.058 F.2.a (TN 95, 08-26), Iowa recipient payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#f2a diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/dependent_amount.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/dependent_amount.yaml new file mode 100644 index 00000000000..f4fcd3e0aea --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/dependent_amount.yaml @@ -0,0 +1,28 @@ +description: Iowa provides this amount as the monthly dependent-person supplement under the State Supplementary Assistance program. +values: + 2023-01-01: 474 + 2024-01-01: 490 + 2025-01-01: 503 + 2026-01-01: 518 + +metadata: + unit: currency-USD + period: month + label: Iowa SSA dependent-person supplement + # The same amount is the dependent's income limit (6-B Nonfinancial Eligibility (DP)). + # NOTE: 441 IAC 52.1 adjusts assistance standards each January 1 for the SSA + # cost-of-living adjustment but publishes no method, so this value stays at + # its 2026 level until a later schedule is added. + reference: + - title: "Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Dependent Person Supplement #page 24-28" + href: https://hhs.iowa.gov/media/3987/download?inline=#page=24 + - title: 441 IAC 52.1 and 52.1(2) + href: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1 + - title: SSA POMS SI 01415.058 F.2 (TN 95, 08-26), Iowa payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#f2 + - title: "Iowa HHS General Letter 6-B-46 (effective January 1, 2025) #page 1-2" + href: https://hhs.iowa.gov/media/15607/download#page=1 + - title: Iowa HHS General Letter 6-B-45 (effective January 1, 2024) + href: https://hhs.iowa.gov/media/12206/download#page=1 + - title: Iowa HHS 2023 State Supplementary Assistance standards + href: https://hhs.iowa.gov/media/9237/download diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/excluded_unearned_sources.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/excluded_unearned_sources.yaml new file mode 100644 index 00000000000..67f1105a653 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/excluded_unearned_sources.yaml @@ -0,0 +1,18 @@ +description: Iowa excludes these unearned income sources from countable income under the State Supplementary Assistance program. +values: + 2026-01-01: + - interest_income + - dividend_income + +metadata: + unit: list + period: year + label: Iowa SSA excluded unearned income sources + # NOTE: 20 CFR 416.1124(c)(22) excludes interest and dividends from a + # countable resource, but federal SSI in the model still counts them (issue + # 10079). Remove this list once SSI excludes them, or they are excluded twice. + reference: + - title: 20 CFR 416.1124(c)(22) + href: https://www.ecfr.gov/current/title-20/section-416.1124#p-416.1124(c)(22) + - title: "Iowa HHS Employees' Manual 8-E (revised April 11, 2025), Dividends and Interest Income #page 23,36" + href: https://hhs.iowa.gov/media/4011/download?inline#page=23 diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/family_life_supplement.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/family_life_supplement.yaml new file mode 100644 index 00000000000..67de08f57bb --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/family_life_supplement.yaml @@ -0,0 +1,19 @@ +description: Iowa provides this amount as the maximum monthly family-life home supplement under the State Supplementary Assistance program. +values: + 2026-01-01: 162 + +metadata: + unit: currency-USD + period: month + label: Iowa SSA maximum family-life home supplement + # The family-life home standard is the SSI individual benefit rate plus this + # supplement ("$162 ($1,156 - $994 SSI standard)"). SSA pays at most $142, + # this supplement less the $20 general exclusion. The couple amount is twice + # the standard less the SSI couple rate and $20 (POMS code D Aged/Aged $801). + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Making the Family-Life Home Payment + href: https://hhs.iowa.gov/media/3987/download?inline=#page=35 + - title: 441 IAC 52.1 and 52.1(1) + href: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1 + - title: SSA POMS SI 01415.058 F.2 (TN 95, 08-26), Iowa code D payment levels + href: https://secure.ssa.gov/poms.nsf/lnx/0501415058#f2 diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/fpg_year_start_month.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/fpg_year_start_month.yaml new file mode 100644 index 00000000000..72e8753a701 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/fpg_year_start_month.yaml @@ -0,0 +1,14 @@ +description: Iowa uses the current calendar year's federal poverty guidelines from this month for the Supplement for Medicare and Medicaid Eligibles income test under the State Supplementary Assistance program. +values: + 2026-01-01: 4 + +metadata: + unit: month + period: year + label: Iowa SSA SMME poverty guideline year start month + # Earlier months use the prior year's guidelines. + reference: + - title: 441 IAC 75.1, federal poverty level "revised annually on April 1" + href: https://www.legis.iowa.gov/docs/iac/chapter/441.75.pdf#page=2 + - title: Iowa HHS RC-0130 (Rev. 04/26), 120% of the federal poverty level effective 4/1/26 + href: https://hhs.iowa.gov/media/6948/download#page=2 diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/ihhrc_cost_limit.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/ihhrc_cost_limit.yaml new file mode 100644 index 00000000000..7725a263712 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/ihhrc_cost_limit.yaml @@ -0,0 +1,26 @@ +description: Iowa limits the monthly in-home health-related care cost per recipient to this amount under the State Supplementary Assistance program. +values: + 2026-01-01: 480.55 + +metadata: + unit: currency-USD + period: month + label: Iowa SSA maximum in-home health-related care cost per recipient + # 6-B Income (IHHRC) p.41: "If the care needed by the client is more + # expensive than these limits, the client is not eligible for a SSA payment + # for in-home health-related care." 441 IAC 177 agrees: 177.9(4) (IAC + # 8/5/26, ARC 0460D, effective October 1, 2026) terminates IHHRC for + # "Excessive costs. When the cost of care exceeds the maximum established in + # subrule 177.9(3)", a cross-reference that should read 177.8(3), the + # $480.55 maximum benefit payable. The IAC 2/5/25 edition has it at + # 177.11(4), citing 177.10(3). 177.2(1)"f" also limits countable income to + # "$480.55 per month if one needs care or $961.10 if both need care", which + # pays nothing whenever participation reaches the cost. ia_ssa.yaml Cases + # 16-17 pin the ceiling. + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Income (IHHRC) + href: https://hhs.iowa.gov/media/3987/download?inline=#page=41 + - title: '441 IAC 177.2(1)"f", 177.8(3) and 177.9(4) (IAC 8/5/26) #page 1,4-5' + href: https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf#page=1 + - title: '441 IAC 177.4(1)"f", 177.10(3) and 177.11(4) (IAC 2/5/25) #page 2,5' + href: https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/rcf_daily_limit.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/rcf_daily_limit.yaml new file mode 100644 index 00000000000..cf9ddf7e825 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/rcf_daily_limit.yaml @@ -0,0 +1,29 @@ +description: Iowa limits the residential care facility daily rate to this amount under the State Supplementary Assistance program. +values: + 2023-01-01: 35.89 + 2024-01-01: 36.82 + 2025-01-01: 37.6 + 2026-01-01: 38.47 + +metadata: + unit: currency-USD + period: day + label: Iowa SSA maximum residential care daily rate + # NOTE: Iowa Code 249.12(3) sets the rate through "the maximum per diem rates + # established by the general assembly through the appropriations process", + # not by the COLA (2025 $37.60 to 2026 $38.47 is 2.3 percent against a 2.8 + # percent COLA). Later years carry the 2026 rate as a frozen projection until + # a new rate is published. + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Billing and Payments (RCF) + href: https://hhs.iowa.gov/media/3987/download?inline=#page=72 + - title: "441 IAC 52.1 and 52.1(3) #page 1-2" + href: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1 + - title: Iowa Code 249.12(3) + href: https://www.legis.iowa.gov/docs/code/249.pdf#page=5 + - title: "Iowa HHS General Letter 6-B-46 (effective January 1, 2025) #page 1-2" + href: https://hhs.iowa.gov/media/15607/download#page=1 + - title: "Iowa HHS General Letter 6-B-45 (effective January 1, 2024) #page 1,24" + href: https://hhs.iowa.gov/media/12206/download#page=1 + - title: Iowa HHS 2023 State Supplementary Assistance standards + href: https://hhs.iowa.gov/media/9237/download diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/rcf_personal_needs.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/rcf_personal_needs.yaml new file mode 100644 index 00000000000..4dd1d24e97d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/rcf_personal_needs.yaml @@ -0,0 +1,39 @@ +description: Iowa provides this amount as the monthly residential care personal needs allowance under the State Supplementary Assistance program. +values: + 2023-01-01: 120 + 2024-01-01: 123 + 2025-01-01: 126 + 2026-01-01: 130 + +metadata: + unit: currency-USD + period: month + label: Iowa SSA residential care personal needs allowance + # Iowa Code 249.9A(1): the department "shall increase the personal needs + # allowance for residents of residential care facilities by the same + # percentage and at the same time as federal supplemental security income and + # federal social security benefits are increased due to a recognized increase + # in the cost of living". Rounding to the nearest dollar is inferred from + # General Letters 6-B-45, 6-B-46 and 6-B-47 ($123, $126 and $130 for + # 2024-2026: 123 * 1.025 = 126.08 and 126 * 1.028 = 129.53). It does not fit + # 2024, when Iowa published $123 although 120 * 1.032 = 123.84, so it only + # approximates projected years. The published allowance replaces the + # projection. + uprating: + parameter: gov.ssa.uprating + rounding: + type: nearest + interval: 1 + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Personal Needs Allowance (RCF) + href: https://hhs.iowa.gov/media/3987/download?inline=#page=62 + - title: 441 IAC 52.1 and 52.1(3)"a"(2) + href: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1 + - title: Iowa Code 249.9A(1) + href: https://www.legis.iowa.gov/docs/code/249.pdf#page=4 + - title: "Iowa HHS General Letter 6-B-46 (effective January 1, 2025) #page 1-2" + href: https://hhs.iowa.gov/media/15607/download#page=1 + - title: Iowa HHS General Letter 6-B-45 (effective January 1, 2024) + href: https://hhs.iowa.gov/media/12206/download#page=1 + - title: Iowa HHS 2023 State Supplementary Assistance standards + href: https://hhs.iowa.gov/media/9237/download diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/smme_amount.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/smme_amount.yaml new file mode 100644 index 00000000000..f0d50a3be81 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/smme_amount.yaml @@ -0,0 +1,13 @@ +description: Iowa provides this amount as the monthly Supplement for Medicare and Medicaid Eligibles payment under the State Supplementary Assistance program. +values: + 2026-01-01: 1 + +metadata: + unit: currency-USD + period: month + label: Iowa SSA SMME payment + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Payments (SMME) + href: https://hhs.iowa.gov/media/3987/download?inline=#page=78 + - title: 441 IAC 52.1(7) + href: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/ia/hhs/ssa/smme_minimum_fpg_rate.yaml b/policyengine_us/parameters/gov/states/ia/hhs/ssa/smme_minimum_fpg_rate.yaml new file mode 100644 index 00000000000..d54bb93c13f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ia/hhs/ssa/smme_minimum_fpg_rate.yaml @@ -0,0 +1,15 @@ +description: Iowa sets this share of the federal poverty guideline as the minimum income for the Supplement for Medicare and Medicaid Eligibles under the State Supplementary Assistance program. +values: + 2026-01-01: 1.2 + +metadata: + unit: /1 + period: year + label: Iowa SSA SMME minimum income poverty guideline rate + reference: + - title: Iowa HHS Employees' Manual 6-B (revised May 22, 2026), Income (SMME) + href: https://hhs.iowa.gov/media/3987/download?inline=#page=77 + - title: 441 IAC 51.7(6) + href: https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=2 + - title: "Iowa Code 249.3(4)(g) #page 2-3" + href: https://www.legis.iowa.gov/docs/code/249.pdf#page=2 diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index 0ab4065ef2f..bd733f830c1 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -34,6 +34,7 @@ values: - fl_oss - ga_ssp_person - hi_oss + - ia_ssa_countable_for_snap - id_aabd - in_ssp - ks_sspp diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 86c8759b02d..ecdd496d4c6 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1232,9 +1232,18 @@ programs: variable: hi_oss parameter_prefix: gov.states.hi.dhs.oss - state: IA - status: in_progress - name: Iowa SSP - full_name: Iowa State Supplemental Payment + status: partial + name: Iowa SSA + full_name: Iowa State Supplementary Assistance + variable: ia_ssa + parameter_prefix: gov.states.ia.hhs.ssa + verified_years: "2026" + notes: >- + Models 2026 blind, dependent-person, family-life home, residential + care, in-home health-related care and SMME supplements; special + categories need certification inputs, so microsimulation pays only + the blind supplement. Mandatory minimum-income-level and + conditional-benefit payments are not modeled. - state: ID status: complete name: Idaho AABD diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa.yaml new file mode 100644 index 00000000000..cbd7d789191 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa.yaml @@ -0,0 +1,2958 @@ +- name: Case 1, aged person has no ordinary supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + output: + ia_ssa: 0 + +- name: Case 2, blind dependent-person recipient. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: DEPENDENT_PERSON + is_blind: true + output: + ia_ssa: 540 + +- name: Case 3, dependent income at limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: DEPENDENT_PERSON + ia_ssa_dependent_countable_income: 518 + output: + ia_ssa: 0 + +- name: Case 4, dependent income is an eligibility gate not a grant deduction. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: DEPENDENT_PERSON + ia_ssa_dependent_countable_income: 100 + output: + ia_ssa: 518 + +- name: Case 5, total dependent group income exceeds standard. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: DEPENDENT_PERSON + social_security_retirement: 18_000 + ia_ssa_dependent_countable_income: 40 + output: + ia_ssa: 0 + +- name: Case 6, family life home SSI-only top up. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: FAMILY_LIFE_HOME + output: + ia_ssa: 162 + +- name: Case 7, blind family-life home stacks blind supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: FAMILY_LIFE_HOME + is_blind: true + output: + ia_ssa: 184 + +- name: Case 8, family-life home earnings do not qualify for SSI-only top up. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: FAMILY_LIFE_HOME + employment_income: 1_200 + output: + ia_ssa: 142 + +- name: Case 9, the Social Security Administration pays the family-life home supplement without federal SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: FAMILY_LIFE_HOME + social_security_retirement: 13_200 + output: + # SSI: 1,100 - 20 = 1,080 > 994, so SSI is 0. Care income 1,100 is below + # 1,156, so SSA pays 142 - (1,080 - 994) = 56. + ia_ssa: 56 + +- name: Case 10, RCF February uses actual days not eligibility multiplier. + period: 2026-02 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + output: + # February 2026 has 28 days: 38.47 * 28 = 1,077.16; 1,077.16 - 864 = 213.16. + ia_ssa: 213.16 + +- name: Case 11, blind RCF resident also gets blind supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + is_blind: true + output: + ia_ssa: 350.57 + +- name: Case 12, RCF no general income disregard. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + social_security_retirement: 6_516 + output: + ia_ssa: 308.57 + +- name: Case 13, RCF verified medical and family deductions. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + ia_ssa_care_additional_deductions: 50 + output: + ia_ssa: 378.57 + +- name: Case 14, RCF approved daily rate is capped. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 100 + output: + ia_ssa: 328.57 + +- name: Case 15, RCF without a facility rate is paid at the maximum daily rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + output: + # 441 IAC 52.1(3): payment "will be based on the maximum per diem rate". + # 38.47 * 31 = 1,192.57; SSI 994, participation 994 - 130 = 864; + # 1,192.57 - 864 = 328.57. + ia_ssa: 328.57 + +- name: Case 16, in-home care cost at ceiling. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 480.55 + output: + ia_ssa: 480.55 + +- name: Case 17, in-home cost over ceiling makes care ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 480.56 + output: + ia_ssa: 0 + +- name: Case 18, manual IHHRC example with social security and SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + social_security_retirement: 6_516 + output: + # SSI 994 - (543 - 20) = 471; participation 543 + 471 - 994 = 20. + ia_ssa_ihhrc_participation: 20 + ia_ssa: 380 + +- name: Case 19, excess resources. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: true + ssi_countable_resources: 2_001 + output: + ia_ssa: 0 + +- name: Case 20, nonresident. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NE + age: + 2026: 65 + is_blind: true + output: + ia_ssa: 0 + +- name: Case 21, medical facility has no ordinary blind supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: true + ssi_federal_living_arrangement: MEDICAL_TREATMENT_FACILITY + output: + ia_ssa: 0 + +- name: Case 22, SMME missing coverage. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_countable_income: 2_000 + output: + ia_ssa: 0 + +- name: Case 23, SMME income below 120 percent poverty. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 1_000 + output: + ia_ssa: 0 + +- name: Case 24, SMME cannot stack with blind payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 2_000 + is_blind: true + output: + ia_ssa: 22 + +# Iowa 6-B IHHRC resource deeming and SSI sibling reallocation. +# https://hhs.iowa.gov/media/3987/download?inline=#page=46 +# https://secure.ssa.gov/poms.nsf/lnx/0501330280 +- name: Case 25, one-parent allowance and child ceiling are inclusive. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 4_000 + person2: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + parent1: + members: [person1] + child1: + members: [person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + ia_ssa: [0, 400] + +- name: Case 26, one cent above the combined allowances defeats eligibility. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 4_000.01 + person2: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + parent1: + members: [person1] + child1: + members: [person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + ia_ssa: [0, 0] + +- name: Case 27, an adult child does not receive deemed parental resources. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 10_000 + person2: + age: + 2026: 19 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + parent1: + members: [person1] + child1: + members: [person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + ia_ssa: [0, 400] + +- name: Case 28, co-residence alone does not deem an unrelated adult resource balance. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 0 + person2: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person3: + age: + 2026: 40 + person_id: + 2026: 4 + bank_account_assets: + 2026: 10_000 + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + unrelated: + members: [person3] + families: + family: + members: [person1, person2, person3] + tax_units: + parent1: + members: [person1] + child1: + members: [person2] + unrelated: + members: [person3] + spm_units: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: + 2026: IA + output: + ia_ssa: [0, 400, 0] + +- name: Case 29, two eligible siblings share the same two-parent excess. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 5_500 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 10 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + bank_account_assets: + 2026: 0 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + families: + family: + members: [person1, person2, person3, person4] + tax_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + spm_units: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: + 2026: IA + output: + ia_ssa: [0, 0, 400, 400] + +- name: Case 30, an own-resource failure removes that sibling and reallocates the excess. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 5_500 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 10 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + bank_account_assets: + 2026: 1_500 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + families: + family: + members: [person1, person2, person3, person4] + tax_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + spm_units: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: + 2026: IA + output: + ia_ssa: [0, 0, 0, 0] + +- name: Case 31, a linked parent outside the household is not a resource deemor. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 10_000 + person2: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + families: + parent_family: + members: [person1] + child_family: + members: [person2] + tax_units: + parent1: + members: [person1] + child1: + members: [person2] + spm_units: + parent_unit: + members: [person1] + child_unit: + members: [person2] + households: + parent_home: + members: [person1] + state_code: + 2026: IA + child_home: + members: [person2] + state_code: + 2026: IA + output: + ia_ssa: [0, 400] + +- name: Case 32, partial in-home care days on one resident leave another resident's full month unchanged. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 65 + social_security_retirement: + 2026: 16_800 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + ia_ssa_care_partial_month_days: 16 + ia_ssa_care_initial_partial_month: true + person2: + age: + 2026: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + # person1: no participation in the first partial month; 400 * 16 / 31 = 206.45. + # person2: SSI 994 less the 994 home maintenance allowance leaves no + # participation, so the full 400 cost is paid. + ia_ssa_care_partial_month_days: [16, 0] + ia_ssa_ihhrc_participation: [0, 0] + ia_ssa_ihhrc_amount: [206.45, 400] + ia_ssa: [206.45, 400] + +- name: Case 33, partial residential care days on one resident leave another resident's full month unchanged. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + # Discharged January 26: January 1 through 25; the day of discharge is + # not paid (441 IAC 52.1(3)"b"). + ia_ssa_care_partial_month_days: 25 + person2: + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + marital_units: + unit1: + members: [person1] + unit2: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + unit1: + members: [person1] + unit2: + members: [person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + # Each resident has SSI 994, so participation is 994 - 130 = 864. + # person1: 38.47 * 25 = 961.75 - 864 = 97.75. + # person2: 38.47 * 31 = 1,192.57 - 864 = 328.57. + ia_ssa: [97.75, 328.57] + +- name: Case 34, the initial partial-month flag and days apply only to the entry month. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: IA + age: 65 + social_security_retirement: 16_800 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: + 2026-01: 400 + 2026-02: 400 + ia_ssa_care_partial_month_days: + 2026-01: 16 + ia_ssa_care_initial_partial_month: + 2026-01: true + output: + # January: no participation; 400 * 16 / 31 = 206.45. + # February: participation 1,400 - 994 = 406 is at least the 400 cost. + ia_ssa_care_initial_partial_month: + 2026-01: true + 2026-02: false + ia_ssa_care_partial_month_days: + 2026-01: 16 + 2026-02: 0 + ia_ssa_ihhrc_participation: + 2026-01: 0 + 2026-02: 406 + ia_ssa: + 2026-01: 206.45 + 2026-02: 0 + +- name: Case 35, a one-month care deduction does not carry into the next month. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: IA + age: 65 + social_security_retirement: 16_800 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: + 2026-01: 400 + 2026-02: 400 + ia_ssa_care_additional_deductions: + 2026-01: 100 + output: + # January: participation 1,400 - 994 - 100 = 306, so 400 - 306 = 94. + # February: participation 1,400 - 994 = 406, so nothing is paid. + ia_ssa_care_additional_deductions: + 2026-01: 100 + 2026-02: 0 + ia_ssa: + 2026-01: 94 + 2026-02: 0 + +- name: Case 36, a residential care applicant over the SSI income limit need not take up SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + social_security_retirement: 13_200 + takes_up_ssi_if_eligible: false + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + output: + # SSI countable income 1,100 - 20 = 1,080 exceeds 994, so SSI would pay nothing. + # Participation 1,100 - 130 = 970; 38.47 * 31 = 1,192.57 - 970 = 222.57. + uncapped_ssi: -86 + ia_ssa_nonfinancial_eligible: true + ia_ssa: 222.57 + +- name: Case 37, an in-home care applicant over the SSI income limit need not take up SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + social_security_retirement: 13_200 + takes_up_ssi_if_eligible: false + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + output: + # Participation 1,100 - 994 = 106; 400 - 106 = 294. + ia_ssa_nonfinancial_eligible: true + ia_ssa_ihhrc_participation: 106 + ia_ssa: 294 + +- name: Case 38, an SMME applicant over the SSI income limit need not take up SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + social_security_retirement: 24_000 + takes_up_ssi_if_eligible: false + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + output: + # SMME income 2,000 - 20 = 1,980 exceeds January's 1.2 * 15,650 / 12 = 1,565 + # (Iowa uses the 2025 guideline until April). + ia_ssa_nonfinancial_eligible: true + ia_ssa_smme_countable_income: 1_980 + ia_ssa: 1 + +- name: Case 39, 2027 blind supplement. + period: 2027-01 + absolute_error_margin: 0.01 + input: + state_code: + 2027: IA + age: + 2027: 65 + is_blind: true + output: + ia_ssa: 22 + +- name: Case 40, 2027 residential care participation uses the 2027 SSI rate and personal needs allowance. + period: 2027-01 + absolute_error_margin: 0.01 + input: + state_code: + 2027: IA + age: + 2027: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + output: + # Iowa Code 249.9A(1) raises the personal needs allowance by the SSI + # cost-of-living percentage: 130 * 328.746 / 317.265 = 134.70, rounded to + # 135. SSI 1,029; participation 1,029 - 135 = 894; the 2026 maximum rate is + # carried forward: 38.47 * 31 = 1,192.57 - 894 = 298.57. + ia_ssa: 298.57 + +- name: Case 41, 2027 family-life home standard follows the SSI rate. + period: 2027-01 + absolute_error_margin: 0.01 + input: + state_code: + 2027: IA + age: + 2027: 65 + ia_ssa_category: FAMILY_LIFE_HOME + ia_ssa_care_countable_income: 1_170 + output: + # Standard 1,029 + 162 = 1,191, so 1,170 qualifies (the 2026 standard was + # 1,156). With no other countable SSI income, SSA pays 162 - 20 = 142. + ia_ssa_federal: 142 + +- name: Case 42, 2027 family-life home income at the standard is ineligible. + period: 2027-01 + absolute_error_margin: 0.01 + input: + state_code: + 2027: IA + age: + 2027: 65 + ia_ssa_category: FAMILY_LIFE_HOME + ia_ssa_care_countable_income: 1_191 + output: + # 6-B p.34: countable income "must not be more than" the standard, + # 1,029 + 162 = 1,191. The model admits only income below it; with real + # income at the standard, SSA's payment is 142 - (1,171 - 1,029) = 0 + # either way. + ia_ssa_federal: 0 + +- name: Case 43, negative self-employment income does not inflate the residential care payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + self_employment_income: -60_000_000 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 38.47 + output: + # Countable earnings floor at 0: SSI 994, participation 864, 1,192.57 - 864. + ia_ssa: 328.57 + +- name: Case 44, SMME income at exactly 120 percent of poverty qualifies under Iowa Code 249.3(4)(g). + period: 2026-04 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 1_596 + output: + # From April, Iowa uses the 2026 guideline (441 IAC 75.1): 1.2 * 15,960 / 12 + # = 1,596; the statute requires income "of at least" 120 percent, so 1,596 + # qualifies. + ia_ssa: 1 + +- name: Case 45, SMME income one cent below 120 percent of poverty. + period: 2026-04 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 1_595.99 + output: + # 1,595.99 is below April's 1.2 * 15,960 / 12 = 1,596, so no SMME. + ia_ssa: 0 + +- name: Case 46, manual example excludes one-third of a child's child support from participation. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + person2: + age: + 2026: 10 + person_id: + 2026: 2 + parent_1_id: + 2026: 1 + # 6-B example: a $1,500 child support payment from an absent parent. + child_support_received: + 2026: 18_000 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent: + members: [person1] + child: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + family: + members: [person1, person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + # SSI countable income 1,500 - 20 = 1,480 exceeds 994, so SSI is 0. + # Iowa: 1,500 - 500 one-third exclusion = 1,000; participation 1,000 - 994 = 6. + # Federal SSI does not yet apply 20 CFR 416.1124(c)(11) (issue 10242). Once + # it does, SSI is 994 - (1,000 - 20) = 14, participation + # 1,000 + 14 - 994 = 20 and ia_ssa 380. + ssi: [0, 0] + ia_ssa_care_countable_income: [0, 1_000] + ia_ssa_ihhrc_participation: [0, 6] + ia_ssa: [0, 394] + +# Iowa Code 249.3(4)(g): income "of at least one hundred twenty percent of the +# federal poverty level" (441 IAC 51.7(6) and 6-B p.77 say "exceed"; the model +# follows the statute). Case 47 is an aged couple with Social Security of +# $1,700 a month each; Cases 48-49 bracket the two-person threshold from April +# 2026 (441 IAC 75.1), 1.2 * (15,960 + 5,680) / 12 = 2,164. +- name: Case 47, an SMME couple's combined income is compared with the two-person guideline. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + social_security_retirement: + 2026: 20_400 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + social_security_retirement: + 2026: 20_400 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # Both spouses are aged, so SSI budgets them as a couple: + # 1,700 + 1,700 - 20 = 3,380 > 1,491, so SSI is 0, and SSI countable + # income is 3,380 / 2 = 1,690 each. + # SMME income combines the couple: 1,690 + 1,690 = 3,380 > 2,164, so each + # covered spouse gets $1. (Half the couple's income, 1,690, would fail.) + ssi_couple_computation_applies: [true, true] + ssi_countable_income: [1_690, 1_690] + ssi: [0, 0] + ia_ssa_smme_countable_income: [3_380, 3_380] + ia_ssa_federal: [0, 0] + ia_ssa: [1, 1] + +- name: Case 48, an SMME couple just above the two-person guideline with one spouse covered. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # Boundary income: $1,093 a month each puts the couple $2 above the + # 2,164 threshold. + social_security_retirement: + 2026: 13_116 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + social_security_retirement: + 2026: 13_116 + ia_ssa_category: SMME + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # SSI: 1,093 + 1,093 - 20 = 2,166 > 1,491, so SSI is 0; 2,166 / 2 = 1,083 + # each. SMME income 1,083 + 1,083 = 2,166 > 2,164. + # Only person1 has the Medicaid and Part B coverage, so only person1 is + # paid. Each spouse's own 1,093 - 20 = 1,073 is below the one-person + # 1,596, so this case pins the combined reading. + ssi_countable_income: [1_083, 1_083] + ssi: [0, 0] + ia_ssa_smme_countable_income: [2_166, 2_166] + ia_ssa: [1, 0] + +- name: Case 49, an SMME couple just below the two-person guideline. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # Boundary income: $1,091 a month each puts the couple $2 below the + # 2,164 threshold. + social_security_retirement: + 2026: 13_092 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + social_security_retirement: + 2026: 13_092 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # SSI: 1,091 + 1,091 - 20 = 2,162 > 1,491, so SSI is 0; 2,162 / 2 = 1,081 + # each. SMME income 1,081 + 1,081 = 2,162 is below 2,164. + ssi_countable_income: [1_081, 1_081] + ssi: [0, 0] + ia_ssa_smme_countable_income: [2_162, 2_162] + ia_ssa: [0, 0] + +# 441 IAC 177.2(1)"f"(3) and 6-B Home Maintenance Allowance (IHHRC) p.43, +# example 2: "Mr. B receives $1,400 in social security benefits; the child +# receives $125." +- name: Case 50, manual IHHRC example deducts the dependent allowance less the child's income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 65 + social_security_retirement: + 2026: 16_800 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + person2: + age: + 2026: 10 + social_security_dependents: + 2026: 1_500 + marital_units: + parent: + members: [person1] + child: + members: [person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # SSI: 1,400 - 20 = 1,380 > 994, so SSI is 0. The child is not aged, + # blind or disabled. + # Dependent allowance: 497 (1,491 - 994) - 125 = 372. + # Participation: 1,400 - 994 - 372 = 34 (6-B p.43); 400 - 34 = 366. + ssi: [0, 0] + ssi_ineligible_child_allocation: [0, 372] + ia_ssa_care_countable_income: [1_400, 125] + ia_ssa_ihhrc_participation: [34, 0] + ia_ssa: [366, 0] + +# 6-B Client Participation for Adults (IHHRC) p.42: "The household consists +# of the recipient, the recipient's spouse, and two children. The spouse has +# earned income of $4,500." +- name: Case 51, manual IHHRC example with a working spouse and two children has no participation. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + person2: + age: + 2026: 40 + employment_income: + 2026: 54_000 + person3: + age: + 2026: 8 + person4: + age: + 2026: 5 + marital_units: + couple: + members: [person1, person2] + child1: + members: [person3] + child2: + members: [person4] + tax_units: + tax_unit: + members: [person1, person2, person3, person4] + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: + 2026: IA + output: + # SSI deems the spouse's 4,500 less 2 * 497 for the children, 3,506, which + # is above 497. (3,506 - 20 - 65) / 2 = 1,710.50 > 1,491, so SSI is 0. + # Care income: (4,500 - 65) / 2 = 2,217.50, the spouse's own earnings + # under the same exclusions. + # Participation: 2,217.50 - 1,491 = 726.50; 726.50 - 994 < 0, so 0 + # (6-B p.42), and the full 400 cost is paid. + ssi: [0, 0, 0, 0] + ssi_ineligible_child_allocation: [0, 0, 497, 497] + ia_ssa_care_countable_income: [2_217.5, 2_217.5, 0, 0] + ia_ssa_ihhrc_participation: [0, 0, 0, 0] + ia_ssa: [400, 0, 0, 0] + +# 441 IAC 52.1(3)"a"(6) and 6-B First-Month Client Participation p.63: "deduct +# the SSI benefit rate for one person from the client's countable income". +- name: Case 52, a resident entering from home keeps income up to the SSI individual rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + social_security_retirement: + 2026: 16_800 + ia_ssa_category: RESIDENTIAL_CARE + # Entry on January 7: the day of entry through January 31. + ia_ssa_care_partial_month_days: 25 + ia_ssa_care_initial_partial_month: true + output: + # SSI: 1,400 - 20 = 1,380 > 994, so SSI is 0. + # Participation: 1,400 - 130 - 994 = 276. + # No facility rate is entered, so the 38.47 maximum applies: + # 38.47 * 25 = 961.75; 961.75 - 276 = 685.75. + ssi: 0 + ia_ssa_care_countable_income: 1_400 + ia_ssa: 685.75 + +# 441 IAC 52.1(3)"a"(6) and 6-B p.64: "If the client had a spouse living in +# the home in the partial month before entry, deduct the SSI benefit rate for a +# married couple". +- name: Case 53, a resident entering from a home shared with a spouse keeps income up to the SSI couple rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + social_security_retirement: + 2026: 20_400 + ia_ssa_category: RESIDENTIAL_CARE + # Entry on January 7: the day of entry through January 31. + ia_ssa_care_partial_month_days: 25 + ia_ssa_care_initial_partial_month: true + person2: + age: + 2026: 60 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # The spouse is not aged, blind or disabled and has no income, so there is + # no couple computation and nothing is deemed. + # SSI: 1,700 - 20 = 1,680 > 994, so SSI is 0. + # Participation: 1,700 - 130 - 1,491 = 79; 38.47 * 25 = 961.75; + # 961.75 - 79 = 882.75. Without the entry-month flag, + # 1,700 - 130 = 1,570 covers the 961.75 and nothing is paid. + ssi_couple_computation_applies: [false, false] + ssi: [0, 0] + ia_ssa_care_countable_income: [1_700, 0] + ia_ssa: [882.75, 0] + +# 441 IAC 51.5(2) and 6-B Resources p.12: "$3,000 for a married couple living +# together"; "When the applicant is living with a spouse, count the spouse's +# resources." +- name: Case 54, an in-home care couple within the couple resource limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 65 + ssi_countable_resources: + 2026: 2_500 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + person2: + age: + 2026: 50 + ssi_countable_resources: + 2026: 400 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # Resources: 2,500 + 400 = 2,900 <= 3,000, so person1 is eligible; the + # spouse is not aged, blind or disabled. + # SSI is 994 (20 CFR 416.1205 also counts the spouse's resources against + # 3,000). Care income 994 - 1,491 < 0, so participation is 0 and the 400 + # cost is paid. + ssi: [994, 0] + ia_ssa_eligible: [true, false] + ia_ssa_ihhrc_participation: [0, 0] + ia_ssa: [400, 0] + +- name: Case 55, an in-home care couple over the couple resource limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 65 + ssi_countable_resources: + 2026: 2_500 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + person2: + age: + 2026: 50 + ssi_countable_resources: + 2026: 600 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # Resources: 2,500 + 600 = 3,100 > 3,000, so neither SSI nor the Iowa + # supplement is payable. + ssi: [0, 0] + ia_ssa_eligible: [false, false] + ia_ssa: [0, 0] + +- name: Case 56, RCF with an entered facility rate below the maximum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_rcf_daily_rate: 35 + output: + # A lower facility rate is used as entered: 35 * 31 = 1,085; + # SSI 994, participation 994 - 130 = 864; 1,085 - 864 = 221. + ia_ssa: 221 + +# 6-B Resource and Income Guidelines for Married Couples pp.60-61 and Client +# Participation pp.68-71: spouses who received SSI are a couple in the month +# one enters a residential care facility and individuals from the month after. +- name: Case 57, manual example where a resident whose spouse stays home is budgeted alone after the entry month. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + # 6-B p.69 Mr. K: Social Security of $175 a month. + social_security_retirement: 2_100 + ia_ssa_category: + 2026-03: RESIDENTIAL_CARE + 2026-04: RESIDENTIAL_CARE + # 6-B gives only the month; entry is taken as March 10, so March 10 + # through 31 are covered. + ia_ssa_care_partial_month_days: + 2026-03: 22 + ia_ssa_care_initial_partial_month: + 2026-03: true + person2: + age: 70 + # Mrs. K: Social Security of $100 a month. + social_security_retirement: 1_200 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IA + output: + # March: SSI couple 1,491 - (275 - 20) = 1,236. Care income + # (275 + 1,236) / 2 = 755.50 each; entry deduction 1,491 / 2 = 745.50; + # participation max(755.50 - 130 - 745.50, 0) = 0 (6-B p.69: "$ 0 Client + # participation for month of entry"); 38.47 * 22 = 846.34. + # April: Mr. K's SSI as an individual is 994 - (175 - 20) = 839; care + # income 175 + 839 = 1,014; participation 1,014 - 130 = 884 (6-B p.70); + # 38.47 * 30 = 1,154.10 - 884 = 270.10. + ia_ssa_rcf_couple_budget: + 2026-03: [true, false] + 2026-04: [false, false] + ia_ssa: + 2026-03: [846.34, 0] + 2026-04: [270.1, 0] + +# 441 IAC 51.4(3) and 6-B Spouses Sharing a Room p.61: "After the month of +# entry, treat the spouses as individuals when determining eligibility and +# client participation." +- name: Case 58, spouses sharing a room are budgeted as individuals after the entry month. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # Reviewer example: Social Security of $1,500 a month. + social_security_retirement: + 2026: 18_000 + ia_ssa_category: RESIDENTIAL_CARE + person2: + age: + 2026: 70 + # Reviewer example: Social Security of $500 a month. + social_security_retirement: + 2026: 6_000 + ia_ssa_category: RESIDENTIAL_CARE + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # January is not the month of entry, so each spouse is budgeted alone. + # person1: own SSI 1,500 - 20 = 1,480 > 994, so 0; participation + # 1,500 - 130 = 1,370 covers 38.47 * 31 = 1,192.57. + # person2: own SSI 994 - (500 - 20) = 514; care income 500 + 514 = 1,014; + # participation 884; 1,192.57 - 884 = 308.57. + ia_ssa_care_countable_income: [1_500, 1_014] + ia_ssa: [0, 308.57] + +# 441 IAC 51.4(3): "Partners in a marriage who both enter the same room of the +# residential care facility in the same month will be income eligible for the +# initial month when their combined income ... is less than twice the amount of +# allowed income for one person". +- name: Case 59, spouses entering the same room in the same month are budgeted as a couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # Reviewer example: Social Security of $1,500 a month. + social_security_retirement: + 2026: 18_000 + ia_ssa_category: RESIDENTIAL_CARE + # Both spouses enter on January 10: January 10 through 31. + ia_ssa_care_partial_month_days: 22 + ia_ssa_care_initial_partial_month: true + person2: + age: + 2026: 70 + # Reviewer example: Social Security of $500 a month. + social_security_retirement: + 2026: 6_000 + ia_ssa_category: RESIDENTIAL_CARE + ia_ssa_care_partial_month_days: 22 + ia_ssa_care_initial_partial_month: true + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # Neither spouse receives SSI, but both enter this month, so the couple is + # budgeted together. SSI couple: 2,000 - 20 = 1,980 > 1,491, so no SSI. + # Care income 2,000 / 2 = 1,000 each; entry deduction 1,491 / 2 = 745.50; + # participation 1,000 - 130 - 745.50 = 124.50 each; + # 38.47 * 22 = 846.34; 846.34 - 124.50 = 721.84. + ia_ssa_rcf_couple_budget: [true, true] + ia_ssa_care_countable_income: [1_000, 1_000] + ia_ssa: [721.84, 721.84] + +# 6-B p.60: "When neither spouse is receiving SSI before the entry of one or +# both into an RCF, treat the spouses separately beginning in the month of +# entry"; p.61: the resident "must now apply for and accept SSI benefits". +- name: Case 60, manual example where spouses without SSI are budgeted separately from the entry month. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + # 6-B p.68 Mr. B: Social Security of $890 a month. + social_security_retirement: 10_680 + ia_ssa_category: + 2026-05: RESIDENTIAL_CARE + 2026-06: RESIDENTIAL_CARE + # 6-B gives only the month; entry is taken as May 12, so May 12 + # through 31 are covered. + ia_ssa_care_partial_month_days: + 2026-05: 20 + ia_ssa_care_initial_partial_month: + 2026-05: true + person2: + age: 70 + # Mrs. B: Social Security of $870 a month. + social_security_retirement: 10_440 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IA + output: + # May: the couple's SSI income 1,760 - 20 = 1,740 > 1,491, so no SSI and + # no couple budget. Care income 890; entry deduction 1,491 (spouse at + # home); participation max(890 - 130 - 1,491, 0) = 0; 38.47 * 20 = 769.40. + # June: SSI as an individual 994 - (890 - 20) = 124; care income 1,014; + # participation 884; 38.47 * 30 = 1,154.10 - 884 = 270.10. + ia_ssa_rcf_couple_budget: + 2026-05: [false, false] + 2026-06: [false, false] + ia_ssa: + 2026-05: [769.4, 0] + 2026-06: [270.1, 0] + +# 6-B Resources p.12: "When the applicant is not living with the spouse, do not +# count the spouse's resources." +- name: Case 61, a resident's resources are tested alone after the entry month. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # $2,500 of resources, the reviewer's figure in Cases 54-55. + ssi_countable_resources: + 2026: 2_500 + ia_ssa_category: RESIDENTIAL_CARE + person2: + age: + 2026: 70 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # January is not the month of entry, so person1's own 2,500 is tested + # against the 2,000 individual limit and fails. person2, at home, owns + # nothing and passes either way: tested alone under p.12, or pooled, as + # the model still pools a spouse in an ordinary arrangement (2,500 within + # the 3,000 couple limit) because federal SSI keeps the couple. + ia_ssa_eligible: [false, true] + ia_ssa: [0, 0] + +# 441 IAC 52.1(3)"a"(1) deducts "impairment-related work expenses, as defined +# by SSI plus $65 plus one-half of any remaining earned income"; 6-B p.65 Mr. L +# has earnings of $333 and expenses of $100. +- name: Case 62, a resident without SSI enters impairment-related work expenses at one-half. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Mr. L's $700 of Social Security would qualify him for SSI, so $1,100 a + # month is used for a resident who receives none. + social_security_retirement: + 2026: 13_200 + # Mr. L: earned income of $333 a month. + employment_income: + 2026: 3_996 + ia_ssa_category: RESIDENTIAL_CARE + # One-half of Mr. L's $100 of impairment-related work expenses. + ia_ssa_care_additional_deductions: 50 + output: + # SSI: (1,100 - 20) + (333 - 65) / 2 = 1,214 > 994, so SSI is 0. + # Rule: 1,100 + (333 - 100 - 65) / 2 = 1,184; 1,184 - 130 = 1,054. + # Model: care income 1,100 + 134 = 1,234; 1,234 - 130 - 50 = 1,054. + # 1,192.57 - 1,054 = 138.57. + ssi: 0 + ia_ssa_care_countable_income: 1_234 + ia_ssa: 138.57 + +# 6-B Making the Family-Life Home Payment p.35: "For a recipient who has only +# SSI and no other income (and hence no $20 to disregard), an additional $20 +# payment is necessary". +- name: Case 63, a family-life home resident whose only other income is interest gets the 20 dollar payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Reviewer example: $5 a month of interest on savings. + interest_income: + 2026: 60 + ia_ssa_category: FAMILY_LIFE_HOME + output: + # Interest is excluded under 416.1124(c)(22), so only SSI is received: + # SSA pays 142 and the state pays 20. + ssi: 994 + ia_ssa_federal: 142 + ia_ssa: 162 + +- name: Case 64, a family-life home resident with 10 dollars of Social Security gets no 20 dollar payment. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Reviewer example: $10 a month of other income. + social_security_retirement: + 2026: 120 + ia_ssa_category: FAMILY_LIFE_HOME + output: + # SSI 994 (the $20 exclusion covers the $10). Care income 10 + 994 = 1,004 + # is below 1,156, so SSA pays 142; other income rules out the state's $20. + ssi: 994 + ia_ssa_care_countable_income: 1_004 + ia_ssa_federal: 142 + ia_ssa: 142 + +- name: Case 65, without marital units an in-home care parent is not paired with an adult child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # Reviewer example: Social Security of $800 a month and a $400 cost. + social_security_retirement: + 2026: 9_600 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + person2: + # A variant of the reviewer's adult child: a 22-year-old full-time + # student earning $1,000 a month. + age: + 2026: 22 + is_full_time_student: + 2026: true + employment_income: + 2026: 12_000 + is_tax_unit_dependent: + 2026: true + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # The child is the parent's tax dependent, so SSI's spouse test does not + # pair them and the parent gets the individual allowance. The model's + # SSI child test (is_child) covers only children under 18, so the + # 22-year-old student gets no dependent-child allowance. + # SSI 994 - (800 - 20) = 214; care income 800 + 214 = 1,014; + # participation 1,014 - 994 = 20; 400 - 20 = 380. + ia_ssa_has_spouse: [false, false] + ssi: [214, 0] + ia_ssa_ihhrc_participation: [20, 0] + ia_ssa: [380, 0] + +# SI 02001.005 and SI 02001.010: SSA drops digits beyond the third decimal, +# rounds up to the cent and pays at least $1. +- name: Case 66, a blind supplement of 50 cents is paid at the 1 dollar minimum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: + 2026: true + # Reviewer example: Social Security of $1,035.50 a month. + social_security_retirement: + 2026: 12_426 + output: + # 1,035.50 - 20 = 1,015.50 > 994, so SSI is 0; 994 + 22 - 1,015.50 = 0.50. + ssi: 0 + ia_ssa_federal: 1 + ia_ssa: 1 + +- name: Case 67, a blind supplement is rounded up to the cent. + period: 2026-01 + absolute_error_margin: 0.001 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: + 2026: true + # Reviewer boundary income: 1,030.445 a month. + social_security_retirement: + 2026: 12_365.34 + output: + # 1,030.445 - 20 = 1,010.445; 1,016 - 1,010.445 = 5.555, rounded up to 5.56. + ia_ssa_federal: 5.56 + ia_ssa: 5.56 + +# 6-B Verification p.9: "For an SSI recipient, accept the Social Security +# Administration's determination of SSI eligibility as verification that +# income, resources, and age, blindness or disability requirements have been +# met." 20 CFR 416.1202(b)(2) waives parental resource deeming for some +# children in Medicaid home care. +- name: Case 68, a blind SSI child exempt from parental resource deeming keeps the blind supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + # Reviewer example: two parents with $6,000. + bank_account_assets: + 2026: 6_000 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + is_blind: + 2026: true + ssi_resource_deeming_waiver: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: + 2026: IA + output: + # SSA deems nothing under the waiver and pays 994; Iowa accepts it, so the + # child's resources are 0 and the 22 blind supplement is paid. + is_ssi_resource_deeming_child: [false, false, false] + ssi: [0, 0, 994] + ia_ssa_resources_deemed_from_parents: [0, 0, 0] + ia_ssa: [0, 0, 22] + +# 441 IAC 51.4(3): income eligible when income "is less than 31 times the +# maximum per diem rate". +- name: Case 69, residential care participation equal to the month's cost pays nothing. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Boundary income: 1,322.57 a month, where participation equals the cost. + social_security_retirement: + 2026: 15_870.84 + ia_ssa_category: RESIDENTIAL_CARE + output: + # Participation 1,322.57 - 130 = 1,192.57 = 38.47 * 31, so nothing is paid. + ssi: 0 + ia_ssa: 0 + +# 6-B Income (DP) p.25: group income "must be less than the applicable +# assistance standard", 994 + 518 = 1,512 for one person. +- name: Case 70, dependent-person group income one cent below the standard pays the 1 dollar minimum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Reviewer boundary income: 1,531.99 a month. + social_security_retirement: + 2026: 18_383.88 + ia_ssa_category: DEPENDENT_PERSON + output: + # 1,531.99 - 20 = 1,511.99 < 1,512; 518 - (1,511.99 - 994) = 0.01, paid at $1. + ssi: 0 + ia_ssa_federal: 1 + ia_ssa: 1 + +- name: Case 71, dependent-person group income at the standard is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Social Security of $1,492 a month, so SSI countable income is 1,472. + social_security_retirement: + 2026: 17_904 + ia_ssa_category: DEPENDENT_PERSON + ia_ssa_dependent_countable_income: 40 + output: + # Group income 1,472 + 40 = 1,512 is not less than the 994 + 518 = 1,512 + # standard (6-B p.25, "less than"), so nothing is paid. Without the gate + # the supplement would be 518 - (1,472 - 994) = 40. + ssi: 0 + ia_ssa_federal: 0 + ia_ssa: 0 + +# Iowa Code 249.3(4)(a) names a person 65 or older or disabled; 441 IAC 51.7(2) +# requires "all eligibility requirements for supplemental security income +# benefits other than limits on substantial gainful activity and income", which +# include blindness (6-B pp.10, 76). The model follows the statute. +- name: Case 72, a blind SMME applicant under 65 who is not disabled does not qualify under Iowa Code 249.3(4)(a). + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 50 + is_blind: + 2026: true + # A pension of $2,020 a month, above the blind SSI limit and 120 percent + # of poverty. + pension_income: + 2026: 24_240 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + output: + # SSI countable income 2,020 - 20 = 2,000 exceeds both 994 and the blind + # limit of 1,016, so SSI and the blind supplement are 0. Iowa Code + # 249.3(4)(a) admits only a person 65 or older or disabled, so this blind + # 50-year-old gets no SMME. + ssi: 0 + ia_ssa_federal: 0 + ia_ssa_nonfinancial_eligible: false + ia_ssa: 0 + +- name: Case 73, manual example of an SSI resident with an ineligible working spouse after the entry month. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + # 6-B p.67 Mr. A: Social Security of $200 a month. + social_security_retirement: 2_400 + ia_ssa_category: + 2026-06: RESIDENTIAL_CARE + 2026-07: RESIDENTIAL_CARE + # 6-B gives only the month; entry is taken as June 15, so June 15 + # through 30 are covered. + ia_ssa_care_partial_month_days: + 2026-06: 16 + ia_ssa_care_initial_partial_month: + 2026-06: true + # 6-B p.68: "Diversion for Mrs. A (994 - 457.50 ...)". + ia_ssa_care_additional_deductions: + 2026-07: 536.5 + person2: + age: 60 + # Mrs. A: earnings of $1,000 a month. + employment_income: 12_000 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IA + output: + # June: SSI with spousal deeming 1,491 - 647.50 = 843.50 (6-B p.67). Mrs. A + # is not aged, blind or disabled, so there is no couple budget. Care income + # 200 + 843.50 = 1,043.50; entry deduction 1,491 (spouse at home); + # participation max(1,043.50 - 130 - 1,491, 0) = 0, as on p.67; + # 38.47 * 16 = 615.52. First-month deemed spouse income is not modeled. + # July: SSI as an individual 994 - (200 - 20) = 814 (6-B p.68); care + # income 1,014; participation 1,014 - 130 - 536.50 = 347.50 (6-B p.68); + # 38.47 * 31 = 1,192.57 - 347.50 = 845.07. + ssi: + 2026-06: [843.5, 0] + ia_ssa: + 2026-06: [615.52, 0] + 2026-07: [845.07, 0] + +# 20 CFR 416.1124(c)(22) excludes "Interest and dividend income from a +# countable resource"; Manual 8-E Dividends p.23 and Interest Income p.36. +- name: Case 74, a resident's interest is excluded from care income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + # Reviewer example: $5 a month of interest on savings. + interest_income: + 2026: 60 + ia_ssa_category: RESIDENTIAL_CARE + output: + # SSI: the $20 general exclusion covers the $5, so SSI is 994. Care income + # 0 + 994 = 994; participation 864; 1,192.57 - 864 = 328.57. + ssi: 994 + ia_ssa_care_countable_income: 994 + ia_ssa: 328.57 + +# 6-B Deeming Parents' Resources p.47 Child B: "$ 5,500 Parent's resources - +# 3,000 Exempt $ 2,500 Deemed to Child B". +- name: Case 75, without marital units parental resources are still deemed to an in-home care child. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 5_500 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: + 2026: IA + output: + # The three people share one default marital unit, which is not a couple. + # The parent links give two parents, so the allowance is 3,000: + # 5,500 - 3,000 = 2,500 deemed to the child exceeds 2,000. + ia_ssa_resources_deemed_from_parents: [0, 0, 2_500] + ia_ssa: [0, 0, 0] + +- name: Case 76, a blind SMME applicant under 65 who is also disabled qualifies. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 50 + is_blind: + 2026: true + meets_ssi_disability_criteria: + 2026: true + # SSDI of $2,020 a month, above the SSI limits and 120 percent of poverty. + social_security_disability: + 2026: 24_240 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + output: + # Disabled under 42 U.S.C. 1382c(a)(3), so 249.3(4)(a) is met. SMME income + # 2,020 - 20 = 2,000 exceeds January's 1.2 * 15,650 / 12 = 1,565. + ssi: 0 + ia_ssa_federal: 0 + ia_ssa_smme_countable_income: 2_000 + ia_ssa: 1 + +- name: Case 77, a disabled SMME applicant working above the SGA level still qualifies. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Reviewer example: SSDI of $900 and wages of $2,000 a month, above the + # 2026 SGA level of $1,690. + social_security_disability: + 2026: 10_800 + employment_income: + 2026: 24_000 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + output: + # SGA bars SSI disability, but Iowa Code 249.3(4)(a)(2) says it "shall not + # preclude a determination of disability" for SMME. SMME income + # (900 - 20) + (2,000 - 65) / 2 = 1,847.50 is at least January's 1,565. + ssi_engaged_in_sga: true + is_ssi_disabled: false + ssi: 0 + ia_ssa_smme_countable_income: 1_847.5 + ia_ssa: 1 + +# 441 IAC 75.1 revises the federal poverty level "annually on April 1", so +# January-March use the prior year's guideline: 1.2 * 15,650 / 12 = 1,565 for +# one person and 1.2 * (15,650 + 5,500) / 12 = 2,115 for two (RC-0130). +- name: Case 78, in January SMME income at the prior year's 120 percent qualifies. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 1_565 + output: + ia_ssa: 1 + +- name: Case 79, in January SMME income one cent below the prior year's 120 percent. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 1_564.99 + output: + ia_ssa: 0 + +- name: Case 80, in January an SMME couple is compared with the prior year's two-person guideline. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # $1,068 a month each. + social_security_retirement: + 2026: 12_816 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + social_security_retirement: + 2026: 12_816 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 1,068 + 1,068 - 20 = 2,116 > 1,491, so no SSI. 2,116 is at least + # January's 2,115, though below April's 2,164. + ia_ssa_smme_countable_income: [2_116, 2_116] + ia_ssa: [1, 1] + +# 6-B Income (SMME) p.77 follows SSI income criteria, and 8-E p.12 processes an +# applicant "as a one-person household" when SSI deems nothing from a spouse. +# So the two-person guideline applies only when SMME income includes a +# spouse's income. +- name: Case 81, an SMME couple budgeted separately because one spouse is in a medical facility. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + social_security_retirement: + 2026: 20_400 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + social_security_retirement: + 2026: 20_400 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 20 CFR 416.414(b)(3) computes the spouses separately, so each one's + # 1,700 - 20 = 1,680 is compared with the one-person 1,596. + ssi_couple_computation_applies: [false, false] + ia_ssa_smme_countable_income: [1_680, 1_680] + ia_ssa: [1, 1] + +- name: Case 82, a spouse's wages are deemed to an SMME applicant working above the SGA level. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Case 77's worker: SSDI of $900 and wages of $2,000 a month. + social_security_disability: + 2026: 10_800 + employment_income: + 2026: 24_000 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 45 + # A spouse earning $1,000 a month. + employment_income: + 2026: 12_000 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 8-E pp.12-13: the spouse's 1,000 is more than 1,491 - 994 = 497, so it + # is deemed: (900 - 20) + (2,000 + 1,000 - 65) / 2 = 2,347.50, at least the + # two-person 2,164. person2's own income is (1,000 - 20 - 65) / 2 = 457.50. + ia_ssa_smme_spousal_deeming_applies: [true, false] + ia_ssa_smme_countable_income: [2_347.5, 457.5] + ia_ssa: [1, 0] + +- name: Case 83, SSI deems nothing from a spouse with a 497 dollar pension, so the one-person guideline applies. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + # $1,620 a month. + social_security_retirement: + 2026: 19_440 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 60 + # $497 a month, the SSI couple rate less the individual rate. + pension_income: + 2026: 5_964 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 497 is not more than 1,491 - 994 = 497, so SSI deems nothing and 8-E + # p.12 processes person1 "as a one-person household": 1,620 - 20 = 1,600 is + # at least 1,596. + is_ssi_spousal_deeming_applies: [false, false] + ia_ssa_smme_countable_income: [1_600, 477] + ia_ssa: [1, 0] + +- name: Case 84, SSI deems a spouse's 498 dollar pension, so the two-person guideline applies. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 70 + social_security_retirement: + 2026: 19_440 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 60 + # $498 a month. + pension_income: + 2026: 5_976 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 498 > 497, so SSI deems the spouse's income: 1,620 + 498 - 20 = 2,098, + # below the two-person 2,164. + is_ssi_spousal_deeming_applies: [true, false] + ia_ssa_smme_countable_income: [2_098, 478] + ia_ssa: [0, 0] + +- name: Case 85, a residential care couple pools resources in the month of entry only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + # Case 57's Mr. K, with resources of $2,100. + social_security_retirement: 2_100 + ssi_countable_resources: 2_100 + ia_ssa_category: + 2026-03: RESIDENTIAL_CARE + 2026-04: RESIDENTIAL_CARE + ia_ssa_care_partial_month_days: + 2026-03: 22 + ia_ssa_care_initial_partial_month: + 2026-03: true + person2: + age: 70 + social_security_retirement: 1_200 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IA + output: + # 6-B p.60: "treat the spouses as a couple during the month of entry", so + # March tests 2,100 against the $3,000 couple limit (p.12). From April the + # resident is tested alone, and 2,100 is over $2,000. + ia_ssa_rcf_couple_budget: + 2026-03: [true, false] + 2026-04: [false, false] + ia_ssa_eligible: + 2026-03: [true, true] + 2026-04: [false, true] + ia_ssa: + 2026-03: [846.34, 0] + 2026-04: [0, 0] + +- name: Case 86, residential care in January 2025 uses General Letter 6-B-46's levels. + period: 2025-01 + absolute_error_margin: 0.01 + input: + state_code: + 2025: IA + age: + 2025: 65 + ia_ssa_category: RESIDENTIAL_CARE + output: + # 38.47 is the 2026 rate; GL 6-B-46 sets $37.60 a day and a $126 allowance + # for 2025. 37.60 * 31 = 1,165.60; SSI 967, participation 967 - 126 = 841; + # 1,165.60 - 841 = 324.60. + ia_ssa: 324.6 + +- name: Case 87, an SMME student working above the SGA level keeps SSI's student earned income exclusion. + period: 2026-04 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 20 + is_full_time_student: + 2026: true + meets_ssi_disability_criteria: + 2026: true + # Reviewer example: SSDI of $900 and wages of $2,000 a month. + social_security_disability: + 2026: 10_800 + employment_income: + 2026: 24_000 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + output: + # 20 CFR 416.1112(c)(3): min(min(2,410, 2,000) * 12, 9,730) = 9,730 a + # year, or 810.83 a month. SMME income 880 + (2,000 - 810.83 - 65) / 2 = + # 1,442.08 is below 1,596. + ia_ssa_smme_countable_income: 1_442.08 + ia_ssa: 0 + +- name: Case 88, an SMME worker above the SGA level counts outside shelter support. + period: 2026-04 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 40 + meets_ssi_disability_criteria: + 2026: true + # Reviewer example: SSDI of $500 and wages of $1,700 a month, with + # shelter paid by someone outside the household. + social_security_disability: + 2026: 6_000 + employment_income: + 2026: 20_400 + ssi_receives_outside_shelter_support: + 2026: true + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + output: + # 416.1130 and 416.1140: the presumed maximum value 994 / 3 + 20 = 351.33 + # counts as unearned income. (851.33 - 20) + (1,700 - 65) / 2 = 1,648.83 + # is at least 1,596. + ia_ssa_smme_countable_income: 1_648.83 + ia_ssa: 1 + +- name: Case 89, in March SMME income at the prior year's 120 percent still qualifies. + period: 2026-03 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + ia_ssa_smme_countable_income: 1_565 + output: + # 1.2 * 15,650 / 12 = 1,565 until April (441 IAC 75.1; RC-0130 Rev. 04/25). + ia_ssa: 1 + +- name: Case 90, a spouse's wages deemed to an SMME applicant working above the SGA level reach the two-person guideline. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Wages of $1,700 a month, above the $1,690 SGA level. + employment_income: + 2026: 20_400 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 45 + # Wages of $3,000 a month. + employment_income: + 2026: 36_000 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 8-E pp.12-13 deem the spouse's 3,000: (1,700 + 3,000 - 20 - 65) / 2 = + # 2,307.50, at least the two-person 2,164. person2's own income is + # (3,000 - 20 - 65) / 2 = 1,457.50. + ia_ssa_smme_countable_income: [2_307.5, 1_457.5] + ia_ssa: [1, 0] + +- name: Case 91, a spouse's wages deemed to an SMME applicant working above the SGA level leave income below the two-person guideline. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Wages of $3,277 a month. + employment_income: + 2026: 39_324 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 45 + # Wages of $600 a month. + employment_income: + 2026: 7_200 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # The spouse's 600 is more than 497, so it is deemed: (3,277 + 600 - 20 - + # 65) / 2 = 1,896, below the two-person 2,164 (own income alone, 1,596, + # would qualify). person2's own income is (600 - 85) / 2 = 257.50. + ia_ssa_smme_countable_income: [1_896, 257.5] + ia_ssa: [0, 0] + +- name: Case 92, nothing is deemed from a spouse with a 497 dollar pension to an SMME applicant working above the SGA level. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Case 77's worker: SSDI of $900 and wages of $2,000 a month. + social_security_disability: + 2026: 10_800 + employment_income: + 2026: 24_000 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 45 + # A pension of $497 a month and no wages. + pension_income: + 2026: 5_964 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 497 is not more than 1,491 - 994 = 497, so nothing is deemed and the + # one-person 1,596 applies to 1,847.50. person2's own income is 497 - 20 = 477. + ia_ssa_smme_spousal_deeming_applies: [false, false] + ia_ssa_smme_countable_income: [1_847.5, 477] + ia_ssa: [1, 0] + +- name: Case 93, residential care in January 2024 uses General Letter 6-B-45's levels. + period: 2024-01 + absolute_error_margin: 0.01 + input: + state_code: + 2024: IA + age: + 2024: 70 + ia_ssa_category: RESIDENTIAL_CARE + output: + # GL 6-B-45 sets $36.82 a day and a $123 allowance for 2024. 36.82 * 31 = + # 1,141.42; SSI 943, participation 943 - 123 = 820; 1,141.42 - 820 = 321.42. + ia_ssa: 321.42 + +- name: Case 94, a child's allocation comes off a spouse's pension first and then wages before deeming to an SMME applicant working above the SGA level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Wages of $1,700 a month, above the $1,690 SGA level. + employment_income: + 2026: 20_400 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 45 + # A pension of $200 and wages of $2,880 a month. + pension_income: + 2026: 2_400 + employment_income: + 2026: 34_560 + person3: + age: + 2026: 10 + marital_units: + couple: + members: [person1, person2] + child: + members: [person3] + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: + 2026: IA + output: + # 8-E steps 1-3: the child's 497 allocation takes the spouse's 200 of + # pension and 297 of wages, leaving 2,880 - 297 = 2,583 > 497 to deem. + # (1,700 + 2,583 - 20 - 65) / 2 = 2,099, below January's two-person 2,115. + # person2's own income is (200 - 20) + (2,880 - 65) / 2 = 1,587.50. + ssi_ineligible_child_allocation: [0, 0, 497] + ia_ssa_smme_spousal_deeming_applies: [true, false, false] + ia_ssa_smme_countable_income: [2_099, 1_587.5, 0] + ia_ssa: [0, 0, 0] + +- name: Case 95, a spouse's 497.01 dollar pension is deemed to an SMME applicant working above the SGA level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + # Case 77's worker: SSDI of $900 and wages of $2,000 a month. + social_security_disability: + 2026: 10_800 + employment_income: + 2026: 24_000 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 45 + # A pension of $497.01 a month and no wages. + pension_income: + 2026: 5_964.12 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 497.01 is more than 1,491 - 994 = 497, so the pension is deemed as + # unearned income: (900 + 497.01 - 20) + (2,000 - 65) / 2 = 2,344.51, at + # least January's two-person 2,115. person2's own income is 497.01 - 20. + ia_ssa_smme_spousal_deeming_applies: [true, false] + ia_ssa_smme_countable_income: [2_344.51, 477.01] + ia_ssa: [1, 0] + +- name: Case 96, nothing is deemed to an SMME applicant working above the SGA level from a spouse who lives in a medical facility. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + employment_income: + 2026: 39_324 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + pension_income: + 2026: 6_240 + ssi_lives_in_medical_treatment_facility: true + ssi_medicaid_pays_majority_of_care: true + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 20 CFR 416.1167(a)(1); 8-E p.11-12 "same household": the spouse's 520 + # pension is not deemed. person1's own income is (3,277 - 20 - 65) / 2 = + # 1,596, at least the one-person 1,596 (with deeming it would be 2,106, + # below the two-person 2,164). person2's 2,106 comes from SSI's federal + # deeming, which does not yet apply 20 CFR 416.1163(f)(5). + ia_ssa_smme_spousal_deeming_applies: [false, false] + ia_ssa_smme_countable_income: [1_596, 2_106] + ia_ssa: [1, 0] + +- name: Case 97, an aged spouse is not an ineligible spouse, so an SMME applicant working above the SGA level is budgeted as a couple. + period: 2026-04 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 50 + meets_ssi_disability_criteria: + 2026: true + employment_income: + 2026: 39_324 + ia_ssa_category: SMME + ia_ssa_smme_coverage_eligible: true + person2: + age: + 2026: 70 + social_security_retirement: + 2026: 4_800 + marital_units: + couple: + members: [person1, person2] + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: + 2026: IA + output: + # 8-E p.12: an ineligible spouse is "not eligible for SSI or + # non-MAGI-related Medicaid, or State Supplementary Assistance". The + # spouse is aged, so the couple's income is combined with no $497 test: + # (400 - 20) + (3,277 - 65) / 2 = 1,986 < 2,164. Alone, 1,596 would + # qualify against the one-person 1,596. + ia_ssa_smme_spousal_deeming_applies: [true, false] + ia_ssa_smme_countable_income: [1_986, 1_986] + ia_ssa: [0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_income_deemed_from_parents.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_income_deemed_from_parents.yaml new file mode 100644 index 00000000000..61578c9b75a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_income_deemed_from_parents.yaml @@ -0,0 +1,310 @@ +# Iowa 6-B in-home health-related care parental income deeming worked examples. +- name: Case 1, manual example of a mother with unemployment benefits only. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + # 6-B example: unemployment benefits of $1,050 a month. + unemployment_compensation: + 2026: 12_600 + person2: + age: + 2026: 10 + person_id: + 2026: 2 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent: + members: [person1] + child: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + family: + members: [person1, person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + # Iowa: 1,050 - 994 SSI allowance for the mother = 56 deemed. + # SSI deems 1,050 - 20 - 994 = 36, less the child's 20 exclusion: 994 - 16 = 978. + # Participation 56 + 978 - 994 = 40, so 400 - 40 = 360 is paid. + ia_ssa_income_deemed_from_parents: [0, 56] + ssi: [0, 978] + people: + person2: + ia_ssa_care_countable_income: 1_034 + ia_ssa_ihhrc_participation: 40 + ia_ssa: [0, 360] + +- name: Case 2, manual D family example with earnings only and two ineligible siblings. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + # 6-B example: Mr. D has earnings of $4,200 a month. + employment_income_before_lsr: + 2026: 50_400 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 8 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + person5: + age: + 2026: 8 + person_id: + 2026: 5 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + marital_units: + parents: + members: [person1, person2] + child1: + members: [person3] + child2: + members: [person4] + child3: + members: [person5] + families: + family: + members: [person1, person2, person3, person4, person5] + tax_units: + family: + members: [person1, person2, person3, person4, person5] + spm_units: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: + 2026: IA + output: + # Iowa: 4,200 - 65 - 2,982 (double the couple allowance) - 2 * 497 = 159. + # SSI deems (4,200 - 994 - 85) / 2 - 1,491 = 69.50, less 20: 994 - 49.50 = 944.50. + # Participation 159 + 944.50 - 994 = 109.50, so 400 - 109.50 = 290.50 is paid. + ia_ssa_income_deemed_from_parents: [0, 0, 159, 0, 0] + ssi: [0, 0, 944.5, 0, 0] + people: + person3: + ia_ssa_care_countable_income: 1_103.5 + ia_ssa_ihhrc_participation: 109.5 + ia_ssa: [0, 0, 290.5, 0, 0] + +- name: Case 3, manual E family example with siblings who have Social Security income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + # 6-B example: Mr. E has earnings of $4,000 a month. + employment_income_before_lsr: + 2026: 48_000 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 8 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + # 6-B example: each ineligible child has $150 a month of Social Security. + social_security_dependents: + 2026: 1_800 + person5: + age: + 2026: 8 + person_id: + 2026: 5 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + social_security_dependents: + 2026: 1_800 + marital_units: + parents: + members: [person1, person2] + child1: + members: [person3] + child2: + members: [person4] + child3: + members: [person5] + families: + family: + members: [person1, person2, person3, person4, person5] + tax_units: + family: + members: [person1, person2, person3, person4, person5] + spm_units: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: + 2026: IA + output: + # Iowa: 4,000 - 65 - 2,982 - 2 * (497 - 150) = 259. + # SSI deems (4,000 - 694 - 85) / 2 - 1,491 = 119.50, less 20: 994 - 99.50 = 894.50. + # Participation 259 + 894.50 - 994 = 159.50, so 400 - 159.50 = 240.50 is paid. + ia_ssa_income_deemed_from_parents: [0, 0, 259, 0, 0] + ssi: [0, 0, 894.5, 0, 0] + people: + person3: + ia_ssa_care_countable_income: 1_153.5 + ia_ssa_ihhrc_participation: 159.5 + ia_ssa: [0, 0, 240.5, 0, 0] + +- name: Case 4, manual G family example with earned and unearned parental income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + # 6-B example: Mr. G has a retirement pension of $900 a month. + taxable_private_pension_income: + 2026: 10_800 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + # 6-B example: Mrs. G has earnings of $1,500 a month. + employment_income_before_lsr: + 2026: 18_000 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 8 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + marital_units: + parents: + members: [person1, person2] + child1: + members: [person3] + child2: + members: [person4] + families: + family: + members: [person1, person2, person3, person4] + tax_units: + family: + members: [person1, person2, person3, person4] + spm_units: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: + 2026: IA + output: + # Iowa: (1,500 - 65) / 2 + 900 = 1,617.50 - 1,491 = 126.50 - 497 < 0, so 0. + # The child receives the full SSI 994; participation 994 - 994 = 0. + ia_ssa_income_deemed_from_parents: [0, 0, 0, 0] + ssi: [0, 0, 994, 0] + people: + person3: + ia_ssa_ihhrc_participation: 0 + ia_ssa: [0, 0, 400, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_nonfinancial_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_nonfinancial_eligible.yaml new file mode 100644 index 00000000000..7fa2ff3314b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_nonfinancial_eligible.yaml @@ -0,0 +1,75 @@ +- name: Case 1, aged citizen in an ordinary living arrangement. + period: 2026-01 + input: + state_code: + 2026: IA + age: + 2026: 65 + output: + ia_ssa_nonfinancial_eligible: true + +- name: Case 2, a 64-year-old who is neither blind nor disabled is not aged. + period: 2026-01 + input: + state_code: + 2026: IA + age: + 2026: 64 + output: + ia_ssa_nonfinancial_eligible: false + +- name: Case 3, an incarcerated blind person is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: true + is_incarcerated: true + output: + ia_ssa_nonfinancial_eligible: false + ia_ssa: 0 + +- name: Case 4, an undocumented blind person is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: true + immigration_status: + 2026: UNDOCUMENTED + output: + ia_ssa_nonfinancial_eligible: false + ia_ssa: 0 + +- name: Case 5, a blind person with no eligible arrangement is ineligible. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: true + ia_ssa_category: NONE + output: + ia_ssa_nonfinancial_eligible: false + ia_ssa: 0 + +- name: Case 6, a blind person who would qualify for SSI but declines it is ineligible. + period: 2026-01 + input: + state_code: + 2026: IA + age: + 2026: 65 + is_blind: true + takes_up_ssi_if_eligible: false + output: + # With no income, uncapped SSI is 994, so the applicant must apply for SSI. + ia_ssa_nonfinancial_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_resources_deemed_from_parents.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_resources_deemed_from_parents.yaml new file mode 100644 index 00000000000..a4329d445fe --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/ia_ssa_resources_deemed_from_parents.yaml @@ -0,0 +1,424 @@ +# Resource balances and certified budgets are stocks. Annual demographic and asset inputs are explicit. +- name: Case 1, Annual asset balances remain undivided in January and July. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 10_000 + person2: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: + 2026-01: 400 + 2026-07: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + child1: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + parent1: + members: [person1] + child1: + members: [person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + ia_ssa_resources_deemed_from_parents: + 2026-01: [0, 8_000] + 2026-07: [0, 8_000] + +- name: Case 2, Annual agency-certified resource budget remains a monthly stock. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: IA + ia_ssa_resources_deemed_from_parents: 2_500 + output: + ia_ssa_resources_deemed_from_parents: + 2026-01: 2_500 + 2026-07: 2_500 + +- name: Case 3, Minor household head is excluded from parental deeming and the sibling allocation pool. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 5_500 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_household_head: + 2026: true + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 10 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + families: + family: + members: [person1, person2, person3, person4] + tax_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + spm_units: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: + 2026: IA + output: + ia_ssa_resources_deemed_from_parents: [0, 0, 0, 2_500] + ia_ssa: [0, 0, 400, 0] + +- name: Case 4, Married minor is excluded from parental deeming and the sibling allocation pool. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 5_500 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 10 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person5: + age: + 2026: 17 + person_id: + 2026: 5 + marital_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3, person5] + child2: + members: [person4] + families: + family: + members: [person1, person2, person3, person4, person5] + tax_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + spouse: + members: [person5] + spm_units: + unit: + members: [person1, person2, person3, person4, person5] + households: + home: + members: [person1, person2, person3, person4, person5] + state_code: + 2026: IA + output: + ia_ssa_resources_deemed_from_parents: [0, 0, 0, 2_500, 0] + ia_ssa: [0, 0, 400, 0, 0] + +# Child-specific parental budgets and sibling allocation: SI 01330.200/.280. + +- name: Case 5, Children with different linked parent sets do not share a resource allocation. + period: 2026-06 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + bank_account_assets: + 2026: 5_500 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + parent_2_id: + 2026: 2 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + person4: + age: + 2026: 10 + person_id: + 2026: 4 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + families: + family: + members: [person1, person2, person3, person4] + tax_units: + parent1: + members: [person1] + parent2: + members: [person2] + child1: + members: [person3] + child2: + members: [person4] + spm_units: + unit: + members: [person1, person2, person3, person4] + households: + home: + members: [person1, person2, person3, person4] + state_code: + 2026: IA + output: + ia_ssa_resources_deemed_from_parents: [0, 0, 2_500, 3_500] + ia_ssa: [0, 0, 0, 0] + +- name: Case 6, a co-resident stepparent's resources are deemed with the parent's. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 38 + person_id: + 2026: 1 + person2: + age: + 2026: 40 + person_id: + 2026: 2 + bank_account_assets: + 2026: 5_600 + person3: + age: + 2026: 10 + person_id: + 2026: 3 + parent_1_id: + 2026: 1 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parents: + members: [person1, person2] + child: + members: [person3] + families: + family: + members: [person1, person2, person3] + tax_units: + family: + members: [person1, person2, person3] + spm_units: + unit: + members: [person1, person2, person3] + households: + home: + members: [person1, person2, person3] + state_code: + 2026: IA + output: + # person2 is the mother's spouse but not a named parent. 20 CFR 416.1202(b)(1) + # deems a stepparent's resources and allows 3,000 for a parent and spouse: + # 5,600 - 3,000 = 2,600, above the child's 2,000 limit. + ia_ssa_resources_deemed_from_parents: [0, 0, 2_600] + ia_ssa_eligible: [false, false, false] + ia_ssa: [0, 0, 0] + +- name: Case 7, manual Child A example deems one parent's bonds above the one-parent allowance. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: + 2026: 40 + person_id: + 2026: 1 + # 6-B example: the parent has $2,200 in government bonds. + bond_assets: + 2026: 2_200 + person2: + age: + 2026: 10 + person_id: + 2026: 2 + parent_1_id: + 2026: 1 + # 6-B example: Child A has $900 in a savings account. + bank_account_assets: + 2026: 900 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + is_disabled: + 2026: true + meets_ssi_disability_criteria: + 2026: true + marital_units: + parent: + members: [person1] + child: + members: [person2] + families: + family: + members: [person1, person2] + tax_units: + family: + members: [person1, person2] + spm_units: + unit: + members: [person1, person2] + households: + home: + members: [person1, person2] + state_code: + 2026: IA + output: + # 2,200 - 2,000 = 200 deemed; 900 + 200 = 1,100 is within the 2,000 limit. + ia_ssa_resources_deemed_from_parents: [0, 200] + ia_ssa_eligible: [false, true] + ia_ssa: [0, 400] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/integration.yaml new file mode 100644 index 00000000000..35f557db0ed --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ia/hhs/ssa/integration.yaml @@ -0,0 +1,301 @@ +- name: Case 1, one blind spouse receives the categorical supplement. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + is_blind: true + person2: + age: 65 + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # SSI couple rate 1,491, split 745.50 each; only the blind spouse gets 22. + ssi: [745.5, 745.5] + ia_ssa_federal: [22, 0] + ia_ssa: [22, 0] + +- name: Case 2, two blind spouses. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + is_blind: true + person2: + age: 65 + is_blind: true + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # SSI couple rate 1,491, split 745.50 each; each blind spouse gets 22. + ssi: [745.5, 745.5] + ia_ssa_federal: [22, 22] + ia_ssa: [22, 22] + +- name: Case 3, dependent-person grant is once per eligible couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: DEPENDENT_PERSON + person2: + age: 65 + ia_ssa_category: DEPENDENT_PERSON + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # Group income 1,491 < 2,009, so the couple's 518 is split 259 each. + ssi: [745.5, 745.5] + ia_ssa_federal: [259, 259] + ia_ssa: [259, 259] + +- name: Case 4, mixed blind dependent-person couple follows state manual. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: DEPENDENT_PERSON + is_blind: true + person2: + age: 65 + ia_ssa_category: DEPENDENT_PERSON + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # Couple level 518 + 22 = 540 (6-B p.26 $2,031 - $1,491), split 270 each. + ssi: [745.5, 745.5] + ia_ssa_federal: [270, 270] + ia_ssa: [270, 270] + +- name: Case 5, family-life home eligible couple. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: FAMILY_LIFE_HOME + person2: + age: 65 + ia_ssa_category: FAMILY_LIFE_HOME + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # Couple amount 2 * 1,156 - 1,491 - 20 = 801, split 400.50 each; the + # SSI-only couple shares one 20 top-up. + ssi: [745.5, 745.5] + ia_ssa_federal: [400.5, 400.5] + ia_ssa: [410.5, 410.5] + +- name: Case 6, in-home care counts ineligible spouse income. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + person2: + age: 40 + social_security_retirement: 20_400 + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # SSI deems the spouse's 1,700: 1,700 - 20 = 1,680 > 1,491, so SSI is 0. + # Care income 1,700; participation 1,700 - 1,491 = 209; 400 - 209 = 191. + ssi: [0, 0] + ia_ssa: [191, 0] + +- name: Case 7, in-home couple gets only one earnings disregard. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + employment_income: 24_000 + person2: + age: 65 + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 400 + employment_income: 12_000 + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # SSI: (3,000 - 20 - 65) / 2 = 1,457.50 < 1,491, so 33.50, or 16.75 each. + # Care income (3,000 - 65) / 2 + 33.50 = 1,501; participation + # 1,501 - 1,491 = 10; (800 - 10) / 2 = 395. + ssi: [16.75, 16.75] + ia_ssa_care_countable_income: [1_501, 1_501] + ia_ssa_ihhrc_participation: [10, 10] + ia_ssa: [395, 395] + +- name: Case 8, annual blind allowance in SNAP income and benefit totals. + period: 2026 + absolute_error_margin: 0.01 + input: + age: 65 + state_code: IA + is_blind: true + # SNAP take-up is off so the benefit total isolates SSI and Iowa SSA. + takes_up_snap_if_eligible: false + output: + # 22 * 12 = 264; SSI 994 * 12 = 11,928; 11,928 + 264 = 12,192. + ia_ssa: 264 + snap_unearned_income: 12_192 + household_state_benefits: 264 + spm_unit_benefits: 12_192 + +- name: Case 9, Iowa in-home reimbursement is excluded while blind cash is counted. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: IA + age: 65 + is_blind: true + ia_ssa_category: IN_HOME_CARE + ia_ssa_ihhrc_monthly_cost: 4_800 + output: + # (400 + 22) * 12 = 5,064; only the blind 22 * 12 = 264 is countable. + ia_ssa: 5_064 + ia_ssa_countable_for_snap: 264 + ia_ssa_countable_for_hud: 264 + snap_unearned_income: 12_192 + hud_unearned_income: 12_192 + +- name: Case 10, 2027 family-life home couple amount follows the SSI rates. + period: 2027-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: FAMILY_LIFE_HOME + person2: + age: 65 + ia_ssa_category: FAMILY_LIFE_HOME + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # The 2027 SSI couple rate of 1,544 is split 772 each, which is each + # spouse's care income. + # Standard 1,029 + 162 = 1,191; couple amount 2 * 1,191 - 1,544 - 20 = 818, + # split 409 each (801 and 400.50 in 2026). + # The SSI-only couple shares one 20 top-up: 409 + 10 = 419. + ssi: [772, 772] + ia_ssa_care_countable_income: [772, 772] + ia_ssa_federal: [409, 409] + ia_ssa: [419, 419] + +- name: Case 11, certifying one spouse gives the couple the dependent-person level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: DEPENDENT_PERSON + person2: + # No category entered, so person2 defaults to REGULAR. + age: 65 + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # 441 IAC 52.1(2)"b" sets one standard for the "Aged or disabled client, + # eligible spouse, and a dependent relative", so certifying either spouse + # applies the couple level. + # SSI couple rate 1,491, split 745.50 each. Group income 1,491 + 0 is + # below the 1,491 + 518 = 2,009 standard, so the couple's 518 supplement + # is split 259 each (as in Case 3, where both spouses are certified). + ssi: [745.5, 745.5] + ia_ssa_federal: [259, 259] + ia_ssa: [259, 259] + +- name: Case 12, a dependent-person spouse and an in-home care spouse share the couple level. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + ia_ssa_category: DEPENDENT_PERSON + person2: + age: 65 + ia_ssa_category: IN_HOME_CARE + # Within the $480.55 monthly ceiling for one person (6-B p.41). + ia_ssa_ihhrc_monthly_cost: 400 + marital_units: + couple: + members: [person1, person2] + households: + hh: + members: [person1, person2] + state_code: IA + output: + # SSI couple rate 1,491, split 745.50 each. Certifying person1 applies the + # couple dependent-person level whatever person2's category (441 IAC + # 52.1(2)"b"): group income 1,491 is below 2,009, so the 518 supplement + # is split 259 each. + ssi: [745.5, 745.5] + ia_ssa_federal: [259, 259] + # In-home care: couple income 1,491 less the 1,491 couple maintenance + # allowance leaves participation 0, so the 400 cost is paid in full. + ia_ssa_ihhrc_participation: [0, 0] + ia_ssa_ihhrc_amount: [0, 400] + # 259 + 0 and 259 + 400. + ia_ssa: [259, 659] diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/_smme_spouse_income.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/_smme_spouse_income.py new file mode 100644 index 00000000000..9711918f05f --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/_smme_spouse_income.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +def smme_spouse_is_aged_blind_disabled(person, period): + """Whether the other member of a two-person marital unit is a person SSI + treats as aged, blind or disabled. For an applicant whom SSI does not + count, any such member of the marital unit is the spouse.""" + abd = person("is_ssi_aged_blind_disabled", period.this_year) + return person.marital_unit.sum(abd) - abd > 0 + + +def smme_spouse_income(person, period): + """A spouse's SSI earned and unearned income. For an ineligible spouse, + allocations for ineligible children are deducted, from unearned income + first (20 CFR 416.1163(b)(3)). A spouse whom SSI treats as aged, blind or + disabled is not an ineligible spouse, and the couple's income is combined + as for an eligible couple, with no allocations.""" + earned = person("ssi_earned_income", period) + unearned = person("ssi_unearned_income", period) + spouse_earned = person.marital_unit.sum(earned) - earned + spouse_unearned = person.marital_unit.sum(unearned) - unearned + allocations = add( + person.tax_unit, period, ["ssi_ineligible_child_allocation"] + ) * ~smme_spouse_is_aged_blind_disabled(person, period) + unearned_left = max_(spouse_unearned - allocations, 0) + earned_left = max_(spouse_earned - max_(allocations - spouse_unearned, 0), 0) + return earned_left, unearned_left diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa.py new file mode 100644 index 00000000000..9b7013e52cd --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa.py @@ -0,0 +1,156 @@ +from policyengine_us.model_api import * + + +class ia_ssa(Variable): + value_type = float + entity = Person + label = "Iowa State Supplementary Assistance" + definition_period = MONTH + unit = USD + reference = ( + # Iowa Code 249.3; PDF pages 2-3 + "https://www.legis.iowa.gov/docs/code/249.pdf#page=2", + # 441 IAC 51.4(3) and 51.7(6); PDF pages 1-2 + "https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=1", + # 441 IAC 52.1; PDF pages 1-2 + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1", + # PDF pages 35, 41-49, 59-74, 76-78 + "https://hhs.iowa.gov/media/3987/download?inline=#page=35", + ) + defined_for = "ia_ssa_eligible" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ia.hhs.ssa + federal = parameters(period).gov.ssa.ssi + category = person("ia_ssa_category", period) + c = category.possible_values + federally_paid = person("ia_ssa_federal", period) + income = person("ia_ssa_care_countable_income", period) + extra = max_(person("ia_ssa_care_additional_deductions", period), 0) + partial = person("ia_ssa_care_partial_month_days", period) + days = where(partial > 0, min_(partial, period.days), period.days) + joint = person("ssi_couple_computation_applies", period) + # NOTE: 441 IAC 52.1(3): "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", and 51.4(3) + # tests income against "31 times the maximum per diem rate". 6-B + # Billing and Payments p.72 still describes "two options": a + # cost-related per diem rate "established by the Department + # specifically for each facility" of up to $38.47, or "A flat per diem + # rate ... $17.86 beginning February 1, 2004". The model follows the + # rule and Iowa Code 249.12(3), under which privately operated + # facilities "shall be reimbursed based on the maximum per diem rates + # established by the general assembly", and pays the maximum rate + # unless a lower facility rate is entered (ia_ssa.yaml Cases 14, 15 + # and 56). + entered_rate = max_(person("ia_ssa_rcf_daily_rate", period), 0) + rate = where( + entered_rate > 0, + min_(entered_rate, p.rcf_daily_limit), + p.rcf_daily_limit, + ) + # 441 IAC 52.1(3)"a"(6): "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." In a couple-budget entry month + # (ia_ssa_rcf_couple_budget) each spouse's care income is half the + # couple's, so each deducts half the couple rate. + # NOTE: 6-B First-Month Client Participation pp.63-64 deducts "the SSI + # benefit rate for one person" or "for a married couple", as the rule + # does, but later lets clients from an independent living arrangement + # "keep enough of the first month's income to meet maintenance or + # living expenses from the previous living arrangement, but do not + # disregard an amount that is over the SSI standard". The model follows + # the rule's fixed amount (ia_ssa.yaml Cases 52-53). + has_spouse = person("ia_ssa_has_spouse", period) + entry = where(has_spouse, federal.amount.couple, federal.amount.individual) + entry = where( + person("ia_ssa_rcf_couple_budget", period), entry / 2, entry + ) * person("ia_ssa_care_initial_partial_month", period) + rcf_participation = max_(income - p.rcf_personal_needs - extra - entry, 0) + # Paying the covered days less participation, floored at zero, matches + # the 51.4(3) income test in a 31-day month and pays nothing in a + # shorter month that income covers (52.1(3)"d"). + rcf = max_(rate * days - rcf_participation, 0) + ihhrc = person("ia_ssa_ihhrc_amount", period) + # 6-B Making the Family-Life Home Payment: "For a recipient who has + # only SSI and no other income (and hence no $20 to disregard), an + # additional $20 payment is necessary". The $20 is SSI's general income + # exclusion, so the federal parameter is used. Only positive amounts + # count as other income, and the eligible couple shares one $20. + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) + sources = federal.income.sources + # Interest and dividends are excluded from income as in + # ia_ssa_care_countable_income (20 CFR 416.1124(c)(22)), so they are + # not other income here (ia_ssa.yaml Case 63). + excluded = p.excluded_unearned_sources + has_other_income = np.zeros(person.count, dtype=bool) + for source in list(sources.earned) + list(sources.unearned): + if source not in excluded: + has_other_income = has_other_income | (person(source, period) > 0) + has_other_income = where( + joint, person.marital_unit.any(has_other_income), has_other_income + ) + flh = category == c.FAMILY_LIFE_HOME + recipients = person.marital_unit.sum(flh) + top_up = ( + ~has_other_income + * receives_ssi + * federal.income.exclusions.general + / where(joint, max_(recipients, 1), 1) + ) + # 441 IAC 51.7(6) and 6-B Income (SMME) p.77 set no family size for + # the poverty guideline. 6-B p.77 determines income "according to SSI + # income criteria", and 8-E p.12 says to "Process as a one-person + # household" when SSI deems nothing from an ineligible spouse. So the + # guideline is for two people only when SMME income includes a + # spouse's income: an eligible couple's combined income, or income + # deemed from a spouse, by SSI or, for an applicant working above the + # SGA level, by ia_ssa_smme_spousal_deeming_applies (a spouse's income + # above the couple rate less the individual rate, or an aged, blind or + # disabled spouse's income; ia_ssa.yaml Cases 47-49, 81-84, 90-92 and + # 94-97). + spouse_income = ( + joint + | person("is_ssi_spousal_deeming_applies", period.this_year) + | person("ia_ssa_smme_spousal_deeming_applies", period) + ) + size = where(spouse_income, 2, 1) + # 441 IAC 75.1 revises the federal poverty level "annually on April 1", + # so earlier months use the prior year's guidelines (Cases 78-80). + year = period.start.year + if period.start.month < p.fpg_year_start_month: + year = year - 1 + fpg = parameters(f"{year}-01-01").gov.hhs.fpg + poverty = ( + fpg.first_person.CONTIGUOUS_US + + (size - 1) * fpg.additional_person.CONTIGUOUS_US + ) / MONTHS_IN_YEAR + # NOTE: Iowa Code 249.3(4)(g) requires "income of at least one hundred + # twenty percent of the federal poverty level". 441 IAC 51.7(6) says + # income "must exceed 120 percent of the federal poverty level", and + # 6-B Income (SMME) p.77 says it "also exceeds 120% of the federal + # poverty level". Where a statute and a rule or manual disagree, the + # model follows the statute (the statute-first rule in CONTRIBUTING.md), so + # income of exactly 120% qualifies and one cent less does not + # (ia_ssa.yaml Cases 44-45). + smme = ( + person("ia_ssa_smme_coverage_eligible", period) + & ( + person("ia_ssa_smme_countable_income", period) + >= p.smme_minimum_fpg_rate * poverty + ) + & (federally_paid == 0) + ) + state = select( + [ + category == c.RESIDENTIAL_CARE, + category == c.IN_HOME_CARE, + flh, + category == c.SMME, + ], + [rcf, ihhrc, top_up, smme * p.smme_amount], + default=0, + ) + return federally_paid + state diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_additional_deductions.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_additional_deductions.py new file mode 100644 index 00000000000..d04a9f9e5f6 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_additional_deductions.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ia_ssa_care_additional_deductions(Variable): + value_type = float + entity = Person + label = "Iowa SSA approved additional care income deductions" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + documentation = "Verified monthly deductions from care income beyond those the model applies: unmet medical needs; for in-home health-related care, the allowance for a dependent other than an SSI-ineligible child in the tax unit; for residential care, the spouse and dependent diversions (omit the spouse diversion in a month of entry, when the SSI couple rate is deducted instead), income used that month to pay for care in another facility or setting and, for a resident who receives no SSI, one-half of impairment-related work expenses, because this input is subtracted after the one-half earnings exclusion. Enter no impairment-related work expenses for an SSI recipient: SSA's payment already offsets them. Enter a deduction a couple shares on one spouse only; in-home care adds the couple's entries together. Excludes the home maintenance, dependent-child and personal needs allowances, the entry-month SSI rate deduction and the $65 and one-half earnings exclusions. Key each amount to its month; a yearly entry is spread evenly over the months." + reference = ( + # 441 IAC 52.1(3)"a" + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1", + # PDF pages 42-44, 59, 61-65, 68 + "https://hhs.iowa.gov/media/3987/download?inline=#page=42", + ) + + def formula(person, period, parameters): + # A formula stops a one-month input from carrying into later months. + return 0 diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_countable_income.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_countable_income.py new file mode 100644 index 00000000000..087810af14f --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_countable_income.py @@ -0,0 +1,118 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import ( + _apply_ssi_exclusions, +) + + +class ia_ssa_care_countable_income(Variable): + value_type = float + entity = Person + label = "Iowa SSA care countable income without general disregard" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + documentation = "Care income without the $20 general exclusion: SSI countable income plus SSI. In-home care counts an adult's spouse's income. An eligible family-life home couple, and a residential care couple in the month of entry, split the couple's income. After the month of entry, a married resident counts own income plus the SSI individual amount from it. A child in in-home care receives income deemed from parents under the Iowa method. Interest and dividends are excluded. First-month deeming from an ineligible spouse, and deductions absent from the federal SSI income inputs, are not modeled." + reference = ( + # 441 IAC 52.1(3)"a" + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1", + # PDF pages 34, 40-42, 46, 49, 58-65, 67-71 + "https://hhs.iowa.gov/media/3987/download?inline=#page=34", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ia.hhs.ssa + ssi = parameters(period).gov.ssa.ssi + category = person("ia_ssa_category", period) + c = category.possible_values + home = category == c.IN_HOME_CARE + rcf = category == c.RESIDENTIAL_CARE + joint = person("ssi_couple_computation_applies", period) + spouse = person("ia_ssa_has_spouse", period) + adult = ~person("is_child", period.this_year) + combine = select( + [home, rcf], + [adult & spouse, person("ia_ssa_rcf_couple_budget", period)], + default=joint, + ) + # NOTE: 441 IAC 52.1(3)"a"(1) deducts "impairment-related work + # expenses, as defined by SSI plus $65 plus one-half of any remaining + # earned income" (6-B p.65, Mr. L). Neither federal SSI nor this + # variable models those expenses (issue 3669). For a resident without + # SSI, entering one-half of them in ia_ssa_care_additional_deductions + # reproduces the rule (ia_ssa.yaml Case 62). For an SSI recipient, + # SSA's payment rises by the same one-half, so care income does not + # change (6-B p.59). + earned = max_( + person("ssi_earned_income", period) + - person("ssi_blind_or_disabled_working_student_exclusion", period), + 0, + ) + # NOTE: 20 CFR 416.1124(c)(22) excludes "Interest and dividend income + # from a countable resource", as Manual 8-E Dividends and Interest + # Income do. Federal SSI still counts them (issue 10079), so the + # sources in excluded_unearned_sources are dropped here and from the + # family-life home $20 test in ia_ssa (ia_ssa.yaml Case 74 for + # residential care income and Case 63 for the $20 test). + # Remove the list once issue 10079 is fixed, or they are excluded + # twice. SMME income (ia_ssa_smme_countable_income) and the SSA-paid + # amounts (ia_ssa_federal) use SSI countable income, so they count + # interest and dividends until then. The 8-E exceptions for excluded + # resources are not modeled. + # NOTE: 6-B excludes one-third of child support a child receives from + # an absent parent. Federal SSI does not apply 20 CFR 416.1124(c)(11) + # yet (issue 10242), so the shared federal share is read here; remove + # it once issue 10242 is fixed. + unearned = max_( + person("ssi_unearned_income", period) + - add(person, period, p.excluded_unearned_sources) + - ~adult + * person("child_support_received", period) + * ssi.income.exclusions.child_support_share, + 0, + ) + # 6-B: "do not rely on SSI deeming calculations for children" in + # in-home health-related care; other care uses SSI parental deeming. + deemed = where( + home, + person("ia_ssa_income_deemed_from_parents", period), + person("ssi_unearned_income_deemed_from_ineligible_parent", period), + ) + unearned = unearned + ~adult * deemed + # NOTE: 6-B pp.60-61 treats spouses "as individuals beginning the month + # after the month of entry", and the examples on pp.68-71 then use the + # resident's own SSI (Mr. K: "$ 839 SSI benefit"). A resident whose + # income is below the SSI rate "must now apply for and accept SSI + # benefits" (p.61). The model therefore assumes SSA pays each spouse as + # an individual from that month, and credits that amount even to a + # resident who does not take up SSI. Federal SSI has no input for + # spouses who live apart and keeps the couple or deemed amount, so the + # SSI individual amount is computed here from the resident's own income + # (ia_ssa.yaml Cases 57, 58, 60 and 73). + individual_ssi = max_( + ssi.amount.individual + - _apply_ssi_exclusions( + earned * MONTHS_IN_YEAR, + unearned * MONTHS_IN_YEAR, + parameters, + period, + ) + / MONTHS_IN_YEAR, + 0, + ) + separated = rcf & spouse & ~person("ia_ssa_care_initial_partial_month", period) + benefit = where(separated, individual_ssi, person("ssi", period)) + earned = where(combine, person.marital_unit.sum(earned), earned) + unearned = where(combine, person.marital_unit.sum(unearned), unearned) + benefit = where(combine, person.marital_unit.sum(benefit), benefit) + income = ( + _apply_ssi_exclusions( + earned * MONTHS_IN_YEAR, + unearned * MONTHS_IN_YEAR, + parameters, + period, + general_exclusion=0, + ) + / MONTHS_IN_YEAR + + benefit + ) + return where(combine & ~home, income / 2, income) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_initial_partial_month.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_initial_partial_month.py new file mode 100644 index 00000000000..9ebe3315ce4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_initial_partial_month.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ia_ssa_care_initial_partial_month(Variable): + value_type = bool + entity = Person + label = "Iowa SSA first partial month of in-home or residential care" + definition_period = MONTH + defined_for = StateCode.IA + default_value = False + documentation = "Set for a first month of in-home health-related care service that is less than a full month, or for the month a resident enters a residential care facility after living at home earlier that month. In-home care then requires no client participation. Residential care deducts the SSI benefit rate for one person, or for a couple when a spouse lived in the home. For a married resident, the month also sets the couple budget (ia_ssa_rcf_couple_budget) when either spouse received SSI or both spouses enter that month; later months budget each spouse alone. Key the entry to its month and enter the covered days in ia_ssa_care_partial_month_days." + reference = ( + # 441 IAC 52.1(3)"a"(6) + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=2", + # 441 IAC 177.8(2)"b" (IAC 8/5/26) + "https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf#page=4", + # 441 IAC 177.10(2)"b" (IAC 2/5/25) + "https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf#page=5", + # PDF pages 42, 60-61, 63-64 + "https://hhs.iowa.gov/media/3987/download?inline=#page=42", + ) + + def formula(person, period, parameters): + # A formula stops a one-month input from carrying into later months. + return False diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_partial_month_days.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_partial_month_days.py new file mode 100644 index 00000000000..bb7940fbbd3 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_care_partial_month_days.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ia_ssa_care_partial_month_days(Variable): + value_type = int + entity = Person + label = "Iowa SSA covered care days in a partial month" + definition_period = MONTH + defined_for = StateCode.IA + default_value = 0 + documentation = "Covered days in a month that is not fully covered. For residential care, count the day of entry but not the day of discharge or death, plus authorized reserve bed days; for in-home health-related care, count the days of approved services. Leave at 0 for a full month; a value of at least the month's length is also a full month. Key the entry to its month (for example 2026-01: 15)." + reference = ( + # 441 IAC 52.1(3)"b", "e" and "f" + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=2", + # PDF pages 42, 71-72 + "https://hhs.iowa.gov/media/3987/download?inline=#page=42", + ) + + def formula(person, period, parameters): + # A formula stops a one-month input from carrying into later months. + return 0 diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_category.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_category.py new file mode 100644 index 00000000000..c85f31d07de --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_category.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class IASSACategory(Enum): + REGULAR = "Ordinary living arrangement" + DEPENDENT_PERSON = "Certified dependent-person household" + FAMILY_LIFE_HOME = "Certified family-life home" + RESIDENTIAL_CARE = "Approved residential care facility" + IN_HOME_CARE = "Approved in-home health-related care" + SMME = "Supplement for Medicare and Medicaid eligibles" + NONE = "No eligible supplementary assistance arrangement" + + +class ia_ssa_category(Variable): + value_type = Enum + entity = Person + label = "Iowa State Supplementary Assistance category" + definition_period = MONTH + possible_values = IASSACategory + default_value = IASSACategory.REGULAR + # PDF pages 5-6, 20, 24, 30, 40-41, 57-61, 76 + reference = "https://hhs.iowa.gov/media/3987/download?inline=#page=5" + documentation = """ + Special categories require agency certification of the dependency or care + arrangement, benefit pursuit, and procedural eligibility. DEPENDENT_PERSON + requires a selected co-resident relative who is ineligible for SSI/FIP, + satisfies the marital restrictions and does not deem income to the client. + For an eligible SSI couple sharing one dependent, certifying either member + applies the couple level. Certification also covers the dependent's own + resources, which 441 IAC 51.5(2) counts with the recipient's; the model + tests only the recipient's and spouse's resources. + For residential care, set ia_ssa_care_initial_partial_month in the month + of entry; a married resident is budgeted alone from the next month. + NONE also excludes the blind allowance; otherwise it may accompany care. + """ diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_countable_for_hud.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_countable_for_hud.py new file mode 100644 index 00000000000..454d781eb6a --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_countable_for_hud.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ia_ssa_countable_for_hud(Variable): + value_type = float + entity = Person + label = "Iowa State Supplementary Assistance countable for HUD" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + # 24 CFR 5.609(b)(6) and (b)(19) + reference = "https://www.ecfr.gov/current/title-24/section-5.609#p-5.609(b)(6)" + + def formula(person, period, parameters): + # 24 CFR 5.609(b)(6) excludes amounts "specifically for, or in + # reimbursement of, the cost of health and medical care expenses", and + # (b)(19) excludes state agency payments "to enable a family member who + # has a disability to reside in the family's assisted unit". Both cover + # the in-home health-related care payment; the blind supplement paid + # alongside it remains income. + category = person("ia_ssa_category", period) + home_care = category == category.possible_values.IN_HOME_CARE + return where( + home_care, person("ia_ssa_federal", period), person("ia_ssa", period) + ) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_countable_for_snap.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_countable_for_snap.py new file mode 100644 index 00000000000..3f1b093f6e4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_countable_for_snap.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class ia_ssa_countable_for_snap(Variable): + value_type = float + entity = Person + label = "Iowa State Supplementary Assistance countable for SNAP" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + reference = ( + "https://hhs.iowa.gov/media/3997#page=34", + "https://www.ecfr.gov/current/title-7/section-273.9#p-273.9(c)(5)", + ) + + def formula(person, period, parameters): + # Iowa SNAP manual 7-E: "Exclude State Supplementary Assistance payments + # made for in-home health-related care as a reimbursement" (7 CFR + # 273.9(c)(5)). The blind supplement paid alongside it remains + # countable cash assistance. + category = person("ia_ssa_category", period) + home_care = category == category.possible_values.IN_HOME_CARE + return where( + home_care, person("ia_ssa_federal", period), person("ia_ssa", period) + ) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_dependent_countable_income.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_dependent_countable_income.py new file mode 100644 index 00000000000..c77e31a32c9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_dependent_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class ia_ssa_dependent_countable_income(Variable): + value_type = float + entity = Person + label = "Countable income of Iowa SSA selected dependent" + definition_period = MONTH + unit = USD + default_value = 0 + # PDF pages 24-28 + reference = "https://hhs.iowa.gov/media/3987/download?inline=#page=24" + documentation = "Verified dependent income after 6-B deductions, including the special parent-of-child calculation and only one $20 exclusion per dependent group. The dependent does not receive the recipient's half-earnings exclusion. An entry carries into later months until it is changed." diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_eligible.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_eligible.py new file mode 100644 index 00000000000..9bdb207b59b --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_eligible.py @@ -0,0 +1,54 @@ +from policyengine_us.model_api import * + + +class ia_ssa_eligible(Variable): + value_type = bool + entity = Person + label = "Iowa SSA non-income eligibility" + definition_period = MONTH + defined_for = StateCode.IA + reference = ( + # Iowa Code 249.3 + "https://www.legis.iowa.gov/docs/code/249.pdf#page=2", + # PDF pages 6-12 + "https://hhs.iowa.gov/media/3987/download?inline=#page=6", + "https://www.ecfr.gov/current/title-20/section-416.1202", + "https://www.ecfr.gov/current/title-20/section-416.1205", + ) + + def formula(person, period, parameters): + category = person("ia_ssa_category", period) + c = category.possible_values + resource = person("ssi_countable_resources", period.this_year) + community = ( + (category == c.IN_HOME_CARE) + | (category == c.SMME) + | (category == c.REGULAR) + | (category == c.DEPENDENT_PERSON) + | (category == c.FAMILY_LIFE_HOME) + ) + # 6-B Resources p.12: "When the applicant is living with a spouse, + # count the spouse's resources. When the applicant is not living with + # the spouse, do not count the spouse's resources." A residential care + # resident lives apart from the spouse after the month of entry (6-B + # p.60), so only the couple-budget entry month pools resources + # (ia_ssa.yaml Case 61). + # NOTE: The spouse who stays at home still pools resources with the + # resident after the month of entry, though p.12 would test that + # spouse alone. Federal SSI in the model has no input for spouses who + # live apart and keeps them a couple, and that spouse's SSA income + # comes from federal SSI, so this belongs with the federal treatment of + # spouses living apart. + couple = person("ia_ssa_has_spouse", period) & ( + community | person("ia_ssa_rcf_couple_budget", period) + ) + resource = where(couple, person.marital_unit.sum(resource), resource) + resource = resource + person("ia_ssa_resources_deemed_from_parents", period) + # 6-B Resources prints "$2,000 for an individual" and "$3,000 for a + # married couple living together" under 20 CFR 416.1202; these equal + # the SSI limits of 20 CFR 416.1205, so the federal parameters are used + # and an SSI reform carries over to Iowa. + limit = parameters(period).gov.ssa.ssi.eligibility.resources.limit + return person("ia_ssa_nonfinancial_eligible", period) & ( + resource <= where(couple, limit.couple, limit.individual) + ) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_federal.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_federal.py new file mode 100644 index 00000000000..74780fa9109 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_federal.py @@ -0,0 +1,130 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi._ssi_state_supplement import ( + ssi_state_supplement, +) + + +class ia_ssa_federal(Variable): + value_type = float + entity = Person + label = "Federally administered Iowa State Supplementary Assistance" + definition_period = MONTH + unit = USD + reference = ( + # 441 IAC 52.1(1), (2) and (4); PDF pages 1-2 + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1", + # 441 IAC 51.5(1) + "https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=2", + # PDF pages 20, 24-28, 30, 34-35 + "https://hhs.iowa.gov/media/3987/download?inline=#page=20", + "https://secure.ssa.gov/poms.nsf/lnx/0501415058#f", + ) + defined_for = "ia_ssa_eligible" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ia.hhs.ssa + ssi = parameters(period).gov.ssa.ssi + category = person("ia_ssa_category", period) + c = category.possible_values + # NOTE: The joint-couple test uses the federal definition, which treats + # an aged, blind or disabled spouse who is ineligible for SSI or does + # not apply as part of a joint claim (issue 10138). + joint = person("ssi_couple_computation_applies", period) + blind = person("is_blind", period.this_year) + blind_count = person.marital_unit.sum(blind) + dependent = person("ia_ssa_dependent_countable_income", period) + dependent = where(joint, person.marital_unit.max(dependent), dependent) + recipient_income = person("ssi_countable_income", period) + person( + "ssi", period + ) + group_income = ( + where(joint, person.marital_unit.sum(recipient_income), recipient_income) + + dependent + ) + need = ( + where( + joint, + ssi.amount.couple + blind_count * p.blind_amount, + ssi.amount.individual + blind * p.blind_amount, + ) + + p.dependent_amount + ) + # NOTE: 6-B p.24 excludes as a dependent "A person whose countable + # income is more than $518 per month", which would admit income of + # exactly $518. 6-B p.25 ("The dependent must have countable income of + # less than $518 per month") and 441 IAC 51.5(1) ("must be less than + # the amount established by the department") exclude it. The model + # follows 51.5(1) and p.25 (ia_ssa.yaml Case 3). + # The dependent-person standards are couple standards (441 IAC + # 52.1(2)"b", "d" and "e"), so certifying either spouse of an eligible + # couple applies the couple level (integration.yaml Cases 11-12), + # whatever the other spouse's category. + certified = category == c.DEPENDENT_PERSON + certified = where(joint, person.marital_unit.any(certified), certified) + dp = certified & (dependent < p.dependent_amount) & (group_income < need) + # 6-B: the family-life home standard is "$1,156", and the maximum + # supplement is "$162 ($1,156 - $994 SSI standard)". SSA pays at most + # $142 because it applies the $20 general exclusion. The couple amount + # is twice the standard less the SSI couple rate and $20 (POMS code D + # Aged/Aged $801), so the standard and the couple amount move with the + # federal benefit rate. + general = ssi.income.exclusions.general + family_life_need = ssi.amount.individual + p.family_life_supplement + flh = (category == c.FAMILY_LIFE_HOME) & ( + person("ia_ssa_care_countable_income", period) < family_life_need + ) + family_life_individual = p.family_life_supplement - general + family_life_couple = 2 * family_life_need - ssi.amount.couple - general + federal_la = person("ssi_federal_living_arrangement", period) + medical = federal_la == federal_la.possible_values.MEDICAL_TREATMENT_FACILITY + # NOTE: 441 IAC 52.1(4) sets $22 as "The standard for a blind recipient + # not receiving another type of state supplementary assistance". 6-B + # Blind Supplement p.20 excludes the blind supplement "when determining + # eligibility for other SSA programs the person may be receiving + # simultaneously. For example, the blind supplement is not countable + # income to determine client participation or eligibility for the RCF + # supplement", and p.42 says "Do not count the $22 special blind + # allowance when determining client participation" for in-home care. + # POMS SI 01415.058 F.1 code A pays a blind recipient "who does not live + # in any other State living arrangement variation", the SSA-coded + # dependent-person and family-life home rows, whose levels include the + # $22. The model follows the manual and POMS and pays the $22 with + # residential care (ia_ssa.yaml Case 11) and in-home care + # (integration.yaml Case 9). + individual_rate = ( + dp * p.dependent_amount + + flh * family_life_individual + + blind * p.blind_amount + ) + # NOTE: 6-B Income (DP) lists "Blind client, aged or disabled spouse, and + # a dependent relative $2,031", a $540 supplement over the $1,491 + # couple rate. POMS SI 01415.058 F.2.b code C shows Aged/Blind 562.00 + # (2,053.00), which is the blind/blind level. The model follows the + # manual and POMS F.1 code C ("increases by $22 for each blind + # recipient"), adding $22 per blind spouse (integration.yaml Case 4). + couple_rate = ( + dp * p.dependent_amount + + flh * family_life_couple + + 2 * blind * p.blind_amount + ) + recipient = (individual_rate > 0) & ~medical & person("ia_ssa_eligible", period) + count = person.marital_unit.sum(recipient) + payment = ssi_state_supplement( + person, + period, + parameters, + individual_rate, + couple_rate, + federal_payment_rules=False, + ) + # Only the blind member receives the ordinary categorical allowance. + # DP/FLH couples share the combined payment without duplication. + payment = where(joint, payment * 2 / max_(count, 1), payment) * recipient + # SSA pays these rows, so its rounding and $1 minimum apply. The helper + # would apply them before the redistribution above, so it returns the + # unrounded amount and the same SSA rule is applied here afterwards + # (SI 02001.005, SI 02001.010). + rounded = np.ceil(np.floor(payment * 1000) / 10) / 100 + return where( + rounded > 0, max_(rounded, ssi.state_supplement.minimum_payment), 0 + ) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_has_spouse.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_has_spouse.py new file mode 100644 index 00000000000..a5b4b549cd7 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_has_spouse.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.resources.deemed._ssi_spouses import ( + _ssi_spouse_index, +) + + +class ia_ssa_has_spouse(Variable): + value_type = bool + entity = Person + label = "Iowa SSA spouse in the marital unit" + definition_period = MONTH + defined_for = StateCode.IA + reference = ( + "https://hhs.iowa.gov/media/3987/download?inline=#page=12", + "https://www.ecfr.gov/current/title-20/section-416.1806", + ) + + def formula(person, period, parameters): + # 6-B Resources p.12: "When the applicant is living with a spouse, + # count the spouse's resources." A two-person marital unit is a couple + # only when SSI's spouse test pairs its members, so the default unit of + # a situation without marital units does not pair a parent with an + # adult child the parent claims (ia_ssa.yaml Case 65). A default unit + # of three or more people budgets each member alone. + couple_unit = person.marital_unit.nb_persons() == 2 + return couple_unit & (_ssi_spouse_index(person, period) >= 0) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_amount.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_amount.py new file mode 100644 index 00000000000..0c695d18a33 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_amount.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class ia_ssa_ihhrc_amount(Variable): + value_type = float + entity = Person + label = "Iowa SSA in-home health-related care amount before non-income eligibility" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + reference = ( + # 441 IAC 177.8(2) (IAC 8/5/26) + "https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf#page=4", + # 441 IAC 177.10(2) (IAC 2/5/25); PDF pages 4-5 + "https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf#page=4", + # PDF pages 41-42 + "https://hhs.iowa.gov/media/3987/download?inline=#page=41", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ia.hhs.ssa + category = person("ia_ssa_category", period) + home = category == category.possible_values.IN_HOME_CARE + cost = max_(person("ia_ssa_ihhrc_monthly_cost", period), 0) + # Care costing more than the monthly ceiling is ineligible, not capped. + approved = home & (cost <= p.ihhrc_cost_limit) + partial = person("ia_ssa_care_partial_month_days", period) + days = where(partial > 0, min_(partial, period.days), period.days) + covered_cost = cost * days / period.days * approved + # A couple's approved costs share one participation; others are alone. + total_cost = where( + person("ia_ssa_has_spouse", period), + person.marital_unit.sum(covered_cost), + covered_cost, + ) + payable = max_(total_cost - person("ia_ssa_ihhrc_participation", period), 0) + # Allocate a common household contribution proportionately to the + # approved costs, preserving the household's total payable benefit. + share = np.divide( + covered_cost, + total_cost, + out=np.zeros_like(covered_cost), + where=total_cost > 0, + ) + return payable * share diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_monthly_cost.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_monthly_cost.py new file mode 100644 index 00000000000..a84c34430f5 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_monthly_cost.py @@ -0,0 +1,12 @@ +from policyengine_us.model_api import * + + +class ia_ssa_ihhrc_monthly_cost(Variable): + value_type = float + entity = Person + label = "Iowa SSA approved monthly in-home health-related care cost" + definition_period = MONTH + unit = USD + default_value = 0 + reference = "https://hhs.iowa.gov/media/3987/download?inline=#page=41" + documentation = "Cost of the approved full-month service plan per recipient; care costing above the monthly ceiling is ineligible rather than capped. An entry carries into later months until it is changed." diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_participation.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_participation.py new file mode 100644 index 00000000000..08130590781 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_ihhrc_participation.py @@ -0,0 +1,57 @@ +from policyengine_us.model_api import * + + +class ia_ssa_ihhrc_participation(Variable): + value_type = float + entity = Person + label = "Iowa SSA in-home health-related care client participation" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + reference = ( + # 441 IAC 177.2(1)"f"-"g" and 177.8(2) (IAC 8/5/26) + "https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf#page=1", + # 441 IAC 177.4(1)"f"-"g" and 177.10(2) (IAC 2/5/25); PDF pages 2, 4-5 + "https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf#page=2", + # PDF pages 41-44, 49 + "https://hhs.iowa.gov/media/3987/download?inline=#page=41", + ) + + def formula(person, period, parameters): + # 6-B Home Maintenance Allowance (IHHRC) prints the SSI individual and + # couple standards ($994 and $1,491) and gives the couple allowance + # "even if only one spouse receives in-home health-related care", so + # the federal benefit rates are used and an SSI reform carries over. + # A child has no spouse and receives the individual standard. + ssi = parameters(period).gov.ssa.ssi + income = person("ia_ssa_care_countable_income", period) + deductions = max_(person("ia_ssa_care_additional_deductions", period), 0) + has_spouse = person("ia_ssa_has_spouse", period) + maintenance = where(has_spouse, ssi.amount.couple, ssi.amount.individual) + deductions = where(has_spouse, person.marital_unit.sum(deductions), deductions) + # 441 IAC 177.2(1)"f"(3) disregards "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 + # Home Maintenance Allowance (IHHRC) allows "$ 497 Maximum additional + # allowance for each dependent" less the dependent's income. SSI's + # ineligible child allocation is that amount, summed over the tax unit + # as in SSI spousal deeming. A child recipient's siblings are allowed in + # parental deeming instead (177.2(1)"g"(1)). + # NOTE: 6-B p.42 lists the "Home maintenance allowance for a single + # person, or for a couple if there is a spouse living with the client + # or a dependent living with an eligible person", with no deduction of + # the dependent's income. 441 IAC 177.2(1)"f"(3) applies "Any income of + # the dependent ... to the dependent's needs before making this + # disregard", as 6-B p.43 does ("Subtract a dependent's income"; Mr. B, + # 1,400 - 994 - 372 = 34). The model follows the rule and p.43 + # (ia_ssa.yaml Case 50). + head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + dependents = head_or_spouse * person.tax_unit.sum( + person("ssi_ineligible_child_allocation", period) + ) + participation = max_(income - maintenance - dependents - deductions, 0) + # No client participation is required in a first partial month. + return where( + person("ia_ssa_care_initial_partial_month", period), 0, participation + ) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_income_deemed_from_parents.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_income_deemed_from_parents.py new file mode 100644 index 00000000000..d2effd8c9ee --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_income_deemed_from_parents.py @@ -0,0 +1,97 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.resources.deemed.ssi_resources_deemed_from_ineligible_parent import ( + _ssi_parental_resource_pool, +) + + +class ia_ssa_income_deemed_from_parents(Variable): + value_type = float + entity = Person + label = "Iowa SSA in-home health-related care income deemed from parents" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + reference = ( + # PDF pages 46-49 + "https://hhs.iowa.gov/media/3987/download?inline=#page=46", + # 441 IAC 177.2(1)"g"(1) + "https://www.legis.iowa.gov/docs/iac/chapter/441.177.pdf#page=2", + # 441 IAC 177.4(1)"g"(1) (IAC 2/5/25) + "https://www.legis.iowa.gov/docs/iac/chapter/01-07-2026.441.177.pdf#page=2", + ) + + def formula(person, period, parameters): + # 6-B: "The procedures for deeming from a parent to a child under + # in-home health-related care differ from the SSI program", so the + # Iowa method replaces SSI parental income deeming for these children. + # The deemors are the co-resident parents and each parent's + # co-resident spouse, as for parental resources; a parent who receives + # SSI is not a deemor. + # NOTE: The manual and the rule it cites deduct the unmet medical needs + # of the parents and ineligible children, which are not modeled. + # NOTE: 6-B p.47: "For parents with earned income only, allow the + # following deductions before deeming income to the eligible child: $65 + # work expense. Double the SSI allowance". 441 IAC 177 lists only "an + # additional basic SSI standard" when all income is earned, with no $65: + # 177.4(1)"g"(1) in the IAC 2/5/25 edition and 177.2(1)"g"(1) after ARC + # 0460D (IAC 8/5/26, effective October 1, 2026), so the conflict covers + # all of 2026. The model follows the manual + # (ia_ssa_income_deemed_from_parents.yaml Cases 2-3). + ssi = parameters(period).gov.ssa.ssi + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) + earned = where(receives_ssi, 0, person("ssi_earned_income", period)) + unearned = where(receives_ssi, 0, person("ssi_unearned_income", period)) + parental_earned, parent_count, pool = _ssi_parental_resource_pool( + person, period, earned + ) + parental_unearned, _, _ = _ssi_parental_resource_pool(person, period, unearned) + # 6-B, Home Maintenance Allowance (IHHRC): the 6-B allowances equal the + # SSI individual, couple and dependent standards, so an SSI reform + # carries over to Iowa. + # NOTE: As in resources deeming, the allowance follows the number of + # co-resident deemors including a parent who receives SSI, so one SSI + # parent with an ineligible parent gives the couple allowance. Federal + # ssi_ineligible_parent_allocation counts only ineligible parents; 6-B + # and 441 IAC 177 are silent on this case. + allowance = where(parent_count > 1, ssi.amount.couple, ssi.amount.individual) + pool_count = int(np.max(pool, initial=-1)) + 1 + # NOTE: 441 IAC 177.4(1)"g"(1)2 (IAC 2/5/25; 177.2(1)"g"(1)2 from + # October 1, 2026) disregards "The amount of the basic supplemental + # security income standard for a dependent for each ineligible child in + # the home". 6-B pp.47-49 allow a "maximum of $497 per child" and + # "Subtract any income of the dependent from the maximum deduction" + # (E family: $347 per child). The model follows the manual + # (ia_ssa_income_deemed_from_parents.yaml Case 3). + # Each ineligible child of the same parents adds the SSI dependent + # standard less that child's own income. + sibling_allowance = np.bincount( + pool, + weights=person("ssi_ineligible_child_allocation", period), + minlength=pool_count, + )[pool] + exclusions = ssi.income.exclusions + has_earned = parental_earned > 0 + has_unearned = parental_unearned > 0 + remaining_earned = max_(parental_earned - exclusions.earned, 0) + # All earned: $65 and a second SSI standard for the parents. Earned and + # unearned: $65 plus one-half of the remaining earnings. All unearned: + # no earnings deduction. + countable = select( + [has_earned & has_unearned, has_earned], + [ + remaining_earned * (1 - exclusions.earned_share) + parental_unearned, + remaining_earned - allowance, + ], + default=parental_unearned, + ) + deemed = max_(countable - allowance - sibling_allowance, 0) + # The Iowa sources are silent on several eligible children; divide + # equally among the blind or disabled children of the same parents, as + # SSI does. + eligible_child = person("is_ssi_aged_blind_disabled", period.this_year) & ( + person("is_child", period.this_year) + ) + children = np.bincount( + pool, weights=eligible_child.astype(float), minlength=pool_count + )[pool] + return eligible_child * deemed / max_(children, 1) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_nonfinancial_eligible.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_nonfinancial_eligible.py new file mode 100644 index 00000000000..6f605e0025f --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_nonfinancial_eligible.py @@ -0,0 +1,57 @@ +from policyengine_us.model_api import * + + +class ia_ssa_nonfinancial_eligible(Variable): + value_type = bool + entity = Person + label = "Iowa SSA nonfinancial eligibility" + definition_period = MONTH + defined_for = StateCode.IA + reference = ( + # Iowa Code 249.3 + "https://www.legis.iowa.gov/docs/code/249.pdf#page=2", + # 441 IAC 51.2 and 51.7(2); PDF pages 1-2 + "https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=1", + # PDF pages 6, 8, 10-12 + "https://hhs.iowa.gov/media/3987/download?inline=#page=6", + ) + + def formula(person, period, parameters): + category = person("ia_ssa_category", period) + immigration = person("immigration_status", period.this_year) + citizen = immigration == immigration.possible_values.CITIZEN + immigrant = person("is_ssi_qualified_noncitizen", period.this_year) + # 6-B Nonfinancial Eligibility: applicants "must also apply for SSI or + # FIP if they might be eligible". An applicant whose income would + # qualify for SSI must take it up; one over income for SSI need not. + pursues_ssi = person("takes_up_ssi_if_eligible", period.this_year) | ( + person("uncapped_ssi", period) <= 0 + ) + # SMME disability excludes the substantial gainful activity screen: + # Iowa Code 249.3(4)(a)(2) says SGA "shall not preclude a determination + # of disability", 441 IAC 51.7(2) excepts "limits on substantial gainful + # activity", and 6-B p.10 requires "disability standards other than the + # inability to engage in substantial gainful activity". So SMME reads + # meets_ssi_disability_criteria rather than is_ssi_disabled (Case 77). + # NOTE: Iowa Code 249.3(4)(a) limits the SMME supplement to a person + # "Sixty-five years of age or older" or "Disabled as defined by 42 + # U.S.C. §1382c(a)(3)". 441 IAC 51.7(2) requires "all eligibility + # requirements for supplemental security income benefits other than + # limits on substantial gainful activity and income", and 6-B p.76 + # starts from "the SSI eligibility requirements", which include + # blindness (p.10). Where a statute and a rule or manual disagree, the + # model follows the statute (the statute-first rule in CONTRIBUTING.md), so a + # blind person under 65 who is not disabled gets no SMME, while one who + # is disabled does (ia_ssa.yaml Cases 72 and 76). + aged_blind_disabled = person("is_ssi_aged_blind_disabled", period.this_year) + aged_or_disabled = person("is_ssi_aged", period.this_year) | person( + "meets_ssi_disability_criteria", period.this_year + ) + smme = category == category.possible_values.SMME + return ( + where(smme, aged_or_disabled, aged_blind_disabled) + & (citizen | immigrant) + & (category != category.possible_values.NONE) + & ~person("is_incarcerated", period) + & pursues_ssi + ) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_rcf_couple_budget.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_rcf_couple_budget.py new file mode 100644 index 00000000000..25173adcd27 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_rcf_couple_budget.py @@ -0,0 +1,45 @@ +from policyengine_us.model_api import * + + +class ia_ssa_rcf_couple_budget(Variable): + value_type = bool + entity = Person + label = "Iowa SSA residential care couple budget in the month of entry" + definition_period = MONTH + defined_for = StateCode.IA + reference = ( + # 441 IAC 51.4(3); PDF pages 1-2 + "https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=1", + # PDF pages 60-61, 67-71 + "https://hhs.iowa.gov/media/3987/download?inline=#page=60", + ) + + def formula(person, period, parameters): + # 6-B Spouses Living Separately p.60: "When one or both spouses are + # receiving SSI before one or both enters an RCF, treat the spouses as + # a couple during the month of entry, then as individuals beginning the + # month after the month of entry", and "When neither spouse is + # receiving SSI before the entry of one or both into an RCF, treat the + # spouses separately beginning in the month of entry." 441 IAC 51.4(3) + # makes "Partners in a marriage who both enter the same room of the + # residential care facility in the same month" a couple for "the + # initial month"; spouses who both enter in the same month are taken + # to share a room (ia_ssa.yaml Cases 57, 59 and 60). A resident with an + # ineligible spouse is budgeted alone (ia_ssa.yaml Case 73); SSI's + # first-month deemed income from that spouse (6-B p.60) is not modeled. + # NOTE: A spouse who enters after the other spouse's month of entry + # also gets the couple budget when either spouse received SSI, while + # the spouse already in the facility stays on the individual budget. 51.4(3) covers spouses who "both + # enter" in the same month, and p.61 makes a couple of spouses sharing + # a room "During their first month in the RCF", so neither settles a + # later entry. + category = person("ia_ssa_category", period) + rcf = category == category.possible_values.RESIDENTIAL_CARE + entering = rcf & person("ia_ssa_care_initial_partial_month", period) + couple = person("ssi_couple_computation_applies", period) & person( + "ia_ssa_has_spouse", period + ) + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) + couple_received_ssi = person.marital_unit.any(receives_ssi) + both_enter = person.marital_unit.sum(entering) == 2 + return entering & couple & (couple_received_ssi | both_enter) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_rcf_daily_rate.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_rcf_daily_rate.py new file mode 100644 index 00000000000..d90dd9743af --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_rcf_daily_rate.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class ia_ssa_rcf_daily_rate(Variable): + value_type = float + entity = Person + label = "Iowa SSA approved residential care daily rate" + definition_period = MONTH + unit = USD + default_value = 0 + reference = ( + # 441 IAC 52.1(3) + "https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1", + "https://hhs.iowa.gov/media/3987/download?inline=#page=72", + ) + documentation = "A per diem rate below the maximum that the department established for the facility. Leave at 0 to pay the maximum per diem rate, as 441 IAC 52.1(3) provides from July 1, 2017; an entry above the maximum is capped. An entry carries into later months until it is changed." diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_resources_deemed_from_parents.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_resources_deemed_from_parents.py new file mode 100644 index 00000000000..7ffa7cf73c7 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_resources_deemed_from_parents.py @@ -0,0 +1,73 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.resources.deemed.ssi_resources_deemed_from_ineligible_parent import ( + _ssi_parental_resource_pool, +) + + +class ia_ssa_resources_deemed_from_parents(Variable): + value_type = float + entity = Person + label = "Iowa SSA resources deemed from parents" + definition_period = MONTH + quantity_type = STOCK + unit = USD + defined_for = StateCode.IA + reference = ( + # PDF pages 9, 12, 46-47 + "https://hhs.iowa.gov/media/3987/download?inline=#page=9", + "https://www.ecfr.gov/current/title-20/section-416.1202#p-416.1202(b)", + "https://www.ecfr.gov/current/title-20/section-416.1856", + "https://secure.ssa.gov/poms.nsf/lnx/0501330200", + "https://secure.ssa.gov/poms.nsf/lnx/0501330280", + "https://secure.ssa.gov/poms.nsf/lnx/0501330310", + "https://secure.ssa.gov/poms.nsf/lnx/0501330340", + ) + # 6-B deems parental resources above the $2,000 one-parent or $3,000 + # two-parent allowance "in the same manner as SSI policy"; these equal the + # SSI limits, so the federal parameters are used. The deemors are + # the co-resident parents named by parent links (or the unlinked-parent + # proxy) plus each parent's co-resident spouse, as in SSI's + # 416.1202(b)(1) pool, so a stepparent's resources are deemed. Parents + # receiving SSI are not resource deemors, but the allowance follows the + # number of co-resident deemors including them. The excess is divided + # among the children of the same deemors who receive SSI or would + # otherwise receive in-home health-related care, removing any child whose + # own resources plus the share exceed the limit (SI 01330.200 and .280). + # 6-B p.9: "For an SSI recipient, accept the Social Security + # Administration's determination of SSI eligibility as verification that + # income, resources, and age, blindness or disability requirements have + # been met." The child test is is_ssi_resource_deeming_child, which + # applies SSA's exclusions (the 416.1202(b)(2) home-care exception, a + # medical treatment facility, a married or household-head minor). Iowa + # therefore deems only where SSA would (ia_ssa.yaml Case 68), and in-home + # care children are deemed "in the same manner as SSI policy" (6-B p.46; + # ia_ssa_resources_deemed_from_parents.yaml Case 7; without marital units, + # ia_ssa.yaml Case 75). Other state-only + # sibling eligibility is not modeled. + + def formula(person, period, parameters): + limit = parameters(period).gov.ssa.ssi.eligibility.resources.limit + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) + resources = where(receives_ssi, 0, person("ssi_resources_for_deeming", period)) + parental_resources, parent_count, pool = _ssi_parental_resource_pool( + person, period, resources + ) + allowance = where(parent_count > 1, limit.couple, limit.individual) + excess = max_(parental_resources - allowance, 0) + child = person("is_ssi_resource_deeming_child", period) + ihhrc = person("ia_ssa_nonfinancial_eligible", period) & ( + person("ia_ssa_ihhrc_amount", period) > 0 + ) + own = person("ssi_countable_resources", period.this_year) + eligible = child & (receives_ssi | ihhrc) & (own <= limit.individual) + pool_count = int(np.max(pool, initial=-1)) + 1 + share = excess + # Each round removes at least one child or leaves the result stable. + for _ in range(int(np.max(person.household.nb_persons(), initial=0)) + 1): + count = np.bincount(pool[eligible], minlength=pool_count) + share = excess / max_(count[pool], 1) + remaining = eligible & (own + share <= limit.individual) + if np.array_equal(remaining, eligible): + break + eligible = remaining + return child * share diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_countable_income.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_countable_income.py new file mode 100644 index 00000000000..f2c2cab6a28 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_countable_income.py @@ -0,0 +1,72 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ia.hhs.ssa._smme_spouse_income import ( + smme_spouse_income, +) +from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import ( + _apply_ssi_exclusions, +) + + +class ia_ssa_smme_countable_income(Variable): + value_type = float + entity = Person + label = "Iowa SMME countable income for Medicaid coverage group" + definition_period = MONTH + unit = USD + defined_for = StateCode.IA + documentation = "SSI countable income plus any SSI payment, combined for a couple whose SSI couple computation applies. For a disabled person working above the SGA level, whom SSI does not count, the person's own income, including in-kind support and maintenance and any spouse income deemed under SSI's rules, after SSI's exclusions, including the student earned income exclusion. Deductions and financial groups of a Medicaid coverage category that differ from SSI are not modeled." + reference = ( + # Iowa Code 249.3(4)(g) + "https://www.legis.iowa.gov/docs/code/249.pdf#page=2", + # 441 IAC 51.7(6) + "https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=2", + "https://hhs.iowa.gov/media/3987/download?inline=#page=77", + ) + + def formula(person, period, parameters): + # 6-B Income (SMME): income "is determined according to SSI income + # criteria". ia_ssa compares it with 120 percent of the poverty + # guideline as Iowa Code 249.3(4)(g) sets it ("at least"; see the NOTE + # in ia_ssa). An eligible couple's combined income is compared with the + # two-person guideline (ia_ssa.yaml Cases 47-49). With an ineligible + # spouse, SSI countable income includes the income SSI deems from that + # spouse, and ia_ssa then uses the two-person guideline; when SSI deems + # nothing, 8-E p.12 says to "Process as a one-person household" + # (Cases 83-84). + # NOTE: Group-specific Medicaid budgeting is not modeled. + income = person("ssi_countable_income", period) + person("ssi", period) + # SSI counts income only for people it treats as aged, blind or + # disabled, so ssi_countable_income is 0 for a disabled person working + # above the SGA level, whom SMME still covers (Iowa Code + # 249.3(4)(a)(2)). That person's own income gets SSI's income rules + # instead: the student earned income exclusion (20 CFR + # 416.1112(c)(3)), in-kind support and maintenance (416.1130, 416.1140) + # and the general and earned income exclusions (ia_ssa.yaml Cases 77, + # 87 and 88). As 8-E pp.12-13 do, a spouse's income above the couple + # rate less the individual rate, or an aged, blind or disabled + # spouse's income, is added before the exclusions + # (ia_ssa_smme_spousal_deeming_applies), and ia_ssa then uses the + # two-person guideline (Cases 82, 90-92 and 94-97). + # NOTE: Income deemed from a parent is not modeled on this path. + earned = max_( + person("ssi_earned_income", period) + - person("ssi_blind_or_disabled_working_student_exclusion", period), + 0, + ) + unearned = person("ssi_unearned_income", period) + person( + "ssi_in_kind_support_and_maintenance", period + ) + deemed = person("ia_ssa_smme_spousal_deeming_applies", period) + spouse_earned, spouse_unearned = smme_spouse_income(person, period) + earned = earned + deemed * spouse_earned + unearned = unearned + deemed * spouse_unearned + own_income = ( + _apply_ssi_exclusions( + earned * MONTHS_IN_YEAR, unearned * MONTHS_IN_YEAR, parameters, period + ) + / MONTHS_IN_YEAR + ) + counted_by_ssi = person("is_ssi_aged_blind_disabled", period.this_year) + income = where(counted_by_ssi, income, own_income) + joint = person("ssi_couple_computation_applies", period) + return where(joint, person.marital_unit.sum(income), income) diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_coverage_eligible.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_coverage_eligible.py new file mode 100644 index 00000000000..0cac605bf72 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_coverage_eligible.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class ia_ssa_smme_coverage_eligible(Variable): + value_type = bool + entity = Person + label = "Iowa SMME full Medicaid and Medicare Part B requirements met" + definition_period = MONTH + default_value = False + reference = "https://hhs.iowa.gov/media/3987/download?inline=#page=76" + documentation = "Receiving full Medicaid under a category independent of SSA without a premium or spenddown, and eligible for Medicare Part B. Ordinary Medicaid enrollment alone does not establish this status." diff --git a/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_spousal_deeming_applies.py b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_spousal_deeming_applies.py new file mode 100644 index 00000000000..2541f0cb848 --- /dev/null +++ b/policyengine_us/variables/gov/states/ia/hhs/ssa/ia_ssa_smme_spousal_deeming_applies.py @@ -0,0 +1,66 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ia.hhs.ssa._smme_spouse_income import ( + smme_spouse_income, + smme_spouse_is_aged_blind_disabled, +) + + +class ia_ssa_smme_spousal_deeming_applies(Variable): + value_type = bool + entity = Person + label = "Iowa SMME deems spouse income to an applicant working above the SGA level" + definition_period = MONTH + defined_for = StateCode.IA + reference = ( + "https://www.law.cornell.edu/cfr/text/20/416.1163", + "https://www.ecfr.gov/current/title-20/section-416.1167", + # 8-E PDF pages 11-13 + "https://hhs.iowa.gov/media/4011/download?inline#page=11", + # 8-F PDF pages 73-74 + "https://hhs.iowa.gov/media/4012/download?inline#page=73", + ) + + def formula(person, period, parameters): + # 6-B Income (SMME) p.77 determines income "according to SSI income + # criteria", and 8-E pp.11-13 deem an ineligible spouse's income for + # State Supplementary Assistance groups other than the Medically + # Needy, in-home care, dependent person and MEPD groups. SSI's deeming + # variables apply only to people SSI treats as aged, blind or + # disabled, so this test covers a disabled applicant working above the + # SGA level (Iowa Code 249.3(4)(a)(2), (c)): a spouse's income after + # child allocations is deemed when it is more than the couple rate + # less the individual rate. + applicant = person("meets_ssi_disability_criteria", period.this_year) & ~person( + "is_ssi_aged_blind_disabled", period.this_year + ) + # 8-E p.11 deems only while the applicant lives "in the same + # household" with the spouse. Under 20 CFR 416.1167(a)(1) an absence + # is temporary only if the person returns in the same or the next + # month, so a spouse (or the applicant) in a medical treatment + # facility for the month is not a household member and nothing is + # deemed (ia_ssa.yaml Case 96). + # NOTE: Intent to return is not modeled, as in + # ssi_couple_computation_applies. + apart = person.marital_unit.any( + person("ssi_lives_in_medical_treatment_facility", period) + ) + # 8-E p.12: "An ineligible spouse is a spouse who is not eligible for + # SSI or non-MAGI-related Medicaid, or State Supplementary + # Assistance." Those groups are for aged, blind or disabled people + # (8-F PDF pages 73-74), so, as is_ssi_ineligible_spouse does, a spouse + # SSI treats as aged, blind or disabled is not an ineligible spouse: the + # couple's income is combined with no $497 test, as SSI and + # msp_countable_income combine an eligible couple's income. + # NOTE: 8-E tests eligibility for SSI, non-MAGI-related Medicaid or + # State Supplementary Assistance. The model uses SSI's aged, blind or + # disabled status, so an aged, blind or disabled spouse who qualifies + # for none of them is combined rather than deemed. + eligible_spouse = smme_spouse_is_aged_blind_disabled(person, period) + earned, unearned = smme_spouse_income(person, period) + p = parameters(period).gov.ssa.ssi.amount + return ( + applicant + & person("ia_ssa_has_spouse", period) + & ~apart + & (eligible_spouse | (earned + unearned > p.couple - p.individual)) + ) diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 773567bfa1b..118a9e0dc0d 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -37,6 +37,7 @@ def formula(spm_unit, period, parameters): "ut_ssp", # Utah benefits "sd_ssp", # South Dakota benefits "va_ag", # Virginia benefits + "ia_ssa", # Iowa benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 843ddcbe21c..cfbf51172ce 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -1983,6 +1983,101 @@ candidates: state: ruled note: 'Ruled statute-first in October 2026; the rule requires replacing the approximation using claimant inputs, with annual verification because the supplied statutory URL is for 2026. Code not yet on main: ia_is_tax_exempt.' +- id: us-ia:rcf-maximum-per-diem-rate + program: ssi-state-supplement + years: + from: 2026 + to: 2026 + type: calendar + question: Is Iowa's residential care supplement based on the maximum per diem rate, or on the manual's choice of + a facility rate or the $17.86 flat rate? + sources: + - kind: statute + citation: Iowa Code 249.12(3) + url: https://www.legis.iowa.gov/docs/code/249.pdf#page=5 + - kind: regulation + citation: 441 IAC 52.1(3) + url: https://www.legis.iowa.gov/docs/iac/chapter/441.52.pdf#page=1 + - kind: manual + citation: Iowa HHS Employees' Manual 6-B, Billing and Payments (RCF) + url: https://hhs.iowa.gov/media/3987/download?inline=#page=72 + readings: + statute: Privately operated facilities "shall be reimbursed based on the maximum per diem rates established by + the general assembly". + other: The manual gives "two options", a cost-related rate up to $38.47 or "A flat per diem rate ... $17.86 + beginning February 1, 2004". + example: An SSI-only resident with no facility rate entered gets $328.57 in January 2026 at the maximum rate, and + $0 at the flat rate (31 × 17.86 = 553.66, below the $864 participation). + pe_us: + follows: statute + code: [] + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/8017 + state: ruled + note: 'Code not yet on main: ia_ssa, ia_ssa_rcf_daily_rate. Iowa Code 249.12(3) names privately operated + facilities.' +- id: us-ia:smme-blind-under-65 + program: ssi-state-supplement + years: + from: 2026 + to: 2026 + type: calendar + question: Can a blind person under 65 who is not disabled receive Iowa's Supplement for Medicare and Medicaid + Eligibles (SMME)? + sources: + - kind: statute + citation: Iowa Code 249.3(4)(a) + url: https://www.legis.iowa.gov/docs/code/249.pdf#page=2 + - kind: regulation + citation: 441 IAC 51.7(2) + url: https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=2 + - kind: manual + citation: Iowa HHS Employees' Manual 6-B, SMME and SSI eligibility requirements + url: https://hhs.iowa.gov/media/3987/download?inline=#page=76 + readings: + statute: Only a person "Sixty-five years of age or older" or "Disabled as defined by 42 U.S.C. §1382c(a)(3)" + qualifies, so blindness alone does not. + other: The rule requires "all eligibility requirements for supplemental security income benefits other than + limits on substantial gainful activity and income", which include blindness. + example: A blind 50-year-old with a $2,020 monthly pension and SMME coverage gets $0 under the statute and $1 + under the rule. + pe_us: + follows: statute + code: [] + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/8017 + state: ruled + note: 'Code not yet on main: ia_ssa_nonfinancial_eligible.' +- id: us-ia:smme-income-at-least-120-percent + program: ssi-state-supplement + years: + from: 2026 + to: 2026 + type: calendar + question: Does Iowa's SMME supplement require income of at least, or more than, 120 percent of the poverty + guideline? + sources: + - kind: statute + citation: Iowa Code 249.3(4)(g) + url: https://www.legis.iowa.gov/docs/code/249.pdf#page=2 + - kind: regulation + citation: 441 IAC 51.7(6) + url: https://www.legis.iowa.gov/docs/iac/chapter/441.51.pdf#page=2 + - kind: manual + citation: Iowa HHS Employees' Manual 6-B, Income (SMME) + url: https://hhs.iowa.gov/media/3987/download?inline=#page=77 + readings: + statute: Income "of at least one hundred twenty percent of the federal poverty level" qualifies. + other: Income "must exceed 120 percent of the federal poverty level". + example: From April 2026, a single applicant with countable income of exactly $1,596 (1.2 × 15,960 / 12) gets $1 + under the statute and $0 under the rule. + pe_us: + follows: statute + code: [] + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/8017 + state: ruled + note: 'Code not yet on main: ia_ssa.' - id: us-id:grocery-credit-claimable-spouse program: income-tax years: