From 59e60860e4eb35d12ae528048e5559d444003acb Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 29 May 2026 22:24:41 -0400 Subject: [PATCH 1/3] Fix Indiana TANF to pay the IC 12-14-2-5 maximum benefit Indiana TANF previously paid the standard of need ($255 for a family of two) instead of the amount of assistance / maximum benefit ($409 from 2024-07-01). Add an amount_of_assistance parameter schedule and an in_tanf_maximum_benefit variable, and rewire in_tanf and in_tanf_payment_eligible to use it. Also add the post-2025 initial eligibility screens (35% FPL gross / maximum-grant net, rising to 50% FPL from 2027) per IC 12-14-1-1.7 and FSSA Chapter 3000, while preserving the pre-2025 standard-of-need test and the 100% FPL continuing test. Co-Authored-By: Claude Opus 4.8 (1M context) --- changelog.d/in-tanf-maximum-benefit.fixed.md | 1 + .../additional_member_amount.yaml | 15 ++ .../tanf/amount_of_assistance/amount.yaml | 62 ++++++++ .../amount_of_assistance/max_table_size.yaml | 14 ++ .../initial/gross_income/fpg_rate.yaml | 16 ++ .../net_income/maximum_grant_rate.yaml | 13 ++ .../tanf/benefit/in_tanf_maximum_benefit.yaml | 79 ++++++++++ .../gov/states/in/fssa/tanf/edge_cases.yaml | 4 +- .../in_tanf_countable_income_eligible.yaml | 145 ++++++++++++++++++ .../eligibility/in_tanf_payment_eligible.yaml | 45 ++++-- .../gov/states/in/fssa/tanf/in_tanf.yaml | 81 +++++++++- .../tanf/income/in_tanf_gross_income.yaml | 94 ++++++++++++ .../gov/states/in/fssa/tanf/integration.yaml | 65 ++++++++ .../in_tanf_countable_income_eligible.py | 34 ++-- .../eligibility/in_tanf_payment_eligible.py | 6 +- .../gov/states/in/fssa/tanf/in_tanf.py | 8 +- .../in/fssa/tanf/in_tanf_maximum_benefit.py | 22 +++ .../in/fssa/tanf/in_tanf_payment_standard.py | 3 +- .../fssa/tanf/income/in_tanf_gross_income.py | 13 ++ 19 files changed, 681 insertions(+), 39 deletions(-) create mode 100644 changelog.d/in-tanf-maximum-benefit.fixed.md create mode 100644 policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml create mode 100644 policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml create mode 100644 policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml create mode 100644 policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py create mode 100644 policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py diff --git a/changelog.d/in-tanf-maximum-benefit.fixed.md b/changelog.d/in-tanf-maximum-benefit.fixed.md new file mode 100644 index 00000000000..31181cd37fc --- /dev/null +++ b/changelog.d/in-tanf-maximum-benefit.fixed.md @@ -0,0 +1 @@ +Correct Indiana TANF benefit payments to use the IC 12-14-2-5 maximum benefit and add the post-2025 gross/net income eligibility screens. diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml new file mode 100644 index 00000000000..aafed0669d3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml @@ -0,0 +1,15 @@ +description: Indiana provides this additional amount for each assistance unit member above the maximum benefit table size under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 0 + 2024-07-01: 104 + +metadata: + unit: currency-USD + period: month + label: Indiana TANF maximum benefit additional member amount + reference: + - title: IC 12-14-2-5 (amount of assistance; payment made; maximum amounts) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: FSSA DFR - About TANF + href: https://www.in.gov/fssa/dfr/tanf-cash-assistance/about-tanf/ diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml new file mode 100644 index 00000000000..bff77a35a50 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml @@ -0,0 +1,62 @@ +description: Indiana provides this amount as the maximum benefit under the Temporary Assistance for Needy Families program. + +1: + 1997-10-01: 139 + 2023-07-01: 155 + 2024-07-01: 248 +2: + 1997-10-01: 229 + 2023-07-01: 255 + 2024-07-01: 409 +3: + 1997-10-01: 288 + 2023-07-01: 320 + 2024-07-01: 513 +4: + 1997-10-01: 346 + 2023-07-01: 385 + 2024-07-01: 617 +5: + 1997-10-01: 405 + 2023-07-01: 450 + 2024-07-01: 721 +6: + 1997-10-01: 463 + 2023-07-01: 515 + 2024-07-01: 825 +7: + 1997-10-01: 522 + 2023-07-01: 580 + 2024-07-01: 929 +8: + 1997-10-01: 580 + 2023-07-01: 645 + 2024-07-01: 1_033 +9: + 1997-10-01: 639 + 2023-07-01: 710 + 2024-07-01: 1_137 +10: + 1997-10-01: 697 + 2023-07-01: 775 + 2024-07-01: 1_241 + +metadata: + unit: currency-USD + period: month + breakdown: + - range(1, 11) + breakdown_labels: + - Assistance unit size + label: Indiana TANF maximum benefit amount + reference: + - title: IC 12-14-2-5 (amount of assistance; payment made; maximum amounts) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: 470 IAC 10.3-4-3(a)(1) (corroborates pre-2024 amounts equal to standard of need) + href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3 + - title: FSSA SNAP/TANF Transmittal 2024 (Section 3050.10.00, maximum benefits effective 7/1/2024) + href: https://www.in.gov/fssa/dfr/files/SNAP-TANF-Transmittal2024.pdf + - title: FSSA SNAP/TANF Program Policy Manual, Section 3050.10.00 + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=7 + - title: CBPP TANF benefit levels (corroborates 2023-07-01 increase) + href: https://www.cbpp.org/research/income-security/continued-increases-in-tanf-benefit-levels-are-critical-to-helping diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml new file mode 100644 index 00000000000..3e825112811 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/max_table_size.yaml @@ -0,0 +1,14 @@ +description: Indiana sets this as the largest assistance unit size in the maximum benefit table under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 10 + +metadata: + unit: person + period: year + label: Indiana TANF maximum benefit table size + reference: + - title: IC 12-14-2-5 (amount of assistance; payment made; maximum amounts) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 + - title: 470 IAC 10.3-4-3(a)(1) + href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml new file mode 100644 index 00000000000..af7c2c4119d --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/gross_income/fpg_rate.yaml @@ -0,0 +1,16 @@ +description: Indiana limits initial applicants' gross income to this share of the federal poverty guideline under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: .inf # No gross income screen before 2025-07-01 (standard of need governs) + 2025-07-01: 0.35 + 2027-07-01: 0.5 + +metadata: + unit: /1 + period: month + label: Indiana TANF initial eligibility gross income FPG rate + reference: + - title: IC 12-14-1-1.7(b)-(c) (35% FPL through June 30, 2027; 50% FPL after) + href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7 + - title: FSSA DFR Chapter 3000, Section 3010.15.00 (gross income standard) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml new file mode 100644 index 00000000000..212e7685308 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/initial/net_income/maximum_grant_rate.yaml @@ -0,0 +1,13 @@ +description: Indiana limits initial applicants' countable net income to this share of the maximum benefit under the Temporary Assistance for Needy Families program. + +values: + 1997-10-01: 0 # Standard of need governs initial net income before 2025-07-01 + 2025-07-01: 1 + +metadata: + unit: /1 + period: month + label: Indiana TANF initial eligibility net income maximum benefit rate + reference: + - title: FSSA DFR Chapter 3000, Section 3010.15.00 (net income standard equal to the maximum grant) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=4 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml new file mode 100644 index 00000000000..9d0ae738263 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml @@ -0,0 +1,79 @@ +# Tests for in_tanf_maximum_benefit (amount of assistance, IC 12-14-2-5) +# Maximum benefit by assistance unit size across the 2023 and 2024 increases. + +- name: Family of 2 pre-2023 amount + period: 2022-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 229 + +- name: Family of 2 January 2024 still pre-July-2024 amount + period: 2024-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 255 + # 2023-07-01 amount; the 2024-07-01 increase is not yet effective + +- name: Family of 2 January 2025 increased amount + period: 2025-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 409 + # 2024-07-01 amount (IC 12-14-2-5) + +- name: Family of 2 January 2026 amount + period: 2026-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 2 + state_code: IN + output: + in_tanf_maximum_benefit: 409 + +- name: Family of 3 January 2025 amount + period: 2025-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_maximum_benefit: 513 + +- name: Family of 10 January 2025 amount + period: 2025-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 10 + state_code: IN + output: + in_tanf_maximum_benefit: 1_241 + +- name: Family of 11 January 2025 adds one additional member increment + period: 2025-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 11 + state_code: IN + output: + in_tanf_maximum_benefit: 1_345 + # Size-10 amount ($1,241) + $104 for the 11th member + +- name: Family of 11 January 2024 has no additional member increment + period: 2024-01 + absolute_error_margin: 0.1 + input: + spm_unit_size: 11 + state_code: IN + output: + in_tanf_maximum_benefit: 775 + # Before 2024-07-01 the additional member amount is $0, so size 11 is + # capped at the size-10 standard-of-need amount ($775) diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml index 5e216aaa486..2ce04de13a3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/edge_cases.yaml @@ -138,7 +138,7 @@ period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 320 + in_tanf_maximum_benefit: 320 in_tanf_countable_income_for_payment: 319 state_code: IN output: @@ -164,4 +164,4 @@ state_code: IN output: in_tanf: 255 - # Capped at payment standard for family of 2 ($255), not inflated + # Capped at the maximum benefit for family of 2 ($255), not inflated diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml index 84703243a4a..ca7b7ca3303 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml @@ -164,3 +164,148 @@ in_tanf_countable_income_for_eligibility: 586.7 in_tanf_countable_income_eligible: true # Countable ($586.70) < 100% FPL for 3 (~$1,988/mo) -> eligible + +# Post-2025 initial eligibility (IC 12-14-1-1.7; FSSA 3010.15.00). +# Initial applicants must have countable net income below the maximum grant +# and gross income at or below 35% FPG (50% from 2027-07-01). For Indiana the +# net (maximum grant) standard binds before the looser 35% FPG gross screen. + +- name: Applicant family of 3 just below the maximum grant net standard in 2026 + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 512 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_for_eligibility: 512 + in_tanf_countable_income_eligible: true + # Net ($512) < maximum grant ($513); gross ($512) <= 35% FPG ($777) -> eligible + +- name: Applicant family of 3 at the maximum grant net standard in 2026 + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 513 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_for_eligibility: 513 + in_tanf_countable_income_eligible: false + # Net ($513) >= maximum grant ($513) -> not eligible (strict less-than) + +- name: Applicant family of 3 below the maximum grant net standard in 2028 + period: 2028-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 500 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: true + # Net ($500) < maximum grant ($513); gross ($500) <= 50% FPG ($1,165) -> eligible + +- name: Applicant family of 3 high earner fails both 2026 screens + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_earned_income: 3_000 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: false + # Net ($2,910 = $3,000 - $90) >= maximum grant and gross ($3,000) > 35% FPG + +- name: Enrolled family of 3 below 100% FPG in 2026 remains eligible + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 2_000 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: true + # Enrolled: countable ($2,000) < 100% FPG for 3 ($2,220.83) -> eligible + +- name: Enrolled family of 3 above 100% FPG in 2026 loses eligibility + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 2_300 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: true + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_countable_income_eligible: false + # Enrolled: countable ($2,300) >= 100% FPG for 3 ($2,220.83) -> not eligible diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml index 939290a0d4f..0ccb073e152 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml @@ -1,6 +1,6 @@ # Tests for in_tanf_payment_eligible # Uses payment disregards: 75% earned income (only 25% counts) -# Compares to payment standard +# Compares to the maximum benefit (IC 12-14-2-5) - name: Family of 3 with zero countable income - eligible period: 2024-01 @@ -10,9 +10,9 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($0) < standard of need ($320) → eligible + # Countable income ($0) < maximum benefit ($320) → eligible -- name: Family of 3 with income below standard of need - eligible +- name: Family of 3 with income below maximum benefit - eligible period: 2024-01 input: spm_unit_size: 3 @@ -20,9 +20,9 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($300) < standard of need ($320) → eligible + # Countable income ($300) < maximum benefit ($320) → eligible -- name: Family of 3 with income at standard of need - not eligible +- name: Family of 3 with income at maximum benefit - not eligible period: 2024-01 input: spm_unit_size: 3 @@ -30,9 +30,9 @@ state_code: IN output: in_tanf_payment_eligible: false - # Countable income ($320) >= standard of need ($320) → not eligible + # Countable income ($320) >= maximum benefit ($320) → not eligible -- name: Family of 3 with income above standard of need - not eligible +- name: Family of 3 with income above maximum benefit - not eligible period: 2024-01 input: spm_unit_size: 3 @@ -40,9 +40,9 @@ state_code: IN output: in_tanf_payment_eligible: false - # Countable income ($400) > standard of need ($320) → not eligible + # Countable income ($400) > maximum benefit ($320) → not eligible -- name: Family of 1 below standard of need - eligible +- name: Family of 1 below maximum benefit - eligible period: 2024-01 input: spm_unit_size: 1 @@ -50,9 +50,9 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($150) < standard of need ($155) → eligible + # Countable income ($150) < maximum benefit ($155) → eligible -- name: Family of 2 below standard of need - eligible +- name: Family of 2 below maximum benefit - eligible period: 2024-01 input: spm_unit_size: 2 @@ -60,4 +60,25 @@ state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($250) < standard of need ($255) → eligible + # Countable income ($250) < maximum benefit ($255) → eligible + +- name: Family of 3 with income above old standard of need now eligible in 2025 + period: 2025-01 + input: + spm_unit_size: 3 + in_tanf_countable_income_for_payment: 400 + state_code: IN + output: + in_tanf_payment_eligible: true + # Countable income ($400) < 2024-07-01 maximum benefit ($513) → eligible, + # whereas $400 exceeded the standard of need ($320) + +- name: Family of 3 with income at 2025 maximum benefit - not eligible + period: 2025-01 + input: + spm_unit_size: 3 + in_tanf_countable_income_for_payment: 513 + state_code: IN + output: + in_tanf_payment_eligible: false + # Countable income ($513) >= maximum benefit ($513) → not eligible diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml index 49adcce45bd..3dcf459c415 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml @@ -2,7 +2,7 @@ period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 0 state_code: IN output: @@ -13,7 +13,7 @@ period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 200 state_code: IN output: @@ -24,7 +24,7 @@ period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 409 + in_tanf_maximum_benefit: 409 in_tanf_countable_income_for_payment: 100 state_code: IN output: @@ -35,30 +35,95 @@ period: 2024-01 input: in_tanf_eligible: false - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 100 state_code: IN output: in_tanf: 0 -- name: Family with countable income equal to payment standard +- name: Family with countable income equal to maximum benefit period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 513 state_code: IN output: in_tanf: 0 # Max benefit ($513) - countable income ($513) = $0 -- name: Family with countable income exceeding payment standard +- name: Family with countable income exceeding maximum benefit period: 2024-01 input: in_tanf_eligible: true - in_tanf_payment_standard: 513 + in_tanf_maximum_benefit: 513 in_tanf_countable_income_for_payment: 600 state_code: IN output: in_tanf: 0 # max(513 - 600, 0) = 0 + +- name: Family of two, adult and child, no income, no SSI, January 2026. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 0 + ssi: 0 + person2: + age: 5 + employment_income: 0 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf: 409 + # 2024-07-01 maximum benefit for a family of 2 (IC 12-14-2-5) + +- name: Family of two, no income, January 2024 still pays pre-July-2024 amount. + period: 2024-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf: 255 + # January 2024 is before the 2024-07-01 increase, so the maximum benefit + # is still the 2023-07-01 amount ($255) for a family of 2. + +- name: Family of two, no income, January 2025 pays the increased amount. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: IN + output: + in_tanf: 409 + # 2024-07-01 maximum benefit for a family of 2 ($409) diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml new file mode 100644 index 00000000000..6f6d0f1d630 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/income/in_tanf_gross_income.yaml @@ -0,0 +1,94 @@ +# Tests for in_tanf_gross_income +# Sum of gross earned and gross unearned income (no disregards), used by the +# post-2025 initial gross income screen. + +- name: No income + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 0 + +- name: Earned income only + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 400 + tanf_gross_unearned_income: 0 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 400 + # Gross income has no disregards applied + +- name: Unearned income only + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 0 + tanf_gross_unearned_income: 300 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 300 + +- name: Both earned and unearned income + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 500 + tanf_gross_unearned_income: 200 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: IN + output: + in_tanf_gross_income: 700 + # $500 earned + $200 unearned = $700 + +- name: Multiple people in unit + period: 2024-01 + input: + people: + person1: + tanf_gross_earned_income: 200 + person2: + tanf_gross_unearned_income: 100 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + in_tanf_gross_income: 300 + # $200 (person1 earned) + $100 (person2 unearned) = $300 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml index 7757ddda307..9d5dbf85f0e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml @@ -366,3 +366,68 @@ in_tanf_eligible: true in_tanf: 145 # $320 - $175 = $145 + +- name: Case 11, family of 3 no income receives 2024-07-01 maximum benefit in 2026. + period: 2026-01 + input: + people: + person1: + age: 30 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + spm_unit_size: 3 + in_tanf_payment_standard: 320 + # Standard of need (eligibility table) is unchanged + in_tanf_maximum_benefit: 513 + # Family of 3 maximum benefit (IC 12-14-2-5, effective 2024-07-01) + in_tanf_countable_income_for_payment: 0 + in_tanf_countable_income_eligible: true + in_tanf_payment_eligible: true + in_tanf_eligible: true + in_tanf: 513 + # Maximum benefit ($513) - countable income ($0) = $513 + +- name: Case 12, applicant income above old standard of need now receives a benefit in 2026. + period: 2026-01 + input: + people: + person1: + age: 30 + tanf_gross_unearned_income: 400 + person2: + age: 10 + person3: + age: 8 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: false + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2, person3] + state_code: IN + output: + spm_unit_size: 3 + in_tanf_maximum_benefit: 513 + in_tanf_countable_income_for_payment: 400 + in_tanf_countable_income_for_eligibility: 400 + in_tanf_countable_income_eligible: true + # Net ($400) < maximum grant ($513); gross ($400) <= 35% FPG -> eligible + in_tanf_payment_eligible: true + # $400 < maximum benefit ($513); above the old standard of need ($320) + in_tanf_eligible: true + in_tanf: 113 + # Maximum benefit ($513) - countable income ($400) = $113 diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py index 88ffa64028b..2456549bfa6 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py @@ -9,21 +9,35 @@ class in_tanf_countable_income_eligible(Variable): reference = ( "https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-1", "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=4", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=5", ) defined_for = StateCode.IN def formula(spm_unit, period, parameters): - # Initial: standard of need; Continuing: FPL * rate - p = parameters(period).gov.states["in"].fssa.tanf + p = parameters(period).gov.states["in"].fssa.tanf.eligibility countable = spm_unit("in_tanf_countable_income_for_eligibility", period) - is_enrolled = spm_unit("is_tanf_enrolled", period) - fpg = spm_unit("tanf_fpg", period) - continuing_threshold = fpg * p.eligibility.continuing.fpg_rate - threshold = where( - is_enrolled, - continuing_threshold, - spm_unit("in_tanf_payment_standard", period), + # Continuing/enrolled recipients: countable net income below 100% FPG + # (470 IAC 10.3-4-1; FSSA 3010.15.05). + continuing_eligible = countable < fpg * p.continuing.fpg_rate + + # Initial applicants. The net income standard is the standard of need + # before 2025-07-01 (maximum grant rate of 0) and the maximum grant + # from 2025-07-01 (FSSA 3010.15.00). From 2025-07-01 there is also a + # gross income screen at 35% FPG, rising to 50% after June 30, 2027 + # (IC 12-14-1-1.7); before then the screen is inactive (infinite rate). + standard_of_need = spm_unit("in_tanf_payment_standard", period) + maximum_grant = spm_unit("in_tanf_maximum_benefit", period) + grant_rate = p.initial.net_income.maximum_grant_rate + net_threshold = where( + grant_rate > 0, maximum_grant * grant_rate, standard_of_need ) - return countable < threshold + gross_income = spm_unit("in_tanf_gross_income", period) + initial_eligible = (countable < net_threshold) & ( + gross_income <= fpg * p.initial.gross_income.fpg_rate + ) + + is_enrolled = spm_unit("is_tanf_enrolled", period) + return where(is_enrolled, continuing_eligible, initial_eligible) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py index 273a61a33c5..e18c2de0162 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.py @@ -7,12 +7,12 @@ class in_tanf_payment_eligible(Variable): label = "Indiana TANF payment eligible" definition_period = MONTH reference = ( - "https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3", "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=7", ) defined_for = StateCode.IN def formula(spm_unit, period, parameters): countable = spm_unit("in_tanf_countable_income_for_payment", period) - payment_standard = spm_unit("in_tanf_payment_standard", period) - return countable < payment_standard + maximum_benefit = spm_unit("in_tanf_maximum_benefit", period) + return countable < maximum_benefit diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py index 55df3dda1f9..15692230c87 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf.py @@ -14,7 +14,9 @@ class in_tanf(Variable): defined_for = "in_tanf_eligible" def formula(spm_unit, period, parameters): - payment_standard = spm_unit("in_tanf_payment_standard", period) + maximum_benefit = spm_unit("in_tanf_maximum_benefit", period) countable_income = spm_unit("in_tanf_countable_income_for_payment", period) - benefit = max_(payment_standard - countable_income, 0) - return min_(benefit, payment_standard) + benefit = max_(maximum_benefit - countable_income, 0) + # Cap at the maximum benefit so negative countable income cannot + # inflate the grant above the maximum. + return min_(benefit, maximum_benefit) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py new file mode 100644 index 00000000000..b18232f15f5 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class in_tanf_maximum_benefit(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF maximum benefit amount" + unit = USD + definition_period = MONTH + reference = ( + "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5", + "https://www.in.gov/fssa/dfr/files/SNAP-TANF-Transmittal2024.pdf", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=7", + ) + defined_for = StateCode.IN + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["in"].fssa.tanf.amount_of_assistance + size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(size, p.max_table_size) + additional_members = max_(size - p.max_table_size, 0) + return p.amount[capped_size] + additional_members * p.additional_member_amount diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py index 61f745d799d..0d54def2b36 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_payment_standard.py @@ -15,5 +15,6 @@ class in_tanf_payment_standard(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states["in"].fssa.tanf.standard_of_need - capped_size = min_(spm_unit("spm_unit_size", period), p.max_unit_size) + size = spm_unit("spm_unit_size", period.this_year) + capped_size = min_(size, p.max_unit_size) return p.amount[capped_size] diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py b/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py new file mode 100644 index 00000000000..282d3e4e129 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/income/in_tanf_gross_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class in_tanf_gross_income(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF gross income" + unit = USD + definition_period = MONTH + reference = "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7" + defined_for = StateCode.IN + + adds = ["tanf_gross_earned_income", "tanf_gross_unearned_income"] From 65ac70fa6a051657402f18cbc9b1c77571e4ef6f Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 2 Jun 2026 14:50:19 -0400 Subject: [PATCH 2/3] Fix Indiana TANF review issues --- .../additional_member_amount.yaml | 4 +- .../tanf/amount_of_assistance/amount.yaml | 24 +++--- .../states/in/fssa/tanf/eligibility/fpg.yaml | 48 ++++++++++++ .../tanf/benefit/in_tanf_maximum_benefit.yaml | 26 +++---- .../in_tanf_countable_income_eligible.yaml | 76 ++++++++++++++++++- .../in/fssa/tanf/eligibility/in_tanf_fpg.yaml | 17 +++++ ...in_tanf_initial_gross_income_standard.yaml | 17 +++++ .../eligibility/in_tanf_payment_eligible.yaml | 10 +-- .../gov/states/in/fssa/tanf/in_tanf.yaml | 25 +++--- .../gov/states/in/fssa/tanf/integration.yaml | 6 +- .../in_tanf_countable_income_eligible.py | 7 +- .../in/fssa/tanf/eligibility/in_tanf_fpg.py | 19 +++++ .../in_tanf_initial_gross_income_standard.py | 21 +++++ .../in/fssa/tanf/in_tanf_maximum_benefit.py | 1 - 14 files changed, 246 insertions(+), 55 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml create mode 100644 policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py create mode 100644 policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml index aafed0669d3..81642fe44ea 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/additional_member_amount.yaml @@ -2,7 +2,7 @@ description: Indiana provides this additional amount for each assistance unit me values: 1997-10-01: 0 - 2024-07-01: 104 + 2025-07-01: 104 metadata: unit: currency-USD @@ -13,3 +13,5 @@ metadata: href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 - title: FSSA DFR - About TANF href: https://www.in.gov/fssa/dfr/tanf-cash-assistance/about-tanf/ + - title: FSSA SNAP/TANF Program Policy Manual, Section 3050.10.00 (maximum benefits effective 7/1/2025) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml index bff77a35a50..a501c092b3c 100644 --- a/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/amount_of_assistance/amount.yaml @@ -3,43 +3,43 @@ description: Indiana provides this amount as the maximum benefit under the Tempo 1: 1997-10-01: 139 2023-07-01: 155 - 2024-07-01: 248 + 2025-07-01: 248 2: 1997-10-01: 229 2023-07-01: 255 - 2024-07-01: 409 + 2025-07-01: 409 3: 1997-10-01: 288 2023-07-01: 320 - 2024-07-01: 513 + 2025-07-01: 513 4: 1997-10-01: 346 2023-07-01: 385 - 2024-07-01: 617 + 2025-07-01: 617 5: 1997-10-01: 405 2023-07-01: 450 - 2024-07-01: 721 + 2025-07-01: 721 6: 1997-10-01: 463 2023-07-01: 515 - 2024-07-01: 825 + 2025-07-01: 825 7: 1997-10-01: 522 2023-07-01: 580 - 2024-07-01: 929 + 2025-07-01: 929 8: 1997-10-01: 580 2023-07-01: 645 - 2024-07-01: 1_033 + 2025-07-01: 1_033 9: 1997-10-01: 639 2023-07-01: 710 - 2024-07-01: 1_137 + 2025-07-01: 1_137 10: 1997-10-01: 697 2023-07-01: 775 - 2024-07-01: 1_241 + 2025-07-01: 1_241 metadata: unit: currency-USD @@ -54,9 +54,7 @@ metadata: href: https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5 - title: 470 IAC 10.3-4-3(a)(1) (corroborates pre-2024 amounts equal to standard of need) href: https://iar.iga.in.gov/code/2026/470/10.3#470-10.3-4-3 - - title: FSSA SNAP/TANF Transmittal 2024 (Section 3050.10.00, maximum benefits effective 7/1/2024) - href: https://www.in.gov/fssa/dfr/files/SNAP-TANF-Transmittal2024.pdf - - title: FSSA SNAP/TANF Program Policy Manual, Section 3050.10.00 + - title: FSSA SNAP/TANF Program Policy Manual, Section 3050.10.00 (maximum benefits effective 7/1/2025) href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=7 - title: CBPP TANF benefit levels (corroborates 2023-07-01 increase) href: https://www.cbpp.org/research/income-security/continued-increases-in-tanf-benefit-levels-are-critical-to-helping diff --git a/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml new file mode 100644 index 00000000000..6227e21bfd6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/in/fssa/tanf/eligibility/fpg.yaml @@ -0,0 +1,48 @@ +description: Indiana uses these annual federal poverty guideline amounts to calculate monthly income standards under the Temporary Assistance for Needy Families program. + +first_person: + 1992-10-01: 6_810 + 2011-10-01: 10_890 + 2015-10-01: 11_770 + 2016-10-01: 11_880 + 2017-10-01: 12_060 + 2018-10-01: 12_140 + 2019-10-01: 12_490 + 2020-10-01: 12_760 + 2021-10-01: 12_880 + 2022-10-01: 13_590 + 2023-10-01: 14_580 + 2024-10-01: 15_060 + 2025-07-01: 15_650 + 2026-03-01: 15_960 +additional_person: + 1992-10-01: 2_380 + 2011-10-01: 3_820 + 2015-10-01: 4_160 + 2016-10-01: 4_160 + 2017-10-01: 4_180 + 2018-10-01: 4_320 + 2019-10-01: 4_420 + 2020-10-01: 4_480 + 2021-10-01: 4_540 + 2022-10-01: 4_720 + 2023-10-01: 5_140 + 2024-10-01: 5_380 + 2025-07-01: 5_500 + 2026-03-01: 5_680 + +metadata: + unit: currency-USD + period: year + label: Indiana TANF federal poverty guideline + breakdown: + - [first_person, additional_person] + reference: + - title: FSSA DFR Chapter 3000, Section 3010.15.00 (cash assistance gross income standards effective 3/1/2026) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=4 + - title: FSSA DFR Chapter 3000, Section 3010.15.05 (cash assistance 100% FPG standards effective 3/1/2026) + href: https://www.in.gov/fssa/dfr/files/3000.pdf#page=5 + - title: Indiana FSSA TANF cash assistance income guidelines (standards preceding the 3/1/2026 update) + href: https://www.in.gov/fssa/dfr/tanf-cash-assistance/about-tanf/ + - title: HHS poverty guidelines + href: https://aspe.hhs.gov/topics/poverty-economic-mobility/poverty-guidelines diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml index 9d0ae738263..bc0fd69fb30 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/benefit/in_tanf_maximum_benefit.yaml @@ -1,5 +1,5 @@ # Tests for in_tanf_maximum_benefit (amount of assistance, IC 12-14-2-5) -# Maximum benefit by assistance unit size across the 2023 and 2024 increases. +# Maximum benefit by assistance unit size across the 2023 and 2025 increases. - name: Family of 2 pre-2023 amount period: 2022-01 @@ -10,7 +10,7 @@ output: in_tanf_maximum_benefit: 229 -- name: Family of 2 January 2024 still pre-July-2024 amount +- name: Family of 2 January 2024 amount period: 2024-01 absolute_error_margin: 0.1 input: @@ -18,17 +18,17 @@ state_code: IN output: in_tanf_maximum_benefit: 255 - # 2023-07-01 amount; the 2024-07-01 increase is not yet effective + # 2023-07-01 amount -- name: Family of 2 January 2025 increased amount +- name: Family of 2 January 2025 still pre-July-2025 amount period: 2025-01 absolute_error_margin: 0.1 input: spm_unit_size: 2 state_code: IN output: - in_tanf_maximum_benefit: 409 - # 2024-07-01 amount (IC 12-14-2-5) + in_tanf_maximum_benefit: 255 + # 2023-07-01 amount; the 2025-07-01 increase is not yet effective - name: Family of 2 January 2026 amount period: 2026-01 @@ -39,8 +39,8 @@ output: in_tanf_maximum_benefit: 409 -- name: Family of 3 January 2025 amount - period: 2025-01 +- name: Family of 3 January 2026 amount + period: 2026-01 absolute_error_margin: 0.1 input: spm_unit_size: 3 @@ -48,8 +48,8 @@ output: in_tanf_maximum_benefit: 513 -- name: Family of 10 January 2025 amount - period: 2025-01 +- name: Family of 10 January 2026 amount + period: 2026-01 absolute_error_margin: 0.1 input: spm_unit_size: 10 @@ -57,8 +57,8 @@ output: in_tanf_maximum_benefit: 1_241 -- name: Family of 11 January 2025 adds one additional member increment - period: 2025-01 +- name: Family of 11 January 2026 adds one additional member increment + period: 2026-01 absolute_error_margin: 0.1 input: spm_unit_size: 11 @@ -75,5 +75,5 @@ state_code: IN output: in_tanf_maximum_benefit: 775 - # Before 2024-07-01 the additional member amount is $0, so size 11 is + # Before 2025-07-01 the additional member amount is $0, so size 11 is # capped at the size-10 standard-of-need amount ($775) diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml index ca7b7ca3303..55b4a7a95a3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml @@ -167,7 +167,7 @@ # Post-2025 initial eligibility (IC 12-14-1-1.7; FSSA 3010.15.00). # Initial applicants must have countable net income below the maximum grant -# and gross income at or below 35% FPG (50% from 2027-07-01). For Indiana the +# and gross income below 35% FPG (50% from 2027-07-01). For Indiana the # net (maximum grant) standard binds before the looser 35% FPG gross screen. - name: Applicant family of 3 just below the maximum grant net standard in 2026 @@ -192,7 +192,7 @@ output: in_tanf_countable_income_for_eligibility: 512 in_tanf_countable_income_eligible: true - # Net ($512) < maximum grant ($513); gross ($512) <= 35% FPG ($777) -> eligible + # Net ($512) < maximum grant ($513); gross ($512) < gross standard ($778) -> eligible - name: Applicant family of 3 at the maximum grant net standard in 2026 period: 2026-01 @@ -239,7 +239,7 @@ state_code: IN output: in_tanf_countable_income_eligible: true - # Net ($500) < maximum grant ($513); gross ($500) <= 50% FPG ($1,165) -> eligible + # Net ($500) < maximum grant ($513); gross ($500) < 50% FPG -> eligible - name: Applicant family of 3 high earner fails both 2026 screens period: 2026-01 @@ -309,3 +309,73 @@ output: in_tanf_countable_income_eligible: false # Enrolled: countable ($2,300) >= 100% FPG for 3 ($2,220.83) -> not eligible + +- name: Applicant family of 3 passes the published March 2026 gross standard + period: 2026-03 + input: + people: + person1: + age: + 2026: 30 + tanf_gross_earned_income: + 2026-03: 260 + person2: + age: + 2026: 28 + tanf_gross_earned_income: + 2026-03: 260 + person3: + age: + 2026: 26 + tanf_gross_earned_income: + 2026-03: 260 + spm_units: + spm_unit: + members: [person1, person2, person3] + is_tanf_enrolled: + 2026-03: false + households: + household: + members: [person1, person2, person3] + state_code: + 2026: IN + output: + in_tanf_gross_income: 780 + in_tanf_countable_income_for_eligibility: 510 + in_tanf_initial_gross_income_standard: 797 + in_tanf_countable_income_eligible: true + # Gross ($780) < published standard ($797); net ($510) < maximum grant ($513). + +- name: Applicant family of 3 at the March 2026 gross standard is not eligible + period: 2026-03 + input: + in_tanf_countable_income_for_eligibility: + 2026-03: 510 + in_tanf_gross_income: + 2026-03: 797 + spm_unit_size: + 2026: 3 + is_tanf_enrolled: + 2026-03: false + state_code: + 2026: IN + output: + in_tanf_initial_gross_income_standard: 797 + in_tanf_countable_income_eligible: false + # Gross income must be strictly below the standard. + +- name: Enrolled family of 3 at the March 2026 FPG standard is not eligible + period: 2026-03 + input: + in_tanf_countable_income_for_eligibility: + 2026-03: 2_277 + spm_unit_size: + 2026: 3 + is_tanf_enrolled: + 2026-03: true + state_code: + 2026: IN + output: + in_tanf_fpg: 2_277 + in_tanf_countable_income_eligible: false + # Continuing net income must be strictly below the published standard. diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml new file mode 100644 index 00000000000..4a240360dfb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml @@ -0,0 +1,17 @@ +- name: Family of 3 uses the 2025 FPG standard through February 2026 + period: 2026-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_fpg: 2_221 + +- name: Family of 3 uses the updated FPG standard in March 2026 + period: 2026-03 + input: + spm_unit_size: + 2026: 3 + state_code: + 2026: IN + output: + in_tanf_fpg: 2_277 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml new file mode 100644 index 00000000000..d20d441e5dd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml @@ -0,0 +1,17 @@ +- name: Family of 3 uses the 2025 gross income standard through February 2026 + period: 2026-01 + input: + spm_unit_size: 3 + state_code: IN + output: + in_tanf_initial_gross_income_standard: 778 + +- name: Family of 3 uses the updated gross income standard in March 2026 + period: 2026-03 + input: + spm_unit_size: + 2026: 3 + state_code: + 2026: IN + output: + in_tanf_initial_gross_income_standard: 797 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml index 0ccb073e152..aa50241766c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_payment_eligible.yaml @@ -62,19 +62,19 @@ in_tanf_payment_eligible: true # Countable income ($250) < maximum benefit ($255) → eligible -- name: Family of 3 with income above old standard of need now eligible in 2025 - period: 2025-01 +- name: Family of 3 with income above old standard of need now eligible in 2026 + period: 2026-01 input: spm_unit_size: 3 in_tanf_countable_income_for_payment: 400 state_code: IN output: in_tanf_payment_eligible: true - # Countable income ($400) < 2024-07-01 maximum benefit ($513) → eligible, + # Countable income ($400) < 2025-07-01 maximum benefit ($513) → eligible, # whereas $400 exceeded the standard of need ($320) -- name: Family of 3 with income at 2025 maximum benefit - not eligible - period: 2025-01 +- name: Family of 3 with income at increased maximum benefit - not eligible + period: 2026-01 input: spm_unit_size: 3 in_tanf_countable_income_for_payment: 513 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml index 3dcf459c415..e3a91897ddd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/in_tanf.yaml @@ -1,5 +1,5 @@ - name: Family of 3 with no income receives maximum benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true in_tanf_maximum_benefit: 513 @@ -10,7 +10,7 @@ # Max benefit ($513) - countable income ($0) = $513 - name: Family of 3 with countable income receives reduced benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true in_tanf_maximum_benefit: 513 @@ -21,7 +21,7 @@ # Max benefit ($513) - countable income ($200) = $313 - name: Family of 2 with partial income - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true in_tanf_maximum_benefit: 409 @@ -32,7 +32,7 @@ # Max benefit ($409) - countable income ($100) = $309 - name: Ineligible family receives no benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: false in_tanf_maximum_benefit: 513 @@ -42,7 +42,7 @@ in_tanf: 0 - name: Family with countable income equal to maximum benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true in_tanf_maximum_benefit: 513 @@ -53,7 +53,7 @@ # Max benefit ($513) - countable income ($513) = $0 - name: Family with countable income exceeding maximum benefit - period: 2024-01 + period: 2026-01 input: in_tanf_eligible: true in_tanf_maximum_benefit: 513 @@ -85,9 +85,9 @@ state_code: IN output: in_tanf: 409 - # 2024-07-01 maximum benefit for a family of 2 (IC 12-14-2-5) + # 2025-07-01 maximum benefit for a family of 2 (IC 12-14-2-5) -- name: Family of two, no income, January 2024 still pays pre-July-2024 amount. +- name: Family of two, no income, January 2024 pays the 2023 amount. period: 2024-01 absolute_error_margin: 0.1 input: @@ -105,10 +105,9 @@ state_code: IN output: in_tanf: 255 - # January 2024 is before the 2024-07-01 increase, so the maximum benefit - # is still the 2023-07-01 amount ($255) for a family of 2. + # The 2023-07-01 maximum benefit is $255 for a family of 2. -- name: Family of two, no income, January 2025 pays the increased amount. +- name: Family of two, no income, January 2025 still pays the prior amount. period: 2025-01 absolute_error_margin: 0.1 input: @@ -125,5 +124,5 @@ members: [person1, person2] state_code: IN output: - in_tanf: 409 - # 2024-07-01 maximum benefit for a family of 2 ($409) + in_tanf: 255 + # The $409 maximum benefit is not effective until 2025-07-01. diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml index 9d5dbf85f0e..030b9df5f52 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/integration.yaml @@ -367,7 +367,7 @@ in_tanf: 145 # $320 - $175 = $145 -- name: Case 11, family of 3 no income receives 2024-07-01 maximum benefit in 2026. +- name: Case 11, family of 3 no income receives 2025-07-01 maximum benefit in 2026. period: 2026-01 input: people: @@ -391,7 +391,7 @@ in_tanf_payment_standard: 320 # Standard of need (eligibility table) is unchanged in_tanf_maximum_benefit: 513 - # Family of 3 maximum benefit (IC 12-14-2-5, effective 2024-07-01) + # Family of 3 maximum benefit (IC 12-14-2-5, effective 2025-07-01) in_tanf_countable_income_for_payment: 0 in_tanf_countable_income_eligible: true in_tanf_payment_eligible: true @@ -425,7 +425,7 @@ in_tanf_countable_income_for_payment: 400 in_tanf_countable_income_for_eligibility: 400 in_tanf_countable_income_eligible: true - # Net ($400) < maximum grant ($513); gross ($400) <= 35% FPG -> eligible + # Net ($400) < maximum grant ($513); gross ($400) < 35% FPG -> eligible in_tanf_payment_eligible: true # $400 < maximum benefit ($513); above the old standard of need ($320) in_tanf_eligible: true diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py index 2456549bfa6..7e0f4afb870 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.py @@ -17,7 +17,7 @@ class in_tanf_countable_income_eligible(Variable): def formula(spm_unit, period, parameters): p = parameters(period).gov.states["in"].fssa.tanf.eligibility countable = spm_unit("in_tanf_countable_income_for_eligibility", period) - fpg = spm_unit("tanf_fpg", period) + fpg = spm_unit("in_tanf_fpg", period) # Continuing/enrolled recipients: countable net income below 100% FPG # (470 IAC 10.3-4-1; FSSA 3010.15.05). @@ -27,7 +27,7 @@ def formula(spm_unit, period, parameters): # before 2025-07-01 (maximum grant rate of 0) and the maximum grant # from 2025-07-01 (FSSA 3010.15.00). From 2025-07-01 there is also a # gross income screen at 35% FPG, rising to 50% after June 30, 2027 - # (IC 12-14-1-1.7); before then the screen is inactive (infinite rate). + # (IC 12-14-1-1.7); before then the screen is inactive. standard_of_need = spm_unit("in_tanf_payment_standard", period) maximum_grant = spm_unit("in_tanf_maximum_benefit", period) grant_rate = p.initial.net_income.maximum_grant_rate @@ -35,8 +35,9 @@ def formula(spm_unit, period, parameters): grant_rate > 0, maximum_grant * grant_rate, standard_of_need ) gross_income = spm_unit("in_tanf_gross_income", period) + gross_threshold = spm_unit("in_tanf_initial_gross_income_standard", period) initial_eligible = (countable < net_threshold) & ( - gross_income <= fpg * p.initial.gross_income.fpg_rate + gross_income < gross_threshold ) is_enrolled = spm_unit("is_tanf_enrolled", period) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py new file mode 100644 index 00000000000..d8461de9178 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.py @@ -0,0 +1,19 @@ +import numpy as np + +from policyengine_us.model_api import * + + +class in_tanf_fpg(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF federal poverty guideline" + unit = USD + definition_period = MONTH + reference = "https://www.in.gov/fssa/dfr/files/3000.pdf#page=5" + defined_for = StateCode.IN + + def formula(spm_unit, period, parameters): + size = spm_unit("spm_unit_size", period.this_year) + p = parameters(period).gov.states["in"].fssa.tanf.eligibility.fpg + annual_fpg = p.first_person + p.additional_person * (size - 1) + return np.ceil(annual_fpg / MONTHS_IN_YEAR) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py new file mode 100644 index 00000000000..f8dd1f7cd40 --- /dev/null +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.py @@ -0,0 +1,21 @@ +import numpy as np + +from policyengine_us.model_api import * + + +class in_tanf_initial_gross_income_standard(Variable): + value_type = float + entity = SPMUnit + label = "Indiana TANF initial applicant gross income standard" + unit = USD + definition_period = MONTH + reference = ( + "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-1-1.7", + "https://www.in.gov/fssa/dfr/files/3000.pdf#page=4", + ) + defined_for = StateCode.IN + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states["in"].fssa.tanf.eligibility + fpg = spm_unit("in_tanf_fpg", period) + return np.ceil(fpg * p.initial.gross_income.fpg_rate) diff --git a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py index b18232f15f5..d0ef2f0e2c4 100644 --- a/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py +++ b/policyengine_us/variables/gov/states/in/fssa/tanf/in_tanf_maximum_benefit.py @@ -9,7 +9,6 @@ class in_tanf_maximum_benefit(Variable): definition_period = MONTH reference = ( "https://iga.in.gov/laws/2025/ic/titles/12/#12-14-2-5", - "https://www.in.gov/fssa/dfr/files/SNAP-TANF-Transmittal2024.pdf", "https://www.in.gov/fssa/dfr/files/3000.pdf#page=7", ) defined_for = StateCode.IN From c4c368e4c7df8017a2dd3edf0e9bfb3f3531895e Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 2 Jun 2026 15:19:56 -0400 Subject: [PATCH 3/3] Use January test periods for Indiana TANF post-2026 eligibility tests PolicyEngine only supports YYYY or YYYY-01 test periods; five cases used the illegal period: 2026-03. Move them to period: 2027-01, where the 2026-03-01 FPG values and the 35% gross-income rate are still in effect (the rate only rises to 50% at 2027-07-01), so expected outputs are unchanged. Date-keyed inputs flattened to scalars to match the valid sibling cases. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../in_tanf_countable_income_eligible.yaml | 63 +++++++------------ .../in/fssa/tanf/eligibility/in_tanf_fpg.yaml | 10 ++- ...in_tanf_initial_gross_income_standard.yaml | 10 ++- 3 files changed, 31 insertions(+), 52 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml index 55b4a7a95a3..9be35ececf5 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_countable_income_eligible.yaml @@ -310,35 +310,27 @@ in_tanf_countable_income_eligible: false # Enrolled: countable ($2,300) >= 100% FPG for 3 ($2,220.83) -> not eligible -- name: Applicant family of 3 passes the published March 2026 gross standard - period: 2026-03 +- name: Applicant family of 3 passes the post-March-2026 gross standard + period: 2027-01 input: people: person1: - age: - 2026: 30 - tanf_gross_earned_income: - 2026-03: 260 + age: 30 + tanf_gross_earned_income: 260 person2: - age: - 2026: 28 - tanf_gross_earned_income: - 2026-03: 260 + age: 28 + tanf_gross_earned_income: 260 person3: - age: - 2026: 26 - tanf_gross_earned_income: - 2026-03: 260 + age: 26 + tanf_gross_earned_income: 260 spm_units: spm_unit: members: [person1, person2, person3] - is_tanf_enrolled: - 2026-03: false + is_tanf_enrolled: false households: household: members: [person1, person2, person3] - state_code: - 2026: IN + state_code: IN output: in_tanf_gross_income: 780 in_tanf_countable_income_for_eligibility: 510 @@ -346,35 +338,26 @@ in_tanf_countable_income_eligible: true # Gross ($780) < published standard ($797); net ($510) < maximum grant ($513). -- name: Applicant family of 3 at the March 2026 gross standard is not eligible - period: 2026-03 +- name: Applicant family of 3 at the post-March-2026 gross standard is not eligible + period: 2027-01 input: - in_tanf_countable_income_for_eligibility: - 2026-03: 510 - in_tanf_gross_income: - 2026-03: 797 - spm_unit_size: - 2026: 3 - is_tanf_enrolled: - 2026-03: false - state_code: - 2026: IN + in_tanf_countable_income_for_eligibility: 510 + in_tanf_gross_income: 797 + spm_unit_size: 3 + is_tanf_enrolled: false + state_code: IN output: in_tanf_initial_gross_income_standard: 797 in_tanf_countable_income_eligible: false # Gross income must be strictly below the standard. -- name: Enrolled family of 3 at the March 2026 FPG standard is not eligible - period: 2026-03 +- name: Enrolled family of 3 at the post-March-2026 FPG standard is not eligible + period: 2027-01 input: - in_tanf_countable_income_for_eligibility: - 2026-03: 2_277 - spm_unit_size: - 2026: 3 - is_tanf_enrolled: - 2026-03: true - state_code: - 2026: IN + in_tanf_countable_income_for_eligibility: 2_277 + spm_unit_size: 3 + is_tanf_enrolled: true + state_code: IN output: in_tanf_fpg: 2_277 in_tanf_countable_income_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml index 4a240360dfb..27d087d6904 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_fpg.yaml @@ -6,12 +6,10 @@ output: in_tanf_fpg: 2_221 -- name: Family of 3 uses the updated FPG standard in March 2026 - period: 2026-03 +- name: Family of 3 uses the post-March-2026 FPG standard + period: 2027-01 input: - spm_unit_size: - 2026: 3 - state_code: - 2026: IN + spm_unit_size: 3 + state_code: IN output: in_tanf_fpg: 2_277 diff --git a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml index d20d441e5dd..e2c19e4c112 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/in/fssa/tanf/eligibility/in_tanf_initial_gross_income_standard.yaml @@ -6,12 +6,10 @@ output: in_tanf_initial_gross_income_standard: 778 -- name: Family of 3 uses the updated gross income standard in March 2026 - period: 2026-03 +- name: Family of 3 uses the post-March-2026 gross income standard + period: 2027-01 input: - spm_unit_size: - 2026: 3 - state_code: - 2026: IN + spm_unit_size: 3 + state_code: IN output: in_tanf_initial_gross_income_standard: 797