diff --git a/changelog.d/ar-liheap-cooling.added.md b/changelog.d/ar-liheap-cooling.added.md new file mode 100644 index 00000000000..9dd31de0604 --- /dev/null +++ b/changelog.d/ar-liheap-cooling.added.md @@ -0,0 +1 @@ +Add Arkansas LIHEAP summer regular cooling assistance. diff --git a/changelog.d/ar-liheap-cooling.fixed.md b/changelog.d/ar-liheap-cooling.fixed.md new file mode 100644 index 00000000000..38b64548264 --- /dev/null +++ b/changelog.d/ar-liheap-cooling.fixed.md @@ -0,0 +1 @@ +Stop Arkansas LIHEAP income limits at the federal maximum, the greater of HHS's 60% state median income amount and 150% of the poverty guideline. diff --git a/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml b/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml index e811bea6fbd..41ffd86c65d 100644 --- a/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml +++ b/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml @@ -4,6 +4,7 @@ values: - ak_hap # Alaska Heating Assistance Program - al_liheap # Alabama LIHEAP - ar_liheap # Arkansas LIHEAP + - ar_liheap_cooling # Arkansas LIHEAP cooling - az_liheap # Arizona LIHEAP # California's three components are exclusive by eligibility, so their sum is its single regular payment. - ca_liheap_utility_heating # California HEAP utility heating diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml index 515b1313e43..56399f52bdb 100644 --- a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/household_size_group.yaml @@ -1,4 +1,4 @@ -description: Arkansas uses these household size group boundaries for the regular heating benefit under the Low Income Home Energy Assistance Program. +description: Arkansas uses these household size group boundaries for the winter and summer regular benefits under the Low Income Home Energy Assistance Program. brackets: - threshold: 2024-10-01: 0 diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml index eb56a8db58a..8e8872ec56a 100644 --- a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/income_band.yaml @@ -1,4 +1,4 @@ -description: Arkansas uses these monthly countable income band boundaries for the regular heating benefit under the Low Income Home Energy Assistance Program. +description: Arkansas uses these monthly countable income band boundaries for the winter and summer regular benefits under the Low Income Home Energy Assistance Program. # Published lower bounds are inclusive and apply to monthly countable income # rounded to the nearest whole dollar. Bands with one threshold entry apply in # both FY2025 and FY2026; the top five lower bounds changed in FY2026. diff --git a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml index 634e598cf92..a3698b84fc8 100644 --- a/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml +++ b/policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/electricity.yaml @@ -1,4 +1,4 @@ -description: Arkansas provides this regular heating benefit for households using electricity under the Low Income Home Energy Assistance Program. +description: Arkansas provides this regular benefit for households heating with electricity in winter and for every household in summer under the Low Income Home Energy Assistance Program. # Cells with one entry apply in both FY2025 and FY2026. 1: @@ -340,3 +340,5 @@ metadata: href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Electric.pdf#page=1 - title: "Arkansas FY2025 Benefits Matrix, Electricity #page 1-2" href: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Electric.pdf#page=1 + - title: Arkansas FFY 2025 LIHEAP Policy and Procedures Manual, Section 6.1 + href: https://liheapch.acf.gov/docs/2025/manuals/AR_Manual_2025.pdf#page=78 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 6f704d520fb..ffad57110b2 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1061,7 +1061,15 @@ programs: full_name: Arkansas Low Income Home Energy Assistance Program variable: ar_liheap parameter_prefix: gov.states.ar.ee.aeo.liheap - notes: FY2025-FY2026 regular heating matrices and income limits are checked; income rules follow the FFY 2025 manual (no FY2026 manual was found), and other years are unverified. Crisis, cooling, weatherization and equipment assistance are out of scope. + notes: FY2025-FY2026 regular heating matrices and income limits are checked; income rules follow the FFY 2025 manual (no FY2026 manual was found), and other years are unverified. Summer cooling is the separate Arkansas LIHEAP cooling entry; crisis, weatherization and equipment assistance are out of scope. + - state: AR + status: partial + name: Arkansas LIHEAP cooling + full_name: Arkansas Low Income Home Energy Assistance Program summer regular cooling assistance + variable: ar_liheap_cooling + parameter_prefix: gov.states.ar.ee.aeo.liheap + verified_years: "2025-2026" + notes: FY2025-FY2026 summer regular benefit from the Electricity matrix, paid once per summer on the electric bill or, for unsubsidized renters, through utilities included in rent; the planned FY2027 increase has no posted matrix. Summer crisis and equipment are out of scope. - state: AZ status: partial name: Arizona LIHEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml index 6f1120caa45..69967ecd30f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/ar_liheap.yaml @@ -32,7 +32,7 @@ output: ar_liheap_household_size: 2 ar_liheap_countable_income: 4_800 - ar_liheap_income_limit: 36_840 + ar_liheap_income_limit: 36_834 ar_liheap_matrix_amount: 227 ar_liheap: 227 @@ -120,7 +120,8 @@ output: ar_liheap: [308, 0] -# FY2025: wages 21000x0.8=16800, MCI 1400; size-one limit 2251 (x12=27012). +# FY2025: wages 21000x0.8=16800, MCI 1400; size-one limit 27011 (chart 2251 x12=27012, stopped at +# HHS's FY2025 60% state median income amount). # FFY2025 electric row 1390-1449 pays 91 for 1&2 (the FY2026 row pays 88). - name: Case 6, FY2025 electric grant for a one person household. period: 2025 @@ -144,7 +145,7 @@ output: ar_liheap_household_size: 1 ar_liheap_countable_income: 16_800 - ar_liheap_income_limit: 27_012 + ar_liheap_income_limit: 27_011 ar_liheap_eligible: true ar_liheap_matrix_amount: 91 ar_liheap: 91 @@ -187,6 +188,7 @@ ar_liheap: 64 # Boundary: FY2025 size 7 uses 150% FPG, 47340x1.5/12=5917.50 -> 5918 (x12=71016); 60% SMI would be 5844. +# The federal maximum, 150% of the 2024 guideline (47340x1.5=71010), stops the limit at 71010. # Wages (50000+38500)x0.8=70800, MCI 5900, so eligible; FFY2025 electric 5140-Max pays 60 for 5&up. - name: Case 8, FY2025 seven person household between the SMI and FPG limits is paid. period: 2025 @@ -235,13 +237,13 @@ output: ar_liheap_household_size: 7 ar_liheap_countable_income: 70_800 - ar_liheap_income_limit: 71_016 + ar_liheap_income_limit: 71_010 ar_liheap_eligible: true ar_liheap_matrix_amount: 60 ar_liheap: 60 # FY2025 Medicare-net Social Security (plan 1.9 p6; manual 4.7.2 p59): 2025 Part B 185x12=2220; -# 26400-2220=24180, MCI 2015; size-one limit 27012; FFY2025 gas 2010-2129 pays 73 for 1&2. +# 26400-2220=24180, MCI 2015; size-one limit 27011; FFY2025 gas 2010-2129 pays 73 for 1&2. - name: Case 9, FY2025 Social Security net of the Part B premium sets the gas grant. period: 2025 input: @@ -265,7 +267,7 @@ output: ar_liheap_household_size: 1 ar_liheap_countable_income: 24_180 - ar_liheap_income_limit: 27_012 + ar_liheap_income_limit: 27_011 ar_liheap_eligible: true ar_liheap_matrix_amount: 73 ar_liheap: 73 @@ -484,7 +486,7 @@ # Current application section III excludes under-18 earnings whether or not the member # attends school, so countable income is 0. The FY2026 natural gas matrix awards 308 at -# zero income for size two (limit 3_070 x 12 = 36_840). +# zero income for size two (limit 36_834, HHS's 60% state median income amount). - name: Case 17, age 17 nonstudent earnings determine the final heating award. period: 2026 input: @@ -511,13 +513,13 @@ state_code: AR output: ar_liheap_countable_income: 0 - ar_liheap_income_limit: 36_840 + ar_liheap_income_limit: 36_834 ar_liheap_eligible: true ar_liheap: 308 # At 18, a member who is not in high school (manual section 4.7, p56) or college # reports work income: wages 48_000 x 0.8 = 38_400 exceed the two-person FY2026 limit -# 36_840, so no grant is paid. +# 36_834, so no grant is paid. - name: Case 18, age 18 nonstudent earnings determine the final heating award. period: 2026 input: @@ -545,7 +547,7 @@ state_code: AR output: ar_liheap_countable_income: 38_400 - ar_liheap_income_limit: 36_840 + ar_liheap_income_limit: 36_834 ar_liheap_eligible: false ar_liheap: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.yaml new file mode 100644 index 00000000000..81ef6beadd4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.yaml @@ -0,0 +1,160 @@ +# Arkansas summer regular (cooling) benefit: FFY 2025 manual section 6.1 (p78) uses the +# Electricity matrix "for both Winter and Summer Regular Assistance". Wages are full time +# at the $11.00 Arkansas minimum wage: 11 x 40 x 52 = 22_880. The 20% earned disregard +# gives 22_880 x 0.8 = 18_304; MCI 1_525.33 rounds to 1_525 (x12 = 18_300). The $1,800 +# electric bill shows that the household pays its own electric bill, which the summer grant +# pays; the bill does not change the grant. TEA is pinned to 0, as in the heating tests. + +# FY2026: size three uses the 3&4 column; the size-three limit is 45_501, HHS's 60% state +# median income amount, which is below the chart's 3_792 x 12 = 45_504. +# Electric row 1510-1569 pays 114 for 3&4. +- name: Case 1, a minimum wage parent with two children receives the 3 and 4 person summer grant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 32 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 22_880 + person2: + age: 9 + immigration_status: CITIZEN + ssi: 0 + person3: + age: 6 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + ar_tea: 0 + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + ar_liheap_household_size: 3 + ar_liheap_countable_income: 18_300 + ar_liheap_income_limit: 45_501 + ar_liheap_cooling_eligible: true + ar_liheap_cooling: 114 + +# FY2026: zero income falls in the 0-69 row; size five uses the 5 & UP column, which pays +# the 344 maximum (plan section 3.6, p13). The size-five limit is 5_236 x 12 = 62_832. +- name: Case 2, a five person household with no income receives the maximum summer grant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + ssi: 0 + person2: + age: 39 + immigration_status: CITIZEN + ssi: 0 + person3: + age: 12 + immigration_status: CITIZEN + ssi: 0 + person4: + age: 8 + immigration_status: CITIZEN + ssi: 0 + person5: + age: 4 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5] + heating_type: PROPANE + has_cooling_expense: true + pre_subsidy_electricity_expense: 2_400 + ar_tea: 0 + households: + household: + members: [person1, person2, person3, person4, person5] + state_code: AR + output: + ar_liheap_household_size: 5 + ar_liheap_countable_income: 0 + ar_liheap_income_limit: 62_832 + ar_liheap_cooling: 344 + +# Boundary: printed lower bounds are inclusive. MCI 69 (828 / 12) is the top of the 0-69 +# row, which pays 242 for 1&2; MCI 70 (840 / 12) starts the 70-129 row, which pays 233. +- name: Case 3, the band top and the next band start set the one person summer grant. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [30, 30] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + ar_liheap_countable_income: [828, 840] + output: + ar_liheap_cooling: [242, 233] + +# FY2025: MCI 1_525 (x12 = 18_300) is within the 27_011 size-one limit. The FFY 2025 +# electric row 1,510-1,569 pays 84 for 1&2 (the FY2026 row pays 77). With electric heat +# the winter grant reads the same cell, so the household receives 84 in each season, and +# the national LIHEAP total is 84 + 84 = 168. +- name: Case 4, FY2025 summer grant for a one person household with electric heat. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 22_880 + spm_units: + spm_unit: + members: [person1] + heating_type: ELECTRICITY + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 18_300 + ar_liheap_income_limit: 27_011 + ar_liheap_cooling_eligible: true + ar_liheap_cooling: 84 + ar_liheap: 84 + liheap: 168 + +# The summer program pays electric benefits only (manual section 2.1, p29), so the heating +# fuel does not matter: gas heat and no heat both receive the FY2026 1&2 cell for MCI +# 1_525 (row 1510-1569), 77. +- name: Case 5, the summer grant does not depend on the heating fuel. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [45, 45] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + ar_tea: [0, 0] + employment_income_before_lsr: [22_880, 22_880] + heating_type: [NATURAL_GAS, NONE] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + output: + ar_liheap_countable_income: [18_300, 18_300] + ar_liheap_cooling_eligible: [true, true] + ar_liheap_cooling: [77, 77] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling_eligible.yaml new file mode 100644 index 00000000000..5b77cf218f6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling_eligible.yaml @@ -0,0 +1,175 @@ +# Arkansas summer regular (cooling) eligibility: FY2026 plan sections 3.1-3.3 (pp12-13) +# and FFY 2025 manual section 2.1 (p29, "Only electric benefits are available during the +# Summer Program"). + +# Boundary: the FY2026 size-one limit is MCI 2_347 (x12 = 28_164) and is inclusive. +# 28_164 is eligible and falls in the 2130-2347 row, which pays 60 for 1&2; 28_164.12 is +# above the limit. +- name: Case 1, the summer income limit is inclusive. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + ar_liheap_countable_income: [28_164, 28_164.12] + output: + ar_liheap_income_limit: [28_164, 28_164] + ar_liheap_cooling_eligible: [true, false] + ar_liheap_cooling: [60, 0] + +# A bill payer needs its own electric bill, since Arkansas's energy burden is a utility bill the +# household receives and summer pays electric benefits only. It also needs a cooling cost: a +# PolicyEngine convention with no Arkansas source, not part of Arkansas's energy-burden rule. +# Full-time Arkansas minimum wage (11 x 40 x 52 = 22_880; x 0.8 = 18_304; MCI 1_525) puts each +# household in the FY2026 1510-1569 row, 77 for 1&2. No cooling cost, or no electric bill, +# gives no summer grant. +- name: Case 2, a cooling cost and an electric bill are both required. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR] + age: [45, 45, 45] + immigration_status: [CITIZEN, CITIZEN, CITIZEN] + ssi: [0, 0, 0] + ar_tea: [0, 0, 0] + employment_income_before_lsr: [22_880, 22_880, 22_880] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + has_cooling_expense: [true, false, true] + pre_subsidy_electricity_expense: [1_800, 1_800, 0] + output: + ar_liheap_cooling_eligible: [true, false, false] + ar_liheap_cooling: [77, 0, 0] + +# With no income both households pass the income test (0 <= limit), so only the qualified +# member requirement separates them: an undocumented adult alone has household size 0. +- name: Case 3, a household with no qualified member is not eligible. + period: 2026 + input: + state_code: [AR, AR] + age: [40, 40] + immigration_status: [CITIZEN, UNDOCUMENTED] + ssi: [0, 0] + ar_tea: [0, 0] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + output: + ar_liheap_household_size: [1, 0] + ar_liheap_cooling_eligible: [true, false] + +# The summer grant does not depend on the heating fuel, so an unspecified fuel is paid like any +# other. Case 2's worker (MCI 1_525) has a cooling cost and an electric bill but no stated fuel: +# the FY2026 1510-1569 row pays 77 for 1&2. +# Was false and 0, now true and 77: the separate cooling payment adds no heating-fuel condition. +- name: Case 4, an unspecified heating fuel still receives the summer grant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 22_880 + spm_units: + spm_unit: + members: [person1] + heating_type: UNSPECIFIED + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_countable_income: 18_300 + ar_liheap_cooling_eligible: true + ar_liheap_cooling: 77 + +# Plan item 3.3 makes unsubsidized renters with utilities included in the rent eligible. +# Both renters pay the FY2026 HUD Fair Market Rent for a one-bedroom unit in Pulaski +# County, $989 a month (x12 = 11_868), which includes utilities, and report no separate +# cooling cost or electric bill. Case 2's worker (MCI 1_525) gets 77 when unsubsidized; +# the rent route covers only unsubsidized households, so the subsidized renter gets 0. +- name: Case 5, an unsubsidized renter with utilities in the rent receives the summer grant. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR] + age: [45, 45] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + ar_tea: [0, 0] + employment_income_before_lsr: [22_880, 22_880] + heating_type: [NATURAL_GAS, NATURAL_GAS] + has_cooling_expense: [false, false] + pre_subsidy_electricity_expense: [0, 0] + tenant_pays_utilities: [false, false] + rent: [11_868, 11_868] + receives_housing_assistance: [false, true] + output: + ar_liheap_cooling_eligible: [true, false] + ar_liheap_cooling: [77, 0] + +# Each household is Case 5's unsubsidized renter (MCI 1_525, no cooling cost and no electric +# bill) with one condition of the utilities-in-rent route removed. The first pays its own +# utilities on the same $989 Pulaski County Fair Market Rent (x12 = 11_868); the second does not +# pay its own utilities but pays no rent; the third lives in public housing and pays 30% of its +# monthly adjusted income as rent (24 CFR 5.628: 22_880 x 0.3 / 12 = 572; x12 = 6_864). None +# receives the summer grant. +- name: Case 6, the utilities in rent route needs utilities in the rent, positive rent and no public housing. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [AR, AR, AR] + age: [45, 45, 45] + immigration_status: [CITIZEN, CITIZEN, CITIZEN] + ssi: [0, 0, 0] + ar_tea: [0, 0, 0] + employment_income_before_lsr: [22_880, 22_880, 22_880] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + has_cooling_expense: [false, false, false] + pre_subsidy_electricity_expense: [0, 0, 0] + tenant_pays_utilities: [true, false, false] + rent: [11_868, 0, 6_864] + receives_housing_assistance: [false, false, false] + is_in_public_housing: [false, false, true] + output: + ar_liheap_cooling_eligible: [false, false, false] + ar_liheap_cooling: [0, 0, 0] + +# Manual section 4.8.2: a household in subsidized housing that receives a utility bill and is +# not reimbursed may be eligible. Case 2's first worker (MCI 1_525, a cooling cost and an +# electric bill) also receives housing assistance and still gets the FY2026 1510-1569 cell, 77 +# for 1&2: the subsidy exclusion applies only to the utilities-in-rent route. +- name: Case 7, a subsidized household with its own electric bill receives the summer grant. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 45 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 22_880 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + receives_housing_assistance: true + ar_tea: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_liheap_cooling_eligible: true + ar_liheap_cooling: 77 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml index 57238557ab7..e5e5738ea9b 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/eligibility/ar_liheap_eligible.yaml @@ -62,7 +62,7 @@ # An aged SSI recipient (Social Security 600/month; SSI (994-(600-20))x12=4968) lives with a # working adult son. The State's Medicaid buy-in pays Part B for an SSI recipient, so no premium is netted. -# 40000x0.8=32000 + 4968 + 7200 = 44168; MCI 3680.67 rounds to 3681; x12=44172 > 36840 two-person limit. +# 40000x0.8=32000 + 4968 + 7200 = 44168; MCI 3680.67 rounds to 3681; x12=44172 > 36834 two-person limit. - name: Case 5, SSI receipt does not waive the ordinary income ceiling. period: 2026 input: @@ -93,8 +93,12 @@ ar_liheap_eligible: false # Boundary: FY2025 plan 2.1 (p8) and chart set size 7 at 150% FPG: 47340x1.5/12=5917.50 -> 5918 -# (annual 71016). MCI 5900 (70800) and 5918 (71016) are eligible; 5919 (71028) is not. -# 60% SMI would have given 5844 and denied MCI 5900. +# (annual 71016). 60% SMI would have given 5844 and denied MCI 5900. 42 U.S.C. 8624(b)(2)(B) +# stops the limit at the greater of HHS's FY2025 60% amount for seven (70127) and 150% of the +# 2024 guideline (47340x1.5=71010), so the limit is 71010. MCI 5900 (70800) is eligible; 5918 +# (71016) and 5919 (71028) are not. +# Was [true, true, false], now [true, false, false]: the federal cap of 42 U.S.C. 8624(b)(2)(B) +# lowers the size-seven limit from the chart's 71016 to 71010. - name: Case 6, FY2025 size seven households use the poverty guideline limit. period: 2025 input: @@ -104,7 +108,7 @@ ar_liheap_household_size: [7, 7, 7] ar_liheap_countable_income: [70_800, 71_016, 71_028] output: - ar_liheap_eligible: [true, true, false] + ar_liheap_eligible: [true, false, false] # FY2026 plan item 2.3 (p10): a household has an energy burden if it pays utilities # directly; one whose utilities are reimbursed through an allowance is not eligible unless diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml index 7ea2c0302f2..615df9a4c06 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.yaml @@ -1,7 +1,13 @@ # Independent AR component tests; no final household eligibility or total benefit is asserted. -# Official 2026 income chart sizes 1-20 plus the printed 688 monthly amount for the extra person at 21; source limits are literal, independent of the SMI/FPG formula. -- name: Case 1, all published household limits and the first additional person match. +# Official 2026 income chart sizes 1-20 plus the printed 688 monthly amount for the extra person at 21, each +# stopped at the federal maximum of 42 U.S.C. 8624(b)(2)(B): the greater of HHS's FY2026 60% state median income +# amount (28_167, 36_834, 45_501, 54_168, 62_834, 71_501 for sizes 1-6; 54_168 x 1.35 = 73_126 for size 7) and +# 150% of the 2025 poverty guideline (15_650 + 5_500 per extra person). The chart is higher at size 2 +# (3_070 x 12 = 36_840), size 3 (3_792 x 12 = 45_504), size 7 (6_094 x 12 = 73_128), every even size from 8 to 20 +# (size 8: 6_769 x 12 = 81_228 against 54_150 x 1.5 = 81_225) and size 21 (15_707 x 12 = 188_484 against +# 125_650 x 1.5 = 188_475). +- name: Case 1, published household limits and the first additional person stop at the federal maximum. period: 2026 absolute_error_margin: 0.01 input: @@ -13,9 +19,9 @@ 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200, 1_200] ar_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] output: - ar_liheap_income_limit: [28_164, 36_840, 45_504, 54_168, 62_832, 71_496, 73_128, 81_228, 89_472, - 97_728, 105_972, 114_228, 122_472, 130_728, 138_972, 147_228, 155_472, 163_728, 171_972, 180_228, - 188_484] + ar_liheap_income_limit: [28_164, 36_834, 45_501, 54_168, 62_832, 71_496, 73_126, 81_225, 89_472, + 97_725, 105_972, 114_225, 122_472, 130_725, 138_972, 147_225, 155_472, 163_725, 171_972, 180_225, + 188_475] # FY2025 chart (2024 FPG 15060 + 5380 per extra person): size 8 52720 x 1.5 / 12 = 6590; size 20 117280 x 1.5 / 12 = 14660; @@ -35,7 +41,9 @@ # SMI x 0.6 / 12 x size factor: 0.52 -> 2251.00 -> 2251; 0.68 -> 2943.62 -> 2944; 0.84 -> 3636.23 -> 3636; # 1.00 -> 4328.85 -> 4329; 1.16 -> 5021.47 -> 5021; 1.32 -> 5714.08 -> 5714. # Size 7: 47340x1.5/12=5917.50 -> 5918 (60% SMI would be 5844); size 9: 58100x1.5/12=7262.50 -> 7263. -# Annual = monthly x 12. +# Annual = monthly x 12, stopped at the federal maximum. HHS's 60% amount is floor(86_577 x 0.6) = 51_946 for +# four, times the size factor, rounded down: 27_011 (size 1), 35_323 (size 2), 51_946 (size 4). 150% of the 2024 +# guideline is 47_340 x 1.5 = 71_010 (size 7) and 58_100 x 1.5 = 87_150 (size 9). - name: Case 3, FY2025 state median income rows and the size seven poverty guideline row. period: 2025 absolute_error_margin: 0.01 @@ -46,11 +54,12 @@ gas_expense: [900, 900, 900, 900, 900, 900, 900, 900] ar_liheap_household_size: [1, 2, 3, 4, 5, 6, 7, 9] output: - ar_liheap_income_limit: [27_012, 35_328, 43_632, 51_948, 60_252, 68_568, 71_016, 87_156] + ar_liheap_income_limit: [27_011, 35_323, 43_632, 51_946, 60_252, 68_568, 71_010, 87_150] # FY2026 chart: size 20 prints $15,019 and "ADD $688 FOR EACH ADDITIONAL HOUSEHOLD -# MEMBER": size 22 = 15,019 + 2 x 688 = 16,395 a month; x 12 = 196,740. -- name: Case 4, FY2026 second additional person adds the printed amount twice. +# MEMBER": size 22 = 15,019 + 2 x 688 = 16,395 a month; x 12 = 196,740. The federal maximum is 150% of the +# 2025 guideline for 22 people: (15,650 + 21 x 5,500) x 1.5 = 196,725. +- name: Case 4, FY2026 second additional person stops at the federal maximum. period: 2026 absolute_error_margin: 0.01 input: @@ -59,4 +68,4 @@ gas_expense: 1_200 ar_liheap_household_size: 22 output: - ar_liheap_income_limit: 196_740 + ar_liheap_income_limit: 196_725 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/integration.yaml index 5d26c6e8d74..75e4fcb6215 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/integration.yaml @@ -101,8 +101,9 @@ # Wages less 20% (plan item 1.8): 22,880 x 0.8 = 18,304; child support counts in full # (manual 4.7.1, p59): 20,704. MCI 1,725.33 rounds to 1,725 (p58): 20,700. ar_liheap_countable_income: 20_700 - # FY2026 chart, size 3: 3,792 x 12. - ar_liheap_income_limit: 45_504 + # FY2026 chart, size 3: 3,792 x 12 = 45,504, stopped at HHS's 60% state median income + # amount, 45,501. + ar_liheap_income_limit: 45_501 ar_liheap_eligible: true # FY2026 natural gas row 1690-1749, column 3&4: 124. ar_liheap_matrix_amount: 124 @@ -247,8 +248,9 @@ # Social Security net of Part B (manual 4.7.2, p59): 15,780 + 7,380 = 23,160; # interest over 200 a month (p162): 3,600 - 2,400 = 1,200; total 24,360, MCI 2,030. ar_liheap_countable_income: 24_360 - # FY2025 chart, size 2: 2,944 x 12. - ar_liheap_income_limit: 35_328 + # FY2025 chart, size 2: 2,944 x 12 = 35,328, stopped at HHS's FY2025 60% state median + # income amount, 35,323. + ar_liheap_income_limit: 35_323 ar_liheap_eligible: true # FY2025 other (wood) row 2,010-2,129, column 1&2: 68. ar_liheap_matrix_amount: 68 diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.py new file mode 100644 index 00000000000..325ca8692a6 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class ar_liheap_cooling(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Arkansas LIHEAP summer regular cooling benefit" + defined_for = "ar_liheap_cooling_eligible" + reference = ( + # FFY 2025 manual section 6.1: the Electricity Matrix is "used for both + # Winter and Summer Regular Assistance". No FY2026 manual was found. + "https://liheapch.acf.gov/docs/2025/manuals/AR_Manual_2025.pdf#page=78", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2026_Electric.pdf#page=1", + # PDF pages 1-2 + "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Benefit-Matix_2025_Electric.pdf#page=1", + # FY2026 state plan section 3.6: cooling benefits of $60 to $344. + "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=13", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ee.aeo.liheap.payment + income = spm_unit("ar_liheap_countable_income", period) / MONTHS_IN_YEAR + size = spm_unit("ar_liheap_household_size", period) + band = p.income_band.calc(max_(income, 0)).astype(int) + size_group = p.household_size_group.calc(size).astype(int) + # One fixed grant per summer from the Electricity matrix, the same for + # every heating type, not capped at the bill. The planned FY2027 + # increase has no posted matrix, so later years carry the FY2026 cells + # forward. + return p.matrix.electricity[band][size_group] diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling_eligible.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling_eligible.py new file mode 100644 index 00000000000..477d35a48cf --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling_eligible.py @@ -0,0 +1,43 @@ +from policyengine_us.model_api import * + + +class ar_liheap_cooling_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Eligible for Arkansas LIHEAP summer regular cooling assistance" + defined_for = StateCode.AR + reference = ( + # FY2026 state plan sections 3.1-3.3: the heating income chart and an + # energy burden; no asset test. + # PDF pages 12-13 + "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=12", + # FFY 2025 manual section 2.1: "Only electric benefits are available + # during the Summer Program." Section 4.8.1: the energy burden of a + # household that receives a utility bill. No FY2026 manual was found. + # PDF pages 29, 63 + "https://liheapch.acf.gov/docs/2025/manuals/AR_Manual_2025.pdf#page=29", + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("ar_liheap_household_size", period) + income = spm_unit("ar_liheap_countable_income", period) + income_limit = spm_unit("ar_liheap_income_limit", period) + # Manual section 4.8.1 finds an energy burden in a utility bill the + # household receives, and summer pays electric benefits only, so a bill + # payer needs a positive electric bill. Requiring a cooling cost as + # well is a PolicyEngine convention with no Arkansas source; it is not + # part of Arkansas's energy-burden rule. + pays_electric_bill = spm_unit("has_cooling_expense", period) & ( + spm_unit("pre_subsidy_electricity_expense", period) > 0 + ) + # Plan item 3.3 also makes unsubsidized renters with utilities included + # in the rent eligible. + subsidized = spm_unit.household("is_in_public_housing", period) | spm_unit( + "receives_housing_assistance", period + ) + utilities_in_rent = ~spm_unit.household("tenant_pays_utilities", period) & ( + add(spm_unit, period, ["rent"]) > 0 + ) + responsible = pays_electric_bill | (utilities_in_rent & ~subsidized) + return (size > 0) & (income <= income_limit) & responsible diff --git a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py index fed9787cb8f..31b42d0511c 100644 --- a/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py +++ b/policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py @@ -1,5 +1,5 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.hhs.hhs_smi import smi +from policyengine_us.variables.gov.hhs.hhs_smi import liheap_smi_limit, smi from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg @@ -11,6 +11,13 @@ class ar_liheap_income_limit(Variable): label = "Arkansas LIHEAP annualized income limit" defined_for = StateCode.AR reference = ( + "https://www.law.cornell.edu/uscode/text/42/8624#b_2_B", + # FY2026 federal amounts + # PDF pages 1, 4 + "https://acf.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM2025-02_SMIStateTable_Att4.pdf#page=1", + # FY2025 federal amounts + # PDF pages 1, 4 + "https://acf.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM%202024-02_Att4SMITable.pdf#page=1", "https://liheapch.acf.gov/docs/2026/state-plans/AR_Plan_2026.pdf#page=9", "https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf", "https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=8", @@ -36,9 +43,19 @@ def formula(spm_unit, period, parameters): # The charts add a printed amount for each person above size 20. extra_people = max_(size - p.max_table_size, 0) monthly_limit = rounded_base + extra_people * p.additional_member_amount + # 42 U.S.C. 8624(b)(2)(B) pays no household above the greater of 60% of + # state median income, in the amounts HHS publishes by household size, + # and 150% of the poverty guideline. A published monthly amount that + # rounds above that maximum stops there. + p_hhs = parameters(period).gov.hhs.liheap + smi_maximum = liheap_smi_limit(size, state, p_hhs.smi_limit, period, parameters) + fpg_maximum = p_hhs.fpg_limit * fpg( + max_(size, 1), state_group, period, parameters, year_lag=p.fpg_year_lag + ) + limit = min_(monthly_limit * MONTHS_IN_YEAR, max_(smi_maximum, fpg_maximum)) # 42 U.S.C. 8624(b)(2)(B) bars excluding a household on income below # 110% of the poverty guideline. In 2025-2027 every limit stays at # least 32% above that floor at every household size (in 2025 and 2027, # the printed per-member amount above size 20 sets the narrowest # margin), so no separate floor is applied. - return where(size > 0, monthly_limit * MONTHS_IN_YEAR, 0) + return where(size > 0, limit, 0) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 352bbc3a578..c71c7264b13 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -669,12 +669,18 @@ candidates: - kind: guidance citation: ACF LIHEAP Clearinghouse 2025 Arkansas matrix url: https://liheapch.acf.gov/docs/2025/benefits-matricies/AR_BenefitMatrix_2025.pdf#page=1 + - kind: plan + citation: Arkansas FY2025 LIHEAP State Plan, item 3.6, page 12 + url: https://liheapch.acf.gov/docs/2025/state-plans/AR_Plan_2025.pdf#page=12 readings: statute: No statute is supplied; AEO's FY2025 electric matrix uses $242, $288 and $344 at the lowest income band. other: The clearinghouse matrix uses $202, $240 and $287. + plan: Plan item 3.6 estimates FY2025 cooling benefits of $50 to $287; AEO's electric matrix, headed "20% OVER + BASE", pays the summer benefit at $60 to $344. example: Electric heating, household size 1-2 and income $0-$69 yields $242 under AEO's matrix versus $202 under - the clearinghouse matrix. + the clearinghouse matrix. In summer 2025, five people with no income receive $344 from AEO's matrix, above + plan item 3.6's $287 maximum. pe_us: follows: unknown code: @@ -683,11 +689,15 @@ candidates: - policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/natural_gas.yaml - policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/other.yaml - policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/payment/matrix/propane.yaml + - policyengine_us/variables/gov/states/ar/ee/aeo/liheap/cooling/ar_liheap_cooling.py - policyengine_us/variables/gov/states/ar/ee/aeo/liheap/payment/ar_liheap_matrix_amount.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/9973 + - https://github.com/PolicyEngine/policyengine-us/pull/10744 state: unreviewed - note: 'PE-US follows AEO''s matrix; verify the clearinghouse document''s effective year and possible mislabeling.' + note: 'PE-US follows AEO''s matrix for the winter and summer regular benefits; Wayback captures of AEO''s electric + matrix from 2024-12-06, 2025-06-15 and 2025-07-25 share one content digest, so it stayed posted through the summer + 2025 season. Verify the clearinghouse document''s effective year and possible mislabeling.' - id: us-ar:liheap-gambling-and-capital-gains program: liheap years: @@ -717,6 +727,50 @@ candidates: state: unreviewed note: 'PE-US follows Appendix F; verify whether its specific inclusions override the general exclusion of nonrecurring lump sums.' +- id: us-ar:liheap-income-limit-above-federal-ceiling + program: liheap + years: + from: 2025 + to: 2026 + type: federal-fiscal + question: Can Arkansas's whole-dollar monthly LIHEAP limits pay a household whose income exceeds both 150% of the + poverty guideline and HHS's 60% state median income amount? + sources: + - kind: statute + citation: 42 U.S.C. 8624(b)(2)(B) + url: https://www.law.cornell.edu/uscode/text/42/8624#b_2_B + - kind: guidance + citation: HHS LIHEAP IM 2025-02 Attachment 4, Mandatory Use in LIHEAP for FY26, Arkansas, pages 1 and 4 + url: https://acf.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM2025-02_SMIStateTable_Att4.pdf#page=1 + - kind: guidance + citation: Arkansas FY2026 LIHEAP Income Eligibility Chart + url: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2026.pdf + - kind: guidance + citation: Arkansas FY2025 LIHEAP Income Eligibility Chart + url: https://www.adeq.state.ar.us/energy/assistance/pdfs/LIHEAP_Eligibility-Chart_2025.pdf + - kind: guidance + citation: HHS LIHEAP IM 2024-02 Attachment 4, Mandatory Use in LIHEAP for FY25, Arkansas, pages 1 and 4 + url: https://acf.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM%202024-02_Att4SMITable.pdf#page=1 + readings: + statute: Payments go only to households whose income does not exceed the greater of 150% of the poverty guideline + and 60% of the state median income that HHS publishes and adjusts for household size. + other: The charts round each monthly limit to the nearest dollar and add a rounded amount for each member above 20, + which puts the limits above the federal maximum at several sizes. + example: In FY2026, three people with $45,504 of countable income ($3,792 a month) are within the printed limit and + would be paid, but exceed the $45,501 federal maximum and receive $0 in the PR. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ar/ee/aeo/liheap/income/ar_liheap_income_limit.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10744 + state: ruled + note: 'Ruled under the 2026-10-19 statute-first rule. The PR stops each limit at the federal maximum. Printed and capped + annual limits: FY2026 size 2, $36,840 and $36,834; 3, $45,504 and $45,501; 7, $73,128 and $73,126; each even size + from 8 to 20, $3 lower ($81,228 and $81,225 at 8); 21, $188,484 and $188,475. FY2025, from HHS''s FY2025 amounts (LIHEAP IM 2024-02 + Attachment 4): size 1, $27,012 and $27,011; 2, + $35,328 and $35,323; 4, $51,948 and $51,946; each odd size from 7 to 19, $6 lower ($71,016 and $71,010 at 7). Other + sizes keep the printed amount. Verify each later fiscal-year chart.' - id: us-ar:liheap-minor-and-student-earnings program: liheap years: