Repository navigation
Conversation
Sum each state's regular LIHEAP payment in a new liheap variable, add an Illinois regular heating payment without crisis assistance, add a Michigan Home Heating Credit registry entry, and record each state's cooling treatment in its registry note. 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>
Add regular_payments.yaml to the aggregate-list integrity test, which checks that each member exists, is state-gated and is not dropped between year blocks. Say that Rhode Island plans no regular cooling payment, since its FY2027 plan still allows a leftover-funds cooling grant. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Guide section 3.6 E.1 pays these renters; the subsidized energy-cost gate still applies. Adds the allowance-equals-bill boundary, an in-rent renter case, and the national liheap total check. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The national `liheap` total evaluates every state's formula over a mixed-state population, which no household test does. Two patterns on main raised errors there: - 26 formula files passed options=[ADD] to an entity call. Core's Microsimulation.calculate_add rejects the keyword an entity call passes. The option is redundant: a plain read already sums a monthly variable over the year through the same Core function. - The DC and Illinois payment formulas look up a matrix by an income level that is 0 for households outside the state. Add the floor Maryland and Kansas already use. Also: - Reword the North Dakota registry note: the state reserves an optional direct cooling payment, so its cooling component is not only equipment. - Add a `liheap` case with Texas, DC and Illinois households in one simulation. - Add a code-health check against options=[ADD] and options=[DIVIDE]. - Check that every state payment in the LIHEAP registry entry is in the list `liheap` sums. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
PolicyEngine/policyengine-core#647 fixes the cause in Core: it lets a Microsimulation accept the keyword an entity call passes with options=[ADD] or options=[DIVIDE]. Once that is released the option works again, so a check that bans it here would be wrong. The 26 formula files stay without the option, which was redundant and lets `liheap` run on today's Core. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ogram prefix Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Add Louisiana LIHEAP regular cooling assistanceReviewed at head Sources used:
SummaryThe core of the PR is right. Louisiana pays a regular cooling benefit that is separate from heating, a household can get one of each in a program year, and both come from the one FFY2026 matrix, so adding Two things need a change before merge. The cooling test excludes an UNSPECIFIED heating type on a claim that is not true of Louisiana's own heating variable, and that exclusion zeroes the new utilities-in-rent route for the very input the 0 critical, 2 should, 6 suggestions. Critical (must fix)None. Should address1. The UNSPECIFIED exclusion has no Louisiana source, is described inaccurately, and defeats the utilities-in-rent route
# A home with no heating or any known heating fuel qualifies; an
# unspecified fuel is paid $0, as in every LIHEAP program (#9754).
heating_type = spm_unit("heating_type", period)
fuel_known = heating_type != heating_type.possible_values.UNSPECIFIEDThe body repeats it: " The claim is wrong for Louisiana. No Louisiana text ties cooling to the heating fuel. The matrix has two inputs, "Energy Burden Percent" and "Household Size". Guide section 3.6 (p. 33) lists the requirements for "the LIHEAP Heating/Cooling regular benefits" and none is a heating fuel. Section 4.1 (p. 43) says "The primary source of energy for cooling is electricity". Heating needs a known fuel only so It breaks the route the PR adds. The Household A (rent route), period 2026, Louisiana:
Household B (bill payer): one adult aged 40, wages $15,080, electricity $1,740, Since no dataset stamps Fix. Preferred: drop 2. Three terms of
|
| File, case | Arithmetic | Expected |
|---|---|---|
| cooling, 1 | 1,740 / 15,080 = 11.54%, 10-17.9%, size 1; NONE fails heating | cooling 350, heating 0 |
| cooling, 2 | (900 + 1,740) / 20,000 = 13.2%, size 4; income under 58,882; no priority member | 400, 400, liheap 800 |
| cooling, 3 | loss floored to 0 income, top band, size 4: 700 + 100 (age 4) | 800 |
| cooling, 4 | no cooling expense, tenant pays utilities; electric heat 11.54% | cooling 0, heating 350 |
| cooling, 5 | 32,000 > 30,618; floor 1.1 x 15,650 = 17,215 | 0 |
| cooling, 6 | UNSPECIFIED fails fuel_known (see Should 1) |
0 by the code |
| eligible, 1 | NONE and NATURAL_GAS both pass cooling; NONE fails heating | [true, true]; heating [false, true] |
| eligible, 2 | 1,740 - 1,200 = 540; 1,500 - 1,800 = -300; 1,740 - 1,740 = 0 | [true, false, false] |
| eligible, 3 | size 0 (and income fails by itself, see Should 2) | false |
| eligible, 4 | rent route; burden 0, band 1, size 1; subsidized cost 0 | [true, false]; [200, 0] |
| income, 1 | 30,618 <= 30,618; 30,619 above, floor 17,215 | [true, false] |
| income, 2 | floor (15,650 + 5,500 x 13) x 1.1 = 95,865 | [true, false] |
| matrix, 1 | 11.54% gives 350; -300 floored to 0 gives band 1 | [350, 200]; la_liheap [0, 0] |
Axiom line assessment
axiom: TheAxiomFoundation/rulespec-us#2185 queued is valid. The issue is OPEN, labelled pe-parity, updated 2026-11-12, names this head (e2e841c285), and is dispatch-ready: blocker stated (depends on the unencoded heating rules in #1890), module paths, corpus citations, verbatim source text, four required outputs, and 11 companion cases derived from the sources. It will need two edits when the findings are fixed: interpretation 3 and companion case 8 ("an UNSPECIFIED heating type pays $0 in every state LIHEAP implementation" is not true of Louisiana heating), and the new pinning cases.
CI status
36 of 36 checks pass at the head; none pending or failed. The selective-test job ran the four new files green: 6 + 4 + 2 + 1 = 13 cases. The full baseline, contrib, Python and microsimulation jobs all pass.
Branch status
12 commits behind main; the merge with current main is clean. Test merges against all eight sibling heads are clean, including the three files every sibling edits (regular_payments.yaml, programs.yaml, source_conflicts/candidates.yaml): AR #10744, GA #10746, OK #10748, KY #10752, SC #10754, AL #10756, NE #10758, VA #10760. Main's changes since the merge base do not touch the Louisiana files or the list-integrity and registry tests.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting two changes; neither is critical, and the core of the PR is right. Louisiana pays one heating and one cooling benefit each program year from one matrix, so the national total doesn't double count. All eight matrix cells, the $100 supplement and the $800 maximum match the documents, and both refactors are exact moves.
- The UNSPECIFIED exclusion. The comment and the description say an unspecified fuel pays $0 "as in every LIHEAP program", but
la_liheap_eligiblepays it when heat is in the rent (Case 8), and no Louisiana text ties cooling to the heating fuel. It also defeats the utilities-in-rent route this PR adds: a renter with utilities in the rent who leavesheating_typeat its default gets $200 for heating and $0 for cooling. Dropfuel_known, or mirror the heating variable and reword the comment (Should Address 1). - Three terms have no pinning test, by my reading:
size > 0(the one zero-size case already fails the income test),rent > 0, andis_in_public_housing. Three cases are sketched in the report (Should Address 2).
Six optional suggestions follow. CI is green at e2e841c285.
Addresses DTrim99's round-1 review; upstream main merged first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nce candidate covers cooling Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
This push, head Should address
Suggestions
Also: four Louisiana test headers from main said the EIA 2024 Louisiana average bill was $145 a month. They now say 1,740 is 145 a month, near the EIA average of $140.96 (comment only). CI is running at |
Adds Louisiana's regular LIHEAP cooling benefit, which uses the same matrix as heating.
Fixes #10749
Builds on the national LIHEAP total from #10730, merged on 2026-11-12: this PR adds
la_liheap_coolingtogov.hhs.liheap.regular_payments.What and why
The April 2026 Service Delivery Guide says "Applicants may be eligible to receive one Heating and one Cooling LIHEAP benefit each Program year" (section 4.2 B, p. 48). It sets one requirement list for "the LIHEAP Heating/Cooling regular benefits" (section 3.6, p. 33). The FFY2026 Heating and Cooling Benefit Matrix applies to both seasons: burden band by size group ($200 to $700), plus one $100 supplement, maximum $800 (FY2026 plan items 3.4-3.6, p. 12). Subsidized households whose utility allowance exceeds the bill are not eligible, with applicants 60 or older exempt (plan 3.3; guide 4.1 C.1, p. 46). Cooling only gets a larger share of the funds (45.5% against 25%); the per-household award uses the same matrix.
la_liheap_matrix_amountholds the matrix formula, moved unchanged out ofla_liheap, which now reads it. Newla_liheap_income_eligibleholds the income test. Heating results are unchanged; no case frommainwas edited. Four existing Louisiana test headers now give the EIA 2024 Louisiana average residential bill as $140.96 a month instead of $145 (comment only), and thepayment/burden_band.yamlcomment now namesla_liheap_matrix_amountfor the zero-income band.la_liheap_cooling_eligible: household size, the income test,has_cooling_expenseor energy costs included in the rent, and the subsidized utility-allowance test throughla_liheap_energy_cost. Guide 3.6 E.1 (p. 41) counts "A renter whose energy costs are included as a part of the monthly rental amount", and the plan's cooling section 3.3 (p. 11) answers Yes for renters with utilities in rent, with a landlord agreement to pass the benefit on as a rent reduction.la_liheap_cooling: the shared matrix amount.heating_type: no Louisiana cooling rule names a heating fuel, so NONE, UNSPECIFIED and every known fuel can be paid. Heating eligibility is unchanged.has_cooling_expenseis required, except for renters whose utilities are included in rent. Those renters are identified by the existingtenant_pays_utilitiesinput (false) with positiverent; no input is added. Requiringhas_cooling_expenseis a PolicyEngine convention of the all-state cooling work; the guide's responsibility test covers heating and cooling costs together (section 3.6 E, p. 41).Test plan
Tests were not run locally. This PR now targets
main, so CI runs them.liheaptotal.us-la:liheap-utility-allowance-age(ruled 2026-10-06, guide over plan) now cites plan item 3.3 and the April 2026 guide section 4.1 C.1, and listsla_liheap_cooling_eligible.pyand this PR.make format(ruff)changelog.d/Not modeled
axiom: TheAxiomFoundation/rulespec-us#2185 queued
🤖 Generated with Claude Code