Repository navigation
Conversation
- Encode the FINAL 2021 benefit workbook (intercept, slope, fuel ratios, targeted multiplier, no young-child targeting); the 2021 values carry through 2022 because no final 2022 workbook was found. - Encode the 2024 and 2025 benefit workbook values, derived from the workbooks' credit percentages and matching their printed fuel maximums ($811/$441). The 2025 values carry into 2026 and later as unverified estimates: the 2026 workbook is not published. - Date the income-limit rules: 175% FPG for every size in 2022-23, FPG through size 7 with 60% SMI above from 2024-25, size 8 on FPG from 2025-07-01. Use the FFY2025 SMI for 2024-25 and the FFY2026 SMI for 2025-26 and 2026-27, inferred from the printed FPG-to-SMI switch points under the 42 USC 8624(b)(2)(B) cap and the 2026-27 OCC limits, and round as the HHS tables do (truncate 60% of the four-person median, then the size-adjusted amount), reproducing every published HHS amount. - Deduct the Medicare Part B premium; count military retirement pay, railroad benefits and general assistance (Guidelines catch-all, followed over the plan); count a minor's Social Security but not a child's SSI or other income; floor each source at zero. - Document that an omitted county falls back to Adams County. - Put OH on the LIHEAP coverage line; verified_years 2025. - Add and update 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 Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9975 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 5 +1
Lines 76 103 +27
Branches 2 3 +1
=========================================
+ Hits 76 103 +27
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Deduct health_insurance_premiums_without_medicare_part_b (Guidelines Appendix XXIII) and test each counted unearned source. 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>
Calls liheap_smi_limit from PR 10019 instead of repeating the HHS floor-then-floor calculation. Limits are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Add Ohio HEAP regular heating assistancePR #9975: Add Ohio HEAP regular heating assistance (author: hua7450, head Scope: Ohio's Home Energy Assistance Program (HEAP), the state's LIHEAP regular heating credit. The Ohio Department of Development ran it through the 2025-26 season, and the Ohio Department of Job and Family Services (ODJFS) runs it now. The PR covers:
The Percentage of Income Payment Plan (PIPP) reduction, crisis, cooling and weatherization are out of scope. The PR changes 35 files: 23 parameters, 5 variables, 5 test files (67 cases), Overall: the workbook formula, the income limits and the income rules are right where the sources print them.
There are no critical findings. The six should-address items:
All 67 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 and S2. Values that a proposed fix or a published range implies are hand computations and are labelled as such. The untested-logic claims in S4 were confirmed by mutating the code and rerunning the PR's tests. Path prefixes used below:
Line numbers refer to head Source Documents
Critical (Must Fix)None. Should AddressS1. Merge blocker: after merging main, the unearned list reads the reported-only
|
| File:line | Current | Suggested |
|---|---|---|
P/income/adult_age.yaml:1 |
"counts the income of household members at least this age" | "Ohio excludes the income of dependent members below this age, other than Social Security, under the Home Energy Assistance Program." |
P/income/sources/earned.yaml:1 |
"counts these earned income sources, except for dependent minors" | "Ohio uses these sources as earned income under the ..." |
P/income/sources/unearned.yaml:1 |
"counts these unearned income sources, except for dependent minors" | "Ohio uses these sources as unearned income under the ..." |
P/payment/formula/intercept.yaml:1 |
"starts the payment formula with this intercept" | "Ohio sets this payment formula intercept under the ..." |
P/payment/formula/slope.yaml:1 |
"reduces the payment formula by this amount per federal poverty percentage point" | "Ohio sets this payment reduction per federal poverty percentage point under the ..." |
P/payment/regional/adjustment.yaml:1 |
"adjusts payments up or down by this share for designated northern and southern counties" | "Ohio sets this regional payment adjustment for northern and southern counties under the ..." |
P/payment/regional/central_counties.yaml:1 |
"does not regionally adjust payments for these counties" | "Ohio uses these counties as the central region, with no regional adjustment, under the ..." |
P/payment/regional/northern_counties.yaml:1 |
"increases payments for these counties" | "Ohio uses these counties as the northern region under the ..." |
P/payment/regional/southern_counties.yaml:1 |
"decreases payments for these counties" | "Ohio uses these counties as the southern region under the ..." |
P/payment/targeted/elderly_age.yaml:1 |
"increases payments for households with a member at least this age" | "Ohio sets this minimum age for a targeted-household member under the ..." |
P/payment/targeted/multiplier.yaml:1 |
"multiplies payments by this factor for targeted households" | "Ohio provides targeted households this multiple of the payment under the ..." |
P/payment/targeted/young_child_age.yaml:1 |
"increases payments for households with a child no older than this age" | "Ohio sets this maximum child age for a targeted household under the ..." |
The eleven that fit: fpg_rate and smi_rate (limits); fpg_year_lag, maximum_fpg_household_size, smi_year_lag, both poverty-ratio bounds, the three fuel ratios and young_child_in_effect (uses). Consistency: #9967 S4, #9972 S4, #9968 S3 and #9745 S6.
S6. A wrong section label, two incomplete page lists, and the heat-in-rent branch does not cite its rule
| File:line | Problem | Fix |
|---|---|---|
V/oh_liheap_household_size.py:10 |
"Sections E-2.1 and E-2.6": E-2.6 is the asset test (G p. 9). The immigration rule the variable applies is E-2.8 (G p. 10), which the PR body cites correctly | "Sections E-2.1 and E-2.8" |
V/eligibility/oh_liheap_eligible.py:10-13 |
Cites the application (p1) and plan item 2.3 (p8) only. The unsubsidized heat-in-rent branch (~subsidized, line 28) rests on G E-4, p. 12: "Note: For HEAP only, the utility bill does not have to be in a household member's name (for example, heat included in the rent, in landlord's name, etc.) to receive a benefit." Plan 2.3 says the opposite for renters with utilities in the rent (G7) |
Add the Guidelines reference with #page=12 |
V/oh_liheap.py:24-25 |
The Guidelines link (#page=5) stands for E-1, E-2, E-2.10 and E-4, which run over pages 5-6 and 10-12, with no # PDF pages line |
Add # PDF pages 5-6, 10-12 |
V/oh_liheap.py:13-15 |
# PDF pages 1, 8-9, 11 for W21 leaves out page 10 (rows 98-150) and pages 15-16 and 19-20 (Tables 2B and 2C, whose 150+ rows the cap rests on), which the W23 line lists |
# PDF pages 1, 8-11, 15-16, 19-20 |
Consistency: #9972 S5 rated wrong anchors and missing page lists SHOULD; the brief rates incorrect section citations SHOULD.
Suggestions
G1. Backfilled and carried years: a July 2023 application confirms 2024, and the FY2022 matrix paid more than the 2021 carry-through
- Model year 2024. The PR body says "No 2023–2024 rule was found, so model year 2024 keeps the 2022–2023 rule".
- The state-hosted July 2023-May 2024 application, p. 1 prints the 175% limits for sizes 1-8 ($25,515, $34,510, $43,505, $52,500, $61,495, $70,490, $79,485, $88,480) and "households with more than eight members must add $8,995 to the yearly income".
- That is exactly the PR's 2024 rule (
T/eligibility/oh_liheap_income_limit.yamlCase 7: 25,515, 88,480 and 97,475). Cite it inP/eligibility/maximum_fpg_household_size.yamlandfpg_rate.yamland correct the PR body. - The July 2022-May 2023 application likewise adds "$8,260" per member above eight, matching the Guidelines.
- Model year 2022. The PR carries the 2021 workbook forward (reproduced: period 2022, an Ashtabula member aged 60 with propane and no income gets $737).
- Ohio's draft 2022-2023 HEAP State Plan (August 2022), p. 5 attaches "The FY2022 Benefit Matrix" with "Minimum Benefit $46.03 Maximum Benefit $930.47". The accepted FY2023 plan's item 2.6 rounds these to $50 and $930 (p. 9).
- So 2022 awards run about 26% low at the maximum. 2022 is unclaimed and documented as a carry-through, so this is a suggestion: record the FY2022 range in the parameter comments and registry notes, or gate 2022 payments.
G2. Encode the workbook ratios at the precision the tables use, and correct "reproduce the printed table"
- With the printed four-decimal ratios, the formula misses 19 of W23's 2,424 printed non-PIPP cells (all gas and electricity) and 36 of W21's 2,424 (every fuel), each by $1. This audit covered Tables 2A, 2B and 2C, rows 50 to 150+. For example, W21 Table 2A row 89 prints $646 for weighted propane where the formula gives 646.51, so $647, and W23 row 100 prints $579 for weighted gas where it gives $578.
- The PR body says the 2021 coefficients "reproduce the 2021 FINAL workbook's printed table" and that 2023 differs at "two cells". The registry notes mention only gas.
- Every cell of both workbooks reproduces with these values:
- W23: gas 0.5523335.
- W21: the unrounded slope 0.0011 × 892.05 = 0.981255, with gas 0.58821435, propane and oil 0.85197, and coal 0.532482.
- Both gas ratios imply the same $524.72 gas winter cost (0.58821435 × 892.05 = 0.5523335 × 950 = 524.72). So each ratio is a fuel cost divided by the high winter cost and can be encoded that way.
T/oh_liheap.yamlCase 11 (line 291) can then assert the printed $334 and $579 instead of $333 and $578. 2021 and 2023 are unclaimed, so this is a suggestion, as Add Alabama LIHEAP regular heating assistance #9967 G1's $1-$2 differences were.
G3. Fuels that are eligible but paid $0
- Reproduced at head (period 2026, no income): SOLAR with an electric bill, OTHER with an other-fuel bill, and UNSPECIFIED with heat in unsubsidized rent are each
oh_liheap_eligible: truewithoh_liheap: 0.T/oh_liheap.yamlCase 9 asserts only the $0. - G E-4, p. 12 lists the eligible primary heat sources: "A regulated or unregulated utility (gas and electric); A permanent, free-standing fuel tank (oil and propane); A legal fireplace (wood); or A legally vented wood/coal stove." OTHER fits none of them.
heating_expensetreats SOLAR homes as grid-tied with electric heat, which fits the gas and electricity column. - Either pay SOLAR at the gas and electricity ratio and make OTHER ineligible, or make the flag match the $0. Add a
# See #9754note for UNSPECIFIED (Add New Jersey LIHEAP regular heating assistance #9745 G1, Add Alabama LIHEAP regular heating assistance #9967 G2, Add Georgia LIHEAP regular heating assistance #9968 G2).
G4. Self-employment and rental results may net within Schedule 1
- G E-2.3, p. 8: self-employed applicants use "The amount listed on the Schedule 1 lines 3, 5, and 6", and "If a loss is reported on the tax documentation submitted, enter $0 in the 12-month field." Appendix XXIII (p73) lists "landlord" under self-employment. Read together, business (line 3), rental and partnership (line 5) and farm (line 6) results form one self-employment figure, floored at $0 as a whole.
- The PR floors each source separately (
V/income/oh_liheap_countable_income.py:34-36), so a business gain and a rental loss count the gain in full. Reproduced at head: $6,000 of self-employment income and a $6,000 rental loss count $6,000; netting gives $0 (hand-computed). Wages are never offset under either reading. - The per-source reading is conservative and recorded in rulespec-us#1540 (interpretation 18, "settled"). Either add the Schedule 1 reading to the PR body's conflict table, or net
self_employment_income,sstb_self_employment_income,partnership_s_corp_income,farm_operations_income,rental_incomeandfarm_rent_incomebefore a single floor.
G5. PIPP is the largest unmodeled factor
- The covers project 76% to 82% of HEAP households on PIPP Plus (W21 75.82%, W23 76.12%, 2024 80.50%, 2025 82.12%), and "those on both HEAP and PIPP receive a 75% HEAP reduction" (FAQ question 2). The model pays every household the non-PIPP award, which the PR documents.
- An optional PIPP-enrollment input (default false) would let household users get the right award. The workbooks' PIPP tables are not uniform: Table 2A's PIPP cells are a quarter of the regular cells, and Table 2C's are about a fifth. A plain 25% factor would match the FAQ but not every printed PIPP cell.
G6. Test and comment hygiene
- About ten comments lost the spaces around their numbers:
T/eligibility/oh_liheap_eligible.yaml: line 3 ("limit27387"), line 27 ("above27387fails", "categoricalNo"), line 197 ("size0must") and line 220 ("Full28000 exceeds size1limit27387");T/eligibility/oh_liheap_income_limit.yaml: line 3 ("whole-dollar175%of2025FPG", "adjacent200%HWAP") and line 44 ("JFS00330", "July2026-May2027");T/income/oh_liheap_countable_income.yaml: line 3 ("p8:12000+6000+600+1200+1200=21000"), line 31 ("pp73–74:2400rent+1200farmrent...") and line 188 ("to0:12000wages+600positive business+1200SSI=13800").
- Two comments refer to internal decisions: "flag represents verified arrangement in the contract" (
T/eligibility/oh_liheap_eligible.yaml:98) and "the approved proxy" (line 147), as in Add Rhode Island LIHEAP regular heating assistance #9972 G7. - Several comments call the Guidelines "Manual" (for example
T/eligibility/oh_liheap_eligible.yaml:197andT/oh_liheap_household_size.yaml:46), and others say "Guidelines". - The isolated limit and income tests set
heating_typeand fuel bills that those variables never read.
G7. PR body and issue housekeeping
- Add two rows to the conflict table:
- Plan item 2.3 makes renters with utilities in the rent ineligible unless they pay part of the electric bill (FY2026 plan, p. 8), while G E-4 (p12) lets heat-in-rent households receive HEAP. The model follows E-4 for unsubsidized tenants (Remove complex pass-through reform #1540 interpretation 14).
- Table 4 in both FINAL workbooks (p29) prints ">150 0.00", and Table 2A's last row is "150", while Tables 2B and 2C end "150+". The covers' "151% to 175%" customer counts support the 150+ reading the PR follows (Remove complex pass-through reform #1540 interpretation 5).
- Correct "No 2023–2024 rule was found" (G1), "two cells" and "reproduce the printed table" (G2).
- The registry entry is named "Ohio LIHEAP" ("Ohio Low Income Home Energy Assistance Program"). Merged New York uses its program's own name ("New York HEAP", "New York Home Energy Assistance Program"), which would fit Ohio too.
- The
make formatbox is unchecked, although CI lint passed. - rulespec-us#1540 still calls the PR "open as a draft" and says the tests were "Not run locally". All 67 pass locally at this head.
Verified correct
- Workbook formula (W21 and W23):
- "(A - (B * POVERTY RATIO)) * VENDOR COST RATIO = PAYMENT", with A = 593.2133 and B = 0.9813 from a $892.05 high winter cost and 61%/50% credits (W21 p11), and A = 731.5 and B = 1.33 from $950 and 70%/56% (W23 p11).
- Fuel ratios as printed (p9): 0.5882, 0.852, 0.852 and 0.5325, then 0.5523, 1, 1 and 0.6. Propane, fuel oil and kerosene share the bulk ratio; coal and wood share one.
- Target factors 1.50 (a member 60 or older or disabled) and 1.75 (adding "5 yrs or under") from the covers (p1). The FY2021 and FY2022 plans target only older and disabled members, so carrying
young_child_in_effect: falsethrough 2022 fits. - Regions of +6% and −6% (p1; Tables 2B and 2C headed 1.0600 and 0.9400). Table 1 (p8) assigns 24 northern, 11 southern and 53 central counties, identically in both workbooks and in the PR's lists.
- The 50% floor ("Households falling at or beneath 50% of the poverty level will receive maximum benefits", p1), the 150+ terminal rows (p16, p20) and half-up rounding after every factor.
- Tables 3A and 3B use the 2020 and 2022 guidelines ($12,760 and $13,590 at 100%), which supports the one-year guideline lag.
- 2024 and 2025 estimates: A = 475 and B = 0.76, and A = 251.75 and B = 0.285, from 46%/38% and 25%/22% of $950, reproduce every cover maximum ($587/$811/$486 and $319/$441/$264). The gas ratio 0.724 lies in the 0.7236-0.7247 band both gas maxima allow. The printed minimums equal 0.19 of the regular central award at 150% in every workbook (W21's cover to the cent: $49.85, $72.20 and $45.13), and with the PR's coefficients that relation reproduces all six draft minimums (2024: $50, $69, $41; 2025: $29, $40, $24).
- Limits:
- 2026: all 8 printed limits ($27,387 ... $94,762). 2027: all 7 ($27,930 ... $87,570). 2025: $26,355 and $82,845. 2023: $23,782, $81,602, $89,862 and $98,122 (G E-2.2, p7, floored). 2024: $25,515, $88,480 and $97,475, matching the July 2023 application (G1).
- 60% of SMI: HHS FFY2025 $90,515 and $92,483, and FFY2026 $94,881, $96,944, $99,007, $101,069 and $103,132 (Attachment 4, p5), through the shared
liheap_smi_limithelper. - Size cutoffs of 7, 8 and 7 (applications p1; the FY2025, FY2026 and FY2027 draft plans' item 2.1 put SMI at sizes 8, 9 and 8).
- The SMI-year inference holds. With FFY2024 SMI, the 2024-25 size-7 limit ($82,845) would exceed 60% of SMI ($81,085); with FFY2025, the 2025-26 size-8 limit ($94,762) would exceed it ($90,515). With FFY2027 SMI ($117,810), the 2026-27 form could have kept size 8 on the guideline ($97,510 against $97,546), so its switch after seven fits FFY2026, as the OCC sheet's sizes 8, 11 and 12 show.
- Limits are inclusive ("equal to or less than", G E-2.2, p7) and floored to whole dollars, as the applications print them.
- Timing: HEAP runs from July 1 to May 31 and credits from January (G E-1, p5; applications p1). Period N reads January 1 of N, inside the season from July N−1 to May N.
- Income (G E-2.2-E-2.3, p7-8; Appendix XXIII, p73-76; application p7):
- Gross income of members 18 and over. A dependent minor's income is excluded except Social Security: "A minor that is awarded SS/SSDI and has a payee and/or a guardian of their award that is 18 years or older, this counts as included income" (p7).
- Nonqualified members' income counts in full (E-2.1 note, p7; E-2.8, p10).
- Every listed source maps to an Appendix XXIII category: wages and self-employment, including landlord income (p73); unemployment, workers' compensation, employment disability payouts and strike benefits (p73-74); pensions including military pensions and widow's benefits, SSI and alimony (p73); and IRA and annuity withdrawals, estate and trust payouts, lottery winnings, interest, dividends and capital gains (p74). Railroad retirement and general assistance count through E-2.3's catch-all, as documented.
- TANF (Ohio Works First), child support received and gifts are excluded (p75-76; application p7).
- Child support paid, Medicare premiums and other health premiums are deducted (p74; application p7), so Social Security counts net of Medicare, as plan item 1.9's checked "Excluding MediCare deduction" box requires (rendered page 5). That is the counterpart of Alabama's "Including" box in Add Alabama LIHEAP regular heating assistance #9967.
- Each source is floored at zero, so no loss offsets wages (E-2.3: "If a loss is reported ... enter $0").
- Household:
is_citizen_or_legal_immigrant(8 U.S.C. 1641 qualified statuses, DACA excluded) matches the "Proof of Legal Residency/Qualified Alien" list (E-2.8, p10). A unit with no qualified member is ineligible. - Eligibility: Ohio residence; no asset test (E-2.6, p9; plan item 2.3); no categorical eligibility (plan item 1.4 answered No); heat in unsubsidized rent qualifies (E-4, p12); subsidized and public-housing tenants with heat in rent need a bill ("If you live in federally subsidized housing and have a utility bill in your name, you may be eligible", application p1; plan item 2.3); NONE is ineligible.
- Code patterns: no hard-coded values in the limit and payment formulas (the deduction list is in code, S2).
defined_for = StateCode.OHon four variables, andoh_liheapis gated byoh_liheap_eligible. Vectorized formulas; all 23 parameters are read; the sharedfpg()andliheap_smi_limit()helpers are reused. Mixed-state and unknown-county rows return $0, and the omitted-county fallback (Adams, −6%) mirrors merged New Jersey's Atlantic fallback and is documented and tested. - Tests:
- 67 of 67 pass locally at head (policyengine-core 3.32.29) and on the merged tree. Periods are plain, and every case sets
heating_type. - Hand-checked against the workbooks, applications and HHS tables:
T/oh_liheap.yamlCases 1-4, 10, 12-17, 21, 23 and 24; income-limit Cases 1, 2 and 4-8; countable-income Cases 1, 4, 7, 12, 16 and 17; eligibility Cases 1, 2 and 14.
- 67 of 67 pass locally at head (policyengine-core 3.32.29) and on the merged tree. Periods are plain, and every case sets
- Changelog:
changelog.d/oh-liheap.added.mdis top level and typedadded.
Checklist results (LIHEAP wave 2a)
- State plan and manual first: pass, with S3. I read the accepted FY2021-FY2026 plans (rendered checkboxes for FY2026), the FY2027 draft, Ohio's draft 2022-23 plan, the Guidelines, the five applications from July 2022 to July 2026, the OCC sheet, IU-2025-5 and its FAQ, both FINAL workbooks and both draft covers. I verified every encoded factor, county, limit and branch. The FY2026 matrix's range is not applied to 2026 (S3).
- Income definition: pass at head on sources and loss floors. Social Security counts net of Medicare (plan 1.9; Appendix XXIII), and annual income stands in for the 12-month option. Payroll premiums are not deducted (S2), and the UI entry needs the total after rebase (S1). Schedule 1 netting is a reading point (G4).
- Backdating: the July 2023 application confirms the 2024 limits (G1). 2021 and 2023 payments reproduce the FINAL workbooks within $1 (G2). 2022 carries 2021 although the FY2022 matrix paid up to $930.47 (G1, unclaimed). 2026 and 2027 carry 2025 although the FY2026 matrix pays up to $546 (S3).
- Household and arrangement rules: pass on subsidized and public housing, heat in rent, renters, no categorical eligibility and the targeted-household weight. PIPP is documented as unmodeled (G5), and three fuel cases are eligible but paid $0 (G3). Two eligibility conjuncts are unpinned (S4).
- Tests: 67 cases, more than 8 hand-checked. The size grids (1-8 in 2026, 1-7 in 2027), switch points, the limit edge, the 50% and 150% edges, the targeting boundaries and every income source are covered, and periods are plain. Gaps are in S4.
- Parameter descriptions: twelve use off-template verbs (S5). There are no trailing clauses.
- References: one wrong section label, two incomplete page lists and a missing Guidelines citation for a branch (S6). Multi-page titles use
#page 7-8,73and#page 16,20correctly. - Wiring: pass. The
programs.yamlentry and coverage line are well formed. No aggregate wiring, which matches OR, NY, NJ and MD on main (none of them is inhousehold_state_benefits).defined_forgating is on every variable. No take-up, as in the siblings. - Axiom: valid
queuedline. rulespec-us#1540 is open, labelledpe-parity, dispatch-ready and current to21bc12d414. It needs updates for S1-S4 (see below). - Branch and CI: all checks are green at head. 12 ahead and 82 behind main. No textual conflicts, but main's UI guard fails on the merged tree (S1), and Document disjoint health premium inputs and correct consumer treatment #10046 changes the premium inputs (S2).
- Integrate modeled state unemployment insurance into income flows #9558: S1. No modeled Ohio UI exists, so the effect today is the guard failure only.
- IIJA and FY2027: no IIJA supplement; none of the FY2021-FY2027 plans, the Guidelines or the covers mentions one. The FY2027 draft estimates FY2027 benefits at the FY2026 matrix's $31-$546 (S3), JFS 00330 says credits may come "as early as October 2026", and the 2026-27 limits are encoded and correct.
- Mutation check: S4. The control mutation fails as expected.
CI status
28 of 28 checks pass at 21bc12d414 (gh pr checks 9975, run of 2026-10-12). The three "skipping" entries belong to a superseded run on the same SHA.
Branch status
- 12 commits ahead of
mainand 82 behind. The merge base is1d699fec2d(Share one HHS SMI helper for LIHEAP income limits #10019); main is at8ae01aa3cb. git merge-tree --write-tree PolicyEngine/main 21bc12d414exits 0 with no textual conflicts.programs.yamlmerges tocoverage: DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OR, TX, with the OH entry ahead of DC.- Semantic conflicts: main's Integrate modeled state unemployment insurance into income flows #9558 guard fails on the merged tree (S1), and Document disjoint health premium inputs and correct consumer treatment #10046 makes payroll premiums a disjoint input (S2). The PR's 67 cases pass on the merged tree.
- The other main commits since the merge base that touch premiums, Medicare or HHS parameters (Uprate premium inputs by premium series, not CMS out-of-pocket spending #10085, Charge the Part D income-related premium only to Part D enrollees #10115, Project Medicaid LTC home equity limits with CMS's rounded CPI-U increase #10162) leave every input the Ohio variables read in place.
- The wave 2a siblings (Add Alabama LIHEAP regular heating assistance #9967-Add South Dakota LIEAP regular heating assistance #9974) touch the same LIHEAP coverage line, which is a branch note, not a finding.
Axiom line
axiom: TheAxiomFoundation/rulespec-us#1540 queued: valid format, and the issue meets the bar.
- rulespec-us#1540 is open and labelled
pe-parity(plusenhancement), with no comments, and was last updated 2026-10-12. - It is dispatch-ready under the Add AMT parameters for 2020-2023 #1467 standard. It has:
- proposed
us-oh/module paths with corpus status; - verbatim Guidelines, application, plan, workbook and HHS text;
- required outputs for all 5 variables;
- 15 companion tests derived from the workbooks, applications, plans and HHS tables ("Every expected value comes from the cited sources, none from policyengine-us output").
- proposed
- It describes head
21bc12d414correctly, including the 2026 gap ("Payments for model year 2026 and later cannot be source-grounded"), the heat-in-rent conflict (interpretation 14) and the 2023 gas-precision disagreement (interpretation 6). - Updates needed when the fixes land:
- the UI input in the required outputs (S1) and the payroll-premium deduction (S2);
- the 2026 estimate or caveat (S3) and the new eligibility cases (S4);
- the July 2023 application (interpretation 9), the FY2022 range (interpretation 4) and W21's 36 $1 cells ("The 2021 and 2023 payments reproduce the FINAL tables");
- the stale "open as a draft" and "Not run locally".
Next steps
- S1: rebase onto main and switch
P/income/sources/unearned.yaml:4tototal_unemployment_compensation. - S2: deduct
pre_tax_health_insurance_premiums(ideally from a parameter list) and move Case 18's premium to it or add a payroll case. - S3: add a labelled 2026 estimate that fits the FY2026 range, or state plainly that 2026 and 2027 are understated, and correct the PR body.
- S4: add the size-0 and NONE eligibility assertions.
- S5-S6: align the twelve descriptions and fix the four references.
- Optionally address G1-G7, then refresh the PR body and rulespec-us#1540 and re-request review.
0 critical and 6 should-address findings, plus 7 suggestions.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes for 6 should items; details in the full report above. The encoded workbook formula, fuel ratios, regions, county assignments and limits check out: 4,793 of 4,848 printed cells match exactly and the rest are $1 off. All 67 tests pass and CI is green. (1) Merge blocker from main's #9558: the guard fails on the merged tree at income/sources/unearned.yaml:4. (2) The deduction reads only health_insurance_premiums_without_medicare_part_b, so payroll premiums (pre_tax_health_insurance_premiums, separate on main since #10046) are never deducted. Example: $28,000 of wages with a $1,000 payroll premium gets $0 where the Guidelines give $151. (3) 2026 and 2027 pay the 2025 coefficients (max $441), while the FY2027 draft plan reports the FY2026 matrix range as $31–$546, so 2026 awards run about 24–32% low. Encode the FY2026 matrix if it can be obtained; otherwise document the carry-forward and narrow the year claim. (4) Two eligibility conditions pass every test even when removed: the size check and the NONE check. (5) Twelve parameter descriptions are off the house template. (6) A wrong section label (E-2.6 should be E-2.8), two incomplete page lists, and no E-4 citation on the heat-in-rent branch.
- S1: Unearned source list reads raw unemployment_compensation; main's #9558 guard fails - S2: Premium deduction misses payroll (pretax) premiums (main #10046) - S3: 2026 and 2027 pay the 2025 coefficients ($441 maximum) although the FY2026 matrix pays $31-$546 - S4: Size gate and NONE check are untested - S5: Twelve parameter descriptions use off-template verbs - S6: Wrong section label, two incomplete page lists, heat-in-rent branch lacks its E-4 citation - REC-C: Coordinator recommendation C: federal 110% poverty floor (applies to Ohio from size 17) Also applies the in-scope suggestions. Tests not run locally; CI validates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review. Fixes pushed in a2cb186. The branch also merges upstream/main, which brings in #9558 and #10046.
|
Adds Ohio's Home Energy Assistance Program (HEAP) regular heating benefit, the state's LIHEAP program. The model counts citizens and qualified noncitizens for household size, counts the income of every member except a dependent minor's income other than Social Security, subtracts child support paid, the Medicare Part B premium and other health insurance premiums, including premiums withheld from pay before tax, and tests annual income against 175% of the prior year's poverty guideline, or 60% of state median income above a household-size cutoff. Under 42 USC 8624(b)(2)(B), it never excludes a household whose income is below 110% of that guideline. It then applies the Ohio benefit workbook formula: an intercept minus a slope per poverty percentage point, times a fuel cost ratio, a 6% regional adjustment and a multiplier for households with an elderly, disabled or young child member. The poverty percentage stops at 150% for the payment, as in the final workbooks' 150+ rows, while eligibility extends to 175%. In 2025, a Franklin County adult who heats with propane and earns $15,060, 100% of the 2024 guideline, receives $223 ($251.75 − $0.285 × 100 = $223.25). A household there with a member 60 or older and no income receives $416 ($237.50 at the 50% floor × 1.75); in northern Ashtabula County, the same household receives $441, the maximum benefit the FY2026 plan reports.
The registry marks Ohio partial. The final 2021 and 2023 payment components and printed rows are tested; the 2024 and 2025 coefficients are estimates from the draft workbook covers, the 2026 coefficients are estimates fitted to the FY2026 matrix range ($31–$546) that the FY2027 draft plan reports, and 2027 carries them forward.
Fixes #9966
Regulatory authority
The clearinghouse file names run one year ahead of the workbook titles; for example,
OH_BenefitMatrix_2022.pdfholds the 2021 FINAL workbook.Eligibility
defined_for = StateCode.OHis_citizen_or_legal_immigrant, with no SNAP-specific waiting periods or bars. Nonqualified members' income counts in full. A household with no qualified member is ineligible.liheap_smi_limithelper (#10019), which follows the HHS tables' rounding order: 60% of the four-person median is truncated, then the size-adjusted amount. This reproduces every published HHS FFY2025 and FFY2026 amount. Limits are inclusive. One person: $27,387 in 2026. A household with income below 110% of the same lagged guideline is never excluded on income:oh_liheap_eligibleapplies the shared federal parametergov.hhs.liheap.fpg_floor(1.1) as an alternative income test, andoh_liheap_income_limitstill returns the printed limit. Ohio's 60% SMI limit falls below that floor for 17 or more members in 2025–2027 (2026, size 20: $119,633 against $132,165).heating_typeNONE is ineligible.Countable income
total_unemployment_compensation), strike benefits, SSI, pensions, military retirement pay, railroad retirement, survivor benefits, veterans benefits, workers' compensation, disability benefits, alimony, rental and farm rental income, interest, ordinary dividends, retirement account distributions, estate income, capital gains, gambling winnings and general assistance. Floors each source at zero, so a loss in one source offsets nothing.income/deductions.yamlfrom household income, floored at zero: child support paid (child_support_expense),medicare_part_b_premium, other health premiums including prescription plans (health_insurance_premiums_without_medicare_part_b), and premiums withheld from pay before tax (pre_tax_health_insurance_premiums; Appendix XII, page 57, shows pre-tax MEDICAL INS and DENTAL INS). The premium inputs are disjoint, so no premium is deducted twice.Benefit
The payment equals (intercept − slope × poverty percentage) × fuel cost ratio × regional factor × targeted multiplier, rounded half up to the dollar after every factor applies.
is_disabled, and from 2023 a child 5 or younger, receives the targeted multiplier.maximum_poverty_ratio).Years covered
A calendar-year period reads the parameters in force on January 1. Formulas are undated. The registry entry is
partialwith noverified_years: no full benefit year is verified, although the 2021 and 2023 coefficients reproduce 4,793 of the 4,848 printed non-PIPP cells (the other 55 are $1 off). The income sources and deductions follow the current rules in every year.liheapch.acf.gov/docs/2027/benefits-matricies/once ACF posts them.Not modeled and source conflicts
countyfalls back to the state's alphabetically first county, Adams, so a household with no county input receives the 6% southern reduction. An explicit UNKNOWN or non-Ohio county receives $0.veterans_benefitscannot separate VA disability payments, so all VA benefits count.is_disabledapproximates it.Where sources differ, the model follows the source in the last column:
general_assistance.Microsimulation: the microsimulation datasets carry no heating inputs, so population totals are about $0 until #9754 lands. Callers must send
heating_typewith the matching fuel bill.Test plan
68 YAML cases in 5 files cover:
Every eligibility and payment case specifies
heating_type; the isolated limit, income and size cases omit it because those variables never read it. CI validates them.make formatchangelog.d/axiom: TheAxiomFoundation/rulespec-us#1540 queued
🤖 Generated with Claude Code