Skip to content

Add Rhode Island LIHEAP regular heating assistance - #9972

Open
hua7450 wants to merge 13 commits into
mainfrom
ri-liheap-wave2a
Open

hua7450 wants to merge 13 commits into
mainfrom
ri-liheap-wave2a

Conversation

@hua7450

@hua7450 hua7450 commented Oct 7, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Rhode Island's LIHEAP regular heating assistance. The model counts citizens and qualified noncitizens for household size and the income of adult members, tests income against 60% of state median income, and places the household in one of five bands by the prior year's poverty guideline. It pays the FY2026 primary heating grant for the household's fuel, plus the $350 utility enhancement on natural gas and electric grants, and the FY2026 heat-in-rent grants. In FY2026, a one-person household with $10,000 of wages and its own heating bill receives $861 for fuel oil, $582 for natural gas ($232 plus $350) and $743 for electricity ($393 plus $350). If heat is included in its unsubsidized rent, it receives $400, or $430 ($80 plus $350) when it pays a separate electric bill. With electric heat included in that rent and no electric bill, it receives $0, because matrix row G leaves the Electric cell blank. Earlier years and FY2027 reuse the FY2026 payment schedule as unverified estimates.

Fixes #9963

Regulatory authority

The model follows the DHS manual published June 11, 2019 and filed with the Public Utilities Commission in Docket 4290. Later editions exist: the Appendix H footers read "RI LIHEAP Policy Manual Appendix H May 2025" and "RI LIHEAP Policy Manual Appendix H July 2026", and the footer of the FFY2026 notice to applicants reads "RI LIHEAP Policy Manual July 2025". A search found none of these editions online.

Eligibility

Requirement Source How modeled
Rhode Island residence — defined_for = StateCode.RI
Household size counts citizens, permanent residents and qualified noncitizens Manual section III, page 12 Counts members with is_citizen_or_legal_immigrant, with no SNAP-specific waiting periods or bars. A household with no qualified member is ineligible. The income of nonqualified adults counts.
Income at or below 60% of state median income FY2026 plan section 2.1, page 8; FY2026 and FY2027 income tables Calls the shared liheap_smi_limit helper (#10019): floors 60% of the four-person state median income, applies the federal size share and floors again. This order reproduces all 14 published limits in FY2026 and FY2027; the sources do not state the order. One person: $42,252 in FY2026 and $43,410 in FY2027. The limit is inclusive.
Federal 110% poverty floor 42 U.S.C. 8624(b)(2)(B) Not encoded. The 60% SMI limit stays above 110% of the guideline the bands use for sizes 1–20 in FY2025–FY2027. The smallest margins are at size 20: $1,833 in FY2025, $9,216 in FY2026 and $8,988 in FY2027. The floor would first bind at size 21 in FY2025 and at size 23 in FY2026 and FY2027.
Energy burden Manual sections II.B and III.A, pages 5–6 and 12 Without heat in rent, a reported obligation (has_heating_expense) or a positive heating bill qualifies. Heat included in unsubsidized rent qualifies. A household with housing assistance or in public housing whose rent includes heat needs a positive electric bill (pre_subsidy_electricity_expense), whatever heating obligation it reports. heating_type NONE is ineligible.
No categorical eligibility and no asset test FY2026 plan question 1.4, page 5, and section 2.3, page 8 SSI or TANF receipt does not waive the income limit; assets are not tested.

Countable income

Item Source How modeled
Members whose income counts Manual section III.G, page 20; FY2026 and FY2027 application instructions, page 2 Counts income of members 18 or older, except a full-time student aged 18–23, whether or not the student heads the household. All income of members under 18 and of excluded students, including SSI and interest, is excluded.
Earned income Manual section III.E, pages 14–17; FY2026 plan sections 1.8–1.9, pages 5–7 Counts wages and net self-employment, SSTB, farm operations and partnership/S-corporation income, each floored at zero, with no further self-employment deduction (see the 40% row below).
Unearned income Manual section III.E, pages 14–17; FY2026 plan section 1.9, page 6 Counts unemployment (total_unemployment_compensation: the reported amount, or modeled state unemployment insurance when none is reported), strike benefits, Social Security (gross), SSI, pensions, military retirement pay, retirement account distributions, survivor benefits, railroad retirement, alimony, child support received, workers' compensation, disability benefits (standing in for Temporary Disability and Temporary Caregivers Insurance), cash support (financial_assistance), ordinary dividends, veterans benefits, estate income and gambling winnings. Floors each source at zero, so a loss in one source offsets nothing.
Rental income Manual sections III.E and III.G, pages 16 and 20; Appendix M Counts 50% of rental and farm rental income, each floored at zero.
Interest Manual section III.G, page 20; application instructions, page 2 Subtracts $500 a year once from the combined interest of counted members.
TANF (RI Works) FY2026 plan section 1.9, page 6 Counts the take-up-gated tanf aggregate, which includes ri_works, once per household.
Deductions Manual section III.H, pages 20–21 Subtracts child support and alimony paid, child care expenses when the household receives no child care subsidy, and the Medicare Part B premium. Income after deductions is floored at zero.

Benefit

Income band (share of prior-year guideline) Matrix row Delivered fuels Natural gas Electricity
Up to 75% A $861 $232 $393
76–100% B $805 $211 $357
101–125% C $752 $192 $324
126–150% D $704 $175 $295
Above 150% E $657 $159 $268
Subsidized housing with a primary heating bill, any income F $657 $159 $268
  • Delivered fuels are fuel oil, kerosene, propane and wood. Natural gas and electricity grants add the $350 enhancement (R.I. Gen. Laws § 39-1-27.12; DHS response 1-1; PUC Order 25579), so a row A gas grant is $582 and a row F electric grant is $618.
  • Band thresholds are the guideline times 75%, 100%, 125% and 150%, rounded half up to the annual dollar and upper-inclusive: $11,738, $15,650, $19,563 and $23,475 for one person in FY2026. The printed size-two 125% cell repeats the 150% amount ($31,725); the model applies the labeled 125% rate ($26,438).
  • Row F applies at any income to a household with housing assistance or in public housing that has its own primary heating obligation, using the same obligation test as eligibility. The FY2026 matrix prints the same cells for rows E and F, so the model reads row E's amounts for row F.
  • Heat-in-rent households receive rows H–I for any fuel, including an unspecified one, and row G for any fuel but electricity. A household with no separate electric bill receives $400 paid directly (row G). Row G prints $400 under Deliverables, Natural Gas and Other and leaves Electric blank, so electric heat included in unsubsidized rent with no electric bill is eligible but receives $0. A household with a separate electric bill receives $80 on that electric account (row H), or $50 in subsidized housing (row I), plus the $350 enhancement: $430 or $400. A subsidized heat-in-rent household with no electric bill is ineligible.
  • Outside heat in rent, coal, other and solar have no matrix amount: the Other column is blank in rows A–F, and Appendix B has no coal or solar box, so a household would mark those fuels Other. An unspecified fuel also pays $0 outside heat in rent, because heating_type is a required input (Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754). These households stay eligible.
  • The reported bill does not cap the award.

Years covered

Model year Program year One-person income limit Payment
2025 and earlier FY2025 and earlier Computed; unverified FY2026 matrix and $350 enhancement backfilled; unverified
2026 FY2026, October 1, 2025 to September 30, 2026 $42,252 FY2026 matrix and $350 enhancement
2027 FY2027, from October 1, 2026 $43,410, matching the FY2027 table FY2026 amounts, including the $350 enhancement, carried forward; unverified

A calendar-year period reads the parameters in force on January 1. Formulas are undated and verified_years is "2026". Earlier years backfill the FY2026 grants and enhancement as unverified estimates. The FY2025 plan (section 2.6, page 9) gives a $64 minimum and $1,148 maximum benefit, compared with FY2026's $50 and $861, so 2025 and earlier results do not reproduce those years' awards.

A search for the FY2025 grant matrix and enhancement found neither. It covered the ACF clearinghouse (the FY2025 matrix links return 404 on both clearinghouse domains), Wayback captures of the clearinghouse benefit page and of DHS's FY2025 guidelines and LIHEAP pages (income limits only), the FY2025 state plan, and Docket 23-33-EL: the DHS filing of October 8, 2024, the Division memo of November 13, 2024 and PUC Order 25281, which set the charge but not the grant. Earlier years differ as well: the FY2024 matrix differs from FY2026 in every cell, and PUC Order 24925 sets the enhancement at $515 for 2024 and $450 for 2023. RI Energy's April 2025 reconciliation shows FY2025 credits in multiples of $360, but no document states that amount, so the model does not encode it.

No adopted FY2027 matrix was found. DHS's October 2, 2026 filing in Docket 26-34-GE (page 2) says "Accounts receiving a 2027 Primary benefit will receive one additional credit from the LIHEAP Enhancement Fund" and leaves the amount to DHS, so the model carries the $350 forward as an unverified estimate.

Not modeled and source conflicts

Item Source Model treatment
Heat-in-rent payment route (matrix rows G–I) FY2026 matrix; manual section II.B, page 5 A reported separate electric bill selects the secondary-electric grant; otherwise the household receives the $400 direct grant (row G), except with electric heat, whose row G cell is blank ($0). The manual allows payment to a secondary heating source or utility or directly to the applicant but does not say how the route is chosen.
Electric heat in unsubsidized rent with no electric bill FY2026 matrix row G (Electric cell blank) Eligible; pays $0, with no enhancement.
$20.01 nominal payment for SNAP households in subsidized housing with heat in rent FY2026 plan section 1.7, page 5 Not modeled.
Utility provider and grant account R.I. Gen. Laws § 39-1-27.12; DHS PUC response, page 2 The enhancement assumes a qualifying distribution-company account receives the federal grant, including a heat-in-rent grant to a secondary electric account. Customers of the Block Island Utility District and the Clear River Electric and Water District, which the statute excludes, cannot be identified.
Full-time students who head the household Manual section III.G, page 20; FY2026 (Appendix H) and FY2027 application instructions, page 2 The 2019 manual excludes only a full-time student child who is not the household head; the current instructions exclude every full-time student aged 18–23. The model follows the current instructions.
40% self-employment deduction on gross receipts Manual section III.H, page 20; DHS FY2026 plan summary, page 1 ("Self-employment income (60%)") Uses existing net business inputs with no further deduction.
Nursing-home and adult day care payments; Medicare costs other than the Part B premium, including prescriptions Manual section III.H, pages 20–21 No sufficiently specific inputs; not deducted.
VA education and Aid and Attendance exclusions Manual section III.G, page 20 Cannot be separated from veterans_benefits, which counts in full.
Gross rents Manual section III.G, page 20 Existing rental inputs may hold net rather than gross rents.
State SSI supplement — Not modeled; ssi is the federal benefit.
Coal, other, solar and unspecified fuels outside heat in rent FY2026 matrix; Appendix B Eligible; pay $0. The Other column has no amount in rows A–F, and Appendix B has no coal or solar box. Unspecified fuel pays $0 because heating_type is a required input (#9754).
Crisis, cooling and weatherization assistance — Out of scope.

Where the FY2026 plan and the manual differ, the model follows the manual:

Topic FY2026 plan Manual and model
Lottery winnings and cash prizes Section 1.9 (page 6) leaves "One-time lump-sum payments, such as rebates/credits, winnings from lotteries" unchecked. DHS's FY2026 and draft FFY2027 plan summaries and the application instructions do not list them either. Section III.E (page 17) lists "Cash Prizes and Lottery Winnings" as income; the model counts gambling_winnings.
Workers' compensation and temporary disability Section 1.9 (page 6) leaves "Insurance payments made directly to the insured" unchecked Section III.E counts "Temporary Disability Insurance (TDI), Temporary Caregivers Insurance (TCI)" (page 15) and "Workers' Compensation" (page 16); the model counts disability_benefits and workers_compensation.
Subsidized renters Section 2.3 (page 8) answers "No" to differing eligibility policies for "Renters Living in subsidized housing?" Section II.B (page 6): "Subsidized renters with no utility burden are ineligible for this program." The model requires a subsidized heat-in-rent household to have a separate electric bill.

Plan section 1.9 (page 6) counts Social Security "Including MediCare deduction". DHS's draft FFY2027 plan summary (page 3) glosses this as "meaning the Medicare amount deducted is not counted", which agrees with manual section III.H (page 21). The model counts Social Security gross and deducts medicare_part_b_premium.

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

60 YAML cases in 7 files cover:

  • all 15 FY2026 primary amounts with the enhancement on gas and electricity, the shared delivered-fuel amount, row F for either subsidy flag and for an obligation flag with no bill, the enhancement following the primary fuel despite other utility bills, and $0 for unpriced fuels, no heat, zero qualified size and out of state;
  • band edges at the exact dollar and the next cent for one person, the size-two 125% anomaly and 2025 bands on the 2024 guideline;
  • all 14 FY2026 and all 14 FY2027 income limits and the inclusive ceiling;
  • each energy-burden route, including subsidized heat in rent with and without an electric bill and a subsidized heat-in-rent household that reports a heating obligation but no electric bill (ineligible), and a household with no qualified member and no income, which only the size check makes ineligible;
  • heat-in-rent grants: $400 direct for oil, gas and an unpriced fuel, $430 with a separate electric bill, $400 for subsidized housing or public housing with an electric bill, and electric heat in unsubsidized rent at $0 without an electric bill and $430 with one;
  • the age 17 and 18 boundary and the student exclusion at 23 and 24 and for a student living alone, the $500 interest exclusion, the exclusion of a minor's and a full-time student's interest ($12,000), 50% rental income, SSI and TANF counted once, TANF with and without take-up, child SSI excluded, nonqualified parent income, estate income, military retirement pay and retirement distributions, lottery winnings, reported unemployment compensation read through total_unemployment_compensation ($10,010), every listed unearned source at once ($17,300), the Part B deduction, support and unsubsidized child care deductions, the zero floor, and business, estate and rental losses;
  • final awards set by retirement account distributions and by the Part B deduction;
  • the backfilled 2025 estimates ($861 for oil and $430 for heat in rent with an electric bill), which check the backfill only, since the FY2025 plan gives a $64 minimum and $1,148 maximum benefit.

Every eligibility and payment case specifies heating_type; the income, limit, band and household-size cases omit it because those variables do not read it. CI validates the cases.

  • 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#1537 queued

🤖 Generated with Claude Code

hua7450 and others added 5 commits October 3, 2026 19:49
- Start regular heating payments in FY2026 with a dated in_effect switch:
  no FY2025 benefit matrix is published, so 2025 and earlier pay $0.
- Use the eligibility primary-bill test for subsidized row F.
- Count military retirement pay, retirement distributions and gambling
  winnings; floor each unearned source at zero.
- Count TANF through the take-up-gated tanf variable instead of ri_works.
- Deduct the Medicare Part B premium per manual III.H (p21); rename the
  deduction list to deduction_sources.
- Put RI on the LIHEAP coverage line and shorten its note.
- Add tests for each change.

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 (09fddd6).
⚠️ Report is 495 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9972   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         7    +3     
  Lines           76       140   +64     
  Branches         2         3    +1     
=========================================
+ Hits            76       140   +64     
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 6 commits October 7, 2026 22:56
Follow the FY2026/FY2027 application instructions over the 2020 manual's household-head exception, drop the unused is_household_head test inputs, and note the plan-versus-manual conflict for workers' compensation and TDI/TCI.

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.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Heat-in-rent households receive the FY2026 matrix rows G-I: a $400 direct
grant, or an $80 secondary-electric grant ($50 when subsidized) when a
separate electric bill is reported, with the $350 utility enhancement on
the secondary-electric grant. Subsidized heat-in-rent tenants without a
utility burden are ineligible. The research-date payment gate is removed,
so earlier years backfill the FY2026 schedule as unverified estimates.
Utility provider and grant receipt stay an assumption; no new input.

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>
@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 Rhode Island LIHEAP regular heating assistance

PR #9972: Add Rhode Island LIHEAP regular heating assistance (author: hua7450, head c8b6cafa25)

Scope: Rhode Island's LIHEAP regular (primary) heating grant, run by DHS through seven Community Action Agencies, for FY2026. The PR covers:

  • household size, which counts citizens and qualified noncitizens, and countable income, which counts members 18 and over except full-time students aged 18-23, with the manual's interest, rental, support, child-care and Medicare rules;
  • the income limit at 60% of state median income, through the shared liheap_smi_limit helper;
  • five payment bands at 75%, 100%, 125% and 150% of the prior year's poverty guideline;
  • the FY2026 Grant Amounts matrix: rows A-E for Deliverables, Natural Gas and Electric, row F (subsidized housing with a primary heating bill) and heat-in-rent rows G-I;
  • the $350 LIHEAP Enhancement credited with a gas or electric primary grant (R.I. Gen. Laws § 39-1-27.12).

Crisis, cooling, weatherization and the $20.01 SNAP nominal payment are out of scope. The PR changes 31 files: 15 parameters, 7 variables, 7 test files (55 cases), programs.yaml and a changelog fragment. Every parameter has a single 2025-10-01 value, the tests use periods 2026, 2025 and 2027, and the registry lists verified_years: "2026".

Overall: the FY2026 policy values are right.

  • All 15 primary cells, the 3 row F cells, rows G-I ($400 / $80 / $50) and the $350 enhancement match the matrix and the PUC record.
  • All 28 published FY2026 and FY2027 income limits reproduce, and 41 of the 42 printed 75%, 125% and 150% band tops do. The 42nd is the matrix's size-2 "125%" cell, which repeats the 150% amount; the PR documents that it follows the labeled rate.
  • The income rules follow the manual and the current application instructions, and losses are floored per source.
  • Social Security is counted net of the Part B premium. That matches DHS's own reading of plan item 1.9: its draft FY2027 plan summary glosses "Including Medicare deduction" as "meaning the Medicare amount deducted is not counted".
  • The backfilled FY2024 and FY2025 limits reproduce. Earlier payments do not, which the PR documents (G1).

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

  • S1: a merge blocker from main's Integrate modeled state unemployment insurance into income flows #9558. The unearned list reads the raw unemployment_compensation input, so main's new code-health guard fails on the merged tree. Rhode Island has no modeled unemployment insurance yet, so no household value changes today.
  • S2: matrix row G prints no Electric amount, but the PR pays $400 to unsubsidized electric-heat households with heat in rent and no electric bill. The code and PR body do not say why, and no test covers it.
  • S3: no test would fail if the interest exclusion for minors and students or the eligibility size gate broke, and 8 of the 18 unearned sources are never nonzero in any test.
  • S4: six parameter descriptions fall outside the house template.
  • S5: one manual anchor opens the wrong page, Appendix H is linked without its page and from two hosts, and multi-page titles lack page lists.

All 55 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. The values each proposed fix would produce are hand computations and are labelled as such. The untested-logic claims in S2 and S3 were confirmed by mutating the code and rerunning the PR's tests.

Path prefixes used below:

  • P/ = policyengine_us/parameters/gov/states/ri/dhs/liheap/
  • V/ = policyengine_us/variables/gov/states/ri/dhs/liheap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/ri/dhs/liheap/
  • M = DHS LIHEAP Administration and Procedures Manual, cover dated "PUBLISHED: JUNE 11, 2019" (PDF page = printed page)

Line numbers refer to head c8b6cafa25.

Source Documents

# Document Link Use
1 FY2026 Rhode Island LIHEAP State Plan (49 pp, report period 10/01/2025-09/30/2026, "Submission Accepted by CO") RI_Plan_2026.pdf 1.1 dates (p4); 1.4 No, 1.7 $20.01, 1.8 Gross Income, 1.9 (p5-7); 2.1 60% SMI, 2.2-2.3 (p8); 2.5, 2.6 $50 / $861 (p9). The text layer lacks the checkbox states, so the rendered pages were read
2 FY2026 Grant Amounts and Income Eligibility (1 p) RI_BenefitMatrix_2026.pdf Rows A-I; sizes 1-14 for 75/100/125/150% FPG and 60% SMI
3 DHS FFY2027 LIHEAP Income Eligibility (1 p, "For mandatory use as of October 1, 2026") DHS copy All 14 FY2027 limits. The PR cites an EBCAP CDN copy
4 M, filed in PUC Docket 4290 (28 pp) M II.B (p5-6); III (p12); III.E (p14-17); III.G (p18-20); III.H (p20-21)
5 Appendix H, Application Instructions: May 2025 (FY2026) and July 2026 (FY2027) May 2025, July 2026 Gross income, $500 interest, students 18-23 (p2); the two editions match on these rules
6 Appendix M (Rental Income Reported Form) and Appendix B (Landlord Information Form), May 2025 App. M, App. B 50% of rental income (M p1); tenant heat "Oil Kerosene Propane Wood/Pellets / Gas Electricity Other" (B p1)
7 DHS Summary of the FFY2026 State Plan (10 pp) media/9371 p1 income list: "Self-employment income (60%)", "Social Security Administration (SSA) benefits (including the Medicare deduction)"
8 DHS draft Summary of the FFY2027 State Plan (11 pp) media/11711, p. 3 "(Including Medicare deduction)*" / "*meaning the Medicare amount deducted is not counted" (file p3); FY2027 limits (p4); no benefit amounts
9 PUC Docket 25-38-GE: DHS answer to DIV 1-1 (Oct 9, 2025); DHS answers to PUC set 1 (Nov 2025); Order 25579 DIV 1-1, PUC 1-5, Order 25579 $350 "issued to households being issued a LIHEAP Primary Grant" (DIV 1-1 p1); FFY2025 $64-$1,148 and FFY2026 $50-$861 (DIV 1-5 p2); credited after the utility receives the federal grant (PUC 1-5 p2); "$350 per recipient" (Order p3)
10 R.I. Gen. Laws § 39-1-27.12 statute (e) credit to "customers' accounts that are receiving federal LIHEAP assistance payments"; (f) excludes Block Island and Pascoag
11 PUC Docket 26-34-GE, DHS filing of Oct 2, 2026 FFY2027 filing, p. 2 "Accounts receiving a 2027 Primary benefit will receive one additional credit"; no amount yet (G5)
12 FY2023 and FY2024 Grant Amounts 2023, 2024 Rows G-I printed only in the Other column; row F below row E (S2, G1, G2)
13 FY2025: DHS press release (Sept 30, 2024) and FY2025 plan summary press release, media/7571 "grants ranging from $64 to $1,148"; FY2025 limits ($39,101 for one person)

Critical (Must Fix)

None.

Should Address

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

  • Where: P/income/sources/unearned.yaml:12 (- 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 ks/dcf/liheap/income/sources/unearned.yaml:4 and 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/ri/dhs/liheap/income/sources/unearned.yaml:12; the file's other three tests pass. The PR's 55 cases still pass on that tree.
  • Source: M III.E, p. 15 counts "Unemployment Benefits" 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, so for Rhode Island 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 Rhode Island 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).
  • Fix: replace the entry with total_unemployment_compensation, add a case with reported unemployment compensation (see S3), and update rulespec-us#1537's input list, which names unemployment_compensation.

S2. Row G prints no Electric amount, but the PR pays $400 to unsubsidized electric-heat households with heat in rent and no electric bill

  • Where:
    • V/payment/ri_liheap_base_payment.py:72-77 pays hir.direct ($400) whenever heat is in rent, no electric bill is reported and the household is unsubsidized, whatever the fuel.
    • V/eligibility/ri_liheap_eligible.py:29-31 makes the same household eligible.
  • Source: the FY2026 Grant Amounts, row G "Heat in Rent Direct Pay to Household", prints "$ 400" under Deliverables, "$400" under Natural Gas and "$400" under Other, and leaves the Electric cell blank. Rows H ($80) and I ($50) print only in the Other column.
  • Why the blank looks deliberate: the FY2023 and FY2024 matrices printed a single "HIR (Direct payment to household)" amount, $400, in the Other column, with no split by fuel. FY2026 added $400 under Deliverables and Natural Gas and left Electric empty.
  • Reproduced at head: a one-person household with $10,000 of wages, ELECTRICITY heat included in unsubsidized rent and no electric bill is eligible and gets $400. The printed matrix has no amount for it. With an electric bill it gets row H, $80 + $350 = $430.
  • Documentation and tests:
    • The PR body says "Heat-in-rent households receive rows G–I for any reported fuel" and does not mention the blank. The author's own rulespec-us#1537 does (interpretation 3: "Row G prints no Electric cell, yet electric heat in unsubsidized rent with no electric bill gets $400 (untested)").
    • The only electric-heat heat-in-rent cases are subsidized with an electric bill (row I): T/ri_liheap.yaml Case 4 unit 3 and Case 10 unit 6. Paying $0 here instead passes all 55 cases.
  • Why should, not critical: the matrix leaves the cell blank rather than printing a conflicting amount, so this is an unstated reading of the source in the claimed year rather than a confirmed mismatch.
  • Fix:
    • Either pay $0 for row G when the fuel is ELECTRICITY, matching the printed matrix (and decide whether such households stay eligible; an eligible-but-$0 flag repeats Add New Jersey LIHEAP regular heating assistance #9745 G1), or keep $400 and say why in the variable, P/payment/heat_in_rent.yaml and the PR body.
    • Add the case either way: unsubsidized, ELECTRICITY, heat in rent, no electric bill, expecting ri_liheap: 0 (or 400). Add the unsubsidized electric-heat case with an electric bill, expecting 430 (row H).

S3. Three 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 55 cases.

  1. Interest of excluded members. V/income/ri_liheap_income.py:54-56 multiplies interest by counted_person, so a minor's or an 18-23 student's interest is excluded (M III.G, p. 20: "Child Income (under 18)"; Appendix H, p. 2: "Income will not be considered in eligibility determination for students ages 18-23"). The interest cases (T/income/ri_liheap_income.yaml Cases 8 and 9) use adults aged 39 and 40, so dropping * counted_person passes. Pin it: a parent aged 45 with $12,000 of wages and a 17-year-old with $800 of interest. Reproduced at head: 12,000. With the mask removed, the same case gives 12,300 (reproduced under the mutation).
  2. Eight unearned sources. unemployment_compensation (which S1 replaces), strike_benefits, pension_income, survivor_benefits, railroad_benefits, workers_compensation, disability_benefits and veterans_benefits are never nonzero in any test, so deleting all eight passes. Two of them, workers_compensation and disability_benefits, are choices the PR's conflict table defends against plan 1.9; Add OR income subtraction of taxable social security benefits #1537 interpretation 10 notes "No case tests either source". One case with every source nonzero would catch a dropped entry (Add New Jersey LIHEAP regular heating assistance #9745 G7).
  3. The size gate in eligibility. Without (size > 0) at V/eligibility/ri_liheap_eligible.py:34, a household with no qualified member and no income passes the income test (limit 0, income 0) and is eligible. The payment stays $0 because the base payment also gates on size, so only the flag changes. Every size-0 case that asserts eligibility or the award has income above $0 (T/eligibility/ri_liheap_eligible.yaml Case 2 unit 3, T/ri_liheap.yaml Case 3 unit 5). Add ri_liheap_eligible: false for a size-0 household with no income; reproduced at head: false.

The row G Electric cell (S2) is also unpinned. Consistency: #9967 S3 and #9745 S5 rated untested branches SHOULD.

S4. Six parameter descriptions fall outside the house template

File:line Current Suggested
P/income/sources/earned.yaml:1 "counts these earned income sources" "Rhode Island uses these sources as earned income under the Low Income Home Energy Assistance Program."
P/income/sources/unearned.yaml:1 "counts these unearned income sources" "Rhode Island uses these sources as unearned income under the ..."
P/income/minimum_income_age.yaml:1 "counts individual income beginning at this age" "Rhode Island excludes the income of members below this age under the ..."
P/income/rental_income_rate.yaml:1 "counts this share of rental receipts" "Rhode Island uses this share of rental income as countable income under the ..."
P/income/deduction_sources.yaml:1 "deducts these reported expenses from income" "Rhode Island uses these expenses as income deductions under the ..."
P/payment/utility_enhancement.yaml:1 "adds this enhancement to the primary federal Low Income Home Energy Assistance Program grant credited to a qualifying gas or electric distribution-company account" (verb, and a clause after the program name) "Rhode Island provides this enhancement with a primary heating grant credited to a gas or electric distribution-company account under the Low Income Home Energy Assistance Program."

The other nine fit: smi_rate (limits), interest_exclusion and student_age_limit (excludes), the three amount files and heat_in_rent (provides), fpg_rates (sets) and fpg_year_lag (uses). Consistency: #9967 S4 and #9745 S6.

S5. One anchor opens the wrong page, Appendix H is linked without its page and from two hosts, and multi-page titles lack page lists

File:line Problem Fix
P/income/rental_income_rate.yaml:13 (and the comment at line 2) M #page=17 opens the documentation list. The rule is at the foot of p. 16, "Fifty percent (50%) of rental income shall be included in the total income for eligibility determination.", and on p. 20, "50 percent of Gross Rental Income". The comment says "pages 17 and 20". Appendix M p1 does corroborate the 50% #page=16, a title ending #page 16,20, and correct the comment
P/income/interest_exclusion.yaml:13, P/income/sources/earned.yaml:23, P/income/sources/unearned.yaml:53, V/income/ri_liheap_income.py:18 Appendix H (media/9671) has no anchor, so it opens p1 (identity and residence documents). The interest rule and the income list are on p2 Add #page=2
V/income/ri_liheap_income.py:18,20; P/income/student_age_limit.yaml:15 The same May 2025 instructions are cited from DHS (media/9671, footed "Appendix H") and from westbaycap.org (footed "Appendix C", although the parameter title says Appendix H); the variable lists both One entry, on the DHS host, #page=2
P/income/sources/earned.yaml:18-21, P/income/sources/unearned.yaml:48-51 "Sections III.E-G" opens p14, but the cited sources and exclusions run to p20; "Sections 1.8 and 1.9" opens p5, but 1.9 runs to p7 Titles ending #page 14-20 and #page 5-7

Consistency: #9745 S7 rated wrong anchors SHOULD. The author's #1537 interpretation 20 already records the p17 error.

Suggestions

G1. Backfilled years pay FY2026 amounts that the earlier sources contradict

  • Every single-dated parameter carries back to every earlier period. Earlier years differ:
    • FY2025 grants ranged "$64 to $1,148" (the DHS press release of Sept 30, 2024; DIV 1-5 p2).
    • The FY2023 and FY2024 matrices are published and differ in every row A-F cell and in rows H and I ($125 / $75).
    • The enhancement was $515 for 2024 and $450 for 2023 (PUC Order 24925, p. 2: "raised the LIHEAP Enhancement Grant to $515.00 for 2024, where in 2023 it was $450.00").
  • Period 2025 pays $861 to T/ri_liheap.yaml Case 5's household; FY2025's top grant was $1,148. The limits do carry back correctly: FY2024 ($35,674 for one person) and FY2025 ($39,101) reproduce.
  • The branch gated the payment with payment/in_effect.yaml (false before 2025-10-01) until aa4ccc33b9 removed it. Merged NJ gates with eligibility/in_effect.yaml.
  • The PR documents the backfill and labels the 2025 cases unverified, so this is a suggestion (checklist item 3). Either restore the gate, or encode the published FY2023-FY2024 matrices and enhancements. In both cases, drop or reword the 2025 award assertions (T/ri_liheap.yaml Cases 5 and 11, T/payment/ri_liheap_base_payment.yaml Case 9), which pin values the FY2025 sources contradict.

G2. Give row F its own amounts

  • V/payment/ri_liheap_base_payment.py:42 maps row F to band len(p.fpg_rates) + 1, so it reuses row E's cells. That is right for FY2026, where row F equals row E ($657 / $159 / $268).
  • In FY2023 and FY2024, row F ("Sec. 8 w/ Primary Heating Bill", $696 / $205 / $310) was below row E ($981 / $355 / $533 and $932 / $256 / $426). A future matrix like those could not be encoded without a code change, and the comment's "lowest payment" holds only by coincidence.
  • Add a row-F amount per fuel (for example a sixth breakdown key), so the index no longer depends on the length of the band-rate list.

G3. Cite DHS's current summaries for three income rules

  • Part B deduction (correct as is). The draft FY2027 summary (file p. 3) reads "Social Security Administration (SSA) benefits (Including Medicare deduction)*" with "*meaning the Medicare amount deducted is not counted". So plan 1.9 and M III.H agree. Cite it in P/income/deduction_sources.yaml and drop the "conflict" row from the PR body.
  • Lottery winnings. Plan 1.9 leaves "winnings from lotteries" unchecked. The FY2026 summary, the draft FY2027 summary and both editions of Appendix H omit them; only M p17 lists "Cash Prizes and Lottery Winnings". The choice is documented, but the weight of current DHS documents points the other way. Consider dropping gambling_winnings, or say in the comment that the current summaries omit it.
  • Self-employment. The FY2026 summary (p1) still lists "Self-employment income (60%)", so M's 40% deduction is current. The deferral to net business income is reasonable; cite the summary in P/income/sources/earned.yaml.

G4. Sources and naming

  • M's cover reads "PUBLISHED: JUNE 11, 2019". The PR body and titles call it the 2020 manual.
  • The appendix footers ("RI LIHEAP Policy Manual Appendix H, May 2025"; July 2026) and the footer of the FFY2026 notice to applicants ("RI LIHEAP Policy Manual July 2025") show that later editions exist. None was found online. Say so in the PR body, as Add OR income subtraction of taxable social security benefits #1537 interpretation 18 does.
  • V/eligibility/ri_liheap_income_limit.py:16 cites a CDN copy of the FY2027 sheet. DHS hosts it at https://dhs.ri.gov/media/12266/download?language=en.
  • The PR describes the FY2027 instructions but links only the May 2025 edition. The July 2026 edition is media/12306.

G5. FY2027 enhancement

DHS's Oct 2, 2026 filing (Docket 26-34-GE) says "Accounts receiving a 2027 Primary benefit will receive one additional credit", with the amount still to be set. The $350 carry-forward is documented as unverified, which is fine. Record the filing in P/payment/utility_enhancement.yaml and the registry notes, and update the value when DHS answers the docket's data requests. Rhode Island pays no IIJA supplement; the enhancement is ratepayer-funded under § 39-1-27.12, so checklist item 12 does not apply.

G6. PR body and issue housekeeping

G7. Test hygiene

  • About twenty comment lines lost the spaces around their numbers. Examples:
    • T/income/ri_liheap_income.yaml:3 ("approximation:12000+2400+600+1200+1200=17400; no additional40% deduction"), line 394 ("arepositive"), line 456 ("underp20");
    • T/eligibility/ri_liheap_income_limit.yaml:3 ("annual60%SMI") and line 31 ("all14");
    • T/payment/ri_liheap_base_payment.yaml:6, 23, 58, 86 ("bills10", "bandB deliverables805", "ExplicitNONE", "Oil861 remains861");
    • T/ri_liheap.yaml:228 ("October2025 DIV1-1", "direct400").
  • Comments such as T/income/ri_liheap_income.yaml:3 and :34 call conventions "approved", which refers to internal decisions.
  • The income, limit, band and household-size tests set heating_type and fuel bills that those variables never read.
  • Five files open with "no final award is asserted", but T/income/ri_liheap_income.yaml Case 15 and the base-payment file assert payment amounts.
  • SOLAR and OTHER households with a bill are eligible but get $0 (the matrix's Other column is blank in rows A-F). That is consistent with the matrix; as in Add New Jersey LIHEAP regular heating assistance #9745 G1 and Add Alabama LIHEAP regular heating assistance #9967 G2, either make the flag match or note it.

Verified correct

  • Matrix (FY2026):
    • Rows A-E: Deliverables 861 / 805 / 752 / 704 / 657, Natural Gas 232 / 211 / 192 / 175 / 159, Electric 393 / 357 / 324 / 295 / 268.
    • Row F 657 / 159 / 268, at any income. Rows G $400, H $80, I $50.
    • Oil, kerosene, propane and wood pay from Deliverables (Appendix B: "Oil Kerosene Propane Wood/Pellets").
    • The plan 2.6 range of $50-$861 matches, with the state-funded enhancement outside it.
  • Enhancement: $350 per primary grant (DIV 1-1 p1; Order 25579 p3). It is added to gas and electric grants and to heat-in-rent grants paid to an electric account, never to Deliverables or the direct $400. That follows § 39-1-27.12(e) and PUC 1-5 ("credited to a customer's account by the utility once the federal grant to that household has been received").
  • Limits:
    • All 14 FY2026 limits (42,252 ... 126,756) and all 14 FY2027 limits (43,410 ... 130,230) reproduce from SMI $135,424 and $139,136: floor(0.6 x SMI) = 81,254 and 83,481, times the 45 CFR 96.85 shares, floored.
    • The limit is inclusive ("equal to or less than"; Case 3's 42,252 / 42,252.01 pair).
  • Bands:
    • Tops are the 2025 guideline x 0.75 / 1 / 1.25 / 1.5, rounded half up and upper-inclusive: 11,738 / 15,650 / 19,563 / 23,475 for one person. 41 of the 42 printed 75%, 125% and 150% tops for sizes 1-14 reproduce.
    • Following the labeled 125% rate for size 2 (26,438, not the printed 31,725) is a documented, reasonable reading of a typo.
    • The FPG lag gives the 2025 guideline for period 2026.
  • Timing: heating assistance runs 10/01/2025-04/15/2026 (plan 1.1, p4), and period 2026 reads January 1, 2026.
  • Income (plan 1.8 gross; M III.E-H):
    • Members 18 and over count; full-time students 18-23 are excluded, head or not, following the current Appendix H over M p20.
    • Each source is floored at zero. Rental and farm rent count at 50%. Interest is counted above $500 once per household, and dividends in full.
    • TANF is read through the take-up-gated tanf. A child's SSI is excluded. SNAP is excluded.
    • Child support and alimony paid are deducted, and child care only when unsubsidized. medicare_part_b_premium is deducted, and it is already net of Medicare Savings Program coverage.
  • Household: size counts citizens and 8 U.S.C. 1641 qualified statuses (DACA excluded), matching M p12-13. Nonqualified members' income counts (M p12).
  • Eligibility:
    • Rhode Island residence. No categorical eligibility (plan 1.4 No) and no asset test (plan 2.3 No).
    • A heating obligation, or heat in unsubsidized rent, qualifies. Subsidized heat in rent needs an electric bill (M p6). NONE is ineligible.
  • Code patterns:
    • No hard-coded values. defined_for = StateCode.RI on six variables, and ri_liheap is gated by ri_liheap_eligible.
    • Vectorized formulas. All 15 parameters are read. The shared fpg() and liheap_smi_limit() helpers are reused.
  • Tests:
    • 55 of 55 pass locally at head (policyengine-core 3.32.29) and on the merged tree. Periods are plain.
    • Hand-checked: T/ri_liheap.yaml Cases 1-4 and 9-10; income Cases 8, 10, 11, 12 and 15; all 15 base-payment cells; all 28 limits; the 9 one-person and 5 two-person band edges; the 2025 band tops (11,295 / 18,825).
  • Changelog: changelog.d/ri-liheap.added.md is top level and typed added.

Checklist results (LIHEAP wave 2a)

  1. State plan and manual first: pass, with S2. I read the accepted FY2026 plan (rendered checkboxes), the FY2026 matrix, the FY2027 income sheet, M, the May 2025 and July 2026 appendices, DHS's FY2026 and draft FY2027 summaries, the FY2023-FY2025 sources and the PUC enhancement record, and verified every encoded cell, limit and band. The one blank cell (row G Electric) is paid without a stated reason (S2).
  2. Income definition: pass at head. Gross income with M's deductions; Social Security net of Part B, matching DHS's own gloss; losses floored per source; annual income. After rebase the list must read total_unemployment_compensation (S1). Lottery and self-employment notes are in G3.
  3. Backdating: limits reproduce FY2024-FY2025. Payments and the enhancement do not, which the PR documents (G1). FY2027 limits are used; no FY2027 matrix is published.
  4. Household and arrangement rules: pass on subsidized and public housing, heat in rent (rows G-I), renters, no categorical eligibility and crisis-only priority. Row G Electric is S2; the SNAP nominal payment is documented as out of scope.
  5. Tests: 55 cases, more than 8 hand-checked. Limits for sizes 1-14 in both years, band edges, the limit edge and plain periods are covered. Gaps are in S2-S3.
  6. Parameter descriptions: six fall outside the template (S4).
  7. References: one wrong anchor, missing Appendix H anchors, a duplicate host and missing page lists (S5).
  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. defined_for gating is on every variable. No take-up beyond TANF's.
  9. Axiom: valid queued line. rulespec-us#1537 is open, labelled pe-parity, dispatch-ready and current to c8b6cafa25; it needs updates for S1-S2 (see below).
  10. Branch and CI: all checks are green at head. 11 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 RI UI exists, so the effect today is the guard failure only.
  12. IIJA and FY2027: no IIJA supplement. The $350 is ratepayer-funded, continues into FY2027 with the amount pending (G5), and the FY2027 limits are encoded.
  13. Mutation check: S3, plus the row G Electric cell in S2.

CI status

28 of 28 checks pass at c8b6cafa25 (gh pr checks 9972, 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#1537 queued: valid format, and the issue meets the bar.

  • rulespec-us#1537 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 module paths with corpus status, verbatim manual, plan, matrix and instruction text, required outputs for all 7 variables, and companion tests derived from the matrix, manual, instructions, guidelines and PUC record ("None is taken from policyengine-us output").
  • It describes c8b6cafa25 correctly. It already records the row G Electric gap (interpretation 3), the p17 anchor (interpretation 20), the 2019 manual edition (interpretation 18) and the backfill (interpretation 12).
  • Updates needed when the fixes land:
    • the input list and a UI case (S1);
    • the row G Electric decision (S2);
    • the new branch cases (S3);
    • the draft FY2027 summary's Medicare gloss for interpretation 11 (G3);
    • the stale "open as a draft".

Next steps

  1. S1: rebase onto main, switch P/income/sources/unearned.yaml:12 to total_unemployment_compensation, and add a UI case.
  2. S2: decide the row G Electric cell ($0 or a documented $400) and add the two electric heat-in-rent cases.
  3. S3: add the minor-interest, all-sources and size-0 cases.
  4. S4-S5: align the six descriptions and fix the anchors and duplicate Appendix H entries.
  5. Optionally address G1-G7, then refresh the PR body and rulespec-us#1537 and re-request review.

0 critical and 5 should-address findings, plus 7 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 5 should items; details in the full report above. The FY2026 values check out: all 15 primary benefit cells, rows F–I, the $350 enhancement and all 28 FY2026/FY2027 income limits. The Part B treatment is correct, all 55 tests pass, and CI is green. (1) Merge blocker from main's #9558: unearned.yaml:12 lists the raw unemployment_compensation, so the guard fails on the merged tree. (2) Matrix row G prints no Electric amount, but the PR pays $400 to unsubsidized electric-heat households with heat in rent and no electric bill. This is undocumented and untested. (3) Logic that passes every test even when broken on purpose: the interest exclusion for minors and students, 8 of the 18 unearned sources, and the size check in eligibility. (4) Six parameter descriptions are off the house template. (5) Reference anchors: rental_income_rate cites page 17 (the rule is on pages 16 and 20); the Appendix H links lack #page=2 and come from two hosts.

hua7450 and others added 2 commits October 15, 2026 15:13
- S1: The unearned list reads the raw unemployment_compensation, so main's #9558 guard fails
- S2: Row G prints no Electric amount, but the PR pays $400 for electric heat in unsubsidized rent with no electric
- S3: Three pieces of logic have no test that fails when they break: excluded members' interest, 8 unearned sources
- S4: Six parameter descriptions fall outside the house template
- S5: Wrong rental anchor, Appendix H without page 2 and on two hosts, multi-page titles without page lists

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 09fddd6.

The branch also merges upstream/main (PRs 9558 and 10046). Rhode Island deducts no health insurance premium other than Medicare Part B, so 10046 changes nothing here. The 60% SMI limit stays above the federal 110% poverty floor (42 U.S.C. 8624(b)(2)(B)) for sizes 1–20 in FY2025–FY2027; the smallest margin is $1,833, at size 20 in FY2025. So this PR does not add the shared gov.hhs.liheap.fpg_floor parameter.

  • S1: unearned.yaml now lists total_unemployment_compensation. Income Case 25 sends $10,010 of reported UI and expects $10,010 for both total_unemployment_compensation and ri_liheap_income. The $10,010 is the R.I. DLT formula for a worker earning $40,000 a year: $385 a week for 26 weeks.
  • S2: I followed the matrix as printed. Row G pays $0 for electric heat, so electric heat in unsubsidized rent with no electric bill stays eligible but gets $0, with no enhancement. ri_liheap_base_payment, heat_in_rent.yaml, ri_liheap_eligible and the body now document this. ri_liheap.yaml Case 12 covers both of your cases with minimum-wage income ($33,280): $0 without an electric bill and $430 (row H, $80 + $350) with one.
  • S3: All three are added. Income Case 27 has a parent with $12,000 of wages, a 17-year-old with $800 of interest and a 20-year-old full-time student with $600; it expects $12,000, and dropping the mask would give $12,900. Income Case 26 sets all 18 unearned sources to distinct amounts and expects $17,300. Eligibility Case 3 is an undocumented adult with no income and a gas bill, with size 0, limit 0 and ri_liheap_eligible: false.
  • S4: The six descriptions now use your suggested wording.
  • S5: rental_income_rate now opens page 16, its title ends #page 16,20 and the comment is fixed. Every Appendix H link now points to the DHS host at #page=2, and the westbaycap.org copy is gone. The manual and plan titles end #page 14-20 and #page 5-7. Appendices M and B open at #page=1.
  • G1: History is out of scope for this PR: LIHEAP states use undated formulas with parameter backfilling, so I added no gate and no FY2023–FY2024 matrices. I took your rewording option instead. The comments on ri_liheap.yaml Cases 5 and 11 and base-payment Case 9 now say they check only the backfill; Cases 5 and 9 cite FY2025's published $64–$1,148 range.
  • G2: Not split. FY2026 rows E and F print identical cells, so a separate row-F key would duplicate parameters, and the earlier matrices fall under history. The comment now says row F reads row E's band because the FY2026 cells match, and that a matrix with different row F cells would need its own amounts. Base-payment Case 3 is renamed.
  • G3: For Part B, deduction_sources.yaml now cites plan 1.9 and the draft FFY2027 summary's gloss, and the body no longer lists it as a conflict. For lottery winnings, gambling_winnings stays because where the plan and manual conflict, we follow the manual. The comment and the conflict row now note that the FY2026 and draft FFY2027 summaries and the application instructions omit lottery winnings. For self-employment, earned.yaml cites the FY2026 summary's "Self-employment income (60%)".
  • G4: The code now calls the manual the 2019 edition, and the body calls it the manual published June 11, 2019. The body notes that later editions exist (appendices dated May 2025 and July 2026, and an applicant notice citing a July 2025 manual) but that none was found online. ri_liheap_income_limit now cites the DHS copy of the FY2027 sheet (media/12266), and the July 2026 instructions (media/12306, page 2) are cited next to the May 2025 edition.
  • G5: utility_enhancement.yaml records the Docket 26-34-GE filing and labels the FY2027 $350 an unverified estimate, and the body's years section says the same. Registry notes stay at one or two sentences, so the filing details are in the parameter and the body; the programs.yaml note is now two sentences and says FY2027 payments reuse FY2026 amounts as unverified estimates.
  • G6: The plan 2.3 / manual II.B conflict is now a body row and a comment in ri_liheap_eligible. The code and body now say "no matrix amount", and the make format box is checked. The stale "open as a draft" wording is fixed in the rulespec-us refresh below.
  • G7:
    • The squashed comments are rewritten and the "approved" wording is gone.
    • heating_type and gas_expense are dropped from the income, limit, band and household-size cases. Income Case 15 keeps them because it asserts a payment.
    • The "no final award is asserted" headers are deleted.
    • SOLAR, OTHER, COAL and electric heat in unsubsidized rent with no electric bill stay eligible with a $0 award because the matrix prints no amount for them, the same treatment the other LIHEAP states give unpriced fuels. The eligibility variable and the body say so.
  • LIHEAP wave 2a: encode Rhode Island LIHEAP regular heating assistance TheAxiomFoundation/rulespec-us#1537 is refreshed to this head.

@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 Rhode Island LIHEAP regular heating assistance

2 participants