diff --git a/changelog.d/hi-liheap-wave2c.added.md b/changelog.d/hi-liheap-wave2c.added.md new file mode 100644 index 00000000000..842fb6e80c3 --- /dev/null +++ b/changelog.d/hi-liheap-wave2c.added.md @@ -0,0 +1 @@ +Add Hawaii LIHEAP regular heating eligibility, the flat benefit for subsidized dwellings and private-dwelling points for fiscal year 2026; private-dwelling dollar awards stay unmodeled because the statewide value per point was not located. diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/fpg_rate.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/fpg_rate.yaml new file mode 100644 index 00000000000..89ace3dd4dd --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/fpg_rate.yaml @@ -0,0 +1,10 @@ +description: Hawaii uses this share of federal poverty guidelines as the income limit above its published state-median-income sizes under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1.5 +metadata: + unit: /1 + period: year + label: Hawaii LIHEAP poverty guideline income limit rate + reference: + - title: Hawaii FY2026 LIHEAP State Plan, section 2.1 + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=9 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_amount.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_amount.yaml new file mode 100644 index 00000000000..2825160afe0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_amount.yaml @@ -0,0 +1,59 @@ +description: Hawaii publishes these annual state-median-income-based limits by qualified household size under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 41_941 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 54_846 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 67_751 + - threshold: + 2025-10-01: 4 + amount: + 2025-10-01: 80_656 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 93_560 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 106_454 + - threshold: + 2025-10-01: 7 + amount: + 2025-10-01: 108_885 + - threshold: + 2025-10-01: 8 + amount: + 2025-10-01: 111_305 + - threshold: + 2025-10-01: 9 + amount: + 2025-10-01: 113_724 + - threshold: + 2025-10-01: 10 + amount: + 2025-10-01: 116_144 +# These are operational provider amounts, including the published six-person +# amount. No single SMI rounding rule reproduces all ten entries. +metadata: + type: single_amount + threshold_unit: person + amount_unit: currency-USD + period: year + label: Hawaii LIHEAP annual SMI-schedule income limits + reference: + - title: HCAP 2026 H-HEAP income limits + href: https://www.hcapweb.org/wp-content/uploads/2026/04/H-HEAP-2026-Income-Eligibility.pdf + - title: Hawaii FY2026 H-HEAP benefit matrix + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_max_household_size.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_max_household_size.yaml new file mode 100644 index 00000000000..61025f655b9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_max_household_size.yaml @@ -0,0 +1,10 @@ +description: Hawaii uses its published state-median-income schedule through this household size under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 10 +metadata: + unit: person + period: year + label: Hawaii LIHEAP maximum SMI-schedule household size + reference: + - title: HCAP 2026 H-HEAP income limits + href: https://www.hcapweb.org/wp-content/uploads/2026/04/H-HEAP-2026-Income-Eligibility.pdf diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/ssn_min_age.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/ssn_min_age.yaml new file mode 100644 index 00000000000..879ba12d818 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/ssn_min_age.yaml @@ -0,0 +1,12 @@ +description: Hawaii requires a Social Security Number from household members at or above this age under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1 +metadata: + unit: year + period: year + label: Hawaii LIHEAP Social Security Number minimum age + reference: + - title: DHS LIHEAP Policies and Procedures 2020, section 2.4 + href: https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=6 + - title: Draft FY2026 Policies and Procedures, section 2.4 + href: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=59 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/fpg_year_lag.yaml new file mode 100644 index 00000000000..96d0c667e33 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/fpg_year_lag.yaml @@ -0,0 +1,12 @@ +description: Hawaii uses federal poverty guidelines from this many calendar years before the benefit year under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1 +metadata: + unit: year + period: year + label: Hawaii LIHEAP federal poverty guideline year lag + reference: + - title: "Hawaii FY2026 H-HEAP benefit matrix #page 1,3" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1 + - title: Hawaii draft FY2026 Policies and Procedures, definition of State Poverty Level + href: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=56 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml new file mode 100644 index 00000000000..d7d463c40cb --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml @@ -0,0 +1,50 @@ +description: Hawaii counts these represented income sources under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - employment_income + # Draft 5.2 counts military base pay, an input apart from employment_income; + # enter it in one of the two. + - military_basic_pay + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - partnership_s_corp_income + - total_unemployment_compensation + - strike_benefits + - social_security + - ssi + - pension_income + - military_retirement_income + - railroad_benefits + - retirement_distributions + - survivor_benefits + - general_assistance + - rental_income + - farm_rent_income + - alimony_income + - child_support_received + - interest_income + - ordinary_dividend_income + - veterans_benefits + - workers_compensation + - disability_benefits + - estate_income + - life_insurance_benefits + - financial_assistance + - gambling_winnings + - gi_cash_assistance + # Jury pay, legal settlements and other receipts the plan checks. + - miscellaneous_income +# Pension, Social Security and retirement-distribution components enter once. +# Military retirement includes Survivor Benefit Plan annuities. +# TANF is added once at household level; monthly SSI is annualized by aggregation. +# No minor-earnings exclusion applies. Receipts without a separate input, such as +# mortgage principal, are not policy exclusions. Royalties are in rental_income. +# Military housing and subsistence allowances have no input. +metadata: + unit: list + period: year + label: Hawaii LIHEAP countable income sources + reference: + - title: "Hawaii FY2026 LIHEAP State Plan, countable income #page 6-7" + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/burden_rate.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/burden_rate.yaml new file mode 100644 index 00000000000..6190ef6a596 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/burden_rate.yaml @@ -0,0 +1,10 @@ +description: Hawaii awards an energy-burden point at or above this electric-cost share of income under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 0.3 +metadata: + unit: /1 + period: year + label: Hawaii LIHEAP energy burden point threshold + reference: + - title: Hawaii FY2026 H-HEAP benefit matrix + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/household_size.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/household_size.yaml new file mode 100644 index 00000000000..8f3e9b6452b --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/household_size.yaml @@ -0,0 +1,27 @@ +description: Hawaii assigns these points by qualified household size under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 3 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Hawaii LIHEAP household size points + reference: + - title: Hawaii FY2026 LIHEAP benefit matrix + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/income.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/income.yaml new file mode 100644 index 00000000000..2278d2d240d --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/income.yaml @@ -0,0 +1,27 @@ +description: Hawaii assigns these points by the ratio of income to federal poverty guidelines under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: -.inf + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 0.5 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1.5 + amount: + 2025-10-01: 0 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: /1 + period: year + label: Hawaii LIHEAP income points + reference: + - title: "Hawaii FY2026 LIHEAP benefit matrix #page 2-3" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/region.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/region.yaml new file mode 100644 index 00000000000..d588f19a5f6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/region.yaml @@ -0,0 +1,12 @@ +description: Hawaii assigns these regional points under the Low Income Home Energy Assistance Program. +oahu: + 2025-10-01: 1 +neighbor: + 2025-10-01: 2 +metadata: + unit: /1 + period: year + label: Hawaii LIHEAP regional points + reference: + - title: Hawaii FY2026 LIHEAP benefit matrix, regional points + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml new file mode 100644 index 00000000000..dcfcbad86c4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml @@ -0,0 +1,11 @@ +description: Hawaii treats a disabled person at or above this age as an adult for the vulnerability point under the Low Income Home Energy Assistance Program. +# The plan says "a disabled adult" and states no age. 18 is an inference. +values: + 2025-10-01: 18 +metadata: + unit: year + period: year + label: Hawaii LIHEAP disabled adult minimum age + reference: + - title: Hawaii FY2026 LIHEAP State Plan + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=10 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/child_max_age.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/child_max_age.yaml new file mode 100644 index 00000000000..d4c9f82eeb9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/child_max_age.yaml @@ -0,0 +1,10 @@ +description: Hawaii awards a vulnerability point when a qualified household member is at or below this age under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 5 +metadata: + unit: year + period: year + label: Hawaii LIHEAP young child maximum age + reference: + - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=10 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/elderly_min_age.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/elderly_min_age.yaml new file mode 100644 index 00000000000..ee7be8179f8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/elderly_min_age.yaml @@ -0,0 +1,10 @@ +description: Hawaii awards a vulnerability point when a qualified household member is at or above this age under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 60 +metadata: + unit: year + period: year + label: Hawaii LIHEAP elderly minimum age + reference: + - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=10 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/subsidized_amount.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/subsidized_amount.yaml new file mode 100644 index 00000000000..3b317c6c6a5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/subsidized_amount.yaml @@ -0,0 +1,27 @@ +description: Hawaii provides these flat subsidized-dwelling benefits by qualified household size under the Low Income Home Energy Assistance Program. +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 375 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 425 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 475 +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: year + label: Hawaii LIHEAP subsidized dwelling flat benefit + reference: + - title: Hawaii FY2026 LIHEAP benefit matrix + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index b17a5fe59f6..13c55a3175a 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -987,7 +987,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AK, AR, AL, AZ, CO, DC, DE, GA, Riverside County, MA, FL, IL, IA, IN, KS, KY, LA, MD, ME, MN, MO, MS, MT, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, PA, SD, RI, TN, TX, UT, VA, VT, WA, WI, WY + coverage: AK, AR, AL, AZ, CO, DC, DE, GA, HI, Riverside County, MA, FL, IL, IA, IN, KS, KY, LA, MD, ME, MN, MO, MS, MT, NC, ND, NE, NH, NJ, NM, NV, NY, OH, OK, OR, PA, SD, RI, TN, TX, UT, VA, VT, WA, WI, WY state_implementations: - state: AL status: partial @@ -1036,6 +1036,13 @@ programs: parameter_prefix: gov.states.ga.dfcs.liheap verified_years: "2025-2026" notes: FY2025-FY2026 regular heating only, with the published fuel matrix and the bundled-utility rental payment. Crisis, cooling, weatherization and equipment assistance are out of scope. + - state: HI + status: partial + name: Hawaii LIHEAP subsidized dwelling benefit + full_name: Hawaii Low Income Home Energy Assistance Program subsidized dwelling benefit + variable: hi_liheap_subsidized_amount + parameter_prefix: gov.states.hi.dhs.liheap + notes: FY2026 eligibility, the subsidized-dwelling flat benefit and private-dwelling points; no private-dwelling dollar award because its statewide value per point was not located. Crisis, cooling, weatherization and equipment assistance are out of scope. - state: OH status: partial name: Ohio HEAP diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_countable_income.yaml new file mode 100644 index 00000000000..9ef88ff12f1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_countable_income.yaml @@ -0,0 +1,578 @@ +# Accepted FY2026 plan checks gross income, minor earnings, gifts and lump sums. +# https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=6 +# Historical manual section 2.2 retains nonqualified members' income. +# https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=6 +# Draft FY2026 detailed manual elaborates disability and noncash exclusions. +# https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=66 +# Annual receipts approximate annualized prior-month income; SSI/TANF use months. + +- name: Case 1, nonqualified adults and minor earnings all count. + period: 2026 + absolute_error_margin: 0.01 + # Gross income = 12_000 + 18_000 + 1_200 = 31_200. + # The minor is the sole qualified member; neither adult income is prorated. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + employment_income: 12_000 + person2: + age: 32 + is_citizen_or_legal_immigrant: false + ssi: 0 + employment_income: 18_000 + person3: + age: 16 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_200 + spm_units: + spm_unit1: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_household_size: 1 + hi_liheap_countable_income: 31_200 + +- name: Case 2, net business receipts and wages enter once. + period: 2026 + absolute_error_margin: 0.01 + # Wages, basic pay and separate net business receipts = 12_000 + 500 + 2_000 + # + 300 + 700 + 1_000 = 16_500; no second business-expense deduction. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + military_basic_pay: 500 + self_employment_income: 2_000 + sstb_self_employment_income: 300 + farm_operations_income: 700 + partnership_s_corp_income: 1_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 16_500 + +- name: Case 3, pensions survivor benefits and rent remain disjoint. + period: 2026 + absolute_error_margin: 0.01 + # Pension = 3_000; retirement withdrawals = 1_000; Social Security = 2_000. + # Other survivor benefits = 700; ordinary plus farm rent = 3_000. + # Total = 3_000 + 1_000 + 2_000 + 700 + 3_000 = 9_700. + input: + people: + person1: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: 0 + taxable_pension_income: 2_000 + tax_exempt_pension_income: 1_000 + taxable_retirement_distributions: 600 + tax_exempt_retirement_distributions: 400 + social_security_survivors: 1_000 + social_security_dependents: 200 + social_security_disability: 300 + social_security_retirement: 500 + survivor_benefits: 700 + rental_income: 1_800 + farm_rent_income: 1_200 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 9_700 + +- name: Case 4, represented unearned receipts include direct insurance proceeds. + period: 2026 + absolute_error_margin: 0.01 + # Count 1_000 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + # + 1_000 + 1_100 + 1_200 = 8_700; direct insurance proceeds are included. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + unemployment_compensation: 1_000 + strike_benefits: 200 + general_assistance: 300 + alimony_income: 400 + child_support_received: 500 + interest_income: 600 + ordinary_dividend_income: 700 + veterans_benefits: 800 + workers_compensation: 900 + disability_benefits: 1_000 + estate_income: 1_100 + life_insurance_benefits: 1_200 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 8_700 + +- name: Case 5, cash gifts and lottery receipts count as gross income. + period: 2026 + absolute_error_margin: 0.01 + # Plan p6 checks cash gifts and lottery lump sums: 600 + 1_400 = 2_000. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + financial_assistance: 600 + gambling_winnings: 1_400 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 2_000 + +- name: Case 6, nonuniform monthly SSI and household TANF annualize once. + period: 2026 + absolute_error_margin: 0.01 + # SSI = 6 * 500 + 6 * 700 = 7_200. Household TANF = 3 * 200 + # + 9 * 300 = 3_300, counted once despite two household members. + # Annual total = 7_200 + 3_300 = 10_500. All members use matching months. + input: + people: + person1: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: + 2026-01: 500 + 2026-02: 500 + 2026-03: 500 + 2026-04: 500 + 2026-05: 500 + 2026-06: 500 + 2026-07: 700 + 2026-08: 700 + 2026-09: 700 + 2026-10: 700 + 2026-11: 700 + 2026-12: 700 + person2: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: + 2026-01: 0 + 2026-02: 0 + 2026-03: 0 + 2026-04: 0 + 2026-05: 0 + 2026-06: 0 + 2026-07: 0 + 2026-08: 0 + 2026-09: 0 + 2026-10: 0 + 2026-11: 0 + 2026-12: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: + 2026-01: 200 + 2026-02: 200 + 2026-03: 200 + 2026-04: 300 + 2026-05: 300 + 2026-06: 300 + 2026-07: 300 + 2026-08: 300 + 2026-09: 300 + 2026-10: 300 + 2026-11: 300 + 2026-12: 300 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 10_500 + +- name: Case 7, assets SNAP and WIC do not become countable income. + period: 2026 + absolute_error_margin: 0.01 + # Only wages count: 1_200. Asset balances, SNAP and WIC are not cash income. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_200 + person2: + age: 4 + is_citizen_or_legal_immigrant: true + ssi: 0 + wic: 600 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit_assets: 500_000 + snap: 3_600 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 1_200 + +- name: Case 8, negative net earnings are floored and other states stay zero. + period: 2026 + absolute_error_margin: 0.01 + # Negative annual resources floor at zero. The same positive income in California + # is zero in the Hawaii component. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + self_employment_income: -2_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_500 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_500 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person3] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + output: + hi_liheap_countable_income: [0, 1_500, 0] + +# Gross receipts: military 60,000 and wages 30,000 each exceed 150% of the one-person +# guideline of 26,985; size + Oahu = 2 points. UI 18,000 yields income 1 + size 1 + region 1 = 3. +# TANF controls test receipt gating separately from entitlement. +- name: Case 9, military retirement and rental losses preserve gross receipts and points. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + military_retirement_pay: 60_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + rental_income: -30_000 + spm_units: + spm_unit1: + members: + - person1 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + spm_unit2: + members: + - person2 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + households: + household1: + members: + - person1 + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: + - person2 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: + - 60_000 + - 30_000 + hi_liheap_points: + - 2 + - 2 +- name: Case 10, reported UI overrides modeled receipt and negative UI does not offset wages. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + unemployment_compensation: 0 + modeled_state_unemployment_compensation: 6_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + unemployment_compensation: 1_200 + modeled_state_unemployment_compensation: 6_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + unemployment_compensation: -100 + modeled_state_unemployment_compensation: 6_000 + spm_units: + spm_unit1: + members: + - person1 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + spm_unit2: + members: + - person2 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + spm_unit3: + members: + - person3 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + households: + household1: + members: + - person1 + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: + - person2 + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: + - person3 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + total_unemployment_compensation: + - 6_000 + - 1_200 + - -100 + hi_liheap_countable_income: + - 18_000 + - 13_200 + - 12_000 + hi_liheap_points: + - 3 + - 4 + - 4 +- name: Case 11, TANF enters once only when the household takes it up. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 6_000 + person2: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 6_000 + person4: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + - person2 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 6_000 + takes_up_tanf_if_eligible: true + spm_unit2: + members: + - person3 + - person4 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 6_000 + takes_up_tanf_if_eligible: false + households: + household1: + members: + - person1 + - person2 + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: + - person3 + - person4 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + tanf: + - 6_000 + - 0 + hi_liheap_countable_income: + - 12_000 + - 6_000 + +# The 2020 manual counts "Pensions and annuities such as Railroad Retirement": +# 6,000 counts. +- name: Case 12, railroad retirement counts as a pension. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + is_citizen_or_legal_immigrant: true + ssi: 0 + railroad_benefits: 6_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + hi_tanf: 0 + households: + household: + members: [person1] + state_code: HI + output: + hi_liheap_countable_income: 6_000 + +# Plan pages 6-7 check jury pay and legal settlements, and draft manual 5.3 counts +# contributions: miscellaneous 1,000 + guaranteed-income cash 500. +- name: Case 13, miscellaneous income and cash assistance count. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + ssi: 0 + miscellaneous_income: 1_000 + gi_cash_assistance: 500 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + hi_tanf: 0 + households: + household: + members: [person1] + state_code: HI + output: + hi_liheap_countable_income: 1_500 diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_eligible.yaml new file mode 100644 index 00000000000..ff25fd1564b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_eligible.yaml @@ -0,0 +1,110 @@ +# Plan 1.4 and 2.1-2.3 (pages 5, 9); matrix (pages 1, 3); draft manual 1.4, 2.1, 2.8, 2.12, 4.2, 5.5. +# https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=5 +# https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1 +# https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=57 +# SNAP, TANF and SSI are pinned to zero where the income test decides the case. + +- name: Case 1, income at the limit qualifies and the next dollar does not. + period: 2026 + # One person's printed limit is 41_941. Draft 5.5 reads "equal to or less than". + input: + state_code: [HI, HI, CA] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [900, 900, 900] + ssi: [0, 0, 0] + snap: [0, 0, 0] + tanf: [0, 0, 0] + hi_liheap_countable_income: [41_941, 41_942, 0] + output: + hi_liheap_eligible: [true, false, false] + +- name: Case 2, SNAP, SSI, TANF or general assistance replaces the income test. + period: 2026 + # Countable income of 100_000 is above the one-person limit. The last row has no receipt. + input: + state_code: [HI, HI, HI, HI, HI] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, NATURAL_GAS] + gas_expense: [900, 900, 900, 900, 900] + snap: [1_200, 0, 0, 0, 0] + ssi: [0, 1_200, 0, 0, 0] + tanf: [0, 0, 1_200, 0, 0] + general_assistance: [0, 0, 0, 1_200, 0] + hi_liheap_countable_income: [100_000, 100_000, 100_000, 100_000, 100_000] + output: + hi_liheap_eligible: [true, true, true, true, false] + +- name: Case 3, reported SSI replaces the income test and a qualified member is still required. + period: 2026 + # The second and third units have no qualified member, at high and at zero income. + input: + people: + person1: + age: 70 + ssi: 0 + receives_ssi: + 2026-01: true + person2: + age: 70 + ssi: 0 + immigration_status: UNDOCUMENTED + receives_ssi: + 2026-01: true + person3: + age: 70 + ssi: 0 + immigration_status: UNDOCUMENTED + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 900 + snap: 0 + tanf: 0 + hi_liheap_countable_income: 100_000 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 900 + snap: 0 + tanf: 0 + hi_liheap_countable_income: 100_000 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 900 + snap: 0 + tanf: 0 + hi_liheap_countable_income: 0 + households: + household1: + members: [person1] + state_code: HI + household2: + members: [person2] + state_code: HI + household3: + members: [person3] + state_code: HI + output: + hi_liheap_household_size: [1, 0, 0] + hi_liheap_eligible: [true, false, false] + +- name: Case 4, heating assistance needs gas paid by bill or through rent. + period: 2026 + # Any home's gas bill and gas in rent qualify, whatever heats the home (rows 1, 3, 7, 8). + # A separate gas bill still qualifies when electric heat is in the rent (row 10). + # A home with no gas bill does not: the electric bill is the cooling credit and bottled + # gas shows no utility account. Electricity in rent is not gas, and UNSPECIFIED pays nothing. + input: + state_code: [HI, HI, HI, HI, HI, HI, HI, HI, HI, HI] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, ELECTRICITY, PROPANE, UNSPECIFIED, NONE, ELECTRICITY, ELECTRICITY, ELECTRICITY] + gas_expense: [900, 0, 0, 0, 0, 900, 900, 900, 0, 900] + pre_subsidy_electricity_expense: [0, 0, 0, 900, 0, 0, 0, 0, 0, 0] + bottled_gas_expense: [0, 0, 0, 0, 900, 0, 0, 0, 0, 0] + heat_expense_included_in_rent: [false, false, true, false, false, false, false, false, true, true] + ssi: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + snap: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + tanf: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + hi_liheap_countable_income: [20_000, 20_000, 20_000, 20_000, 20_000, 20_000, 20_000, 20_000, 20_000, 20_000] + output: + hi_liheap_eligible: [true, false, true, false, false, false, true, true, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_household_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_household_size.yaml new file mode 100644 index 00000000000..66b05e14c76 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_household_size.yaml @@ -0,0 +1,125 @@ +# Historical manual section 2.2 excludes nonqualified members from size only. +# https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=6 +# These are component tests, not final eligibility determinations. + +- name: Case 1, qualified size uses actual members and isolates other states. + period: 2026 + # Three residents with two nonqualified adults leave one qualified child. + # Two qualified residents count twice; no qualified members produce zero. + # The California household must not enter the Hawaii component. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person2: + age: 32 + is_citizen_or_legal_immigrant: false + ssi: 0 + person3: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person5: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person7: + age: 60 + is_citizen_or_legal_immigrant: false + ssi: 0 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person9: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person4, person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person6, person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: [person8, person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person4, person5] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person6, person7] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person8, person9, person10] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + output: + hi_liheap_household_size: [1, 2, 0, 0] + +- name: Case 2, a member one or older without a Social Security Number leaves the size. + period: 2026 + # 2020 manual 2.4: ages one and older. The adult without a number is removed; the + # infant without one stays. + input: + people: + person1: + age: 35 + ssi: 0 + person2: + age: 35 + ssi: 0 + ssn_card_type: NONE + person3: + age: 0 + ssi: 0 + ssn_card_type: NONE + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + hi_tanf: 0 + households: + household: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_household_size: 2 diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_income_limit.yaml new file mode 100644 index 00000000000..d55212f32a5 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_income_limit.yaml @@ -0,0 +1,1634 @@ +# HCAP operational FY2026 income chart, physical page 1, annual dollar limits. +# https://www.hcapweb.org/wp-content/uploads/2026/04/H-HEAP-2026-Income-Eligibility.pdf +# All 20 published cells were independently transcribed from the original render. +# Sizes 1-10 use the printed values, including 106_454 at size 6. +# Sizes 11-20 equal 150% of the prior-year Hawaii FPG: +# (17_990 + 6_330 * (size - 1)) * 1.5. +# The earlier-year case is an unverified historical estimate, not FY2025 validation. +# IRS 2025 Form 8962 instructions, Table 1-3, independently reproduce 2024 HI FPG. +# https://www.irs.gov/instructions/i8962 + +- name: Case 1, published annual limits include the irregular six-person cell and FPG transition. + period: 2026 + absolute_error_margin: 0.01 + # Qualified sizes 1, 4, 6, 10, 11 and 20. + # The published size-6 value is 106_454; do not repair it using a raw SMI formula. + # Size 11: (17_990 + 6_330 * 10) * 1.5 = 121_935. + # Size 20: (17_990 + 6_330 * 19) * 1.5 = 207_390. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person3: + age: 38 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person5: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 42 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person7: + age: 39 + is_citizen_or_legal_immigrant: true + ssi: 0 + person8: + age: 14 + is_citizen_or_legal_immigrant: true + ssi: 0 + person9: + age: 12 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person11: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person12: + age: 42 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person13: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person14: + age: 38 + is_citizen_or_legal_immigrant: true + ssi: 0 + person15: + age: 36 + is_citizen_or_legal_immigrant: true + ssi: 0 + person16: + age: 16 + is_citizen_or_legal_immigrant: true + ssi: 0 + person17: + age: 14 + is_citizen_or_legal_immigrant: true + ssi: 0 + person18: + age: 12 + is_citizen_or_legal_immigrant: true + ssi: 0 + person19: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person20: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person21: + age: 6 + is_citizen_or_legal_immigrant: true + ssi: 0 + person22: + age: 44 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person23: + age: 42 + is_citizen_or_legal_immigrant: true + ssi: 0 + person24: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person25: + age: 38 + is_citizen_or_legal_immigrant: true + ssi: 0 + person26: + age: 36 + is_citizen_or_legal_immigrant: true + ssi: 0 + person27: + age: 16 + is_citizen_or_legal_immigrant: true + ssi: 0 + person28: + age: 14 + is_citizen_or_legal_immigrant: true + ssi: 0 + person29: + age: 12 + is_citizen_or_legal_immigrant: true + ssi: 0 + person30: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person31: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person32: + age: 6 + is_citizen_or_legal_immigrant: true + ssi: 0 + person33: + age: 55 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person34: + age: 53 + is_citizen_or_legal_immigrant: true + ssi: 0 + person35: + age: 45 + is_citizen_or_legal_immigrant: true + ssi: 0 + person36: + age: 43 + is_citizen_or_legal_immigrant: true + ssi: 0 + person37: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person38: + age: 38 + is_citizen_or_legal_immigrant: true + ssi: 0 + person39: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person40: + age: 33 + is_citizen_or_legal_immigrant: true + ssi: 0 + person41: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + person42: + age: 16 + is_citizen_or_legal_immigrant: true + ssi: 0 + person43: + age: 15 + is_citizen_or_legal_immigrant: true + ssi: 0 + person44: + age: 14 + is_citizen_or_legal_immigrant: true + ssi: 0 + person45: + age: 13 + is_citizen_or_legal_immigrant: true + ssi: 0 + person46: + age: 12 + is_citizen_or_legal_immigrant: true + ssi: 0 + person47: + age: 11 + is_citizen_or_legal_immigrant: true + ssi: 0 + person48: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person49: + age: 9 + is_citizen_or_legal_immigrant: true + ssi: 0 + person50: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person51: + age: 7 + is_citizen_or_legal_immigrant: true + ssi: 0 + person52: + age: 6 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person2, person3, person4, person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person6, person7, person8, person9, person10, person11] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: + - person12 + - person13 + - person14 + - person15 + - person16 + - person17 + - person18 + - person19 + - person20 + - person21 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit5: + members: + - person22 + - person23 + - person24 + - person25 + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit6: + members: + - person33 + - person34 + - person35 + - person36 + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2, person3, person4, person5] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person6, person7, person8, person9, person10, person11] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: + - person12 + - person13 + - person14 + - person15 + - person16 + - person17 + - person18 + - person19 + - person20 + - person21 + state_code: HI + county: HONOLULU_COUNTY_HI + household5: + members: + - person22 + - person23 + - person24 + - person25 + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + state_code: HI + county: HONOLULU_COUNTY_HI + household6: + members: + - person33 + - person34 + - person35 + - person36 + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_income_limit: [41_941, 80_656, 106_454, 116_144, 121_935, 207_390] + +- name: Case 2, limits use qualified size and guard zero size and other states. + period: 2026 + absolute_error_margin: 0.01 + # Two nonqualified residents do not enlarge the one-person limit. + # An all-nonqualified Hawaii unit and a California unit have zero HI limit. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person3: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person4] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person5] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + output: + hi_liheap_household_size: [1, 0, 0] + hi_liheap_income_limit: [41_941, 0, 0] + +- name: Case 3, remaining published annual cells cover every qualified size through twenty. + period: 2026 + absolute_error_margin: 0.01 + # Together with Case 1, this checks all 20 published HCAP annual cells. + # Sizes 12-19 increase by 9_495 per person (6_330 * 1.5). + input: + people: + person1: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person2: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person3: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person5: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person7: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person8: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person9: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person11: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person12: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person13: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person14: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person15: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person16: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person17: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person18: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person19: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person20: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person21: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person22: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person23: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person24: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person25: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person26: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person27: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person28: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person29: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person30: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person31: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person32: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person33: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person34: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person35: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person36: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person37: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person38: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person39: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person40: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person41: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person42: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person43: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person44: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person45: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person46: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person47: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person48: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person49: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person50: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person51: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person52: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person53: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person54: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person55: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person56: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person57: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person58: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person59: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person60: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person61: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person62: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person63: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person64: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person65: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person66: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person67: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person68: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person69: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person70: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person71: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person72: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person73: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person74: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person75: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person76: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person77: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person78: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person79: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person80: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person81: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person82: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person83: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person84: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person85: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person86: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person87: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person88: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person89: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person90: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person91: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person92: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person93: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person94: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person95: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person96: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person97: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person98: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person99: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person100: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person101: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person102: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person103: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person104: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person105: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person106: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person107: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person108: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person109: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person110: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person111: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person112: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person113: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person114: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person115: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person116: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person117: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person118: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person119: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person120: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person121: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person122: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person123: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person124: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person125: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person126: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person127: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person128: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person129: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person130: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person131: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person132: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person133: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person134: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person135: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person136: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person137: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person138: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person139: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person140: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person141: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person142: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person143: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person144: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person145: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person146: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person147: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person148: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person149: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person150: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person151: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person152: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person153: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person154: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person155: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person156: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person157: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person158: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + - person2 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: + - person3 + - person4 + - person5 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: + - person6 + - person7 + - person8 + - person9 + - person10 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: + - person11 + - person12 + - person13 + - person14 + - person15 + - person16 + - person17 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit5: + members: + - person18 + - person19 + - person20 + - person21 + - person22 + - person23 + - person24 + - person25 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit6: + members: + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit7: + members: + - person35 + - person36 + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + - person46 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit8: + members: + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + - person56 + - person57 + - person58 + - person59 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit9: + members: + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit10: + members: + - person74 + - person75 + - person76 + - person77 + - person78 + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit11: + members: + - person89 + - person90 + - person91 + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit12: + members: + - person105 + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + - person121 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit13: + members: + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + - person137 + - person138 + - person139 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit14: + members: + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + - person154 + - person155 + - person156 + - person157 + - person158 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: + - person1 + - person2 + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: + - person3 + - person4 + - person5 + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: + - person6 + - person7 + - person8 + - person9 + - person10 + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: + - person11 + - person12 + - person13 + - person14 + - person15 + - person16 + - person17 + state_code: HI + county: HONOLULU_COUNTY_HI + household5: + members: + - person18 + - person19 + - person20 + - person21 + - person22 + - person23 + - person24 + - person25 + state_code: HI + county: HONOLULU_COUNTY_HI + household6: + members: + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + state_code: HI + county: HONOLULU_COUNTY_HI + household7: + members: + - person35 + - person36 + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + - person46 + state_code: HI + county: HONOLULU_COUNTY_HI + household8: + members: + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + - person56 + - person57 + - person58 + - person59 + state_code: HI + county: HONOLULU_COUNTY_HI + household9: + members: + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + state_code: HI + county: HONOLULU_COUNTY_HI + household10: + members: + - person74 + - person75 + - person76 + - person77 + - person78 + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + state_code: HI + county: HONOLULU_COUNTY_HI + household11: + members: + - person89 + - person90 + - person91 + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + state_code: HI + county: HONOLULU_COUNTY_HI + household12: + members: + - person105 + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + - person121 + state_code: HI + county: HONOLULU_COUNTY_HI + household13: + members: + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + - person137 + - person138 + - person139 + state_code: HI + county: HONOLULU_COUNTY_HI + household14: + members: + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + - person154 + - person155 + - person156 + - person157 + - person158 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_household_size: [2, 3, 5, 7, 8, 9, 12, 13, 14, 15, 16, 17, 18, 19] + hi_liheap_income_limit: [54_846, 67_751, 93_560, 108_885, 111_305, 113_724, 131_430, 140_925, 150_420, 159_915, 169_410, 178_905, 188_400, 197_895] + +- name: Case 4, unverified historical estimate uses the prior-year Hawaii FPG. + period: 2025 + absolute_error_margin: 0.01 + # This checks parameter backfilling and the guideline-year lag only. + # It does not establish verified FY2025 Hawaii LIHEAP policy. + # 2024 Hawaii FPG at size 11: 60_640 + 6_190 * 3 = 79_210. + # 79_210 * 1.5 = 118_815; using the 2025 guideline would give 121_935. + input: + people: + person1: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person2: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + person3: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person5: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person7: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person8: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person9: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + person11: + age: 10 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + - person2 + - person3 + - person4 + - person5 + - person6 + - person7 + - person8 + - person9 + - person10 + - person11 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: + - person1 + - person2 + - person3 + - person4 + - person5 + - person6 + - person7 + - person8 + - person9 + - person10 + - person11 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_household_size: [11] + hi_liheap_income_limit: [118_815] diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_points.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_points.yaml new file mode 100644 index 00000000000..614919e9a1a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_points.yaml @@ -0,0 +1,1069 @@ +# Accepted FY2026 plan establishes the five categories and child through age five. +# https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=10 +# Matrix verifies point bands, size/island points and actual total income. +# https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 +# Historical manual section 2.10 specifies electric cost even for gas requests. +# https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=8 +# These points are before eligibility; no final award or value per point is tested. + +- name: Case 1, income points include every whole-dollar band boundary. + period: 2026 + # Matrix p3: one-person FPG = 17_990; income points = 3,3,2,2,1,1,0. + # Add one size point and one Oahu point; no vulnerability or electric burden. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_995 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_996 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 17_990 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 17_991 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 26_985 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 26_986 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person4] + state_code: HI + county: HONOLULU_COUNTY_HI + household5: + members: [person5] + state_code: HI + county: HONOLULU_COUNTY_HI + household6: + members: [person6] + state_code: HI + county: HONOLULU_COUNTY_HI + household7: + members: [person7] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: [5, 5, 4, 4, 3, 3, 2] + +- name: Case 2, size points change at three and six members. + period: 2026 + # Income 1_000 is below 50% FPG for all four sizes, giving three points. + # Size points 1,2,2,3 plus one Oahu point give 5,6,6,7. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_000 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person5: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_000 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person8: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person9: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_000 + person12: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person13: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person14: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person15: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person16: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person3, person4, person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person6, person7, person8, person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: [person11, person12, person13, person14, person15, person16] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person3, person4, person5] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person6, person7, person8, person9, person10] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person11, person12, person13, person14, person15, person16] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: [5, 6, 6, 7] + +- name: Case 3, all represented Hawaii counties get the island schedule. + period: 2026 + # Income three + size one + region one for Oahu, or region two elsewhere. + # Maui county covers Maui and Lanai; Molokai spans Maui and Kalawao counties. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_995 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_995 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_995 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_995 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 8_995 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HAWAII_COUNTY_HI + household3: + members: [person3] + state_code: HI + county: MAUI_COUNTY_HI + household4: + members: [person4] + state_code: HI + county: KAUAI_COUNTY_HI + household5: + members: [person5] + state_code: HI + county: KALAWAO_COUNTY_HI + output: + hi_liheap_points: [5, 6, 6, 6, 6] + +- name: Case 4, child elderly and disabled-adult age boundaries. + period: 2026 + # At two members and income 20_000, base = income two + size one + Oahu one. + # Accepted plan p10 gives one extra through age five, age >=60 or disabled adult. + # Age five follows the accepted plan despite the matrix under-five wording. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person2: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: false + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person4: + age: 6 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: false + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person6: + age: 59 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: false + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person8: + age: 60 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: false + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person10: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: true + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person12: + age: 18 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: true + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: [person7, person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit5: + members: [person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit6: + members: [person11, person12] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person3, person4] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person5, person6] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person7, person8] + state_code: HI + county: HONOLULU_COUNTY_HI + household5: + members: [person9, person10] + state_code: HI + county: HONOLULU_COUNTY_HI + household6: + members: [person11, person12] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: [5, 4, 4, 5, 4, 5] + +- name: Case 5, multiple vulnerability conditions earn only one point. + period: 2026 + # Income 20_000 / FPG 30_650 gives two; size three gives two; Oahu gives one. + # All three members are vulnerable but the category gives only one: 2+2+1+1=6. + input: + people: + person1: + age: 60 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person2: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: true + person3: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: 6 + +- name: Case 6, nonqualified vulnerable residents do not add vulnerability. + period: 2026 + # First three units have one qualified nonvulnerable adult: income one + size + # one + Oahu one = three. The last has two qualified members and an elder: + # income two + size one + Oahu one + vulnerability one = five. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person2: + age: 60 + is_citizen_or_legal_immigrant: false + ssi: 0 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person4: + age: 5 + is_citizen_or_legal_immigrant: false + ssi: 0 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person6: + age: 40 + is_citizen_or_legal_immigrant: false + ssi: 0 + is_disabled: true + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person8: + age: 60 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit4: + members: [person7, person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person3, person4] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person5, person6] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person7, person8] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_household_size: [1, 1, 1, 2] + hi_liheap_points: [3, 3, 3, 5] + +- name: Case 7, electric burden is inclusive at thirty percent even for gas aid. + period: 2026 + # Electricity / income is 29.99%, 30%, 30.01% and 0%. Add burden 0,1,1,0 + # to income two + size one + Oahu one. High gas bills do not earn this point. + # The last unit is 3_600 / 12_000, exactly 30%, where a float32 product exceeds 3_600. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 10_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 10_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 10_000 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 10_000 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 6_000 + pre_subsidy_electricity_expense: 2_999 + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 3_000 + hi_tanf: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 3_001 + hi_tanf: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 6_000 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 3_600 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person4] + state_code: HI + county: HONOLULU_COUNTY_HI + household5: + members: [person5] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: [4, 5, 5, 4, 5] + +- name: Case 8, zero income distinguishes positive electric expense from zero. + period: 2026 + # Income zero gives three + size one + Oahu one. Modeling convention awards + # burden for positive electric cost with zero income, but not for zero/zero; + # the sources do not prescribe a zero/zero division. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: [5, 6] + +- name: Case 9, source examples combine island child and electric burden factors. + period: 2026 + # Two adults on Oahu: 2+1+1=4; Hawaii island adds one region point. + # Adding a five-year-old gives 2 income + 2 size + 2 region + 1 vulnerability. + # Electricity 6_000 / 20_000 = 30%, adding the eighth point. No VPP is assumed. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person2: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person4: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person6: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person7: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person9: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + spm_unit3: + members: [person5, person6, person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 5_999 + hi_tanf: 0 + spm_unit4: + members: [person8, person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 6_000 + hi_tanf: 0 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person3, person4] + state_code: HI + county: HAWAII_COUNTY_HI + household3: + members: [person5, person6, person7] + state_code: HI + county: HAWAII_COUNTY_HI + household4: + members: [person8, person9, person10] + state_code: HI + county: HAWAII_COUNTY_HI + output: + hi_liheap_points: [4, 5, 7, 8] + +- name: Case 10, points remain a schedule while zero size and other states stay zero. + period: 2026 + # High income gives zero income points but still one size plus one Oahu point + # before eligibility. No qualified members or a non-Hawaii unit give zero. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_000_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person3] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + output: + hi_liheap_points: [2, 0, 0] + +- name: Case 11, categorical receipt does not replace actual income for points. + period: 2026 + # Matrix p3 uses actual total income: 6_000 wages + annual TANF 6_000 = 12_000, + # below half the two-person FPG (12_160). Thus 3+1+1=5 points. + # This follows the direct worksheet over conflicting notional-income text. + input: + people: + person1: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 6_000 + person2: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 6_000 + households: + household1: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_countable_income: 12_000 + hi_liheap_points: 5 + +# Plan page 10: age five and under includes 5.5. Income 20,000 / two-person guideline 24,320 +# gives 2; size 1 + Oahu 1 + child 1 = 5, dropping to 4 at 6. Electric 1,200 is below the 30% burden. +- name: Case 12, a child remains age five until the sixth birthday. + period: 2026 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person2: + age: 5.5 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: false + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 20_000 + person4: + age: 6 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: false + spm_units: + spm_unit1: + members: + - person1 + - person2 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + spm_unit2: + members: + - person3 + - person4 + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 1_200 + hi_tanf: 0 + households: + household1: + members: + - person1 + - person2 + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: + - person3 + - person4 + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: + - 5 + - 4 + +# With no county input, the shared fallback (Hawaii County) earns 2: 3 + 1 + 2. +- name: Case 13, an omitted county uses the shared fallback. + period: 2026 + input: + state_code: HI + ssi: 0 + hi_tanf: 0 + heating_type: NATURAL_GAS + output: + hi_liheap_points: 6 + +# An explicitly unknown county earns no island point: 3 + 1 + 0. +- name: Case 14, an explicitly unknown county earns no island point. + period: 2026 + input: + state_code: HI + county: UNKNOWN + ssi: 0 + hi_tanf: 0 + heating_type: NATURAL_GAS + output: + hi_liheap_points: 4 + +# Oahu, 30,000. The 65-year-old without a Social Security Number leaves the size: size +# 1, 30,000 / 17,990 = 1.67 earns no income point, and they earn no vulnerability point. +# Size 1 + Oahu 1 = 2. +- name: Case 15, a member without a Social Security Number adds no size or vulnerability. + period: 2026 + input: + people: + person1: + age: 35 + ssi: 0 + employment_income: 30_000 + person2: + age: 65 + ssi: 0 + ssn_card_type: NONE + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + hi_tanf: 0 + households: + household: + members: [person1, person2] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_household_size: 1 + hi_liheap_income_limit: 41_941 + hi_liheap_points: 2 + +# Oahu, 12,000 of income: 12,000 / 17,990 = 0.67 earns 2, plus size 1 and Oahu 1 = 4. +# Social Security disability, paid SSI and reported SSI each add the vulnerability point +# for an adult without is_disabled (5). The manuals' definition is by receipt. A 17-year-old +# with SSI is under the adult age (4). +- name: Case 16, disability payments add the disabled-adult point. + period: 2026 + input: + people: + person1: + age: 40 + ssi: 0 + social_security_disability: 12_000 + person2: + age: 40 + ssi: 12_000 + person3: + age: 40 + ssi: 0 + employment_income: 12_000 + receives_ssi: + 2026-01: true + person4: + age: 17 + ssi: 12_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + hi_tanf: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + hi_tanf: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + hi_tanf: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + hi_tanf: 0 + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person4] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_points: [5, 5, 5, 4] diff --git a/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.yaml new file mode 100644 index 00000000000..856ca12b3c3 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.yaml @@ -0,0 +1,350 @@ +# FY2026 matrix: eligible size 1-2 -> 375; 3-5 -> 425; 6+ -> 475. +# https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2 +# Private dwellings stay at zero here because this output covers subsidized dwellings only. + +- name: Case 1, the flat benefit covers every size boundary and the open final band. + period: 2026 + absolute_error_margin: 0.01 + # The matrix bands give 375 to sizes one/two, 425 to three/five and 475 + # to six/seven. Members are explicitly listed rather than overriding size. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person9: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person10: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person11: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person12: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person13: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person14: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person15: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person16: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person17: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person18: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person19: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person20: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person21: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person22: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person23: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + person24: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit3: + members: [person4, person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit4: + members: [person7, person8, person9, person10, person11] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit5: + members: [person12, person13, person14, person15, person16, person17] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit6: + members: [person18, person19, person20, person21, person22, person23, person24] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person4, person5, person6] + state_code: HI + county: HONOLULU_COUNTY_HI + household4: + members: [person7, person8, person9, person10, person11] + state_code: HI + county: HONOLULU_COUNTY_HI + household5: + members: [person12, person13, person14, person15, person16, person17] + state_code: HI + county: HONOLULU_COUNTY_HI + household6: + members: [person18, person19, person20, person21, person22, person23, person24] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_subsidized_amount: [375, 375, 425, 425, 475, 475] + +- name: Case 2, the flat benefit uses qualified size without an additional household share. + period: 2026 + absolute_error_margin: 0.01 + # Three residents with one qualified child use 375, without a further 1/3 + # proration. Zero qualified size and California produce no Hawaii benefit. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person3: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + person4: + age: 35 + is_citizen_or_legal_immigrant: false + ssi: 0 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person6: + age: 30 + is_citizen_or_legal_immigrant: true + ssi: 0 + person7: + age: 5 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit2: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit3: + members: [person5, person6, person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + households: + household1: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person4] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person5, person6, person7] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + output: + hi_liheap_household_size: [1, 0, 0] + hi_liheap_subsidized_amount: [375, 0, 0] + +- name: Case 3, eligibility and subsidized housing are both required. + period: 2026 + absolute_error_margin: 0.01 + # Gas in subsidized rent pays 375. Income of 500_000 is above the limit. An eligible + # private dwelling is outside this output, which reads zero for it. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 500_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 150 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + heat_expense_included_in_rent: true + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: true + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + pre_subsidy_electricity_expense: 0 + hi_tanf: 0 + receives_housing_assistance: false + households: + household1: + members: [person1] + state_code: HI + county: HONOLULU_COUNTY_HI + household2: + members: [person2] + state_code: HI + county: HONOLULU_COUNTY_HI + household3: + members: [person3] + state_code: HI + county: HONOLULU_COUNTY_HI + output: + hi_liheap_eligible: [true, false, true] + hi_liheap_subsidized_amount: [375, 0, 0] + +- name: Case 4, public housing without a voucher receives the flat benefit. + period: 2026 + absolute_error_margin: 0.01 + # Wages 30_000 are below the three-person limit of 67_751; size three pays 425. + input: + people: + person1: + age: 35 + ssi: 0 + employment_income_before_lsr: 30_000 + person2: + age: 33 + ssi: 0 + person3: + age: 8 + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 900 + hi_tanf: 0 + households: + household: + members: [person1, person2, person3] + state_code: HI + county: HONOLULU_COUNTY_HI + is_in_public_housing: true + output: + hi_liheap_countable_income: 30_000 + hi_liheap_eligible: true + hi_liheap_subsidized_amount: 425 diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_countable_income.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_countable_income.py new file mode 100644 index 00000000000..cd4410e8de2 --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_countable_income.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class hi_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Hawaii LIHEAP annual countable income" + definition_period = YEAR + unit = USD + defined_for = StateCode.HI + reference = ( + # PDF pages 6-7 + "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=6", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.hi.dhs.liheap.income + # Annual flows approximate prior-month receipts. Minor and nonqualified + # members' income counts; source losses cannot offset other receipts. + person = spm_unit.members + income = 0 + for source in p.sources: + income = income + max_(add(person, period, [source]), 0) + return spm_unit.sum(income) + spm_unit("tanf", period) diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py new file mode 100644 index 00000000000..e5292c13fac --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py @@ -0,0 +1,54 @@ +from policyengine_us.model_api import * + + +class hi_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Hawaii LIHEAP regular heating assistance" + definition_period = YEAR + defined_for = StateCode.HI + reference = ( + # PDF pages 5, 9 + "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=5", + # PDF pages 1, 3 + "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1", + # Draft FY2026 manual sections 1.4, 2.1, 2.8, 2.12, 4.2 and 5.5. + # PDF pages 57-58, 60-61, 65, 67 + "https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=57", + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("hi_liheap_household_size", period) + income = spm_unit("hi_liheap_countable_income", period) + limit = spm_unit("hi_liheap_income_limit", period) + # Draft manual 5.5 reads "equal to or less than"; draft 2.9 and the matrix + # read "less than" and "below". The calculation section is followed. + income_eligible = income <= limit + # Any member's receipt qualifies. Plan vs manual: draft 2.8 and the matrix + # add general assistance and AABD to the plan's SNAP, SSI and TANF, and the + # manual is followed. AABD and the DHS-case match have no input, and SSA's + # independent-living certification is not read. Annual receipt stands in + # for the first day of the application month. + person = spm_unit.members + receives_ssi = spm_unit.any( + (person("ssi", period, options=[ADD]) > 0) + | (add(person, period, ["receives_ssi"]) > 0) + ) + categorical = receives_ssi | ( + add(spm_unit, period, ["snap", "tanf", "general_assistance"]) > 0 + ) + # Both manuals pay gas as heating and electricity as cooling, and a household + # asks to have one utility credited (2.12; application Q17). So any home's + # gas bill qualifies, whatever heats it or the rent includes. Bottled gas does + # not show the active utility account that draft 2.1 requires. Callers must + # send heating_type. + fuel = spm_unit("heating_type", period) + types = fuel.possible_values + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + gas_bill = spm_unit("gas_expense", period) > 0 + # Draft 2.1 and 4.2 and application Q23-24 accept a share of utilities in + # rent, which has no input; plan 2.3 and the 2020 manual do not. + responsible = (gas_bill & (fuel != types.UNSPECIFIED)) | ( + heat_in_rent & (fuel == types.NATURAL_GAS) + ) + return (size > 0) & (income_eligible | categorical) & responsible diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_household_size.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_household_size.py new file mode 100644 index 00000000000..c0539676ce1 --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_household_size.py @@ -0,0 +1,15 @@ +from policyengine_us.model_api import * + + +class hi_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + label = "Hawaii LIHEAP qualified household size" + definition_period = YEAR + defined_for = StateCode.HI + reference = ( + "https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=6", + ) + # The SPM unit approximates the utility-sharing household. All members' + # income remains countable, including members excluded from this size. + adds = ["hi_liheap_qualified_member"] diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_income_limit.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_income_limit.py new file mode 100644 index 00000000000..da4d8ce0c0e --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_income_limit.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class hi_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + label = "Hawaii LIHEAP annual income limit" + definition_period = YEAR + unit = USD + defined_for = StateCode.HI + reference = ( + "https://www.hcapweb.org/wp-content/uploads/2026/04/H-HEAP-2026-Income-Eligibility.pdf", + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("hi_liheap_household_size", period) + group = spm_unit.household("state_group_str", period) + p = parameters(period).gov.states.hi.dhs.liheap + smi_limit = p.eligibility.smi_amount.calc(size) + fpg_limit = p.eligibility.fpg_rate * fpg( + size, + group, + period, + parameters, + year_lag=p.fpg_year_lag, + ) + # The operational schedule's first ten amounts cannot all be reproduced + # from SMI and a consistent rounding rule. Preserve the published dollars. + # Its sizes 11-20 exactly match the lagged Hawaii FPG calculation; + # continuing that percentage above size 20 is an unverified extension. + return where(size <= p.eligibility.smi_max_household_size, smi_limit, fpg_limit) diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_points.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_points.py new file mode 100644 index 00000000000..ccf15e3e147 --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_points.py @@ -0,0 +1,85 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class hi_liheap_points(Variable): + value_type = int + entity = SPMUnit + label = "Hawaii LIHEAP private dwelling points before eligibility" + definition_period = YEAR + defined_for = StateCode.HI + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=10", + # PDF pages 2-3 + "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2", + # PDF pages 2, 8 + "https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=2", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.hi.dhs.liheap + size = spm_unit("hi_liheap_household_size", period) + income = spm_unit("hi_liheap_countable_income", period) + group = spm_unit.household("state_group_str", period) + poverty = fpg( + size, + group, + period, + parameters, + year_lag=p.fpg_year_lag, + ) + income_points = p.payment.points.income.calc( + income.astype(np.float64) / poverty, right=True + ) + size_points = p.payment.points.household_size.calc(size) + county = spm_unit.household("county_str", period) + # County identifies Oahu without another island input. The shared + # county variable uses its existing first-county fallback if not supplied. + # Explicitly unknown or out-of-state counties earn no regional points. + oahu = county == "HONOLULU_COUNTY_HI" + neighbor = np.isin( + county, + [ + "HAWAII_COUNTY_HI", + "MAUI_COUNTY_HI", + "KAUAI_COUNTY_HI", + "KALAWAO_COUNTY_HI", + ], + ) + region = p.payment.points.region + region_points = where(oahu, region.oahu, where(neighbor, region.neighbor, 0)) + person = spm_unit.members + age = person("age", period) + qualified = person("hi_liheap_qualified_member", period) + # The manuals define a disabled individual by receipt of SSI or Social + # Security disability payments. Veterans' 100% ratings, governmental + # disability retirement and railroad disability have no separate input, + # so is_disabled stands in for them. This affects points only. + disabled = ( + person("is_disabled", period) + | (person("ssi", period, options=[ADD]) > 0) + | (add(person, period, ["receives_ssi"]) > 0) + | (person("social_security_disability", period) > 0) + ) + ages = p.payment.points.vulnerability + vulnerable = spm_unit.any( + qualified + & ( + (np.floor(age) <= ages.child_max_age) + | (age >= ages.elderly_min_age) + | (disabled & (age >= ages.adult_min_age)) + ) + ) + # The manual and gas application use ELECTRIC costs for burden even + # when the requested credit pays gas. Annual costs approximate the + # current paid bill. Positive costs with zero income have high burden; + # zero costs and zero income do not establish an energy burden. A float32 + # product can round above an exact 30% bill, so compare in float64. + electricity = spm_unit("pre_subsidy_electricity_expense", period) + high_burden = (electricity > 0) & ( + electricity.astype(np.float64) + >= income.astype(np.float64) * p.payment.points.burden_rate + ) + points = income_points + size_points + region_points + vulnerable + high_burden + # These are schedule points, before eligibility and not a dollar award. + return where(size > 0, points, 0) diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_qualified_member.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_qualified_member.py new file mode 100644 index 00000000000..19c5dd4015c --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_qualified_member.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class hi_liheap_qualified_member(Variable): + value_type = bool + entity = Person + label = "Qualified member for Hawaii LIHEAP" + definition_period = YEAR + defined_for = StateCode.HI + reference = ( + "https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=6", + "https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=59", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.hi.dhs.liheap.eligibility + # COFA citizens can be represented by an explicit qualified-status flag; + # the shared immigration enum does not yet distinguish COFA status. + qualified_status = person("is_citizen_or_legal_immigrant", period) + ssn_card_type = person("ssn_card_type", period) + has_ssn = ssn_card_type != ssn_card_type.possible_values.NONE + ssn_required = person("age", period) >= p.ssn_min_age + return qualified_status & (has_ssn | ~ssn_required) diff --git a/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.py b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.py new file mode 100644 index 00000000000..14bca994c5d --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class hi_liheap_subsidized_amount(Variable): + value_type = float + entity = SPMUnit + label = "Hawaii LIHEAP flat heating benefit for subsidized dwellings" + definition_period = YEAR + unit = USD + defined_for = "hi_liheap_eligible" + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=10", + "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2", + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("hi_liheap_household_size", period) + p = parameters(period).gov.states.hi.dhs.liheap.payment + subsidized = spm_unit( + "receives_housing_assistance", period + ) | spm_unit.household("is_in_public_housing", period) + # This output covers subsidized dwellings only. Private dwellings receive + # points times a statewide value per point, which was not located for + # FY2026, so zero here is not a private dwelling's entitlement. The same + # schedule pays net-consuming photovoltaic households, whose production + # has no input. + return where(subsidized, p.subsidized_amount.calc(size), 0) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index b17082ab4ca..ccd14853e8c 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2735,6 +2735,146 @@ candidates: theirs (hi_disabled_exemptions.py, compared with hi_regular_exemptions in hi_exemptions.py). The October 2026 ruling retained the regulation and instruction reading; verify the statute and whether the guidance describes only the disabled spouse''s exemption.' +- id: us-hi:liheap-bottled-gas-accounts + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Does a Hawaii gas company's bottled gas customer qualify for LIHEAP on that bill, as the plan's fraud section + and the manuals' bill definition suggest, or does the active utility account requirement leave bottled gas out? + sources: + - kind: manual + citation: Hawaii draft FY2026 Policies and Procedures, definitions and sections 2.1 and 4.2, model plan packet PDF pages + 55, 57, 58 and 65 + url: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=55 + - kind: manual + citation: Hawaii 2020 Policies and Procedures, definitions, PDF page 2 + url: https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=2 + - kind: plan + citation: Hawaii FY2026 LIHEAP State Plan, item 17.9, PDF page 41 + url: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=41 + readings: + statute: No statute is supplied; draft 2.1 requires "a place of residence with an active utility account", and draft + 4.2 item 9 requires "an active account number for residential energy service with the specified island utility + company". + other: Plan 17.9 says "natural gas or propane is delivered but is handled by the utility company". Both manuals' + Current Utility Expense includes "kilowatt/therms/tank/ cylinder charges", and the draft defines Utility by the + company, "electricity or gas provided by a company subject to regulation by the Public Utilities Commission". + example: One person aged 70 in public housing with $18,000 of Social Security, propane heat and a $480 bottled gas bill + receives $0 under the account reading and $375 if a tank account is credited. + pe_us: + follows: gap-fill + code: + - policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10614 + state: unreviewed + note: PE-US reads a positive gas_expense as the bill and does not read bottled_gas_expense, so a bottled gas customer is + not eligible. No source says outright that tank accounts are credited. + +- id: us-hi:liheap-categorical-routes + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Does general assistance receipt waive Hawaii's LIHEAP income test, as the draft manual and matrix provide, or + only SNAP, SSI and TANF, as the plan and application list? + sources: + - kind: manual + citation: Hawaii draft FY2026 Policies and Procedures, section 2.8, model plan packet PDF page 60 + url: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=60 + - kind: guidance + citation: Hawaii FY2026 H-HEAP benefit matrix, PDF page 1 + url: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1 + - kind: plan + citation: Hawaii FY2026 LIHEAP State Plan, item 1.4, PDF page 5 + url: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=5 + - kind: form + citation: 2026 H-HEAP application, question 12, PDF page 3 + url: https://humanservices.hawaii.gov/bessd/files/2026/06/2026-Application-Packet.pdf#page=3 + readings: + statute: No statute is supplied; draft 2.8 and the matrix treat receipt of SNAP, TANF, general assistance, AABD or SSI + as categorical. + other: Plan 1.4 and application question 12 name only SNAP, SSI and TANF. + example: One person in public housing with $100,000 of countable income, $1,200 of general assistance and a gas bill + receives $375 under the manual and $0 under the plan. + pe_us: + follows: gap-fill + code: + - policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10614 + state: ruled + note: 'Ruled 2026-11-02: follow the manual and matrix. AABD has no input. Income points for a categorical household follow + matrix page 3 and draft page 69 (actual total income) over the categorical chart on matrix page 1.' +- id: us-hi:liheap-income-limit-comparison + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Does Hawaii LIHEAP income exactly at the limit qualify? + sources: + - kind: manual + citation: Hawaii draft FY2026 Policies and Procedures, section 5.5, model plan packet PDF page 67 + url: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=67 + - kind: manual + citation: Hawaii draft FY2026 Policies and Procedures, section 2.9, model plan packet PDF page 60 + url: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=60 + - kind: guidance + citation: Hawaii FY2026 H-HEAP benefit matrix, PDF page 3 + url: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=3 + readings: + statute: No statute is supplied; draft 5.5 reads "equal to or less than". + other: Draft 2.9 reads "less than" and the matrix reads "below". + example: One person in public housing with $41,941 of countable income and a gas bill receives $375 under draft 5.5 and + $0 under draft 2.9. + pe_us: + follows: gap-fill + code: + - policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10614 + state: ruled + note: 'Ruled 2026-11-02: the comparison is inclusive, following the calculation section.' +- id: us-hi:liheap-utilities-in-rent + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Is a Hawaii household whose gas is included in its rent eligible for LIHEAP, as the draft manual and application + provide, or ineligible, as the 2020 manual provides? + sources: + - kind: manual + citation: Hawaii draft FY2026 Policies and Procedures, sections 2.1 and 4.2, model plan packet PDF pages 58 and 65 + url: https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=58 + - kind: form + citation: 2026 H-HEAP application, questions 23 and 24, PDF page 4 + url: https://humanservices.hawaii.gov/bessd/files/2026/06/2026-Application-Packet.pdf#page=4 + - kind: manual + citation: Hawaii 2020 Policies and Procedures, ineligible households, PDF page 9 + url: https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=9 + - kind: plan + citation: Hawaii FY2026 LIHEAP State Plan, item 2.3, PDF page 9 + url: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=9 + readings: + statute: No statute is supplied; draft 2.1 accepts "the household's prorated share of the utility bill if rent includes + utilities", and application questions 23 and 24 ask for that share. + other: The 2020 manual lists "Households where all utilities are included in the rent" as ineligible, and plan 2.3 + answers No for differing policies for renters with utilities in the rent. + example: One person aged 70 in public housing with $18,000 of Social Security and gas in the rent receives $375 under the + draft manual and $0 under the 2020 manual. + pe_us: + follows: gap-fill + code: + - policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10614 + state: ruled + note: 'Ruled 2026-11-02: follow the draft manual and application. The size of the share has no input.' - id: us-hi:snap-abawd-implementation-date program: snap years: