Repository navigation
Add New Hampshire LIHEAP regular heating assistance - #10343
Conversation
One added changelog fragment for the new program and a one- or two-sentence programs.yaml note; limitations stay in code comments and the PR body. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml # source_conflicts/candidates.yaml
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #10343 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 7 +3
Lines 76 146 +70
Branches 2 2
=========================================
+ Hits 76 146 +70
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:
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Add New Hampshire LIHEAP regular heating assistancePR #10343 (author: hua7450), head
The PR has no reviews and no comments apart from Codecov. It touches no partner test file. Path prefixes:
Sources read for this review:
SummaryWhat is right. The tables and the benefit mechanics are encoded carefully:
There are no critical findings. There are four should-address items:
There are also eight suggestions:
Status.
Critical (must fix)None. Should addressS1. Medicare premiums are deducted only when a Part B amount is reported, although the manual deducts the Medicare premiums withheld from Social Security and railroad retirement, and two tests pin the gap
S2. General assistance is counted, although plan 1.9 leaves it unchecked and the manual counts only the state's own welfare programs
S3. Six of the 24 income-source entries and two gates have no test that would fail if they were removed
S4. Three parameter descriptions are off the house template, and several comments cite "the user" or an unattributed approval
SuggestionsG1. Bedrooms understate the manual's room count, and the gap can be large.
G2. Heat in rent.
G3.
G4. The $50 investment exclusion.
G5. Military basic pay: the convention is defensible, so state the basis.
G6. The source-conflict process. The federal-floor reading is recorded only as a G7. References.
G8. Period 2026 (unclaimed and documented).
Verified correctHand-checked expectations (40; all match the head, though S1 and S2 change three of them):
Batch checks:
Axiom line assessment
CI status
Branch status
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes: 0 critical, 4 should (Medicare premiums deducted only when reported; general assistance counted against plan 1.9; untested income sources and gates; descriptions and comments). Full report in the comment above.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
|
Thanks for the review, David. The fixes are in 6e975b1, and c0cda9e merges current main.
The PR body and TheAxiomFoundation/rulespec-us#1903 are updated for c0cda9e. Tests now number 181 ( |
PR Review (round 2): Add New Hampshire LIHEAP regular heating assistancePR #10343 (author: hua7450), head
The PR still touches no partner test file. Path prefixes:
SummaryAll four should-address items are fixed, and a test would fail without each fix:
The suggestions.
The merge. The hand-resolved The rulespec-us issue. rulespec-us#1903 describes the new head. No new critical or should-address items.
Four new suggestions:
Status.
Prior findings
New findingsCriticalNone. Should addressNone. Suggestions
VerifiedHand-checked expectations. Every new or changed expectation is checked below. The guideline is $15,960 for one person (2026). The Part B premium is $202.90 × 12 = $2,434.80 (the 2026 standard carried forward;
Mutation check of the fix commit (the Utah and North Dakota round-2 rule):
Three floors that no test pins are only defensive, because the floored values cannot go negative in practice:
Merge resolution. I checked the hand-resolved
Guards on the merged tree (
Other checks.
Axiom
CI
Branch
Verdict: APPROVE |
DTrim99
left a comment
There was a problem hiding this comment.
Approving round 2: 0 critical, 0 should. All four round-1 shoulds are fixed and pinned. Full report in the comment above.
Adds New Hampshire's Fuel Assistance Program (FAP), its LIHEAP regular heating benefit, for program year 2027 (PY2027). The model counts citizens and qualified noncitizens for household size, counts each member's income from the manual's countable sources that have model inputs, less child support paid and the Medicare Part B premium withheld from each member's Social Security or railroad retirement, and tests it against 60% of state median income (SMI), with the federal protection below 110% of the poverty guideline. It estimates annual heating cost with the manual's formula, using bedrooms (at least one room) as the room count, takes the larger of that estimate and the actual bill, and pays the Attachment D matrix amount for the cost tier and income level, 75% of it for electricity, solar and natural gas. In PY2027, two adults in Coos County with $45,120 of wages, living in a four-bedroom single-family home heated with fuel oil and reporting no fuel bill, receive $800: $45,120 / $21,640 = 208.5% of the 2026 guideline, above the 175% bound, gives income level F (the two-person limit is $63,702); 2,000 x 4 bedrooms x 7,672 degree days / 1,000,000 x $28.881 / 0.78 = $2,272.56 of estimated heating cost gives cost tier BB; and the BB/F deliverable-fuel amount is $800.
Fixes #10337
Regulatory authority
48d77fdaed2b6b33a9efd7dea9246d262727239e0a840bb0a424463c757493d9.Eligibility
defined_for = StateCode.NH;nh_fapis defined fornh_fap_eligiblenh_fap_household_sizeaddsis_citizen_or_legal_immigrantover the SPM unit; a household with no counted member is ineligiblenh_fap_income_limitcalls the sharedliheap_smi_limithelper at New Hampshire's 60% rate: it floors 60% of the FY2027 four-person SMI ($156,134 x 0.6 = $93,680.40, floored to $93,680), applies the federal household-size factor and floors again. This rounding order is inferred: it reproduces all eight published limits, from $48,713 for one person to $129,278 for eight. The limit is inclusive.nh_fap_eligiblealso accepts income strictly below 110% of the poverty guideline with a one-year lag (the 2026 guideline for PY2027), rounded to cents, reusinggov.hhs.liheap.fpg_floor. The protection exceeds the SMI limit only for households of 28 or more counted members; see the source-conflict note below.nh_fap_heating_cost, actual or estimated) or unsubsidized heat in rentheat_expense_included_in_rentis true and the household is subsidized (receives_housing_assistanceoris_in_public_housing)heating_typeNONE is ineligible, with or without heat in rent. SOLAR uses the electricity row, becauseheating_expensereads a solar home's bill as its grid electricity bill. OTHER and UNSPECIFIED have no page 77 row and pay nothing.Countable income
nh_fap_countable_incomesums the income of every SPM unit member; ineligible noncitizens are left out of household size onlyemployment_income) plus self-employment (including SSTB), farm operations, partnership and S corporation income, each floored at zero so a business loss does not offset other income. The earnings of members who are full-time students in secondary school are excluded. Military basic pay is part ofemployment_income, the convention under which Virginia and Indiana subtractmilitary_basic_payfrom AGI, so it is not added again.military_retirement_income), retirement distributions, railroad retirement, survivor benefits, veterans benefits, total unemployment compensation, workers' compensation, disability benefits, the state supplement's APTD, ANB and OAA payments (nh_ssp), strike benefits, financial assistance, alimony, rental income, farm rental income, estate income and gambling winnings, each floored at zerossi_min_age)tanf, counted once per SPM unit, so an unclaimed entitlement is not incomemedicare_part_b_premium: $202.90 x 12 = $2,434.80 in 2027 (the 2026 standard premium, which the model carries forward) for an enrollee who pays it, and zero for a member who is not enrolled or whose premium a Medicare Savings Program pays.medicare_part_b_premiums_reportedis not read.Benefit
nh_fap_heating_costtakes the larger of the actual annual bill (heating_expense, floored at zero) and the estimate dwelling factor x rooms x agency heating degree days / 1,000,000 x fuel cost per MBTU / fuel efficiency. The manual lets the agency compare the two and use the one that gives the better benefit; because the matrix amount never falls as cost rises, the larger cost gives that benefit. The model usesbedroomsas the room count, with at least one room for a household that is not homeless (see the room-count note below).nh_fap_dwelling_typeinput, which defaults to single family or modular.county_str(page 77, with the county-to-agency map from Community Action Partnership of New Hampshire): Belknap and Merrimack 6,610; Hillsborough and Rockingham 5,993; Strafford 6,061; Cheshire and Sullivan 6,588; Carroll, Coos and Grafton 7,672. An explicit unknown or out-of-state county produces no estimate. Without a county input, the model's existing county fallback assigns Belknap County, the first New Hampshire county alphabetically, so the estimate uses 6,610 degree days.heating_typenh_fapmultiplies the deliverable-fuel amount by thebenefit_multiplierparameter for the household'sheating_typeand rounds half up to whole dollars. Electricity, solar and natural gas receive 0.75 of it, which reproduces all 24 published utility amounts (for example, $2,150 x 0.75 = $1,612.50, paid as $1,613). Other, unspecified and no heat have a multiplier of 0 and pay nothing.Years covered
The registry entry records
verified_years: "2027". Earlier model years reuse the PY2027 New Hampshire parameter values with the poverty guideline and state median income that apply to each year, and are unverified historical estimates. Period 2026 therefore applies the PY2027 matrix. The published PY26 matrix differs: it starts tier AA at $1,750 and tier BB at $1,500, pays up to $2,177 (AA/A deliverable), sets utility amounts at about 62.5% of the deliverable amounts and labels level F as 200% of the guideline. PY26 values are not encoded.Not modeled and source conflicts
nh_fap_dwelling_typedefaults to single family or modular. Mobile homes and apartments, condominiums or duplexes must be supplied; the agency's separate room type (factor 1,400) has no value of its own.WOODstands in for cordwood; wood pellets and bio-bricks ($21.650, 0.70) cannot be identified fromheating_type. Winter blend ($32.033, 0.78) is a heating-oil blend entered asFUEL_OILorKEROSENE, so its own cost per MBTU is not used. Page 77 and the application list no other fuel, soOTHERandUNSPECIFIEDreturn $0 even when the household is otherwise eligible.us-nh:fap-income-floor-vs-smi-limitinsource_conflicts/candidates.yaml.Test plan
policyengine_us/tests/policy/baseline/gov/states/nh/doe/fap/(nh_fap.yaml88,nh_fap_countable_income.yaml36,nh_fap_eligible.yaml30,nh_fap_heating_cost.yaml15,nh_fap_household_size.yaml4,nh_fap_income_limit.yaml8); expected values are hand computed from the manual's income table, heating cost formula and benefit matrix in case comments.nh_fap.yamlCase 85 pays $750 to a single adult with $10,000 of wages and oil heat included in unsubsidized rent, with no bill and no bedrooms, on the $489.50 one-room Belknap estimate, and $0 when the county is unknown. Case 86 deducts the $2,434.80 Part B premium from $28,000 of Social Security, giving $25,565.20, level E and $1,100. Case 87 leaves $1,000 of general assistance out of a $19,500 earner's income, giving level C and $1,720. Case 88 pays a solar household with a $1,200 electricity bill $1,095 (CC/A $1,460 x 0.75). Countable-income Case 35 counts S corporation, SSTB, rental, survivor, disability and gambling income ($6,300 in total); Case 36 caps the Part B deduction at $1,200 of Social Security and allows none to an enrollee whose only income is a pension; Case 27 deducts nothing when a Medicare Savings Program pays the premium. Eligibility Case 26 makes a Medicare enrollee with $50,000 of Social Security eligible ($47,565.20 against the $48,713 limit) while a non-enrollee with the same income stays ineligible, and Case 30 makes a household with heat in rent and no heating type ineligible. Heating-cost Case 15 gives a homeless household with no bedrooms no estimate. CI passed the six New Hampshire files ata7d76c39d8; the review fixes in 6e975b1 were not run locally, and CI runs the full suite.# Source conflict <jurisdiction>:<id>marker: pending. The federal-floor reading is recorded only as the unreviewed backlog itemus-nh:fap-income-floor-vs-smi-limitinsource_conflicts/candidates.yaml; this PR adds no rulespec-us register entry and no marker yet. The marker follows once a register entry merges and the pinned copy is refreshed.make formatchangelog.d/axiom: TheAxiomFoundation/rulespec-us#1903 queued
🤖 Generated with Claude Code