Repository navigation
Add Tennessee LIHEAP regular energy assistance - #10430
Conversation
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 #10430 +/- ##
==========================================
Coverage 100.00% 100.00%
==========================================
Files 1 6 +5
Lines 15 136 +121
Branches 0 5 +5
==========================================
+ Hits 15 136 +121
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:
|
PR Review: Add Tennessee LIHEAP regular energy assistancePR #10430 (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, limits and benefit mechanics are encoded correctly:
There are no critical findings and three should-address items:
There are also five suggestions:
Status.
Critical (must fix)None. Should addressS1. Eligibility requires a primary-heating-fuel bill and excludes
|
| Test | Hand computation | Expected |
|---|---|---|
tn_liheap Case 1 |
top A 15,650 × 0.71 = 11,111.50 (income at top, group A); 1,680 / 11,111.50 = 0.1512, column 6 | 560 |
tn_liheap Case 2 |
11,111.51, group B; 0.1512, column 6 | 555 |
tn_liheap Case 4 |
18,310.51 > 15,650 × 1.17, group D; 2,580 / 18,310.51 = 0.1409, column 6 | 540 |
tn_liheap Case 5 |
2,429 / 20,000 = 0.12145, rounded half up to 0.1215, column 6, group D | 540 |
tn_liheap Case 6 |
1,018.80 / 20,000 = 0.05094, 0.0509, column 1 | 174 |
tn_liheap Case 7 |
zero income: column 9, group A | 750 |
tn_liheap Case 10 |
size 6, top A 43,150 × 0.71 = 30,636.50; 2,280 / 30,160 = 0.0756, column 3; sizes 6-8 A | 565 |
tn_liheap Case 11 |
size 13, guideline 81,650: tops 57,971.50 and 71,035.50, so 68,000 is group B; 0.06, column 2; 9+ B | 525 |
tn_liheap Case 12 |
1,200 / 20,000 = 0.06, column 2, group D 250; max(250, 500) | 500 |
tn_liheap Case 13 |
2,880 / 15,080 = 0.1910, column 7, group C 700 ≥ 500 | 700 |
tn_liheap Case 17 (2027) |
size 4, printed B top 28,710.51 (income at top, group B); 2,600 / 28,710.51 = 0.0906, column 4; sizes 3-5 B | 505 |
tn_liheap Case 18 (2027) |
size 13, printed tops 59,597.50 and 73,027.50, so 70,000 is group B; 0.06, column 2; 9+ B | 605 |
tn_liheap Case 20 |
size 3, top C 26,650 × 1.17 = 31,180.50 (rounded to cents, group C); 2,880 / 31,180.50 = 0.0924, column 4; sizes 3-5 C | 400 |
tn_liheap Case 21 (2027) |
size 9: 1.5 × 61,400 = 92,100; 60% SMI 63,196 × 1.41 = 89,106; C top 71,838.50, so group D; 0.0467, column 1 | 92,100 / 540 |
| eligibility Cases 3 and 4 | limit floor(61,641 × 1.59) = 98,009; floor (15,650 + 5,500 × 14) × 1.1 = 101,915; 101,914 < 101,915 but 101,915 is not | true / false |
| income limit Case 6 (2027) | 1.5 × (15,960 + 5,680 × 12) = 126,180 | 126,180 |
| countable Case 5 | (24,000 − 2,434.80) + max(1,800 − 2,434.80, 0) | 21,565.20 |
| countable Case 11 | 994 × 12 + 1,200 | 13,128 |
Batch checks:
- 1. Plan and manual first. All cells, tops and limits were checked as above. The FY2026 and FY2027 timing (October 1 parameter dates; model year = federal FY) is right.
- FY2027 values. They come from the posted LI-12, whose $300/$800 range equals both draft-plan versions' item 2.6, and the stated 9-and-over rule appears in both drafts. The registry's
verified_years: "2026-2027"is backed by published values (contrast Add Vermont Seasonal Fuel Assistance #10436 S3).
- FY2027 values. They come from the posted LI-12, whose $300/$800 range equals both draft-plan versions' item 2.6, and the stated 9-and-over rule appears in both drafts. The registry's
- 2. Income.
- Gross basis. Gross income (plan 1.8), with wages "before any deductions", so Document disjoint health premium inputs and correct consumer treatment #10046 premiums are not deducted.
- Medicare. See S2.
- Losses. They are floored per source and per person.
- Period. Annual amounts stand in for 30-day income, as documented.
- 3. Backdating. Only 2026-2027 are claimed (see G5).
- 4. Arrangements.
- Housing. Heat in rent is eligible and gets the separately billed burden (documented lower bound). Subsidized tenants meet no added condition (2.18).
- Eligibility rules. There is no categorical eligibility (plan 1.4, "No"), no asset test and no supplement.
- Fuel. See S1.
- 5. Tests. Periods are plain. The edges are covered: the exact limit, the floor on both sides, income at printed tops, the rounding tie and sizes 1, 2, 3, 6, 8, 9, 13 and 15.
- 6. Descriptions. All 19 follow the house template.
- 7. References. Every anchor I opened shows its value:
- 2026 manual: p. 8 (Child, Annual Average), p. 9 (Household Income), pp. 17-18 (mixed status), p. 24 (2.10), p. 25 (propane), pp. 27-28 (2.13), pp. 31-32 (2.17) and p. 34 (Benefit Levels).
- Plans: the FY2026 plan's pp. 5-7 (1.8-1.9), p. 8 (2.1) and p. 9 (2.5-2.6); the FY2027 draft's p. 9 (2.1) and p. 12 (2.5-2.6).
- Draft 2027 manual: p. 18 (deliverable fuels), p. 27 (2.10), p. 29 (2.13) and p. 30 (exclusions).
- Workshop: pp. 28-30.
- Form. Multi-page titles use
#page a-bor#page a,b, and the variable tuples carry# PDF pagescomments.
- 8. Wiring. The
programs.yamlentry is complete. No merged LIHEAP state feeds a household aggregate, so none is needed. Every variable is gated byStateCode.TNortn_liheap_eligible. - 11, Integrate modeled state unemployment insurance into income flows #9558. The list reads
total_unemployment_compensation. - 12. IIJA. There is no IIJA supplement.
- 13. Mutation. See S3. Every eligibility and benefit branch other than the size-16 clip is pinned: both
uses_fpg_ratesbranches, the propane minimum in both years, zero income, size 0 and the floor. - 14. Health premiums. Tennessee deducts none from wages, and neither does the head.
- 15, NH Add New Hampshire state supplementation for 2026 #10156. For non-residents,
tn_liheap_household_sizeis 0, but every key stays valid:size_group.calc(0)is 1;clip(size, 1, 16)keeps the table row valid;- the column comes from a bracket calc or
amounts[-1]; fpgandliheap_smi_limituse size arithmetically, not as a key.
- 16, Wire military retirement pay and survivors into federal and state tax (#10181) #10182. The list reads
military_retirement_income. - 17. State SSP. Tennessee "does not provide optional supplementation" (SSA), and
mainhas notn_ssp. SSI is counted, so nothing is missing. - Federal floor. 42 U.S.C. 8624(b)(2)(B) is applied with the 2025 guideline in FY2026 and the 2026 guideline in FY2027.
- Count each Social Security benefit once in Pennsylvania CCW countable income #10408 pattern.
social_securityis read once, in Python, and no list names it or a component.survivor_benefitsanddisability_benefitsare non-Social Security inputs. - Changelog. A top-level
changelog.d/tn-liheap-wave1d.added.md.
Axiom line assessment
axiom: TheAxiomFoundation/rulespec-us#1891 queued is valid.
- The issue. It is OPEN and labelled
pe-parity, and it is dispatch-ready: proposed module paths, corpus citations and status, verbatim source text, required outputs and companion tests computed from the matrices, plans and manual. - The blocker. There is no reviewed oracle revision; the workshop deck, the draft FY2027 manual and plan, and the IM are missing from the corpus; and billed runs need approval.
- The match. It describes head
5ddb74f1ccand the 49 cases (21/10/7/11), withtotal_unemployment_compensationandmilitary_retirement_incomein the unearned list. - After the fixes. Refresh the head SHA and case counts; interpretation 8 and companion test 9(a)-(b) (S1); interpretation 13 and companion test 12(b) (S2); the new companion tests (S3, including the fuel-oil award 9(f) already described); and interpretation 10 if G3 is taken.
CI status
gh pr checks 10430 at head 5ddb74f1cc: 29 pass and 3 skipping (the superseded run 40032341205). Run 40032551559 covers the head:
- Coverage. All baseline and contrib shards, the guard tests, the household partner suite, microsimulation and Codecov pass.
- Failures. None.
Branch status
- Distance. 2 commits ahead of
main(the feature commit and a merge ofmainat6a92d6a983) and 60 behind currentmain. - Merge check.
git merge-tree --write-tree PolicyEngine/main 5ddb74f1ccreports one conflict, the LIHEAPcoverage:line inprograms.yaml.mainhas since added AZ, IA and VA.- The fix is to keep
main's line and insert TN before TX. The TNstate_implementationsblock merges cleanly. - This is a sibling conflict and a branch note only.
- Guards on the merged tree.
- The Tie source-conflict markers to the register shared with Axiom #10287 ratchet finds no conflict-sounding comment in the PR's parameter or variable files.
- The Integrate modeled state unemployment insurance into income flows #9558 and Count military SBP annuities in state benefit income lists #10317 guards pass, and nothing the PR reads (
fpg, SMI, utility inputs, Medicare premiums) changed onmainsince the base. social_security_retirementbecame a formula, but an explicit input still overrides it, so countable Case 5 is unaffected.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes: 0 critical, 3 should (fuel-bill eligibility excludes households Tennessee serves; Medicare premium netting narrower than manual 2.13; untested income sources and branches). Full report in the comment above.
Apply DTrim99's round 1 review: tests that pin every income source, the rule and documentation fixes, and source-conflict candidates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…into tn-liheap-wave1d # Conflicts: # policyengine_us/programs.yaml # source_conflicts/candidates.yaml
|
Thanks, David. Round 1 is in
The PR body and TheAxiomFoundation/rulespec-us#1891 now describe this head, including the new companion tests and the 56 cases ( I did not run the tests locally; CI passed every check at |
PR Review (round 2): Add Tennessee LIHEAP regular energy assistancePR #10430 (author: hua7450), head Path prefixes:
SummaryAll three should items are fixed. Every suggestion was either taken or declined with a reason I accept.
Merge resolutions. Both hand-resolved blocks are correct.
No new path can go below zero. The benefit has no subtractive term: every matrix cell is at least $174, and the only adjustment is Axiom, CI and branch.
New findings: 0 critical, 0 should and 1 suggestion.
Prior findings
New findingsCriticalNone. Should addressNone. SuggestionsG-N1. Housekeeping: tick "CI passes". The body's test-plan checklist still has "CI passes" unchecked, but all 35 checks are green at this head. Its line saying that the round-1 cases were "not run locally; CI validates them" is now confirmed. VerifiedHand-checks of every new or changed expectation. FY2026 size-1 tops are A 11,111.50, B 13,615.50 and C 18,310.50 (0.71, 0.87 and 1.17 × 15,650), and the limit is 32,053.
Fix-commit checks:
Merge resolutions (both blocks):
Other checks:
AxiomValid:
CI35 pass, 0 fail, 0 pending. Run 40792560693 (
Branch
0 critical, 0 should and 1 suggestion are open at this head. Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Approving round 2: 0 critical, 0 should. All three round-1 shoulds are fixed and pinned, and no benefit path can go below zero. Full report in the comment above. Branch note: AK #10341 merged, so the coverage line needs AK + TN before landing.
…p-wave1d # Conflicts: # policyengine_us/programs.yaml
Adds Tennessee LIHEAP regular energy assistance for FY2026 and FY2027, administered by the Tennessee Housing Development Agency (THDA). Tennessee pays one benefit per program year from a single matrix; the manual applies it as heating from October through May and as cooling from June through September (p.35), and the FY2026 plan dates the components October 1 to April 30 and May 1 to September 30 (item 1.1). The model counts citizens and qualified noncitizens in household size (other members' income still counts), tests gross countable income against the income limit with the federal 110% poverty floor, requires an active energy account (a bill of any fuel) or energy included in the rent, divides total annual energy cost by income to get an energy burden rounded half up to four decimals, and reads the matrix amount by size group, income group and burden column: $174 to $750 in FY2026 and $300 to $800 in FY2027. In FY2026, households with propane heat or a propane bill receive at least $500, the manual's minimum propane payment.
Fixes #10420
Regulatory authority
Eligibility
defined_for = StateCode.TNtn_liheap_household_sizesumsis_citizen_or_legal_immigrant; size 0 is ineligibleliheap_smi_limit). FY2027: 60% of SMI for sizes 1-8 and 150% of the 2026 poverty guideline, rounded down, for sizes 9 and overtn_liheap_energy_costabove zero (a bill of any of the seven fuels) orheat_expense_included_in_rent. A home with no heating (NONE) and an electric bill is eligible, since the one award is applied as heating or cooling.UNSPECIFIEDfuel qualifies only with heat in rent:heating_typeis a required input and #9754 tracks its defaultCountable income
financial_assistance), survivor and disability benefits, dividends, rental and estate income, net gambling winningsmedicare_part_a_premiumandmedicare_part_b_premium, floored at zero (income/sources/net_of_medicare.yaml). The manual counts these benefits net of "Medicare premiums"; railroad annuities count as government pensions, and the Railroad Retirement Board withholds Part B premiums from themus-tn:liheap-retirement-account-withdrawals)Benefit
tn_liheap_energy_cost(annual electricity, gas, propane, fuel oil and kerosene, wood, coal and other bills) divided by annual countable income, rounded half up to four decimals as in the manual's example that rounds 0.0878822197 to 8.79% (p.31-32), so a burden of exactly 0.12145 starts the 0.1215 column. Columns start at 0, 0.0510, 0.0672, 0.0828, 0.0998, 0.1215, 0.1529, 0.2182 and 1.0000. Zero income uses the last column.bottled_gas_expense) are assumed to take that option. A propane-heated rental with heat in the rent also receives $500, because a heat-in-rent benefit is paid on the landlord's energy vendor account named on the LI-05 agreement. The draft FY2027 manual drops the minimum.Not modeled and source notes
us-tn:liheap-fy2027-large-household-limitsus-tn:liheap-fy2026-printed-income-ceilingsFY2027 relies on the posted LI-12 matrix while THDA's FY2027 plan (status Saved) and manual are drafts; the program page still announces the 2025-26 season. Earlier years are unverified estimates: they backfill the FY2026 values and do not reproduce the priority-points matrix Tennessee used before FY2026 (workshop p.23).
Microsimulation:
heating_typeand the per-fuel bills are not in current datasets; callers must supply them.Test plan
56 YAML cases in 4 files:
tn_liheap.yaml25,eligibility/tn_liheap_eligible.yaml10,eligibility/tn_liheap_income_limit.yaml7 andincome/tn_liheap_countable_income.yaml14. The 7 cases added in review round 1 and the re-pinned eligibility Case 5 have hand-derived expected values and were not run locally; CI validates them.limits for FY2026 sizes 1, 8 and 13 and FY2027 sizes 8, 9 and 13, the exact-limit boundary and the size-15 floor; a home with no heating and an electric bill that is eligible ($445), and
UNSPECIFIEDfuel without heat in rent that is not;countable income: a 17-year-old, an 18-year-old non-dependent and an adult dependent; every listed earned source ($20,000) and unearned source ($66,000) with distinct amounts; Social Security net of Part B; railroad retirement, a private pension, military retirement with a survivor annuity and VA benefits net of Part A and Part B ($22,398.40); interest at $200 and $201, child support, gambling, TANF, SSI and outside support;
half-up rounding of a burden of exactly 0.12145 onto the 0.1215 column, zero income, income-group edges in FY2026 (including income exactly at a printed top) and at printed FY2027 tops, size groups, a size-13 household in each year, a size-9 FY2027 household eligible only under the 150% rule, a 17-person FY2027 household on the size-16 row beside a Kentucky household (
[605, 0]), electricity, fuel oil, wood, coal and other bills in one burden ($700), the propane minimum in FY2026 for propane heat, a propane bill under electric heat and propane heat in rent, none in FY2027, and heat in rent.YAML tests with expected values from the plans, matrices and manual
ruff formatChangelog fragment in
changelog.d/CI passes
axiom: TheAxiomFoundation/rulespec-us#1891 queued
🤖 Generated with Claude Code