Repository navigation
Add Utah LIHEAP regular heating assistance - #10344
Conversation
One added changelog fragment for the new program and a one- or two-sentence programs.yaml note; limitations stay in code comments and the PR body. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #10344 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 9 +5
Lines 76 165 +89
Branches 2 2
=========================================
+ Hits 76 165 +89
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Add Utah LIHEAP regular heating assistancePR #10344 (author: hua7450), head
The PR has no reviews and no comments apart from Codecov. It touches no partner test file. Path prefixes:
Sources read for this review:
SummaryWhat is right. The tables and benefit mechanics are encoded carefully:
There is one critical finding:
There are five should-address items:
There are also six suggestions:
Status.
Critical (must fix)C1. Earned income is counted in full, although Utah Admin. Code R982-403-6(1) disregards 20% of it and DWS's own March 2026 worksheet applies the disregard
Should addressS1. Medicare premiums are deducted only when a reported premium is supplied, so an enrollee's Part B premium is ignored by default, and a test pins it
S2. Military basic pay is not counted, although section 403 and R982-403-4(2)(a) count military base pay
S3. R982-403 differs from the manual in three more places, and none is recorded; dividends are counted against both the rule and the plan
S4. A household with no heating that pays an electric bill gets $0, although HEAT is one year-round benefit keyed to the household's primary energy source
S5. Eleven of the 24 income-source entries, and five eligibility branches, have no test that would fail if they were removed
SuggestionsG1. Item 17:
G2. Kerosene's $150 credit.
G3.
G4. References.
G5. Periods outside March to September 2026 (unclaimed and documented).
G6. Merge housekeeping.
Verified correctHand-checked expectations (45; all match the head, though C1 and S1 change several of them):
Batch checks:
Axiom line assessment
CI status
Branch status
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes: 1 critical (no 20% earned-income disregard, which Utah Admin. Code R982-403-6(1) requires and DWS's March 2026 worksheet applies), 5 should. Full report in the comment above.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml # source_conflicts/candidates.yaml
|
Thanks for the review, David. The fixes are in 3e16d52, and b06ffa0 merges current main.
The PR body and TheAxiomFoundation/rulespec-us#1904 are updated for b06ffa0. I did not run the tests locally, so CI will check them. |
PR Review (round 2): Add Utah LIHEAP regular heating assistancePR #10344 (author: hua7450), head
The author answered item by item and updated the PR body and rulespec-us#1904. The PR touches no partner test file. Path prefixes:
SummaryFixed. The fix commit resolves every round-1 critical and should item. A test would fail without each fix:
Suggestions. The author adopted G1, G2, G3 and G6, did G4 apart from Wayback captures (none exist), and documented G5. Hand checks and guards.
One new should-address item. It is a side effect of the S4 fix.
Two new suggestions:
Status.
Prior findings
New findingsCriticalNone. Should addressN1. The S4 fix leaves the two guards that keep households without a cost standard at $0 unpinned
SuggestionsG-a. Medicare Savings Program category wording.
G-b. Military basic pay in one input only.
VerifiedHand checks (every new or changed expectation; all match the head):
Batch checks:
Axiom
CI
Branch
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes, round 2: 0 critical, 1 should. Every round-1 item is fixed. One new should: the NONE electric-bill condition and the supported_fuel guard can be deleted without any test failing (pin them with a standard-0 output on eligibility Case 8 and one UNSPECIFIED heat-in-rent case). Full report in the comment above.
Eligibility Case 8 now outputs the zero standard for a NONE household with no electric bill, and new Case 18 pins the zero standard and ineligibility for an UNSPECIFIED household with heat in rent. Correct the Medicare Savings Program category in countable Case 23 (SLMB) and note that military basic pay belongs in one input only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, David. The round-2 items are in 97a8f48, and 51d1166 merges current main.
I did not run the tests locally, so CI will check them. |
PR Review (round 3): Add Utah LIHEAP regular heating assistancePR #10344 (author: hua7450), head
The author answered item by item and updated the PR body and rulespec-us#1904. The PR touches no partner test file. Path prefixes:
SummaryFixed. N1 is fixed: each of the two guards now has a test that fails if the guard is deleted.
Suggestions. G-a and G-b are adopted, in the code comments, the PR body and Axiom interpretation 13. Unchanged since round 2. The fix commit changes no formula, parameter value or other expectation. The merge brings in only #10280 (CTC filer identification, which touches Utah's income-tax CTC, not HEAT) and a version bump. So the round-1 and round-2 verifications still hold. Checks.
New findings. No critical or should-address items. One optional wording suggestion (G-c). CI. At Prior findings
All round-1 items (C1, S1-S5, G1-G6) stay fixed. The fix commit edits only the two test files and one parameter comment, and the merge changes none of the PR's own files. New findingsCriticalNone. Should addressNone. SuggestionsG-c. Case 18's comment reads as a legal conclusion (optional).
VerifiedHand checks (every new or changed expectation; all match the head):
Mutation summary (N1):
Other checks:
Axiom
CI
Branch
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Approving round 3: 0 critical, 0 should. N1 is fixed and both guards are now pinned. Full report in the comment above. Branch note: #10345 (WA) merged, so programs.yaml now conflicts; keep WA and add UT, then rerun CI before merging.
Adds Utah's LIHEAP regular heating benefit, the Home Energy Assistance Target (HEAT) program, under the rules in effect from March 1, 2026. The model counts citizens and eligible noncitizens for household size, counts the gross income of members aged 18 and over (other than 18-year-old students) with 20% of earned income disregarded, less paid medical costs (including Medicare premiums) and support, tests it against 150% of the 2026 poverty guideline, and pays $250 minus the percent of poverty plus $10 for each energy-burden point from Utah's fuel and dwelling cost standards, adds $150 for a target-group member and $150 for propane, kerosene or fuel oil heat, with no floor or ceiling on the sum. In 2026, a 40-year-old living alone in a house heated with natural gas, with $15,960 of wages, receives $370: countable income is $15,960 x 0.8 = $12,768, or $1,064 a month; $1,064 / $1,330 = 80% of poverty gives $250 - 80 = $170; the $211 gas-house standard / $1,064 = 19.83% rounds to 20 points x $10 = $200; and $170 + $200 = $370.
Fixes #10338
Regulatory authority
Sections 607 and 608 are cited at their live URLs, whose content changes when DWS re-issues the tables. The Wayback Machine's CDX index has no capture of either page or of the standalone 608 PDF, so no archived copy is linked.
Eligibility
defined_for = StateCode.UTut_heat_eligiblerequires a member aged 18 or older; emancipated minors are not identifiedut_heat_eligible_personaccepts citizens, lawful permanent residents, refugees, asylees, people with deportation withheld and Cuban or Haitian entrants. Conditional entrants and people paroled for at least one year also need five years since entry (years_since_us_entry) or a veteran or active-duty connection (is_veteran,is_military) through themselves, a spouse in their marital unit or, for a dependent child, a parent. Undocumented, DACA and TPS members are ineligible.ut_heat_household_sizeaddsut_heat_eligible_personover the SPM unit; a unit with no eligible member is ineligibleut_heat_fpgreads the poverty guideline with no lag (the 2026 guideline for the March 2026 rules) for the eligible household size, andut_heat_income_limitapplies the 1.5 rate; the comparison is inclusive. For one person, $15,960 x 1.5 = $23,940 a year, or $1,995 a month.has_heating_expense,heating_expenseorpre_subsidy_electricity_expense), pays for heat through unsubsidized rent (heat_expense_included_in_rent), or heats with wood, which covers the manual's self-supplied firewood. A household in subsidized housing (receives_housing_assistanceoris_in_public_housing) qualifies only with a directly paid bill.pre_subsidy_electricity_expense> 0) take the electricity row. A NONE household with no electric bill is not connected to an energy source (section 208) and is ineligible; UNSPECIFIED pays nothing. Eligibility Cases 8 and 18 pin both zero standards.Countable income
is_in_k12_schooloris_in_secondary_school). Section 405 excludes all income of these members; R982-403-5(1) excludes only an unemancipated member's earned income. The model follows section 405 (candidateus-ut:heat-child-unearned-income).earned_income_sources.yaml):employment_income,military_basic_pay, self-employment (including SSTB), farm operations, partnership or S corporation, rental and farm rental income, each floored at zero. The model disregards 20% of the sum (earned_income_disregard.yaml). Basic pay entered asmilitary_basic_payshould not also be inemployment_income.military_retirement_income), retirement account distributions, survivor benefits, veterans benefits, unemployment compensation (total_unemployment_compensation), workers' compensation, disability benefits, strike benefits, cash gifts from outside the household (financial_assistance), alimony, child support received, estate and trust income (trust payments, R982-403-3(2)(h)), and gambling winningsut_ssp), SNAP, interest, ordinary dividends and student aid are left out of the source lists. R982-403-5(12) and plan section 1.9 both exclude dividends. R982-403-3(2)(l) and (n) count DWS payments and TANF; the model follows section 405 and the plan (candidateus-ut:heat-tanf-dws-payments).medical_expense_health_insurance_premiums(a nonzerohealth_insurance_premiumsinput; otherwise non-Medicare premiums plus the modeled Part B premium for enrollees, net of Medicare Savings Program coverage),pre_tax_health_insurance_premiums,medicare_part_a_premiumandother_medical_expenses, each floored at zero except Part A. The model does not readmedicare_part_b_premiums_reported; a caller with a different premium entershealth_insurance_premiums.child_support_expenseplusalimony_expense; countable income is floored at zeroBenefit
ut_heat_dwelling_typeinput (HOUSE for single-family homes, mobile homes, basement apartments and duplexes; APARTMENT for complexes of three or more units, condominiums, townhouses and small trailer homes) defaults to HOUSE.is_disabled). Ineligible noncitizens do not earn the credit.heating_expenseonly shows responsibility.Years covered
The registry entry records
verified_years: "2026". The annual 2026 period stands for the March 1, 2026 rules. Periods outside March to September 2026 use the March 2026 values: January and February 2026 fell under the October 2025 to February 2026 rules, which used the 2025 guideline and a $300 income base (the obsolete section 607), and October to December 2026 fall under the manual revisions effective October 1, 2026. Neither window is modeled. Parameters carry their source effective dates and the formulas are undated, so values backfilled to earlier years are unverified estimates.Not modeled and source conflicts
=B8*0.2, labeled "20% disregard"; total income B11,=B8+B9-C8-B10) and the FY2026 Clearinghouse workbook all disregard 20% of earned income, and the model applies the disregard. The worksheet's print area is A1:B67, so its PDF copy omits column C. Candidateus-ut:heat-earned-income-disregard(follows: statute) keeps one open question: section 406 marks income disregards no longer applicable from September 30, 2023, and sections 401 and 603 describe countable income without naming a disregard. A one-person household with $27,000 of wages heating a house with natural gas receives $234 with the disregard and $0 without it.us-ut:heat-tanf-dws-paymentsandus-ut:heat-child-unearned-income(follows: conflicting-source,state: open). Where the rule and the plan agree, the model follows them: neither counts ordinary dividends.# Source conflictmarker; the three regulation-versus-manual questions above are recorded as candidates.immigration_statusvalue.years_since_us_entrystands for years in qualified status, andis_veteranandis_militarydo not distinguish honorable discharge or National Guard duty.partnership_s_corp_incomedoes not separate.Test plan
policyengine_us/tests/policy/baseline/gov/states/ut/dwf/heat/(ut_heat.yaml54,ut_heat_countable_income.yaml25,ut_heat_eligible.yaml18,ut_heat_eligible_person.yaml18,ut_heat_household_size.yaml2,ut_heat_income_limit.yaml5); expected values are hand computed from the rule, the manual, the March 2026 worksheet and the plan in case comments. The review fixes were not run locally; CI runs the full suite.# Source conflict <jurisdiction>:<id>marker: not applicable; this PR adds no marker, and no statute is on either side of the disagreements listed above. Three regulation-versus-manual questions are recorded as backlog candidates insource_conflicts/candidates.yaml:us-ut:heat-earned-income-disregard(the model follows the rule), andus-ut:heat-tanf-dws-paymentsandus-ut:heat-child-unearned-income(the model follows the manual and the plan).make formatchangelog.d/axiom: TheAxiomFoundation/rulespec-us#1904 queued
🤖 Generated with Claude Code