Repository navigation
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 103 +27
Branches 2 1 -1
=========================================
+ Hits 76 103 +27
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.
|
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
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). 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 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, 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"). 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
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
gambling_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
59 YAML cases in 6 files cover:
tenant_pays_utilitiesfalse: $660 with a $1,200 electric bill, ineligible without one;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.make formatandgit diff --checkpassed.make formatchangelog.d/axiom: TheAxiomFoundation/rulespec-us#1533 queued
🤖 Generated with Claude Code