Repository navigation
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9743 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 8 +4
Lines 76 126 +50
Branches 2 2
=========================================
+ Hits 76 126 +50
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…tic tests Floor the income band before the payment-table lookup so units outside Oregon index a valid key in mixed-state simulations, and add a two-state case. Place Oregon between IL and TX in programs.yaml. Give the integration cases plausible wages and heating bills with derivations from the PY2026 manual. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Write parameter date keys unquoted, wrap each variable's documentation string across lines, add digit separators to test values, name and comment every test case against the manual, and split the household-size sweeps so each size is asserted once: odd sizes in the income-limit test, even sizes in the benefit-matrix tests. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR Review: Oregon LIHEAP regular heating assistancePR #9743: Add Oregon LIHEAP regular heating assistance (author: hua7450, head Scope: Oregon LIHEAP, run by OHCS, regular (standard) heating payment only. Cooling, crisis, the Fuel Payment, equipment repair and OEAP are out of scope. The PR changes 32 files: 16 parameters, 8 variables (7 formulas and the new Overall: the FY2026 implementation is accurate. All 480 FY2026 matrix lookups match the PY2026 manual, and so do the 36 band tops, 12 income limits and 36 county assignments. The countable-income lists are self-contained, so there is no SNAP-list reuse and no #9672 exposure. Two problems are critical:
The six should-address items cover:
No regulatory or code finding was downgraded after re-verification. One proposed fix was corrected: rounding to cents on the float32 Path prefixes used below:
Line numbers refer to head Source Documents
The OHCS 41-2025 and 44-2025 filing attachments could not be retrieved, so the "October 9, 2025 rule filing" cited in the PR body is not verified directly. Nothing below depends on it. Critical (Must Fix)C1. Period 2025 carries the FY2026 matrix and income bands back over the published PY2025 matrix
C2. Kerosene and solar households are eligible but receive $0 by construction, though the manual is fuel blind and the PR's own test says these fuels are billed as heating oil and electricity
Should AddressS1. Period 2027 pairs FY2027 limits with the FY2026 matrix and bands, but the PY2027 manual is in force from 2026-10-01
S2.
|
| File:line | Anchor | Page that opens | Where the content is |
|---|---|---|---|
P/payment/regions/region_2.yaml:28 |
#page=78 |
Region 1 county list and matrix | p. 80 ("Baker, Crook, Deschutes, ... Wheeler Counties") |
V/eligibility/or_liheap_eligible.py:11 |
#page=11 |
SSN and identity fields | Energy burden p. 61 and p. 93; limit p. 77 |
P/payment/max_household_size.yaml:10 |
#page=78 |
Sizes 1-7 only | Size 12 is on p. 79 and p. 81 |
P/payment/roomer_rate.yaml:10 |
#page=61 |
Start of the Roomer/Boarder/Owner bullet | "50% of a regular payment" is on p. 62 |
These open a page that holds only part of the cited values:
P/payment/income_band.yaml:88andV/payment/or_liheap_income_band.py:11open p. 78, which prints band tops for sizes 1-7 only. The 15 tops for sizes 8-12 (for example 25,467 and 83,043) are only on p. 79 and p. 81.P/payment/amount/electricity.yaml:122andnatural_gas.yaml:122open p. 78, but the Region 2 values are on p. 80.V/payment/or_liheap_region.py:11opens p. 78, but the Region 2 list is on p. 80.
Fix: retarget the four wrong anchors, and add separate single-page entries for the partial ones: p. 79 for the bands; p. 80 for Region 2 amounts and counties.
Suggestions
G1. A missing county silently pays Region 2 rates, which contradicts the documentation and the PR body
V/payment/or_liheap_region.py:12-15says "Zero denotes an unknown or out-of-state county; a county is required". The PR body says an unknown county leaves the benefit at zero.- With no
countyinput,countyfalls back tofirst_county_in_state, which is BAKER_COUNTY_OR, so the region is 2. Head trace: electricity $515, natural gas $560; a Multnomah household gets $465 and $670. - Only an explicit
county: UNKNOWNgives $0. Even so, the Case 15 comment atT/or_liheap.yaml:345says "Without a county". - The fallback is repo-wide, and rulespec-us#1479 interpretation 4 documents it. Microsim stores county, so it is unaffected.
- Fix the docstring, the PR body and the test comment. Add a case that omits county and expects the Baker/Region 2 result.
G2. COAL, OTHER and UNSPECIFIED households get $0
- The matrix has no clear column for these fuels. Because of the manual's fuel-blind rule (p. 5), the state would still pay them.
- The PR body defers UNSPECIFIED to Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754, which is acceptable under the batch-2 guidance.
- Add a
# see #9754pointer atV/or_liheap.py:45-46. - Reword
T/or_liheap.yaml:286-288("heating_type is a required input"; it defaults to UNSPECIFIED) andV/or_liheap.py:16-17so the heat-in-rent UNSPECIFIED $0 reads as a coverage gap, not a legal result.
G3. Parameter start dates
- Every parameter starts on
2025-10-09, the OHCS 44-2025 correction filing. The manual took effect on 2025-10-01 (M26 p. 2). Annual periods are unaffected. - Consider
2025-10-01for the non-matrix parameters:smi_rate,earned_income_min_age,interest_threshold, the source lists, the regions,roomer_rateand the size limits. - If
2025-10-09is kept for the matrix and band files, cite the correction filing in their references.
G4. Page lists in reference titles and in variable comments
- 14 parameter titles embed page lists, for example
P/income/sources/unearned.yaml:27("PDF pages 37, 38, ... 52"),P/payment/amount/*.yaml("PDF pages 78, 79, 80, 81") andP/payment/regions/region_{1,2}.yaml:27. - Seven variables carry a
# PDF pages ...comment above a single-URLreference:V/or_liheap.py:11,V/eligibility/or_liheap_eligible.py:10,V/income/or_liheap_countable_income.py:11-12,V/income/or_liheap_countable_earned_income.py:11,V/payment/or_liheap_income_band.py:10,V/payment/or_liheap_region.py:10andV/or_liheap_dwelling_type.py:18. - Use section names in titles, with one title/href entry per operative page. In the variables, use a tuple of single-page hrefs, as merged KS does. For example,
or_liheap: pp. 61, 62, 67, 78, 80;or_liheap_region: pp. 78, 80.
G5. rulespec-us#1479 is stale
See the Axiom line section. Update the pin, the "open draft" wording and companion tests 5 and 7 once S5 lands. After C2, update interpretation 8 and test 8.
G6. Households of 13 or more are income-eligible but get $0
- The limit extends per member (M26 p. 77, "Each Additional Member"). Sizes 7-12 all print the size-6 amounts.
- Consider paying size-6 amounts with the size-12 band tops instead of $0 at
V/or_liheap.py:52-55. Otherwise, keep the documented gap. Few households are affected.
G7. Cite the operative rule for the subsidized heat-in-rent exclusion
- The hard exclusion at
V/eligibility/or_liheap_eligible.py:30is supported. p. 61 says "not typically eligible", but the p. 93 Energy Burden Table is categorical: "Applicant lives in Subsidized Housing and heat is included in rent" gives Energy Burden "No". OAR 813-200-0020(1)(b) also makes "a demonstrated energy burden" a baseline requirement. - Cite both. No YAML or variable currently cites an OAR or the state plan.
T/eligibility/or_liheap_eligible.yaml:37-39(household 6: subsidized, heat in rent, separate electric bill, ineligible) is one reading. The p. 93 row "Subsidized Housing and pays a vendor directly for utility costs" gives "Yes". Document the choice.
G8. PR-body hygiene
- "PR remains draft" is stale;
isDraftis false. - "Ceiling of 60% reproduces the 12 published limits" holds for FY2026 but not FY2027 (S2).
- "Remaining coverage" misstates the missing-county behavior (G1).
G9. The interest threshold is applied per person
V/income/or_liheap_countable_income.py:28-31applies the $200 test per person and counts all of the interest once it is exceeded.- M26 p. 50 ("Only to be counted if over $200.00 per year and is withdrawn") does not say per person or per household. The per-person reading is reasonable.
- Say so in the documentation, and pin it with a test: two members with $150 each count $0.
G10. Digit separators
P/payment/income_band.yaml:6-78 writes all 36 values without underscores (9597 ... 83043). Merged KS and NE use 9_597.
G11. Parameter descriptions
P/income/sources/earned.yaml:1("counts these existing earnings inputs, without further self-employment expense deductions under the ...") is implementation language with a misplaced comma. Prefer "Oregon counts these sources as earned income under the Low Income Home Energy Assistance Program." and move the expense note to a YAML comment.P/payment/amount/*.yaml:1end with ", by region, household size and income band" after the program name.- Verbs outside the template list appear in
interest_threshold(counts), the source lists,roomer_rate(pays),max_household_size(publishes) and the regions (assigns).
G12. or_liheap_dwelling_type is not a dwelling type
V/or_liheap_dwelling_type.py:4-17records the application arrangement: a standard household, or a roomer, boarder or owner applying separately.- On main,
ks_liheap_dwelling_typeandne_liheap_dwelling_typedescribe the physical structure. - Consider
or_liheap_application_arrangement, or a boolean such asor_liheap_separate_roomer_application.
G13. Test hygiene
T/income/or_liheap_countable_income.yaml:6is named "every listed unearned source counts", butssi,general_assistanceandestate_incomeare 0 and are never nonzero in any OR test. Give them values or rename the case.- Most cases set
snap: 0andimmigration_status: CITIZEN, which no OR variable reads. The eligibility documentation says there is no immigration test, so these inputs suggest dependencies that do not exist.
G14. Registry notes
programs.yaml:877reads "Regular heating income, county/fuel schedules and housing treatment. Some income, residence and discretionary-payment rules remain partial; earlier years are unverified estimates."- The sibling entries (IN, KS, KY, MS, NC, NE) use the form "FY2026 regular heating only, with ... . Crisis, cooling and weatherization assistance are out of scope."
- Align it, for example: "FY2026 regular heating only, with the two county regions, five fuel columns and the roomer half payment. Crisis, cooling, Fuel Payment, equipment and OEAP assistance are out of scope."
Verified correct
| Check | Result |
|---|---|
| FY2026 amounts (M26 pp. 78-81): 2 regions × 12 sizes × 4 bands × 5 fuels | 480 lookups (168 distinct parameter cells), 0 mismatches. Sizes 7-12 print the size-6 amounts, so the cap of 6 is right. Oil, propane and wood are identical across regions in FY2026 |
| FY2026 band tops | 36 distinct (72 lookups), 0 mismatches. Where the last printed top is $1 below the p. 77 limit (sizes 2, 4, 6 and 8-12), band 4 correctly extends to the limit (Case 11) |
Income limits, ceil(hhs_smi × 0.6) |
12 of 12 FY2026 (M26 p. 77) and 12 of 12 FY2025 (M25 PDF p. 57). FY2027: S2 |
| County lists (M26 pp. 78, 80) | 36 of 36. Each county appears once in the County enum, and together they are exactly Oregon's 36 counties |
| Scalars: 0.6 SMI, age 18, $200 interest, 0.5 roomer, size 12, payment cap 6 | 0 mismatches |
| Income sources | 22 listed, 0 wrong (2 omitted, S3). Social Security is gross, matching the plan's "Including MediCare deduction" (p. 6) and the M26 p. 58 worksheet. Private disability, entered net of the SSA offset, reproduces the pp. 55-56 examples. Child earnings are excluded and child unearned income counted |
| Test arithmetic | 261 of 261 or_liheap expectations recomputed from the head parameters. The integration, roomer ($465 × 0.5 = $232.50), mixed-state and countable-income cases were hand-checked |
| Code patterns | defined_for chain (or_liheap → or_liheap_eligible → StateCode.OR). Entities and periods correct. Matrix keys are floored or clipped before lookup, so mixed-state simulations do not raise (Case 18). No hard-coded policy values, no unused parameters, and no aggregate feeds |
| Not findings after verification | The roomer half payment of $232.50 is below the plan's $250 minimum, but p. 62 is explicit ("50% of a regular payment based on the Benefit Matrix"), and plan §2.6 says the minimum and maximum "must be shown in the payment matrix". The subsidized heat-in-rent hard exclusion is supported (G7). The Clearinghouse "2026" matrix carries PY2025 amounts; the PR correctly uses the manual |
| Microsimulation | The datasets carry no heating inputs, so the Oregon total is about $0 until #9754 lands. The PR body says so. or_liheap feeds no household aggregate, so net income and poverty are unaffected |
The sources also disagree with each other in one place, which is not a finding against the PR: p. 77's "Each Additional Member $2,115" does not match its own monthly figure ($184.58 × 12 = $2,214.96).
Checklist results
- SNAP list reuse: none. The lists are self-contained and use
rental_income, notsnap_rental_income, so there is no Stop rental losses from offsetting other income in SNAP #9672 double count. Social Security is gross per the plan, and child earnings are excluded. Gaps: S3 and S4. - Backfill and carry-forward: C1 (period 2025 uses FY2026 tables) and S1 (period 2027).
- Operative state rules: the energy-burden test and the subsidized heat-in-rent exclusion match OAR 813-200-0020(1)(b) and M26 p. 93. The sources have no immigration test. Institutions are not modeled, which is documented (G7).
- UNSPECIFIED and microsim defaults: the Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754 deferral is acceptable for UNSPECIFIED, COAL and OTHER (G2). Kerosene and solar are known fuels zeroed by construction (C2).
- Axiom line:
queuedwith a dispatch-readype-parityissue. The pin and test pointers are stale (G5). - References: every anchor is a single valid
#page=N. Four open the wrong page and four are partial (S6). Page text appears in 14 titles (G4). There are no OAR or plan references (G7). - programs.yaml: entry format and sort are fine. The coverage-line conflict with Fix LIHEAP program registry entries and add a registry integrity test #9722 is expected (Branch status).
- Rounding, boundaries and periods: FY2027
ceilerror (S2). Band edges are tested for sizes 1-2 only (S5). All periods are2026, with no2_026-style literals.
CI status
37/37 checks pass (gh pr checks 9743, 2026-10-06) on head 06b38abd60, which is unchanged since this review began.
Branch status
- Divergence: 11 commits ahead of
mainand 12 behind (merge baseb812bd46a0). GitHub reportsCONFLICTING. - Expected conflict in
programs.yaml(not a finding):- Main's Fix LIHEAP program registry entries and add a registry integrity test #9722 (
4cdb8dfb81) already removed the ORin_progressstub and dropped OR from the LIHEAP coverage line. This PR removes the same stub, so the conflict is on the coverage line only. - Resolve it as
coverage: DC, Riverside County, MA, IL, IN, KS, KY, MS, NC, NE, OR, TX(re-adding OR), and keep the PR's OR block after NE. - The
policyengine_us/tests/test_programs_registry.pythat Fix LIHEAP program registry entries and add a registry integrity test #9722 added should pass, becauseor_liheapandgov.states.or.ohcs.liheapresolve.
- Main's Fix LIHEAP program registry entries and add a registry integrity test #9722 (
- Other main commits: none of them touch Oregon LIHEAP,
hhs_smi,heating_expenseor the county logic.
Axiom line
axiom: TheAxiomFoundation/rulespec-us#1479 queued
- The form is valid and the issue is dispatch-ready. It is open and labelled
pe-parity(plusenhancement). It carries module paths, corpus citations, verbatim manual, OAR and plan text, required outputs, and companion tests sourced from manual values. - Stale points:
- It pins
dfb2b8230b, which predates5a40a829cc(the tidy commit that changed 28 Oregon LIHEAP files and halved the test sweeps) and twomainmerges. Head is06b38abd60. - It calls the PR "open draft".
- Companion tests 5 ("sizes 1 to 12" limits) and 7 ("480 cells") point to sweeps that
5a40a829ccremoved. Restoring them under S5 makes those pointers true again. - Interpretation 8 and test 8 need the kerosene and solar amounts once C2 lands, and the scope and period notes need updating after C1 and S1.
- It pins
- None of this blocks the PR by itself. Update the issue when the fixes land.
Next Steps
- C1: either add PY2025 (
2024-10-01) entries and givefuel_oil,propaneandwooda region level, or gate the program to start in FY2026. Add a period-2025 test either way. - C2: map KEROSENE to Heating Oil and SOLAR to Electricity, and update Case 13.
- S1-S2: add PY2027 (
2026-10-01) electricity, natural gas and band entries. Round the limit in float64 before the ceiling. Add period-2027 cases. - S3-S4: add
partnership_s_corp_incomeandmilitary_retirement_pay, and treat rental, farm-rent and estate losses the same way as self-employment losses. - S5-S6: restore the size 1-12 sweeps and the 12-limit test, add the public-housing and age-18 cases, retarget the four wrong anchors, and add the partial-page entries.
- Rebase on
main(coverage line... NC, NE, OR, TX), update rulespec-us#1479, and re-request review.
2 critical and 6 should-address findings, plus 14 suggestions.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes per the review comment above: 2 critical (period 2025 carries the FY2026 matrix and bands back over the published PY2025 matrix; kerosene and solar households are eligible but paid $0 despite the fuel-blind manual) and 6 should-address items (2027 pairs FY2027 limits with FY2026 tables, float ceil makes six FY2027 limits $1 high, two missing income sources, rental vs self-employment loss treatment, test coverage below the PR body's claim, wrong page anchors). All FY2026 values match the sources.
- Encode the PY2025 (2024-10-01) and PY2027 (2026-10-01) payment matrices, bands and limits beside FY2026; fuel oil, propane and wood carry the region level; verified_years "2025-2027". - Pay kerosene from the heating oil column and solar from electricity. - Apply the 60% SMI ceiling to the product rounded to cents. - Add partnership/S-corp income to the earned sources and military retirement pay to the unearned list; floor every unearned source. - Add cases for PY2025 and PY2027, odd household sizes, public-housing heat in rent, age 18, per-member interest and the Region 2 fallback. - Retarget references, re-template descriptions and align the registry. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
PR Review (round 2): Oregon LIHEAP regular heating assistancePR #9743: Add Oregon LIHEAP regular heating assistance (author: hua7450, head Round 1 reviewed head Overall: the substantive findings are fixed, and the new values check out against the sources.
One should-address item stays open:
Three round-1 suggestions are also still open (G4, G5, G12), and there are three new suggestions. There are no new critical or should-address findings. Path prefixes used below:
Line numbers refer to head Source Documents
Round-1 findings
Critical (Must Fix)None. Should AddressS6 (round 1, still open). Multi-page tables are cited with one anchor that opens only part of the cited values
SuggestionsN1. The unearned floor is applied to the unit total of each source, so one member's loss still offsets another member's income from the same source
N2. Residual test coverage, now matched to the claims
N3. The variables cite only the PY2026 manual although they are verified for 2025-2027
G4, G5, G12 (round 1, still open)See the round-1 table. G4 is resolved by the S6 fix. G5 is covered in the Axiom line section. G12 (rename to an application-arrangement input) remains optional. Verified correct
CI status
Branch status
Axiom line
Next Steps
0 critical and 1 should-address finding open (S6, partially addressed), plus 3 new suggestions and 3 open round-1 suggestions (G4, G5, G12). Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Round 2: both criticals and S1-S5 are addressed (PY2025 and PY2027 tables encoded and verified, kerosene/solar paid, limit rounding fixed, income sources and loss flooring added, tests expanded). One should item remains (S6): multi-page tables are still cited with a single anchor that misses Region 2 / larger-size values; please add one entry per operative page (details in the comment above). CI on the new head was still queued at review time.
- Floor each member's unearned sources before the household sum and add the unit-level TANF amount in the formula. - Add the even-size FY2026 limit case, the PY2027 size 12 Region 2 row and a two-member rental case. - Cite the PY2025 and PY2027 manuals on the limit, payment, band and region variables. - Write consecutive pages as #page ranges in reference titles and drop single pages from titles. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Thanks for round 2. Fixes pushed in 34bf42c. S6 — not splitting the table citations into one link per page. Those pages are consecutive and linear: someone who clicks the link and starts verifying the values against our parameters will scroll to the next page by nature. The split would also put ten links to the same three PDFs, differing only in page number, into each of the six table files, which I don't want. We keep one entry per source and have settled the title form instead, now in AGENTS.md: a single page is cited by the href alone, consecutive pages end the title with
|
PR Review (round 3): Oregon LIHEAP regular heating assistancePR #9743: Add Oregon LIHEAP regular heating assistance (author: hua7450, head Round 2 reviewed head Overall: the code and test changes are correct, and every new expectation matches the manuals.
One should-address item stays open:
There are no new critical or should-address findings, and there is one new optional suggestion (N4). Path prefixes used below:
Line numbers refer to head Source Documents
Round-2 open items
Critical (Must Fix)None. Should AddressS6 (round 1, still open). The Region 2 matrices, and some band tops, have no href that opens them
SuggestionsN4. TANF now sits outside the unearned-source parameter (optional)
G4 (round 1, partially addressed)
Verified correct
CI statusAt 20:53 UTC on 2026-10-07, Branch status
Axiom line
Next Steps
0 critical and 1 should-address finding open (S6, declined), plus 1 new suggestion (N4) and 1 partially addressed round-1 suggestion (G4). Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Round 3: N1-N3 and the axiom refresh are addressed, and every value still matches the manuals. One should item remains (S6), now with a smaller fix (see the comment above). The Region 2 matrices (M25 p59, M26 p80, M27 p74) and the larger-size band pages (M26 p79, M27 p73) still have no href that opens them, so those values can't be checked from the references. Because max_payment_size caps the amount tables at six, adding one Region 2 entry per manual (two per manual, not ten) and the two band pages fixes it. I'm treating the page text in titles as an optional suggestion, not a blocker. The repo's AGENTS.md doesn't contain the title convention you mentioned.
Add the Region 2 benefit matrix and the larger-household-size pages to the amount, income band and region references so every modeled value is reachable from a href; drop page text from single-page titles; describe the unearned source list as person-level. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
|
Thanks for round 3. Fixes pushed in 9872ebb.
No values changed. |
# Conflicts: # policyengine_us/programs.yaml
PR Review (round 4): Oregon LIHEAP regular heating assistancePR #9743: Add Oregon LIHEAP regular heating assistance (author: hua7450, head Round 3 reviewed head Overall: S6 is fixed as proposed. Every table value now has an href that opens the page printing it, and no value, formula or test changed. N4, G4 and the stale rulespec-us#1479 sentence are also resolved. There are no new critical or should-address findings and one informational note (N5). CI is green. Path prefixes: Round-3 open items
Critical (Must Fix)None. Should AddressNone. SuggestionsN5. The new entries depart from the convention
|
| Check | Result |
|---|---|
| Values unchanged |
|
| Every table href |
|
Merges of main |
|
programs.yaml |
|
main's guards |
|
| PR body | "40 program YAML cases" is still accurate. The axiom line is unchanged: axiom: TheAxiomFoundation/rulespec-us#1479 queued. |
CI status
gh pr checks 9743 shows 28 passed, 0 failed, 0 pending on head bbb8ce05c7 (run 37728677240, attempt 1, 2026-10-08 04:41-05:25 UTC). That run predates the 48 commits main has gained since, including the new reference-key guard (#9849). The local guard and Oregon runs on the merged tree cover that gap.
Branch status
- 18 commits ahead of
mainand 48 behind; the merge base ise19f75c510. git merge-treeagainstmain(0d93495806) is clean.- GitHub reports
MERGEABLE, with merge stateBLOCKEDon the round-3 change request.
Next Steps
- None required. Optionally merge
mainbefore merging, so CI runs once against the new guards.
0 critical and 0 should-address findings open, plus 1 informational note (N5).
Verdict: APPROVE
DTrim99
left a comment
There was a problem hiding this comment.
Round 4: S6 is addressed. Every amount file now cites the Region 1 and Region 2 matrix pages for each manual, and the band and region references open the larger-size and Region 2 pages. I reopened every href, and each shows what its title claims. No values changed, CI is 28/28 green, and the merge-tree against main is clean.
Adds Oregon's regular LIHEAP heating assistance for program years 2025 to 2027, including income eligibility, county/fuel payment tables, heat-in-rent treatment and the half payment for separate roomer/boarder/owner applications. In FY2026 a one-person Multnomah County household with $12,000 countable income and gas heat receives $520.
Fixes #273.
Implementation
hhs_smi. Ceiling of 60%, applied to the product rounded to cents in float64, reproduces all 36 published limits for 2025 to 2027. Payment-band boundaries remain published parameters because a single formula does not reproduce them. The final band extends to the eligibility ceiling where the tables differ by $1.tanfreceipt variable, which applies take-up, rather than Oregon's monthly entitlement.heating_expenseuses. Coal, other and unspecified fuels have no matrix column and pay $0 as a coverage gap; the unspecified default is tracked in Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754.verified_years: "2025-2027"; earlier years are unverified backfilled estimates.Remaining coverage
A county reported as UNKNOWN and sizes above 12 do not make
or_liheap_eligiblefalse: the benefit is zero because the payment tables do not cover them. A missing county input falls back to Baker County (Region 2), the repo-wide county default. Institutional residence, tribal duplicate awards and detailed income exclusions remain partial.Minimum-delivery Fuel Payments and agency supplements are regular-assistance gaps, not crisis components. Their amounts depend on delivery requirements and local decisions that existing annual expenses do not identify. No uniform amount is invented. Cooling, crisis and equipment assistance remain excluded.
Microsimulation: the datasets carry no heating inputs, so population totals are $0 until the default heating type changes. That change affects API partners and is tracked separately in #9754; callers must send
heating_typewith the matching fuel bill.Validation
40 program YAML cases. The FY2026 matrices are swept at every band for the even household sizes, the odd sizes 1, 3 and 5 are tested at their printed band tops, and the FY2026 limits are asserted for every size; PY2025 and PY2027 cases pin the regional heating oil split, the size-1 and size-12 rows and band tops, and the whole-dollar FY2027 limits. Other cases cover boundaries, housing and public housing, the age-18 boundary, mixed households, TANF take-up, both private-insurance examples, rental and estate losses including a two-member rental offset, per-member interest, the missing-county fallback and farm rental and survivor income over the limit. All cases specify
heating_type. A simulation that mixes an eligible Oregon household with households in other states does not raise (two-state case).Official sources
axiom: TheAxiomFoundation/rulespec-us#1479 queued