Repository navigation
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 4 5 +1
Lines 76 119 +43
Branches 2 4 +2
=========================================
+ Hits 76 119 +43
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.
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 (applied as heating from October through May and as cooling from June through September). 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, 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, propane households 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 overhas_heating_expenseorheat_expense_included_in_rent;NONEineligible,UNSPECIFIEDonly with heat in rentCountable income
financial_assistance), pensions and annuities, military retirement (with survivor annuities), survivor and disability benefits, dividends, rental and estate income, net gambling winningsmedicare_part_b_premium, floored at zero per personBenefit
Not modeled and source notes
FY2027 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 through parameter backfilling.
Microsimulation:
heating_typeand the per-fuel bills are not in current datasets; callers must supply them.Test plan
49 YAML cases in 4 files (not re-run locally after the review fixes; 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, and
NONEorUNSPECIFIEDfuel that stays ineligible even with a heating expense;countable income: a 17-year-old, an 18-year-old non-dependent and an adult dependent, Social Security net of Part B, 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, the propane minimum in FY2026 and none in FY2027, 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