Skip to content

Add Louisiana LIHEAP regular heating assistance - #10429

Open
hua7450 wants to merge 2 commits into
mainfrom
la-liheap-wave1d
Open

hua7450 wants to merge 2 commits into
mainfrom
la-liheap-wave1d

Conversation

@hua7450

@hua7450 hua7450 commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Louisiana LIHEAP regular heating assistance for FY2026, administered by the Louisiana Housing Corporation (LHC). The model counts citizens and qualified noncitizens in household size (undocumented members' income still counts), tests gross countable income against 60% of state median income with the federal 110% poverty floor, divides the household's total energy cost by its income to get an energy burden, and pays the FFY2026 matrix amount for that burden band and household size ($200 to $700), plus one $100 supplement when a counted member is 60 or older, disabled, or age five or younger. Households with zero income receive the maximum for their size. This is Louisiana's single heating-season award; the summer cooling cycle is out of scope.

Fixes #10419

Regulatory authority

Eligibility

Requirement Source How modeled
Louisiana residence Plan defined_for = StateCode.LA
At least one citizen or qualified noncitizen Guide p.33-34 la_liheap_household_size sums is_citizen_or_legal_immigrant; size 0 is ineligible
Income at or below 60% of SMI Plan 2.1; Guide p.29, 33; Notice LHP-2025-01 la_liheap_income_limit uses liheap_smi_limit, which reproduces all ten published rows; larger sizes follow the federal size factors
Federal 110% poverty floor 42 U.S.C. 8624(b)(2)(B) 2025 guidelines in FY2026; binds from size 14
Responsibility for energy costs Guide p.35 has_heating_expense or heat_expense_included_in_rent; NONE is ineligible, UNSPECIFIED only with heat in rent
Subsidized housing Guide p.39-40; Plan 2.3 The HUD utility allowance is subtracted from the energy cost unless a counted member is 60 or older; a subsidized household needs a positive energy cost

Countable income

Item Source How modeled
Earned income Guide p.29-30; Appendix E p.82, 85 Wages and net self-employment, each floored at zero, for members 18 and older who are not in high school (is_in_k12_school)
Unearned income Guide p.29-30; Appendix E p.81, 83-86 Pensions and annuities, military retirement (with survivor annuities), railroad, survivor, veterans, workers' compensation, disability, unemployment, strike benefits, alimony, interest, dividends, rental, estate and trust income, and regular contributions (financial_assistance), for members 18 and older (the guide counts "any income of a household member age 18 and older")
Social Security and SSI Guide p.30; Appendix E p.85; FAQ A4; Plan 1.9 Counted for members of any age (Appendix E counts benefits "paid to minors"); Social Security net of medicare_part_b_premium, floored at zero per person
Gambling Appendix E p.84 Winnings less losses, floored at zero, for members 18 and older
FITAP Guide p.29 Take-up-gated tanf
Not counted Guide p.30; Appendix E Child support, capital gains, bank and retirement-account withdrawals, tax refunds, SNAP, one-time lump sums

Benefit

Energy burden Sizes 1-3 Sizes 4+
9.9% and less $200 $250
10% to 17.9% $350 $400
18% to 24.9% $500 $550
25% and greater $650 $700
  • Energy burden is total energy cost over countable income (Guide p.41; Plan 2.4). Total energy cost adds every residential energy bill (electricity, gas, propane, fuel oil and kerosene, wood, coal, other fuels) less the utility allowance where it applies (Guide p.37-40).
  • The burden is compared unrounded with cutoffs at 10%, 18% and 25%, so 9.95% stays in the lowest band. LHC does not publish its rounding.
  • One $100 priority supplement per household (Matrix; Guide p.41). The range is $200 to $800, matching Plan 2.6. There is no cap at the bill.

Not modeled

Item Source Treatment
Landlord-stated heating cost for heat included in rent Guide p.35-36; Appendix L No input. These households are eligible and their burden counts only separately billed energy, so their band is a lower bound
Application-month bill and 30-day income Guide p.31-32, 37 Annual amounts stand in; winter bills usually exceed the annual average
Bill line items (customer charges, franchise fees, arrears, deposits) Guide p.37-38 Inputs are bill totals
Louisiana utility allowance schedule Guide p.39-40 hud_utility_allowance has no Louisiana schedule and is zero unless supplied; a supplied allowance should cover the heating and cooling utilities only
Credit balances, one award per season, discretionary supplemental payments Guide p.38, 42 Not represented
Royalties, jury pay, military allotments, training stipends, informal income Guide p.29-30 No existing inputs
SSN verification and the April 2026 household-member exclusions Guide p.29; April 2026 guide p.33 No inputs
Summer cooling cycle, crisis, weatherization Plan 1.1 Out of scope

FFY2027: LHC has posted only a proposed FFY2027 plan (its matrix is unchanged); no adopted plan or income notice exists yet, so 2027 results are unverified estimates. Earlier years are unverified estimates through parameter backfilling.

The FY2026 plan's section 1.9 checks one-time lump sums and leaves commissions and cash gifts unchecked; the Service Delivery Guide, which governs case processing, counts only net gambling lump sums, counts commissions and regular contributions, and is followed.

Microsimulation: heating_type and the per-fuel bills are not in current datasets; callers must supply them.

Test plan

49 YAML cases in 5 files (not re-run locally after the review fixes; CI validates them):

  • income limits at sizes 1, 4, 10 and 14, the 110% floor at sizes 13 and 14, and the exact-limit boundary;

  • countable income: minor and high-school earnings, a minor's Social Security and SSI counted while the minor's interest and dividends are not, Social Security net of Part B, net gambling, FITAP, SSI, regular contributions, excluded sources, undocumented members' income;

  • energy cost across fuels, the utility allowance with and without a 60-year-old, a negative energy cost;

  • every burden band edge, sizes 3 and 4, zero income, each priority group once, heat in rent, subsidized households.

  • YAML tests with expected values from the plan, matrix, notice and guide

  • ruff format

  • Changelog fragment in changelog.d/

  • CI passes

axiom: TheAxiomFoundation/rulespec-us#1890 queued

🤖 Generated with Claude Code

hua7450 and others added 2 commits October 23, 2026 18:11
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	policyengine_us/programs.yaml
@codecov

codecov Bot commented Oct 23, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (7c35019).
⚠️ Report is 631 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10429   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         6    +2     
  Lines           76       122   +46     
  Branches         2         2           
=========================================
+ Hits            76       122   +46     
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.

@DTrim99

DTrim99 commented Oct 26, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Louisiana LIHEAP regular heating assistance

PR #10429 (author: hua7450), head 7c35019e79. This is a first review. The PR adds the Louisiana Housing Corporation (LHC) LIHEAP heating-season award for FY2026: 12 parameters, 6 variables, 5 test files (49 cases), a programs.yaml entry (coverage line and state list) and a changelog fragment. The only comment is codecov's, and the PR touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/la/lhc/liheap/
  • V/ = policyengine_us/variables/gov/states/la/lhc/liheap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/la/lhc/liheap/

Sources read for this review:

Summary

What is right. The published FY2026 tables and rules are encoded correctly:

  • Income limits. floor(floor(0.6 × $98,137) × size factor) reproduces all ten rows of Notice LHP-2025-01. It also reproduces all ten FFY2025 rows from $95,801, so the unclaimed 2025 backfill is right on limits.
  • Benefits. The matrix is right: 8 cells, bands at 10%, 18% and 25%, sizes 1–3 and 4 or more. So is the single $100 priority supplement (60 or older, disabled, five or younger), which with the matrix reproduces plan 2.6's $200–$800. Zero income gets the size maximum.
  • Total energy cost. Every bill is added, electricity included, so New Mexico's Should 1 does not recur. The utility allowance is subtracted for subsidized households, and applicants 60 or older are exempt. A total energy cost of zero or less makes a subsidized household ineligible.
  • Countable income follows the guide and Appendix E:
    • gross wages and net business income for members 18 and older not in high school;
    • unearned income for adults;
    • Social Security net of Part B and SSI for every member ("benefits paid to minors"; FAQ A4);
    • net gambling, FITAP through tanf, per-source loss floors, and undocumented members' income.
  • Federal floor. The 110% floor is applied strictly ("less than"); it first binds at size 14.
  • Tests and batch checks. I hand-checked all 49 cases below, and CI passed them all. The guards all pass: Integrate modeled state unemployment insurance into income flows #9558, Count military SBP annuities in state benefit income lists #10317, the Count each Social Security benefit once in Pennsylvania CCW countable income #10408 pattern and the Tie source-conflict markers to the register shared with Axiom #10287 ratchet (on the merged tree too).

Scope. Louisiana runs two regular components on the same rules and matrix:

  • Heating runs November 15 to March 15 and gets 25% of FY2026 funds.
  • Cooling runs April 1 to September 30 and gets 45.5%.
  • A household may receive one award from each. The PR models the heating award and documents cooling as out of scope. That is the wave's documented-deferral pattern, so I rate it a suggestion (G1), though cooling is the larger component.

There are no critical findings and one should-address item:

  • S1. Untested income sources. 17 of the 21 income-source entries never take a positive counted value in any test. Neither does the public-housing branch of eligibility.

There are also four suggestions:

  • G1: model or flag the larger cooling component.
  • G2: the "winter bills usually exceed the annual average" claim is backwards for all-electric homes.
  • G3: count disability-based benefit receipt toward the supplement.
  • G4: record the plan-vs-guide income choices in the backlog.

Status.

  • CI: 29 pass and 3 skipping, with none failed. All 49 Louisiana cases passed in states-shard-4.
  • Branch: 2 commits ahead of main and 39 behind. It merges cleanly.
  • Siblings: this PR adds LA to the LIHEAP coverage line, so it conflicts with 15 open LIHEAP siblings in programs.yaml only (branch note).

Critical (must fix)

None.

Should address

S1. 17 of the 21 income-source entries, and the public-housing branch of eligibility, have no test that would fail if they were dropped

  • Where:
    • P/income/sources/earned.yaml (5 entries) and P/income/sources/unearned.yaml (16 entries), read at V/income/la_liheap_countable_income.py:34-38;
    • V/eligibility/la_liheap_eligible.py:53-54 (| is_in_public_housing).
  • Untested entries. No case gives these a positive counted value:
    • Earned: sstb_self_employment_income, farm_operations_income and partnership_s_corp_income. The last is set only to −$1,500 in countable Case 1, which floors to 0, so dropping the entry changes nothing.
    • Unearned:
      • military_retirement_income, railroad_benefits, survivor_benefits, veterans_benefits, workers_compensation, disability_benefits, total_unemployment_compensation, strike_benefits, alimony_income, farm_rent_income and estate_income;
      • rental_income, set only to −$1,800, which floors to 0;
      • interest_income and ordinary_dividend_income, set only for the 16-year-old in countable Case 11, whose unearned income is excluded.
  • Tested entries: wages, self-employment ($3,000), pension_income and financial_assistance. Social Security, SSI, gambling and tanf are also pinned.
  • The floors and age rules are pinned. Removing the earned or unearned per-source max_ fails countable Case 1. Removing the gambling or Social Security floor fails Cases 6 and 5. Removing the adult multiplier fails Cases 2 and 11.
  • The public-housing branch. is_in_public_housing is pinned only in la_liheap_energy_cost.yaml Case 3. If it were dropped from la_liheap_eligible, a public-housing tenant whose allowance exceeds the bill would become eligible: the burden floors at 0, so band 1 pays $200 instead of $0. No case would fail.
  • Severity: should, as in Add New Mexico LIHEAP regular heating assistance #10431 S3, Add Virginia EAP Fuel Assistance (LIHEAP regular heating) #10303 S4 and Add Alabama LIHEAP regular heating assistance #9967 S3 (the mutation rule).
  • Fix:
    • Add one countable-income case that gives every untested source a distinct positive amount for an adult, including reported unemployment and military_retirement_pay_survivors.
    • Re-pin partnership_s_corp_income and rental_income with positive amounts.
    • Add an interest or dividend amount for an adult.
    • Add a la_liheap_eligible (or la_liheap) case with is_in_public_housing and an allowance above the bill, expecting false (or $0).

Suggestions

G1. Model the cooling award too, or say plainly that la_liheap is the smaller of Louisiana's two regular awards.

  • The program.
    • Two components. Plan 1.1 (p. 4) runs Heating assistance 11/15/2025–03/15/2026 and Cooling assistance 04/01/2026–09/30/2026.
    • Funding. Item 1.2 allocates 25.00% to heating and 45.50% to cooling.
    • One award from each. The guide says "Applicants may be eligible to receive one Heating and one Cooling LIHEAP benefit each Program year" (4.2 B, p. 42; April 2026 edition, p. 48).
    • The same rules. Section 3 of the plan (pp. 11–12) repeats the 60% limit, the utility allowance rule, the energy burden, the $100 supplement and $200–$800. Both seasons use the single "Heating and Cooling" matrix.
    • FFY2027. The proposed plan keeps the 25% / 45.5% split and says "Clients are eligible once for each of the 4 components."
  • Effect (2026, la_liheap.yaml Case 7: age 60, pension $14,400, electricity $1,740). The heating award is $350 + $100 = $450, which the model returns. The same household's cooling award is another $450, so the program-year regular benefit is $900.
  • Why only a suggestion. Each household's heating award is right. Cooling is a separate component, and the body, the la_liheap documentation and the registry note all say it is out of scope, as merged KY does. No aggregate reads la_liheap.
  • Fix, either:
    • add a la_liheap_cooling that reuses the eligibility, income, energy cost and matrix. Without the heating-fuel gates, a NONE household with an electric bill would qualify there, which is right for cooling.
    • or extend the registry note and body to say cooling is the larger component (45.5% of funds against 25%) and that the program-year regular benefit can be twice la_liheap.

G2. The body's "winter bills usually exceed the annual average" is backwards for Louisiana's all-electric households.

  • Where.
    • The body. Its "Not modeled" row reads "Annual amounts stand in; winter bills usually exceed the annual average". Axiom interpretation 1 says the same.
    • The parameter comment. P/payment/energy_cost_sources.yaml:2-3 says the annual ratio "gives the same burden". That holds only when the application-month bill equals the annual average.
  • The source. The guide uses the monthly TEC from bills "not more than thirty (30) days old" (4.1, p. 37). For the heating award, those are November–March bills.
  • The data. In EIA's Louisiana residential revenue, November–March averaged 0.86 of the annual monthly average in both 2024 ($259.2M against $302.8M) and 2025 ($285.4M against $330.7M). July and August ran 1.34–1.40. Gas bills peak in winter, so the claim holds for gas-heated homes but not for all-electric ones.
  • Example (2026, single adult aged 40, wages $15,080, all-electric, $1,740 a year):
    • Model: 1,740 / 15,080 = 11.54%, so band 2 and $350.
    • A typical heating-season bill: 0.86 × $145 = $124.70 against $1,256.67 a month is 9.92%, "9.9% and Less", so $200.
  • Why only a suggestion. The annual approximation itself is accepted wave practice (Add New Mexico LIHEAP regular heating assistance #10431's highest-bill measure). Only the stated direction of its error is wrong, and the claim does hold for gas-heated homes.
  • Fix: reword the row, the comment and interpretation 1. For example: "annual averages approximate the application-month bill; for electric bills they overstate a heating-season month in Louisiana (EIA 2024–2025: about 0.86 of the annual average), and for gas bills they understate it."

G3. Count disability-based benefit receipt toward the priority supplement.

  • Where: V/la_liheap.py:53 reads only is_disabled. Axiom interpretation 8 says it "stands in for documented disability".
  • The source. The guide gives the $100 for "Persons who are disabled" and says "Disability can be proven through the Social Security Administration, Veteran Affairs, Worker Compensation, or any other medical approved documentation" (4.2 A, p. 41; April 2026 p. 48). An SSDI award letter is that SSA proof.
  • Example (2026, age 45, SSDI $14,400, is_disabled unset, in the Medicare waiting period so Part B is $0, electricity $1,740). 1,740 / 14,400 = 12.08%, so band 2:
    • Head: $350.
    • With SSDI counted: $450.
  • Why only a suggestion. Louisiana names a status, "persons who are disabled", which is_disabled encodes directly, and the guide lists proofs rather than adopting a benefit-receipt test. Add New Mexico LIHEAP regular heating assistance #10431 S4 (New Mexico, where receipt alone entitles) and Add Oklahoma LIHEAP regular heating assistance #9970 S3 were should items for that reason. Merged FL also reads is_disabled alone.
  • Fix: use is_disabled | (social_security_disability > 0) | ((ssi > 0) & is_ssi_disabled), as va_eap_disabled does. Do not use is_usda_disabled, which also counts aged SSI. Add an SSDI case without is_disabled.

G4. Record the plan-vs-guide income choices in source_conflicts/candidates.yaml.

  • The choices. The body and the comments in V/income/la_liheap_countable_income.py:43-46 follow the guide over plan 1.9 (p. 6) in four places:
    • Lump sums. The plan checks one-time lump sums; the guide counts only net gambling and lottery winnings.
    • Cash gifts. The plan leaves cash gifts unchecked; the guide counts regular contributions.
    • Commissions. The plan leaves them unchecked; the guide counts them as earned income.
    • The utility allowance exemption. Plan 2.3 says "over 60"; the guide says "60 years or older".
  • What the PR says. Axiom interpretation 12 says no candidate was added "since no statute is on either side".
  • The precedent. main already records the same kind of conflict without a statute. us-al:liheap-lump-sums-and-refunds (manual vs plan 1.9, "No statute is supplied") and us-sd:liheap-cash-gifts are candidates.
  • Fix: add one or two us-la:liheap-... candidates, with pe_us.follows, the code paths and prs listing this PR. The guide is the right choice, so no code change is needed.

Verified correct

Values against sources:

  • Income limit (plan 2.1, 60% SMI, p. 9; guide 3.6 C.1, p. 29; April 2026 p. 34):
    • FFY2026. floor(0.6 × 98,137) = 58,882, then × 0.52 / 0.68 / 0.84 / 1.00 / 1.16 / 1.32 / 1.35 / 1.38 / 1.41 / 1.44, floored, gives 30,618, 40,039, 49,460, 58,882, 68,303, 77,724, 79,490, 81,257, 83,023 and 84,790. All ten match Notice LHP-2025-01.
    • FFY2025 from $95,801: 29,889, 39,086, 48,283, 57,480, 66,676, 75,873, 77,598, 79,322, 81,046 and 82,771. All ten match LHP-2024-01.
    • The comparison. "Must not exceed" is <=.
  • Federal 110% floor (42 U.S.C. 8624(b)(2)(B); IM 2025-02 Att. 2, $17,215 for one person):
    • strict <, on the counted size;
    • size 13: limit 90,089 > floor 89,815;
    • size 14: floor 95,865 > limit 91,855;
    • the floor binds from size 14 up, as the body says.
  • Matrix: 200 / 250, 350 / 400, 500 / 550 and 650 / 700 for sizes 1–3 / 4+, plus $100 once for 60 or older, disabled, or five or younger. The maximum is $800, matching plan 2.6 and the matrix footnote.
    • Zero income. The size maximum, per guide 4.2 (p. 41) and plan 2.4 (p. 10).
    • Bands. The lower-inclusive cutoffs (truncating the percent to one decimal) are a documented reading, Axiom interpretation 2.
  • Total energy cost (guide 4.1, pp. 37-38; April 2026 pp. 43-44):
    • All seven bill inputs are added, electricity included. Fuel type is not a benefit variable (plan 2.5 leaves "Fuel type" unchecked).
    • Water and sewer are excluded.
    • Line items cannot be separated from bill totals; documented.
  • Utility allowance (plan 2.3; guide 3.6 E.1 and 4.1 C, pp. 35, 40; April 2026 pp. 41, 46-47):
    • It is deducted when subsidized (receives_housing_assistance or is_in_public_housing), and a member 60 or older exempts the household.
    • A negative TEC is ineligible ("If the TEC is a negative amount, the household is not eligible"). A TEC of zero is read as "no energy burden".
    • Documented readings, accepted: no input names the applicant, although the April 2026 guide defines one (p. 33); the guide's "60 years or older" is followed over plan 2.3's "over 60"; a supplied allowance should cover heating and cooling only.
  • Electricity and the New Mexico failure modes (hand traces, 2026, single adult aged 40, wages $12,000, electricity $1,080):
    • (a) A subsidized tenant with gas heat in the rent who pays the electric bill: responsible through heat in rent, TEC 1,080 > 0, 9.0%, $200.
    • (c) The same tenant unsubsidized: also $200.
    • (b) A NONE household is excluded, which is right for a heating award; it belongs to the cooling component (G1).
  • Eligibility:
    • no categorical eligibility (plan 1.4 "No", p. 5);
    • no assets test (2.3);
    • at least one citizen or qualified noncitizen, with size counting only those members while undocumented members' income still counts (guide 3.6 D and D.3, pp. 33-34; April 2026 pp. 40-41);
    • responsibility through a primary-fuel bill or heat in rent (3.6 E);
    • UNSPECIFIED only with heat in rent. heating_type is a required input, settled in Add Virginia EAP Fuel Assistance (LIHEAP regular heating) #10303 G2.
  • Countable income (guide 3.6 C.1, pp. 29-30; Appendix E, pp. 81-86; plan 1.8-1.9, pp. 5-7, rendered):
    • Gross basis. Gross income (1.8). Wages gross. Self-employment net and floored per source.
    • Unearned list. Pensions and annuities, military retirement (with SBP), railroad (guide: "Gross Railroad retirement"), survivor, veterans, workers' compensation, employment disability, unemployment, strike, alimony, interest, dividends, net rental, estates and trusts, and regular contributions.
    • Exclusions. Child support, capital gains, bank and retirement-account withdrawals, tax refunds and SNAP are excluded. General assistance is not counted (plan box unchecked, not in the guide).
    • Minors and students. Earnings of minors and of 18-year-olds in high school are excluded (Appendix E p. 82; April 2026 p. 89). Social Security and SSI count at any age: the Appendix E row "Social Security Benefits (SS, SSD, SSI)" includes "benefits paid to minors" (p. 85, rendered), and FAQ A4 says "count the social security income that the parent is receiving on behalf of their minor child".
    • Social Security net of Part B is correct here. The guide counts "Net Social Security Administration (SSA) benefits", and plan 1.9 checks "Excluding MediCare deduction" (p. 6, rendered). medicare_part_b_premium is the enrollee's out-of-pocket premium net of MSP, floored per person. That matches the wave's Medicare precedent, and the Part B-only reading follows the Iowa precedent for check-withheld deductions.
    • FITAP counts once through the take-up-gated tanf, which includes la_fitap.
    • No inputs exist for royalties, jury pay, military allotments, training stipends or KCSP; documented.
  • References (item 7):
    • Every anchor I opened shows its value: plan pp. 5-7, 9 and 10; 2024 guide pp. 29-30, 33, 35, 37-38, 40-41, 82 and 84-85; April 2026 guide pp. 34-35, 39-41, 43-44, 46-48, 89 and 91-92; FAQ p. 2; IM Att. 2 p. 1.
    • Multi-page titles use the quoted #page 29,82,85 form with the href on the first page, and variables use # PDF pages comments.
    • The two guide editions are separate entries, as separate documents.
  • Descriptions (item 6): all 12 end "under the Low Income Home Energy Assistance Program." with nothing after it.
  • Years:
    • 2026 is verified.
    • 2025 is an unclaimed backfill, and the published FY2025 items match: the plan's 60% SMI, $200–$800, the $100 supplement and zero-income maximum, and all ten LHP-2024-01 rows. The FY2025 matrix is not on the Clearinghouse.
    • 2027 carries forward. Only a proposed FFY2027 plan exists (status "Saved -- with Errors"); it keeps 60% SMI and says "No Changes." to the matrix, and LHC links no FFY2027 income notice. The body says all of this, and the registry claims only 2026.

Hand-checked expectations (all 49 cases). All are 2026, with a size-1 limit of 30,618:

  • Eligibility Cases 1–2: 30,618 ≤ 30,618 is true; 30,619 is above the limit and the $17,215 floor, so false.
  • Eligibility Cases 3–5: size 13, 90,090 exceeds limit 90,089 and floor 89,815, so false. Size 14, 95,864 < 95,865 = 1.1 × (15,650 + 5,500 × 13), so true. At 95,865, false.
  • Eligibility Cases 6–9: an electric bill of $0 with heat not in rent is false. NONE with heat in rent is false. UNSPECIFIED with heat in rent is true; without it, false.
  • Eligibility Cases 10–12: TEC 1,740 − 1,200 = 540 gives true. 1,740 − 1,740 = 0 gives false. Age 60 is exempt, so TEC 1,500 gives true.
  • Income-limit Cases 1–5: 30,618 (size 1, the undocumented member not counted); 58,882; floor(58,882 × 1.44) = 84,790; floor(58,882 × 1.56) = 91,855; size 0 gives 0.
  • Countable Case 1: 15,080 + 3,000 + max(−1,500, 0) + max(−1,800, 0) = 18,080.
  • Countable Cases 2–3: 30,000 + 6,000 = 36,000 (the 17-year-old excluded); 30,000 (the 18-year-old in high school excluded).
  • Countable Case 4: 15,080 + 12,000 (the child's Social Security; no Part B under 65) = 27,080.
  • Countable Case 5: (24,000 − 2,434.80) + 6,000 + max(1,800 − 2,434.80, 0) = 27,565.20.
  • Countable Cases 6–8: 20,000 + 1,500 + 0 = 21,500; 15,080 (child support, capital gains and the IRA withdrawal excluded); tanf 5,808.
  • Countable Cases 9–11: 15,080 + 20,000 = 35,080; 11,928 + 1,200 = 13,128; 30,000 + 6,000 SSI = 36,000 (the minor's interest and dividends excluded).
  • la_liheap.yaml Cases 1–2: 1,799 / 18,000 = 0.09994, band 1, $200; 0.10, band 2, $350 (age 59 adds nothing).
  • Cases 3–4: (1,200 + 2,400) / 20,000 = 0.18, band 3: $500 at size 3 (age 6 adds nothing) and $550 at size 4.
  • Cases 5–6: 2,000 / 8,000 = 0.25 gives $650; zero income at size 4 gives $700.
  • Cases 7–9: 1,740 / 14,400 = 0.1208 gives 350 + 100 = $450. 2,400 / 11,928 = 0.2012 gives 500 + 100 = $600 (size 1, income 11,928, TEC 2,400). 1,740 / 15,080 = 0.1154 at size 2, with the 5-year-old, gives $450.
  • Case 10: 1,740 / 19,080 = 0.0912 gives $200; the undocumented 65-year-old adds no member and no supplement.
  • Case 11: (900 + 1,740) / 6,000 = 0.44 at size 4 gives 700 + 100 once = $800.
  • Cases 12–14: heat in rent with no bills gives burden 0 and $200. TEC 2,400 − 1,440 = 960, and 960 / 15,080 = 0.0637, gives $200. TEC −300 is ineligible, so $0.
  • Energy cost Cases 1–5: 600 + 1,740 + 200 = 2,540 (water and sewer excluded, no allowance unsubsidized); 540; public housing gives 1,500 − 1,800 = −300; a member of 60 gives 1,740; an undocumented 65-year-old exempts nothing, so 540.
  • Case count: 14 + 5 + 11 + 14 + 5 = 49, as the body says.

Batch checks:

Wiring and housekeeping:

  • Registry. The LA entry sits between KY and MD, and LA is added to the coverage line. verified_years: "2026". test_programs_registry passed.
  • Aggregates and take-up. There is no aggregate wiring, which matches every merged LIHEAP state. There is no take-up beyond tanf's.
  • Gating. defined_for = StateCode.LA is on 5 variables, and la_liheap is gated by la_liheap_eligible.
  • Changelog. changelog.d/la-liheap-wave1d.added.md is top level and typed added.
  • Tests. The files are variable-named and every period is plain. Every case sends heating_type.

Checklist results (LIHEAP batch):

  1. State plan and manual: every published cell matches (limits, matrix, supplement, allowance rule).
  2. Income definition: pass. Gross wages, Social Security net of Part B per the guide and plan 1.9, per-source floors, adults only apart from Social Security and SSI, annual amounts.
  3. Backdating: pass for 2026. 2025 matches the published FY2025 items, and 2027 is a documented carry-forward.
  4. Household and arrangement rules: pass. Heat in rent, the subsidized allowance, the age-60 exemption and undocumented members are each tested apart from the public-housing branch (S1). Cooling is G1.
  5. Tests: 49 cases, all hand-checked, all periods plain. Source coverage is S1.
  6. Descriptions: pass.
  7. References: pass.
  8. Wiring: pass.
  9. Axiom: valid (DC TANF maximum monthly income #1890).
  10. Branch and CI: a clean merge with main; 29 pass and 3 skipping.
  11. Integrate modeled state unemployment insurance into income flows #9558: pass (unpinned, S1).
  12. IIJA / FY2027: not applicable / proposed only.
  13. Mutation check: 17 source entries and the public-housing eligibility branch are unpinned (S1).
  14. Document disjoint health premium inputs and correct consumer treatment #10046: not applicable.
  15. State-gated index defaults: safe.
  16. Wire military retirement pay and survivors into federal and state tax (#10181) #10182 / Count military SBP annuities in state benefit income lists #10317: pass.
  17. Merged state SSPs: la_oss exists, but its recipients live in medical facilities outside the LIHEAP household; no change needed.

Axiom line assessment

Valid: axiom: TheAxiomFoundation/rulespec-us#1890 queued.

  • State: OPEN, labelled pe-parity, created 2026-10-23 22:16 UTC.
  • It matches the head. It names head 7c35019e79 and merge base 6a92d6a983. It lists the 12 parameters (5 earned and 16 unearned sources, 7 bills), the 6 variables and the 49 cases by file. Its required outputs (size, countable income, limit, total energy cost, eligibility and benefit) describe the head's code.
  • It is dispatch-ready in the rulespec-us#1467 format:
    • proposed us-la/ module paths, with corpus status per source;
    • verbatim text of the plan items, both guide editions, Appendix E, the matrix, both notices, FAQ A4 and the federal tables;
    • 13 companion tests derived from the sources, not from PE output;
    • 14 interpretations, including the cooling scope, the band edges, the plan-vs-guide choices and the federal floor;
    • its blockers: sources missing from the corpus, an unchecked signed release, billed-run approval and no reviewed oracle revision.
  • Note. S1 adds cases, so update the case counts. G2 changes interpretation 1, G3 interpretation 8, and G4 interpretation 12. Update the issue with the head that resolves them.

CI status

29 pass, 3 skipping, 0 failed. Run 40032541588 tested head 7c35019e79 (pull_request, created 2026-10-23 22:16 UTC, after #10287 and the 2026-10-21 cutoff). The three skipping entries belong to the "Pull request" parent workflow of run 40032336811, which did not execute. I re-checked gh pr checks 10429 at the end of this review.

  • Louisiana tests. States-shard-4, batch 5/13 (states/la), ran all 5 files: 14 + 5 + 11 + 14 + 5 = 49 passed.
  • Guards:
    • in Rest shard-1: the four test_military_retirement_readers.py tests and the test_source_conflicts.py tests, including the ratchet and the candidate checks;
    • in the second Rest job: the four test_unemployment_compensation_readers.py tests, test_members_are_state_gated and test_programs_registry.
  • Also passing: Microsimulation, Household API Partners, PR validation, Package and compatibility, Quick Feedback, codecov, and every baseline and contrib shard.
  • Known main-caused failure: not applicable.
  • Locally: I ran no tests or model probes. The S1 and G1–G3 examples are hand traces of the code at the head. The only local scripts were the static comment-pattern scan and the EIA monthly ratios.

Branch status

0 critical, 1 should and 4 suggestions are open at this head.

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.

The tables check out: all 10 FFY2026 (and FFY2025) limits, the 8-cell matrix, the $100 supplement, the utility allowance, electricity counted in total energy cost, Social Security net of Part B, and the 110% floor from size 14. All 49 cases hand-check, and rulespec-us#1890 is valid. One should-address item: 17 of 21 income sources never take a positive counted value in a test, and the is_in_public_housing branch is unpinned. Four suggestions, including that cooling, LA's larger component, is out of scope and the body's 'winter bills exceed the average' claim runs backwards for all-electric homes. 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 Louisiana LIHEAP regular heating assistance

2 participants