Repository navigation
Conversation
Virginia Energy Assistance Program Fuel Assistance for FFY2026: 150% FPG income test with the all-SSI exception, countable income with the $50 elderly or disabled disregard, climate zones from county, the manual's point tables, placeholder fuel and energy-burden points, and the latest published value per point. Fixes #10291 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Count recurring cash contributions (financial_assistance) as unearned income, treat 100% service-connected disabled veterans as disabled, move the end-to-end cases into integration.yaml, add a two-person all-SSI case, and tidy one reference and the income-points comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main now models military retirement and survivor pay as the separate military_retirement_income total, so add it to Virginia's countable unearned income with countable-income and benefit cases. 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
PR Review: Add Virginia EAP Fuel Assistance (LIHEAP regular heating)PR #10303 (author: hua7450), head Path prefixes:
Sources read for this review:
SummaryWhat is right. The published FFY2026 parts are encoded correctly:
There are no critical findings and five should-address items:
There are also six suggestions. They include adding Virginia's Auxiliary Grant ( Status.
Critical (must fix)None. Should addressS1. Medicare premiums are not exempted: Social Security and railroad retirement count gross, although exemption 15 excludes the premium and
|
| Season | Source | Maximum | Minimum | Value per point | Points |
|---|---|---|---|---|---|
| FFY2025 | FY2026 plan, p. 9 | $634.43 | $181.26 | $4.531665 | exactly 140 and 40 |
| FFY2024 | FY2025 plan, p. 9 | $703.90 | $198.28 | $4.957075 | 142 and 40 |
| FFY2023 | FY2024 plan, p. 9 | $600.15 | $185.96 | $4.226444 | 142 and 44 |
What the model can produce:
- The five published factors (size, income, zone, vulnerability, living arrangement) sum to between 37 (9 + 0 + 8 + 0 + 20) and 100 (15 + 25 + 20 + 20 + 20).
- So in FFY2025 the fuel and burden points were at most 3 for the lowest-benefit household and at least 40 for the highest.
- The model gives every household 23. Its range is 60–123 points, or $271.90–$557.39; integration Case 7 is the model maximum.
- Size of the gap. The model understates the top by at least 17 points (about $77) and overstates the bottom by at least 20 points (about $91).
Only one input is missing. The burden is driven by household income, which the PR already computes. Only VDSS's average fuel cost per fuel is unpublished. A flat 13 removes the income gradient the regulation requires ("the highest benefit given to households with the least income").
Severity: should, as in Add Ohio HEAP regular heating assistance #9975 S3 (Ohio). There, the 2026 coefficients could not reproduce the printed FY2026 range, and the fix was a labelled estimate fitted to that range.
Fix: either of these.
- (a) Model the burden. Compute the burden as a labelled, estimated average seasonal fuel cost divided by monthly countable income, banded per Appendix B. Keep fuel points by fuel type if they can be estimated. Calibrate both so that the model's extremes reproduce the published 40- and 140-point households. Add cases that pin $634.43 (140 × $4.531665) and $181.27 (40 points; see G6).
- (b) Document the gap. Cite the plan 2.5 extremes in both parameter files, the body and the registry note, and state the model's $271.90–$557.39 range. Drop
verified_years: "2026", or limit the note to eligibility and the published tables, so the registry does not present estimated benefit amounts as verified.
S4. 15 of the 26 income-source entries have no test that would fail if they were dropped
- Where:
P/income/sources/earned.yamlandP/income/sources/unearned.yaml. - The untested entries. No case gives these a nonzero value:
- Earned:
sstb_self_employment_income,farm_operations_incomeandpartnership_s_corp_income. - Unearned:
total_unemployment_compensation,strike_benefits,railroad_benefits,retirement_distributions,survivor_benefits,general_assistance,tanf(every case setstanf: 0),rental_income,farm_rent_income,alimony_income,workers_compensationanddisability_benefits.
- Earned:
- The tested entries: wages, self-employment, Social Security, SSI, pensions, military retirement, child support, cash contributions, veterans' benefits, interest and dividends.
- Why it matters: this is checklist item 13.
total_unemployment_compensationis the Integrate modeled state unemployment insurance into income flows #9558-guarded entry, andtanfis the take-up-gated aggregate the comment describes; neither is pinned. - Severity: should, as in Add Alabama LIHEAP regular heating assistance #9967 S3 (Alabama) and Add Oklahoma LIHEAP regular heating assistance #9970 S6 (Oklahoma).
- Fix: add one countable-income case that sets every listed source to a distinct amount, as Alabama's Case 18 does. Include a positive
tanfand reported unemployment compensation. The S2 rental-loss case can sit beside it.
S5. axiom: needed is not a valid line for a staff author
- Where: the PR body's last line.
- The rule: CLAUDE.md "Axiom Parity" reserves
axiom: neededfor external contributors. Ziming is staff. - The issue state:
- rulespec-us has no Virginia EAP issue. I searched titles and the open pe-parity list.
- rulespec-us
main(5796861e58) has no Virginia EAP module:us-va/policies/holds onlycmsandincome_tax.
- Precedent. The wave 2a siblings and this PR's wave 1c companions use
queuedlines: rulespec-us Add Oregon integration test #1532 (Alabama) through Remove complex pass-through reform #1540 (Ohio), Updated Oregon tax parameters for 2022 #1833 (Arizona, PR Add Arizona LIHEAP Standard benefit #10293) and Too many EITCs #1834 (Iowa, PR Add Iowa LIHEAP regular heating assistance #10292). Each is open, labelledpe-parityand dispatch-ready. - Fix:
- File a dispatch-ready,
pe-parity-labelled rulespec-us issue in the Too many EITCs #1834 format. It needs:- module paths and corpus status;
- the verbatim 22VAC40-680-10, -20 and -30, manual B.5–B.7, C.5, D.4–D.5 and Appendices A–B, and FY2026 plan items 1.9, 2.1 and 2.5;
- the required outputs;
- companion tests taken from the manual tables and published limits, not from PE output;
- the blockers.
- Change the line to
axiom: TheAxiomFoundation/rulespec-us#<n> queued. - Update the issue for S1–S3 once they are settled.
- File a dispatch-ready,
Suggestions
G1. Count Virginia's Auxiliary Grant (va_ag, checklist item 17).
- What exists on
main. Add Virginia state supplementation for 2026 #10172 (merged, and already in this head's base) addedva_ag, Virginia's state supplement. It listsva_agin the SNAP and HUD unearned lists,household_state_benefitsandspm_unit_benefits. The EAP unearned list omits it. - The rule counts it.
- Manual B.5.a (p. 25) names "auxiliary grants to the aged, blind and disabled" as public assistance.
- None of the 27 exemptions covers it.
- Exemption 25 follows SNAP, which counts it.
- Example (hand trace, 2026). A person aged 70 in Norfolk gets the full $994 of SSI. They are certified for an Auxiliary Grant in supportive housing (outside Northern Virginia) and have a heating bill.
- The grant. The care rate is 994 + 1,136 = $2,130. The need is $2,130 + $87 = $2,217, so the grant is $2,217 − $994 = $1,223 a month.
- Head: 11,328 is 48% of the limit: 15 income points, 95 points, $430.51.
- Counting
va_ag: 26,004 is 111%. The all-SSI waiver keeps the household eligible, at 0 income points: 80 points, $362.53.
- Why only a suggestion:
- Most Auxiliary Grant recipients live in licensed assisted-living or adult foster care settings, which B.5.c.2.b excludes. The PR does not model that exclusion.
va_ag_certifieddefaults to false, so microsimulation is unaffected.- The batch rated the same gap a suggestion for Oklahoma (Add Oklahoma LIHEAP regular heating assistance #9970) and New York (Add New York state supplementation for 2026 #10158).
- Fix: add
va_agbesidessi.
G2. A heat-in-rent household with UNSPECIFIED fuel.
- The input convention.
main'sheating_typedocumentation saysUNSPECIFIED"is also the right value when heat is included in rent and the fuel is unknown". The PR makes that household ineligible (V/va_eap_eligible.py:37-38; eligibility Case 14). - The rule. B.5.c.1.b admits unsubsidized heat-in-rent households without listing a fuel; only D.1.b asks the household to designate one.
- Why it can be changed. The model's points do not depend on the fuel. The merged AL, OH and OK formulas treat
UNSPECIFIEDas eligible. - Fix: consider
eligible_fuel | (heat_in_rent & UNSPECIFIED), or record the choice against the input convention in the body.
G3. Backfilled years (unclaimed and documented, as in NJ S3).
- The income rate.
P/eligibility/fpg_rate.yamlstarts at 1.5 on 2021-05-01 and carries back. The 01/03 Appendix B (p. 65) bases the levels on "130% of the Poverty Income Guidelines". - The value per point. The FFY2023 value carries back to 2015–2022, and FFY2022 was an ARPA year.
- Fix: consider a
2003-01-01: 1.3entry, if an older plan confirms it, or keep the backfill and keep the body note.
G4. References polish.
- The nine 22VAC40-680 entries point to the whole-chapter page. Section URLs (
.../chapter680/section10/,section20/,section30/) would anchor the cited text. - If S3 takes option (b), add the plan 2.5 extremes as a reference.
G5. Optional tests.
- A mixed-state case. No
va_eapcase runs a Virginia and a non-Virginia SPM unit in one simulation, as Alabama's Case 6 does. It is safe today:va_eap_climate_zonedefaults toTIDEWATER, a valid key inp.climate_zone[zone]. A mixed case would keep it pinned (item 15). - The default zone. A Virginia household with an unlisted county would pin the
TIDEWATERdefault of theselect.
G6. Cent truncation. The printed benefits truncate to the cent rather than round:
- 40 × 4.531665 = 181.2666 is printed as $181.26.
- 142 × 4.226444 = 600.155 is printed as $600.15.
va_eap does not round, so the difference is under one cent. Flooring to the cent is optional.
Verified correct
Values against sources:
- Income limits (manual B.6.a p. 28, Information Sheet 05/25, matrix p. 2). floor(1,956.25 + 687.5 × (n − 1)) gives 1,956, 2,643, 3,331, 4,018, 4,706, 5,393, 6,081, 6,768, 7,456, 8,143, 8,831, 9,518, 10,206, 10,893, 11,581, 12,268, 12,956, 13,643, 14,331 and 15,018. That matches all 20 published sizes. Above 20 the step is +687 (floor 687.5).
- The lag. The one-year guideline lag matches "new income limits ... in June of each year" (matrix p. 1).
fpg()reads the guideline at 2025-01-01 for period 2026. - Point tables (matrix pp. 6-7, rendered):
- size: 9 / 12 / 15;
- income: the ten bands from 25 down to 1;
- zones: 20 / 18 / 16 / 13 / 12 / 8;
- vulnerability: 20 / 15 / 12, not cumulative;
- living arrangement: codes A, C, E, G and P at 20.
- The 05/21 page says "150%", and the PR correctly sets aside the manual's 01/03 copy (130%).
- Climate zones (matrix pp. 3-5 and manual pp. 62-64): all 133 localities (95 counties and 38 cities) match. Salem comes from the 01/03 page, Bedford City is a town since 2013, and Clifton Forge is a town since 2001. Climate-zone Case 10 pins all 133.
- Value per point:
- The three values match plan item 2.5 in FY2024, FY2025 and FY2026, each on p. 9.
- Period 2026 carries the FFY2025 $4.531665. That is the latest published value, as disclosed.
- No FY2027 plan or matrix is posted: the Clearinghouse returned 404 on 2026-10-21, and the VDSS page still links the 05/25 Information Sheet.
- Eligibility:
- Fuels and expense: the seven fuels (B.5.c.1.a, p. 26; application question 12), heat in rent for unsubsidized households (B.5.c.1.b), and subsidized households paying their own bill (B.5.c.1.c).
- Exclusions: subsidized households with heat in rent (B.5.c.2.a; plan 2.3, p. 8), homeless households (B.5.c.2.g).
- Income: the at-or-below test (22VAC40-680-20(B)(1)) and the all-SSI exception (B.6.a).
- Not required: there is no asset test (plan 2.3), no categorical eligibility (plan 1.4 "No", rendered p. 5) and gross income applies (plan 1.8).
- Income:
- The deduction. $50 a month per elderly (60+) or disabled member, once per person (B.6.c, p. 31). The disability definition matches 22VAC40-680-10. Using
is_disabledfor railroad disability and Medicaid permanent-and-total certification follows merged Ohio and Florida. - Exempt earnings. Members under 18 (exemption 20; plan 1.9 box unchecked).
- Household size. Ineligible noncitizens are left out of the size, but their income counts (B.7, p. 31; C.5.a, p. 41).
- Gross wages (C.5.a.3.a).
- Interest, dividends and cash contributions are counted under the manual, against the unchecked plan boxes. That is documented and defensible: C.5.a.4.c names "cash contributions", and exemption 19 excludes only one-time gifts.
- The deduction. $50 a month per elderly (60+) or disabled member, once per person (B.6.c, p. 31). The disability definition matches 22VAC40-680-10. Using
- Benefit: points × value per point (22VAC40-680-30(4)). There is no minimum or maximum other than the points.
Hand-checked expectations (15 cases). At $4.531665 a point and 43 points of living arrangement, fuel and burden:
- Integration Case 1: 11,736 − 600 = 11,136, or 47.44%: 15 points. Fairfax is Northern (16). 9 + 15 + 16 + 20 + 43 = 103, so $466.76.
- Integration Case 2: 26,562 + 3,600 = 30,162 against 39,972, or 75%: 8 points. Norfolk is Tidewater. 12 + 8 + 8 + 12 + 43 = 83, so $376.13. Heat in unsubsidized rent is eligible.
- Integration Case 3: the 16-year-old's $4,000 is exempt. 52,000 against 72,972 is 71%: 8 points. 15 + 8 + 12 + 12 + 43 = 90, so $407.85.
- Integration Case 4: 18,960 − 600 = 18,360, or 78%. The subsidized household with its own bill is eligible. 9 + 8 + 12 + 15 + 43 = 87, so $394.25.
- Integration Case 5: SSI 438 (994 − 957.50 = 36.50 a month). 24,438 − 600 = 23,838, or 101%: 0 points. All-SSI keeps it eligible. 9 + 0 + 18 + 15 + 43 = 85, so $385.19.
- Integration Case 6: size 2 (undocumented parent excluded). 25,000 against 31,716 is 78%. 9 + 8 + 16 + 12 + 43 = 88, so $398.79.
- Integration Case 7: 11,400 against 64,716 is 17%: 25 points. Augusta is Central Mountain. 15 + 25 + 20 + 20 + 43 = 123, so $557.39 (the model maximum; S3).
va_eap.yamlCase 5 (2025): floor(15,060 × 1.5 / 12) = 1,882, or 22,584. 12,600 is 55%: 13 points. 9 + 13 + 12 + 20 + 43 = 97, so $439.57.va_eap.yamlCase 7: the −60,000 loss floors to 0. 15,000 is 63%: 10 points, 74 points, $335.34.va_eap.yamlCase 8: military retirement of 18,000 is 76%: 8 points, 76 points, $344.41.- Income-limit Cases 1 and 4: all listed sizes, including 21 (188,460) and 22 (196,704). For 2025, sizes 1–4 give 1,882, 2,555, 3,227 and 3,900; size 20 gives 14,660; size 21 adds 672.
- Income-points Cases 1–2: 37,691 / 188,460 = 19.99947%, rounded to four places and floored, gives 19, so 25 points. Each exact band start lands in its band.
- Countable Case 19: 9,600 (SBP annuity in
military_retirement_pay_survivors) + 12,000 − 600 = 21,000. - Income-eligible Case 9: the couple's SSI is 17,892 − (34,000 − 240 − 780) / 2 = 1,402. 34,000 + 1,402 − 1,200 = 34,202 > 31,716, but both members receive SSI, so eligible.
- Eligibility Cases 13–17: heat in unsubsidized rent is eligible. A voucher or public-housing household with heat in rent is not. A subsidized household with its own bill is.
Batch checks:
- Integrate modeled state unemployment insurance into income flows #9558: the list reads
total_unemployment_compensation. The guard's four tests passed in CI (Rest shard-1). It is unpinned by any case (S4). - Wire military retirement pay and survivors into federal and state tax (#10181) #10182 (item 16): the list reads
military_retirement_income, and countable Case 19 pins the survivor input. - Document disjoint health premium inputs and correct consumer treatment #10046 (item 14): not applicable to payroll premiums. Virginia counts gross wages from
employment_incomeand deducts no health premiums, apart from Medicare (S1).ssicounts the actual benefit. - State-gated keys (item 15): safe.
va_eap_climate_zoneis an enum gated to Virginia whose default,TIDEWATER, is a valid key inp.climate_zone[zone].va_eap_household_size(int, default 0) feeds only.calc()brackets and arithmetic.- The Microsimulation job passed. A mixed-state test is optional (G5).
- Federal 110% floor: never binds. The limit uses the same lagged guideline as
gov.hhs.liheap.fpg_floor, and floor(1.5g / 12) × 12 ≥ 1.5g − 12 is about 1.36 times 1.1g at every size. For size 1 in 2026 that is $23,472 against $17,215; above 20 members, +$8,244 a year against +$6,050. Not wiring the floor matches Alabama and Apply the federal 110% poverty floor to state LIHEAP programs (DC, MA, MS, NJ, OR) #10279's treatment of 150% states. - IIJA (item 12): Virginia pays no separate supplement; the value per point comes from the whole allocation.
- Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287):
- I ran the comment readers and
CONFLICT_COMMENT_REfrommain'stest_source_conflicts.pyover the PR's 37 new parameter and variable files. They give 0 matching lines and no marker attempts. A control file (Florida'sbase_amount.yaml) gave its expected 1. - In CI,
test_conflict_sounding_comments_do_not_growpassed on the merge withmainata6fafb06c2.main's two newer commits touch no code-health file.
- I ran the comment readers and
- Wiring:
- Registry. The
programs.yamlVA entry is in order after TX, and VA is added to the coverage line.test_programs_registrypassed. - Aggregates. No aggregate wiring, which matches every merged LIHEAP state.
- Gating.
defined_for = StateCode.VAis on 10 variables, andva_eapis gated byva_eap_eligible. - Take-up. None beyond
tanf's. - Changelog.
changelog.d/va-liheap-wave1c.added.mdis top level and typedadded.
- Registry. The
- Descriptions (item 6): all 26 end "under the Energy Assistance Program", Virginia's program name, as Ohio's end "under the Home Energy Assistance Program".
- References (item 7): every anchor I opened shows its value:
- matrix pp. 1, 3-7;
- plan pp. 5, 6, 8 and 9;
- manual pp. 26, 28, 30, 31, 52 and 62-66;
- application pp. 1-2.
- Multi-page titles use
#page 28,38-40and#page 31,52, and variable tuples use# PDF pagescomments.
Checklist results (LIHEAP batch):
- State plan and manual: pass for every published table. The value per point is the latest published; S3 covers the placeholders.
- Income definition: fail on two items. Medicare premiums are not exempted (S1), and rental losses net (S2). Gross wages and Social Security otherwise follow the manual.
- Backdating: pass for 2026. Earlier years are documented backfill (G3), and no FY2027 table is published.
- Household and arrangement rules: pass. Every eligibility branch has a test; heat in rent with
UNSPECIFIEDfuel is G2. - Tests: 124 cases, 15 hand-checked, periods plain. Source coverage is S4.
- Descriptions: pass.
- References: pass (polish in G4).
- Wiring: pass.
- Axiom: invalid (S5).
- Branch and CI: a clean merge; 15 pass and 3 pending, none failed.
- Integrate modeled state unemployment insurance into income flows #9558: pass (pinning in S4).
- IIJA / FY2027: not applicable; nothing published for FY2027.
- Mutation check: every eligibility, limit, points and vulnerability branch is pinned. 15 source entries are not (S4).
- Document disjoint health premium inputs and correct consumer treatment #10046: not applicable (gross wages, no premium deduction other than S1).
- State-gated index defaults: safe (default key valid).
- Wire military retirement pay and survivors into federal and state tax (#10181) #10182: pass.
- Merged state SSPs:
va_agis missing (G1).
- Federal 110% floor: never binds.
Axiom line assessment
Invalid: axiom: needed (S5).
- The rule. CLAUDE.md allows
neededonly for external contributors; the author is staff. - No issue exists. rulespec-us has no issue for Virginia EAP, and
main(5796861e58, 2026-10-20) has nous-vaEAP module. - The companions are queued. Updated Oregon tax parameters for 2022 #1833 (Arizona) and Too many EITCs #1834 (Iowa) are open and labelled
pe-parity. Each records its blockers (sources missing from the corpus, an unchecked signed release, encoder approval) and its companion tests. - What the new issue needs. File the Virginia issue in that format, matched to the head after S1–S4 are settled. Its required outputs should name
medicare_part_b_premium(S1) and the per-source floors (S2). Its interpretations should record the placeholder or estimated fuel and burden points (S3), the plan-versus-manual choice for interest, dividends and cash contributions, and Salem's zone.
CI status
15 pass, 3 pending, 0 failed. Run 39635445749 tests merge commit 9f707dcb, which merges head 1396baf7fe into a6fafb06c2 (pull_request, started 2026-10-21 17:24 UTC). I re-checked gh pr checks 10303 at the end of this review.
- Passed: all four states shards, household, irs, ssa-usda, rest-a and rest-b baseline shards, Rest (Python, shard-1), Microsimulation, Household API Partners, PR validation, Package and compatibility, and Quick Feedback.
- Still pending: Baseline contrib-hhs, Baseline reform, and Rest (Python + variables). None of them runs the Virginia EAP files.
- Where the Virginia tests ran. Quick Feedback deferred to the full suite: "12 files > 8" changed test files. States-shard-4 (batch 12/13) ran all 12 Virginia EAP files: 7 + 8 + 10 + 19 + 10 + 23 + 6 + 9 + 6 + 7 + 7 + 12 = 124 passed.
- Guards. Rest shard-1 passed:
- the six
test_source_conflicts.pystructural tests, including the ratchet; - the four Integrate modeled state unemployment insurance into income flows #9558 guard tests;
test_members_are_state_gated;test_programs_registry.
- the six
- Known main-caused failure. Not applicable: the run started after 13:24 UTC, and the ratchet passed.
- Locally: I ran no tests or probes. The examples in S1–S3 and G1 are hand traces of the code at the head.
Branch status
- Position: 7 commits ahead of
main(328d1721e2) and 2 behind. The merge base isa6fafb06c2(Support state-specific other additions and subtractions for remaining 30 states (Phase 2) #10302). The two newer commits (Count gross unemployment compensation and Social Security in South Carolina TANF #9687, South Carolina TANF, and a version bump) do not touch Virginia EAP. - Merge: clean.
git merge-tree --write-tree PolicyEngine/main 1396baf7feexits 0. - Sibling conflicts (branch note). A trial merge with each open LIHEAP PR conflicts only in
policyengine_us/programs.yaml, the shared coverage line and state list. The PRs are Add Georgia LIHEAP regular heating assistance #9968 (GA), Add Pennsylvania LIHEAP regular heating assistance #9971 (PA), Add Arkansas LIHEAP regular heating assistance #9973 (AR), Add Iowa LIHEAP regular heating assistance #10292 (IA), Add Arizona LIHEAP Standard benefit #10293 (AZ), Add Alaska LIHEAP regular heating assistance #10341 (AK), Add North Dakota LIHEAP regular heating assistance #10342 (ND), Add New Hampshire LIHEAP regular heating assistance #10343 (NH), Add Utah LIHEAP regular heating assistance #10344 (UT), Add Washington LIHEAP regular heating assistance #10345 (WA) and Add Wyoming LIHEAP regular heating assistance #10346 (WY). Point the FL and SD LIHEAP conflict candidates at their code on main #10349 merges cleanly. Whichever lands first, the rest need a one-line resolution.
0 critical, 5 should and 6 suggestions are open at this head.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
The FFY2026 limits, every Appendix B point table, all 133 climate zones and the eligibility rules check out, and #9558, #10182 and the ratchet pass. Five should-address items: (1) Social Security and RRB count gross, though VA excludes Medicare premiums (age 66 with $25k SS: $0 vs $412.38); (2) rental and farm-rent losses offset wages, against the PR's own no-offset rule; (3) the flat fuel and burden placeholders don't reproduce plan 2.5's range; (4) 15 of 26 income sources are never exercised in a test; (5) axiom: needed is invalid for staff, so file a pe-parity issue and mark it queued. Six suggestions. Full report in the comment above.
Adds Virginia's Energy Assistance Program (EAP) Fuel Assistance, the state's regular LIHEAP heating benefit, for FFY2026. The model counts citizens and qualified noncitizens for household size and counts the gross income of every member, less $50 a month for each member aged 60 or older or disabled. It tests that income against 150% of the 2025 poverty guideline, or waives the test when every member receives SSI. The household must heat with an eligible fuel and pay for heat directly or through unsubsidized rent. It then scores the manual's point tables and pays points times the statewide value per point. In 2026, a person aged 65 in Fairfax County with $11,736 of Social Security and a $1,200 gas bill has $11,136 of countable income, 47% of the $23,472 limit. That scores 9 (size) + 15 (income) + 16 (Northern zone) + 20 (elderly) + 20 (living arrangement) + 10 (fuel) + 13 (energy burden) = 103 points, and 103 × $4.531665 = $466.76.
Fixes #10291
Regulatory authority
Eligibility
defined_for = StateCode.VAva_eap_household_sizeaddsis_citizen_or_legal_immigrant; size 0 is ineligibleva_eap_income_limit= floor(guideline × 1.5 / 12) with a one-year guideline lag, reproducing the published $1,956 to $15,018 table for sizes 1 to 20 and the $687 step above 20va_eap_income_eligiblewaives the test when every member hasssi > 0orreceives_ssiheating_typelist parameter; UNSPECIFIED, SOLAR, OTHER and NONE are ineligible (callers sendheating_type)has_heating_expenseorheat_expense_included_in_rentheat_expense_included_in_rentwithreceives_housing_assistanceoris_in_public_housingis_homelessCountable income
military_retirement_income), retirement distributions, survivor benefits, general assistance, TANF received (tanf), rental and farm rent income, alimony, child support received, recurring cash contributions from outside the household (financial_assistance), veterans benefits, interest, ordinary dividends, workers' compensation and disability benefitsis_disabled, Social Security disability, SSI receipt withis_ssi_disabled, or a 100% service-connected disabled veteranBenefit
va_eap= points × value per point (22VAC40-680-30). Points (manual pages 65 to 66; matrix pages 6 to 7):county(all 133 Virginia localities)Placeholders. VDSS sets the primary fuel points each year from a vendor price survey and a Virginia Tech consumption study: the most expensive fuel gets 20 and the others get less in proportion to cost. The energy burden is the survey's average fuel cost for the household's fuel divided by household income. VDSS publishes only the method and the burden bands, not the survey results. The model gives every household 10 fuel points (half of 20) and 13 burden points (the 50% to 69% band). Together they add $104.23 to each benefit at $4.531665 a point. The true values can range from about 2 to 45 points ($9 to $204). Both placeholders are single parameters, so the published values can replace them directly.
Years covered
The registry entry records
verified_years: "2026". Earlier years use parameter backfilling and are unverified historical estimates.Not modeled and source notes
Test plan
policyengine_us/tests/policy/baseline/gov/states/va/dss/eap/, with expected values hand computed from the manual tables and the published limits in case comments. The suite was not run locally; CI runs it.make formatchangelog.d/axiom: needed
🤖 Generated with Claude Code