diff --git a/changelog.d/wa-liheap-wave2b.added.md b/changelog.d/wa-liheap-wave2b.added.md new file mode 100644 index 00000000000..972abe66037 --- /dev/null +++ b/changelog.d/wa-liheap-wave2b.added.md @@ -0,0 +1 @@ +Add Washington LIHEAP (wa_liheap): FY2026 regular heating benefit from the Commerce benefit calculation worksheet with the 150% federal poverty guideline income test. diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/fpg_rate.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/fpg_rate.yaml new file mode 100644 index 00000000000..f5285ff5fc8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/fpg_rate.yaml @@ -0,0 +1,11 @@ +description: Washington limits household income to this share of the federal poverty guideline under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1.5 + +metadata: + unit: /1 + period: year + label: Washington LIHEAP poverty guideline rate + reference: + - title: "FY2026 State Plan, section 2.1" + href: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=8 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/fpg_year_lag.yaml new file mode 100644 index 00000000000..5e47191f654 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/fpg_year_lag.yaml @@ -0,0 +1,15 @@ +description: Washington uses the federal poverty guideline from this many years before the modeled fiscal year under the Low Income Home Energy Assistance Program. +# FY2026 uses 2025 FPG; FY2027's threshold sheet uses 2026 FPG. +# Compare exact annual amounts; provider monthly displays differ in rounding. +values: + 2025-10-01: 1 + +metadata: + unit: year + period: year + label: Washington LIHEAP poverty guideline year lag + reference: + - title: "Byrd Barr FY2025-26 application, income table" + href: https://drive.google.com/file/d/18fvR5CL8UKpTj4Vsm7KlkitKUJclAvkR/view#page=1 + - title: "PY27 LIHEAP eligibility guidelines" + href: https://deptofcommerce.app.box.com/s/3fp0xz4y2x2p4hedw9ww4sk7ma36srlx diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/business_sources.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/business_sources.yaml new file mode 100644 index 00000000000..7485520a74d --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/business_sources.yaml @@ -0,0 +1,20 @@ +description: Washington uses these nonnegative net business income sources under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - partnership_s_corp_income + +# Existing net inputs approximate allowable expenses and cannot reproduce +# monthly loss floors or business-specific expense disallowances. Do not apply +# the alternative 50% standard expense deduction to already-net income. +metadata: + unit: list + period: year + label: Washington LIHEAP business sources + reference: + - title: "Byrd Barr FY2025-26 application, self-employment instructions #page 2,13" + href: https://drive.google.com/file/d/18fvR5CL8UKpTj4Vsm7KlkitKUJclAvkR/view#page=2 + - title: "KCR currently linked LIHEAP self-employment worksheet" + href: https://www.kcr.org/wp-content/uploads/2018/08/Self-Employment-Form.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/earned_income_min_age.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/earned_income_min_age.yaml new file mode 100644 index 00000000000..5d33b48dcc4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/earned_income_min_age.yaml @@ -0,0 +1,11 @@ +description: Washington counts earnings from people at or above this age under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 18 + +metadata: + unit: year + period: year + label: Washington LIHEAP minimum age for countable earnings + reference: + - title: "FY2026 State Plan, section 1.9" + href: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=6 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_deduction_rate.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_deduction_rate.yaml new file mode 100644 index 00000000000..9acf7a5a47b --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_deduction_rate.yaml @@ -0,0 +1,15 @@ +description: Washington deducts this share of retirement income under the Low Income Home Energy Assistance Program. +# Apply to the sources in retirement_sources.yaml only: pension income, +# retirement-account distributions and military retirement income. +# The full SSA/SSI subtype mapping is unverified; no deduction is imputed +# for those sources. This can overstate countable income. +values: + 2025-10-01: 0.1 + +metadata: + unit: /1 + period: year + label: Washington LIHEAP retirement deduction rate + reference: + - title: "Commerce 2026 Weatherization Manual, Policy 1.1.2 incorporates LIHEAP income rules #page 14-15" + href: https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=14 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_sources.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_sources.yaml new file mode 100644 index 00000000000..4383bb1f701 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_sources.yaml @@ -0,0 +1,20 @@ +description: Washington applies its modeled retirement deduction to these income sources under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - pension_income + - retirement_distributions + - military_retirement_income + +# Pension income already includes its pension and annuity components. +# Military retirement income includes military survivor annuities. +# Social Security, SSI, railroad and other survivor benefit subtype deductions +# are unverified and are not assumed. Broad distributions lack lump-sum detail. +metadata: + unit: list + period: year + label: Washington LIHEAP retirement sources + reference: + - title: "FY2026 State Plan, section 1.9" + href: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=6 + - title: "Commerce 2026 Weatherization Manual, Policy 1.1.2 #page 14-15" + href: https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=14 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unearned_sources.yaml new file mode 100644 index 00000000000..7ade9a42611 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unearned_sources.yaml @@ -0,0 +1,42 @@ +description: Washington counts these unearned income sources without an additional deduction under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: + - ssi + - general_assistance + - strike_benefits + - financial_assistance + - rental_income + - farm_rent_income + - alimony_income + - child_support_received + - interest_income + - ordinary_dividend_income + - railroad_benefits + - survivor_benefits + - workers_compensation + +# Income of minors is counted except earnings. TANF, State Family Assistance, +# Refugee Cash Assistance and the state supplement to SSI (wa_ssp) are added +# separately in the formula; general assistance represents other aid, such as +# ABD, not those same payments again. +# Workers' compensation counts with no deduction: plan section 1.9 has no +# workers' compensation row, and Commerce Weatherization Manual Exhibit +# 1.3.1A lists an L&I statement as income documentation. +# FY2026 excludes VA benefits, insurance payments (disability_benefits and +# life_insurance_benefits), one-time lump sums, refunds and balances. Broad +# annual inputs cannot identify every exempt subtype. +# Social Security is counted separately in the formula, net of the Medicare +# Part B premium, and receives no retirement deduction. +# Repayable loans, structured settlements, foster payments, jury pay and +# royalties lack dedicated inputs. Work-study wages may be included in +# employment income; do not add a duplicate amount or invent new inputs. +# The FY2027 draft changes categories and is not adopted for this snapshot. +metadata: + unit: list + period: year + label: Washington LIHEAP unearned sources + reference: + - title: "FY2026 State Plan, section 1.9 #page 5-7" + href: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=5 + - title: Commerce 2026 Weatherization Manual, Exhibit 1.3.1A + href: https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=445 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unemployment_deduction_rate.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unemployment_deduction_rate.yaml new file mode 100644 index 00000000000..41294556ebd --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unemployment_deduction_rate.yaml @@ -0,0 +1,11 @@ +description: Washington deducts this share of unemployment benefits under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 0.1 + +metadata: + unit: /1 + period: year + label: Washington LIHEAP unemployment deduction rate + reference: + - title: "Commerce 2026 Weatherization Manual, Policy 1.1.2 incorporates LIHEAP income rules #page 14-15" + href: https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=14 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/wage_deduction_rate.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/wage_deduction_rate.yaml new file mode 100644 index 00000000000..cea18c2d8a9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/income/wage_deduction_rate.yaml @@ -0,0 +1,14 @@ +description: Washington deducts this share of payroll earnings taxed at payout under the Low Income Home Energy Assistance Program. +# Existing employment income approximates payroll income taxed at payout. +values: + 2025-10-01: 0.2 + +metadata: + unit: /1 + period: year + label: Washington LIHEAP payroll wage deduction rate + reference: + - title: "Commerce 2026 Weatherization Manual, Policy 1.1.2, item 5.a(2)(a)" + href: https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=15 + - title: "Byrd Barr FY2025-26 application, income instructions" + href: https://drive.google.com/file/d/18fvR5CL8UKpTj4Vsm7KlkitKUJclAvkR/view#page=1 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/household_adjuster.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/household_adjuster.yaml new file mode 100644 index 00000000000..87f489fc87e --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/household_adjuster.yaml @@ -0,0 +1,110 @@ +description: Washington divides monthly income by this household-size adjuster under the Low Income Home Energy Assistance Program. +# Preserve all 24 printed values. The award formula treats sizes beyond +# the last published threshold as unsupported rather than extrapolating. +brackets: + - threshold: + 2025-10-01: 1 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 2 + amount: + 2025-10-01: 1.36 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 1.71 + - threshold: + 2025-10-01: 4 + amount: + 2025-10-01: 2.07 + - threshold: + 2025-10-01: 5 + amount: + 2025-10-01: 2.43 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 2.79 + - threshold: + 2025-10-01: 7 + amount: + 2025-10-01: 3.14 + - threshold: + 2025-10-01: 8 + amount: + 2025-10-01: 3.5 + - threshold: + 2025-10-01: 9 + amount: + 2025-10-01: 3.86 + - threshold: + 2025-10-01: 10 + amount: + 2025-10-01: 4.21 + - threshold: + 2025-10-01: 11 + amount: + 2025-10-01: 4.57 + - threshold: + 2025-10-01: 12 + amount: + 2025-10-01: 4.93 + - threshold: + 2025-10-01: 13 + amount: + 2025-10-01: 5.29 + - threshold: + 2025-10-01: 14 + amount: + 2025-10-01: 5.64 + - threshold: + 2025-10-01: 15 + amount: + 2025-10-01: 6 + - threshold: + 2025-10-01: 16 + amount: + 2025-10-01: 6.36 + - threshold: + 2025-10-01: 17 + amount: + 2025-10-01: 6.71 + - threshold: + 2025-10-01: 18 + amount: + 2025-10-01: 7.07 + - threshold: + 2025-10-01: 19 + amount: + 2025-10-01: 7.43 + - threshold: + 2025-10-01: 20 + amount: + 2025-10-01: 7.79 + - threshold: + 2025-10-01: 21 + amount: + 2025-10-01: 8.14 + - threshold: + 2025-10-01: 22 + amount: + 2025-10-01: 8.5 + - threshold: + 2025-10-01: 23 + amount: + 2025-10-01: 8.86 + - threshold: + 2025-10-01: 24 + amount: + 2025-10-01: 9.21 + +metadata: + type: single_amount + threshold_unit: person + amount_unit: /1 + period: year + label: Washington LIHEAP household-size adjuster + reference: + - title: "FY2026 Benefit Matrix, household adjuster table #page 1-2" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/income_constant.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/income_constant.yaml new file mode 100644 index 00000000000..9a3cdc348a0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/income_constant.yaml @@ -0,0 +1,13 @@ +description: Washington subtracts adjusted monthly income from this constant under the Low Income Home Energy Assistance Program. +# Preserve the FY2026-labelled worksheet's constants. Its embedded poverty +# table is older; annual recalibration was not recovered. +values: + 2025-10-01: 3648.1 + +metadata: + unit: currency-USD + period: month + label: Washington LIHEAP monthly income constant + reference: + - title: "FY2026 Benefit Matrix, Actual and Surrogate Heat Cost worksheet" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/intermediate_rounding_increment.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/intermediate_rounding_increment.yaml new file mode 100644 index 00000000000..4202d80829f --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/intermediate_rounding_increment.yaml @@ -0,0 +1,14 @@ +description: Washington carries intermediate worksheet values at this modeled precision under the Low Income Home Energy Assistance Program. +# Modeling convention: round the income/adjuster and subsequent quotient +# to two decimal places, with half-up ties. The printed 0.46 and 0.84 carry +# into the $336 example; the full tie convention is not explicit in policy. +values: + 2025-10-01: 0.01 + +metadata: + unit: /1 + period: year + label: Washington LIHEAP intermediate worksheet rounding increment + reference: + - title: "FY2026 Benefit Matrix, Actual and Surrogate Heat Cost worksheet" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/maximum.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/maximum.yaml new file mode 100644 index 00000000000..600cefbe88d --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/maximum.yaml @@ -0,0 +1,11 @@ +description: Washington provides at most this regular heating benefit under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1250 + +metadata: + unit: currency-USD + period: year + label: Washington LIHEAP maximum regular benefit + reference: + - title: "FY2026 State Plan, section 2.6" + href: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=10 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/minimum.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/minimum.yaml new file mode 100644 index 00000000000..6c72983c257 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/minimum.yaml @@ -0,0 +1,15 @@ +description: Washington provides this scheduled minimum heating benefit under the Low Income Home Energy Assistance Program. +# The minimum-adjusted award is capped at actual heating cost. +# Thus positive costs below $250 may produce a smaller modeled payment. +# Heat included in rent with a known fuel and no reported cost receives this +# minimum with no cost cap. +values: + 2025-10-01: 250 + +metadata: + unit: currency-USD + period: year + label: Washington LIHEAP scheduled minimum benefit + reference: + - title: "FY2026 State Plan, section 2.6" + href: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=10 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/multiplier_constant.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/multiplier_constant.yaml new file mode 100644 index 00000000000..b00183b3bb4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/multiplier_constant.yaml @@ -0,0 +1,11 @@ +description: Washington subtracts the rounded worksheet quotient from this constant under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1.3 + +metadata: + unit: /1 + period: year + label: Washington LIHEAP heat-cost multiplier constant + reference: + - title: "FY2026 Benefit Matrix, Actual and Surrogate Heat Cost worksheet" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/quotient_numerator.yaml b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/quotient_numerator.yaml new file mode 100644 index 00000000000..37e79504ea9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/quotient_numerator.yaml @@ -0,0 +1,11 @@ +description: Washington divides this amount by the worksheet denominator under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1460.8 + +metadata: + unit: currency-USD + period: month + label: Washington LIHEAP worksheet quotient numerator + reference: + - title: "FY2026 Benefit Matrix, Actual and Surrogate Heat Cost worksheet" + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index b2861e63652..681d557eb61 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -987,7 +987,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AR, AL, AZ, DC, GA, Riverside County, MA, FL, IL, IA, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OK, OR, SD, RI, TX, VA + coverage: AR, AL, AZ, DC, GA, Riverside County, MA, FL, IL, IA, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OK, OR, SD, RI, TX, VA, WA state_implementations: - state: AL status: partial @@ -1178,6 +1178,14 @@ programs: parameter_prefix: gov.states.va.dss.eap verified_years: "2026" notes: FFY2026 Fuel Assistance only, using the latest published (FFY2025) value per point and placeholder fuel-type and energy-burden points until VDSS publishes its survey. Crisis, cooling and weatherization assistance are out of scope. + - state: WA + status: partial + name: Washington LIHEAP + full_name: Washington Low Income Home Energy Assistance Program + variable: wa_liheap + parameter_prefix: gov.states.wa.commerce.liheap + verified_years: "2026" + notes: FY2026 regular heating from reported annual heating costs, with the $250 minimum when heat is included in rent. Crisis, cooling, weatherization and equipment assistance are out of scope. # --- SSA programs --- - id: ssi diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap.yaml new file mode 100644 index 00000000000..8f0ad2f091c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap.yaml @@ -0,0 +1,1026 @@ +# FY2026 worksheet example and independently calculated cases under the +# modeled intermediate-rounding and final actual-cost-cap conventions. +- name: Case 1, Published worksheet example pays 336 after intermediate rounding. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 2, Zero countable income pays ninety percent before the benefit bounds. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 360 +- name: Case 3, Printed household adjuster for size 1 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 4, Printed household adjuster for size 2 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 2 + wa_liheap_countable_income: 8160 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 5, Printed household adjuster for size 3 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 3 + wa_liheap_countable_income: 10260 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 6, Printed household adjuster for size 4 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 4 + wa_liheap_countable_income: 12420 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 7, Printed household adjuster for size 5 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 5 + wa_liheap_countable_income: 14580 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 8, Printed household adjuster for size 6 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 6 + wa_liheap_countable_income: 16740 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 9, Printed household adjuster for size 7 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 7 + wa_liheap_countable_income: 18840 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 10, Printed household adjuster for size 8 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 8 + wa_liheap_countable_income: 21000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 11, Printed household adjuster for size 9 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 9 + wa_liheap_countable_income: 23160 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 12, Printed household adjuster for size 10 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 10 + wa_liheap_countable_income: 25260 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 13, Printed household adjuster for size 11 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 11 + wa_liheap_countable_income: 27420 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 14, Printed household adjuster for size 12 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 12 + wa_liheap_countable_income: 29580 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 15, Printed household adjuster for size 13 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 13 + wa_liheap_countable_income: 31740 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 16, Printed household adjuster for size 14 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 14 + wa_liheap_countable_income: 33840 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 17, Printed household adjuster for size 15 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 15 + wa_liheap_countable_income: 36000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 18, Printed household adjuster for size 16 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 16 + wa_liheap_countable_income: 38160 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 19, Printed household adjuster for size 17 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 17 + wa_liheap_countable_income: 40260 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 20, Printed household adjuster for size 18 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 18 + wa_liheap_countable_income: 42420 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 21, Printed household adjuster for size 19 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 19 + wa_liheap_countable_income: 44580 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 22, Printed household adjuster for size 20 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 20 + wa_liheap_countable_income: 46740 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 23, Printed household adjuster for size 21 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 21 + wa_liheap_countable_income: 48840 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 24, Printed household adjuster for size 22 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 22 + wa_liheap_countable_income: 51000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 25, Printed household adjuster for size 23 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 23 + wa_liheap_countable_income: 53160 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 26, Printed household adjuster for size 24 preserves the worksheet example. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 24 + wa_liheap_countable_income: 55260 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 336 +- name: Case 27, Annual countable wages of 19200 produce a 590 award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 19200 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 590 +- name: Case 28, Two-person countable income of 24000 produces a 630 award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 2 + wa_liheap_countable_income: 24000 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 630 +- name: Case 29, Unemployment after the ten percent allowance produces a 308 award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 10800 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 308 +- name: Case 30, Income at the annual poverty limit remains eligible for 440. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 23475 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 440 + wa_liheap_eligible: true +- name: Case 31, Income one dollar above the limit produces no award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 23476 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 0 + wa_liheap_eligible: false +- name: Case 32, Annual heating cost 0 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 0 + output: + wa_liheap: 0 +- name: Case 33, Annual heating cost -100 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: -100 + output: + wa_liheap: 0 +- name: Case 34, Annual heating cost 249.5 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 249.5 + output: + wa_liheap: 249.5 +- name: Case 35, Annual heating cost 250 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 250 + output: + wa_liheap: 250 +- name: Case 36, Annual heating cost 277 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 277 + output: + wa_liheap: 250 +- name: Case 37, Annual heating cost 405 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 405 + output: + wa_liheap: 365 +- name: Case 38, Annual heating cost 1388 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1388 + output: + wa_liheap: 1249 +- name: Case 39, Annual heating cost 1389 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1389 + output: + wa_liheap: 1250 +- name: Case 40, Annual heating cost 1390 applies the minimum, maximum and final cost cap. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1390 + output: + wa_liheap: 1250 +- name: Case 41, Monthly income below the quotient rounding transition pays 840. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6079.08 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 840 +- name: Case 42, Monthly income above the quotient rounding transition pays 830. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6079.2 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 830 +- name: Case 43, Adjusted income just below a cent rounding transition pays 840. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6079.128 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 840 +- name: Case 44, Adjusted income just above a cent rounding transition pays 830. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6079.152 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap: 830 +- name: Case 45, Negative countable income does not increase the maximum multiplier. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: -1000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 360 +- name: Case 46, Household size beyond the printed table has an unsupported award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 25 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 0 + wa_liheap_eligible: true +- name: Case 47, No qualified members produces no award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 0 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 0 + wa_liheap_eligible: false +- name: Case 48, Heat included in rent uses the reported heating cost. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + heat_expense_included_in_rent: true + output: + wa_liheap: 336 + wa_liheap_eligible: true +- name: Case 49, Subsidized rent with a supported heating cost is not categorically excluded. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + heat_expense_included_in_rent: true + receives_housing_assistance: true + output: + wa_liheap: 336 + wa_liheap_eligible: true +- name: Case 50, Unspecified fuel with heat included in rent pays zero because callers must send heating_type. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: UNSPECIFIED + heating_expense: 0 + heat_expense_included_in_rent: true + output: + wa_liheap: 0 + wa_liheap_eligible: true +- name: Case 51, Fuel oil bill feeds the worksheet. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: FUEL_OIL + fuel_oil_expense: 400 + output: + heating_expense: 400 + wa_liheap: 336 +- name: Case 52, Explicit NONE heating type produces no award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: NONE + heating_expense: 400 + output: + wa_liheap: 0 +- name: Case 53, Out-of-state household produces no award. + period: 2026 + input: + state_code: OR + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + heating_expense: 400 + output: + wa_liheap: 0 +- name: Case 54, Unsupported extrapolation with a nonpositive denominator returns zero. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 50000 + heating_type: ELECTRICITY + heating_expense: 400 + wa_liheap_eligible: true + output: + wa_liheap: 0 +- name: Case 55, Canonical ELECTRICITY primary heating bill feeds the award. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 6000 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 400 + output: + heating_expense: 400 + wa_liheap: 336 +- name: Case 56, Single adult wages flow through eligibility and the final heating award. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + employment_income: 24000 + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + wa_tanf: 0 + wa_sfa: 0 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1000 + households: + household1: + members: + - person1 + state_code: WA + output: + wa_liheap_household_size: 1 + wa_liheap_countable_income: 19200 + wa_liheap_income_limit: 23475 + wa_liheap_eligible: true + wa_liheap: 590 +- name: Case 57, Two adult earners use the household adjuster after their wage deductions. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + employment_income: 15000 + ssi: 0 + person2: + age: 42 + immigration_status: CITIZEN + employment_income: 15000 + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + - person2 + wa_tanf: 0 + wa_sfa: 0 + heating_type: NATURAL_GAS + gas_expense: 1000 + households: + household1: + members: + - person1 + - person2 + state_code: WA + output: + wa_liheap_household_size: 2 + wa_liheap_countable_income: 24000 + wa_liheap_income_limit: 31725 + wa_liheap_eligible: true + wa_liheap: 630 +- name: Case 58, Mixed-status household retains parent income and has no extra benefit proration. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: UNDOCUMENTED + employment_income: 24000 + ssi: 0 + person2: + age: 10 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + - person2 + wa_tanf: 0 + wa_sfa: 0 + heating_type: PROPANE + bottled_gas_expense: 1000 + households: + household1: + members: + - person1 + - person2 + state_code: WA + output: + wa_liheap_household_size: 1 + wa_liheap_countable_income: 19200 + wa_liheap_income_limit: 23475 + wa_liheap_eligible: true + wa_liheap: 590 +- name: Case 59, Minor wages are excluded while child support, SSI and the state supplement affect the final award. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + employment_income: 12000 + ssi: 0 + person2: + age: 10 + immigration_status: CITIZEN + employment_income: 2000 + child_support_received: 3000 + ssi: 1200 + meets_ssi_disability_criteria: true + marital_units: + marital_unit1: + members: + - person1 + marital_unit2: + members: + - person2 + spm_units: + spm_unit1: + members: + - person1 + - person2 + wa_tanf: 0 + wa_sfa: 0 + heating_type: WOOD + wood_expense: 1000 + households: + household1: + members: + - person1 + - person2 + state_code: WA + output: + # The disabled child's SSI brings the STANDARD state supplement, + # 35.50 * 12 = 426. Countable: 9,600 + 3,000 + 1,200 + 426 = 14,226. + # 14,226 / 12 / 1.36 = 871.69; 3,648.10 - 871.69 = 2,776.41. + # 1,460.80 / 2,776.41 = 0.52615 rounds to .53; (1.30 - .53) * 1,000 = 770. + wa_ssp: [0, 426] + wa_liheap_household_size: 2 + wa_liheap_countable_income: 14226 + wa_liheap_income_limit: 31725 + wa_liheap_eligible: true + wa_liheap: 770 +- name: Case 60, Separate SPM units and an out-of-state household remain independent in one + simulation. + period: 2026 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + employment_income: 24000 + ssi: 0 + person2: + age: 45 + immigration_status: CITIZEN + ssi: 0 + person3: + age: 50 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit1: + members: + - person1 + wa_tanf: 0 + wa_sfa: 0 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1000 + spm_unit2: + members: + - person2 + wa_tanf: 0 + wa_sfa: 0 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 100 + spm_unit3: + members: + - person3 + wa_tanf: 0 + wa_sfa: 0 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1000 + households: + household1: + members: + - person1 + - person2 + state_code: WA + household2: + members: + - person3 + state_code: OR + output: + wa_liheap_household_size: + - 1 + - 1 + - 0 + wa_liheap_countable_income: + - 19200 + - 0 + - 0 + wa_liheap_eligible: + - true + - true + - false + wa_liheap: + - 590 + - 100 + - 0 + +- name: Case 61, one cent below the adjusted-income rounding tie retains the lower quotient. + period: 2026 + input: + age: 40 + immigration_status: CITIZEN + state_code: WA + self_employment_income: 3479.21 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_000 + output: + # 3,479.21 / 12 = 289.934 rounds to 289.93; 3,648.10 - 289.93 = 3,358.17. + # 1,460.80 / 3,358.17 = 0.43499 rounds to .43, giving (1.30 - .43) * 1,000. + wa_liheap: 870 + +- name: Case 62, an exact adjusted-income half-cent tie rounds upward. + period: 2026 + input: + age: 40 + immigration_status: CITIZEN + state_code: WA + self_employment_income: 3479.22 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_000 + output: + # At the tie, 3,479.22 / 12 = 289.935 rounds to 289.94. + # The next quotient rounds to .44, giving (1.30 - .44) * 1,000. + wa_liheap: 860 + +- name: Case 63, one cent above the adjusted-income rounding tie retains the upper quotient. + period: 2026 + input: + age: 40 + immigration_status: CITIZEN + state_code: WA + self_employment_income: 3479.23 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_000 + output: + # 3,479.23 / 12 = 289.936 rounds to 289.94; 3,648.10 - 289.94 = 3,358.16. + # 1,460.80 / 3,358.16 = 0.43500 rounds to .44, giving (1.30 - .44) * 1,000. + wa_liheap: 860 + +# Commerce Policy 1.1.2 counts cash actually received, not untaken entitlement. +# No TANF: 1460.80 / 3648.10 rounds to .40; (1.30 - .40) * 1000 = 900. +# Received TANF: 6840 / 12 / 1.36 rounds to 419.12; denominator 3228.98, +# quotient .45, and (1.30 - .45) * 1000 = 850. SFA is a separate program. +- name: Case 64, TANF take-up changes received income once per household and the final award. + period: 2026 + input: + people: + nonrecipient_parent: {age: 40, immigration_status: CITIZEN, ssi: 0} + nonrecipient_child: {age: 10, immigration_status: CITIZEN, ssi: 0} + recipient_parent: {age: 40, immigration_status: CITIZEN, ssi: 0} + recipient_child: {age: 10, immigration_status: CITIZEN, ssi: 0} + tax_units: + nonrecipient_family: {members: [nonrecipient_parent, nonrecipient_child]} + recipient_family: {members: [recipient_parent, recipient_child]} + spm_units: + nonrecipient_unit: + members: [nonrecipient_parent, nonrecipient_child] + takes_up_tanf_if_eligible: false + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1000 + recipient_unit: + members: [recipient_parent, recipient_child] + takes_up_tanf_if_eligible: true + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1000 + households: + nonrecipient_home: + members: [nonrecipient_parent, nonrecipient_child] + state_code: WA + recipient_home: + members: [recipient_parent, recipient_child] + state_code: WA + output: + wa_tanf: [6840, 6840] + tanf: [0, 6840] + wa_sfa: [0, 0] + wa_liheap_household_size: [2, 2] + wa_liheap_countable_income: [0, 6840] + wa_liheap_eligible: [true, true] + wa_liheap: [900, 850] + +# Ordinary DoD retirement is separate from pension/VA income. Apply the +# Commerce retirement deduction: 26000 * .90 = 23400 (limit 23475). +# Monthly income 1950 gives denominator 1698.10, quotient .86, multiplier .44. +- name: Case 65, Ordinary military retirement receives the retirement deduction before the final award. + period: 2026 + input: + state_code: WA + age: 40 + immigration_status: CITIZEN + is_veteran: true + years_in_military: 20 + military_retirement_pay: 26000 + pension_income: 0 + veterans_benefits: 0 + ssi: 0 + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1000 + output: + military_retirement_income: 26000 + pension_income: 0 + veterans_benefits: 0 + wa_liheap_household_size: 1 + wa_liheap_income_limit: 23475 + wa_liheap_countable_income: 23400 + wa_liheap_eligible: true + wa_liheap: 440 + +# Military Survivor Benefit Plan annuities count through military retirement +# income with the 10% retirement deduction: 26,000 * .90 = 23,400 (limit 23,475). +# Monthly 23,400 / 12 = 1,950.00; denominator 3,648.10 - 1,950.00 = 1,698.10. +# 1,460.80 / 1,698.10 = 0.86026 rounds to .86; (1.30 - .86) * 1,000 = 440. +- name: Case 66, Military survivor annuity receives the retirement deduction. + period: 2026 + input: + state_code: WA + age: 70 + immigration_status: CITIZEN + military_retirement_pay_survivors: 26_000 + ssi: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + military_retirement_income: 26_000 + wa_liheap_household_size: 1 + wa_liheap_income_limit: 23_475 + wa_liheap_countable_income: 23_400 + wa_liheap_eligible: true + wa_liheap: 440 + +# Plan section 1.9: Social Security counts net of the Medicare Part B premium. +# MSP income (24,000 - 240) / 12 = 1,980 exceeds 1.35 * 15,960 / 12 = 1,795.50, +# so the person pays the full 12 * 202.90 = 2,434.80 premium. +# Countable: 24,000 - 2,434.80 = 21,565.20 (limit 23,475). +# Monthly 21,565.20 / 12 = 1,797.10; denominator 3,648.10 - 1,797.10 = 1,851.00. +# 1,460.80 / 1,851.00 = 0.78919 rounds to .79; (1.30 - .79) * 1,000 = 510. +- name: Case 67, Social Security counts net of the Medicare Part B premium. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + age: 70 + immigration_status: CITIZEN + social_security_retirement: 24_000 + ssi: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + medicare_part_b_premium: 2_434.8 + wa_liheap_household_size: 1 + wa_liheap_income_limit: 23_475 + wa_liheap_countable_income: 21_565.2 + wa_liheap_eligible: true + wa_liheap: 510 + +# Plan section 2.6 sets a $250 minimum benefit. With heat in rent, a known +# fuel and no reported cost, the household receives the minimum with no cost +# cap. Countable: 12,000 * 0.80 = 9,600 (limit 23,475). +# The worksheet multiplier would be 1.30 - .51 = .79 (1,460.80 / 2,848.10 = +# 0.51290), applied to a heat cost that is not reported. +- name: Case 68, Heat included in rent with a known fuel and no bill pays the minimum benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + age: 40 + immigration_status: CITIZEN + employment_income: 12_000 + ssi: 0 + heating_type: NATURAL_GAS + heat_expense_included_in_rent: true + output: + heating_expense: 0 + wa_liheap_household_size: 1 + wa_liheap_countable_income: 9_600 + wa_liheap_eligible: true + wa_liheap: 250 + +# Paid child support is deducted. Before the deduction 30,000 * 0.80 = 24,000 +# exceeds the 23,475 limit; after it 24,000 - 1,200 = 22,800 qualifies. +# Monthly 22,800 / 12 = 1,900.00; denominator 3,648.10 - 1,900.00 = 1,748.10. +# 1,460.80 / 1,748.10 = 0.83565 rounds to .84; (1.30 - .84) * 1,000 = 460. +- name: Case 69, Child support paid brings wages under the income limit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + age: 40 + immigration_status: CITIZEN + employment_income: 30_000 + child_support_expense: 1_200 + ssi: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + wa_liheap_household_size: 1 + wa_liheap_income_limit: 23_475 + wa_liheap_countable_income: 22_800 + wa_liheap_eligible: true + wa_liheap: 460 + +# Workers' compensation counts with no deduction: 12,000 (limit 23,475). +# Monthly 12,000 / 12 = 1,000.00; denominator 3,648.10 - 1,000.00 = 2,648.10. +# 1,460.80 / 2,648.10 = 0.55164 rounds to .55; (1.30 - .55) * 1,000 = 750. +- name: Case 70, Workers compensation counts as unearned income in the award. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + age: 45 + immigration_status: CITIZEN + workers_compensation: 12_000 + ssi: 0 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + wa_liheap_household_size: 1 + wa_liheap_countable_income: 12_000 + wa_liheap_eligible: true + wa_liheap: 750 + +# An aged SSI recipient at the 2026 federal rate, 994 * 12 = 11,928, also gets +# the STANDARD state supplement, 35.50 * 12 = 426. Both count as cash income: +# 11,928 + 426 = 12,354 (limit 23,475). +# Monthly 12,354 / 12 = 1,029.50; denominator 3,648.10 - 1,029.50 = 2,618.60. +# 1,460.80 / 2,618.60 = 0.55786 rounds to .56; (1.30 - .56) * 1,000 = 740. +- name: Case 71, The Washington state supplement to SSI counts as cash income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + age: 70 + immigration_status: CITIZEN + ssi: 11_928 + heating_type: NATURAL_GAS + gas_expense: 1_000 + output: + wa_ssp: 426 + wa_liheap_household_size: 1 + wa_liheap_income_limit: 23_475 + wa_liheap_countable_income: 12_354 + wa_liheap_eligible: true + wa_liheap: 740 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_countable_income.yaml new file mode 100644 index 00000000000..51d413c2e4c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_countable_income.yaml @@ -0,0 +1,377 @@ +# FY2026 plan sections 1.8-1.9; Byrd Barr FY2025-26 application pages 1-2; +# Commerce 2026 manual Policy 1.1.2, pages 14-15. Social Security counts net of the +# Medicare Part B premium; no SSA subtype retirement deduction is applied. + +- name: Case 1, payroll wages receive the twenty-percent deduction. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + employment_income: 24000 + output: + wa_liheap_countable_income: 19200 + +- name: Case 2, net business income receives no second deduction. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + employment_income: 12000 + self_employment_income: 12000 + output: + wa_liheap_countable_income: 21600 + +- name: Case 3, business losses do not offset wages. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + employment_income: 12000 + self_employment_income: -3000 + output: + wa_liheap_countable_income: 9600 + +- name: Case 4, minor wages and business earnings are excluded. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 17 + employment_income: 10000 + self_employment_income: 2000 + output: + wa_liheap_countable_income: 0 + +- name: Case 5, earnings count at age eighteen. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 18 + employment_income: 10000 + output: + wa_liheap_countable_income: 8000 + +- name: Case 6, pensions and retirement distributions receive ten percent. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 65 + pension_income: 10000 + retirement_distributions: 2000 + output: + wa_liheap_countable_income: 10800 + +- name: Case 7, unemployment receives ten percent. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + unemployment_compensation: 12000 + output: + wa_liheap_countable_income: 10800 + +- name: Case 8, Social Security counts in full when a Medicare Savings Program pays the Part B premium. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 65 + social_security_retirement: 12000 + output: + # MSP income: (12,000 - 240) / 12 = 980 < 1.35 * 15,960 / 12 = 1,795.50, + # so the program pays the 12 * 202.90 premium and none is deducted. + medicare_part_b_premium: 0 + wa_liheap_countable_income: 12000 + +- name: Case 9, Social Security disability and SSI remain fully counted. + period: 2026 + input: + state_code: WA + ssi: 2400 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + social_security_disability: 12000 + output: + wa_liheap_countable_income: 14400 + +- name: Case 10, reported aggregate Social Security is not duplicated. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 65 + social_security: 15000 + social_security_retirement: 10000 + output: + # MSP income (15,000 - 240) / 12 = 1,230 is below 1,795.50, so the + # program pays the Part B premium and the aggregate counts once in full. + wa_liheap_countable_income: 15000 + +- name: Case 11, TANF and State Family Assistance count once per unit. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 1200 + wa_sfa: 2400 + age: 40 + output: + wa_liheap_countable_income: 3600 + +- name: Case 12, child support received counts and paid child support is deducted. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + child_support_received: 5000 + child_support_expense: 1200 + output: + # Commerce Exhibit 1.3.1A lists child support received and paid: + # 5,000 received - 1,200 paid = 3,800. + wa_liheap_countable_income: 3800 + +- name: Case 13, VA benefits and insurance payments are excluded under the FY2026 plan. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 50 + veterans_benefits: 20000 + disability_benefits: 5000 + life_insurance_benefits: 10000 + output: + wa_liheap_countable_income: 0 + +- name: Case 14, refundable credits and balances are excluded. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + income_tax_refundable_credits: 5000 + bank_account_assets: 100000 + output: + wa_liheap_countable_income: 0 + +- name: Case 15, ordinary income sources count without duplicate components. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + strike_benefits: 1000 + general_assistance: 2000 + financial_assistance: 3000 + rental_income: 4000 + farm_rent_income: 5000 + alimony_income: 6000 + child_support_received: 7000 + interest_income: 8000 + ordinary_dividend_income: 9000 + output: + wa_liheap_countable_income: 45000 + +- name: Case 16, rental losses do not offset positive income. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + rental_income: -10000 + farm_rent_income: 2000 + employment_income: 12000 + output: + wa_liheap_countable_income: 11600 + +- name: Case 17, private and public pension components are counted only through pension income. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 65 + taxable_private_pension_income: 10000 + taxable_public_pension_income: 2000 + output: + wa_liheap_countable_income: 10800 + +- name: Case 18, separate net business sources retain their positive amounts. + period: 2026 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + self_employment_income: 1000 + sstb_self_employment_income: 2000 + farm_operations_income: 3000 + partnership_s_corp_income: 4000 + output: + wa_liheap_countable_income: 10000 + +- name: Case 19, a minors unearned income counts while wages are excluded. + period: 2026 + input: + people: + person1: {age: 40, employment_income: 12_000, ssi: 0} + person2: + age: 10 + employment_income: 2_000 + child_support_received: 3_000 + ssi: 1_200 + meets_ssi_disability_criteria: true + marital_units: + marital_unit1: {members: [person1]} + marital_unit2: {members: [person2]} + spm_units: + spm_unit1: {members: [person1, person2], wa_tanf: 0, wa_sfa: 0} + households: + household1: {members: [person1, person2], state_code: WA} + output: + # A child receives SSI only when disabled; a disabled SSI recipient gets + # the STANDARD state supplement, 35.50 * 12 = 426. + # 12,000 * 0.80 = 9,600 + 3,000 child support + 1,200 SSI + 426 = 14,226. + wa_ssp: [0, 426] + wa_liheap_countable_income: 14_226 + +- name: Case 20, income from an undocumented parent remains countable. + period: 2026 + input: + people: + person1: {age: 40, immigration_status: UNDOCUMENTED, employment_income: 24_000, ssi: 0} + person2: {age: 10, immigration_status: CITIZEN, ssi: 0} + spm_units: + spm_unit1: {members: [person1, person2], wa_tanf: 0, wa_sfa: 0} + households: + household1: {members: [person1, person2], state_code: WA} + output: + wa_liheap_household_size: 1 + wa_liheap_countable_income: 19_200 + +- name: Case 21, household-level assistance is not multiplied by member count. + period: 2026 + input: + people: + person1: {age: 40, ssi: 0} + person2: {age: 10, ssi: 0} + spm_units: + spm_unit1: {members: [person1, person2], wa_tanf: 6_000, wa_sfa: 0} + households: + household1: {members: [person1, person2], state_code: WA} + output: + wa_liheap_countable_income: 6_000 + +- name: Case 22, Washington income calculation is zero outside Washington. + period: 2026 + input: + state_code: OR + age: 40 + employment_income: 24_000 + output: + wa_liheap_countable_income: 0 + +- name: Case 23, Social Security below the Part B premium does not reduce other income. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 70 + pension_income: 30_000 + social_security_retirement: 1_800 + output: + # MSP income (30,000 + 1,800 - 240) / 12 = 2,630 exceeds 1,795.50, so the + # person pays the full 12 * 202.90 = 2,434.80 premium. + # Pension: 30,000 * (1 - 0.10) = 27,000. + # Social Security: max(1,800 - 2,434.80, 0) = 0, so the remaining + # 634.80 of premium is not taken from the pension. + medicare_part_b_premium: 2_434.8 + wa_liheap_countable_income: 27_000 + +- name: Case 24, railroad and survivor benefits count in full without the retirement deduction. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 62 + railroad_benefits: 3_000 + survivor_benefits: 4_000 + output: + # Unearned list, no 10% deduction: 3,000 + 4,000 = 7,000. + wa_liheap_countable_income: 7_000 + +- name: Case 25, alimony and child support paid reduce countable income no lower than zero. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + age: 40 + employment_income: 6_000 + child_support_expense: 3_600 + alimony_expense: 2_400 + output: + # 6,000 * 0.80 = 4,800; paid support 3,600 + 2,400 = 6,000. + # max(4,800 - 6,000, 0) = 0. + wa_liheap_countable_income: 0 + +- name: Case 26, Refugee Cash Assistance counts as state cash assistance. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: WA + ssi: 0 + wa_tanf: 0 + wa_sfa: 0 + wa_rca: 5_400 + age: 40 + output: + # Size-1 payment standard 450 x 12 = 5,400 (WAC 388-478-0020). wa_rca is + # monthly, summed to 5,400 for the year and added once at the SPM-unit + # level with TANF and SFA (both 0). + wa_liheap_countable_income: 5_400 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_eligible.yaml new file mode 100644 index 00000000000..9840b2513e1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_eligible.yaml @@ -0,0 +1,113 @@ +- name: Case 1, income equal to the exact annual poverty limit qualifies. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 23475 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap_eligible: true + +- name: Case 2, income above the exact annual limit is ineligible. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 23476 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap_eligible: false + +- name: Case 3, zero qualifying members is ineligible. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 0 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap_eligible: false + +- name: Case 4, no heating responsibility is ineligible. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 0 + output: + wa_liheap_eligible: false + +- name: Case 5, heat included in rent qualifies even when its cost is unknown. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: UNSPECIFIED + heating_expense: 0 + heat_expense_included_in_rent: true + output: + wa_liheap_eligible: true + +- name: Case 6, subsidized renters are not categorically excluded. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1000 + receives_housing_assistance: true + heat_expense_included_in_rent: true + output: + wa_liheap_eligible: true + +- name: Case 7, NONE explicitly identifies no heating. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: NONE + heating_expense: 1000 + output: + wa_liheap_eligible: false + +- name: Case 8, no asset test is imposed. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1000 + bank_account_assets: 1000000 + output: + wa_liheap_eligible: true + +- name: Case 9, another state is ineligible. + period: 2026 + input: + state_code: OR + wa_liheap_household_size: 1 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap_eligible: false + +- name: Case 10, size twenty-five retains eligibility despite an unsupported award adjuster. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 25 + wa_liheap_countable_income: 0 + heating_type: ELECTRICITY + heating_expense: 1000 + output: + wa_liheap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_household_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_household_size.yaml new file mode 100644 index 00000000000..9799e4145e2 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_household_size.yaml @@ -0,0 +1,46 @@ +# Mixed-status treatment follows other state LIHEAP implementations; the SPM unit +# approximates shared-heat residents. +- name: Case 1, a citizen child counts and an undocumented parent does not. + period: 2026 + input: + people: + person1: {age: 40, immigration_status: UNDOCUMENTED} + person2: {age: 10, immigration_status: CITIZEN} + spm_units: + spm_unit1: {members: [person1, person2]} + households: + household1: {members: [person1, person2], state_code: WA} + output: + wa_liheap_household_size: 1 + +- name: Case 2, refugees and asylees count but DACA and TPS do not. + period: 2026 + input: + people: + person1: {age: 40, immigration_status: REFUGEE} + person2: {age: 35, immigration_status: ASYLEE} + person3: {age: 30, immigration_status: DACA} + person4: {age: 28, immigration_status: TPS} + spm_units: + spm_unit1: {members: [person1, person2]} + spm_unit2: {members: [person3, person4]} + households: + household1: {members: [person1, person2, person3, person4], state_code: WA} + output: + wa_liheap_household_size: [2, 0] + +- name: Case 3, permanent residents use the existing qualified-status indicator. + period: 2026 + input: + state_code: WA + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + wa_liheap_household_size: 1 + +- name: Case 4, Washington household size is zero outside Washington. + period: 2026 + input: + state_code: OR + immigration_status: CITIZEN + output: + wa_liheap_household_size: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_income_limit.yaml new file mode 100644 index 00000000000..c51af0efe51 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/wa/commerce/liheap/wa_liheap_income_limit.yaml @@ -0,0 +1,114 @@ +# Annual limits use the federal guideline at the start of the fiscal-year season. +# FY2027 tests verify the published threshold sheet only, not final awards. + +- name: Case 1, FY2026 poverty limit for 0 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 0 + output: + wa_liheap_income_limit: 0 + +- name: Case 2, FY2026 poverty limit for 1 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 1 + output: + wa_liheap_income_limit: 23475 + +- name: Case 3, FY2026 poverty limit for 2 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 2 + output: + wa_liheap_income_limit: 31725 + +- name: Case 4, FY2026 poverty limit for 3 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 3 + output: + wa_liheap_income_limit: 39975 + +- name: Case 5, FY2026 poverty limit for 4 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 4 + output: + wa_liheap_income_limit: 48225 + +- name: Case 6, FY2026 poverty limit for 5 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 5 + output: + wa_liheap_income_limit: 56475 + +- name: Case 7, FY2026 poverty limit for 6 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 6 + output: + wa_liheap_income_limit: 64725 + +- name: Case 8, FY2026 poverty limit for 7 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 7 + output: + wa_liheap_income_limit: 72975 + +- name: Case 9, FY2026 poverty limit for 8 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 8 + output: + wa_liheap_income_limit: 81225 + +- name: Case 10, FY2026 poverty limit for 12 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 12 + output: + wa_liheap_income_limit: 114225 + +- name: Case 11, FY2026 poverty limit for 24 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 24 + output: + wa_liheap_income_limit: 213225 + +- name: Case 12, FY2026 poverty limit for 25 qualifying members. + period: 2026 + input: + state_code: WA + wa_liheap_household_size: 25 + output: + wa_liheap_income_limit: 221475 + +- name: Case 13, FY2027 poverty limit for 1 qualifying members. + period: 2027 + input: + state_code: WA + wa_liheap_household_size: 1 + output: + wa_liheap_income_limit: 23940 + +- name: Case 14, FY2027 poverty limit for 2 qualifying members. + period: 2027 + input: + state_code: WA + wa_liheap_household_size: 2 + output: + wa_liheap_income_limit: 32460 diff --git a/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap.py b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap.py new file mode 100644 index 00000000000..e55ccc8d39d --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap.py @@ -0,0 +1,75 @@ +from policyengine_us.model_api import * + + +class wa_liheap(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Washington Low Income Home Energy Assistance Program benefit" + documentation = ( + "FY2026 regular heating award using reported annual heating expense. " + "The printed worksheet supplies constants and household adjusters; " + "two-decimal intermediate rounding, half-up ties and final dollar " + "rounding are documented conventions consistent with its example. " + "The award after the minimum and maximum is capped at reported " + "heating cost, with no extra mixed-status proration. A household " + "whose heat is included in rent, with a known fuel and no reported " + "cost, receives the plan's minimum benefit without the cost cap as a " + "lower bound, because the surrogate heat-cost schedule is not " + "published; a reported cost keeps the worksheet calculation. An " + "unspecified fuel pays zero, so callers must send heating_type. Zero " + "for a household larger than the published adjuster table means an " + "unsupported amount, not necessarily legal ineligibility. The SPM unit " + "and its reported cost approximate the shared-heat household and cost. " + "Years outside FY2026 are unverified estimates." + ) + reference = ( + # PDF pages 1-2 (printed worksheet pages 10-11). + "https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1", + # Sections 2.6 and 9.1, PDF pages 10,24. + "https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=10", + ) + defined_for = "wa_liheap_eligible" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.wa.commerce.liheap.payment + size = spm_unit("wa_liheap_household_size", period) + adjuster = p.household_adjuster.calc(size) + # Do not extrapolate the worksheet beyond its last published size. + supported_size = size <= p.household_adjuster.thresholds[-1] + income = max_(spm_unit("wa_liheap_countable_income", period), 0) + increment = p.intermediate_rounding_increment + annual_increment = MONTHS_IN_YEAR * max_(adjuster, 1) * increment + lower_units = np.floor(income.astype(np.float64) / annual_increment) + # Compare half-cent ties at the precision of the stored annual income. + midpoint = ((lower_units + 0.5) * annual_increment).astype(income.dtype) + adjusted_income = (lower_units + (income >= midpoint)) * increment + denominator = p.income_constant - adjusted_income + # Defensive handling for unsupported future-year extrapolations. + quotient = np.divide( + p.quotient_numerator, + denominator, + out=np.zeros_like(denominator), + where=denominator > 0, + ) + quotient = np.floor(quotient / increment + 0.5) * increment + multiplier = max_(p.multiplier_constant - quotient, 0) + expense = max_(spm_unit("heating_expense", period), 0) + rounded_award = np.floor(expense * multiplier + 0.5) + # Apply the minimum and maximum first, then cap at actual heating cost. + cost_award = min_(clip(rounded_award, p.minimum, p.maximum), expense) + # Plan section 2.6 sets a $250 minimum benefit, and section 9.1 pays + # households whose heat is included in rent by check. The surrogate + # heat-cost schedule is not published, so a known-fuel household with + # heat in rent and no reported cost receives the minimum as a lower + # bound, with no cost cap. An unspecified fuel pays zero. + heating_type = spm_unit("heating_type", period) + known_fuel = heating_type != heating_type.possible_values.UNSPECIFIED + unpriced_heat_in_rent = ( + spm_unit("heat_expense_included_in_rent", period) + & (expense <= 0) + & known_fuel + ) + award = where(unpriced_heat_in_rent, p.minimum, cost_award) + return where(supported_size & (denominator > 0), award, 0) diff --git a/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_countable_income.py b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_countable_income.py new file mode 100644 index 00000000000..2019cc0d366 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_countable_income.py @@ -0,0 +1,90 @@ +from policyengine_us.model_api import * + + +class wa_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Washington LIHEAP countable income" + documentation = ( + "Annual income approximates the selectable application-period average. " + "All members' otherwise countable income is retained, including members " + "excluded from household size. Reported wages approximate earnings taxed " + "at payout; existing net business income receives no further deduction. " + "The retirement deduction covers pension income, retirement-account " + "distributions and military retirement income. Social Security counts " + "net of the Medicare Part B premium; SSI counts in full. TANF, State " + "Family Assistance, Refugee Cash Assistance and the state supplement to " + "SSI count as cash assistance. Child support and alimony paid by " + "members are deducted, with countable income floored at zero. Exempt " + "subtypes and receipts without existing inputs are not reconstructed. " + "Supply adjusted countable income directly when the detailed program " + "amount is known." + ) + reference = ( + # Section 1.9, PDF pages 5-7. + "https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=5", + # FY2025-26 application, PDF pages 1-2,13. + "https://drive.google.com/file/d/18fvR5CL8UKpTj4Vsm7KlkitKUJclAvkR/view#page=1", + # Policies 1.1.1-1.1.2 incorporate LIHEAP income rules; Exhibit 1.3.1A + # lists child support received/paid. PDF pages 13-15,445. + "https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=13", + "https://www.clarkpublicutilities.com/residential-customers/financial-assistance/all-financial-assistance-programs/liheap-income-requirements/", + "https://www.liheapcalendar.com/CACLMT/FAQ", + ) + defined_for = StateCode.WA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.wa.commerce.liheap.income + person = spm_unit.members + wages = max_(person("employment_income", period), 0) + business = 0 + for source in p.business_sources: + business = business + max_(person(source, period), 0) + # Net inputs approximate allowable business expenses; the 50% standard + # expense option and 20% wage deduction are not applied again. + # Annual net inputs cannot reproduce separate monthly loss floors. + earned = where( + person("age", period) >= p.earned_income_min_age, + wages * (1 - p.wage_deduction_rate) + business, + 0, + ) + retirement = 0 + for source in p.retirement_sources: + retirement = retirement + max_(person(source, period), 0) + unemployment = max_(person("total_unemployment_compensation", period), 0) + unearned = 0 + for source in p.unearned_sources: + unearned = unearned + max_(person(source, period), 0) + # Plan section 1.9 checks "Excluding MediCare deduction" for Social + # Security, so each person's benefit counts net of the Part B premium + # that person pays. medicare_part_b_premium is zero for a person not + # enrolled and excludes any share a Medicare Savings Program pays. + social_security = max_(person("social_security", period), 0) + premium = person("medicare_part_b_premium", period) + net_social_security = max_(social_security - premium, 0) + personal_income = ( + earned + + retirement * (1 - p.retirement_deduction_rate) + + unemployment * (1 - p.unemployment_deduction_rate) + + unearned + + net_social_security + ) + # Plan section 1.8 counts gross income. State cash assistance counts + # like the counted TANF, SFA and SSI: Refugee Cash Assistance (WAC + # 388-400-0030) and the state supplement to SSI (WAC 388-474-0012(1)). + # No Washington LIHEAP source names either program. The SPM-level + # payments are added once, and the supplement is summed over members. + # General assistance input represents other assistance, such as ABD. + assistance = add(spm_unit, period, ["tanf", "wa_sfa", "wa_rca", "wa_ssp"]) + # Commerce Weatherization Manual Exhibit 1.3.1A, which Policy 1.1.1 + # ties to the LIHEAP income guidelines, lists "Child support + # received/paid" as income documentation. Clark Public Utilities + # deducts paid child support and alimony, and CACLMT deducts paid + # child support. + support_paid = add( + spm_unit, period, ["child_support_expense", "alimony_expense"] + ) + gross = spm_unit.sum(personal_income) + max_(assistance, 0) + return max_(gross - max_(support_paid, 0), 0) diff --git a/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_eligible.py b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_eligible.py new file mode 100644 index 00000000000..c7382900a43 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_eligible.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * + + +class wa_liheap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Eligible for modeled Washington LIHEAP" + documentation = ( + "Models state residence, income, qualified-member count and heating " + "responsibility. Heat included in rent can establish responsibility " + "without a reported cost; with a known fuel the award is then the " + "plan's minimum benefit as a lower bound. No asset test or categorical " + "subsidy exclusion applies. " + "Prior receipt in the current season and application verification are " + "not observed." + ) + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=8", + "https://deptofcommerce.app.box.com/s/3fp0xz4y2x2p4hedw9ww4sk7ma36srlx", + ) + defined_for = StateCode.WA + + def formula(spm_unit, period, parameters): + size = spm_unit("wa_liheap_household_size", period) + income = spm_unit("wa_liheap_countable_income", period) + limit = spm_unit("wa_liheap_income_limit", period) + expense = spm_unit("heating_expense", period) + included_in_rent = spm_unit("heat_expense_included_in_rent", period) + heating_type = spm_unit("heating_type", period) + has_heating = heating_type != heating_type.possible_values.NONE + return ( + (size > 0) + & (income <= limit) + & ((expense > 0) | included_in_rent) + & has_heating + ) diff --git a/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_household_size.py b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_household_size.py new file mode 100644 index 00000000000..a077725cb7a --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_household_size.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class wa_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "Washington LIHEAP household size" + documentation = ( + "Citizens and qualified noncitizens in the SPM unit. This mixed-status " + "treatment follows other state LIHEAP implementations, because the " + "Washington plan does not specify its full count/income/share rule. " + "The SPM unit approximates the household sharing heating responsibility." + ) + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=37" + ) + defined_for = StateCode.WA + adds = ["is_citizen_or_legal_immigrant"] diff --git a/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_income_limit.py b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_income_limit.py new file mode 100644 index 00000000000..8a079b7d761 --- /dev/null +++ b/policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_income_limit.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class wa_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Washington LIHEAP annual income limit" + documentation = ( + "Uses the exact annual federal poverty guideline at season start. " + "Provider monthly displays differ in rounding; they are not multiplied " + "back to annual income. This is a documented modeling convention." + ) + reference = ( + "https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=8", + "https://drive.google.com/file/d/18fvR5CL8UKpTj4Vsm7KlkitKUJclAvkR/view#page=1", + "https://deptofcommerce.app.box.com/s/3fp0xz4y2x2p4hedw9ww4sk7ma36srlx", + ) + defined_for = StateCode.WA + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.wa.commerce.liheap + size = spm_unit("wa_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + guideline = fpg( + max_(size, 1), state_group, period, parameters, year_lag=p.fpg_year_lag + ) + return where(size > 0, guideline * p.fpg_rate, 0) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index e06355446bb..dfbda8868e1 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -7143,6 +7143,89 @@ candidates: state: unreviewed note: PE-US follows Vermont's deduction; evidence concerns federal fiscal 2016-2017 and 2024 only, with intervening years unasserted. +- id: us-wa:liheap-minimum-benefit-cost-cap + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Does every eligible Washington household receive the plan's $250 minimum regular heating benefit, or + does the award follow the worksheet's share of the annual heat cost? + sources: + - kind: plan + citation: FY2026 LIHEAP Detailed Model Plan, section 2.6 + url: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=10 + - kind: worksheet + citation: FY2026 Actual and Surrogate Heat Cost Benefit Calculation Worksheet + url: https://liheapch.acf.gov/docs/2026/benefits-matricies/WA_BenefitMatrix_2026.pdf#page=1 + readings: + statute: No statute is supplied; plan section 2.6 sets a "Minimum Benefit $250" and a "Maximum Benefit $1,250" + with no exception. + other: The worksheet multiplies the annual heat cost by a heat cost multiplier of at most 0.90 and prints no + minimum. + example: A household with no countable income and a $100 annual heating cost gets $90 from the worksheet and $250 + under the plan minimum; PE-US pays $100. + pe_us: + follows: unknown + code: + - policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap.py + - policyengine_us/parameters/gov/states/wa/commerce/liheap/payment/minimum.yaml + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10345 + state: ruled + note: PE-US applies the plan minimum and maximum, then caps the award at the reported annual heating cost, as chosen + on 2026-10-06; no Washington source states the cap. A household whose heat is included in rent, with a known fuel + and no reported cost, now receives the $250 minimum with no cost cap, because the surrogate heat cost schedule + is not published. +- id: us-wa:liheap-plan-agency-income-items + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Does Washington LIHEAP count the plan's gross income, or apply the deductions and income items of the + Commerce Weatherization manual and local agencies (wage, retirement and unemployment deductions, paid support, + workers' compensation and VA benefits)? + sources: + - kind: plan + citation: FY2026 LIHEAP Detailed Model Plan, sections 1.8-1.9 + url: https://liheapch.acf.gov/docs/2026/state-plans/WA_Plan_2026.pdf#page=5 + - kind: manual + citation: Washington State Weatherization Manual (July 2026), Policy 1.1.2 item 5.a and Exhibit 1.3.1A + url: https://deptofcommerce.app.box.com/s/5a32797ex8tz2blo8nwtifecokpya37j#page=15 + - kind: agency-practice + citation: Clark Public Utilities, LIHEAP income requirements + url: https://www.clarkpublicutilities.com/residential-customers/financial-assistance/all-financial-assistance-programs/liheap-income-requirements/ + - kind: agency-practice + citation: Community Action Council of Lewis, Mason and Thurston Counties, LIHEAP FAQ + url: https://www.liheapcalendar.com/CACLMT/FAQ + - kind: agency-practice + citation: Byrd Barr Place PY2025-2026 LIHEAP application packet + url: https://drive.google.com/file/d/18fvR5CL8UKpTj4Vsm7KlkitKUJclAvkR/view#page=1 + readings: + statute: No statute is supplied; plan section 1.8 counts "Gross Income", and section 1.9 lists countable types + with no deduction field, leaves VA benefits and insurance payments unchecked and has no workers' compensation + row. + other: Policy 1.1.2 item 5.a applies a 20 percent wage allowance and 10 percent retirement and unemployment + deductions; Exhibit 1.3.1A lists "Child support received/paid", an L&I statement and veteran's benefits as + income documentation; Clark Public Utilities deducts paid child support and alimony, CACLMT deducts paid child + support and counts time loss for work-related injuries, and Byrd Barr asks for VA award letters. + example: A single adult with $30,000 of wages who pays $1,200 of child support counts $24,000 after the wage + allowance, above the $23,475 limit; deducting the support gives $22,800 and a $460 award on a $1,000 gas bill. + pe_us: + follows: unknown + code: + - policyengine_us/variables/gov/states/wa/commerce/liheap/wa_liheap_countable_income.py + - policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unearned_sources.yaml + - policyengine_us/parameters/gov/states/wa/commerce/liheap/income/wage_deduction_rate.yaml + - policyengine_us/parameters/gov/states/wa/commerce/liheap/income/retirement_deduction_rate.yaml + - policyengine_us/parameters/gov/states/wa/commerce/liheap/income/unemployment_deduction_rate.yaml + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10345 + state: unreviewed + note: PE-US applies the manual's 20 and 10 percent deductions, deducts paid child support and alimony and counts + workers' compensation with no deduction, following the manual exhibit and agencies; it follows the plan in + excluding VA benefits. The Commerce LIHEAP operating manual, which would settle these items, is not public. - id: us-wa:ltss-spousal-maintenance-rounding program: medicaid-ltss years: