Repository navigation
Add Georgia LIHEAP regular heating assistance - #9968
Conversation
…income - Add the published FY2025 Level I income cutoffs for sizes 1-16. - Make renters whose heat is in rent and who are billed for electric eligible (manual p89 row 3; p4 for subsidized renters with the bill in their name), paid the matrix amount for the main heating fuel. - Count Social Security net of the Medicare Part B premium; count military and railroad retirement; floor each income source at zero; read take-up-gated tanf instead of ga_tanf. - Shorten the registry note; set verified_years to 2025-2026. - Add period-2025, heat-in-rent, income-source and branch cases; tidy test comments. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The manual's income table (section 1200.7) includes lottery winnings and cash gifts; plan section 1.9 leaves both unchecked. Follow the manual: count gambling_winnings as the closest input for lottery winnings, and note that cash gifts have no input. Also note the same plan-versus-manual conflict for disability payments and workers' compensation, which the manual counts (pages 65 and 68) and the model already follows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 #9968 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 7 +3
Lines 76 112 +36
Branches 2 1 -1
=========================================
+ Hits 76 112 +36
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:
|
Quote manual 1100.14 (page 57) and the glossary (page 76) against 101.2, 1100.3 and 1100.5 a; the code keeps counting lawful immigrants in the size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # policyengine_us/programs.yaml
One reference entry per source; single-page citations keep the page only in the href; multi-page titles end with a quoted #page list and the href opens the first cited page; variable references use '# PDF pages ...' comments above multi-page hrefs (CLAUDE.md, PolicyEngine/policyengine-us PR 10009). Reference lines only. Also cite manual section 1100.4 (not 1100.5 a) for the undocumented-adults sentence in the household-size comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Calls liheap_smi_limit from PR 10019 instead of repeating the HHS floor-then-floor calculation. Limits are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Add Georgia LIHEAP regular heating assistancePR #9968: Add Georgia LIHEAP regular heating assistance (author: hua7450, head Scope: Georgia's LIHEAP regular heating assistance, run by DFCS through Community Action Agencies, for FY2025 and FY2026. The PR covers:
Cooling, crisis, weatherization, categorical eligibility and the $1,000 account-credit screen are out of scope. The PR changes 24 files: 9 parameters, 6 variables plus a helper module, 6 test files (54 cases), Overall: the FY2025 and FY2026 policy values are right.
There are no critical findings. The three should-address items:
All 54 cases pass locally at the head and on the merged tree. The model outputs quoted below were reproduced by running the head code, or the merged tree for S1. Values that a proposed fix or an earlier year's schedule would produce are hand computations and are labelled as such. The untested-logic claims in S2 were confirmed by mutating the code and rerunning the PR's tests. Path prefixes used below:
Line numbers refer to head Source Documents
Critical (Must Fix)None. Should AddressS1. Merge blocker: after merging main, the person source list reads the reported-only
|
| File:line | Current | Suggested |
|---|---|---|
P/income/minimum_age.yaml:1 |
"counts household members' income starting at this age" | "Georgia excludes the income of household members below this age under the Low Income Home Energy Assistance Program." |
P/income/monthly_interest_disregard.yaml:1 |
"disregards this amount of monthly interest income" | "Georgia excludes this amount of monthly interest income under the ..." |
P/income/sources/household.yaml:1 |
"counts these household benefits once" | "Georgia uses these household-level benefits as countable income under the ..." |
P/income/sources/person.yaml:1 |
"counts these income sources of adult household members" | "Georgia uses these sources as countable income of adult household members under the ..." |
P/payment/lower_income_uplift.yaml:1 |
"increases the heating payment by this amount for households in income Level I" | "Georgia provides this additional heating payment to households in income Level I under the ..." |
P/payment/maximum_table_size.yaml:1 |
"publishes Level I income thresholds through this household size" | "Georgia sets Level I income thresholds through this household size under the ..." |
The other three fit: smi_rate and lower_income_limit (limits) and base_amount (provides). Consistency: #9967 S4, #9972 S4 and #9745 S6.
Suggestions
G1. Backfilled years: FY2024 is published and could be claimed; FY2023 and earlier paid a different schedule
- Every single-dated parameter carries back to every earlier period, and the Level I cutoffs carry the FY2025 values back. The registry claims only 2025-2026 and the PR body calls other years "unverified backfilled estimates", so this is a suggestion (checklist item 3).
- FY2024 differs only in the cutoffs:
- The FY2024 matrix prints the same ten step 2 amounts and Level I tops of $11,687 / 15,283 / 18,879 / 21,904 / 26,072 / 29,668 / 30,342 / 31,016 / 31,691 / 32,365 / 33,039 / 33,713 / 34,388 / 35,062 / 35,736 / 36,411.
- The FY2024 plan has the same $400 / $810 range (p9) and the lowest-benefit sentence (p30).
- The limits reproduce from the repo's FY2024 median, $95,238: floor(floor(95,238 x 0.6) x 0.52) = 29,713, the printed "$29713".
- Reproduced: period 2024, one adult with $12,000 of wages and electric heat gets limit 29,713 and an award of $500. FY2024's size-1 Level I range is "$0 - $11687", so FY2024 paid $400 (hand-computed).
- Add a
2023-10-01entry for each size and setverified_years: "2024-2026".
- FY2023 and earlier paid a different schedule. The FY2023 guidelines pay "Level I $450", "Level II $350" and "Level III (vulnerable population) $500" (households with a member aged 60 or over), "for All Fuel Types".
- Reproduced: period 2023, one adult with $12,000 of wages and natural gas heat gets $660 at age 40 and at age 70. FY2023 paid $450 and $500. The limit, 28,058, does match FY2023's "$28,058".
- Either gate payments before FY2024 (merged NJ uses
eligibility/in_effect.yaml), or keep the documented backfill.
- Also cite the FY2025 documents where FY2025 values come from the
2025-10-01entry by backward extrapolation.P/payment/base_amount.yaml,P/payment/lower_income_uplift.yamlandP/payment/maximum_table_size.yamlcite only the FY2026 matrix, andP/eligibility/smi_rate.yamlcites only the FY2026 plan. The FY2025 matrix and the FY2025 plan, p. 8 show the same values for the claimed FY2025.
G2. Fuels and routes that are eligible but paid $0
- Reproduced at head (period 2026, $12,000 of wages and a $1,200 bill for the fuel): KEROSENE, COAL and SOLAR each give
ga_liheap_eligible: trueandga_liheap: 0.- KEROSENE:
heating_expensereadsfuel_oil_expensefor it, so the matrix's "OIL" row is the natural column. - SOLAR:
heating_expensereads the electric bill ("Solar-primary homes are assumed grid-tied with electric supplemental heat"), so the ELECTRIC row fits.
- KEROSENE:
- UNSPECIFIED on the electric-vendor route is eligible but gets $0 (
T/ga_liheap.yamlCase 16, unit 4). Theheating_typedocumentation calls UNSPECIFIED "the right value when heat is included in rent and the fuel is unknown", so it is the usual input for a renter on that route. Either pay a defined amount when the fuel is unknown (for example the ELECTRIC amount, since the payment goes to the electric vendor), or make eligibility match the $0. - The PR documents these as coverage gaps. Add a
# See #9754note atV/payment/ga_liheap_matrix_amount.py:46(Add New Jersey LIHEAP regular heating assistance #9745 G1, Add Alabama LIHEAP regular heating assistance #9967 G2).
G3. Cite the FY2024 matrix note and the current DFCS documents
- The FY2024 matrix explains the asterisk on "main heating fuel type*": "*Important! The main fuel type is not always where the benefit is applied. Example: A household is in the Level 1 income range. They heat their home with Natural Gas, and bring in both a Gas and Electric bill. Since they heat their home with Natural Gas , the household is eligible for a Natural Gas benefit -- even if they opt to apply all of their benefit toward their electric bill." The FY2025 and FY2026 sheets keep the asterisk but drop the note.
- That backs paying the main-fuel amount on the electric-vendor route (
V/eligibility/_ga_liheap_housing.py:20-41,V/payment/ga_liheap_matrix_amount.py:48-58). Cite it there and in the PR body. rulespec-us#1533 interpretation 6 says neither sheet prints a footnote.
- That backs paying the main-fuel amount on the electric-vendor route (
- PAMMS chapter 100, p. 4 (export dated 2026-10-07) is the current DFCS text of M section 100.
- "Be US citizens or lawfully admitted immigrant" supports the household-size reading over M p57's "Applicants where ALL household members are non-U.S. citizens". The DFCS LIHEAP page also says "The applicant needs to be a U.S. citizen or legally admitted immigrant."
- "Applicants who receive a vendor bill/statement for the main heating source are eligible for assistance" supports
T/eligibility/ga_liheap_eligible.yamlCase 5, where an unrelated bill does not count. M p4 says only "from their energy source". - The same chapter still prints "a minimum of $350 and maximum of $400", with a senior maximum (p5). Plan 16.1 (p30) says the updated matrix removed the senior rule, so the matrix governs. Say so in the PR body.
G4. Encode the printed Level I column, and consider exposing the two routes as variables
P/payment/base_amount.yamlstores Level II, andP/payment/lower_income_uplift.yamladds $100 for Level I. That reproduces all ten printed cells, but the sheets print two columns, not a rule.np.minimum.reduce(base_amounts)(V/payment/ga_liheap_matrix_amount.py:56) also gives the right Level I lowest amount only while the gap is the same for every fuel. Encoding the printed Level I column (a level-by-fuel breakdown) removes both assumptions (Correct the qualified_business_income variable formula #1533 interpretation 5).- The two routes in
V/eligibility/_ga_liheap_housing.pyare helper functions, so no YAML case can assert them. Boolean variables would let the route cases assert the route directly. This is optional.
G5. PR body: other direct-pay cases, a conflict-table row and small corrections
- Plan 16.1 pays "the lowest benefit amount" whenever "the benefit goes directly to the applicant". Besides rent that includes all utilities, M pays the applicant directly in three more cases:
- utilities paid to "the landlord or trailer park owner" (p89 row 4);
- subsidized tenants who pay "a landlord for utility costs" (p89 row 7, "Direct pay to applicant (999) or to electric supplier");
- households "whose energy suppliers have not signed a vendor supplier agreement" (p4; 1300.2, p70).
No input identifies them, and the model pays the main-fuel amount when they report a bill. Add a row to the not-modeled table; rulespec-us#1533 interpretation 7 already has it.
- Add a conflict-table row: plan 2.3, p. 8 answers "No" for "Renters Living in subsidized housing?" and "Renters with utilities included in the rent?", while M applies energy-burden rules to both (p4, p57, p82, p89). Add Alabama LIHEAP regular heating assistance #9967 G6 and Add Rhode Island LIHEAP regular heating assistance #9972 G6 made the same point.
- "Every case specifies
heating_type" is not quite right:T/income/ga_liheap_income.yamlCase 14 (line 463) has none. rulespec-us#1533 says so correctly. - Plan item 1.9 continues on p7 (stipends, foster-care funds, AmeriCorps payments, reimbursements and "Other", all unchecked). The title at
P/income/sources/person.yaml:57("#page 5-6") and the# PDF pages 5-6comment atV/income/ga_liheap_income.py:15could read 5-7. Every encoded category is on pp. 5-6, so this is polish.
G6. Test hygiene, FY2027 and issue housekeeping
hud_utility_allowance: 0appears nine times inT/ga_liheap_household_size.yamlandT/income/ga_liheap_income.yaml, but no Georgia variable reads it. The isolated limit and income tests also set fuels and bills that those variables never read, and the matrix-amount tests set fuel bills thatga_liheap_matrix_amountnever reads.- FY2027: the draft plan keeps 60% SMI, $400 / $810 and the 16.1 sentence, and DFCS has not published an FY2027 matrix. Period 2027 therefore carries the FY2026 cutoffs (reproduced: one-person limit $35,916 from the FFY2027 median, and $500 at $12,000 of wages). The printed cutoffs track about 23.6% of the four-person median times the size factor (see Verified correct), so the FY2027 cutoffs will probably rise; on that pattern the size-1 top would be about $14,127 (a hand projection, not a published value). Add the FY2027 matrix when DFCS publishes it.
- rulespec-us#1533 still calls the PR "open as a draft".
Verified correct
- Matrix (FY2026, FY2025):
- Step 2 amounts: ELECTRIC $500 / $400, NATURAL GAS $660 / $560, OIL $810 / $710, PROPANE $680 / $580, WOOD $500 / $400. Level I is Level II plus $100 for every fuel, and plan 2.6's $400-$810 range matches.
- Step 1: all 16 Level I tops in each year ($13,589 ... $42,336 and $12,995 ... $40,485), inclusive. Sizes above 16 use size 16, which the PR documents as provisional.
- The printed tops track floor(four-person SMI x 0.236 x size factor), with 0.23 at size 4, in all 32 FY2025-FY2026 cells and 13 of the 16 FY2024 cells. The odd size-4 value therefore recurs every year, and keeping the printed table, with the PR's comment, is right.
- Limits: all 16 FY2026 limits (34,549 ... 107,634) and all 16 FY2025 limits (33,038 ... 102,926) reproduce as floor(floor(0.6 x SMI) x size factor), with four-person SMIs of $110,736 and $105,893. The limit is inclusive ("at or below", M p50;
T/eligibility/ga_liheap_eligible.yamlCase 1). - Timing: heating runs 12/01/2025-07/31/2026 (plan 1.1, p4), so period 2026 (January 1, 2026) reads FY2026 and period 2025 reads FY2025.
- Income (plan 1.8 gross; M 1200.1-1200.7, p. 62-69):
- Members under 18 are excluded entirely (p62), and nonqualified adults' income counts (p51, p62).
- Every listed source has a basis in the Include column (rendered pages) or in plan 1.9: capital gains, alimony, child support, contribution/cash gift, disability payment and dividends (p65); farm income, interest, lottery winnings, pension and rental income (p66); RSDI, strike benefits, SSI, TANF, unemployment compensation, veterans' benefits and wages (p67); workers' compensation (p68); self-employment (1200.6, p64); general assistance and retirement benefits (plan 1.9). SNAP, tax refunds, HUD utility allowances and LIHEAP are excluded and not listed.
- Social Security is counted net of Part B (plan 1.9 "Excluding MediCare deduction"; M p69 "Health Premiums") and floored at zero. Railroad retirement is gross.
- Interest: "The first $25.00 in interest is disregarded" (p66), and interest "amounting to $25.00 or less per month" is excluded (p69). Applying it once per household is a documented reading.
- Losses are floored per source. TANF comes through the take-up-gated
tanf.financial_assistance("Cash financial assistance from friends or relatives outside the household") matches "Contribution/ Cash Gift".
- Household: size counts citizens and the 8 U.S.C. 1641 qualified statuses. Undocumented adults' income counts and they are left out of the size (M 1100.4, p51; 1100.5 b note, p52). DACA is not on the p51 list.
- Eligibility:
- Georgia residence. No asset test (plan 2.3 No).
- Categorical eligibility (plan 1.4 Yes; M 1100.12) is not applied, which is harmless: a household whose only income is SSI, TANF or SNAP is far below 60% SMI, and plan 1.6 says the benefit is the same.
- Energy burden:
- the household's own obligation or a bill for the primary fuel qualifies (M p3, p50, p4);
- unsubsidized rent that includes all utilities qualifies (p89 row 2);
- heat in rent with an electric bill qualifies with or without a subsidy (p89 row 3; p4 "if their utility bill is in their name");
- subsidized heat in rent with no bill fails (p57, p82, p89 row 5);
- NONE fails.
- Payment:
- Direct payment pays the level's lowest amount, $500 or $400 (plan 16.1, p30; p89 row 2 "Direct pay to Applicant (999)").
- The electric route pays the main-fuel amount (FY2024 note, G3).
- No bill cap: plan 2.5 leaves "Individual bill" unchecked.
- Code patterns:
- No hard-coded values.
defined_for = StateCode.GAon five variables, andga_liheapis gated byga_liheap_eligible. - Vectorized formulas. All 9 parameters are read, and the shared
liheap_smi_limithelper is reused. - Mixed Georgia and Alabama arrays mask correctly.
- No hard-coded values.
- Tests:
- 54 of 54 pass locally at head (policyengine-core 3.32.29) and on the merged tree. Periods are plain.
- Hand-checked against the matrices, plans and manual:
T/ga_liheap.yamlCases 1, 4, 9-17 and 19;- income Cases 1-6, 9 and 12;
- all 32 Level I boundary pairs and all 10 fuel cells;
- all 16 FY2026 limits and the three FY2025 limits;
- household size Case 1.
- Changelog:
changelog.d/ga-liheap.added.mdis top level and typedadded.
Checklist results (LIHEAP wave 2a)
- State plan and manual first: pass. I read the accepted FY2026 and FY2025 plans (rendered checkboxes), the FY2022-FY2024 plans, the FY2027 draft, M (rendered Include/Exclude columns and energy burden table), the FY2023-FY2026 matrices, the PAMMS export and the DFCS page. I verified every encoded amount, cutoff, limit and route.
- Income definition: pass at head. Gross income per plan 1.8 and M 1200.7; Social Security net of Part B per plan 1.9 and M p69; losses floored per source; annual income standing in for the monthly test. After rebase the list must read
total_unemployment_compensation(S1). - Backdating: FY2025 is claimed and correct. FY2024 is published with different cutoffs, and FY2023 used a different schedule; both are unclaimed and documented (G1). No FY2027 matrix is published (G6).
- Household and arrangement rules: pass on subsidized and public housing, heat in rent (both routes), renters, categorical eligibility (a harmless omission) and the elderly priority (timing only). Eligible-but-$0 fuels are in G2; the other direct-pay cases are in G5.
- Tests: 54 cases, more than 8 hand-checked. Limits for sizes 1-16, cutoffs for sizes 1-16 with one-cent pairs, the limit edge and plain periods are covered. Gaps are in S2.
- Parameter descriptions: six fall outside the template (S3). There are no trailing clauses.
- References: pass. Every anchor is a file page that shows the value, and multi-page titles use
#page 66,69,#page 62-69,83and#page 5-6(item 1.9 runs onto p7, G5). - Wiring: pass. The
programs.yamlentry and coverage line are well formed. No aggregate wiring, which matches OR, NY, NJ and MD on main (none of them is inhousehold_state_benefits).defined_forgating is on every variable. No take-up beyond TANF's. - Axiom: valid
queuedline. rulespec-us#1533 is open, labelledpe-parity, dispatch-ready and current to50aaa0096e. It needs updates for S1-S2 (see below). - Branch and CI: all checks are green at head. 12 ahead and 82 behind main. No textual conflicts, but main's UI guard fails on the merged tree (S1).
- Integrate modeled state unemployment insurance into income flows #9558: S1. No modeled Georgia UI exists, so the effect today is the guard failure only.
- IIJA and FY2027: no IIJA supplement. None of the FY2022-FY2026 plans, the FY2027 draft or M mentions one, and the matrices print one amount per fuel and level. The FY2027 draft keeps 60% SMI, $400-$810 and the 16.1 sentence (G6).
- Mutation check: S2. Two control mutations fail as expected.
CI status
28 of 28 checks pass at 50aaa0096e (gh pr checks 9968, run of 2026-10-12). The three "skipping" entries belong to a superseded run on the same SHA.
Branch status
- 12 commits ahead of
mainand 82 behind. The merge base is1d699fec2d(Share one HHS SMI helper for LIHEAP income limits #10019); main is at8ae01aa3cb. git merge-tree --write-tree PolicyEngine/main 50aaa0096eexits 0 with no textual conflicts.programs.yamlmerges tocoverage: DC, GA, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OR, TX.- Semantic conflict: main's Integrate modeled state unemployment insurance into income flows #9558 guard fails on the merged tree (S1). The PR's 54 cases pass there.
- The other main commits since the merge base that touch premiums (Document disjoint health premium inputs and correct consumer treatment #10046, Uprate premium inputs by premium series, not CMS out-of-pocket spending #10085, Charge the Part D income-related premium only to Part D enrollees #10115) leave
medicare_part_b_premiumunchanged, and every input the Georgia variables read still exists on main. - The wave 2a siblings (Add Alabama LIHEAP regular heating assistance #9967-Add Ohio HEAP regular heating assistance #9975) touch the same LIHEAP coverage line, which is a branch note, not a finding.
Axiom line
axiom: TheAxiomFoundation/rulespec-us#1533 queued: valid format, and the issue meets the bar.
- rulespec-us#1533 is open and labelled
pe-parity(plusenhancement), with no comments, and was last updated 2026-10-12. - It is dispatch-ready under the Add AMT parameters for 2020-2023 #1467 standard. It has:
- proposed
us-ga/module paths with corpus status; - verbatim manual, plan, matrix and HHS text;
- required outputs for all 6 variables;
- 15 companion tests derived from the matrices, plans, manual and HHS tables ("None is taken from policyengine-us output").
- proposed
- It describes head
50aaa0096ecorrectly, including the electric route (interpretation 6), the $0 fuels (9), the plan-manual conflicts (10), the household-size conflict (16) and the carried-forward years (20). - Updates needed when the fixes land:
- the input list and a UI case (S1);
- the new source and branch cases (S2);
- the FY2024 note for interpretation 6 (G3);
- the stale "open as a draft".
Next steps
- S1: rebase onto main, switch
P/income/sources/person.yaml:13tototal_unemployment_compensation, and add a case with unemployment compensation. - S2: add the all-sources case, the subsidized electric-route case and the size-0 limit assertion.
- S3: align the six descriptions.
- Optionally address G1-G6, then refresh the PR body and rulespec-us#1533 and re-request review.
0 critical and 3 should-address findings, plus 6 suggestions.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes for 3 should items; details in the full report above. The FY2026 values check out: all 10 step-2 amounts, all 32 Level I cutoffs and all 32 income limits (60% SMI, floor then floor). Social Security net of Part B is right for Georgia, and the direct-pay and electric-vendor awards follow the manual and plan. All 54 tests pass and CI is green. (1) Merge blocker from main's #9558: the guard fails on the merged tree at income/sources/person.yaml:13, which lists the raw unemployment_compensation. (2) Logic that passes every test even when broken on purpose: 8 of the 24 person income sources are never set to a nonzero value (including disability, workers' comp and general assistance), along with the electric route's tenant_pays_utilities condition and the size-0 income-limit mask. (3) Six parameter descriptions are off the house template.
- S1: Merge blocker: the person source list reads the raw unemployment_compensation, so main's #9558 guard fails - S2: Eight income sources and two smaller pieces of logic are not pinned by any test - S3: Six parameter descriptions fall outside the house template - REC-C: Federal 110%-of-poverty floor (coordinator recommendation C; not raised by David for GA) Also applies the in-scope suggestions. Tests not run locally; CI validates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review. Fixes pushed in b36ba40.
|
PR Review (round 2): Add Georgia LIHEAP regular heating assistancePR #9968 (author: hua7450). This round reviews head
Neither merge had a hand-resolved conflict. The only Georgia-relevant file either merge touched is the Path prefixes, as in round 1: SummaryZiming fixed all three round-1 should items:
Of the six suggestions:
His second commit also fixes Pavel's four should items:
There are no new critical or should findings. One new suggestion (checklist item 16): #10182 reached
Batch checks:
Every new or changed expectation checks by hand: 8 new cases, 1 changed case, and 24 cases whose unread inputs were removed. CI is 29/29 green at the head. The branch is 16 ahead of Prior findings status
Pavel's review (between rounds). His four should items are fixed:
Of his suggestions:
New findingsCritical (must fix)None. Should addressNone. Suggestions1. After #10182, count military SBP survivor annuities through
Verified
Checklist results (LIHEAP wave 2a)
Axiom line assessmentValid:
CI status29 pass, 0 pending, 0 failed (run 39324223311 on head
Branch status
Verdict: APPROVE |
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
IDs: C = critical, S = should address, G = suggestion. S1-S7 and G1-G16 carry over from the prior review at b36ba40f71 with their IDs unchanged; S8 and G17-G21 are new in this round. S8 is the S4 defect with a heating-fuel bill in place of the electric bill. It gets a new ID, not "S4 partial", because S4 as reported (the electric bill) is fixed exactly as recommended; the heating-fuel case was already present at b36ba40f71 and was not part of S4.
Source Documents
- Statute: 42 U.S.C. 8624(b)(2)(B) (HTML; "less than 110 percent" proviso; anchor verified)
- PDF: LIHEAP poverty guideline tables, IM 2025-02 Att. 2 and IM 2024-02 Att. 2 (3 pages each)
- HTML: LIHEAP IM 2026-01 (published April 24, 2026; supports only the unclaimed 2027 lag)
- PDF: Georgia LIHEAP State Plan FY2026 and FY2025 (47 pages each; pp. 8, 30 and 43 re-read)
- PDF: Georgia LIHEAP Policy Manual, January 2022 (89 pages; "M" below, file page = printed page; pp. 51, 57, 62, 65, 66 and 89 re-read)
- PDF: Georgia Benefit Matrix FY2026, FY2025, FY2024 (1 page each)
- PDF: DFCS PAMMS LIHEAP export (31 pages; export still dated 2026-10-16 on 2026-10-20; file page = printed page + 2)
- PDF: USDOL Significant Provisions of State UI Laws, January 2026 (6 pages; Georgia row on p2)
- Data: BLS OEWS May 2025, Georgia (series
OEUS130000000000041201113andOEUS130000000000035302313) - Year: FY2025 and FY2026 (test periods 2025 and 2026). Period 2027 is a documented carried-forward estimate and is not claimed.
- Scope: Incremental. 14 PR-scope files changed since the prior review (13 in
ad147608f7;programs.yamlfrom the main merge only, with the Georgia entry unchanged), plus unresolved prior findings and DTrim99's #10182 note. - Reviewed head SHA: c60610f
- Mode: incremental from b36ba40
Paths: P/ = policyengine_us/parameters/gov/states/ga/dfcs/liheap/, V/ = policyengine_us/variables/gov/states/ga/dfcs/liheap/, T/ = policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/. Line numbers refer to c60610f7f7.
Branch Status
- 16 commits ahead of
mainand 17 behind (mainat645fcd3e52, merge base1661d715bd, #10279). The branch merges cleanly. A scratch merge leaves the Georgia LIHEAP tree unchanged, and all 62 cases pass on it. - Of the 17 newer
maincommits, only #10182 touches a Georgia LIHEAP input (G18). gov/hhs/liheap/fpg_floor.yamlnow equalsmain(blobaeb7f8c5b0), so the PR no longer adds that file.- The open wave 2a siblings (#9967, #9969, #9970, #9972-#9975) conflict with this branch only on the shared LIHEAP coverage line in
programs.yaml. Whichever lands first, the rest need a one-line resolution. - This is informational only. Staleness did not affect any finding.
Prior findings
| ID | Finding | Status |
|---|---|---|
| S1 | Person source list read raw unemployment_compensation |
RESOLVED (round 2); P/income/sources/person.yaml:13 unchanged |
| S2 | Eight sources, the electric-route conjunct and the size-0 mask had no tests | RESOLVED (round 2); no regression |
| S3 | Six descriptions off template | RESOLVED (round 2) |
| S4 | Heat in rent, tenant_pays_utilities false and an electric bill got $500 unsubsidized but $660 subsidized |
RESOLVED: V/payment/ga_liheap_matrix_amount.py:60-63 uses the recommended & ~electric_vendor. Case 17 (T/ga_liheap.yaml:618) now expects [660, 560, 0], the same as the subsidized renter. Only Case 17's expected values changed. The same defect with a heating-fuel bill is S8; the effect on unpriced fuels is G17 |
| S5 | The floor admitted income of exactly 110% (float error) | RESOLVED: V/eligibility/ga_liheap_eligible.py:40 uses np.round(guideline * p_hhs.fpg_floor, 2), the #10279 pattern on main. Size 16 at $107,965 (FY2026) and $105,336 (FY2025) is now ineligible |
| S6 | Floor tests did not pin the lag, the rate or the strict boundary | RESOLVED: T/eligibility/ga_liheap_eligible.yaml:219 (Case 10) and :239 (Case 11) kill lag 0 and lag 2, any rate outside [1.09999995, 1.10000005), <=, the unrounded floor and np.ceil |
| S7 | 8624 links did not go to (b)(2)(B) | RESOLVED: gov/hhs/liheap/fpg_floor.yaml:11 and ga_liheap_eligible.py:23 end #b_2_B; the anchor exists on the LII page |
| G1 | Claim FY2024, gate FY2023 | STILL OPEN, declined (accepted); suggestion. FY2025-cited files are now dated (G9); the income files remain (G20) |
| G2 | Kerosene, coal, solar and unspecified fuel eligible but paid $0 | STILL OPEN, declined (accepted); suggestion. New evidence in G17 |
| G3 | Cite the FY2024 note, PAMMS and DFCS | RESOLVED (round 2) |
| G4 | Encode the Level I column; expose routes as variables | STILL OPEN, declined (accepted). Level II plus $100 still reproduces all ten Level I cells in FY2025 and FY2026 |
| G5 | PR body rows, heating_type sentence, pp. 5-7 |
RESOLVED (round 2) |
| G6 | Test hygiene, FY2027, rulespec status | FY2027 STILL OPEN, declined (accepted): no FY2027 matrix is published on 2026-10-20 |
| G7 | Shared federal floor helper | DEFERRED to a follow-up refactor (accepted). The floor block is now in six state files; the five on main still cite the bare 8624 URL |
| G8 | Cite Georgia's floor assurance | RESOLVED: ga_liheap_eligible.py:16-18,36-37; the text is on FY2025 plan p43 and FY2026 plan p43 |
| G9 | Date the FY2025-cited parameters 2024-10-01 | RESOLVED: four files re-dated, with no output change (verified). Four income files remain: G20 |
| G10 | Say the FY2024 note is carried forward; add the FY2025 matrix | RESOLVED: _ga_liheap_housing.py:38-42; ga_liheap_matrix_amount.py:17. Both sheets show the asterisk and no note |
| G11 | Record the PAMMS export date | RESOLVED: ga_liheap_eligible.py:21, ga_liheap_household_size.py:13 |
| G12 | Full IM identifiers; IM 2025-02 main page | PARTIAL, accepted; closed. IM 2026-01 is added and its title is verified. Attachment 2 p1 alone carries the lag |
| G13 | URLs for USDOL and BLS; "14 x WBA" wording | RESOLVED: T/ga_liheap.yaml:716-720,754-756. USDOL p2 and both BLS medians ($29,070, $26,920) verified |
| G14 | Page ranges in three titles | WITHDRAWN: the decline follows CLAUDE.md:149-155 (one entry per source document, page list at the end of a quoted title) |
| G15 | Changelog omits gov.hhs.liheap.fpg_floor |
RESOLVED: changelog.d/ga-liheap.added.md:1 |
| G16 | No test pins the floor's household size | RESOLVED: T/eligibility/ga_liheap_eligible.yaml:260 (Case 12): SPM size 17, Georgia size 16, $111,980 gives false; an SPM-size floor ($114,015) would give true |
Critical (Must Fix)
None.
Should Address
S8. A heating-fuel bill does not override the all-utilities direct route, so the S4 split remains (new ID; same defect as S4)
-
Where:
V/payment/ga_liheap_matrix_amount.py:60-68(only the electric-vendor route overrides the direct payment);V/eligibility/_ga_liheap_housing.py:14-20(the direct route has no separate-bill test); docstring:36-38("which keeps renters with no separate bill"). -
Household (period 2026, reproduced at head): one adult, natural gas heat in rent, rent $9,600,
tenant_pays_utilitiesfalse, a $1,200gas_expenseand no electric bill.Variant $12,000 wages $24,000 wages Rule Unsubsidized (model) $500 $400 $660 / $560 Subsidized, rent $3,000 (model) $660 $560 $660 / $560 Unsubsidized, tenant_pays_utilitiestrue (model)$660 $560 $660 / $560 With other priced fuels the gap is larger: fuel oil $500 against $810 and propane $500 against $680 (unsubsidized, $12,000). Electricity and wood are unaffected ($500 in both readings). Eligibility is true in every variant.
-
Evidence: M p57, 1100.14 bullet 2, limits the unsubsidized all-in-rent class to rent that "includes utilities with no separate bill for heating/cooling costs". M p89 row 1, "Applicant pays a vendor directly for utilities", is "Paid to vendor". Only row 2 is "Direct pay to Applicant (999)". FY2026 plan p30 gives the lowest award only "If the benefit goes directly to the applicant". The PR's own docstring says a separate bill rules out rent covering every utility.
-
Why a new ID: the S4 fix that round 2 recommended covered only the electric bill. The prior head gives the same values, so this is not a regression, and round 2 did not report it. No test covers it: a mutation that adds the heating-fuel bill to the precedence passes all 62 cases.
-
Fix (verified): in
ga_liheap_matrix_amount, afterbase = select(...):electric_vendor = ga_liheap_has_electric_vendor_route(spm_unit, period) priced_fuel_bill = (spm_unit("heating_expense", period) > 0) & (base > 0) direct_payment = ( ga_liheap_has_direct_payment_route(spm_unit, period) & ~electric_vendor & ~priced_fuel_bill )
- All 62 cases still pass. Cases 9, 14 and 17 keep their values, and no
ga_liheap_eligibleoutput changes. The household above moves to $660 / $560, fuel oil to $810 and propane to $680. - Caveat: unpriced fuels (kerosene, coal, other) with their own bill keep the head's $500 lowest award, so their G2 split ($500 here, $0 with
tenant_pays_utilitiestrue or subsidized) stays. A full fix for them needs a G2 decision (G17). - Do not use the shorter
direct_route & ~(electric_vendor | (heating_expense > 0)), or the same condition insidega_liheap_has_direct_payment_route. It matches p57 more literally, but it cuts kerosene, coal and other-fuel households with their own bill from $500 to $0 (verified), unless you also take G17. - Add a case to
T/ga_liheap.yaml(63 of 63 pass with the fix; at head it gives [500, 660]):- name: Case 23, a primary fuel bill takes the vendor route when rent is flagged as including all utilities. period: 2026 input: state_code: [GA, GA] age: [40, 40] immigration_status: [CITIZEN, CITIZEN] employment_income: [12_000, 12_000] ssi: [0, 0] ga_tanf: [0, 0] rent: [9_600, 3_000] heating_type: [NATURAL_GAS, NATURAL_GAS] heat_expense_included_in_rent: [true, true] tenant_pays_utilities: [false, false] receives_housing_assistance: [false, true] is_in_public_housing: [false, false] gas_expense: [1_200, 1_200] pre_subsidy_electricity_expense: [0, 0] output: ga_liheap_eligible: [true, true] ga_liheap: [660, 660]
- Quote M p57 bullet 2 in the
_ga_liheap_housing.py:29-38docstring and the Case 17 comment (T/ga_liheap.yaml:603-609). It supports the unsubsidized half of S4 more directly than bullet 1. p57 is already in both page lists.
- All 62 cases still pass. Cases 9, 14 and 17 keep their values, and no
-
Rated should-address, as S4 was: the same defect class and input type, $160 to $310 per household. Only an explicit
tenant_pays_utilities: falsetriggers it (the input defaults to true,variables/household/expense/housing/tenant_pays_utilities.py:19). Household calculations only.
Suggestions
- G17. (G2 scope; the only regression from
ad147608f7.) Unpriced or unspecified fuels on the electric-vendor route now get $0. Household: period 2026, $12,000 wages, heat in rent,tenant_pays_utilitiesfalse, rent $9,600, unsubsidized,heating_typeKEROSENE, COAL, SOLAR, OTHER or UNSPECIFIED. With a $1,200 electric bill the award is $0. With no bill it is $500, and at the prior head it was $500 with the bill. So reporting an extra bill cuts the award from $500 to $0. Cause:V/payment/ga_liheap_matrix_amount.py:40-50has no arm for these fuels (default=0), and:60-63now removes them from the direct route. M p89 row 3 ("Paid to electric vendor because gas usage is indeterminate") gives the electricity amount, $400 + $100 = $500. The plan p30 lowest award gives the same $500. No source gives $0.heating_type.pycalls UNSPECIFIED "the right value when heat is included in rent and the fuel is unknown", which is this row. UNSPECIFIED is pinned on purpose (Case 16 household 4,T/ga_liheap.yaml:576; Case 17 household 3,:618); the other four fuels are not. Option (verified): on a heat-in-rent vendor route (electric_vendor | (direct_route & heating_expense > 0)) withbase == 0and a fuel other than NONE, pay the lowest award plus the uplift. This also fixes S8 without the kerosene, coal and other-fuel side effect, but it changes those two pinned values from $0 to $500. Unpriced-fuel households with only their own fuel bill andtenant_pays_utilitiestrue, or a subsidy, stay at $0 (G2). If you keep the decline, state the $500-to-$0 step in the:69-73comment and the PR body. - G18. (DTrim99's #10182 suggestion.) An SBP survivor annuity is not counted.
P/income/sources/person.yaml:18-21listsmilitary_retirement_payonly. Household (period 2026, reproduced at head): one adult age 70, natural gas heat, a $1,200 gas bill and $36,000 inmilitary_retirement_pay_survivors. Countable income is $0, the household is eligible, and the award is $660. The same $36,000 inmilitary_retirement_payorsurvivor_benefitsgives income $36,000, above the $34,549 limit, so $0. M p65 ("Annuity") and M p66 ("Pension") count it. The input already exists at this head. After amainmerge, #10182 documentsmilitary_retirement_payas former members only and sends SBP to the uncounted input, while SSI starts to count it. Fix: now, add- military_retirement_pay_survivorsafter:21(verified: $36,000 counted, $0 award, Case 12 still passes). After mergingmain, replace the entry withmilitary_retirement_income(verified on a scratch merge). Do not listmilitary_retirement_incometogether with either component, or the pay counts twice. Update the comment at:18-20, add a survivors amount to income Case 15 (T/income/ga_liheap_income.yaml:440), and update the Inputs line of rulespec-us#1533. - G19. (Follow-up for
main, not this PR.) #10182 left benefit-program lists onmilitary_retirement_pay. Onmain645fcd3e52, 34 entries in 32 parameter files name it without the survivors input ormilitary_retirement_income. These include the merged LIHEAP lists (in/ihcda/eap/income/sources.yaml:26,ky/dcbs/liheap/unearned_income_sources.yaml:17,md/dhs/meap/income/sources/unearned.yaml:15,or/ohcs/liheap/income/sources/unearned.yaml:17), 25 child-care entries in 23 jurisdictions, MO and TX TANF, MO SSP, FL SR and AR SRA. The OR comment (:15-16) and the MD comment (:12-14) about survivor payments are stale. No open issue exists (only #10181, closed). Open one issue for all benefit-program lists. - G20. Four income parameters still start on 2025-10-01:
P/income/minimum_age.yaml:3,P/income/monthly_interest_disregard.yaml:3,P/income/sources/household.yaml:3andP/income/sources/person.yaml:7. All other GA LIHEAP parameters now start on 2024-10-01. There is no output change: backdating returns the same values at every instant, and a household with a 17-year-old's $5,000 wages has $12,000 countable income in both 2025 and 2026 (M p62). Fix: date the four files 2024-10-01. For the source lists, add FY2025 plan item 1.9 after you check its checkboxes on pp. 5-7 (the text matches FY2026; the checkbox states were not machine-verified). - G21. Test comment nits:
T/ga_liheap.yaml:768-769: the "$331 window ($107,634 to $107,965)" is FY2026 only. Case 11 pins the FY2025 window ($102,926 to $105,336).T/ga_liheap.yaml:756: the BLS route is a client-side app. Add the two series IDs (OEUS130000000000041201113,OEUS130000000000035302313) so the values can be checked through the API.- Optional: the S4 precedence is pinned only end to end (Case 17). A matrix-level case in
T/payment/ga_liheap_matrix_amount.yaml(the Case 5 element 1 inputs at:72plus a $1,200 electric bill, expecting 660) would pin it at the unit.
Carried suggestions still open (see the table): G1, G2, G4 and G6 (declined, accepted) and G7 (deferred).
PDF Audit Summary
| Category | Count |
|---|---|
| Changed references and claims confirmed correct | 29 of 29 (IM 2026-01 title and BLS medians confirmed by external check) |
| Page anchors and page citations confirmed correct | 25 of 25 (6 parameter, 12 variable, 7 test) |
| Re-dated values re-checked against FY2025 sources | 4 files: 60% SMI (FY2025 plan p8); 400/560/710/580/400, $100 and size 16 (FY2025 matrix) |
| External documents matched | 4 (IM 2026-01 page; USDOL January 2026 p2; BLS OEWS May 2025, two series; PAMMS export date) |
| Confirmed rule mismatches (code path and page) | 3: S8 (M p57, p89; plan p30), G17 (M p89; plan p30), G18 (M p65-66) |
| Investigated and cleared | 6 |
Investigated and cleared:
np.round(..., 2): the2is cent precision, not a legal value. The line is identical to #10279 onmain.- G9 re-dating: no output change; the values are identical at every instant.
- Income-file dating: cannot change any FY2025 output. Kept as a dating suggestion only (G20).
- Case 17's new values [660, 560, 0]: correct under M p89 row 3. A sweep of all 62 cases found no other case with both routes, so no other expected value changes.
- SOLAR as a side effect of the S8 fix: rejected. SOLAR's heating bill is the electric bill, so it is already $0 at head (part of G17), and the fix does not change it.
- #9969's bare 8624 link: the FL diff on file was from an older round. #9969's
fpg_floor.yamlis the same blob asmain. Nothing to do here.
Validation Summary
| Check | Result |
|---|---|
| CI | 29 of 29 pass at c60610f7f7 |
| Local tests | 62 of 62 pass at c60610f7f7; 62 of 62 on a scratch merge with main; 63 of 63 with the S8 fix and Case 23 |
| Regulatory | 0 critical; S8 (same defect as S4, heating-fuel bill); G17, G18, G20. Floor rounding, lag and household size correct |
| References | None missing; 29 of 29 corroborate; G21 comment nits |
| Code patterns | No hard-coded values; vectorized; periods and entities correct; G7 deferred |
| Tests | 62 cases (3 new, Case 17 changed). Cases 10-12 kill the lag, rate, <=, rounding and SPM-size mutations. One surviving mutation: the heating-fuel-bill precedence (S8) |
| Prior findings | 11 resolved this round (S4-S7, G8-G11, G13, G15, G16); G12 partial and closed; G14 withdrawn; G1, G2, G4, G6 and G7 open at suggestion level |
| Other reviews | DTrim99 approved c60610f7f7 on 2026-10-20; his #10182 suggestion is G18. S8 is not in his review |
Review Severity: REQUEST_CHANGES
Next Steps
- Fix S8: apply the
priced_fuel_billprecedence inga_liheap_matrix_amount, add Case 23, and quote M p57 bullet 2. - Optional in this PR: G18 (one line), G20 and G21. Decide G17: take the fallback, or document the $500-to-$0 step.
- Open the G19 issue on
main. It does not block this PR.
To auto-fix issues: run the fix-pr workflow for this PR.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
|
Thanks for the reviews. Fixes pushed in 94a4c9c. Pavel
David
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
IDs: C = critical, S = should address, G = suggestion. S1-S8 and G1-G21 carry over from the round-3 review at c60610f7f7 with their IDs unchanged. G22-G24 are new in this round (optional wording only). No new C or S item.
Source Documents
- Statute: 42 U.S.C. 8624(b)(2)(B) (HTML; "less than 110 percent" proviso; unchanged) and 42 U.S.C. 8622 (HTML; "household" definition in (5), fetched 2026-10-21 for the
10ff85eddbcheck) - PDF: LIHEAP poverty guideline tables, IM 2025-02 Att. 2 and IM 2024-02 Att. 2 (3 pages each; size 16 floors re-checked for the Case 22 windows)
- HTML: LIHEAP IM 2026-01 (supports only the unclaimed 2027 lag; not re-read)
- PDF: Georgia LIHEAP State Plan FY2026 and FY2025 (47 pages each; item 1.9 on pp. 5-7 of both plans rendered and checkbox-read; FY2026 p30 re-read)
- PDF: Georgia LIHEAP Policy Manual, January 2022 (89 pages; "M" below, file page = printed page; pp. 4, 51, 57, 62, 66, 69, 76 and 89 re-read)
- PDF: Georgia Benefit Matrix FY2026, FY2025, FY2024 (1 page each; size 1 and size 16 cells re-checked)
- PDF: DFCS PAMMS LIHEAP export (31 pages; not re-read, no changed citation)
- PDF: USDOL Significant Provisions of State UI Laws, January 2026 (not re-read, no changed citation)
- Data: BLS OEWS May 2025, Georgia (series
OEUS130000000000041201113andOEUS130000000000035302313; IDs decoded, medians from the round-3 API read) - Year: FY2025 and FY2026 (test periods 2025 and 2026). Period 2027 is a documented carried-forward estimate and is not claimed.
- Scope: Incremental. 10 PR-scope files changed since the prior review: 8 in
94a4c9c1a3, 1 in10ff85eddb, andprograms.yamlfrom the main mergec76de92de7only (Georgia entry unchanged). Plus all unresolved prior findings. - Reviewed head SHA: 10ff85e
- Mode: incremental from c60610f
Paths: P/ = policyengine_us/parameters/gov/states/ga/dfcs/liheap/, V/ = policyengine_us/variables/gov/states/ga/dfcs/liheap/, T/ = policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/. Line numbers refer to 10ff85eddb.
Branch Status
- 19 commits ahead of
mainand 5 behind (mainatf45d36a7d1, merge basece9377ee80). GitHub reports MERGEABLE. The 5 newermaincommits do not touch Georgia LIHEAP orprograms.yaml. - CI is red: 2 fail, 27 pass at
10ff85eddb. Both failures (Python Rest rollup and shard 1) are one test,policyengine_us/tests/code_health/test_source_conflicts.py::test_conflict_sounding_comments_do_not_grow. - Cause: the test flags 4 FL LIHEAP files (
fl_liheap_eligible.py,fl_liheap_income_limit.py,fl_liheap.py,payment/base_amount.yaml) and 1 SD LIHEAP file (income/limits/table/in_effect.yaml). These came in with the earlier main mergec76de92de7(main atce9377ee80).mainlater added them toKNOWN_UNMARKEDin #10334 (fec98b87c8). No Georgia file is flagged, and a regex scan of the Georgia LIHEAP variables and parameters finds 0 matching comments. - Fix: merge current
maininto the branch. No Georgia code change is needed. Verified on a scratch merge of10ff85eddbwithf45d36a7d1: it merges cleanly,test_source_conflicts.pygives 103 passed, and the Georgia LIHEAP YAML gives 65 passed. - The PR should not merge until CI is green. This is a merge prerequisite, not a code finding.
Prior findings
| ID | Finding | Status |
|---|---|---|
| S1 | Person source list read raw unemployment_compensation |
RESOLVED (round 2); not touched |
| S2 | Eight sources, the electric-route conjunct and the size-0 mask had no tests | RESOLVED (round 2); not touched |
| S3 | Six descriptions off template | RESOLVED (round 2); not touched |
| S4 | Electric bill did not override the all-utilities direct route | RESOLVED (round 3). Case 17 (T/ga_liheap.yaml:620) still expects [660, 560, 0]. Matrix Case 8 element 1 now also pins it at the unit |
| S5 | The floor admitted income of exactly 110% (float error) | RESOLVED (round 3); eligibility code unchanged |
| S6 | Floor tests did not pin the lag, the rate or the strict boundary | RESOLVED (round 3); not touched |
| S7 | 8624 links did not go to (b)(2)(B) | RESOLVED (round 3); not touched |
| S8 | A heating-fuel bill did not override the all-utilities direct route | RESOLVED. V/payment/ga_liheap_matrix_amount.py:63-69 adds main_fuel_bill = heating_expense > 0 and & ~main_fuel_bill. The round-3 household now gets $660 / $560 (was $500 / $400); fuel oil $810 and propane $680 (were $500), in every housing variant, in 2025 and 2026. Electricity and wood stay at $500. No eligibility output changes. Pinned by Case 23 (T/ga_liheap.yaml:835) and matrix Case 8 element 2 (T/payment/ga_liheap_matrix_amount.yaml:127); both fail on the prior code. M p57 bullet 2 is quoted verbatim in the code comment, both _ga_liheap_housing.py docstrings and the Case 17 comment. The author left out the & (base > 0) guard on purpose: see G17 |
| G1 | Claim FY2024, gate FY2023 | STILL OPEN, declined (accepted). Every Georgia LIHEAP parameter now starts on 2024-10-01 |
| G2 | Unpriced or unspecified fuels eligible but paid $0 | STILL OPEN, declined (accepted); documented coverage gap. The $0 now applies on every vendor route (G17) |
| G3 | Cite the FY2024 note, PAMMS and DFCS | RESOLVED (round 2) |
| G4 | Encode the Level I column; expose routes as variables | STILL OPEN, declined (accepted) |
| G5 | PR body rows, heating_type sentence, pp. 5-7 |
RESOLVED (round 2) |
| G6 | Test hygiene, FY2027, rulespec status | FY2027 STILL OPEN, declined (accepted): no FY2027 matrix is published |
| G7 | Shared federal floor helper | DEFERRED to a follow-up refactor (accepted) |
| G8 | Cite Georgia's floor assurance | RESOLVED (round 3) |
| G9 | Date the FY2025-cited parameters 2024-10-01 | RESOLVED (round 3); the remaining income files are G20 |
| G10 | Say the FY2024 note is carried forward; add the FY2025 matrix | RESOLVED (round 3) |
| G11 | Record the PAMMS export date | RESOLVED (round 3) |
| G12 | Full IM identifiers; IM 2025-02 main page | PARTIAL, accepted; closed |
| G13 | URLs for USDOL and BLS; "14 x WBA" wording | RESOLVED (round 3); G21 adds the series IDs |
| G14 | Page ranges in three titles | WITHDRAWN (round 3) |
| G15 | Changelog omits gov.hhs.liheap.fpg_floor |
RESOLVED (round 3) |
| G16 | No test pins the floor's household size | RESOLVED (round 3) |
| G17 | Unpriced or unspecified fuels on a vendor route get $0 | STILL OPEN, declined and documented (accepted); suggestion. The S8 fix widens the scope: see Suggestions |
| G18 | SBP annuity in military_retirement_pay_survivors not counted |
STILL OPEN, deferred to a cross-state follow-up (accepted); suggestion. See Suggestions |
| G19 | main benefit-program lists name only military_retirement_pay |
STILL OPEN on main, outside this PR. Now tracked by draft #10317, so no separate issue is needed |
| G20 | Four income files dated 2025-10-01; FY2025 item 1.9 not cited | RESOLVED. P/income/minimum_age.yaml:3, P/income/monthly_interest_disregard.yaml:3, P/income/sources/household.yaml:3 and P/income/sources/person.yaml:7 start on 2024-10-01. FY2025 plan item 1.9 is identical to FY2026 box for box (35 categories plus the two SSA Medicare sub-boxes; machine-read and visually confirmed). The new hrefs are correct: person.yaml:57-58 ("#page 5-7", #page=5) and household.yaml:12-13 (#page=6, TANF row). Outputs are identical in 2024, 2025 and 2026 |
| G21 | Case 22 window; BLS series IDs; matrix-level precedence case | RESOLVED. T/ga_liheap.yaml:771-774 gives both windows (FY2026 $331, $107,634 to $107,965; FY2025 $2,410, $102,926 to $105,336; both exact). :758-760 give both series IDs. Matrix Case 8 element 1 pins the electric-bill precedence at the unit |
| DTrim99 suggestion 1 | Same as G18 | Deferred with G18 |
Critical (Must Fix)
None.
Should Address
None.
Suggestions
- G17. (Declined and documented, accepted. G2 scope.)
- Household effect: an unsubsidized renter with heat in rent,
tenant_pays_utilitiesfalse and its own kerosene, coal or other-fuel bill now gets $0 instead of $500 (period 2026, $12,000 wages); with no separate bill it still gets $500. - Cause: the S8 fix has no
base > 0guard, so these households leave the direct route, andselect(..., default=0)prices no amount for their fuel. SOLAR and UNSPECIFIED do not change. - This is the documented G2/G17 design choice, not a new defect. No source prints an amount for these fuels: the FY2024-FY2026 step 2 tables price only electric, natural gas, oil, propane and wood. The plan p30 lowest award applies only "If the benefit goes directly to the applicant".
- The fix also removes the old split for these fuels: own-bill households now get $0 with
tenant_pays_utilitiesfalse, true or a subsidy (atc60610f7f7: $500 / $0 / $0). - The author did what round 3 asked for a kept decline. The $500-to-$0 step is in
V/payment/ga_liheap_matrix_amount.py:75-82, the PR body and rulespec-us#1533. Case 24 household 2 (T/ga_liheap.yaml:876) and matrix Case 8 element 3 pin it. Both fail under the round-3 guarded fix, so a silent switch is caught. - Reach: an explicit
tenant_pays_utilities: false(the default is true), heat in rent, no subsidy, and an unpriced fuel with its own bill. Household calculations only. No action unless reviewers reopen G2.
- Household effect: an unsubsidized renter with heat in rent,
- G18. (Deferred, accepted.) An SBP survivor annuity is still not counted. Reproduced at head: an adult aged 70 with $36,000 in
military_retirement_pay_survivorshasga_liheap_income$0, is eligible and gets $660. The same amount inmilitary_retirement_paygives $36,000 against the $34,549 limit, so $0 (M p65, M p66).- The cross-state draft #10317 ("Count military SBP annuities in state benefit income lists") changes only programs that are on
main. It has no Georgia file, because Georgia LIHEAP is not onmain. - So Georgia must make the switch itself: change
P/income/sources/person.yaml:21frommilitary_retirement_paytomilitary_retirement_income, and update the comment at:18-20. Do it in this PR, or right after merge (for example, add the Georgia file to #10317 if it is still open).military_retirement_incomeexists at head. Do not list it together with either component, or the pay counts twice.
- The cross-state draft #10317 ("Count military SBP annuities in state benefit income lists") changes only programs that are on
- G22. (New, optional wording.)
P/income/sources/person.yaml:27-30,:39-41and:44-46say only "FY2026 plan 1.9 (page 6)". The list now starts on 2024-10-01, and FY2025 plan p6 has the same boxes unchecked (verified). Suggested: "FY2025 and FY2026 plans 1.9 (page 6)". Also optional: FY2025 plan p6 leaves "Earned income of a child under the age of 18" unchecked, which supportsP/income/minimum_age.yaml(it cites only M p62). No output effect. - G23. (New, optional wording.)
T/payment/ga_liheap_matrix_amount.yaml:117-118says "Manual page 57 (1100.14) limits the direct applicant payment to rent that ...". p57 1100.14 lists ineligible households and names no payment type; the payment type comes from p89 row 2. Use the Case 17 and Case 23 wording: "limits the unsubsidized all-in-rent class to rent that ...". The quote itself is verbatim. Also, "the Case 5 element 1 household" is loose for element 3, which is kerosene. No value effect. - G24. (New, optional wording.)
V/eligibility/ga_liheap_eligible.py:67-68says "see the manual conflict noted in ga_liheap_household_size".10ff85eddbreworded the target (V/ga_liheap_household_size.py:21) to "The manual gives two other answers". Suggested: "see the manual note in ga_liheap_household_size". "manual conflict" does not matchCONFLICT_COMMENT_RE, so CI is not affected either way.
Carried suggestions still open (see the table): G1, G2, G4 and G6 (declined, accepted), G7 (deferred), G17 (declined and documented), G18 (deferred) and G19 (on main, tracked by #10317).
Validation Summary
| Check | Result |
|---|---|
| CI | 2 fail, 27 pass at 10ff85eddb: one source-conflict test, from FL/SD files of the earlier main snapshot. A merge of current main clears it (verified on a scratch merge). See Branch Status |
| Local tests | 65 of 65 at head (12 + 4 + 24 + 2 + 15 + 8; was 62). The head suite on the prior code: 62 pass, 3 fail (Case 23, Case 24, matrix Case 8), so no earlier expected value changed. Round-3 guarded fix: 63 pass, 2 fail (Case 24, matrix Case 8). 65 of 65 on a scratch merge with main |
| Regulatory | S8 resolved. Household probe (38 households, periods 2025 and 2026): 7 change from the prior head, 4 S8 corrections and 3 G17 scope rows (kerosene, coal, other: $500 to $0). Eligibility is unchanged in every row. 0 new C or S items |
| References | 4 of 4 changed hrefs correct; 23 of 23 page citations in changed comments correct; Case 17 and Case 22 quotes exact; 4 of 4 re-dated values supported from 2024-10-01; CLAUDE.md reference-format rules met. G22 and G23 wording only |
| Code patterns | Vectorized, no hard-coded values, entity and period correct; ruff reports the 3 changed .py files as formatted. Changelog fragment present; Georgia programs.yaml entry unchanged (verified_years: "2025-2026") |
| Tests | 3 new cases (Case 23, Case 24, matrix Case 8); all 12 new elements hand-checked. S8 and the G17 choice are both pinned. No non-functional tests |
| Investigated and cleared | 10ff85eddb reword: meaning kept, all three manual quotes verbatim. The disagreement is manual against manual; 42 U.S.C. 8622(5) says nothing about citizenship, so no statute-vs-source marker is needed (the case is in the main backlog as us-ga:liheap-lawful-noncitizen-household-members). G20 re-dating: no output change |
| Prior findings | Resolved this round: S8, G20, G21. G17 declined and documented; G18 deferred; G19 tracked by #10317. G1, G2, G4, G6 and G7 unchanged |
| Other reviews | None this round |
Review Severity: APPROVE
No critical or should-address item is open. Merge only after CI is green (see Branch Status).
Next Steps
- Merge current
maininto the branch to clear the red source-conflict check. Do not merge the PR until CI is green. - G18: switch
P/income/sources/person.yaml:21tomilitary_retirement_income, in this PR or right after merge. Draft #10317 does not cover Georgia. - Optional: G22, G23 and G24 (comment wording only).
- After merge (informational): the four Georgia entries in
source_conflicts/candidates.yamlonmainstill say "Code not yet on main". They can link the merged code, and the floor lineV/eligibility/ga_liheap_eligible.py:40can carry its marker after rulespec-us registers that entry.
…d Riverside County LIHEAP (#10281) * Apply the federal 110% poverty floor to MS and OR LIHEAP 42 U.S.C. 8624(b)(2)(B) bars a state from excluding a household solely on income below 110% of the poverty level. The 60% SMI limit falls below that floor in Mississippi from household size 11 (FY2026-FY2027) and in Oregon from size 19 (PY2025) or 20 (PY2026-PY2027). Both eligibility tests now accept income below 110% of the poverty guideline that HHS makes mandatory on October 1 of the program year (one-year lag). Adds gov.hhs.liheap.fpg_floor, identical to the file in #9968 and #9969, plus a poverty guideline year lag for each state. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Apply the federal 110% poverty floor to DC, MA and NJ LIHEAP The 60% SMI limits fall below 110% of the poverty guideline only for very large households: DC from size 34 to 39 in 2022-2024, MA from size 30 to 34 and NJ from size 28 to 32 in 2022-2027. The eligibility tests now accept income below the floor, using the one-year guideline lag. MA reuses ma_liheap_fpg, which already lags the guideline; DC and NJ get their own fpg_year_lag parameters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Anchor the LIHEAP floor reference to 42 U.S.C. 8624(b)(2)(B) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Update the NC SA 2027 test for the announced 2027 COLA #10225 replaced the projected 2027 SSA uprating index with the 2026Q3 CPI-W average and set the 2027 SSI federal benefit rate to $1,029. The NC Special Assistance 2027 case still expected the old projections ($1,436 rate, $1,021.83 FBR), so the states-shard-1 suite fails on main and on every PR. The uprated rate is now $1,448 and the payment $489. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Address review: MS floor citation, IM link, exact limits, payment test - Cite Rule 6.1 C, the printed 60% SMI table and FY2026 plan assurance (2) in the Mississippi floor comment; the printed table itself falls below the floor at sizes 11 to 20. - Point the IM 2023-01 references to the acf.gov archive URL. - Correct test comments that showed float32-rounded DC and MA limits. - Add a Mississippi payment test for a household that qualifies only through the floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Apply the federal 110% poverty floor to IN, MD and Riverside LIHEAP The 60% SMI limits fall below 110% of the poverty guideline from household size 15 (2025) or 16 (2026-2027) in Indiana EAP, size 29 in Maryland MEAP (FY25-FY27), and size 20 (2025) or 21 (2026-2027) in Riverside County LIHEAP. The eligibility tests now accept income below the floor, with the one-year guideline lag. Maryland reuses md_meap_fpg; Indiana and Riverside get fpg_year_lag parameters. Stacked on #10279, which adds gov.hhs.liheap.fpg_floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Remove the #10279 changelog fragment that main already released Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Cite FY2025 and FY2026 plan item 1.9 for the unchecked person sources and the child earnings exclusion, tighten the matrix test comment, and point the eligibility comment at the manual note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the reviews. The wording suggestions are in a9dae48, and the branch now includes current main. Pavel
|
PR Review (round 3): Add Georgia LIHEAP regular heating assistanceSummaryPR #9968 (author: hua7450). This round reviews head
The behavior change follows the manual. I re-read manual page 57, 1100.14: the all-in-rent class is rent that "includes utilities with no separate bill for heating/cooling costs". Page 89 row 1 pays an applicant who "pays a vendor directly for utilities" through the vendor. So a renter whose rent includes heat, but who has a bill for the main fuel, now gets the main fuel's step 2 amount instead of the $500 lowest award. No earlier expectation changed. The new The other changes.
There are no new findings. CI is 29/29 green on a run that started after #10334, and the merge with What changed since our approval
New expectations, checked by hand (FY2026: size 1 limit $34,549, Level I top $13,589; Level II amounts electricity 400, natural gas 560, fuel oil 710, propane 580, wood 400; Level I uplift $100):
Merge-resolution check
New findings
Axiom, CI and branch
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Round 3 confirmation: the follow-up commits are correct. The main-fuel bill now overrides the all-in-rent direct payment per manual pp.57/89, the wording changes alter no values, the reworded note passes the ratchet, and the programs.yaml hand-merge keeps every sibling. Full report in the comment above.
Resolve the programs.yaml conflict with the Georgia LIHEAP merge (#9968): keep both the AR and GA state_implementations entries and list both states on the LIHEAP coverage line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Switch the Georgia and Arkansas LIHEAP income lists, which merged in #9968 and #9973, from military_retirement_pay to military_retirement_income. Georgia manual 1200.7 includes annuities and pensions; Arkansas manual Appendix F counts pensions paid to surviving dependents. Add a survivor annuity case to each income test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* Count military SBP annuities in state benefit income lists #10182 moved Survivor Benefit Plan annuities into military_retirement_pay_survivors. The benefit-program income lists still listed only military_retirement_pay, so SBP annuities dropped out of countable income. Replace military_retirement_pay with military_retirement_income in 34 state child care, LIHEAP, TANF and SAB lists, fix the OR LIHEAP and MD MEAP comments that #10182 made stale, and add SBP cases for OR LIHEAP, MD MEAP, IN EAP, TX TANF and NY CCAP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Count SBP annuities in the FL, OH, OK, RI and SD LIHEAP lists These LIHEAP source lists merged after the first commit and still listed only military_retirement_pay. Switch them to military_retirement_income, update their comments, and add SBP cases for OH HEAP and SD LIEAP. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Count SBP annuities in the GA and AR LIHEAP lists Switch the Georgia and Arkansas LIHEAP income lists, which merged in #9968 and #9973, from military_retirement_pay to military_retirement_income. Georgia manual 1200.7 includes annuities and pensions; Arkansas manual Appendix F counts pensions paid to surviving dependents. Add a survivor annuity case to each income test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Guard benefit lists against raw military_retirement_pay Add a code-health check, modelled on the unemployment compensation readers check, that fails when a parameter list or Python reader outside the tax side names military_retirement_pay without the survivor annuity input. Address the review of #10317: add a Missouri SAB survivor annuity case, record the Minnesota CCAP reading of 256P.06 subd. 3(2)(ix), and update the stale source headers of the PA CCW and WV CCAP tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…on main (#10350) * Point the federal and AK-HI source-conflict candidates at their code on main Candidates written while their pull requests were open said "Code not yet on main". Each now lists the tracked files that decide it and a note on which source that code follows. Adds candidates for conflicts the merged code's comments record. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Address review findings on the federal, Alaska-Hawaii source-conflict candidates Refresh entries from code merged since the first round (#9944, #9968, #10272), add the missing 110%-floor candidates for the District and Riverside County, and fix the page anchors the reviews flagged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Refresh the SNAP candidates that #10299 settled #10299 merged, so the Alaska and Hawaii ABAWD timing entries and the FY2026 large-household cap entry no longer describe the change as in flight; each note now says what the merged code does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Show the gap between readings in the Alaska and Hawaii ABAWD examples Name the file that ends Hawaii's area waiver. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Adds Georgia's LIHEAP regular heating assistance for FY2025 and FY2026. The model tests income against 60% of state median income, places eligible households in Level I or Level II by the published lower-income cutoffs, and pays the fixed amount for the primary heating fuel. Federal law bars excluding a household on income below 110% of the poverty guideline (42 U.S.C. 8624(b)(2)(B)). Georgia's 60% limit, including its printed size-16 rows, falls below that floor from household size 16, so the model keeps a household of 16 or more eligible above the 60% limit when its income is below 110% of its poverty guideline. The model rounds that floor to the cent, so income exactly at 110% does not qualify. Unsubsidized renters whose rent includes all utilities and who report neither an electric bill nor a bill for their main heating fuel receive the lowest award for their income level. Renters with heat in rent who report a separate electric bill or a bill for their main heating fuel receive the amount for their main heating fuel, paid to the vendor, with or without a subsidy and whatever
tenant_pays_utilitiessays. In FY2026, a one-person household with $12,000 of wages and electric heat receives the Level I electric amount, $500. In FY2025, a one-person household with $13,000 of wages is above the $12,995 Level I cutoff and receives $400.Fixes #9959
Regulatory authority
The January 2022 manual is the newest Georgia LIHEAP income manual located. The current PAMMS export contains administrative chapters 100–800, not a replacement for income chapter 1200. The contemporaneous FY2022 plan already contains the cash-gift checkbox disagreement, so the detailed manual is used for cash contributions and gifts. Annual income approximates the application-month assessment.
Eligibility
defined_for = StateCode.GAis_citizen_or_legal_immigrant, with no SNAP waiting bars. A household with no qualified member is ineligible. Nonqualified adults' income counts in full. PAMMS chapter 100 ("Be US citizens or lawfully admitted immigrant") and the DFCS LIHEAP page ("The applicant needs to be a U.S. citizen or legally admitted immigrant") support counting lawful immigrants.liheap_smi_limithelper (#10019): floors 60% of the four-person state median income, applies the federal size factor and floors again. This order reproduces all 16 FY2026 limits and the FY2025 limits tested for sizes 1, 4 and 16 ($33,038, $63,535 and $102,926); the sources do not state the order. One person in FY2026: $34,549. The limit is inclusive. Income below 110% of the poverty guideline also qualifies, through the shared federal parametergov.hhs.liheap.fpg_floor(1.1), whose file is identical to the copy in #10279. As in #10279, the model rounds the floor to the cent, so income exactly at 110% does not qualify ("less than 110 percent"). Georgia assures this floor in both plans (page 43). Georgia's limit uses no poverty guideline, so the model uses the one HHS makes mandatory for the fiscal year (fpg_year_lag1: the 2025 guidelines in FY2026, the 2024 guidelines in FY2025 and the 2026 guidelines in the carried-forward 2027 estimate). The printed size-16 limits, $107,634 (FY2026) and $102,926 (FY2025), are below 110% of poverty ($107,965 and $105,336), so the floor applies from size 16 and governs over the printed row. A protected household above the 60% limit gets the Level II amount, andga_liheap_income_limitstill reproduces the printed table.has_heating_expense) or a positive primary-fuel bill, including when heat is in rent or the household receives a housing subsidy. Unsubsidized rent that includes all utilities (heat in rent,tenant_pays_utilitiesfalse, positive rent, no housing assistance or public housing) qualifies with no bill. A renter with heat in rent, rent above $0 and a positivepre_subsidy_electricity_expensequalifies with or without a housing subsidy and whatevertenant_pays_utilitiessays (manual page 89, third row: "Paid to electric vendor because gas usage is indeterminate"; page 4: subsidized renters qualify when "their utility bill is in their name"; page 57: subsidized households whose rent includes utilities are ineligible only if they "cannot verify an energy burden"). For payment this route, like a bill for the main heating fuel, takes precedence over the all-utilities route, because page 57 limits the unsubsidized all-in-rent class to rent that "includes utilities with no separate bill for heating/cooling costs". The same inputs therefore get the same award with or without a subsidy. The model reads page 82's ineligibility for subsidized housing where "the rent includes utilities" as rent that covers every utility, which a separate electric bill rules out. Heat in rent with none of these does not qualify, and a bill for a fuel other than the primary fuel does not establish the burden (PAMMS chapter 100: "a vendor bill/statement for the main heating source").heating_typeNONE is ineligible.Countable income
total_unemployment_compensation(the reported amount, or modeled state unemployment insurance when none is reported; the model has no Georgia unemployment insurance program, so the reported amount counts), SSI, pensions, military retirement pay, railroad retirement (gross), survivor benefits, veterans benefits, disability benefits, workers' compensation, strike benefits, General Assistance, rental and farm rental income, dividends, capital gains, gambling winnings, alimony and child support. Floors each source at zero, so capital, rental and farm losses offset nothing.max(social_security − medicare_part_b_premium, 0)per adult.tanfaggregate, which includesga_tanf, once per household.gambling_winnings, the closest input; it also covers non-lottery gambling (see source conflicts).financial_assistanceinput; receipts of members under 18 are excluded.Benefit
tenant_pays_utilitiesis false.tenant_pays_utilitiessays.tenant_pays_utilitiesfalse, a $1,200 bill and $12,000 of wages in FY2026, natural gas pays $660 with or without a subsidy, fuel oil $810 and propane $680.Years covered
A calendar-year period reads the parameters in force on January 1. Formulas are undated and
verified_yearsis"2025-2026". Other years are unverified backfilled estimates; no adopted FY2027 table was found, only a draft plan. The 110% poverty floor applies from size 16 in FY2025 and FY2026, and from size 17 in the carried-forward 2027 estimate.Not modeled and source conflicts
ga_liheap_income_limitkeeps the printed table.military_retirement_pay_survivorsgambling_winnings, which also covers non-lottery gambling.financial_assistance. The contemporaneous FY2022 plan already has the same unchecked checkbox, so it does not establish a later exclusion. The detailed income manual is followed.Microsimulation: the microsimulation datasets carry no heating inputs, so population totals are about $0 until #9754 lands. Callers must send
heating_typewith the matching fuel bill.Test plan
65 YAML cases in 6 files cover:
tenant_pays_utilitiesfalse and a $1,200 electric bill: natural gas pays $660 and $560 to an unsubsidized renter with $12,000 and $24,000 of wages and $660 to a subsidized renter, an unsubsidized renter with an unspecified main fuel is eligible at $0, and the subsidized renter without the bill is ineligible;tenant_pays_utilitiesis true or false) or an electric bill, and the same precedence at the matrix-amount level for an electric, gas and kerosene bill;Every eligibility and payment case specifies
heating_type. The isolated household-size, income and income-limit cases set no heating inputs, which those variables do not read; income Case 8 keepsheating_typebecause it also asserts the matrix amount. Expected values come from hand arithmetic on the sources. The current head was not run locally; CI validates it.us-ga:liheap-income-floor-vs-smi-limitinsource_conflicts/candidates.yaml. A marker can name only a registered entry, so the floor line inga_liheap_eligibletakes its marker once rulespec-us registers the entry. The lawful-noncitizen question (us-ga:liheap-lawful-noncitizen-household-members) sets the manual against itself, and 42 U.S.C. 8622(5) defines a household with no citizenship rule. The plan-versus-manual rows above have no statute side either, so neither needs a marker.make formatchangelog.d/axiom: TheAxiomFoundation/rulespec-us#1533 queued
🤖 Generated with Claude Code