Skip to content

Add Virginia EAP cooling assistance electric bill payment - #10760

Open
hua7450 wants to merge 20 commits into
mainfrom
va-liheap-cooling
Open

hua7450 wants to merge 20 commits into
mainfrom
va-liheap-cooling

Conversation

@hua7450

@hua7450 hua7450 commented Nov 9, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Virginia EAP Cooling Assistance's electric bill payment: the bill amount up to the statewide yearly maximum, for households with a member who is 60 or older, under 6, or disabled.

Fixes #10759

Builds on the national LIHEAP total from #10730, merged on 2026-11-12: this PR adds va_eap_cooling to gov.hhs.liheap.regular_payments.

What and why

The EAP manual, Volume IX, Chapter J:

  • applies the Chapter B income, citizenship and other criteria (J.3.a, p. 120);
  • requires "at least one vulnerable person" (J.3.c);
  • pays "the exact amount of the bill not to exceed the appropriate maximum benefit" (J.6, p. 123), with "A disconnection notice is NOT a requirement" (J.7.g, pp. 127-128).

22VAC40-680-63(B)(1) applies all the fuel assistance criteria of 22VAC40-680-20, including 20(B)(3)(a), which makes subsidized households whose heat is in their rent ineligible. Manual J.3.a applies only Chapter B sections 6-8, and plan 3.3 excludes such households only when their cooling is in the rent. The project lead ruled on 2026-11-13 to follow the manual and the plan (candidate us-va:eap-cooling-subsidized-heat-in-rent; eligible Case 14 pins it). The FY2026 plan uses 150% of the guidelines (3.1). The Clearinghouse matrix explains that Virginia switches to the new income limits each June, for cooling. Home Office sets the maximum each year by broadcast (J.7.g).

  • The heating income limit and income test move into shared helpers, va_eap_annual_income_limit and va_eap_income_test. Heating results are unchanged.
  • cooling/fpg_year_lag.yaml (0) and va_eap_cooling_income_limit: 2026 is $23,940 for one person, matching the reported $1,995 a month; heating's 2026 limit is $23,472.
  • va_eap_cooling_eligible:
    • household size;
    • income at or below the cooling limit, or every member on SSI;
    • a member 60 or older, under 6, or disabled;
    • has_cooling_expense and a positive electricity bill;
    • not homeless.
  • va_eap_cooling: min(electricity bill, cooling/electric_bill_maximum). The maximum is $600 for 2023, the "one-time benefit" in the VDSS release of July 5, 2023, carried into 2024, and $365 for 2025, carried into 2026 and 2027.
  • Cooling sets no heating-fuel condition (J.3.a): every heating_type, NONE and UNSPECIFIED included, can be paid. Regular heating still pays no unspecified fuel.
  • has_cooling_expense is required, the input the all-state cooling work uses for a cooling cost.

Test plan

Tests were not run locally. This PR now targets main, so CI runs them.

  • YAML tests with expected values worked from the sources above. 25 cases in 3 files: the income limits by size and year, each vulnerable route, the SSI exception, the bill cap, a zero bill, homelessness, no cooling cost, an unspecified fuel paid for cooling, subsidized heat in rent with a separate cooling cost, a household with no citizen or qualified alien member, and heating plus cooling in the national liheap total. The $150 monthly test bill is about the EIA 2024 Virginia average residential bill of $148.77.
  • Source-conflict register: candidate us-va:eap-cooling-subsidized-heat-in-rent (ruled 2026-11-13, Add Virginia EAP cooling assistance electric bill payment #10760 (comment)). The parity issue lists the other readings (no-bill authorizations and the August 15 or 17 deadline).
  • make format (ruff)
  • Changelog fragment in changelog.d/

Not modeled

  • The 2025 maximum of $365 comes from press reports (WYDaily and WRIC, attributing VDSS); the reference titles say so. No primary source for 2026 or 2027 was found, so verified_years is "2025".
  • The annual electricity expense stands in for the balance owed during the June to August window (J.6, J.7.g), so a household with low bills in that window can be paid more than VDSS pays.
  • The first-come funding pool (J.1, J.10; 22VAC40-680-67) and the application window.
  • Renters whose cooling is in an unsubsidized rent (living arrangement E): has_cooling_expense is false for them.
  • Air-conditioner purchase, repair and fan help is equipment assistance and out of scope.

axiom: TheAxiomFoundation/rulespec-us#2190 queued

🤖 Generated with Claude Code

hua7450 and others added 14 commits November 8, 2026 22:01
Sum each state's regular LIHEAP payment in a new liheap variable, add an
Illinois regular heating payment without crisis assistance, add a Michigan
Home Heating Credit registry entry, and record each state's cooling
treatment in its registry note.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add regular_payments.yaml to the aggregate-list integrity test, which checks
that each member exists, is state-gated and is not dropped between year
blocks. Say that Rhode Island plans no regular cooling payment, since its
FY2027 plan still allows a leftover-funds cooling grant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dates the cooling guideline lag from FY2025, fixes the electric bill
maximum comment, cites the EIA 2024 average bill in the tests, and adds
a retiree case that checks the national liheap total.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The national `liheap` total evaluates every state's formula over a
mixed-state population, which no household test does. Two patterns on main
raised errors there:

- 26 formula files passed options=[ADD] to an entity call. Core's
  Microsimulation.calculate_add rejects the keyword an entity call passes.
  The option is redundant: a plain read already sums a monthly variable over
  the year through the same Core function.
- The DC and Illinois payment formulas look up a matrix by an income level
  that is 0 for households outside the state. Add the floor Maryland and
  Kansas already use.

Also:
- Reword the North Dakota registry note: the state reserves an optional
  direct cooling payment, so its cooling component is not only equipment.
- Add a `liheap` case with Texas, DC and Illinois households in one
  simulation.
- Add a code-health check against options=[ADD] and options=[DIVIDE].
- Check that every state payment in the LIHEAP registry entry is in the
  list `liheap` sums.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
PolicyEngine/policyengine-core#647 fixes the cause in Core: it lets a
Microsimulation accept the keyword an entity call passes with
options=[ADD] or options=[DIVIDE]. Once that is released the option works
again, so a check that bans it here would be wrong. The 26 formula files
stay without the option, which was redundant and lets `liheap` run on
today's Core.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
… press report

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ogram prefix

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Base automatically changed from liheap-aggregate to main November 12, 2026 19:06
hua7450 and others added 2 commits November 12, 2026 14:08
PR 10730 was squash-merged into main as f67bb1e, so this merge uses its
final head 4625f4e, already merged here, as the merge base.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Nov 12, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Virginia EAP cooling assistance electric bill payment

Summary

This PR adds Virginia EAP Cooling Assistance's electric bill payment as va_eap_cooling: the annual electricity expense up to a statewide maximum, for a Virginia household that passes the Fuel Assistance income and citizenship tests against the cooling season's own poverty guideline, has a member aged 60 or older, under 6 or disabled, has a separate cooling cost and a positive electric bill, and is not homeless. It also adds the payment to gov.hhs.liheap.regular_payments.

The core of the PR is right. Virginia pays Cooling Assistance on top of Fuel Assistance in the same program year, so listing both payments in the national total does not double count. Every income limit I checked matches the printed tables and the 2026 figures VDSS gave the press. The vulnerable-member routes, the all-SSI exception and the homeless and zero-balance exclusions all follow Chapter J of the manual. The refactor of the two heating helpers is line-for-line identical to main and leaves heating results unchanged. The $600 for 2023 matches the VDSS release. The $365 for 2025 rests on press reports of a VDSS release, and the PR says so. For 2026 and 2027 the PR carries the $365 forward, and it says so in the parameter, the registry and the body.

I found two things to fix before merge, both should-address. First, the PR follows the manual and plan where 22VAC40-680-63(B)(1) says otherwise for subsidized households whose heat is included in their rent. It records no source-conflict candidate for that reading, and the body says the regulation "sets the same criteria". Second, the va_eap_household_size > 0 term has no test that would fail without it. The suggestions cover disclosure: the annual bill standing in for "the bill", the carried-forward maximum, and two narrowings with no Virginia source.

I did not run anything locally. The findings rest on reading the code and sources, on hand traces, and on the CI logs for this head.

Critical

None.

Should address

1. The PR pays cooling to subsidized households whose heat is in their rent. The regulation excludes them, and no candidate records the choice.
policyengine_us/variables/gov/states/va/dss/eap/cooling/va_eap_cooling_eligible.py:35-38, 45-53

  • What the regulation says. 22VAC40-680-63(B)(1) requires a cooling household to "Meet all of the fuel assistance criteria as set forth in 22VAC40-680-20". 22VAC40-680-20(B)(3) lists the households "ineligible to receive fuel assistance", starting with "a. Subsidized households whose total heating costs are included in their rent."
  • What the manual and plan say. Manual J.3.a (Complete_Manual.pdf p. 120) applies only "the criteria in Chapter B sections 6-8". The household-type exclusions sit in B.5.c.2, which J.3.a leaves out. FY2026 plan item 3.3 (p. 11) restates the exclusion in cooling terms: "Subsidized households whose total cooling costs are included in their rent are not eligible for cooling assistance."
  • What the PR does. It follows the manual and plan. It applies has_cooling_expense, but not heating's ~(heat_in_rent & subsidized) exclusion. The PR's own parity issue (Interpretations, item 6) says "There is no candidates.yaml entry for this reading."
  • Precedent. CONTRIBUTING.md#source-conflicts says "Regulations are law" and asks the ruling PR to record the conflict in source_conflicts/candidates.yaml. Existing LIHEAP items put a state regulation in the statute slot when no statute applies. us-ak:hap-general-relief-assistance is one: "No statute is supplied; 7 AAC 44.042(18) excludes ...". The body's "Source-conflict register: no statute conflict" does not cover this case.
  • The body's other claim. "22VAC40-680-63 sets the same criteria" is not accurate. 63(B)(1) brings in all of section 20, including the ineligible-household list. J.3.a does not.
  • Household. Period 2026. One person aged 62 with Social Security of $18,000, in public housing (is_in_public_housing true). heating_type NATURAL_GAS with heat_expense_included_in_rent true and no gas bill. has_cooling_expense true, pre_subsidy_electricity_expense $1,800.
    • Head, by hand trace: va_eap_eligible is false (heating's subsidized heat-in-rent exclusion). va_eap_cooling_eligible is true: income 18,000 - 600 = 17,400 ≤ 23,940, the member is 60 or older, and the household has a cooling cost and a bill. va_eap_cooling = min(1,800, 365) = $365.
    • Under 63(B)(1) and 20(B)(3)(a) the household is ineligible: $0.
  • Fix.
    • Add a candidate. For example us-va:eap-cooling-subsidized-heat-in-rent, program liheap, years 2023-2027 federal-fiscal. Sources: 22VAC40-680-63(B)(1) and -20(B)(3)(a) (regulation), manual J.3.a and J.3.f (manual), plan 3.3 (plan). Readings for each. pe_us.follows set to what the code does, code listing va_eap_cooling_eligible.py, state: unreviewed.
    • Add a YAML case that pins whichever reading the code takes (the household above).
    • Correct the body sentence.
    • By CONTRIBUTING's own ranking the regulation's reading is the default: add ~(heat_in_rent & subsidized) as va_eap_eligible does. Keep the manual and plan reading only if the project lead rules for it.

2. No test pins the household-size term.
va_eap_cooling_eligible.py:28, 47 (has_eligible_member = spm_unit("va_eap_household_size", period) > 0)

  • The rule. Manual B.7 (p. 31): "Federal law requires eligible Energy Assistance household members to be either a United States citizen or an alien in a qualified immigration status. An individual is not counted in the Energy Assistance household size, if he/she does not meet either of these criteria." J.3.a applies B.7 to cooling, and J.5.c screens "Citizenship" and "Household Size".
  • The gap. Every one of the 23 cases has only citizen members. By my reading, deleting & has_eligible_member leaves all of them passing. The parity issue concedes this too (Interpretations, item 11).
  • Household. Period 2026. One person aged 62, immigration_status UNDOCUMENTED, employment_income_before_lsr $17,000. NATURAL_GAS with a $900 gas bill, has_cooling_expense true, $1,800 electric bill.
    • va_eap_household_size = 0.
    • The income limit uses the clipped size of 1 (23,940), and income is 17,000 - 600 = 16,400.
    • The member is 60 or older, so the household counts as vulnerable.
    • The household-size term is the only one that denies: expected va_eap_cooling_eligible false and va_eap_cooling 0. Without the term the household would get $365.
  • Fix. Add this case to va_eap_cooling_eligible.yaml. The UNDOCUMENTED pattern is already used in va_eap_eligible.yaml and va_eap_household_size.yaml.

Suggestions

1. Say in the documentation and the body that the annual electricity expense stands in for "the bill".
va_eap_cooling.py:20-24; va_eap_cooling.yaml Case 5 (line 104)

  • What the manual pays. J.6 (p. 123) pays "the exact amount of the bill not to exceed the appropriate maximum benefit". J.7.g (pp. 127-128) verifies "The balance owed on the electric account" and allows payment "more than once during the program year". J.2.b (p. 119) requires that "all requests for electric bill payments must be submitted by ... August 15". So the payment covers the bills owed during the June 15 to mid-August window, adding up to the maximum (J.8: "the balance thereof").
  • What the code does. It caps the whole year's pre_subsidy_electricity_expense. For most households the cap binds either way. VDSS also paid preapproved households a flat "one-time benefit" in June. The difference shows up for low bills.
    • Case 5 expects $240 for a household whose whole-year bill is $240, about $20 a month. In the window that household would owe roughly $40 to $60.
    • A household with $80 a month in bills owes about $240 over June to August, and the head pays $365.
  • Fix. The code comment already labels this as a stand-in. Put the same words in a documentation field and in the body, along with the other not-modeled conditions: the first-come funding pool (J.1, J.10; 22VAC40-680-67, "Cooling assistance will be offered when sufficient federal funding is available") and the application window. Alternatively, cap the electricity cost of the window months.

2. Label the carried-forward maximum as carried forward wherever the tests name it.
electric_bill_maximum.yaml; va_eap_cooling.yaml Case 1 (line 11)

  • What I checked.
    • The FY2026 and FY2027 plans print only the equipment range in item 3.6: "Minimum Benefit $50 ... Maximum Benefit $700" (FY2026 p. 12; FY2027 identical). That matches the J.8 fan ($50) and air conditioner installation ($700) maximums, not the electric bill maximum, which J.8 lists as "Determined Annually".
    • I found no VDSS notice for 2024, 2026 or 2027. The Wayback index of VDSS news releases has cooling releases through 2023 only. Searches found no 2026 amount.
    • The $365 for 2025 appears in four reprints of the same VDSS release: WYDaily, WRIC on WAVY, The News-Gazette and The Virginian Review.
    • The HHS FY2024 Virginia profile reports an average cooling benefit of $607. That is consistent with carrying $600 into 2024, but it does not prove it.
  • Disclosure. The comments, the registry note and the body all disclose the carry-forward, so verified_years: "2025" is honest.
  • Fix.
    • Rename Case 1 to say the 2025 maximum is carried into 2026, as Case 3's name already does.
    • Consider adding 2023 to verified_years, since it is the only year whose maximum has a VDSS source.
    • Ask VDSS for the 2026 broadcast amount.

3. The UNSPECIFIED gate also turns away households whose heat is in their rent and whose fuel is unknown.
va_eap_cooling_eligible.py:23-27

  • Consistency with heating. This matches Virginia heating, which never pays UNSPECIFIED. heating_types.yaml leaves it out, and the va_eap_eligible documentation says "an unspecified fuel is ineligible, including when heat is included in rent". So the body's claim holds for this state.
  • The problem. The heating_type input documentation says UNSPECIFIED "is also the right value when heat is included in rent and the fuel is unknown". Such a tenant who pays a separate electric bill for air conditioning is correctly encoded and still gets $0 cooling. No cooling rule depends on the heating fuel (J.3.a), so Virginia gives no basis for this.
  • Fix. Accept heat_expense_included_in_rent as an alternative to a reported fuel, or note the effect in documentation.

4. Renters whose cooling is included in an unsubsidized rent (application code E) are left out, with no source and no disclosure.
va_eap_cooling_eligible.py:35-38

  • The sources. The comment cites J.3.f.1 ("living arrangement codes B and F") and plan 3.3 (subsidized households with cooling in rent). Neither names code E. Plan 3.3 answers "No" to "Renters with utilities included in the rent?" (p. 11). Manual D.8.b, which J.9 cites, pays directly "when heat/cooling is included in the rent" (p. 55).
  • Why the code excludes them. has_cooling_expense is false for code E, and no input separates E from B.
  • Fix. State this in the comment and documentation as not modeled. The parity issue already does, in item 5.

5. Test the vulnerable groups directly instead of through heating points.
va_eap_cooling_eligible.py:34

  • The issue. va_eap_vulnerability_points > 0 makes cooling eligibility depend on the heating point values (20, 15, 12). A reform that set one of them to 0 would also remove that group from cooling eligibility.
  • Fix. Use spm_unit.any(age >= p.age.elderly) | spm_unit.any(va_eap_disabled) | spm_unit.any(age < child_age_limit), which states J.3.c directly.

Verified correct

A separate regular cooling benefit exists in each claimed year.

  • Manual J.1 and J.7 (pp. 119, 124) describe it.
  • Plan item 1.1 prints the cooling application dates: 06/15/2025-08/15/2025 (FY2025), 06/15/2026-08/17/2026 (FY2026) and 06/15/2027-08/16/2027 (FY2027).
  • Plan item 1.2 (FY2026, read from the page image) puts 23% of funds into cooling, against 22% the year before.
  • The HHS FY2024 profile shows 82,983 households served with Cooling Assistance and $51.5 million spent on it.

Heating and cooling are paid to the same household in one year, so there is no double count.

  • J.1: "Households can receive Cooling Assistance in addition to Fuel and Crisis Assistance unless specifically restricted."
  • The 2025 VDSS release, as reprinted: "Receiving cooling assistance does not impact a household's eligibility for fuel or crisis assistance."
  • The FY2024 profile counts 144,007 unduplicated households against 101,881 heating, 82,983 cooling and 14,829 crisis households, so many received both.
  • Case 8 (liheap = 466.76 + 365 = 831.76) is right.

The maximum.

  • $600 for 2023 matches the July 5, 2023 VDSS release.
  • The release bars recipients of the "one-time benefit" from further electric bill payments. 63(B)(4) ("Not have received the cooling assistance maximum benefit during the current year") does the same, which supports reading the one-time amount as the maximum.
  • The FFY start dates map summer Y to period Y, as plan item 1.1 does.

The cooling income limit and the guideline lag.

  • The matrix note (p. 1) says the 2025 limits "were used for Cooling Assistance in June of 2025 and will be used for Heating and Crisis Assistance in FFY 2026. (Virginia begins to use the new income limits, which are optional until the start of the next FFY, in June of each year.)" That supports lag 0 for cooling against lag 1 for heating.
  • WYDaily (June 15, 2026) reports $1,995 and $4,125, which are 150% of the 2026 guideline.
  • The federal cap holds: 42 U.S.C. 8622(8) defines "poverty level" as the guideline "as prescribed and revised at least annually", and 150% exceeds the 110% floor.

Hand checks (11 expectations, from the printed tables):

  1. 2026, size 1: 1.5 × 15,960 / 12 = 1,995; × 12 = 23,940.
  2. 2026, size 2: 1.5 × 21,640 / 12 = 2,705; × 12 = 32,460.
  3. 2026, size 4: 1.5 × 33,000 / 12 = 4,125; × 12 = 49,500.
  4. 2026, size 21: size 20 is 1.5 × 123,880 / 12 = 15,485, plus 1.5 × 5,680 / 12 = 710; (15,485 + 710) × 12 = 194,340.
  5. 2025, size 1: floor(1,956.25) = 1,956 (manual B.6.a prints $1,956); × 12 = 23,472.
  6. 2025, size 4: floor(4,018.75) = 4,018 (B.6.a prints $4,018); × 12 = 48,216.
  7. Cooling Case 1: 18,000 - 600 = 17,400 ≤ 23,940; min(1,800, 365) = 365.
  8. Cooling Case 4: the 2023 limit is floor(1,822.5) × 12 = 21,864; min(1,800, 600) = 600.
  9. Eligible Case 1: 24,540 - 600 = 23,940, which is at or below the 23,940 cooling limit but above the 23,472 heating limit.
  10. Eligible Case 7: 34,000 + 1,402 - 2 × 600 = 34,202 > 32,460, but every member receives SSI, so the household is eligible.
  11. Case 8: 103 × 4.531665 = 466.76, the same as main's heating integration Case 1.

Eligibility terms.

  • SSI route. The all-SSI exception comes from B.6.a ("except households in which all members are SSI recipients", p. 28), which J.3.a applies to cooling. It is the same code heating uses. Plan item 1.4's "No" refers to categorical eligibility when one member receives SSI, which is a different rule. The exception is also within the SSI route of 42 U.S.C. 8624(b)(2)(A).
  • Vulnerable members. Age 60 or older, under 6, and va_eap_disabled match J.3.c, J.7 and the 22VAC40-680-10 definitions ("Disabled person", "Elderly person", "Vulnerability factor").
  • Homeless. The homeless exclusion follows J.3.f.2.
  • Zero bill. Denying a zero bill follows the specific rule in J.7.g ("If the current balance is zero, the LDSS will deny the application") over J.6's general "If there is no bill".
  • Cooling cost. has_cooling_expense is sourced for codes B and F and for subsidized households with cooling in rent.

The refactor.

  • va_eap_annual_income_limit and va_eap_income_test are the old formula bodies with year_lag and limit passed in as arguments. No logic changed.
  • The readers, va_eap_eligible (through va_eap_income_eligible) and va_eap_income_points (through va_eap_income_limit), are unchanged.
  • No existing test file changed, and the existing VA EAP tests passed in CI at this head.
  • Main has no Virginia EAP source-conflict record or marker, so nothing went stale.

The national total and the registry.

  • va_eap_cooling is an SPMUnit YEAR dollar amount gated through va_eap_cooling_eligible to StateCode.VA, and it is not part of va_eap.
  • By my reading test_liheap_total_sums_every_registered_state_payment passes and would fail if the new list line were deleted. Case 8 also pins the line.
  • The registry entry's label is unique, and its prefix resolves.

Mutation coverage. By my reading each of these has a case that would fail without it:

  • The income test: eligible Case 2 and cooling Case 6.
  • The SSI exception: eligible Case 7.
  • The vulnerable-member test: eligible Cases 3 and 5.
  • has_cooling_expense: eligible Case 8 and cooling Case 7.
  • The positive-bill test: eligible Case 9.
  • The homeless exclusion: eligible Case 10.
  • The UNSPECIFIED gate: eligible Case 12.
  • The NONE path: eligible Case 11.
  • The cap's min: cooling Case 5.
  • The maximum's date edge: cooling Cases 2 and 4.
  • The cooling lag: the 2025 and 2026 limit cases (lag 1 would give 22,584 and 23,472).
  • The increment above size 20: the size-21 case.
  • defined_for: the MD row.

Other checks.

  • No state-gated key lookups. The FPG lookup by state_group_str works for non-residents, as the MD row shows.
  • Every new variable is YEAR-defined, with no options=[ADD].
  • Parameter descriptions follow the house template, and the references open on the values: manual pp. 28, 120, 123; plan pp. 11-12; matrix p. 1.
  • The equipment component, security deposits and crisis assistance are disclosed as out of scope.
  • The changelog fragment is present.

Axiom line assessment

The body says axiom: TheAxiomFoundation/rulespec-us#2190 queued. The issue is OPEN, labelled pe-parity, and was last updated 2026-11-12 19:14 UTC. It names this head (a33d3cff29) and matches it in scope, parameters, variables and the 23 test cases. It is dispatch-ready on the #1467 model: module paths, corpus citations with ingest gaps, verbatim source text, required outputs, companion tests derived from the sources, and an Interpretations list that discloses both should-address items above (items 6 and 11). The line is valid. Two small updates are due once the fixes land: the issue's note that CI "has not yet run" is now stale, and item 6 should cite the new candidate.

CI status

All 36 checks pass at a33d3cff29 (run 43287815246). None are pending. The Quick Feedback job ran the three new files: va_eap_cooling.yaml 8 passed, va_eap_cooling_eligible.yaml 13 passed, va_eap_cooling_income_limit.yaml 2 passed. The full baseline suite, including the existing VA EAP files and the code-health guards, passed.

Branch status

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 two changes; neither is critical, and the core is right. Virginia pays Cooling Assistance in addition to Fuel Assistance ("Households can receive Cooling Assistance in addition to Fuel and Crisis Assistance", manual J.1), so the national total doesn't double count. Every income limit I checked matches the printed tables, the vulnerable-member, SSI, homeless and zero-balance rules follow Chapter J, and the heating refactor is line for line identical to main.

  1. Subsidized households with heat in the rent. 22VAC40-680-63(B)(1) requires a cooling household to "Meet all of the fuel assistance criteria as set forth in 22VAC40-680-20", and 20(B)(3)(a) makes "Subsidized households whose total heating costs are included in their rent" ineligible. The PR follows manual J.3.a and plan 3.3 instead and pays such a household $365, with no source-conflict candidate, and the description's "22VAC40-680-63 sets the same criteria" isn't accurate. Record the choice. By the repository's ranking the regulation's reading is the default unless the project lead rules otherwise.
  2. The household-size term has no test, by my reading: every case has only citizen members. The UNDOCUMENTED household in the report closes it.

Five optional suggestions follow; the most useful is saying in the documentation that the annual electricity expense stands in for "the bill". CI is green at a33d3cff29.

@hua7450

hua7450 commented Nov 13, 2026

Copy link
Copy Markdown
Collaborator Author

Ruling by the project lead, 2026-11-13: us-va:eap-cooling-subsidized-heat-in-rent

For Virginia's Cooling Assistance, follow manual J.3.a and FY2026 plan item 3.3: a subsidized household whose heat is included in its rent can receive cooling assistance when it pays its own cooling costs, and is excluded only when its cooling costs are in the rent (plan 3.3: "Subsidized households whose total cooling costs are included in their rent are not eligible for cooling assistance"). The reading of 22VAC40-680-63(B)(1) that would apply 22VAC40-680-20(B)(3)(a)'s exclusion of subsidized households whose total heating costs are included in their rent is not followed.

Reason: the plan is the current filing and states the rule in cooling terms; 22VAC40-680-63 took effect in 2003, and section 20 was last amended the same year.

Example: one person aged 62 in public housing with $18,000 of Social Security, natural gas heat included in the rent, a separate cooling cost and an $1,800 electric bill receives $365 in 2026 (va_eap_cooling_eligible.yaml Case 14).

hua7450 and others added 2 commits November 13, 2026 15:25
…n, size pin

Addresses DTrim99's round-1 review; upstream main merged first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450

hua7450 commented Nov 13, 2026

Copy link
Copy Markdown
Collaborator Author

This push (head bd1f8a61d8) records the ruled reading for subsidized heat in rent, pins the household-size term and removes the cooling fuel condition, all in 59bdaddd35; upstream main is merged in.

Should address

  • 1. Subsidized households with heat in the rent. The project lead ruled on 2026-11-13 to follow manual J.3.a and plan 3.3 (ruling), so the formula keeps paying them. source_conflicts/candidates.yaml adds us-va:eap-cooling-subsidized-heat-in-rent with your sources and readings (2023-2027 federal-fiscal, follows: conflicting-source, state: ruled; the note links the ruling). va_eap_cooling_eligible.yaml Case 14 is your household: va_eap_eligible false, va_eap_cooling_eligible true, va_eap_cooling 365. The comment in va_eap_cooling_eligible.py names the candidate. The body now says 63(B)(1) brings in 20(B)(3)(a), and its register line names the candidate in place of "no statute conflict".
  • 2. Household-size term. va_eap_cooling_eligible.yaml Case 15 is your UNDOCUMENTED household: va_eap_household_size 0, countable income 16,400, limit 23,940, va_eap_cooling_eligible false, va_eap_cooling 0.

Suggestions

  • 1. The annual expense for "the bill". va_eap_cooling.py has a documentation field: the annual electricity expense stands in for the balance owed in the June to August window, and the first-come funding pool and the window are not modeled. The body's Not modeled section lists these, citing J.6, J.7.g, J.1, J.10 and 22VAC40-680-67. I did not add a window-month cap.
  • 2. Carried-forward maximum. va_eap_cooling.yaml Case 1 is renamed "an eligible retiree receives the 2025 maximum carried into 2026." verified_years stays "2025": it lists only researched and tested years, and for 2023 only the maximum has a source; the 2023 income rules and manual were not researched. Asking VDSS for the 2026 amount is outside this round.
  • 3. The UNSPECIFIED gate. Removed from va_eap_cooling_eligible.py, by the project lead's rule for all the cooling PRs: a separate cooling payment adds no heating-fuel condition. A heat-in-rent tenant with an unknown fuel and a separate electric bill is now paid. Case 12 keeps its inputs; va_eap_cooling_eligible flips to true and va_eap_cooling to 365, each with a "Was" comment, and va_eap_eligible stays false. The test header and the body no longer say UNSPECIFIED is unpaid. This is the only formula change.
  • 4. Code E renters. Disclosed as not modeled in the va_eap_cooling_eligible.py comment and the body's Not modeled section: has_cooling_expense is false for renters whose cooling is in an unsubsidized rent.
  • 5. Vulnerable groups tested directly. Declined: results are the same under current parameters, and a direct test would reuse points.vulnerability.child_age_limit, which is described as a points parameter, or add a new parameter.

TheAxiomFoundation/rulespec-us#2190 now names this head and the round-1 CI run, with 25 cases, interpretation 6 citing the ruled candidate, interpretation 11 citing Case 15, companion test 12 updated, companion tests 13 and 14 added, and the UNSPECIFIED item removed.

CI is running at bd1f8a61d8.

@hua7450
hua7450 requested a review from DTrim99 November 13, 2026 20:35

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 Virginia EAP cooling assistance electric bill payment

2 participants