Skip to content

Add Idaho LIHEAP regular heating assistance - #10613

Open
hua7450 wants to merge 12 commits into
mainfrom
id-liheap-wave2c
Open

hua7450 wants to merge 12 commits into
mainfrom
id-liheap-wave2c

Conversation

@hua7450

@hua7450 hua7450 commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator

Adds Idaho LIHEAP regular heating assistance for FY2026 (program year October 1, 2025 to September 30, 2026), run by the Department of Health and Welfare (DHW). A household's energy burden is the estimated heating cost for its fuel and heating area (the PY2007 nine-month table, $977 to $2,145) over its annual countable income: low under 6%, medium from 6% to under 11%, high at 11% or more. The award is the PY26 chart amount for the fuel, area and burden band ($122 to $1,260), plus $25 when a qualified member is under 6, 60 or older, or disabled ($147 to $1,285). A household qualifies with income at or below the limit (60% of state median income for one to seven members, $32,835 to $85,245 a year; 150% of the 2025 poverty guidelines from eight, $81,225 for eight), SNAP receipt during the program year or SSI receipt by any member, and needs a heating-cost obligation: a bill for its fuel, or has_heating_expense set directly. Heat included in rent is ineligible from FY2026.

Fixes #10610

Regulatory authority

Eligibility

Requirement Source How modeled
Idaho residence IDAPA 16.03.08 200.04 defined_for = StateCode.ID
A qualified member Plan p. 9; 16.03.08 201-202 id_liheap_household_size sums is_citizen_or_legal_immigrant; size 0 fails every route
Income at or below the limit Plan 2.1; DHW table Sizes 1-7: 12 x DHW's monthly 60% SMI figure (shared liheap_smi_limit); 8 and up: 1.5 x the 2025 guideline
SNAP or SSI receipt Plan 1.4a; 16.03.08 200.01, 200.08; 16.04.14 151.01 snap in any month from October through September; any member with annual ssi or receives_ssi
Means-tested VA receipt Plan 1.4; 16.03.08 200.08 Not modeled
TANF Plan 1.4 (No), 1.9 Counted income, not categorical
Heating-cost responsibility Plan 2.3, 2.5; 16.03.08 200.07 Heat in rent (heat_expense_included_in_rent) is read as no specific obligation: ineligible from FY2026, when rent is $0. Otherwise has_heating_expense (a bill for the primary fuel, or the fact set directly) and a modeled heating cost: a chart fuel and a known area. The bill shows the obligation and does not set the amount

Countable income

Item Source How modeled
Earned, members 18 and over Plan 1.8-1.9 Wages, self-employment (self_employment_income, sstb_self_employment_income), farm operations, partnership and S corporation income
Social Security Plan 1.9, "Excluding MediCare deduction" Per person, social_security minus medicare_part_b_premium
Other unearned, all members Plan 1.9 and its Other line SSI, pensions, military_retirement_income, railroad retirement (railroad_benefits), retirement_distributions, survivor benefits, total_unemployment_compensation, strike pay, rental and farm rent, alimony, interest, dividends, trust income (estate_income), private disability (disability_benefits), workers' compensation, gifts and lottery winnings (financial_assistance, gambling_winnings)
TANF Plan 1.9 Take-up-gated tanf, once per household
Nonqualified members 16.03.08 202 Income counted, size not
Not counted Plan 1.9 unchecked Child support, VA benefits, general assistance, earnings of members under 18, miscellaneous_income

Benefit

Step Source How modeled
Heating area Appendix A, p. 2 id_liheap_heating_area from county_str: 10, 20 and 14 counties in Areas I-III; other strings 0
Estimated heating cost Appendix C, p. 1 id_liheap_estimated_heating_cost: electricity or solar $1,335-$1,605, natural gas $977-$1,207, fuel oil, kerosene or propane $1,625-$2,145, wood or coal $1,200-$1,800; other fuels $0
Energy burden PY26 chart, p. 2 Cost over annual countable income: high at 11% or more, medium at 6% or more, otherwise low; zero income is high
Base benefit PY26 chart, p. 1 The chart cell by fuel, area and band: electricity or solar $328-$464, natural gas $122-$173, oil, kerosene or propane $776-$1,260, coal or wood $467-$674
Target bonus Plan 2.4; PY26 chart, p. 2 $25 once if a qualified member is under 6, 60 or older, or is_disabled
Heat in rent FY2025 plan 2.5-2.6; PY25 chart; plan 2.5 rent: $75 plus any bonus in FY2025; $0 and ineligible from FY2026
Minimum and maximum Plan 2.6; PY26 chart, p. 1 $122 is the chart's lowest cell and $1,285 its highest plus the bonus, so no separate limit is applied

Not modeled

Item Source Treatment
A designated heat charge within rent, subsidized or not Plan 2.3; 16.03.08 200.07 No input separates it from bundled heat; heat in rent is ineligible from FY2026
The $30 test on gifts and lottery winnings Plan 1.9; 16.04.14 151.02.f No input: annual amounts count in full
Royalties, jury duty, sales contracts, WIA earnings Plan 1.9 No input counted
Attendant-care wages, lump-sum workers' compensation settlements, TAFI lump sums 16.04.14 151.02.g, i, q Not separated from the inputs that hold them
Lump sums within retirement withdrawals; interest of $30 or less Plan 1.9; 16.04.14 151.02.h Counted in full
Catastrophic-illness exception; tribal households 16.04.14 101.03, 152.03 Not represented

Modeling decisions

  • Limit switch. Plan 2.1 moves from SMI to the guidelines at eight members; the model follows the table, not the larger of the two, so $81,225 for eight is below $85,245 for seven.
  • Limit cents. Limits follow DHW's monthly table ($4,420.08 x 12 = $53,040.96 for three), not Attachment 4's whole dollars ($53,041); the shared helper's inferred flooring order reproduces all seven published SMI cells. Income equal to the limit qualifies.
  • 11% burden. The methodology page puts medium below 11% and high above 11%, leaving exactly 11% unassigned; the 2011 rule (204.03) put it in high. High is 11% or greater (energy_burden/high_rate). Step 4 says the cost is divided into income, but the bands only work as cost over income.
  • Housing. The FY2026 plan (2.3, 2.5) and IDAPA 16.03.08 (200.07, 201) require a direct heating cost or a designated portion of rent and exclude households with no specific heating-cost obligation. FY2025 paid them a $75 base (the PY25 Rent column, $100 with the bonus), which PY26 drops, so rent is $75 for FY2025 and $0 from FY2026. Heat in rent stands for no obligation, plan 2.5's own example, because no input identifies a designated heat charge. A subsidized household paying for heat directly is read as using the general chart, not the PY2008 automatic low band. A household with no bill and no has_heating_expense has no obligation (plan 2.3). IDAPA 16.04.14.152.02, the rule text standing when FY2026 opened, read "undesignated portion of their rent"; 16.03.08's "designated portion" is dated July 1, 2026, and the plan's FY2026 rule is applied to the whole year.
  • County map. Appendix A's complete left-hand table (the right-hand one lists Power twice and omits Elmore). The undated PDF was modified in 2006 and archived in 2017; the 2025-10-01 date records its continuation as a modeling assumption. An omitted county takes the shared Ada County default (Area I).
  • Heating costs. As a modeling assumption, the PY2007 nine-month table at nominal values, with no inflation or 12-month uplift, although the chart calls for an annual cost; FY2026 currentness is unconfirmed. It only sets the burden band: the dollars are the FY2026 chart's. Appendix C's benefit percentages and rent-cost column are unused, and actual bills do not set the cost.
  • Fuels. OTHER has no chart column, so it has no modeled cost and no award. No Idaho source names solar or kerosene: SOLAR reads as electric and KEROSENE as the chart's Oil, inferences that follow heating_expense, which reads their electric and fuel-oil bills.
  • Target bonus. Annual age stands in for age by the end of the program year. Only members counted in size earn it (an inference from plan p. 9's eligible household member).
  • Providers. Electricity uses the Idaho Power & Southern Utilities column; gas uses Intermountain Gas, the only gas column filled in all three areas. These are simplifications, not claims that providers pay alike; no provider input is added.
  • Categorical routes. Any member can establish SNAP or SSI receipt; SNAP is read over the October-September program year, and positive annual SSI (modeled or reported) stands in for current receipt. Categorical households keep their income. A false result is not a legal denial for a means-tested VA household.
  • Income. Annual amounts stand in for prior-month income times 12. Each source is floored at zero per member, so losses offset nothing, and net business inputs get no second expense deduction. The Part B premium cannot reduce other income. Railroad retirement is read as a retirement benefit (plan 1.9); military retirement includes Survivor Benefit Plan annuities. The Idaho AABD supplement is not listed in plan 1.9 and is not counted, which can only move an SSI recipient's burden band. The SPM unit stands in for the household.
  • Gifts and lottery winnings. Plan 1.9's checked Other line counts them "of more than thirty dollars ($30) during the prior month" and IDAPA 16.04.14.151.02.f excludes those "of less than thirty dollars ($30)". The plan's unchecked lump-sum row names "winnings from lotteries". The specific line and the rule are followed.
  • Rule and plan on other income. IDAPA 16.04.14.010.06 defines income as "The gross amount of moneys received by the participant household from all sources", and 151.02 lists only "Monies from VA-GI Bill for Education" among VA, general assistance and minors' earnings. Plan 1.9 leaves all three unchecked, and the plan is followed. IDAPA 16.03.08.202, effective July 1, 2026, leaves countable income "as determined by the Department".
  • Coverage. programs.yaml lists Idaho as partial with no verified year, because the burden bands rest on the PY2007 table. Other years are estimates: period 2025 pays heat in rent at FY2025's $75 but otherwise backfills the PY26 chart.

Microsimulation: heating_type, the fuel bills or has_heating_expense, and heat_expense_included_in_rent are not in current datasets; callers must supply them.

Test plan

57 YAML cases in 8 files. 37 passed locally on 2026-10-20, before the merge of main, the 2026-10-26 fixes (military retirement, railroad, SMI helper, reported SSI), which added income-eligibility Case 9 and countable-income Case 15, and the 2026-11-02 award and its fixes (heating-cost obligation, solar and kerosene, gifts and lottery winnings), which added 18 cases. Those were not run; CI validates them.

  • Household size (4): a nonqualified parent, no qualified member, a foster child, mixed states.

  • Income limit (3): sizes 1 to 11 and 15, size 0, mixed states.

  • Income eligibility (9): the limit to the cent, the SNAP year's edges, SSI (paid or reported) for any member, size 0, TANF, the seven-to-eight switch, zero income.

  • Countable income (16): minors and the 18th birthday, nonqualified wages, every listed and excluded source including railroad retirement, gifts and lottery winnings, per-source floors, monthly SSI and TAFI, net Social Security, an excess premium, unemployment, TANF take-up.

  • Heating area (4) and estimated cost (5): all 44 counties, six fuels by area, solar and kerosene, unknown and omitted counties.

  • Eligibility (4): income eligibility and a modeled cost both required, fuels with no chart column, an unknown county, heat in rent by year, subsidized tenants paying directly, free wood and no gas bill.

  • Award (12): all 36 chart cells, solar and kerosene with bills, burden at exactly 6% and 11% and at zero income, the bonus's age edges and disability, one bonus for several members, none for a nonqualified member, $75 and $100 in FY2025, ineligible households, a parent and child end to end.

  • YAML tests with expected values from the plan, the PY26 chart, DHW's limits, the SMI table, the 2025 guidelines and the historical tables

  • N/A Source-conflict register entry for a statute reading

  • make format

  • Changelog fragment in changelog.d/

  • CI passes

axiom: TheAxiomFoundation/rulespec-us#1996 queued

🤖 Generated with Claude Code

@codecov

codecov Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (b0a8c09) to head (bd947f9).
⚠️ Report is 130 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main    #10613    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            1         8     +7     
  Lines           15       139   +124     
  Branches         0         2     +2     
==========================================
+ Hits            15       139   +124     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Idaho LIHEAP regular heating assistance

PR #10613 (author: hua7450), head bd947f9606. This is a first review. The PR adds Idaho's regular heating benefit for FY2026 (October 1, 2025 to September 30, 2026), administered by DHW through the community action agencies. It includes:

  • 20 parameters and 8 variables under gov.states.id.dhw.liheap;
  • 8 test files with 57 cases;
  • a programs.yaml entry (partial, no verified year) plus ID on the LIHEAP coverage line;
  • a changelog fragment.

There are no reviews yet, and the only comment is Codecov's. No partner test file is touched.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/id/dhw/liheap/
  • V/ = policyengine_us/variables/gov/states/id/dhw/liheap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/id/dhw/liheap/

Sources read for this review:

Summary

What is right. The chart, the county map and the cost table are transcribed faithfully, and the structure follows the PY26 methodology:

  • Chart. All 36 encoded cells equal the Idaho Power & Southern Utilities, Intermountain Gas, Oil or Propane and Coal or Wood columns of the PY26 chart. The $25 target bonus reproduces the printed $147 minimum and $1,285 maximum.
  • County map and costs. All 44 counties match Appendix A's left-hand table, and all 12 cost cells match Appendix C.
  • Burden bands. The bands follow the methodology page. Exactly 11% is placed in high, a documented gap-fill backed by the 2011 rule.
  • Categorical routes. SNAP in the October-September program year and SSI by any member follow plan 1.4a. TANF is counted but not categorical.
  • Countable income.
  • Tests and CI. Every list entry and branch is pinned by a positive test. CI is green (36/36), and the merge with main is clean.

One critical finding. At sizes 2 and 6, DHW's cent-rounded monthly limits annualize to $0.04 above HHS's mandatory 60% SMI figures, and the head follows them. This is the WY #10346 C2 / ND #10342 C1 / WV #10618 C1 pattern at its smallest.

Four should-address items:

  • S1. Heat-in-rent households are ineligible for all of FY2026. IDAPA 16.04.14.152.02, in force for the whole heating season, makes households paying through "an undesignated portion of their rent" eligible. The choice has no source-conflict record.
  • S2. VA benefits, general assistance and minors' earnings are excluded on plan 1.9's unchecked boxes. IDAPA 16.04.14.010.06 counts income "from all sources", and 151.02's closed list doesn't exclude them. This choice has no record either.
  • S3. military_basic_pay is not counted.
  • S4. One parameter description is off the house template.

Four suggestions (G1-G4): the Idaho AABD supplement (item 17), provider columns, a designated heat charge within rent, and housekeeping.

Critical

C1. The size-2 and size-6 limits are $0.04 above the federal ceiling.

Where. V/eligibility/id_liheap_income_limit.py:29 rounds liheap_smi_limit / 12 to the cent, and :39-43 multiplies it back by 12. T/eligibility/id_liheap_income_limit.yaml:123 pins 42,938.04 (size 2) and 83,351.04 (size 6).

The law. Payments may go only to households "with incomes which do not exceed the greater of (i) an amount equal to 150 percent of the poverty level for such State; or (ii) an amount equal to 60 percent of the State median income" (42 U.S.C. 8624(b)(2)(B)). HHS publishes the size-adjusted amounts as "Mandatory Use in LIHEAP for FY26". For Idaho they are $32,835; $42,938; $53,041; $63,145; $73,248; $83,351 (Attachment 4, page 1) and $85,245 for seven (page 4).

What goes wrong. DHW prints monthly limits in cents: $2,736.25, $3,578.17, $4,420.08, $5,262.08, $6,104, $6,945.92 and $7,103.75. Two of them round up:

  • 42,938 / 12 = 3,578.1667, which rounds to $3,578.17; × 12 = $42,938.04.
  • 83,351 / 12 = 6,945.9167, which rounds to $6,945.92; × 12 = $83,351.04.

At sizes 3 and 4 DHW's figures round down ($53,040.96 and $63,144.96). A lower limit is allowed, so those are fine. For sizes 8 and up, 150% of the guideline is below 60% SMI and is exact in cents.

Hand example. FY2026, two adults aged 40, wages $42,938.02, natural gas with a bill, Ada County:

  • The head finds the unit income-eligible (42,938.02 ≤ 42,938.04).
  • The burden is 977 / 42,938.02 = 2.3%, so the band is low, and the head pays $122.
  • The federal maximum is $42,938, so the result should be $0.

A six-member unit at $83,351.03 is the same case.

Severity. The excess is four cents a year, but the wave rates any limit above HHS's mandatory figure as critical:

Period 2027, an unclaimed estimate, has the same excess at sizes 2 and 6: SMI $109,072 gives $44,501.04 and $86,384.04.

Fix:

  • Cap the limit. Use min_(monthly_smi * MONTHS_IN_YEAR, annual_smi) in the SMI branch. This keeps DHW's figures where they are lower (sizes 3 and 4) and caps sizes 2 and 6 at Attachment 4.
  • Update and pin.
    • Change id_liheap_income_limit.yaml Case 1 to 42,938 and 83,351.
    • Add an income-eligibility case at $42,938.02 for two members that expects false.
  • Record the choice. Add a us-id: candidate with follows: statute (as ND recorded us-nd:liheap-table-above-federal-ceiling), and mark the deciding line # Source conflict us-id:<id>.
  • Update the text. Revise the body's "Limit cents" bullet and the Axiom issue's limit rows (companion tests 2, 5, 6 and 19 quote 42,938.04).

Should address

S1. Heat-in-rent households are made ineligible for all of FY2026, against the rule in force for the whole heating season, with no record.

Where.

  • V/eligibility/id_liheap_eligible.py:29-31 returns p.rent > 0 when heat_expense_included_in_rent.
  • P/payment/rent.yaml is $0 from 2025-10-01.
  • T/eligibility/id_liheap_eligible.yaml Case 2 and T/id_liheap.yaml Case 10 pin $0.
  • source_conflicts/candidates.yaml is not touched.

Sources:

  • IDAPA 16.04.14.152.02 (effective April 6, 2023): "Living Situations. The household resides in housing where they are responsible for home energy costs and incur the costs either directly or as an undesignated portion of their rent."
  • IDAPA 16.04.14.010.08.b: a participant household includes individuals who "make undesignated payments for energy in the form of rent."
  • FY2026 plan. Item 2.5 Other (page 9): "Household with no specific heat cost obligation (included in rent, rent subsidized) will not be eligible to a LIHEAP benefit." Item 2.3 (page 8) answers Yes for "Renters with utilities included in the rent", requiring "Verification that household has a financial responsibility for heating costs". The explanation (page 9) reads: "The household must pay for home heating costs, either directly or through rental costs."
  • IDAPA 16.03.08.200.07: the replacement rule, "either directly or as a designated portion of their rent", carries the date mark (7-1-26).
  • Heating dates. Plan 1.1 (page 4) runs heating assistance from 10/01/2025 to 03/31/2026, so the whole heating component fell under 16.04.14.

Why it is a finding.

  • The PR knows this. The body says that 152.02 "read 'undesignated portion of their rent'" and that "the plan's FY2026 rule is applied to the whole year", and Axiom interpretation 8 says 16.04.14 "governed October 2025 to June 2026".
  • So the code takes the plan's reading over a binding rule for the whole season. The wave rates a manual- or plan-over-rule choice without a state: ruled record as should (MT, UT, AK r2 S1, PA S2, CO Add Colorado LEAP regular heating assistance #10609 S1).
  • The checklist also treats eligible dwellings paid $0 as should.

Effect. FY2026, one person aged 65, Social Security $15,000, natural gas heat included in rent, Ada County:

  • The head finds the household ineligible and pays $0.
  • Under 152.02 the household is eligible. The PY26 chart dropped the PY25 Rent column, so no printed amount applies. The FY2025 practice (plan 2.5, "will receive the minimum benefit") would point to plan 2.6's $122, plus the $25 bonus at 65, so $147.

Fix (either):

  • (a) Keep the code and get a ruling. Add a us-id:liheap-heat-in-rent-fy2026 candidate quoting 152.02, 010.08.b, plan 2.3 and 2.5, and 200.07 with its date. The basis could be that the accepted plan and the PY26 chart, which has no rent amount, show DHW stopped paying these households. Record it as state: ruled.
  • (b) Follow the rule. For October 2025 to June 2026, make heat-in-rent households eligible. Pay them the chart minimum (or their fuel's cell), and pin it.

Either way, update the body, the id_liheap_eligible.py reference (it cites only 16.03.08) and Axiom interpretations 8 and 14.

S2. VA benefits, general assistance and minors' earnings are excluded on the plan's check boxes, against the rule in force for most of FY2026, with no record.

Where.

  • P/income/sources/unearned.yaml omits veterans_benefits and general_assistance.
  • V/income/id_liheap_countable_income.py:24 and :38 drop earnings under 18.
  • T/income/id_liheap_countable_income.yaml Cases 1 and 8 pin the exclusions.

Sources:

  • IDAPA 16.04.14.010.06: "Income. The gross amount of moneys received by the participant household from all sources."
  • IDAPA 16.04.14.151.02: "Income listed in Subsections 151.02.a. through 151.02.t. is not counted". Among VA payments the list names only "k. Monies from VA-GI Bill for Education". It names no general assistance and no earnings of minors. It does exclude "t. Child support income", which the head also excludes.
  • Plan 1.9 (page 6) leaves "General Assistance benefits", "Veterans Administration (VA) benefits" and "Earned income of a child under the age of 18" unchecked.
  • From July 1, 2026, 16.03.08.202 counts gross income "as determined by the Department", which supports the plan's reading for the last quarter only.

Why it is a finding.

  • The body says so in its "Rule and plan on other income" bullet ("Plan 1.9 leaves all three unchecked, and the plan is followed"), as does Axiom interpretation 10.
  • But nothing records the choice. That is the same pattern as S1.
  • Sibling states recorded their plan-checklist choices (us-la:, us-mn: and us-nm:liheap-plan-income-checklist, state: ruled). AK r2 S1 kept a should open while the record was only open.

Effect (FY2026, natural gas with a bill, Ada County):

  • A veteran aged 45 with $35,000 of VA disability compensation and no other income. The head counts $0, so income is zero and the band is high, and it pays $132. Under 010.06 the $35,000 is counted, which is above $32,835, so the household gets $0.
  • A parent aged 40 with wages $36,000 and a child aged 17 with wages $8,000. The head counts $36,000, within the $42,938 limit, and pays $122. Under the rule, $44,000 is counted, so the household gets $0.

Fix (either):

  • (a) Follow the rule for FY2026. Count veterans_benefits, general_assistance and minors' earnings, and change Cases 1 and 8. id_aabd would follow from the same reading; see G1.
  • (b) Record the plan reading. Add a us-id:liheap-plan-income-checklist candidate with both readings and the 16.03.08.202 delegation, and get it ruled.

Update the body and Axiom interpretation 10 to match.

S3. military_basic_pay is not counted.

Where. P/income/sources/earned.yaml:4 lists employment_income but not military_basic_pay. On main, military_basic_pay is a separate person input that employment_income doesn't include.

Rule.

  • Plan 1.9 checks "Wages" (page 5).
  • 16.04.14.010.06 counts all sources, and no 151.02 exclusion covers service pay; k excludes only GI Bill education money.

Example. FY2026, one person aged 30 with $36,000 entered as military_basic_pay, natural gas with a bill, Ada County:

  • The head counts $0, so income is zero and the band is high, and it pays $132.
  • Counted, $36,000 is above $32,835, so the household gets $0.

Precedent. This is the wave's omitted-source should (UT, AK, PA, WV #10618 S1, CO #10609 S3). The IA, ND, NV and UT lists on main carry military_basic_pay next to employment_income, with the note to enter basic pay in only one of the two.

Fix.

  • Add military_basic_pay after employment_income, with the Utah comment.
  • Give it a distinct amount in a countable-income case, for example $500 in Case 5, giving 24,500.
  • Update the body's earned row and the Axiom issue's earned sources (6).

S4. One parameter description is off the house template.

P/eligibility/program_year_start_month.yaml:1 reads "Idaho begins the Low Income Home Energy Assistance Program year, used to establish categorical SNAP receipt, in this month of the preceding calendar year." The template puts the program name last, with no trailing clause (NJ S6; MN #10433 S3). The other 19 descriptions follow it.

A fix: "Idaho starts the program year, used to test SNAP receipt, in this month of the preceding calendar year under the Low Income Home Energy Assistance Program."

Suggestions

G1. Item 17: the Idaho AABD supplement.

  • On main. main has id_aabd (a monthly person variable, up to $53 a month for a single person), counted in SNAP's unearned list. Plan 1.9 doesn't name it, and the body leaves it out, which it says "can only move an SSI recipient's burden band". That is true for SSI recipients.
  • Under the rule. 16.04.14.010.06 counts all sources for most of FY2026, and 151.02 doesn't exclude it.
  • Example. One person aged 65 with SSI $11,600 and AABD $636 a year, electric heat, Ada County:
    • The head's burden is 1,335 / 11,600 = 11.5%, so the band is high: $355 + $25 = $380.
    • With AABD the burden is 1,335 / 12,236 = 10.9%, so the band is medium: $342 + $25 = $367.
  • Fix. Add id_aabd with S2(a), or name it in the S2(b) record.

G2. Provider columns.

  • Award. The head pays Intermountain Gas and Idaho Power for every household, a documented simplification. The PY26 chart pays Avista gas customers more in Areas I-II ($168-$183 and $194-$211, against $122-$132 and $141-$152). It pays Rocky Mountain Power customers more in Areas II-III ($407-$441 and $461-$500, against $378-$410 and $429-$464).
  • Cost table. Appendix C also gives Avista gas and Northern/Utah Power different costs (875 and 1,200; 1,450 and 1,585; 1,692 and 1,836).
  • Fix. An optional vendor input (an enum defaulting to today's columns) would cover these households. For gas, a county default is close: Avista's Idaho gas territory is the northern counties, which is why its Area III column is blank.

G3. A designated heat charge within rent. From July 1, 2026, 200.07 makes such households eligible. The body notes there is no input for it. But has_heating_expense already documents setting the fact directly, and id_liheap_eligible ignores it when heat is in rent. Routing heat_in_rent & has_heating_expense to the chart path would cover it without a new input. It would also give S1(b) a switch.

G4. Housekeeping.

  • Test status. The test plan says the newest cases "were not run; CI validates them" and leaves "CI passes" unchecked. CI passed all 57 cases at this head.
  • Unreachable floors. Three floors can't change a result through ordinary inputs (as in CO Add Colorado LEAP regular heating assistance #10609 G5). Delete them or say why they stay:
    • max_(medicare_part_b_premium, 0) at V/income/id_liheap_countable_income.py:30;
    • max_(tanf, 0) at :39;
    • max_(size, 1) in the guideline call, since size 0 returns 0 anyway.
  • Reference. P/payment/rent.yaml's PY25 chart reference has no #page=1 anchor.

Verified correct

  • Limits.
    • Plan 2.1 uses 60% SMI for sizes 1-7 and 150% of the guideline from 8. I read this from the page 8 render, since the text layer misplaces it.
    • liheap_smi_limit with SMI $105,243 reproduces Attachment 4 at every size.
    • Sizes 8 and up use 1.5 × the 2025 guideline: $81,225, $89,475, $97,725 and $105,975, plus $8,250 per member, matching DHW's $6,768.75 + $687.50.
    • The 7/8 switch follows the table, not the larger amount, which is lawful (the larger of the two is only a ceiling).
    • Every limit is far above the 110% floor.
    • The size-0 guard is pinned (id_liheap_income_limit.yaml Case 2; income-eligibility Case 4).
  • Categorical routes.
    • Plan 1.4: TANF No, SSI Yes, SNAP Yes, means-tested VA Yes. The plan, 151.01 and 200.08 agree.
    • The SNAP window is October 2025 to September 2026, pinned at both edges (income-eligibility Case 2).
    • Reported receives_ssi counts (Case 9).
    • The unmodelled VA route is documented.
  • Countable income.
    • Plan 1.8 is gross income.
    • The 1.9 boxes match the lists: wages, self-employment and contract income, UI (total_unemployment_compensation), strike pay, SSA "Excluding MediCare deduction", SSI, retirement and pension benefits (pension_income, military_retirement_income, railroad_benefits, retirement_distributions, survivor_benefits), TANF, rental income, alimony, and interest and dividends.
    • The Other line counts annuities, private disability, trust income, workers' compensation, and gifts or lottery winnings over $30.
    • Child support is excluded (1.9 unchecked; 151.02.t).
  • Medicare. Social Security is netted of the computed, MSP-net medicare_part_b_premium per person and floored, so the premium can't reduce other income (Case 12). Part B only is right for a check deduction: Social Security recipients have premium-free Part A under 42 U.S.C. 426(a) (the IA Add Iowa LIHEAP regular heating assistance #10292 reading).
  • Losses. Each source is floored per member: business losses (Case 6), a rental loss against a pension (Case 11) and negative UI (Case 13).
  • Heating responsibility. Outside heat in rent, has_heating_expense and a modeled cost are both required (plan 2.3). Subsidized tenants paying directly use the general chart, and free wood or no bill fails (id_liheap_eligible.yaml Cases 2 and 4).
  • Fuels.
  • Chart, map and costs. All 36 cells match the PY26 chart columns named in the parameter comments; I checked the page render. All 44 counties match Appendix A page 2, by county code 1-44. All 12 costs match Appendix C page 1. Its anchors (#page=2, #page=1) show the values.
  • Award.
    • The bands use cost ≥ income × rate, so exactly 6% is medium and exactly 11% is high, as documented. Zero income is high.
    • The $25 bonus is paid once, only for a qualified member, at ages under 6 or 60 and over, or with a disability.
    • FY2025 heat in rent pays $75 and $100 (FY2025 plan 2.5-2.6; PY25 Rent column).
    • No baseline path goes negative. The PY26 minimum and maximum are the chart's own extremes.
  • Mutation. All 5 earned and 18 unearned entries carry distinct nonzero amounts (countable Cases 4, 5, 10, 11, 15 and 16). Every eligibility and award branch is pinned. The only unpinned code is the unreachable floors in G4.
  • NH Add New Hampshire state supplementation for 2026 #10156 pattern. The pattern is safe. id_liheap_heating_area (state-gated int, default 0) is clipped to 1-3 before every parameter lookup, and the size is used only arithmetically. Mixed-state rows (OR, CA, CO, WA) pass in CI.
  • main-side guards:
  • Wiring and housekeeping:
    • defined_for = StateCode.ID throughout;
    • no household aggregate, consistent with the merged siblings;
    • the programs.yaml entry is partial with no verified year, consistent with the PY2007 cost assumption;
    • the changelog fragment is top-level added.

Hand-checked expectations (12):

Case Arithmetic Expected
id_liheap_income_limit 1 floor(105,243 × .6) = 63,145; × .52/.68/.84/1/1.16/1.32/1.35, floored: 32,835 … 85,245; / 12 to the cent, × 12; size 8+: 1.5 × (15,650 + 5,500(n − 1)) 32,835; 42,938.04; 53,040.96; 63,144.96; 73,248; 83,351.04; 85,245; 81,225 … 138,975 ✓ (the head's arithmetic; see C1)
id_liheap 1 Electric: 1,335 / 40,000 = 3.3% low; / 16,000 = 8.3% medium; / 8,000 = 16.7% high; Areas II-III 1,455 and 1,605 likewise 328, 342, 355; 378, 394, 410; 429, 447, 464 ✓
id_liheap 3 Oil Ada 1,625 / 20,000 = 8.1%; propane Bannock 1,845 / 20,000 = 9.2%; oil Bear Lake 2,145 / 20,000 = 10.7%, all medium; 2,145 / 40,000 = 5.4% low 808, 1,010, 1,212; 776, 970, 1,164 ✓
id_liheap 5 1,455 / 24,250 = 6% medium; 24,251 low; 1,100 / 10,000 = 11% high; 10,001 medium; 0 high 394, 378, 152, 147, 152 ✓
id_liheap 6 Ada gas low 122; ages 5 and 60 and disabled +25; ages 6 and 59 none; Bear Lake oil 2,145 / 8,000 high, 1,260 + 25 147, 122, 122, 147, 147, 1,285 ✓
id_liheap 9 FY2025 rent 75; age 60 +25 75, 100 ✓
id_liheap 11 Bannock gas 1,100 / 18,000 = 6.11% medium; no vulnerable member 147 ✓
id_liheap 12 Solar 1,335 / 16,000 = 8.3% medium; kerosene 1,625 / 20,000 = 8.1% medium 342, 808 ✓
countable 4 12,000 + 1,200 + 3,700 + 500 + 2,400 + 300 + 600 + 700 + 400 + 200 + 250 + 800 + 900 + 1,000 24,950 ✓
countable 11 Military 40,000 > 32,835; Social Security 34,000 − 2,400 = 31,600 ≤ 32,835; pension 34,000 + max(−10,000, 0) 40,000/31,600/34,000; false/true/false ✓
countable 14 40,000 + TAFI 6,000 = 46,000 > 42,938.04; without take-up 40,000 46,000 false; 40,000 true ✓
id_liheap_eligible 1 Gas eligible; income-ineligible; SOLAR and KEROSENE with costs 1,335 and 1,625; OTHER, NONE, UNSPECIFIED and an unknown county cost 0; the Oregon row is masked true, false, true, true, false × 5 ✓

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1996 queued.

State of the issue. The issue is OPEN, labelled pe-parity, and was updated 2026-11-02 16:59 UTC.

  • Dispatch-ready. It states the blockers and gives module paths with corpus status, including the needed ingest of 16.04.14, the PY26 chart, the DHW limits and Attachment 4. It quotes the plan, both rule editions, the chart, the DHW page and the historical appendices verbatim, from renders for the check boxes. It sets Required outputs for all eight variables and 20 companion tests drawn from those sources rather than from PolicyEngine output.
  • Matches the head. It names f0899ba59a. The Idaho files are identical at bd947f9606, which only merges main. Its 5 earned and 18 unearned sources, 57 cases and award formula match.

Updates needed with the fixes:

  • C1: the cap, a statute interpretation, and companion tests 2, 5, 6 and 19 (42,938.04 becomes 42,938).
  • S1 and S2: interpretations 8, 10 and 14, and any rows that change.
  • S3: military_basic_pay.

CI status

gh pr checks 10613 at head bd947f9606 (run 41500831702, pull_request, started 2026-11-02 18:27 UTC; it includes main through 4bfc548de3). I re-checked it at the end of this review: 36 pass, none pending or failing.

Coverage includes:

  • all Baseline shards, including the four state shards that run the Idaho YAML;
  • all Contrib shards;
  • Rest Python shards 1-7 and Microsimulation;
  • PR validation (guard tests), Household API Partners, Package and compatibility, and Quick Feedback;
  • Codecov (patch and project).

I ran no tests locally; CI covers every file at this head.

Branch status

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes: 1 critical (the size-2 and size-6 annual limits are $0.04 above the 42 USC 8624(b)(2)(B) ceiling; cap at the federal maximum as in ND/WV), 4 should (heat-in-rent eligibility under IDAPA 16.04.14.152.02 through June 2026; VA, general assistance and minors' earnings excluded against 16.04.14; military basic pay not counted; one description off-template). Full report in the comment above.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Idaho LIHEAP regular heating assistance

2 participants