Skip to content

Add Georgia LIHEAP regular heating assistance - #9968

Open
hua7450 wants to merge 14 commits into
mainfrom
ga-liheap
Open

hua7450 wants to merge 14 commits into
mainfrom
ga-liheap

Conversation

@hua7450

@hua7450 hua7450 commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

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 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. Unsubsidized renters whose rent includes all utilities receive the lowest award for their income level, and renters with heat in rent who are billed for electricity receive the amount for their main heating fuel, paid to the electric vendor. 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

Requirement Source How modeled
Georgia residence — defined_for = StateCode.GA
Household size excludes nonqualified noncitizens Manual pages 51–52 and 62; PAMMS chapter 100, page 4; DFCS LIHEAP page Counts members with is_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.
Income at or below 60% of state median income, or below 110% of the poverty guideline FY2026 plan section 2.1, page 8; FY2025 and FY2026 matrices, step 1; 42 U.S.C. 8624(b)(2)(B); LIHEAP IM 2025-02 and IM 2024-02, Attachment 2 Calls the shared liheap_smi_limit helper (#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 parameter gov.hhs.liheap.fpg_floor (1.1). Georgia's limit uses no poverty guideline, so the model uses the one HHS makes mandatory for the fiscal year (fpg_year_lag 1: the 2025 guidelines in FY2026 and the 2024 guidelines in FY2025). 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. A protected household above the 60% limit gets the Level II amount, and ga_liheap_income_limit still reproduces the printed table.
Energy burden Manual pages 3–4, 50, 57, 82 and 89; PAMMS chapter 100, page 4 A household qualifies with its own heating obligation (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_utilities false, positive rent, no housing assistance or public housing) qualifies with no bill. A renter with heat in rent, rent above $0 and a positive pre_subsidy_electricity_expense qualifies with or without a housing subsidy and whatever tenant_pays_utilities says (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"). 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_type NONE is ineligible.
Categorical eligibility Manual Not applied; every household takes the ordinary income test (see below).

Countable income

Item Source How modeled
Members under 18 Manual section 1200.2, page 62 Excludes all income of members under 18.
Wages and business income Manual sections 1200.6–1200.7, pages 64–66 Counts wages and net self-employment, SSTB, farm operations and partnership/S-corporation income. Floors each source at zero, so a business loss offsets nothing.
Other income Manual section 1200.7, pages 65–69, and application item 12, page 83; FY2026 plan section 1.9, pages 5–7 Counts unemployment through 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.
Social Security net of the Medicare premium FY2025 and FY2026 plans section 1.9, page 6 ("Excluding MediCare deduction"); manual section 1200.7, page 69 Counts max(social_security − medicare_part_b_premium, 0) per adult.
Interest Manual section 1200.7, pages 66 and 69 Subtracts the first $25 a month ($300 a year) once from the household's adult interest. The manual does not say whether the disregard repeats per person or per account.
TANF FY2026 plan section 1.9, page 6 Counts the take-up-gated tanf aggregate, which includes ga_tanf, once per household.
Lottery winnings Manual section 1200.7, page 66 Counts gambling_winnings, the closest input; it also covers non-lottery gambling (see source conflicts).
Cash gifts and contributions Manual section 1200.7, page 65 Counts adults’ cash support through the existing financial_assistance input; receipts of members under 18 are excluded.

Benefit

Primary heating fuel Level I Level II
Electricity $500 $400
Natural gas $660 $560
Fuel oil $810 $710
Propane $680 $580
Wood $500 $400
  • The FY2025 and FY2026 matrices print the same amounts. Level I cutoffs are inclusive: one person $12,995 (FY2025) and $13,589 (FY2026); four people $24,355 and $25,469; sixteen people $40,485 and $42,336. Households above size 16 use the size-16 cutoff.
  • Every printed Level I amount equals the Level II amount plus $100 on both matrices. The model stores the Level II column and the $100 difference, an inferred pattern that reproduces all ten printed cells.
  • An unsubsidized renter whose rent includes all utilities is paid directly at the lowest award for the income level, $500 in Level I or $400 in Level II (FY2026 plan page 30; manual page 89), including when the fuel is unspecified or an electric bill is also reported.
  • A renter with heat in rent who is billed for electricity is paid the amount for the main heating fuel, to the electric vendor (manual pages 4 and 89). The FY2024 matrix explains the asterisk on "main heating fuel type*": "The main fuel type is not always where the benefit is applied", so a natural gas household that applies its benefit to an electric bill receives the natural gas amount. A one-person household with natural gas heat in rent, a $1,200 electric bill and $12,000 of wages receives $660 in FY2026, with or without a housing subsidy. An unspecified main fuel pays $0 on this route.
  • Kerosene, coal, solar, other and unspecified fuels have no matrix column; ordinary vendor payments for them are $0.
  • The reported bill does not cap the payment.
  • PAMMS chapter 100 (page 5) still prints benefits of "a minimum of $350 and maximum of $400" with a senior maximum. FY2026 plan item 16.1 (page 30) says Georgia updated the benefit matrix to remove the senior rule, so the model follows the matrix.

Years covered

Model year Program year One-person income limit One-person Level I cutoff
2025 FY2025, from October 1, 2024 $33,038 $12,995
2026 FY2026, from October 1, 2025 $34,549 $13,589

A calendar-year period reads the parameters in force on January 1. Formulas are undated and verified_years is "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

Item Source Model treatment
Categorical eligibility for households receiving only public assistance Manual Requires every member's receipt and assistance-only income and resources; aggregate TANF and SNAP inputs cannot establish those facts.
Utility account credits of $1,000 or more and administrative household exclusions Manual Not identified; the selected heating account is assumed to meet them.
Level I cutoff above household size 16 FY2026 matrix, step 1 Uses the size-16 cutoff as a provisional value.
Kerosene, coal, solar, other and unspecified fuels on vendor payments FY2026 matrix, step 2 Pay $0 as a coverage gap (#9754 for unspecified fuel).
Other direct payments to the applicant FY2026 plan item 16.1 (page 30); manual page 89 (fourth and seventh rows), page 4 and section 1300.2 (page 70) Plan item 16.1 pays the lowest award when the benefit goes to the applicant. The manual also pays the applicant directly when utilities are paid to "the landlord or trailer park owner" and when the energy supplier has no vendor agreement or is not on the Approved Vendor List; subsidized tenants who pay "a landlord for utility costs" are paid directly or through the electric supplier. No input identifies these households; the model pays them the main-fuel amount when they report a bill.
Roomer and boarder allowances, mortgage-sale contracts and stipends Manual section 1200.7 Not handled.
Roomers, boarders, foster-child elections and group quarters Manual pages 51–52 Not identified; the SPM unit approximates the household.
Lawful noncitizens in household size Manual sections 101.2 (page 3), 1100.3 (page 50) and 1100.5 a (page 51) against 1100.14 (page 57) and the glossary (page 76) The manual conflicts with itself: page 57 lists "Applicants where ALL household members are non-U.S. citizens" as ineligible, and the glossary leaves non-citizens out of the size while counting their income. The model follows the eligibility sections: lawful immigrants count in the size, undocumented members do not, and a household of lawful immigrants can qualify.
Crisis, cooling, weatherization and equipment assistance — Out of scope.
Topic FY2026 plan Manual and model
Lottery winnings Section 1.9 (page 6) leaves one-time lump sums such as winnings from lotteries unchecked The January 2022 manual, section 1200.7 (page 66), includes "Lottery Winnings". The model follows the manual and counts gambling_winnings, which also covers non-lottery gambling.
Cash gifts Section 1.9 (page 6) leaves cash gifts unchecked The manual, section 1200.7 (page 65), includes "Contribution/Cash Gift"; the model counts adults’ receipts through 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.
Disability payments and workers' compensation Section 1.9 (page 6) leaves "Insurance payments made directly to the insured" unchecked The manual, section 1200.7, includes "Disability Payment" (page 65) and "Workers Compensation" (page 68). The model follows the manual and counts both.
Subsidized renters and utilities in rent Section 2.3 (page 8) answers No to "additional/differing eligibility policies" for "Renters Living in subsidized housing?" and "Renters with utilities included in the rent?" The manual applies energy-burden rules to both (pages 4, 57, 82 and 89), for example "Subsidized housing residents whose fuel cost is included in their rental payment are not eligible for assistance unless the applicant can verify an energy burden" (page 4). The model follows the manual.

Microsimulation: the microsimulation datasets carry no heating inputs, so population totals are about $0 until #9754 lands. Callers must send heating_type with the matching fuel bill.

Test plan

59 YAML cases in 6 files cover:

  • all 16 FY2026 income limits, FY2025 limits for sizes 1, 4 and 16, a mixed Georgia and Alabama array, and a $0 limit for a unit with no qualified member;
  • all 16 FY2026 Level I cutoffs, FY2025 cutoffs for sizes 1, 4 and 16, and sizes 17 and 25 at the size-16 cutoff;
  • all five priced fuels at both levels, a small bill that does not cap the award, and no heat;
  • each energy-burden route: a primary bill with heat in rent with and without a subsidy, an obligation with no bill, an unrelated utility bill, all utilities in unsubsidized rent (including unspecified fuel, a reported electric bill and each requirement that fails it), and heat in rent with an electric bill, with and without a subsidy, by main fuel, income level and missing rent or bill;
  • a subsidized renter with natural gas heat in rent and tenant_pays_utilities false: $660 with a $1,200 electric bill, ineligible without one;
  • the under-18 boundary at 17 and 18, nonqualified adult income, the $300 interest boundary, TANF counted once and with and without take-up, Social Security net of the Part B premium and its floor, military and gross railroad retirement, and self-employment, capital, rental and farm losses;
  • the eight remaining adult sources (unemployment, veterans' benefits, disability, workers' compensation, strike benefits, General Assistance, alimony and child support) at $100 to $800 each, $3,600 in total;
  • unemployment compensation at Georgia's $365 maximum weekly benefit for 14 weeks ($5,110; USDOL, January 2026), which moves a one-person household with $12,000 of wages from the $500 Level I electric award to the $400 Level II award;
  • the FY2025 Level I cutoff in a final award and a 17-person household;
  • a 17-person household whose four adults earn Georgia's median wages for cashiers and for fast food and counter workers (BLS OEWS, May 2025), $111,980 in total: above the $109,627 limit and below the $114,015 poverty floor, so it receives Level II natural gas, $560;
  • adult cash contributions, excluded minor gifts, and FY2025/FY2026 final benefits at $12,000, $24,000 and $36,000 of cash support.

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 keeps heating_type because 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. make format and git diff --check passed.

  • YAML tests whose expected values come from an external source (statute, official form or worksheet, official calculator)
  • make format
  • Changelog fragment in changelog.d/

axiom: TheAxiomFoundation/rulespec-us#1533 queued

🤖 Generated with Claude Code

hua7450 and others added 6 commits October 3, 2026 19:49
…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

codecov Bot commented Oct 7, 2026 •

Copy link
Copy Markdown

Codecov Report

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

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9968   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         7    +3     
  Lines           76       103   +27     
  Branches         2         1    -1     
=========================================
+ Hits            76       103   +27     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 4 commits October 7, 2026 22:56
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>
hua7450 and others added 2 commits October 11, 2026 23:45
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>
@hua7450
hua7450 marked this pull request as ready for review October 12, 2026 05:54
@DTrim99

DTrim99 commented Oct 14, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Georgia LIHEAP regular heating assistance

PR #9968: Add Georgia LIHEAP regular heating assistance (author: hua7450, head 50aaa0096e)

Scope: Georgia's LIHEAP regular heating assistance, run by DFCS through Community Action Agencies, for FY2025 and FY2026. The PR covers:

  • household size, which counts citizens and qualified noncitizens (undocumented and DACA members are left out, but their income counts), and countable income, which counts members 18 and over, with Social Security net of the Part B premium, a $25-a-month interest disregard and per-source loss floors;
  • the income limit at 60% of state median income, through the shared liheap_smi_limit helper;
  • the Benefit Matrix: Level I or Level II by the printed cutoffs for sizes 1-16 in FY2025 and FY2026, and the step 2 amount for five fuels;
  • the energy-burden test, including heat in rent and subsidized housing; the lowest award for unsubsidized renters whose rent includes all utilities (plan item 16.1); and the main-fuel award, paid to the electric vendor, for heat-in-rent renters billed for electricity.

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), programs.yaml and a changelog fragment. Every parameter has a single 2025-10-01 value except the Level I cutoffs (2024-10-01 and 2025-10-01). The tests use periods 2026 and 2025, and the registry lists verified_years: "2025-2026".

Overall: the FY2025 and FY2026 policy values are right.

  • All 10 step 2 amounts and all 32 printed Level I cutoffs (16 per year) match the two matrices, and all 32 printed income limits reproduce with the HHS floor-then-floor method.
  • The income rules follow the manual's Include/Exclude table. Social Security is counted net of the Part B premium, which is right for Georgia: plan item 1.9 checks "Excluding MediCare deduction" in the FY2022, FY2025 and FY2026 plans and the FY2027 draft, and the manual excludes "Health Premiums" (p69). That is the counterpart of Alabama's "Including" box, read as gross in Add Alabama LIHEAP regular heating assistance #9967.
  • The heat-in-rent routes follow the manual's energy burden table (p89) and plan item 16.1. A note on the FY2024 matrix, which the PR does not cite, backs the main-fuel amount on the electric route (G3).
  • The plan-versus-manual choices (lottery winnings, cash gifts, disability and workers' compensation) are documented and defensible: the FY2022 plan, which covers the program year in which the manual was revised, already leaves the same boxes unchecked.

There are no critical findings. The three should-address items:

  • S1: a merge blocker from main's Integrate modeled state unemployment insurance into income flows #9558. The person source list reads the raw unemployment_compensation input, so main's new code-health guard fails on the merged tree. Georgia has no modeled unemployment insurance yet, so no household value changes today.
  • S2: eight of the 24 person income sources are never nonzero in any test, including two that the PR defends against the plan, and two smaller pieces of logic are also unpinned.
  • S3: six parameter descriptions fall outside the house template.

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:

  • 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/
  • M = Georgia LIHEAP Policy Manual, revised January 2022 (PDF page = printed page)

Line numbers refer to head 50aaa0096e.

Source Documents

# Document Link Use
1 FY2026 Georgia LIHEAP State Plan (47 pp, report period 10/01/2025-09/30/2026, "Submission Accepted by CO") GA_Plan_2026.pdf 1.1 dates (p4); 1.4 Yes, 1.8 Gross Income, 1.9 (p5-7); 2.1 60% SMI, 2.2-2.3 (p8); 2.5 with the $1,000 credit rule, 2.6 $400 / $810 (p9); 16.1 lowest benefit for direct payment (p30). The text layer lacks the checkbox states, so the rendered pages were read
2 FY2025 plan (Revision #2) GA_Plan_2025.pdf 1.9 "Excluding MediCare deduction", cash gifts and lottery unchecked (p6); 2.1 (p8); 2.6 $400 / $810 (p9); the same 16.1 sentence (p30)
3 FY2022-FY2024 plans FY2022, FY2023, FY2024 FY2022 1.9 boxes (p6); 2.6 ranges $350-$450, $350-$500 and $400-$810 (p9); FY2024 16.1 (p30)
4 Draft FY2027 plan (report period 10/01/2026-09/30/2027, status "Saved") DFCS download Heating 12/01/2026-07/31/2027 (p4); the same 1.9 boxes (p6); 60% SMI (p8); $400 / $810 (p9); the same 16.1 sentence (p30). It has no matrix
5 M (89 pp) GA_PolicyManual_2023.pdf 101.2 (p3-4); 1100.3-1100.5 (p50-52); 1100.12, 1100.14 (p56-57); 1200.1-1200.7 (p62-69); 1300.2 (p70); glossary (p75-76); application items (p81-85); energy burden table (p89). The Include/Exclude columns were read from the rendered pages
6 FY2026 and FY2025 Benefit Matrices (1 p each) FY2026, FY2025 Step 1 Level I and Level II ranges for sizes 1-16; step 2 heating amounts
7 FY2024 Benefit Matrix and FY2023 Eligibility Guidelines (1 p each) FY2024, FY2023 Not cited in the PR. FY2024: the same step 2 amounts, Level I tops of $11,687-$36,411, and the "*Important! The main fuel type is not always where the benefit is applied" note (G1, G3). FY2023: flat $450 / $350 / $500 for all fuels (G1)
8 DFCS PAMMS LIHEAP export (dated 2026-10-07) liheap.pdf Chapter 100 (effective October 2020): the three requirements and "vendor bill/statement for the main heating source" (p4); the stale "$350 ... $400" benefit text (p5). It holds chapters 100-800 only, with no income chapter
9 DFCS LIHEAP page (modified 2026-09-28) dfcs.georgia.gov FY2027 heating opens December 1 for residents 65 and older or homebound and January 2 for everyone; "U.S. citizen or legally admitted immigrant"; the $1,000 credit rule

Critical (Must Fix)

None.

Should Address

S1. Merge blocker: after merging main, the person source list reads the reported-only unemployment_compensation, so main's guard fails

  • Where: P/income/sources/person.yaml:13 (- unemployment_compensation).
  • What changed on main: Integrate modeled state unemployment insurance into income flows #9558 (merged 2026-10-13, after this PR's last push) added total_unemployment_compensation, which uses the reported amount when present and otherwise the modeled state unemployment insurance programs. It moved every income-source list under parameters/ to the total, including the merged LIHEAP lists (for example nj/dca/liheap/income/sources/unearned.yaml:4), and added policyengine_us/tests/code_health/test_unemployment_compensation_readers.py, which fails on any raw list entry.
  • Reproduced on the git merge-tree result of main 8ae01aa3cb and this head: test_parameter_source_lists_do_not_read_raw_unemployment_compensation fails with one violation, parameters/gov/states/ga/dfcs/liheap/income/sources/person.yaml:13. The file's other three tests pass, and the PR's 54 cases still pass on that tree.
  • Source: M 1200.7, p. 67 includes "Unemployment Compensation" ("Unearned benefits received from the Department of Labor by unemployed persons"), and plan 1.9, p. 6 checks "Unemployment insurance". Neither separates reported from modeled amounts.
  • Impact: main models unemployment insurance for AL, NJ, NY, OK, PA and UT only (gov.states.household.modeled_state_unemployment_compensation), so for Georgia households total_unemployment_compensation equals the reported amount and no value changes today. The guard still blocks the merge, and the raw entry would silently drop Georgia UI once it is modeled.
  • Why should, not critical: the head is correct against its base and CI is green. git merge-tree shows a clean textual merge, but this has to change before merge (as Add Alabama LIHEAP regular heating assistance #9967 S1 and Add Rhode Island LIHEAP regular heating assistance #9972 S1).
  • Fix: replace the entry with total_unemployment_compensation, add a case with nonzero unemployment compensation (the S2 case covers it), and update rulespec-us#1533's input list, which names unemployment_compensation.

S2. Eight income sources and two smaller pieces of logic have no test that would fail if they broke

Each mutation below, applied to the head on its own, still passes all 54 cases.

  1. Eight person sources. unemployment_compensation (line 13, which S1 replaces), veterans_benefits (26), disability_benefits (31), workers_compensation (32), strike_benefits (33), general_assistance (34), alimony_income (48) and child_support_received (49) in P/income/sources/person.yaml are never nonzero in any test, so deleting all eight passes.
    • Three are deliberate choices. The PR counts disability_benefits and workers_compensation per M p65 ("Disability Payment") and p68 ("Workers Compensation"), against plan 1.9's unchecked "Insurance payments made directly to the insured". general_assistance is a checked plan category. The PR body's conflict table defends the first two, but no case pins them.
    • Pin all eight with one case: an adult with $100 of unemployment compensation, $200 of veterans' benefits, $300 of disability benefits, $400 of workers' compensation, $500 of strike benefits, $600 of general assistance, $700 of alimony and $800 of child support. Reproduced at head: ga_liheap_income 3,600, and with electric heat ga_liheap $500. The same case fails under the mutation, since none of its income would count.
  2. The tenant_pays_utilities conjunct of the electric-vendor route (V/eligibility/_ga_liheap_housing.py:38). It separates that route from the all-utilities-in-rent route. For unsubsidized renters both routes make the household eligible and the direct route sets the amount, so the conjunct matters only for subsidized renters. No case has a subsidized renter with tenant_pays_utilities false and an electric bill, so replacing the conjunct with True passes all 54 cases.
    • Reproduced at head: a subsidized renter with $12,000 of wages, natural gas heat in rent, rent $3,000, tenant_pays_utilities false and a $1,200 electric bill is ineligible. That case fails under the mutation; by the formula the household becomes eligible for the natural gas Level I amount, $660 (hand-computed).
    • The input is unusual: the tenant_pays_utilities documentation says to set it false "when utilities are included in rent", yet the household reports an electric bill. Either pin the current result with that case, or drop the conjunct, since a positive electric bill already shows that "their utility bill is in their name" (M p4).
  3. The size-0 mask on the income limit (V/eligibility/ga_liheap_income_limit.py:23, where(size > 0, limit, 0)). Returning the unmasked limit passes all 54 cases. Without the mask, a unit with no qualified member gets the size-1 limit: the HHS size factor at size 0 is 0.52, so floor(66,441 x 0.52) = $34,549 (hand-computed). Eligibility still gates on size > 0, which T/eligibility/ga_liheap_eligible.yaml Case 2 pins, so only the limit variable changes. No case asserts the limit for a size-0 unit. Add ga_liheap_income_limit: 0 to T/ga_liheap_household_size.yaml Case 2 (reproduced at head: 0; that assertion fails under the mutation).

By inspection, the other branches are pinned: each energy-burden arm, each conjunct of the all-utilities-in-rent route (T/eligibility/ga_liheap_eligible.yaml Case 7 changes one at a time), the eligibility size gate, both NONE checks, the 32 Level I boundaries, the size-16 cap, the per-source floors, the Social Security net and floor, the interest disregard and mask, and the TANF read. Two control mutations confirm the method: dropping the electric route's heat-in-rent conjunct fails T/ga_liheap.yaml Case 14, and dropping heating_type != NONE fails T/eligibility/ga_liheap_eligible.yaml Cases 4 and 7. Consistency: #9967 S3 and #9972 S3 rated untested logic SHOULD, and #9745 G7 suggested the all-sources case.

S3. Six parameter descriptions fall outside the house template

All nine descriptions end with "under the Low Income Home Energy Assistance Program." with nothing after it, which is right. The template's verbs are limits, provides, sets, excludes, deducts and uses. Six descriptions use other verbs:

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-01 entry for each size and set verified_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-01 entry by backward extrapolation. P/payment/base_amount.yaml, P/payment/lower_income_uplift.yaml and P/payment/maximum_table_size.yaml cite only the FY2026 matrix, and P/eligibility/smi_rate.yaml cites 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: true and ga_liheap: 0.
    • KEROSENE: heating_expense reads fuel_oil_expense for it, so the matrix's "OIL" row is the natural column.
    • SOLAR: heating_expense reads the electric bill ("Solar-primary homes are assumed grid-tied with electric supplemental heat"), so the ELECTRIC row fits.
  • UNSPECIFIED on the electric-vendor route is eligible but gets $0 (T/ga_liheap.yaml Case 16, unit 4). The heating_type documentation 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 #9754 note at V/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.
  • 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.yaml Case 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.yaml stores Level II, and P/payment/lower_income_uplift.yaml adds $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.py are 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.yaml Case 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-6 comment at V/income/ga_liheap_income.py:15 could 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: 0 appears nine times in T/ga_liheap_household_size.yaml and T/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 that ga_liheap_matrix_amount never 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.yaml Case 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.GA on five variables, and ga_liheap is gated by ga_liheap_eligible.
    • Vectorized formulas. All 9 parameters are read, and the shared liheap_smi_limit helper is reused.
    • Mixed Georgia and Alabama arrays mask correctly.
  • 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.yaml Cases 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.md is top level and typed added.

Checklist results (LIHEAP wave 2a)

  1. 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.
  2. 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).
  3. 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).
  4. 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.
  5. 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.
  6. Parameter descriptions: six fall outside the template (S3). There are no trailing clauses.
  7. References: pass. Every anchor is a file page that shows the value, and multi-page titles use #page 66,69, #page 62-69,83 and #page 5-6 (item 1.9 runs onto p7, G5).
  8. Wiring: pass. The programs.yaml entry and coverage line are well formed. No aggregate wiring, which matches OR, NY, NJ and MD on main (none of them is in household_state_benefits). defined_for gating is on every variable. No take-up beyond TANF's.
  9. Axiom: valid queued line. rulespec-us#1533 is open, labelled pe-parity, dispatch-ready and current to 50aaa0096e. It needs updates for S1-S2 (see below).
  10. 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).
  11. Integrate modeled state unemployment insurance into income flows #9558: S1. No modeled Georgia UI exists, so the effect today is the guard failure only.
  12. 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).
  13. 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

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 (plus enhancement), 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").
  • It describes head 50aaa0096e correctly, 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

  1. S1: rebase onto main, switch P/income/sources/person.yaml:13 to total_unemployment_compensation, and add a case with unemployment compensation.
  2. S2: add the all-sources case, the subsidized electric-route case and the size-0 limit assertion.
  3. S3: align the six descriptions.
  4. 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 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting 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.

hua7450 and others added 2 commits October 15, 2026 15:13
- 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>
@hua7450

hua7450 commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for the review. Fixes pushed in b36ba40.

  • S1: I merged upstream/main (PRs 9558 and 10046), and income/sources/person.yaml now lists total_unemployment_compensation; no Georgia LIHEAP formula or parameter reads the raw input. ga_liheap.yaml Case 21 adds $5,110 of unemployment compensation (Georgia's $365 maximum weekly benefit for 14 weeks, USDOL January 2026) to $12,000 of wages: income $17,110, Level II electric, $400 (the award without it is $500).
  • S2: (1) Income Case 15 sets your eight sources to $100 through $800 and expects $3,600. (2) I took your second option and dropped the tenant_pays_utilities conjunct: a positive electric bill is the bill "in their name" (manual p. 4), and the docstring reads page 82's "rent includes utilities" as rent covering every utility. Eligibility Case 9 pins your household at $660 with the $1,200 electric bill and ineligible without it; no existing expected value changes. (3) The size-0 assertion is ga_liheap_income_limit.yaml Case 4 ($0), in the limit's own test file rather than household-size Case 2.
  • S3: The six descriptions now use your suggested wording.
  • G1: Partly done. base_amount, lower_income_uplift and maximum_table_size now cite the FY2025 matrix, and smi_rate cites FY2025 plan item 2.1 (p. 8). Claiming FY2024 and gating or encoding FY2023: history is out of scope for this PR, so verified_years stays "2025-2026" and earlier years stay documented as unverified estimates.
  • G2: Partly done. The ga_liheap_matrix_amount comment now points to Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754 for the unspecified default. Kerosene, coal and solar, and unspecified fuel on the electric route, stay eligible at $0: heating_type is a required input, no Georgia source maps those fuels to a matrix row, and the electric route pays the main fuel's amount, which an unknown fuel lacks. These households meet the manual's energy-burden test, so the model keeps them eligible and documents the $0 as a coverage gap.
  • G3: Done. The FY2024 matrix note now backs the electric route in _ga_liheap_housing.py, ga_liheap_matrix_amount and the PR body. PAMMS chapter 100 (p. 4) backs the household-size reading, together with the DFCS page, and the main-heating-source bill rule in ga_liheap_eligible. The PR body says PAMMS p. 5 still prints $350-$400 with a senior maximum and that plan 16.1 (p. 30) makes the matrix govern.
  • G4: Kept Level II plus the $100 uplift, which reproduces all ten printed cells in both claimed years. lower_income_uplift.yaml now labels it an inferred pattern, and the ga_liheap_matrix_amount comment notes that the lowest-award shortcut relies on the same uplift for every fuel. I left the routes as helpers to avoid two more variables; eligibility Cases 7-9 and ga_liheap.yaml Cases 14, 16 and 17 pin them.
  • G5: Done. The PR body adds the not-modeled row for the other direct-pay cases (p. 89 rows 4 and 7, p. 4, and 1300.2 on p. 70) and the plan item 2.3 (p. 8) conflict row, which ga_liheap_eligible also notes. The heating_type sentence now covers eligibility and payment cases, and the item 1.9 title and comment read pages 5-7.
  • G6: Partly done. The isolated size, income, limit and matrix cases no longer set hud_utility_allowance or fuels and bills their variables do not read (income Case 8 keeps heating_type for the matrix amount, and matrix Case 3 keeps its $50 gas bill). FY2027 is unchanged: DFCS has published no FY2027 matrix and the draft plan keeps 60% SMI, $400-$810 and the 16.1 sentence, so period 2027 stays a documented carried-forward estimate.
  • Federal poverty floor: Separately from your review, eligibility now applies 42 U.S.C. 8624(b)(2)(B) through the shared gov.hhs.liheap.fpg_floor (1.1) and a Georgia fpg_year_lag of 1 (the guidelines HHS makes mandatory for the fiscal year). Georgia's 60% SMI limit falls below 110% of poverty from size 16 ($102,926 against $105,336 in FY2025; $107,634 against $107,965 in FY2026), and ga_liheap_income_limit still reproduces the printed table. ga_liheap.yaml Case 22 has 17 people whose four adults earn Georgia's median wages for cashiers and for fast food and counter workers, $111,980 in total: above the $109,627 limit and below the $114,015 floor, so it receives Level II natural gas, $560.
  • LIHEAP wave 2a: encode Georgia LIHEAP regular heating assistance TheAxiomFoundation/rulespec-us#1533 is refreshed to this head, including the "open as a draft" status line.

@hua7450
hua7450 requested a review from DTrim99 October 15, 2026 21:08

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Georgia LIHEAP regular heating assistance

2 participants