Skip to content

Add Alabama LIHEAP regular cooling assistance - #10756

Open
hua7450 wants to merge 20 commits into
mainfrom
al-liheap-cooling
Open

hua7450 wants to merge 20 commits into
mainfrom
al-liheap-cooling

Conversation

@hua7450

@hua7450 hua7450 commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Alabama's Regular Cooling payment for May through September, from the Electric column of the Payment Assistance Chart effective May 15, 2026.

Fixes #10755

Builds on the national LIHEAP total from #10730, merged on 2026-11-12: this PR adds al_liheap_cooling to gov.hhs.liheap.regular_payments.

What and why

Alabama's Payment Assistance Chart "PY 2026 (Effective May 15, 2026)" (the date is reported from an attachment to the draft FY2027 plan, since removed, with no live copy; FY2026 plan section 3.5, p. 12, adopts the 2026 guidelines on release, and the accepted FY2027 plan's PY2027 chart, section 3.5, p. 12, shows the same 2026-guideline arithmetic) prints 150% of the 2026 guidelines: $1,995 a month for one person and $4,125 for four. Heating in FY2026 uses the 2025 guidelines. The payment is the chart amount minus one month of HUD utility allowance (manual 6.1.1, p. 22), plus the $100 FY2026 IIJA supplement when the payment is positive (plan 3.5, p. 12). One payment per cooling season (manual section 3, p. 9). The plan's $320 to $520 cooling range matches only the Electric column, which this PR uses.

  • New cooling/fpg_year_lag.yaml (0) and al_liheap_cooling_income_limit: 150% of the current year's guideline, monthly, rounded half up.
  • The income limit, income band, chart amount and award move into shared helpers, so heating and cooling use the same code. Heating results are unchanged except for the cap below.
  • Income limit stops at the federal maximum. The shared limit rounds 150% of the monthly guideline to the nearest dollar, which put the annual limit $3 or $6 above the greater of HHS's 60% state median income amount and 150% of the poverty guideline, the most 42 U.S.C. 8624(b)(2)(B) allows, at large household sizes. Each limit now stops there: heating FY2026 at sizes 10, 12 and 14 ($97,725 for ten people, chart $97,728); heating FY2025, on the 2024 guidelines, at sizes 9, 11, 13 and 15 ($87,150 for nine people, chart $87,156; not a verified heating year); and summer 2025 cooling at sizes 8, 10, 12 and 14 ($81,225 for eight, chart $81,228). The summer 2026 chart prints whole-dollar amounts, so nothing changes there.
  • al_liheap_cooling_eligible: household size, income at or below the cooling limit, and has_cooling_expense or energy costs included in nonsubsidized rent. Manual 6.1.3 (p. 22): renters of a non-subsidized dwelling "whose home energy costs are included in their rent are eligible for Regular Assistance"; manual 5.3 (p. 17) sets their written proof.
  • al_liheap_cooling: the Electric column (size 1 $440/$410/$320 up to size 4+ $470/$440/$350), minus one month of hud_utility_allowance, plus the IIJA supplement ($100 in FY2026, $0 from 2026-10-01).
  • Shared parameter labels drop "heating", and their references add the cooling plan sections; no values changed.
  • 2025 is verified: the FY2025 plan (cooling May 1 to September 30, 2025, the $100 IIJA supplement and the $320 to $520 range, pp. 4, 12-13) and the chart effective February 17, 2025 (2025 guidelines, the same Electric amounts). verified_years is "2025-2026".
  • Cooling eligibility does not read heating_type: Regular Cooling pays the Electric column whatever the heating fuel, so UNSPECIFIED, NONE (no heating) and every known fuel can be paid. Alabama heating still pays $0 for an unspecified fuel, a PolicyEngine convention (issue 9754) rather than an Alabama rule.
  • has_cooling_expense is required, the input the all-state cooling work uses for a cooling cost, except for renters whose utilities are included in rent. Those renters are identified by the existing tenant_pays_utilities input (false) with positive rent; no input is added. Heating's rent route reads heat_expense_included_in_rent instead, so a renter with energy costs in the rent sets both inputs.

Test plan

Tests were not run locally. This PR now targets main, so CI runs them.

  • YAML tests with expected values worked from the sources above. 23 cases in 3 files: the 2025 and 2026 chart limits, a summer 2025 limit that stops at the federal maximum, each Electric band, the band read from the cooling limit, the HUD allowance and the supplement, nonsubsidized, subsidized and public housing renters with energy costs in rent, each rent-route condition, a unit with no qualified member, no cooling cost, a paid UNSPECIFIED fuel, and the national liheap total.
  • The existing heating limit case now asserts the capped limits at sizes 10, 12 and 14 (al_liheap_income_limit.yaml); new Case 3 asserts the 2025 limits at sizes 7-15, capped at 9, 11, 13 and 15.
  • Source-conflict register: candidate us-al:liheap-income-limit-above-federal-ceiling (ruled) records the cap; the code follows the statute.
  • make format (ruff)
  • Changelog fragment in changelog.d/

Not modeled

  • The May 15, 2026 chart appears only as an attachment to the draft FY2027 plan, which ADECA has since removed from its site and which has no archived copy, so the code no longer links to it. It cites FY2026 plan section 3.5 (p. 12) instead, which adopts the 2026 guidelines on release, and the accepted FY2027 plan's PY2027 chart (section 3.5, p. 12, from October 1, 2026), which shows the same 2026-guideline limit and band arithmetic but not the May 15 effective date.

axiom: TheAxiomFoundation/rulespec-us#2184 queued

🤖 Generated with Claude Code

hua7450 and others added 14 commits November 8, 2026 22:01
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>
Adds the FY2025 plan, the February 2025 benefit chart and the FY2027
plan as references, a FY2025 case, and an in-rent renter case. Manual
section 6.1.3 pays unsubsidized renters with utilities in rent. Marks
2025-2026 verified and checks the national liheap total.

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>
…emoved plan link

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>
Base automatically changed from liheap-aggregate to main November 12, 2026 19:06
hua7450 and others added 2 commits November 12, 2026 14:08
PR 10730 was squash-merged into main as f67bb1e, so this merge uses its
final head 4625f4e, already merged here, as the merge base.

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

DTrim99 commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Alabama LIHEAP regular cooling assistance

Summary

The PR adds Alabama's Regular Cooling payment as al_liheap_cooling (Electric column of the Payment Assistance Chart, less one month of HUD utility allowance, plus the $100 FY2026 IIJA supplement), a cooling income limit on the current calendar year's guidelines, a cooling eligibility flag, a line in gov.hhs.liheap.regular_payments, a second Alabama registry entry, and a federal-maximum cap on the shared limit helper with a ruled source-conflict candidate. I checked it against the FY2025, FY2026 and FY2027 plans, the FY2026 policy manual, the two Clearinghouse charts (PY 2025, and PY 2026 effective February 17, 2025), ADECA's summarized eligibility sheets and HHS's FY2025 and FY2026 SMI tables.

The core policy is right. Alabama pays Regular Heating and Regular Cooling to the same household in one program year, so listing both in the national total does not double count. All twelve Electric cells match the chart, the band arithmetic reproduces every printed band top, and the cap figures match HHS's tables. The refactor returns main's values wherever the cap does not bind. CI is green at the head, and the Alabama files ran in Baseline states-shard-2.

Three things need fixing. The cap also changes 2025 heating results at sizes 9, 11, 13 and 15, and neither the body, the register note nor any test mentions that change. The body says UNSPECIFIED pays $0 "as in every state LIHEAP program", which is not true on main. And four new terms, including the one that makes cooling use its own income band, are not pinned by any test.

Critical

None.

Should address

1. The cap changes 2025 heating limits at sizes 9, 11, 13 and 15, and nothing discloses or pins it.
policyengine_us/variables/gov/states/al/adeca/liheap/eligibility/al_liheap_income_limit.py, lines 21-27, applies min_(rounded_limit, max_(guideline * fpg_limit, smi_maximum)) to every heating year. Model year 2025 heating uses the 2024 guidelines ($15,060 plus $5,380 a person; existing Case 2 of al_liheap_income_limit.yaml, lines 22-32). At odd sizes, 150% a month ends in $0.50 and rounds up, so the printed limit is $6 a year above 150% of the guideline. From size 9, HHS's FY2025 60% SMI amount is the smaller of the two maxima:

Size PY 2025 chart (monthly x 12) 150% of 2024 guideline HHS FY2025 60% SMI Head
9 $7,263 x 12 = $87,156 58,100 x 1.5 = $87,150 $80,754 $87,150
11 $8,608 x 12 = $103,296 $103,290 $84,191 $103,290
13 $9,953 x 12 = $119,436 $119,430 $87,627 (extrapolated) $119,430
15 $11,298 x 12 = $135,576 $135,570 $91,064 (extrapolated) $135,570

The printed amounts are ADECA's own: "Summarized Eligibility Requirements, Effective October 1, 2024 – February 16, 2025" lists "9 person $7,263 ... 11 person $8,608 ... 13 person $9,953 ... 15 person $11,298" (https://adeca.alabama.gov/wp-content/uploads/LIHEAP-Summarized-Eligibility-Requirements.pdf, page 1), and the PY 2025 chart prints the same figures (https://liheapch.acf.gov/docs/2025/benefits-matricies/AL_BenefitMatrix_2025.pdf). HHS's FY2025 table: https://acf.gov/sites/default/files/documents/ocs/COMM_LIHEAP_IM%202024-02_Att4SMITable.pdf#page=4.

Example household: nine people in Alabama with $87,156 of countable income ($7,263 a month), propane heat with a bill, period 2025. On main they are eligible, in band 3 (top $7,263), and receive $500 − $120 + $30 + $100 = $510. At the head they receive $0.

The new value is the statutory one, so this is not a wrong result, and 2025 is not a verified heating year. But the body says "Heating results are unchanged except for the cap below" and then lists only "heating FY2026 at sizes 10, 12 and 14". The candidate note us-al:liheap-income-limit-above-federal-ceiling (source_conflicts/candidates.yaml, line 409) lists only FY2026 heating and summer 2025 cooling, although its years start in 2025. No test asserts these four values, so the 2025 cap could be dropped without a test failing.

Fix: add the 2025 heating sizes and figures to the body and the candidate note, and extend heating Case 2 (period 2025) to sizes 7-15. The expected values, each the PY 2025 printed amount x 12, capped where it exceeds 150% of the 2024 guideline, are:

Size 7 8 9 10 11 12 13 14 15
Expected $71,016 $79,080 $87,150 $95,220 $103,290 $111,360 $119,430 $127,500 $135,570

These are hand traces and still need confirming in CI.

2. The body's "as in every state LIHEAP program" claim for UNSPECIFIED is inaccurate.
policyengine_us/variables/gov/states/al/adeca/liheap/cooling/al_liheap_cooling_eligible.py, lines 34-39, requires heating_type != UNSPECIFIED. The body says "heating_type UNSPECIFIED pays $0, as in every state LIHEAP program". The test comment in al_liheap_cooling.yaml, lines 179-180, calls it "The standing LIHEAP rule", and the axiom issue's interpretation 8 says heating_type "is a required input in every state LIHEAP implementation".

Two state programs on main pay an UNSPECIFIED household:

  • DC: dc_liheap_heating_type.py says "wood, coal, other and solar heating have no DC matrix row and take the electricity row, as do UNSPECIFIED and NONE".
  • Illinois: il_liheap_heating_type.py says "UNSPECIFIED keeps the pre-canonical default of all-electric". Both payment formulas fall back to legacy expense arbitration when the type is UNSPECIFIED.

Within Alabama the choice is consistent: al_liheap_base_payment defaults to $0 for UNSPECIFIED (and for fuel oil, solar and other), so Alabama heating never pays an UNSPECIFIED household. No Alabama source, though, ties Regular Cooling to a heating fuel: plan 3.2 answers "No" to additional cooling requirements, and the Electric column applies whatever the heating fuel.

There is also an interaction with the new rent route. The heating_type documentation says UNSPECIFIED "is also the right value when heat is included in rent and the fuel is unknown". Those are exactly the renters the rent route is meant to pay. Example household: one adult, $7,540 of wages, tenant_pays_utilities false, rent $13,860, fuel unknown so heating_type UNSPECIFIED, period 2026. Manual 6.1.3 (page 22) makes them "eligible for Regular Assistance", which would be $440 + $100 = $540. The head pays $0.

Fix: reword the body, the code comment and the test comment to say this follows Alabama heating's $0 for an unreported fuel (the #9754 convention, which DC and Illinois do not follow), and label it a PolicyEngine convention rather than an Alabama rule. Optionally, exempt the rent route from fuel_reported, or drop the term for cooling, since the cooling amount never depends on the heating fuel.

3. Four new terms have no test that would fail without them.

  • The cooling band reads the cooling limit (al_liheap_cooling.py, lines 43-44). In every cooling case, the 2025-guideline band and the 2026-guideline band put the household in the same band. Cases 1, 5 and 9 are in band 1 under both; Case 2 is in band 2 under both; Case 3 in band 3 under both; Case 4 in band 2 under both. So passing al_liheap_income_band (the heating band) to the chart would leave every case green by my reading. Pinning case: one adult with $7,920 of wages ($660 a month), electric, cooling cost, period 2026. That is band 1 on the cooling limit (at most $665), paying $440 + $100 = $540. The heating band would put the same household in "$653 – $1,305" and pay $510.
  • size > 0 (al_liheap_cooling_eligible.py, line 39). No cooling case has a unit with no qualified member. Heating pins the same term in al_liheap_eligible.yaml Case 9 (one undocumented adult), and a cooling twin of that case would pin this one.
  • The two rent-route conjuncts (lines 28-30). Eligible Case 6 has tenant_pays_utilities false and rent above 0 together, so dropping either ~tenant_pays_utilities or rent > 0 alone leaves it green. Pinning cases: a unit with tenant_pays_utilities false and rent 0, expected false; and a unit with the default tenant_pays_utilities true, rent $13,860 and no cooling cost, expected false.
  • is_in_public_housing (lines 25-27). Only receives_housing_assistance is tested. Heating pins this term in al_liheap_eligible.yaml Cases 7 and 11. Pinning case: Case 6's second unit with is_in_public_housing true and receives_housing_assistance false, expected false and $0.

Fix: add these cases. The axiom issue's checklist already names two of them.

Suggestions

  1. Describe the FY2027 plan citation accurately. al_liheap_cooling.py, lines 36-38, says FY2027 plan section 3.5 gives "the 2026 guideline limit and band arithmetic of the chart effective May 15, 2026". Section 3.5 of that plan describes "Attachment A – PY2027 LIHEAP Payment Assistance Chart", the chart for October 1, 2026 onward, so it shows the 2026-guideline arithmetic, not the May 15 effective date. The authority for using 2026 guidelines in summer 2026 is FY2026 plan section 3.5 (page 12): "ADECA will adopt 2026 Federal Poverty Guidelines upon release. The Payment Assistance Chart will be updated when the 2026 Federal Poverty Guidelines are released". ADECA's FY2025 practice backs that reading: the October 1, 2024 – February 16, 2025 sheet on the 2024 guidelines was followed by the chart "Effective February 17, 2025" on the 2025 guidelines. al_liheap_cooling_income_limit.py cites FY2026 plan page 11 (item 3.1, which names no guideline year). Point it at page 12, and reword the comment.

    I could not confirm the May 15, 2026 date itself. ADECA's LIHEAP documents page still posts only "FY26 Summarized Eligibility Requirements, Effective October 1, 2025" at $1,956 for one person, and the Clearinghouse has no 2027 Alabama matrix. Calling the date reported from the removed draft attachment, in cooling/fpg_year_lag.yaml and the registry note (programs.yaml, line 1057), would be more precise.

  2. Back the 2025 claim with 2025 entries. verified_years: "2025-2026" rests on reading the 2025-10-01 values back into period 2025. The al_liheap_cooling documentation says "Earlier years use model parameter backfilling and are unverified", but FY2025 itself is read that way. The amounts are right: the PY 2025 chart's payment cells are identical, and FY2025 plan 3.5 and 3.6 print the $100 cooling supplement and the $320–$520 range. Adding 2024-10-01 entries (cooling lag 0, supplement $100, the Electric base and band reductions) with FY2025 references would make the claim explicit.

  3. Cite page 4 of the HHS FY2026 table. The al_liheap_income_limit.py reference and the candidate cite IM 2025-02 Attachment 4 at page 1 only. That page covers sizes 1-6. The size 8 amount that keeps the heating limit at $81,228 ($81,723) and the sizes 7-12 amounts are on page 4.

  4. Make the in-rent inputs agree, or say they differ. Heating's rent route reads heat_expense_included_in_rent, while cooling's reads tenant_pays_utilities false with positive rent. A nonsubsidized renter with heat_expense_included_in_rent true and the default tenant_pays_utilities true gets heating through the rent route but not cooling. A sentence in the variable comment or the registry note would prevent surprises.

Verified correct

  • Heating and cooling in one year are both payable. Manual section 3.1 (PDF page 9, https://adeca.alabama.gov/wp-content/uploads/FY-2026-LIHEAP-Manual-1.pdf#page=9): "Regular Assistance may only be provided once in the Heating season and once in the Cooling season." Section 4 (page 13): "The maximum number of times an eligible household can receive LIHEAP assistance each program year is four times, i.e. once for Heating, Crisis Heating, Cooling, or Crisis Cooling." Listing al_liheap and al_liheap_cooling in regular_payments therefore does not double count. One payment per period matches "once in the Cooling season".

  • Cooling is a funded regular component in both claimed years. FY2025 plan item 1.1: cooling 05/01/2025–09/30/2025, item 1.2 26% of funds. FY2026 plan: 05/01/2026–09/30/2026, 25% (page 4). Plan 3.2 is "No" (checkbox read from the page image). Plan 3.5 checks Income, Household size, Fuel type, Energy need and Other.

  • The Electric column is the right column for cooling. Plan 3.6 for FY2025, FY2026 and FY2027 prints "Minimum Benefit $320, Maximum Benefit $520". That equals the Electric column's $320 (one person, band 3) to $470 (four people, band 1) plus the optional $50. The natural gas column ($360 to $510 + $50) and propane column ($380 to $530 + $50) exceed $520, and the wood column's $280 is below $320. Manual 6.1.1 deducts the monthly utility allowance "from the Regular Heating or Regular Cooling payment".

  • All twelve Electric cells of the February 17, 2025 chart (table-mode extraction, rows checked as monotone) are 1 person $440/$410/$320, 2 people $450/$420/$330, 3 people $460/$430/$340 and 4 people $470/$440/$350. That equals $440 − ($0/$30/$120) + $10 x (min(size, 4) − 1). The PY 2025 chart has identical payment cells.

  • Band arithmetic. first_upper = floor(limit/3 + 0.5) and second = 2 x first + 1 reproduce every printed band top: 652/1,305, 881/1,763, 1,110/2,221 and 1,340/2,681 (February 17, 2025 chart); 628/1,257, 852/1,705, 1,076/2,153 and 1,300/2,601 (PY 2025 chart); and 665/1,331 (FY2027 plan 3.5). The cap never moves a band: I checked capped against printed limits at heating 2026 sizes 10/12/14, heating 2025 sizes 9/11/13/15 and cooling 2025 sizes 8/10/12/14, and the band tops are identical in each case.

  • Fiscal-year dating. Annual variables read 1 January values, so period Y is FFY Y and covers the summer of calendar year Y.

    Parameter 2025 2026 2027
    cooling lag 0 (2025 guidelines, backfilled) 0 0
    IIJA supplement $100 (backfilled) $100 $0
    Electric base $440 $440 $440
    60% SMI four-person amount $57,273 (FY2025) $59,220 (FY2026) $61,426 (FY2027)

    Summer 2025 on the 2025 guidelines is right: ADECA's sheet on the 2024 guidelines ends February 16, 2025, and the chart "Effective February 17, 2025" prints $1,956 for one person (15,650 x 1.5 / 12). FY2025 plan 3.5 pays the $100 "Each time a household receives a Cooling benefit". The FY2027 plan (both Revision 1 on the Clearinghouse and the accepted Revision 2 on ADECA's site) has no IIJA text, which supports $0 from 2026-10-01.

  • No source conflict on the guideline year. FY2026 plan item 3.1 names "HHS Poverty Guidelines 150.00%" without a year, and 3.5 commits to adopting the 2026 guidelines on release. That agrees with a 2026-guideline chart for summer 2026, so no conflict record is needed.

  • Cap figures against HHS's tables. FY2026 Alabama (IM 2025-02 Att. 4, pages 1 and 4): $30,794, $40,269, $49,744, $59,220, $68,695, $78,170, $79,947, $81,723, $83,500, $85,276, $87,053, $88,830. FY2025 (IM 2024-02 Att. 4, pages 1 and 4): $29,781 ... $75,600, $77,318, $79,036, $80,754, $82,473, $84,191, $85,909. liheap_smi_limit reproduces each figure (for example, floor(59,220 x 1.38) = 81,723). Every figure the body and candidate list is right: $97,725/$97,728 at size 10 heating 2026; $114,225 and $130,725 at sizes 12 and 14; size 8 heating staying at $81,228 because $81,723 > $81,225; summer 2025 cooling capped at sizes 8, 10, 12 and 14; and summer 2026 never capped, because 15,960/8 = 1,995 and 5,680/8 = 710 are whole dollars.

  • The source-conflict candidate has every field. state: ruled rests on the 2026-10-19 statute-first rule recorded in CLAUDE.md, worded exactly as the merged us-wv: and us-or:liheap-income-limit-above-federal-ceiling entries and the Arkansas sibling's. It is sorted correctly before us-al:liheap-insurance-payments. No existing Alabama LIHEAP record names a moved line: the two existing entries point at the countable-income files, which are untouched. The PR adds no conflict-sounding comments.

  • The refactor returns main's values everywhere the cap does not bind. I compared each change with main line by line:

    • al_liheap = eligible x al_liheap_award(base), the same allowance, max and supplement steps as before.
    • al_liheap_chart_amount keeps the max_(band, 1) lookup and where(base > 0, ...).
    • al_liheap_income_band_for_limit has the same body.
    • al_liheap_income_limit_for_lag has the same rounding plus the cap.

    The only other readers are the new cooling files, regular_payments.yaml and programs.yaml. The only changed existing expectation is heating Case 1 at sizes 10, 12 and 14, and each new value is right by hand.

  • Rent route and subsidized tenants. Manual 6.1.3 (page 22) covers nonsubsidized renters with energy costs in rent, and 5.3 (page 17) their written proof. Manual 6.1.1 (page 21): subsidized tenants "whose home energy costs are included in their rent and do not pay anything out-of-pocket are not eligible". The code matches: a subsidized renter qualifies only with has_cooling_expense. tenant_pays_utilities defaults to true, so the route is off unless set. hud_utility_allowance is the monthly allowance annualized, so /12 is one month. It is defined_for tenant_pays_utilities, so it is $0 on the rent route, and it is $0 in Alabama unless supplied (no encoded Alabama schedule). The supplement is added only to a positive payment, as disclosed.

  • Alabama heating never pays UNSPECIFIED. The base payment's select defaults to $0, so the chart amount, award and supplement are all $0, including heat in rent.

  • Keyed lookups and periods. The band key is always 1-3, and the SMI key state_code_str covers every state, DC and PR, the same key hhs_smi reads nationally. Each new variable is gated to Alabama (defined_for AL, or the AL-gated eligibility flag). All variables are YEAR, with no options=[ADD]; rent is summed with add.

  • National total and registry. The list line is a dollar amount on SPMUnit, per YEAR, gated to Alabama, and not a component of al_liheap. Cooling Case 1 pins it (liheap $1,120 = $580 + $540). By my reading of main's test_liheap_total_sums_every_registered_state_payment, the new registry entry requires the line: deleting it fails that test.

  • Hygiene. The parameter descriptions follow the house template. The references open on the cited values (FY2026 plan pages 4, 8, 9, 10, 11 and 12; FY2027 page 12; manual pages 9 and 22). There are two changelog fragments (added, fixed), and the test files are named after their variables. The PR does not touch income source lists.

  • Hand checks (12), all matching the YAML:

    1. Cooling Case 1: $7,540/12 = $628.33 ≤ $665 gives $440 + $100 = $540. Heating gas band 1 (≤ $652) gives $480 + $100 = $580. liheap = $1,120.
    2. Case 2: $1,100 is in $666–$1,331, so $410 + $100 = $510. SSI is $0 because $1,080 > $994.
    3. Case 3: the size 4 limit is 33,000 x 1.5 / 12 = $4,125, with tops $1,375/$2,751. $3,000 is band 3: $440 − $120 + $30 + $100 = $450.
    4. Case 4: the size 5 limit is $4,835, with tops $1,612/$3,225. $2,500 is band 2, paid as four people: $440 − $30 + $30 + $100 = $540.
    5. Case 5: $600/12 = $50 gives $390 + $100 = $490. $5,280/12 = $440 gives $0, with no supplement.
    6. Case 8 (2027): $440 with no supplement.
    7. Case 11 (2025): 15,650 x 1.5 / 12 = 1,956.25, so $1,956 x 12 = $23,472, below max($23,475, $29,781). $1,100 is band 2: $410 + $100 = $510.
    8. Eligible Case 3: the heating limit is $23,472 < $23,700 ≤ the cooling limit of $23,940.
    9. Eligible Cases 1-2: $23,940 is eligible and $23,940.12 is not.
    10. Eligible Case 6: the unsubsidized renter gets $540 and the subsidized one $0.
    11. Limit Case 1: monthly limits of $1,995, $2,705, $3,415, $4,125, $4,835 and $11,935, each x 12.
    12. Limit Case 2: size 8 is 6,768.75, rounded to $6,769 = $81,228, capped at max($81,225, $79,036) = $81,225. Size 7 is $72,972, below max($72,975, $77,318).

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#2184 queued. The issue is OPEN and labelled pe-parity. It names head 04096e6a0e, matching the PR. It has module paths, corpus citations with ingest status, verbatim source text, required outputs with formulas, and companion tests derived from the sources rather than from PolicyEngine output, and it is queued on rulespec-us#1532 (Alabama heating) and corpus ingest. That makes it dispatch-ready on the #1467 model and a valid queued line.

Several lines need refreshing:

  • It says CI "has not yet run its tests at this head", but they are now green.
  • Interpretation 8 repeats the inaccurate "required input in every state LIHEAP implementation" claim (Should 2).
  • It lists only sizes 10, 12 and 14 for the heating cap, so the 2025 heating changes (Should 1) need adding.

CI status

All 36 checks pass at 04096e6a0e (gh pr checks 10756), and none is pending. The Alabama LIHEAP YAML files, including the three new cooling files (11 + 6 + 2 cases) and the re-expected heating limit case, ran green in Baseline tests (states-shard-2).

Branch status

The branch is 12 commits behind main. git merge-tree --write-tree against current main (cc486336d7) is clean, and the merged tree keeps al_liheap_cooling in regular_payments.yaml. Test merges against all eight siblings are clean: AR #10744, GA #10746, OK #10748, LA #10750, KY #10752, SC #10754, NE #10758 and VA #10760. All edit regular_payments.yaml, programs.yaml and source_conflicts/candidates.yaml, but at different lines.

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 three changes; none is critical, and the core policy is right. Alabama pays Regular Heating and Regular Cooling once each per program year ("once in the Heating season and once in the Cooling season", manual 3.1), so the national total doesn't double count. All twelve Electric cells match the chart, the band arithmetic reproduces every printed band top, and the cap figures match HHS's tables.

  1. The cap also changes 2025 heating, undisclosed and untested. The capped helper applies to every heating year. In 2025 (2024 guidelines) the printed limits at sizes 9, 11, 13 and 15 are $6 a year above 150% of the guideline, so a nine-person household at $87,156 goes from $510 to $0. The description and the candidate note list only FY2026 heating and summer 2025 cooling, and the 2025 heating test stops at size 2. Add the sizes to the description and the candidate, and extend the 2025 case (expected values in the report).
  2. "As in every state LIHEAP program" isn't accurate for UNSPECIFIED: DC and Illinois pay it on main. It does match Alabama heating, so label it a convention. It also turns away the rent-route renters this PR adds when they leave the fuel unknown.
  3. Four new terms have no test, by my reading: the cooling band reading the cooling limit (every case lands in the same band either way), size > 0, the two rent-route conjuncts, and is_in_public_housing. Pinning households are in the report.

CI is green at 04096e6a0e.

@hua7450

hua7450 commented Nov 13, 2026

Copy link
Copy Markdown
Collaborator Author

This push adds the round-1 fixes in eb13ec6206 and merges upstream main; the head is f3dbfc7056.

  • Should address 1 (2025 heating cap). New Case 3 in eligibility/al_liheap_income_limit.yaml asserts the period 2025 heating limits at sizes 7-15 with your expected values: 71,016, 79,080, 87,150, 95,220, 103,290, 111,360, 119,430, 127,500 and 135,570. It is a new case because Case 2 is main's. The candidate note us-al:liheap-income-limit-above-federal-ceiling now lists heating FY2025 sizes 9, 11, 13 and 15 ($87,156 and $87,150 at 9). Its other reading says "$3 or $6", and it cites ADECA's Summarized Eligibility Requirements effective October 1, 2024 to February 16, 2025 (page 1). The body lists the sizes. One correction to the report: 150% of the 2024 guideline already exceeds HHS's FY2025 60% amount at size 8 (79,080 against 79,036), not from size 9. Size 8 prints a whole dollar ($6,590), so the cap changes only sizes 9, 11, 13 and 15. The Case 3 comment says this.
  • Should address 2 (UNSPECIFIED). fuel_reported is gone from al_liheap_cooling_eligible, so cooling eligibility no longer reads heating_type; the Electric column applies whatever the heating fuel. al_liheap_cooling.yaml Case 10 keeps its inputs and now expects true and $540, with a "Was" comment. The "standing LIHEAP rule" comment and the body's "as in every state LIHEAP program" are removed. With no fuel term, your rent-route renter with an unknown fuel is paid too. Alabama heating still pays $0 for an unspecified fuel, and the body now calls that a PolicyEngine convention (issue 9754), not an Alabama rule. The heating files are unchanged.
  • Should address 3 (untested terms). All four are pinned:
    • al_liheap_cooling.yaml Case 12: $7,917 of wages (21 hours a week at $7.25) is $659.75 a month, cooling band 1 ($540) and heating band 2. The case asserts both.
    • al_liheap_cooling_eligible.yaml Case 7: one undocumented adult, household size 0, not eligible.
    • Case 8: tenant_pays_utilities false with rent 0, and the default true with rent $13,860 and no cooling cost. Both are false.
    • Case 9: Case 6's worker in public housing, with receives_housing_assistance false and a $2,262 rent (30% of income, 24 CFR 5.628). False and $0.
  • Suggestion 1 (FY2027 plan citation). Applied. The comments in al_liheap_cooling.py and al_liheap_cooling_income_limit.py now describe FY2027 section 3.5 as the PY2027 chart, from October 1, 2026, on the 2026 guidelines. al_liheap_cooling_income_limit cites FY2026 plan section 3.5 at page 12 instead of page 11. The cooling/fpg_year_lag.yaml comment says the May 15, 2026 date is reported from the removed draft attachment and that no live copy was found, and the body says the same. The registry note is unchanged: registry notes stay one or two sentences on years and scope, and the text is in the parameter comment and the description.
  • Suggestion 2 (2025 entries). Declined. The LIHEAP year convention reads earlier years through parameter backfilling and adds dated entries only for a sourced policy change. The FY2025 amounts equal FY2026's, so 2024-10-01 entries would repeat the same values. FY2025 was researched and is tested (al_liheap_cooling.yaml Case 11, al_liheap_cooling_income_limit.yaml Case 2), and al_liheap_cooling cites the FY2025 plan, pages 4 and 12-13.
  • Suggestion 3 (page 4). Applied. The al_liheap_income_limit.py comment reads "FY2026 federal amounts, PDF pages 1, 4", and the candidate's IM 2025-02 citation says pages 1 and 4.
  • Suggestion 4 (in-rent inputs). Applied in the al_liheap_cooling_eligible.py comment and the body: heating's rent route reads heat_expense_included_in_rent, so a renter with energy costs in the rent also sets tenant_pays_utilities to false. Not added to the registry note, for the reason under suggestion 1.

TheAxiomFoundation/rulespec-us#2184 now points at f3dbfc7056. It has the three refreshes from your Axiom line assessment (CI status, interpretation 8, the 2025 heating sizes) and companion tests 13-16 for the new cases.

CI is running at f3dbfc7056.

@hua7450
hua7450 requested a review from DTrim99 November 13, 2026 20:37

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 Alabama LIHEAP regular cooling assistance

2 participants