From a06b36204010747bfb6488d594bc3edbed8c617b Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 3 Oct 2026 19:47:13 -0400 Subject: [PATCH 1/8] Add Hawaii LIHEAP household income and schedule components --- changelog.d/hi-liheap-wave2c.added.md | 1 + .../gov/states/hi/dhs/liheap/README.md | 52 ++ .../hi/dhs/liheap/eligibility/fpg_rate.yaml | 10 + .../hi/dhs/liheap/eligibility/smi_rate.yaml | 10 + .../states/hi/dhs/liheap/fpg_year_lag.yaml | 10 + .../states/hi/dhs/liheap/income/sources.yaml | 41 + .../liheap/payment/points/burden_rate.yaml | 10 + .../liheap/payment/points/household_size.yaml | 27 + .../hi/dhs/liheap/payment/points/income.yaml | 27 + .../hi/dhs/liheap/payment/points/region.yaml | 12 + .../points/vulnerability/adult_min_age.yaml | 10 + .../points/vulnerability/child_max_age.yaml | 10 + .../points/vulnerability/elderly_min_age.yaml | 10 + .../dhs/liheap/payment/subsidized_amount.yaml | 27 + policyengine_us/programs.yaml | 7 + .../liheap/hi_liheap_countable_income.yaml | 337 +++++++ .../dhs/liheap/hi_liheap_household_size.yaml | 95 ++ .../hi/dhs/liheap/hi_liheap_income_limit.yaml | 443 +++++++++ .../hi/dhs/liheap/hi_liheap_points.yaml | 878 ++++++++++++++++++ .../liheap/hi_liheap_subsidized_amount.yaml | 317 +++++++ .../dhs/liheap/hi_liheap_countable_income.py | 21 + .../hi/dhs/liheap/hi_liheap_household_size.py | 19 + .../hi/dhs/liheap/hi_liheap_income_limit.py | 34 + .../states/hi/dhs/liheap/hi_liheap_points.py | 71 ++ .../dhs/liheap/hi_liheap_subsidized_amount.py | 22 + 25 files changed, 2501 insertions(+) create mode 100644 changelog.d/hi-liheap-wave2c.added.md create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/fpg_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/fpg_year_lag.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/burden_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/household_size.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/income.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/region.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/child_max_age.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/elderly_min_age.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/subsidized_amount.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_household_size.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_income_limit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_points.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.yaml create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_household_size.py create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_income_limit.py create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_points.py create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.py diff --git a/changelog.d/hi-liheap-wave2c.added.md b/changelog.d/hi-liheap-wave2c.added.md new file mode 100644 index 00000000000..1fbfec9b065 --- /dev/null +++ b/changelog.d/hi-liheap-wave2c.added.md @@ -0,0 +1 @@ +Add Hawaii LIHEAP regular-heating income, household and benefit-schedule components; final awards remain incomplete pending the statewide value per point and eligibility details. diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md b/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md new file mode 100644 index 00000000000..1347d2fb96a --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md @@ -0,0 +1,52 @@ +# Hawaii regular heating components + +These FY2026 components implement qualified household size, annualized countable +income, the percentage-based income ceiling, private-dwelling points and the +published subsidized-dwelling amount schedule. They do not determine final +eligibility or a dollar award. The statewide value per point is not published in +the acquired sources: $140 is explicitly an example. No hypothetical value is +encoded. Full regular heating assistance remains incomplete. + +Gas EC is heating; electricity EC is cooling and outside this task. Household +SPM membership approximates the unit sharing utilities. All members' income, +including minor earnings and income of nonqualified members, counts, but only +qualified members count toward the size schedule. COFA status needs an explicit +qualified-member boolean because the shared immigration enum lacks that status. +Historical household rules are corroborated by the current application. + +Annual income and electric expenses approximate the prior-month assessment. +Existing net business inputs need no second deduction. Pension, Social Security +and retirement-distribution aggregates are counted once, with separate private +survivor receipts. Monthly SSI and state TANF are annualized; TANF enters once +per household. No Medicare adjustment is added. Cash gifts from friends or relatives enter through financial_assistance, and +lottery/gambling winnings enter through gambling_winnings. Mortgage principal +receipts, jury compensation, settlements, foster/adoption payments and community +service stipends lack separately identified inputs. Wage-embedded work-study, +VA education payments and earmarked insurance reimbursements cannot be reliably +separated. Those are missing facts, not policy exclusions; life insurance +receipts are included as represented lump-sum insurance proceeds. + +The adopted percentage income limits use requested-year SMI and prior-calendar- +year Hawaii FPG. The matrix labels its income dollar table as projected and has +an inconsistent six-person cell. The model does not copy that error or assert +that all projected dollar cells follow a uniform rounding rule. Final threshold +inclusivity and the categorical mandatory-member case condition still need +resolution before an eligibility award is introduced. + +Private dwelling points follow the adopted plan's age-five-inclusive language. +Disability counts for adults. Burden uses electric expenses even for gas aid, +consistent with the historical manual and current application. Positive expense +at zero income is treated as high burden, but zero expense does not earn that +point. County maps Oahu to Honolulu. Explicit unknown county earns zero regional +points; omitted county retains the shared model first-county fallback. +Points are before eligibility and housing dispatch, and are not a benefit. +The flat schedule likewise does not assert that its recipient meets eligibility. +Photovoltaic net consumption cannot be inferred from solar heating type. + +Parameters are verified for FY2026 only after tests. Earlier backfilled results +are unverified historical estimates. FY2027 sources are proposed, not adopted. +Crisis, cooling, weatherization and equipment are outside this work. + +Sources are recorded in the individual variable and parameter references and +the Wave2C source manifest, which preserves the accepted plan, published matrix, +historical manual, current application and draft documents separately. 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..ad55f7c43aa --- /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 floor 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 and benefit schedule + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8,9 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml new file mode 100644 index 00000000000..cca3bd3b621 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml @@ -0,0 +1,10 @@ +description: Hawaii limits household income to this share of state median income when greater than the poverty-guideline limit under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 0.6 +metadata: + unit: /1 + period: year + label: Hawaii LIHEAP SMI income limit rate + reference: + - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8,9 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..1979cc3e8bc --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/fpg_year_lag.yaml @@ -0,0 +1,10 @@ +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: int + period: year + label: Hawaii LIHEAP federal poverty guideline year lag + reference: + - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1,3 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..8c6a31f094f --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml @@ -0,0 +1,41 @@ +description: Hawaii counts these represented income sources under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - partnership_s_corp_income + - unemployment_compensation + - strike_benefits + - social_security + - ssi + - pension_income + - retirement_distributions + - survivor_benefits + - general_assistance + - hi_tanf + - rental_income + - farm_rent_income + - alimony_income + - child_support_received + - interest_income + - dividend_income + - veterans_benefits + - workers_compensation + - disability_benefits + - estate_income + - life_insurance_benefits + - financial_assistance + - gambling_winnings +# Pension, Social Security and retirement-distribution components enter once. +# State TANF is a household amount; SSI and TANF are aggregated from MONTH. +# No minor-earnings exclusion applies. Missing receipt categories are documented +# in the accompanying README and are not treated as policy exclusions. +metadata: + unit: list + period: year + label: Hawaii LIHEAP countable income sources + reference: + - title: Hawaii FY2026 LIHEAP State Plan, countable income + href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=6,7 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..7ba02372c6a --- /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 LIHEAP State Plan and benefit schedule + 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..1f44b69b6ac --- /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,3 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..e12feecdfb6 --- /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 + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2,3 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..8ee37f80dac --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml @@ -0,0 +1,10 @@ +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. +values: + 2025-10-01: 18 +metadata: + unit: int + period: year + label: Hawaii LIHEAP disabled adult 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/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..0a8b48b3fd8 --- /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: int + 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..db99ec720be --- /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: int + 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..767070a8f61 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/subsidized_amount.yaml @@ -0,0 +1,27 @@ +description: Hawaii provides these scheduled subsidized-dwelling amounts 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 scheduled amount + reference: + - title: Hawaii FY2026 LIHEAP benefit matrix + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2,3 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 756dc2c4988..9b3091b544f 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -846,6 +846,13 @@ programs: variable: tx_ceap parameter_prefix: gov.states.tx.tdhca.ceap notes: Models the FPG income limit, the FY2024-only SMI limit, benefit amounts, and categorical eligibility through TANF enrollment, SNAP eligibility, and SSI receipt. Not modeled - net rather than gross gambling winnings, the Medicare premium deduction from counted Social Security, and the exclusion of means-tested veterans' pensions from counted income (10 TAC 6.4(c)) + - state: HI + status: in_progress + name: Hawaii LIHEAP components + full_name: Hawaii Low Income Home Energy Assistance Program components + parameter_prefix: gov.states.hi.dhs.liheap + verified_years: "2026" + notes: Five regular-heating components for household size, countable income, policy-percentage ceiling, points and subsidized schedule amounts. No final eligibility or private-dwelling award: FY2026 statewide value per point is unverified, and categorical-household and eligibility-comparison details remain unresolved. Annual inputs and SPM units approximate application circumstances. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment remain outside scope. # --- SSA programs --- - id: ssi 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..185233b7cd1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_countable_income.yaml @@ -0,0 +1,337 @@ +# 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,7 +# 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,67 +# 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 plus separate net business receipts = 12_000 + 2_000 + 300 + # + 700 + 1_000 = 16_000; no second business-expense deduction. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + 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_000 + +- 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 + # Component convention floors negative annual resources at zero; the income + # point schedule starts 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] 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..fe268bb3994 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_household_size.yaml @@ -0,0 +1,95 @@ +# 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] 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..3b1d0afd6c9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_income_limit.yaml @@ -0,0 +1,443 @@ +# Accepted plan uses 60% SMI and 150% Hawaii FPG for the maximum threshold. +# https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=9,50 +# FY2026 matrix verifies prior-year Hawaii FPG = 17_990 + 6_330 * (size - 1). +# https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=3 +# Federal-supported Clearinghouse verifies SMI size factors and +3% above six. +# https://liheapch.acf.gov/profiles/povertytables/FY2026/hismi.htm +# Raw four-person SMI of 134_428 is the shared-guideline contract value. Direct +# federal raw-table retrieval failed; these SMI dollar checks do not independently +# verify that shared base. They intentionally do not adopt projected rounded rows. + +- name: Case 1, percentage limits span federal size factors and the FPG crossover. + period: 2026 + absolute_error_margin: 0.01 + # Contract SMI base 134_428 * 0.60 = 80_656.8; size multipliers are + # 0.52, 1, 1.32 and 1.44 for sizes 1, 4, 6 and 10. + # FPG overtakes SMI at size 11: (17_990 + 6_330 * 10) * 1.5 = 121_935. + # Size 20: (17_990 + 6_330 * 19) * 1.5 = 207_390. + # No eligibility comparator or rounding assertion is made. + 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.536, 80_656.8, 106_466.976, 116_145.792, 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.536, 0, 0] 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..989e3f24c98 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_points.yaml @@ -0,0 +1,878 @@ +# Accepted FY2026 plan establishes the five categories and child age <=5. +# 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,3 +# 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 for age <=5, 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. + 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 + 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 + 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: [4, 5, 5, 4] + +- 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 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..1e76a9a592e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.yaml @@ -0,0 +1,317 @@ +# 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 +# Tests assert the size schedule BEFORE eligibility, never an approved award. + +- name: Case 1, flat schedule 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, flat schedule 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 schedule. + 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, schedule remains separate from income housing and expense eligibility. + period: 2026 + absolute_error_margin: 0.01 + # This component exposes the one-person schedule before eligibility: 375. + # A rent-included utility share below 375 does not alter that schedule. + # High income and private housing do not turn a schedule into an award. + 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_subsidized_amount: [375, 375, 375] 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..499eefcc7aa --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_countable_income.py @@ -0,0 +1,21 @@ +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 = ( + "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=6,7", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.hi.dhs.liheap.income + # Annual flows approximate annualized prior-month income. All members' + # income counts, including minor earnings and nonqualified members. + # add() annualizes monthly SSI and adds household TANF only once. + # Net business inputs require no second business-expense deduction. + return max_(add(spm_unit, period, p.sources), 0) 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..cd056cab4fe --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_household_size.py @@ -0,0 +1,19 @@ +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", + ) + + def formula(spm_unit, period, parameters): + # The SPM unit approximates the utility-sharing household. All members' + # income remains countable, including members excluded from this size. + # COFA citizens can be represented by an explicit qualified-status flag; + # the shared immigration enum does not yet distinguish COFA status. + return spm_unit.sum(spm_unit.members("is_citizen_or_legal_immigrant", period)) 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..612222fc3b6 --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_income_limit.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi +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://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8,9", + "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1", + ) + + def formula(spm_unit, period, parameters): + size = spm_unit("hi_liheap_household_size", period) + state = spm_unit.household("state_code_str", period) + group = spm_unit.household("state_group_str", period) + p = parameters(period).gov.states.hi.dhs.liheap + smi_limit = p.eligibility.smi_rate * smi(size, state, period, parameters) + fpg_limit = p.eligibility.fpg_rate * fpg( + max_(size, 1), + group, + period, + parameters, + year_lag=p.fpg_year_lag, + ) + # The accepted plan specifies percentages. The matrix's projected dollar + # table has inconsistent rounding and a six-person transcription error; + # use the policy rates with the requested year's federal guidelines. + return where(size > 0, max_(smi_limit, fpg_limit), 0) 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..08beaf797fe --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_points.py @@ -0,0 +1,71 @@ +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", + "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=2,3", + "https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=8", + ) + + 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( + max_(size, 1), + 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("is_citizen_or_legal_immigrant", period) + ages = p.payment.points.vulnerability + vulnerable = spm_unit.any( + qualified + & ( + (age <= ages.child_max_age) + | (age >= ages.elderly_min_age) + | (person("is_disabled", period) & (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. + electricity = spm_unit("pre_subsidy_electricity_expense", period) + high_burden = (electricity > 0) & ( + electricity >= income * p.payment.points.burden_rate + ) + points = income_points + size_points + region_points + vulnerable + high_burden + # These are schedule points, not a dollar award or eligibility decision. + return where(size > 0, points, 0) 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..15c402d2464 --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_subsidized_amount.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class hi_liheap_subsidized_amount(Variable): + value_type = float + entity = SPMUnit + label = "Hawaii LIHEAP subsidized dwelling scheduled amount before eligibility" + definition_period = YEAR + unit = USD + defined_for = StateCode.HI + 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 + # This exposes the supported size schedule, not an eligibility award. + # The same schedule applies to net-consuming photovoltaic households, + # whose production/use distinction is not a current model input. + return p.subsidized_amount.calc(size) From 83e18fcee3851d0b1777223841d45757c0455eba Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 3 Oct 2026 19:50:31 -0400 Subject: [PATCH 2/8] Quote Hawaii LIHEAP registry scope notes --- policyengine_us/programs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 9b3091b544f..5f53e93aa56 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -852,7 +852,7 @@ programs: full_name: Hawaii Low Income Home Energy Assistance Program components parameter_prefix: gov.states.hi.dhs.liheap verified_years: "2026" - notes: Five regular-heating components for household size, countable income, policy-percentage ceiling, points and subsidized schedule amounts. No final eligibility or private-dwelling award: FY2026 statewide value per point is unverified, and categorical-household and eligibility-comparison details remain unresolved. Annual inputs and SPM units approximate application circumstances. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment remain outside scope. + notes: "Five regular-heating components for household size, countable income, policy-percentage ceiling, points and subsidized schedule amounts. No final eligibility or private-dwelling award: FY2026 statewide value per point is unverified, and categorical-household and eligibility-comparison details remain unresolved. Annual inputs and SPM units approximate application circumstances. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment remain outside scope." # --- SSA programs --- - id: ssi From 5d23d851c3bd88d16f5003541fab93a4330c10e4 Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 3 Oct 2026 20:06:05 -0400 Subject: [PATCH 3/8] Correct Hawaii LIHEAP income table reference --- .../gov/states/hi/dhs/liheap/hi_liheap_income_limit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 612222fc3b6..2e30e966b73 100644 --- 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 @@ -12,7 +12,7 @@ class hi_liheap_income_limit(Variable): defined_for = StateCode.HI reference = ( "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8,9", - "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=1", + "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=3", ) def formula(spm_unit, period, parameters): From 139d8e8c9eb0ae2df933ef2c3f106a08ed10c0cf Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 3 Oct 2026 21:22:07 -0400 Subject: [PATCH 4/8] Use verified Hawaii LIHEAP operational income limits --- .../gov/states/hi/dhs/liheap/README.md | 26 +- .../hi/dhs/liheap/eligibility/smi_amount.yaml | 57 + .../eligibility/smi_max_household_size.yaml | 10 + .../hi/dhs/liheap/eligibility/smi_rate.yaml | 10 - policyengine_us/programs.yaml | 2 +- .../hi/dhs/liheap/hi_liheap_income_limit.yaml | 1223 ++++++++++++++++- .../hi/dhs/liheap/hi_liheap_income_limit.py | 19 +- 7 files changed, 1304 insertions(+), 43 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_max_household_size.yaml delete mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md b/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md index 1347d2fb96a..bbe34f3b22e 100644 --- a/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md @@ -1,7 +1,7 @@ # Hawaii regular heating components These FY2026 components implement qualified household size, annualized countable -income, the percentage-based income ceiling, private-dwelling points and the +income, the operational income ceiling, private-dwelling points and the published subsidized-dwelling amount schedule. They do not determine final eligibility or a dollar award. The statewide value per point is not published in the acquired sources: $140 is explicitly an example. No hypothetical value is @@ -26,12 +26,24 @@ VA education payments and earmarked insurance reimbursements cannot be reliably separated. Those are missing facts, not policy exclusions; life insurance receipts are included as represented lump-sum insurance proceeds. -The adopted percentage income limits use requested-year SMI and prior-calendar- -year Hawaii FPG. The matrix labels its income dollar table as projected and has -an inconsistent six-person cell. The model does not copy that error or assert -that all projected dollar cells follow a uniform rounding rule. Final threshold -inclusivity and the categorical mandatory-member case condition still need -resolution before an eligibility award is introduced. +The April 2026 HCAP operational intake chart and MEO provider schedule corroborate +the published annual income limits, including the six-person amount of $106,454. +The first ten amounts cannot all be reproduced by a consistent SMI rounding rule, +so the model preserves those dollars. It does not replace the six-person cell +with an inferred correction. Sizes 11-20 exactly reproduce 150% of the requested +year's prior-calendar-year Hawaii FPG and use that shared calculation. Continuing +the FPG rule above size 20 is an inference, not a separately verified table row. +No monthly cent-rounding rule is inferred from these annual amounts. Earlier +years backfill the published first-ten schedule and remain unverified estimates. + +The accepted plan and current application support at least one categorical +recipient, rather than every mandatory household member receiving assistance. +The specific calculation instruction supports an inclusive income comparison. +Final eligibility still requires resolving the SSI independent-living +certification: the existing federal and Hawaii living-arrangement inputs do not +identify every qualifying exception. The statewide private-award value per point +also remains unavailable; a federal allocation or average award cannot replace +the final EC funds remaining after flat awards divided by private-household points. Private dwelling points follow the adopted plan's age-five-inclusive language. Disability counts for adults. Burden uses electric expenses even for gas aid, 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..0cc7b8a0be7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_amount.yaml @@ -0,0 +1,57 @@ +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#page=1 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..6788e794988 --- /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#page=1 diff --git a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml deleted file mode 100644 index cca3bd3b621..00000000000 --- a/policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/smi_rate.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: Hawaii limits household income to this share of state median income when greater than the poverty-guideline limit under the Low Income Home Energy Assistance Program. -values: - 2025-10-01: 0.6 -metadata: - unit: /1 - period: year - label: Hawaii LIHEAP SMI income limit rate - reference: - - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule - href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8,9 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 5f53e93aa56..a6147c9fcd0 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -852,7 +852,7 @@ programs: full_name: Hawaii Low Income Home Energy Assistance Program components parameter_prefix: gov.states.hi.dhs.liheap verified_years: "2026" - notes: "Five regular-heating components for household size, countable income, policy-percentage ceiling, points and subsidized schedule amounts. No final eligibility or private-dwelling award: FY2026 statewide value per point is unverified, and categorical-household and eligibility-comparison details remain unresolved. Annual inputs and SPM units approximate application circumstances. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment remain outside scope." + notes: "Five regular-heating components for household size, countable income, operational income ceiling, points and subsidized schedule amounts. Income limits preserve the published first-ten household amounts and use shared lagged FPG above ten, validated through size twenty. No final eligibility or private-dwelling award: FY2026 statewide value per point and exceptional SSI independent-living certification remain unresolved. Annual inputs and SPM units approximate application circumstances. Earlier backfills and the FPG extension above size twenty are unverified estimates. Crisis, cooling, weatherization and equipment remain outside scope." # --- SSA programs --- - id: ssi 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 index 3b1d0afd6c9..d55212f32a5 100644 --- 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 @@ -1,21 +1,20 @@ -# Accepted plan uses 60% SMI and 150% Hawaii FPG for the maximum threshold. -# https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=9,50 -# FY2026 matrix verifies prior-year Hawaii FPG = 17_990 + 6_330 * (size - 1). -# https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=3 -# Federal-supported Clearinghouse verifies SMI size factors and +3% above six. -# https://liheapch.acf.gov/profiles/povertytables/FY2026/hismi.htm -# Raw four-person SMI of 134_428 is the shared-guideline contract value. Direct -# federal raw-table retrieval failed; these SMI dollar checks do not independently -# verify that shared base. They intentionally do not adopt projected rounded rows. +# 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, percentage limits span federal size factors and the FPG crossover. +- name: Case 1, published annual limits include the irregular six-person cell and FPG transition. period: 2026 absolute_error_margin: 0.01 - # Contract SMI base 134_428 * 0.60 = 80_656.8; size multipliers are - # 0.52, 1, 1.32 and 1.44 for sizes 1, 4, 6 and 10. - # FPG overtakes SMI at size 11: (17_990 + 6_330 * 10) * 1.5 = 121_935. + # 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. - # No eligibility comparator or rounding assertion is made. input: people: person1: @@ -377,7 +376,7 @@ state_code: HI county: HONOLULU_COUNTY_HI output: - hi_liheap_income_limit: [41_941.536, 80_656.8, 106_466.976, 116_145.792, 121_935, 207_390] + 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 @@ -440,4 +439,1196 @@ county: LOS_ANGELES_COUNTY_CA output: hi_liheap_household_size: [1, 0, 0] - hi_liheap_income_limit: [41_941.536, 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/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 index 2e30e966b73..e9983e0f31a 100644 --- 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 @@ -1,5 +1,4 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.hhs.hhs_smi import smi from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg @@ -11,16 +10,14 @@ class hi_liheap_income_limit(Variable): unit = USD defined_for = StateCode.HI reference = ( - "https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8,9", - "https://liheapch.acf.gov/docs/2026/benefits-matricies/HI_BenefitMatrix_2026.pdf#page=3", + "https://www.hcapweb.org/wp-content/uploads/2026/04/H-HEAP-2026-Income-Eligibility.pdf#page=1", ) def formula(spm_unit, period, parameters): size = spm_unit("hi_liheap_household_size", period) - state = spm_unit.household("state_code_str", period) group = spm_unit.household("state_group_str", period) p = parameters(period).gov.states.hi.dhs.liheap - smi_limit = p.eligibility.smi_rate * smi(size, state, period, parameters) + smi_limit = p.eligibility.smi_amount.calc(size) fpg_limit = p.eligibility.fpg_rate * fpg( max_(size, 1), group, @@ -28,7 +25,11 @@ def formula(spm_unit, period, parameters): parameters, year_lag=p.fpg_year_lag, ) - # The accepted plan specifies percentages. The matrix's projected dollar - # table has inconsistent rounding and a six-person transcription error; - # use the policy rates with the requested year's federal guidelines. - return where(size > 0, max_(smi_limit, fpg_limit), 0) + # 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. + limit = where( + size <= p.eligibility.smi_max_household_size, smi_limit, fpg_limit + ) + return where(size > 0, limit, 0) From 1e527239ac489f4226cb3e3aa594d39b82b8ca1d Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 2 Nov 2026 11:53:50 -0500 Subject: [PATCH 5/8] Apply Wave 2C sweep and review fixes Co-Authored-By: Claude Opus 5.5 --- changelog.d/hi-liheap-wave2c.added.md | 2 +- .../gov/states/hi/dhs/liheap/README.md | 70 --------- .../hi/dhs/liheap/eligibility/fpg_rate.yaml | 6 +- .../hi/dhs/liheap/eligibility/smi_amount.yaml | 2 + .../dhs/liheap/eligibility/ssn_min_age.yaml | 12 ++ .../states/hi/dhs/liheap/fpg_year_lag.yaml | 4 +- .../states/hi/dhs/liheap/income/sources.yaml | 15 +- .../liheap/payment/points/household_size.yaml | 2 +- .../points/vulnerability/adult_min_age.yaml | 2 +- .../points/vulnerability/child_max_age.yaml | 2 +- .../points/vulnerability/elderly_min_age.yaml | 2 +- .../dhs/liheap/payment/subsidized_amount.yaml | 6 +- policyengine_us/programs.yaml | 11 +- .../liheap/hi_liheap_countable_income.yaml | 64 +++++++- .../hi/dhs/liheap/hi_liheap_eligible.yaml | 108 ++++++++++++++ .../dhs/liheap/hi_liheap_household_size.yaml | 30 ++++ .../hi/dhs/liheap/hi_liheap_points.yaml | 137 +++++++++++++++++- .../liheap/hi_liheap_subsidized_amount.yaml | 51 +++++-- .../dhs/liheap/hi_liheap_countable_income.py | 4 +- .../hi/dhs/liheap/hi_liheap_eligible.py | 48 ++++++ .../hi/dhs/liheap/hi_liheap_household_size.py | 10 +- .../hi/dhs/liheap/hi_liheap_income_limit.py | 7 +- .../states/hi/dhs/liheap/hi_liheap_points.py | 24 ++- .../dhs/liheap/hi_liheap_qualified_member.py | 23 +++ .../dhs/liheap/hi_liheap_subsidized_amount.py | 17 ++- 25 files changed, 523 insertions(+), 136 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md create mode 100644 policyengine_us/parameters/gov/states/hi/dhs/liheap/eligibility/ssn_min_age.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_eligible.yaml create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py create mode 100644 policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_qualified_member.py diff --git a/changelog.d/hi-liheap-wave2c.added.md b/changelog.d/hi-liheap-wave2c.added.md index 38b1f6bab64..842fb6e80c3 100644 --- a/changelog.d/hi-liheap-wave2c.added.md +++ b/changelog.d/hi-liheap-wave2c.added.md @@ -1 +1 @@ -Add Hawaii LIHEAP regular-heating income, household and benefit-schedule components with receipt-based income and age-five vulnerability; final awards remain incomplete pending the statewide value per point and eligibility details. +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/README.md b/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md deleted file mode 100644 index cf6bf701d94..00000000000 --- a/policyengine_us/parameters/gov/states/hi/dhs/liheap/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Hawaii regular heating components - -These FY2026 components implement qualified household size, annualized countable -income, the operational income ceiling, private-dwelling points and the -published subsidized-dwelling amount schedule. They do not determine final -eligibility or a dollar award. The statewide value per point is not published in -the acquired sources: $140 is explicitly an example. No hypothetical value is -encoded. Full regular heating assistance remains incomplete. - -Gas EC is heating; electricity EC is cooling and outside this task. Household -SPM membership approximates the unit sharing utilities. All members' income, -including minor earnings and income of nonqualified members, counts, but only -qualified members count toward the size schedule. COFA status needs an explicit -qualified-member boolean because the shared immigration enum lacks that status. -Historical household rules are corroborated by the current application. - -Annual income and electric expenses approximate the prior-month assessment. -Existing net business inputs need no second deduction. Pension, Social Security -and retirement-distribution aggregates are counted once, with separate private -survivor receipts. Monthly SSI is annualized; take-up-gated TANF enters once per household. -Received sources are floored separately for each person, so a source or another -member's loss cannot cancel positive receipts. Military retirement pay is separate -from the pension and retirement-account aggregates and is counted once. UI uses -reported compensation or the shared modeled-state fallback. Social Security is -gross, including Medicare premiums, as selected in the accepted plan. Cash gifts from friends or relatives enter through financial_assistance, and -lottery/gambling winnings enter through gambling_winnings. Mortgage principal -receipts, jury compensation, settlements, foster/adoption payments and community -service stipends lack separately identified inputs. Wage-embedded work-study, -VA education payments and earmarked insurance reimbursements cannot be reliably -separated. Those are missing facts, not policy exclusions; life insurance -receipts are included as represented lump-sum insurance proceeds. - -The April 2026 HCAP operational intake chart and MEO provider schedule corroborate -the published annual income limits, including the six-person amount of $106,454. -The first ten amounts cannot all be reproduced by a consistent SMI rounding rule, -so the model preserves those dollars. It does not replace the six-person cell -with an inferred correction. Sizes 11-20 exactly reproduce 150% of the requested -year's prior-calendar-year Hawaii FPG and use that shared calculation. Continuing -the FPG rule above size 20 is an inference, not a separately verified table row. -No monthly cent-rounding rule is inferred from these annual amounts. Earlier -years backfill the published first-ten schedule and remain unverified estimates. - -The accepted plan and current application support at least one categorical -recipient, rather than every mandatory household member receiving assistance. -The specific calculation instruction supports an inclusive income comparison. -Final eligibility still requires resolving the SSI independent-living -certification: the existing federal and Hawaii living-arrangement inputs do not -identify every qualifying exception. The statewide private-award value per point -also remains unavailable; a federal allocation or average award cannot replace -the final EC funds remaining after flat awards divided by private-household points. - -Private dwelling points include children through age five, ending at the sixth -birthday, as stated in the adopted plan. -Disability counts for adults. Burden uses electric expenses even for gas aid, -consistent with the historical manual and current application. Positive expense -at zero income is treated as high burden, but zero expense does not earn that -point. County maps Oahu to Honolulu. Explicit unknown county earns zero regional -points; omitted county retains the shared model first-county fallback. -Points are before eligibility and housing dispatch, and are not a benefit. -The flat schedule likewise does not assert that its recipient meets eligibility. -Photovoltaic net consumption cannot be inferred from solar heating type. - -These components and tables are researched for FY2026; the incomplete state has -no fully verified policy year. Earlier backfilled results -are unverified historical estimates. FY2027 sources are proposed, not adopted. -Crisis, cooling, weatherization and equipment are outside this work. - -Sources are recorded in the individual variable and parameter references and -the Wave2C source manifest, which preserves the accepted plan, published matrix, -historical manual, current application and draft documents separately. 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 index 69a4793c572..89ace3dd4dd 100644 --- 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 @@ -1,4 +1,4 @@ -description: Hawaii uses this share of federal poverty guidelines as the income-limit floor under the Low Income Home Energy Assistance Program. +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: @@ -6,5 +6,5 @@ metadata: period: year label: Hawaii LIHEAP poverty guideline income limit rate reference: - - title: "Hawaii FY2026 LIHEAP State Plan and benefit schedule #page 8-9" - href: https://liheapch.acf.gov/docs/2026/state-plans/HI_Plan_2026.pdf#page=8 + - 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 index 5a13d824f5e..2825160afe0 100644 --- 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 @@ -55,3 +55,5 @@ metadata: 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/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 index 0e2a3e497b6..9785beeb649 100644 --- 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 @@ -2,9 +2,9 @@ description: Hawaii uses federal poverty guidelines from this many calendar year values: 2025-10-01: 1 metadata: - unit: int + unit: year period: year label: Hawaii LIHEAP federal poverty guideline year lag reference: - - title: "Hawaii FY2026 LIHEAP State Plan and benefit schedule #page 1,3" + - 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 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 index 07e7efe2044..b13b896f00a 100644 --- a/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml @@ -11,7 +11,8 @@ values: - social_security - ssi - pension_income - - military_retirement_pay + - military_retirement_income + - railroad_benefits - retirement_distributions - survivor_benefits - general_assistance @@ -20,7 +21,7 @@ values: - alimony_income - child_support_received - interest_income - - dividend_income + - ordinary_dividend_income - veterans_benefits - workers_compensation - disability_benefits @@ -28,10 +29,16 @@ values: - 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. Missing receipt categories are documented -# in the accompanying README and are not treated as policy exclusions. +# No minor-earnings exclusion applies. Receipts without a separate input, such as +# mortgage principal, are not policy exclusions. Royalties are in rental_income. +# Military pay is read as part of employment_income, as hi_military_pay_exclusion +# reads it; housing and subsistence allowances have no input. metadata: unit: list period: year 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 index 78fdff892f0..8f3e9b6452b 100644 --- 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 @@ -23,5 +23,5 @@ metadata: period: year label: Hawaii LIHEAP household size points reference: - - title: "Hawaii FY2026 LIHEAP benefit matrix #page 2-3" + - 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/vulnerability/adult_min_age.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml index 8ee37f80dac..50f8861778f 100644 --- 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 @@ -2,7 +2,7 @@ description: Hawaii treats a disabled person at or above this age as an adult fo values: 2025-10-01: 18 metadata: - unit: int + unit: year period: year label: Hawaii LIHEAP disabled adult minimum age reference: 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 index 0a8b48b3fd8..d4c9f82eeb9 100644 --- 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 @@ -2,7 +2,7 @@ description: Hawaii awards a vulnerability point when a qualified household memb values: 2025-10-01: 5 metadata: - unit: int + unit: year period: year label: Hawaii LIHEAP young child maximum age reference: 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 index db99ec720be..ee7be8179f8 100644 --- 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 @@ -2,7 +2,7 @@ description: Hawaii awards a vulnerability point when a qualified household memb values: 2025-10-01: 60 metadata: - unit: int + unit: year period: year label: Hawaii LIHEAP elderly minimum age reference: 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 index 86442bddb53..3b317c6c6a5 100644 --- 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 @@ -1,4 +1,4 @@ -description: Hawaii provides these scheduled subsidized-dwelling amounts by qualified household size under the Low Income Home Energy Assistance Program. +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 @@ -21,7 +21,7 @@ metadata: threshold_unit: /1 amount_unit: currency-USD period: year - label: Hawaii LIHEAP subsidized dwelling scheduled amount + label: Hawaii LIHEAP subsidized dwelling flat benefit reference: - - title: "Hawaii FY2026 LIHEAP benefit matrix #page 2-3" + - 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 be22628e14e..34d51480bb4 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -808,7 +808,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AL, DC, Riverside County, MA, FL, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OK, OR, SD, RI, TX + coverage: AL, DC, Riverside County, MA, FL, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OK, OR, SD, RI, TX, HI state_implementations: - state: AL status: partial @@ -961,11 +961,12 @@ programs: parameter_prefix: gov.states.tx.tdhca.ceap notes: Models the 150% FPG income limit, the alternative 60% SMI limit from the FY2024 state plan (applied through 2024), benefit amounts, and categorical eligibility through TANF enrollment, SNAP eligibility, and SSI receipt. Not modeled - net rather than gross gambling winnings, the Medicare premium deduction from counted Social Security, and the exclusion of means-tested veterans' pensions from counted income (10 TAC 6.4(c)) - state: HI - status: in_progress - name: Hawaii LIHEAP components - full_name: Hawaii Low Income Home Energy Assistance Program components + 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: "Five regular-heating components for household size, countable income, operational income ceiling, points and subsidized schedule amounts. Income limits preserve the published first-ten household amounts and use shared lagged FPG above ten, validated through size twenty. No final eligibility or private-dwelling award: FY2026 statewide value per point and exceptional SSI independent-living certification remain unresolved. Annual inputs and SPM units approximate application circumstances. Earlier backfills and the FPG extension above size twenty are unverified estimates. Crisis, cooling, weatherization and equipment remain outside scope." + 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. # --- SSA programs --- - id: ssi 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 index dafbadd9874..c1e37b45ade 100644 --- 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 @@ -281,9 +281,8 @@ - name: Case 8, negative net earnings are floored and other states stay zero. period: 2026 absolute_error_margin: 0.01 - # Component convention floors negative annual resources at zero; the income - # point schedule starts at zero. The same positive income in California is zero - # in the Hawaii component. + # Negative annual resources floor at zero. The same positive income in California + # is zero in the Hawaii component. input: people: person1: @@ -336,9 +335,11 @@ output: hi_liheap_countable_income: [0, 1_500, 0] -# Gross receipts: military60_000 and wages30_000 each exceed150% of one-person FPG26_985; size+Oahu=2 points. UI18_000 yields income1+size1+region1=3. TANF controls test receipt gating separately from entitlement. +# 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: 2_026 + period: 2026 absolute_error_margin: 0.01 input: people: @@ -387,7 +388,7 @@ - 2 - 2 - name: Case 10, reported UI overrides modeled receipt and negative UI does not offset wages. - period: 2_026 + period: 2026 absolute_error_margin: 0.01 input: people: @@ -464,7 +465,7 @@ - 4 - 4 - name: Case 11, TANF enters once only when the household takes it up. - period: 2_026 + period: 2026 absolute_error_margin: 0.01 input: people: @@ -525,3 +526,52 @@ 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..5e6719b7da6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_eligible.yaml @@ -0,0 +1,108 @@ +# Plan 1.4 and 2.1-2.3 (pages 5, 9); matrix (pages 1, 3); draft manual 2.1, 2.8, 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=58 +# 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 + is_citizen_or_legal_immigrant: false + receives_ssi: + 2026-01: true + person3: + age: 70 + ssi: 0 + is_citizen_or_legal_immigrant: false + 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 + # A gas bill and gas in rent qualify; a known fuel with no bill does not. Electricity is + # the cooling credit, bottled gas shows no utility account, and UNSPECIFIED pays nothing. + input: + state_code: [HI, HI, HI, HI, HI, HI, HI] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, ELECTRICITY, PROPANE, UNSPECIFIED, NONE] + gas_expense: [900, 0, 0, 0, 0, 900, 900] + pre_subsidy_electricity_expense: [0, 0, 0, 900, 0, 0, 0] + bottled_gas_expense: [0, 0, 0, 0, 900, 0, 0] + heat_expense_included_in_rent: [false, false, true, false, false, false, false] + ssi: [0, 0, 0, 0, 0, 0, 0] + snap: [0, 0, 0, 0, 0, 0, 0] + tanf: [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] + output: + hi_liheap_eligible: [true, false, true, false, false, false, false] 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 index fe268bb3994..66b05e14c76 100644 --- 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 @@ -93,3 +93,33 @@ 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_points.yaml b/policyengine_us/tests/policy/baseline/gov/states/hi/dhs/liheap/hi_liheap_points.yaml index 3882b6ddf31..614919e9a1a 100644 --- 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 @@ -588,6 +588,7 @@ 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: @@ -610,6 +611,11 @@ 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] @@ -635,6 +641,12 @@ 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] @@ -652,8 +664,12 @@ 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] + hi_liheap_points: [4, 5, 5, 4, 5] - name: Case 8, zero income distinguishes positive electric expense from zero. period: 2026 @@ -877,9 +893,10 @@ hi_liheap_countable_income: 12_000 hi_liheap_points: 5 -# Plan physical10: agefiveandunder includes5.5. Income20_000 / two-person FPG24_320 gives2; size1+Oahu1+child1=5, dropping to4 at6. Electric1_200 is below30%burden. +# 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: 2_026 + period: 2026 input: people: person1: @@ -936,3 +953,117 @@ 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 index 1e76a9a592e..856ca12b3c3 100644 --- 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 @@ -1,8 +1,8 @@ # 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 -# Tests assert the size schedule BEFORE eligibility, never an approved award. +# Private dwellings stay at zero here because this output covers subsidized dwellings only. -- name: Case 1, flat schedule covers every size boundary and the open final band. +- 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 @@ -182,11 +182,11 @@ output: hi_liheap_subsidized_amount: [375, 375, 425, 425, 475, 475] -- name: Case 2, flat schedule uses qualified size without an additional household share. +- 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 schedule. + # proration. Zero qualified size and California produce no Hawaii benefit. input: people: person1: @@ -256,12 +256,11 @@ hi_liheap_household_size: [1, 0, 0] hi_liheap_subsidized_amount: [375, 0, 0] -- name: Case 3, schedule remains separate from income housing and expense eligibility. +- name: Case 3, eligibility and subsidized housing are both required. period: 2026 absolute_error_margin: 0.01 - # This component exposes the one-person schedule before eligibility: 375. - # A rent-included utility share below 375 does not alter that schedule. - # High income and private housing do not turn a schedule into an award. + # 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: @@ -314,4 +313,38 @@ state_code: HI county: HONOLULU_COUNTY_HI output: - hi_liheap_subsidized_amount: [375, 375, 375] + 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 index b933b817545..92c821a7c4e 100644 --- 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 @@ -18,5 +18,7 @@ def formula(spm_unit, period, parameters): # Annual flows approximate prior-month receipts. Minor and nonqualified # members' income counts; source losses cannot offset other receipts. person = spm_unit.members - income = sum(max_(add(person, period, [source]), 0) for source in p.sources) + income = 0 + for source in p.sources: + income = income + max_(add(person, period, [source]), 0) return spm_unit.sum(income) + max_(spm_unit("tanf", period), 0) 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..fa0dbc5152e --- /dev/null +++ b/policyengine_us/variables/gov/states/hi/dhs/liheap/hi_liheap_eligible.py @@ -0,0 +1,48 @@ +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 2.1, 2.8, 4.2 and 5.5. PDF pages 58, 60, 65, 67 + "https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=58", + ) + + 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. Bottled gas + # does not show the active utility account that draft 2.1 requires. + fuel = spm_unit("heating_type", period) + gas = fuel == fuel.possible_values.NATURAL_GAS + # 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 = spm_unit("has_heating_expense", period) | spm_unit( + "heat_expense_included_in_rent", period + ) + return (size > 0) & (income_eligible | categorical) & gas & 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 index cd056cab4fe..c0539676ce1 100644 --- 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 @@ -10,10 +10,6 @@ class hi_liheap_household_size(Variable): reference = ( "https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=6", ) - - def formula(spm_unit, period, parameters): - # The SPM unit approximates the utility-sharing household. All members' - # income remains countable, including members excluded from this size. - # COFA citizens can be represented by an explicit qualified-status flag; - # the shared immigration enum does not yet distinguish COFA status. - return spm_unit.sum(spm_unit.members("is_citizen_or_legal_immigrant", period)) + # 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 index 905f806042c..da4d8ce0c0e 100644 --- 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 @@ -19,7 +19,7 @@ def formula(spm_unit, period, parameters): p = parameters(period).gov.states.hi.dhs.liheap smi_limit = p.eligibility.smi_amount.calc(size) fpg_limit = p.eligibility.fpg_rate * fpg( - max_(size, 1), + size, group, period, parameters, @@ -29,7 +29,4 @@ def formula(spm_unit, period, parameters): # 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. - limit = where( - size <= p.eligibility.smi_max_household_size, smi_limit, fpg_limit - ) - return where(size > 0, limit, 0) + 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 index 47d572e2962..e7aebf8e289 100644 --- 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 @@ -12,7 +12,8 @@ class hi_liheap_points(Variable): "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", - "https://humanservices.hawaii.gov/wp-content/uploads/2019/07/Policies-and-Procedures-2020.pdf#page=8", + # 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): @@ -49,24 +50,35 @@ def formula(spm_unit, period, parameters): region_points = where(oahu, region.oahu, where(neighbor, region.neighbor, 0)) person = spm_unit.members age = person("age", period) - qualified = person("is_citizen_or_legal_immigrant", 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. + 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) - | (person("is_disabled", period) & (age >= ages.adult_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. + # 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 >= income * p.payment.points.burden_rate + 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, not a dollar award or eligibility decision. + # 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 index 15c402d2464..14bca994c5d 100644 --- 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 @@ -4,10 +4,10 @@ class hi_liheap_subsidized_amount(Variable): value_type = float entity = SPMUnit - label = "Hawaii LIHEAP subsidized dwelling scheduled amount before eligibility" + label = "Hawaii LIHEAP flat heating benefit for subsidized dwellings" definition_period = YEAR unit = USD - defined_for = StateCode.HI + 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", @@ -16,7 +16,12 @@ class hi_liheap_subsidized_amount(Variable): def formula(spm_unit, period, parameters): size = spm_unit("hi_liheap_household_size", period) p = parameters(period).gov.states.hi.dhs.liheap.payment - # This exposes the supported size schedule, not an eligibility award. - # The same schedule applies to net-consuming photovoltaic households, - # whose production/use distinction is not a current model input. - return p.subsidized_amount.calc(size) + 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) From 240886dfb2e65bfeb7661032ac792212078a69c7 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 2 Nov 2026 14:32:48 -0500 Subject: [PATCH 6/8] Fix the Hawaii reported SSI eligibility test inputs Set immigration_status on the nonqualified members. Setting is_citizen_or_legal_immigrant on only two of three members gave the third the bool default, false, and skipped the citizen formula. Co-Authored-By: Claude Opus 5.5 --- .../baseline/gov/states/hi/dhs/liheap/hi_liheap_eligible.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 5e6719b7da6..da00dff4236 100644 --- 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 @@ -46,13 +46,13 @@ person2: age: 70 ssi: 0 - is_citizen_or_legal_immigrant: false + immigration_status: UNDOCUMENTED receives_ssi: 2026-01: true person3: age: 70 ssi: 0 - is_citizen_or_legal_immigrant: false + immigration_status: UNDOCUMENTED spm_units: spm_unit1: members: [person1] From 4dd58a670b79aaa8564594cec17d0bc04aac79a0 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 3 Nov 2026 16:44:03 -0500 Subject: [PATCH 7/8] Apply review fixes to Hawaii LIHEAP Test the gas bill rather than the home's primary heating fuel, since Hawaii credits the utility the household asks for; UNSPECIFIED stays ineligible. Count military basic pay, remove two floors that cannot bind, fix references, and record the source choices as three candidates. Move the registry entry next to GA. Co-Authored-By: Claude Opus 5.5 --- .../states/hi/dhs/liheap/fpg_year_lag.yaml | 2 + .../states/hi/dhs/liheap/income/sources.yaml | 6 +- .../liheap/payment/points/burden_rate.yaml | 2 +- .../points/vulnerability/adult_min_age.yaml | 3 +- policyengine_us/programs.yaml | 14 +-- .../liheap/hi_liheap_countable_income.yaml | 7 +- .../hi/dhs/liheap/hi_liheap_eligible.yaml | 27 ++--- .../dhs/liheap/hi_liheap_countable_income.py | 2 +- .../hi/dhs/liheap/hi_liheap_eligible.py | 23 ++-- .../states/hi/dhs/liheap/hi_liheap_points.py | 5 +- source_conflicts/candidates.yaml | 102 ++++++++++++++++++ 11 files changed, 155 insertions(+), 38 deletions(-) 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 index 9785beeb649..96d0c667e33 100644 --- 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 @@ -8,3 +8,5 @@ metadata: 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 index b13b896f00a..d7d463c40cb 100644 --- a/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/hi/dhs/liheap/income/sources.yaml @@ -2,6 +2,9 @@ description: Hawaii counts these represented income sources under the Low Income 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 @@ -37,8 +40,7 @@ values: # 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 pay is read as part of employment_income, as hi_military_pay_exclusion -# reads it; housing and subsistence allowances have no input. +# Military housing and subsistence allowances have no input. metadata: unit: list period: year 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 index 7ba02372c6a..6190ef6a596 100644 --- 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 @@ -6,5 +6,5 @@ metadata: period: year label: Hawaii LIHEAP energy burden point threshold reference: - - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule + - 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/vulnerability/adult_min_age.yaml b/policyengine_us/parameters/gov/states/hi/dhs/liheap/payment/points/vulnerability/adult_min_age.yaml index 50f8861778f..dcfcbad86c4 100644 --- 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 @@ -1,4 +1,5 @@ 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: @@ -6,5 +7,5 @@ metadata: period: year label: Hawaii LIHEAP disabled adult minimum age reference: - - title: Hawaii FY2026 LIHEAP State Plan and benefit schedule + - 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/programs.yaml b/policyengine_us/programs.yaml index 64a3eb8c023..da49e1d3f49 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1028,6 +1028,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 @@ -1314,13 +1321,6 @@ programs: parameter_prefix: gov.states.wy.dfs.lieap verified_years: "2026" notes: FY2026 regular heating from the published fuel cost standards. 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. # --- SSA programs --- - id: ssi 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 index c1e37b45ade..9ef88ff12f1 100644 --- 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 @@ -47,8 +47,8 @@ - name: Case 2, net business receipts and wages enter once. period: 2026 absolute_error_margin: 0.01 - # Wages plus separate net business receipts = 12_000 + 2_000 + 300 - # + 700 + 1_000 = 16_000; no second business-expense deduction. + # 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: @@ -56,6 +56,7 @@ 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 @@ -73,7 +74,7 @@ state_code: HI county: HONOLULU_COUNTY_HI output: - hi_liheap_countable_income: 16_000 + hi_liheap_countable_income: 16_500 - name: Case 3, pensions survivor benefits and rent remain disjoint. period: 2026 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 index da00dff4236..568c541e905 100644 --- 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 @@ -91,18 +91,19 @@ - name: Case 4, heating assistance needs gas paid by bill or through rent. period: 2026 - # A gas bill and gas in rent qualify; a known fuel with no bill does not. Electricity is - # the cooling credit, bottled gas shows no utility account, and UNSPECIFIED pays nothing. + # Any home's gas bill and gas in rent qualify, whatever heats the home (rows 1, 3, 7, 8). + # 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] - heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, ELECTRICITY, PROPANE, UNSPECIFIED, NONE] - gas_expense: [900, 0, 0, 0, 0, 900, 900] - pre_subsidy_electricity_expense: [0, 0, 0, 900, 0, 0, 0] - bottled_gas_expense: [0, 0, 0, 0, 900, 0, 0] - heat_expense_included_in_rent: [false, false, true, false, false, false, false] - ssi: [0, 0, 0, 0, 0, 0, 0] - snap: [0, 0, 0, 0, 0, 0, 0] - tanf: [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] + state_code: [HI, HI, HI, HI, HI, HI, HI, HI, HI] + heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, ELECTRICITY, PROPANE, UNSPECIFIED, NONE, ELECTRICITY, ELECTRICITY] + gas_expense: [900, 0, 0, 0, 0, 900, 900, 900, 0] + pre_subsidy_electricity_expense: [0, 0, 0, 900, 0, 0, 0, 0, 0] + bottled_gas_expense: [0, 0, 0, 0, 900, 0, 0, 0, 0] + heat_expense_included_in_rent: [false, false, true, false, false, false, false, false, true] + ssi: [0, 0, 0, 0, 0, 0, 0, 0, 0] + snap: [0, 0, 0, 0, 0, 0, 0, 0, 0] + tanf: [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] output: - hi_liheap_eligible: [true, false, true, false, false, false, false] + hi_liheap_eligible: [true, false, true, false, false, false, true, true, false] 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 index 92c821a7c4e..cd4410e8de2 100644 --- 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 @@ -21,4 +21,4 @@ def formula(spm_unit, period, parameters): income = 0 for source in p.sources: income = income + max_(add(person, period, [source]), 0) - return spm_unit.sum(income) + max_(spm_unit("tanf", period), 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 index fa0dbc5152e..ba994713db0 100644 --- 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 @@ -12,8 +12,9 @@ class hi_liheap_eligible(Variable): "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 2.1, 2.8, 4.2 and 5.5. PDF pages 58, 60, 65, 67 - "https://humanservices.hawaii.gov/wp-content/uploads/2025/07/Model-Plan-Packet-2026.pdf#page=58", + # 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): @@ -36,13 +37,19 @@ def formula(spm_unit, period, parameters): categorical = receives_ssi | ( add(spm_unit, period, ["snap", "tanf", "general_assistance"]) > 0 ) - # Both manuals pay gas as heating and electricity as cooling. Bottled gas - # does not show the active utility account that draft 2.1 requires. + # 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. 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) - gas = fuel == fuel.possible_values.NATURAL_GAS + 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 = spm_unit("has_heating_expense", period) | spm_unit( - "heat_expense_included_in_rent", period + responsible = where( + heat_in_rent, + fuel == types.NATURAL_GAS, + gas_bill & (fuel != types.UNSPECIFIED), ) - return (size > 0) & (income_eligible | categorical) & gas & responsible + return (size > 0) & (income_eligible | categorical) & responsible 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 index e7aebf8e289..ccf15e3e147 100644 --- 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 @@ -22,7 +22,7 @@ def formula(spm_unit, period, parameters): income = spm_unit("hi_liheap_countable_income", period) group = spm_unit.household("state_group_str", period) poverty = fpg( - max_(size, 1), + size, group, period, parameters, @@ -53,7 +53,8 @@ def formula(spm_unit, period, parameters): 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. + # 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) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 1cea80fc061..298162dbed7 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2372,6 +2372,108 @@ 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-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: From 26eba54dd1b410e8b7456a3858bdc7ad4da98d1e Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 5 Nov 2026 11:42:26 -0500 Subject: [PATCH 8/8] Credit a separate Hawaii gas bill when heat is in the rent Heat in the rent no longer overrides a household's own gas bill. Records the bottled gas reading as us-hi:liheap-bottled-gas-accounts. Co-Authored-By: Claude Opus 5.5 --- .../hi/dhs/liheap/hi_liheap_eligible.yaml | 27 ++++++------- .../hi/dhs/liheap/hi_liheap_eligible.py | 11 +++--- source_conflicts/candidates.yaml | 38 +++++++++++++++++++ 3 files changed, 57 insertions(+), 19 deletions(-) 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 index 568c541e905..ff25fd1564b 100644 --- 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 @@ -1,7 +1,7 @@ -# Plan 1.4 and 2.1-2.3 (pages 5, 9); matrix (pages 1, 3); draft manual 2.1, 2.8, 4.2, 5.5. +# 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=58 +# 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. @@ -92,18 +92,19 @@ - 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] - heating_type: [NATURAL_GAS, NATURAL_GAS, NATURAL_GAS, ELECTRICITY, PROPANE, UNSPECIFIED, NONE, ELECTRICITY, ELECTRICITY] - gas_expense: [900, 0, 0, 0, 0, 900, 900, 900, 0] - pre_subsidy_electricity_expense: [0, 0, 0, 900, 0, 0, 0, 0, 0] - bottled_gas_expense: [0, 0, 0, 0, 900, 0, 0, 0, 0] - heat_expense_included_in_rent: [false, false, true, false, false, false, false, false, true] - ssi: [0, 0, 0, 0, 0, 0, 0, 0, 0] - snap: [0, 0, 0, 0, 0, 0, 0, 0, 0] - tanf: [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] + 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] + hi_liheap_eligible: [true, false, true, false, false, false, true, true, false, true] 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 index ba994713db0..e5292c13fac 100644 --- 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 @@ -39,17 +39,16 @@ def formula(spm_unit, period, parameters): ) # 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. Bottled gas does not show the active - # utility account that draft 2.1 requires. Callers must send heating_type. + # 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 = where( - heat_in_rent, - fuel == types.NATURAL_GAS, - gas_bill & (fuel != types.UNSPECIFIED), + responsible = (gas_bill & (fuel != types.UNSPECIFIED)) | ( + heat_in_rent & (fuel == types.NATURAL_GAS) ) return (size > 0) & (income_eligible | categorical) & responsible diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 121497db666..9f083c7be8d 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2512,6 +2512,44 @@ 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: