Skip to content

Add Alaska LIHEAP regular heating assistance - #10341

Merged
hua7450 merged 21 commits into
mainfrom
ak-liheap-wave2b
Oct 29, 2026
Merged

hua7450 merged 21 commits into
mainfrom
ak-liheap-wave2b

Conversation

@hua7450

@hua7450 hua7450 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Alaska's Heating Assistance Program (HAP) regular heating benefit, the state-administered federal LIHEAP component, for FY2027. The model counts citizens and qualified immigrants for household size, counts the income of every member, including members left out of household size, and follows the grant computation of 7 AAC 44.080 and manual 3004-5: Addendum A community oil or natural gas points, times a dwelling factor, times an income factor that falls from 100% to 50% of points across six bands up to 150% of the Alaska poverty guideline, plus one point for a household with a member aged 60 or older, under 6 or disabled. A household that shares its dwelling has its points reduced to its share of the dwelling's heating expenses before the income factor, and a subsidized household that pays heat directly has its points halved for its utility allowance after the vulnerable point. A household needs at least 2.0 points after both reductions; points then round half up, cap at 35 and pay $175 each. In FY2027, a 40-year-old living alone in a two-bedroom house in Juneau who pays $1,000 a year for fuel oil and earns $18,000 receives $700: $18,000 / 12 = $1,500 a month is above 75% ($1,246.875) and at or below 100% ($1,662.50) of the monthly guideline, so the household keeps 70% of Juneau's 5 oil points, 5 x 1.0 x 0.7 = 3.5 points round half up to 4, and 4 x $175 = $700.

Fixes #10335

Regulatory authority

The manual is served only over http, and DPA overwrites Addendum A, Addendum E and 3004-5 each season. The Wayback Machine holds only January 2, 2021 captures of those three pages (FY2021 content) and none from 2022 on, so no capture is linked.

Eligibility

Requirement Source How modeled
Alaska residence Manual 3002-1 A.1; 7 AAC 44.040(a)(1) defined_for = StateCode.AK
At least one citizen or qualified alien; household size counts only those members, and every member's income counts Manual 3002-1 A.1 and A.10 ak_hap_household_size adds is_citizen_or_legal_immigrant; a household with no counted member gets no income factor and no award. No five-year waiting rule applies.
Income at or below 150% of the Alaska guideline for the federal component Manual 3000 and 3004-5 step 3; Addendum E; 7 AAC 44.040(a)(4) ak_hap_income_factor is zero above the 150% band. It reads the Alaska poverty guideline with a one-year lag (the 2026 guideline for FY2027) and compares income with the exact percentage of the guideline, as 7 AAC 44.040(a)(4) and 44.080(i) state, without Addendum E's whole-dollar floors (see Not modeled and source conflicts). The manual's 225% household limit belongs to the state-funded AAHP, which this PR does not model.
Annual heating costs above $200 Manual 3002-1 A.1 and 3001-4 C; 7 AAC 44.040(a)(3) heating_expense for the primary fuel must exceed $200. When heat_expense_included_in_rent is true, annual pre_subsidy_rent is the heating cost.
Subsidized rental housing with no direct heating costs is ineligible Manual 3002-1 A.2 and 3007-1; 7 AAC 44.040(b)(4) Zero when heat is included in rent and either receives_housing_assistance or the household's is_in_public_housing is true
Households eligible for a tribal LIHEAP program are served by the tribe Manual 3002-1 A.2; Addendum A Zero in the 136 Census places routed to a tribal provider that serves all residents: 125 places whose Addendum A rows are all marked 0 (other than 0/USA bases), including Clark's Point, Lower Kalskag, Upper Kalskag, Nunam Iqua, Pitkas Point and St. Mary's after spelling fixes, and 11 unlisted places whose nearest listed community is marked that way (see Not modeled and source conflicts). Native-only tribal service is not inferred.
Households residing on a military base are ineligible 7 AAC 44.040(b)(3)(B); Addendum A Zero in four Census places (military_base_places.yaml): Eielson AFB CDP and Fort Greely CDP, which Census draws from the installations themselves and Addendum A marks 0/USA ("Service members living on base do not qualify"); Kodiak Station CDP, the housing area of Coast Guard Base Kodiak ("If Guard members live on base, in provided housing, they do not qualify"); and Eareckson Station CDP, which Census draws on Shemya Island around Eareckson Air Station, an Air Force installation that Addendum A does not list.
At least 2.0 heating points before rounding Manual 3004-5 step 5; 7 AAC 44.080(m) Points below 2.0 after the dwelling share and the utility-allowance reduction pay nothing
Heating fuel Manual 3004-5 step 1; 7 AAC 44.080(f) heating_type NONE and UNSPECIFIED pay nothing; callers must send heating_type (#9754). SOLAR and OTHER use oil points (see Benefit).

Countable income

Item Source How modeled
Income period Manual 3003-6; 7 AAC 44.040(c) Annual amounts stand in for gross receipts in the month before application and for the 12-month proration of self-employment, seasonal and irregular income
Earned income Manual 3003-1 A.1, 3003-4 and 3003-5 B.1.a Wages, military basic pay, self-employment (including SSTB), farm operations and partnership or S corporation income (earned_sources.yaml), each floored at zero, so a business loss does not offset other income. military_basic_pay is its own input outside employment_income and counts once. The net business inputs stand in for gross receipts less allowable costs. Manual 3003-4 B deducts 50% of gross self-employment income unless the household's actual costs are higher, so the net inputs overstate countable income when a business's actual costs are under half of its gross.
Student earnings 7 AAC 44.042(5); manual 3003-2 A(15) 7 AAC 44.042(5) exempts the wages of a full-time student under 18 who is not the head of household. The model excludes the wage sources listed in student_wage_sources.yaml (employment_income and military_basic_pay) of a member under 18 who is a full-time student (is_full_time_student) and not the tax-unit head (is_tax_unit_head, standing in for the head of household), when the SPM unit has a member 18 or older; that member's business and unearned income still count. A tax unit infers a head only among adults, so a minor in an SPM unit with no adult is treated as its head: a 17-year-old student who lives alone keeps $12,000 of wages in income. is_full_time_student treats any K-12 attendance as full time, because half-time enrollment is not observed. Manual 3003-2 A(15) instead covers students who live with a parent or adult household member and are enrolled at least half time in elementary or secondary school (candidate us-ak:hap-student-earnings-exemption, follows: statute).
Unearned income Manual 3003-1 B and 3003-2 A; 7 AAC 44.042(18) Each source floored at zero: Social Security (gross), SSI, Adult Public Assistance (ak_ssp), pensions, military retirement pay and military survivor annuities (military_retirement_income), retirement distributions, railroad retirement, survivor, veterans and disability benefits, total unemployment compensation, workers' compensation, strike benefits, alimony, child support received, interest, ordinary dividends, estate income, capital gains and gambling winnings. Rental and farm rental income are each floored at zero. ATAP counts once per SPM unit through tanf, so only received amounts count. general_assistance is not counted: it stands for State General Relief Assistance (7 AAC 38.030), which 7 AAC 44.042(18) exempts. BIA General Assistance paid to the household, which plan item 1.9 and manual 3003-1 B.6.o count, has no separate input.
Cash gifts 7 AAC 44.042(16); manual 3003-1 B.6.r and 3003-2 A(24) financial_assistance (cash from friends or relatives outside the household) stands in for gifts: a person's amount at or under $20 a month, measured as the annual amount divided by 12, is excluded; more than $20 counts in full. A single adult with $14,800 of wages and $20 a month of gifts keeps the 0.8 factor ($1,233.33 a month) and receives $1,400 in Fairbanks.
Exclusions and deductions Manual 3003-1 and 3003-2 The Permanent Fund Dividend, Senior Benefits, SNAP and in-kind or vendor payments do not count. No earned-income, medical, child care or support-paid deduction applies.

Benefit

  • Community points (manual 3004-5 step 1; Addendum A; 7 AAC 44.080(f)): fuel oil and electricity use oil points under the manual, propane, steam and hot water under 7 AAC 44.080(f), and kerosene by inference (see below). SOLAR uses oil points, because heating_expense reads a solar household's bill as grid electricity. OTHER uses oil points as the stand-in for steam, hot water and gasoline for a vehicle used as a home, which have no heating_type value. Natural gas uses gas points; wood and coal use 0.8 times oil points. Points attach to place_fips, and both tables cover all 355 Census places in the 2025 gazetteer. Oil: 279 direct matches, including the Anchorage municipality at Anchorage's 8 points and 16 spelling variants (for example Adak city for Adak (Station), St. Paul city for Saint Paul and Tenakee Springs city for Tenakee), 4 places that take the main community Addendum A lists for their ZIP code (Chena Ridge and Goldstream take College's 10 for ZIP 99709; Covenant Life and Mosquito Lake take Haines's 6 for ZIP 99827, under which Addendum A also lists Excursion Inlet and Klukwan), and 72 places that take the points of the nearest listed oil community (Meadow Lakes takes Wasilla's 7). Oil points follow FY2027 Addendum A except Loring (5) and Tetlin (16), which follow Appendix A to 7 AAC 44 under 7 AAC 44.080(a); Addendum A lists them at 4 and 12. Natural gas: 25 direct matches and 330 nearest-gas-community approximations. A place code outside the gazetteer, or no place code, pays nothing.
  • Dwelling factor (manual 3004-5 step 2; 7 AAC 44.080(g)): callers set the new ak_hap_dwelling_type input to the first matching category: mobile home or boat with 980 or more heated square feet 1.4; RV, tent or pickup camper 0.4; studio, hotel or boarding room 0.15; boat under 980 heated square feet 0.35; one-bedroom dwelling 0.55; house with three or more bedrooms 1.3; two-bedroom unit in a building of four or more units, or a mobile home under 980 heated square feet, 0.7; two-bedroom house 1.0, the default.
  • Shared dwellings (7 AAC 44.080(h) and 44.900(11); manual 3004-5 step 2): when a physical household holds more than one SPM unit, each SPM unit's points after the dwelling factor are multiplied by its share of the household's heating expenses, before the income factor. The vulnerable point is added after the share. Two Fairbanks households that pay $300 and $900 of a $1,200 oil bill receive 10 x 0.25 = 2.5 points plus 1 vulnerable point = 3.5, rounded to 4 ($700), and 10 x 0.75 x 0.6 = 4.5, rounded to 5 ($875). 7 AAC 44.900(11) counts heat paid indirectly through rent as a home heating cost, but the heat portion of rent is not observed, so manual 3002-1 A.5 fills the gap: an SPM unit with heat included in rent and no heating bill gets an equal share among the units with a positive sole-household award, never more than 50%, and the units that report bills split the rest in proportion to their bills. When no SPM unit reports a bill, each gets the equal share. An SPM unit with heat included in rent that also reports a heating bill is a bill payer and shares by its bill. A Fairbanks two-bedroom house shared by a 40-year-old who pays a $1,200 oil bill and a 65-year-old with heat in a $6,000 rent gives each half: 10 x 0.5 = 5 points ($875) and 5 + 1 = 6 points ($1,050). If instead the renter is 40 and also reports a $600 oil bill, the shares are 600 / 1,800 and 1,200 / 1,800: 10 x 1/3 = 3.33 points, rounded to 3 ($525), and 10 x 2/3 = 6.67, rounded to 7 ($1,225).
  • Income factor (manual 3004-5 step 3; Addendum E; 7 AAC 44.080(i)): 1.0, 0.9, 0.8, 0.7, 0.6 and 0.5 for income at or below 25%, 50%, 75%, 100%, 125% and 150% of the guideline, with inclusive band tops at the exact percentages. The factor is restored to one decimal place before multiplication so exact half points round up.
  • Vulnerable point (manual 3004-5 step 4 and 3000-2; 7 AAC 44.080(k)): one point when any counted member is 60 or older, under 6 or disabled (is_disabled); several vulnerable members still add one point.
  • Utility allowance (7 AAC 44.080(l); manual 3004-5 step 8): an SPM unit in subsidized housing (receives_housing_assistance or is_in_public_housing) whose heat is not included in rent has its points halved after the vulnerable point and before the 2.0 minimum and rounding, whatever the allowance amount. Public housing agencies set allowances for utilities that tenants buy directly (24 CFR 965.502(a) and 982.517(a)(1)), so the model infers the allowance and does not read hud_utility_allowance. A Juneau household with 3.0 points falls to 1.5 and receives nothing; a Fairbanks household with 7 points falls to 3.5, rounded to 4 ($700).
  • Award (manual 3004-5 steps 5 to 7; 7 AAC 44.080(m) to (o)): at least 2.0 unrounded points, rounded half up to a whole point, capped at 35 and paid at $175 a point, so the largest award is 35 x $175 = $6,125 and the smallest 2 x $175 = $350, the range FY2026 plan item 2.6 lists. The cap applies after the dwelling share. The award is not capped at the heating bill. ak_hap_base_benefit holds the sole-household award, without the dwelling share or the utility-allowance reduction.

Years covered

Model year Program year Guideline One-person limit
2027 FY2027, October 1, 2026 to September 30, 2027 2026 $2,493.75 a month ($29,925 a year)

The registry entry records verified_years: "2027". Earlier model years reuse the FY2027 parameters with the earlier guideline and are unverified historical estimates. The PR adds AK to the LIHEAP coverage line in programs.yaml.

Not modeled and source conflicts

  • Shared dwellings and the utility allowance follow 7 AAC 44.080(h) and (l) to (n), which reduce heating points before the 2.0 minimum and rounding. Manual 3002-1 A.5 instead divides each household's dollar award equally among the eligible households, at most 50% each, regardless of what each pays, and manual 3004-5 step 8 halves the dollar award. Under the manual, ak_hap.yaml Case 2 would pay $962.50 and $525 and Case 7 $262.50. 7 AAC 44.035(c) gives a second regulatory reading of sharing: each household receives the percentage of its sole-household dollar award equal to its share of the heating cost, $481.25 and $787.50 in Case 2. source_conflicts/candidates.yaml records both choices as us-ak:hap-shared-household-allocation and us-ak:hap-utility-allowance-order, with follows: statute. Draft Register Alaska HAP sharing conflict and unshipped proposals TheAxiomFoundation/rulespec-us#1846 proposed a register entry under the first id with the manual's reading; this PR does not depend on it.
  • In the equal-split gap-fill, only SPM units with a LIHEAP award count as eligible households. A co-resident household eligible only for the state-funded AAHP is left out of the count, so a LIHEAP household sharing a heat-in-rent dwelling with two AAHP households receives half its points, where manual 3002-1 A.5 would give one third. With reported bills, an AAHP household's bill still counts in the dwelling total.
  • Addendum E prints $407 for the one-person 25% ceiling. 25% of the 2026 monthly guideline is $415.625 ($19,950 / 12 = $1,662.50, x 0.25), and the model uses that exact amount ($4,987.50 a year); $407 matches the 2025 guideline. Addendum E's other 161 cells (18 household sizes by 9 bands, including the three AAHP bands) floor the 2026 monthly guideline and then each percentage. source_conflicts/candidates.yaml records the cell as us-ak:hap-one-person-lowest-income-limit, with follows: statute.
  • Four more choices follow 7 AAC 44 over the manual or the agency tables and are recorded with both sides quoted (follows: statute): Loring's oil points, 5 in Appendix A to 7 AAC 44.080(a) and 4 in Addendum A, so a Loring adult with no income, a two-bedroom house and an oil bill receives $875 rather than $700 (us-ak:hap-loring-oil-points; Tetlin, 16 against 12, is routed to its tribe either way); exact income limits rather than Addendum E's whole-dollar floors, which put 23 of its 108 LIHEAP-band limits $1 below the exact percentage, so a four-person household with $5,156 a month is within 150% ($5,156.25) rather than over Addendum E's $5,155 (us-ak:hap-income-limit-rounding); general_assistance, left out of income as General Relief Assistance under 7 AAC 44.042(18), although plan item 1.9 counts General Assistance paid directly to the household (us-ak:hap-general-relief-assistance); and the student earnings test above (us-ak:hap-student-earnings-exemption).
  • SPM units stand in for the manual's economic households. Owner-occupant and room-renter arrangements, shared custody and the one-benefit-per-season rule are not modeled. is_disabled stands in for the manual's legal disability categories and is_citizen_or_legal_immigrant for qualified-alien categories. Annual income stands in for prior-month receipts. Generic dividends include Alaska Native corporation (ANCSA) dividends, which the manual exempts; the inputs cannot separate them. military_basic_pay holds base pay only; the subsistence and housing allowances that manual 3003-5 B.1.a counts when paid to the household have no input.
  • The utility-allowance inference treats every subsidized household that pays heat directly as receiving an allowance. Housing step-down exceptions that end the allowance and low-income housing tax credit units without a voucher are not identified.
  • Wood and coal use the purchased-fuel factor of 0.8 as an approximation, because heating_type cannot identify self-harvested fuel (0.5) or wood pellets (0.9); households using those fuels can receive different amounts. Kerosene uses oil points, an inference from the guide that describes kerosene as Grade 1 heating oil; the manual lists kerosene as a fuel without assigning points. OTHER covers any fuel heating_type does not name, so a household under OTHER with a fuel the rules do not put on oil points also receives oil points.
  • The oil and natural gas crosswalks use great-circle distances between Census internal points and are not state-issued. The four ZIP-assigned places (see Benefit) take the main community of Addendum A's ZIP listing instead; Covenant Life and Mosquito Lake take Haines (*/THRHA, Alaska Natives only), so they are state-served. Approximated places inherit the all-resident tribal routing of the community whose points they take; Lutak, 16.6 km from Klukwan (all residents) and 18.1 km from Haines (Alaska Natives only), is the closest call, and Deltana, nearest Fort Greely (0/USA), stays state-served. Addendum A lists English Bay at 19 oil points and Nanwalek, the same village, at 8; the table keeps Nanwalek CDP's 8.
  • A household without a place code gets no points; the model has no borough fallback. Residents of Eielson AFB CDP and Fort Greely CDP receive $0 under 7 AAC 44.040(b)(3)(B), because Census draws both places from the installations, as do residents of Kodiak Station CDP, the Coast Guard base's housing area, and Eareckson Station CDP, which Census draws around Eareckson Air Station on Shemya Island. Elmendorf AFB and Fort Richardson, also 0/USA, lie inside the Anchorage municipality with no separate Census place, so their residents cannot be identified.
  • Native-only tribal service, interagency agreements, institutions, dormitories, temporary shelters under 60 days, house sitters, vendor credit balances and overpayment recoupment are not modeled. Callers must send heating_type; UNSPECIFIED pays nothing.
  • This PR models regular heating assistance only. Crisis assistance, cooling, weatherization and heating-equipment repair are out of scope, as are the state-funded AAHP (above 150% and up to 225% of the guideline at $130 a point) and Subsidized Rental Housing Utility Deposits.

Test plan

  • 5 YAML files with 165 cases under policyengine_us/tests/policy/baseline/gov/states/ak/dpa/hap/ (ak_hap.yaml 18, ak_hap_base_benefit.yaml 87, ak_hap_countable_income.yaml 33, ak_hap_household_size.yaml 4, ak_hap_income_factor.yaml 23); expected values are hand computed from 7 AAC 44.080, the manual's grant steps and Addendums A and E in case comments. ak_hap.yaml Cases 2 to 5 and 8 to 10 pin the dwelling share and the equal-split gap-fill (Case 2 pays $700 and $875; Case 9 shares 49 points before the cap, $4,375 and $2,100), and Cases 6, 7, 13, 15 and 16 pin the inferred utility allowance: 10 points halve to 5 ($875), 3.0 to 1.5 ($0), 7 to 3.5 ($700) and 4 to exactly 2.0 ($350). Case 6 also pins the sole-household fallback: a lone heat-in-rent household keeps its full $1,750. Case 17 pins a mixed dwelling: a $1,200 oil-bill payer and a heat-in-rent 65-year-old each take half, $875 and $1,050. Case 18 pins the bill test for heat-in-rent units: a heat-in-rent unit that also reports a $600 oil bill shares by its bill with a $1,200 bill payer, $525 and $1,225 (as an equal-share heat-in-rent unit it would get $875 and the payer $525). ak_hap_base_benefit.yaml Case 65 pays Anchorage fuel oil $1,400, Case 81 an elderly Anchorage household with electric heat $700, Case 84 Meadow Lakes $1,225 and Case 85 Mertarvik $0 through its inherited tribal routing; Case 22 pays Loring's 5 Appendix A points ($875); Cases 58 and 86 pay Fort Greely CDP, Eielson AFB CDP, Kodiak Station CDP and Eareckson Station CDP $0; Case 87 pays Covenant Life CDP Haines's 6 points ($1,050) and Chena Ridge CDP College's 10 ($1,750); Cases 68 and 69 pay OTHER and SOLAR $1,750; Case 82 keeps a $20 monthly gift out of income ($1,400) and Case 83 counts $40,000 of military basic pay ($0). Base Cases 42 to 47 and income factor Cases 6 to 21 pin the exact limits for one, two and 18 people, each at the limit and $0.12 a year above it, and income factor Case 23 keeps a four-person household with $5,156 a month in the 150% band (factor 0.5). ak_hap_countable_income.yaml Case 25 excludes $20 monthly gifts, and Cases 16 and 18 add railroad benefits ($5,400) and gambling winnings ($1,080). Case 10 excludes a 17-year-old full-time college student's $12,000 of wages and $1,200 of National Guard drill pay (military_basic_pay) but counts $2,000 of self-employment income ($26,000), and Case 13 counts the $12,000 of wages of a 17-year-old student who lives alone with no supplied tax-unit role ($12,000). Cases 31 and 32 exclude a 16-year-old full-time student's $6,000 of wages when a parent heads the tax unit ($24,000) and count them when the student heads a tax unit ($30,000), and Case 33 leaves $1,200 of general_assistance out of income ($10,000). At d0643d4578, CI ran the five Alaska test files and they passed; this round's fixes were not run locally, and CI runs the full suite.
  • YAML tests whose expected values come from an external source (statute, official form or worksheet, official calculator)
  • Source-conflict register entry and # Source conflict <jurisdiction>:<id> marker: pending. source_conflicts/candidates.yaml records seven backlog items, all follows: statute and unreviewed: us-ak:hap-shared-household-allocation, us-ak:hap-utility-allowance-order, us-ak:hap-one-person-lowest-income-limit, us-ak:hap-loring-oil-points, us-ak:hap-income-limit-rounding, us-ak:hap-general-relief-assistance and us-ak:hap-student-earnings-exemption. This PR adds no rulespec-us register entry and no marker yet.
  • make format
  • Changelog fragment in changelog.d/

axiom: TheAxiomFoundation/rulespec-us#1901 queued

🤖 Generated with Claude Code

hua7450 and others added 3 commits October 23, 2026 22:46
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
@hua7450
hua7450 marked this pull request as ready for review October 24, 2026 03:00
@codecov

codecov Bot commented Oct 24, 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 (e3a66e7).
⚠️ Report is 732 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10341   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         6    +2     
  Lines           76       141   +65     
  Branches         2         3    +1     
=========================================
+ Hits            76       141   +65     
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.

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

DTrim99 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Alaska LIHEAP regular heating assistance

PR #10341 (author: hua7450), head 6d826ceb31. This is a first review. The PR adds the regular heating benefit of Alaska's Heating Assistance Program (HAP), the federal LIHEAP component run by the Division of Public Assistance, for FY2027 (model year 2027). It includes:

  • 21 parameter files and 6 variables (one new input, ak_hap_dwelling_type);
  • 5 test files (150 cases: ak_hap 14, base benefit 80, countable income 30, household size 4, income factor 22);
  • a programs.yaml entry (coverage line and state block);
  • two source_conflicts/candidates.yaml entries;
  • a changelog fragment.

The PR has no reviews and no comments apart from Codecov. It touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/ak/dpa/hap/
  • V/ = policyengine_us/variables/gov/states/ak/dpa/hap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/ak/dpa/hap/

Sources read for this review:

Summary

What is right. The benefit mechanics follow the manual closely:

  • Grant steps. Community points × dwelling factor × income factor, plus one vulnerable point, a 2.0-point minimum before rounding, half-up rounding, a 35-point cap and $175 a point all match 3004-5 steps 1-7. The eight dwelling factors match step 2 as revised by the transmittal (small mobile homes at 0.7, boats under 980 sq ft at 0.35).
  • Income bands. The lagged 2026 Alaska guideline, floored monthly and then floored per band, reproduces 161 of Addendum E's 162 cells. The one exception, the one-person 25% cell, follows the 25% rule ($415) over a stale printed $407. Band tops are inclusive ("no more than"). The 150% limit is above the 110% floor and within the 8624(b)(2)(B) ceiling.
  • Points. All 262 oil and 22 directly matched gas values agree with Addendum A. Fuel oil, electricity and propane use oil points (step 1; 7 AAC 44.080(f)), and kerosene does by inference.
  • Income. Social Security counts gross, as 3003-1 B.2.c and plan 1.9 require. Losses are floored per source and per person. ak_ssp (Adult Public Assistance), SSI, ATAP (once, through tanf), military_retirement_income, railroad_benefits and total_unemployment_compensation are listed. The PFD and Senior Benefits are excluded. Student earnings and the income of non-qualified members are handled as the manual says.
  • Tests and CI. I hand-checked 24 expectations, and all match the head. CI ran all five YAML files green.
  • Guards. The Integrate modeled state unemployment insurance into income flows #9558, Count military SBP annuities in state benefit income lists #10317 and Count each Social Security benefit once in Pennsylvania CCW countable income #10408 patterns pass on the merged tree, and the NH Add New Hampshire state supplementation for 2026 #10156 key pattern is safe.

There are two critical findings:

  • C1. CI failure caused by the PR. Rest (Python shard 3) fails test_conflict_sounding_comments_do_not_grow on this PR's own P/benefit/maximum_shared_household_share.yaml. The body expects it.
  • C2. Gifts of exactly $20 a month. The head counts them in full, although 7 AAC 44.042(16) exempts gifts that "do not exceed" $20 and manual 3003-1 B.6.r counts only gifts "over $20". Countable Case 25 pins it. In one example the award falls from $1,400 to $1,225.

There are five should-address items:

  • S1. Manual over regulation. The shared-dwelling split and the utility-allowance order follow the manual against 7 AAC 44.035(c), 44.080(h) and (l)-(n). The PR records both only as unreviewed candidates labelled follows: conflicting-source. Four smaller differences are not recorded at all.
  • S2. Missing geography. 93 of 355 Census places have no oil points and no tribal routing, so oil, electric, propane, kerosene, wood and coal households there get $0. They include Anchorage, eight listed communities the name match missed, and large Fairbanks and Mat-Su CDPs.
  • S3. OTHER fuel. OTHER households with a bill get $0, although steam and hot water use oil points under 7 AAC 44.080(f) and step 1.
  • S4. Untested entries. railroad_benefits and gambling_winnings have no test that would fail if they were dropped.
  • S5. Military basic pay. military_basic_pay is omitted, although 3003-1 A.1 and 3003-5 count military pay.

There are also nine suggestions: G1 heat in rent with UNSPECIFIED fuel; G2 the utility-allowance proxy; G3 the self-employment standard deduction; G4 AAHP households in the sharing count; G5 SOLAR; G6 the missing-place default and military bases; G7 recording and pinning; G8 wording; G9 merge housekeeping.

Status.

  • CI: 32 pass and 2 fail: Rest (Python shard 3) and its aggregator. The failure is C1.
  • Branch: 14 commits ahead of main and 67 behind. It conflicts with main in programs.yaml (branch note).

Critical (must fix)

C1. CI fails on this PR's own file: the source-conflict ratchet flags maximum_shared_household_share.yaml

  • The failure. Run 40057978418 (head 6d826ceb31, October 24) fails job "Full Suite - Rest (Python shard 3)" with one test, test_source_conflicts.py::test_conflict_sounding_comments_do_not_grow. The log reads: "These files gained comments that read like a conflict between sources, with no # Source conflict <jurisdiction>:<id> marker ... Files and counts: {'policyengine_us/parameters/gov/states/ak/dpa/hap/benefit/maximum_shared_household_share.yaml': 1}". The summary line is "1 failed, 2607 passed, 11 skipped". The "Check Rest Python shards" aggregator fails because of it.
  • Where: P/benefit/maximum_shared_household_share.yaml:5: "This conflicts with 7 AAC 44.035(c) actual-cost sharing".
  • Not a known main-caused failure. The file listed is this PR's, not an FL/SD LIHEAP file. The Montana AGI test passed in this run, and its fix (Check Montana's pension exemption in the Montana AGI pooling test #10496) is now on main. The ratchet's logic has not changed on main since the merge base, only its KNOWN_UNMARKED counts, so it fails the same way on the merged tree.
  • The body expects it. "the source-conflict code-health check (test_source_conflicts.py) is expected to flag the comment in maximum_shared_household_share.yaml". An expected failure is still a red required check.
  • Severity: critical (a real CI failure caused by the PR).
  • Fix: resolve S1 first, because it decides what this line says. Then do one of these:
    • Register the entry (merge rulespec-us#1846, refresh the pin, add # Source conflict us-ak:hap-shared-household-allocation in the parameter and in V/ak_hap.py, and delete the candidate).
    • Or reword the comment so it no longer reads as a conflict, and keep the candidate as the record.

C2. A cash gift of exactly $20 a month is counted in full, although the regulation exempts it and the manual counts only gifts over $20

  • Where:
    • V/ak_hap_countable_income.py:60-61: where(gifts / MONTHS_IN_YEAR < p.gift_exemption_threshold, 0, gifts), a strict <.
    • P/income/gift_exemption_threshold.yaml:1: "excludes cash gifts strictly below this monthly amount".
    • T/ak_hap_countable_income.yaml Case 25 (line 743, "regular cash gifts at twenty dollars monthly count in full") pins $240 a year as countable. The Axiom issue's interpretation 8 notes the regulation's wording but keeps the strict reading.
  • Sources:
    • 7 AAC 44.042(16) (binding): the department "will not include as part of a household's gross monthly income ... cash gifts that do not exceed a total of $20 per month per individual in the household". Exactly $20 does not exceed $20.
    • Manual 3003-1 B.6.r counts "Cash gifts over $20 per person, per month". So $20 is not countable.
    • Manual 3003-2 A.24 ("Cash gifts under $20 per person per month are non-countable") and plan 1.9 ("Cash gifts under $20") do not address exactly $20.
    • So every source that speaks to $20 exempts it. The manual's own sections fit together only if $20 is exempt. Manual 3000 itself says LIHEAP "is authorized under ... 7 AAC 44.010 – 7 AAC 44.090".
  • Effect (hand-traced; FY2027, Fairbanks oil 10, one person aged 40, two-bedroom house, wages $14,800, financial_assistance $240, oil bill $1,500):
    • Head: $15,040 = $1,253.33 a month, which is over the 75% ceiling of $1,246, so factor 0.7: 7 points × $175 = $1,225.
    • Rule: $14,800 = $1,233.33 a month, so factor 0.8: 8 points = $1,400.
  • Severity: critical. It is a wrong result in the claimed year against the binding regulation, and a test pins it. It is a rare boundary, but as in Wyoming Add Wyoming LIHEAP regular heating assistance #10346 C1 the review rules count a wrong result in a claimed year as critical however rare the case. A reading that agrees with every source exists.
  • Fix: use <= (exempt a gift at or under $20). Reword the description ("at or below this monthly amount") and cite 7 AAC 44.042(16) and 3003-1 B.6.r next to A.24. Re-pin Case 25 to $0, and update interpretation 8 of rulespec-us#1901.

Should address

S1. The shared-dwelling split and the utility-allowance order follow the manual against 7 AAC 44, and four smaller manual choices are not recorded

  • Where:
    • V/ak_hap.py:31-38 divides each SPM unit's dollar award by the number of SPM units with a positive award, at most 50%. V/ak_hap.py:46-56 halves the rounded dollar award for subsidized households with a utility allowance.
    • P/benefit/maximum_shared_household_share.yaml and P/benefit/utility_allowance_reduction.yaml call these an "Approved manual-based convention".
    • source_conflicts/candidates.yaml adds both conflicts with follows: conflicting-source and state: unreviewed. The file's header defines that label as "against the statute; the 2026-10-19 rule calls for a model change".
  • The regulation (binding).
    • Sharing. 44.035(c): the department will "pay the household a percentage of that household's award equal to the percentage of the total heating cost for the dwelling that the household actually pays". 44.080(h) instead reduces "the heating cost points ... to the household's proportionate share of the home heating expenses" before the income factor (i), the 2.0 minimum (m) and rounding (n).
    • Utility allowance. 44.080(l) reduces "the heating cost points determined under (a) - (k) ... by 50 percent", and (m) applies the 2.0 minimum to points "determined under (a) - (l)".
    • The manual. 3002-1 A.5 says "The amount each household contributes to heat or rent is not considered", and 3004-5 step 8 halves the "total benefit". Its own step 2 still says points "are reduced to the household's proportionate share of the home heating expenses", like 44.080(h).
  • The plan points the same way. FY2026 plan 2.6 (p. 10) states a minimum benefit of $350, which is 2 points × $175. The regulation's points-stage order produces that minimum. The head pays less: $262.50 in T/ak_hap.yaml Case 7 and $131.25 in Case 8.
  • Why this is a should.
  • Effect (hand-traced; FY2027):
    • Utility allowance. Case 7 (Juneau oil 5, wages $24,000, 3.0 points, subsidized with an allowance): head $262.50; rule: 1.5 points, under 2.0, so $0. A Fairbanks household at factor 0.7 (7 points): head $1,225 × 0.5 = $612.50; rule: 3.5 points, rounded to 4, so $700.
    • Sharing. Case 2 (Fairbanks; bills of $300 and $900, so 25% and 75%): head $962.50 and $525. Under 44.035(c): $481.25 and $787.50. Under 44.080(h): unit 1 gets 2.5 + 1 = 3.5 points, rounded to 4 ($700), and unit 2 gets 7.5 × 0.6 = 4.5, rounded to 5 ($875). The regulation is itself split between (c) and (h), so the register entry has to pick one.
  • Unrecorded smaller choices (manual or agency table over 7 AAC 44, none in candidates.yaml):
    • (a) Loring points. The PR uses 4 (Addendum A), while Appendix A to 44.080(a) prints 5. The oil table comment says they "disagree". Tetlin (12 against 16) is routed to its tribe, so it doesn't matter.
    • (b) Income-limit rounding. Addendum E floors the monthly guideline before each percentage. That puts 23 of the 108 LIHEAP-band cells $1 below the regulation's exact percentage. For example, 150% for four people is $5,155 against 1.5 × $3,437.50 = $5,156.25.
    • (c) General Relief Assistance. 44.042(18) exempts GRA payments. general_assistance is counted, following plan 1.9 and manual 3003-1 B.6.o ("General Assistance ... if paid directly").
    • (d) Student earnings. 44.042(5) exempts wages of "a full-time student under 18 years of age who is not the head of household". The PR follows 3003-2 A.15 (at least half-time, elementary or secondary school).
  • Fix (recommended):
    • Follow the regulation for sharing and the utility allowance: reduce points before the minimum and rounding. Each SPM unit's own heating_expense share of the dwelling total is available for 44.080(h).
    • Or take the manual reading to the project lead and record the ruling (state: ruled) in the register, with markers. That also clears C1.
    • Either way, add (a)-(d) as candidates or a body table that cites both sides, and update the body and the Axiom issue.

S2. 93 of 355 Census places have no oil points and no tribal routing, so non-gas households there get $0, including all of Anchorage

  • Where:
    • P/benefit/community_points/oil.yaml has 262 places. Its comment says "unknown or ambiguous places are absent" and "Anchorage oil is ambiguous".
    • V/ak_hap_base_benefit.py:27-29 sends any other place to UNAVAILABLE (0 points), and :96 then denies the household.
    • The gas table, by contrast, gives all 355 places a value: 25 direct matches and 330 nearest-community approximations.
    • T/ak_hap_base_benefit.yaml Case 65 (line 2066) pins Anchorage fuel oil at $0, and Case 63 pins an unmatched place at $0.
  • What is missing (gazetteer against the oil and tribal tables):
    • Anchorage municipality (03000). Addendum A lists Anchorage at 08/05. Every other listed community inside the municipality (Eagle River, Girdwood, Eklutna, Indian, Peters Creek, Portage, Elmendorf, Fort Richardson) is also 8. Only Chugiak is 07. That is about 291,000 people in the 2020 Census, roughly 40% of Alaskans.
    • Eight listed communities the name match missed: Adak (Station) 6, Chenega Bay 8, Kenny Lake (Tonsina) 11, Naukati 6, Saint George 11, Saint Michael 23, Saint Paul 11 and Tenakee 7. Their Census names differ ("Adak city", "St. Paul city", "Naukati Bay CDP", "Tenakee Springs city"). All are state-served (/) or tribe-served for Natives only (*).
    • About 80 CDPs not named in Addendum A, whose residents apply under their postal community. They include the Fairbanks North Star suburbs (Badger, Chena Ridge, Farmers Loop, Goldstream, Steele Creek), the Mat-Su CDPs (Meadow Lakes, Tanaina, Gateway, Fishhook, North Lakes, South Lakes, Lazy Mountain, Butte) and the Kenai Peninsula CDPs (Kalifornsky, Salamatof, Funny River, Diamond Ridge). Fuel oil heats many homes in these areas.
    • Related: the tribal list misses six all-resident places for the same naming reason: Clark's Point, Lower Kalskag, Upper Kalskag, Nunam Iqua, Pitkas Point and St. Mary's. Today that is masked for oil, because those places have no oil points either, but a gas household there is paid.
  • The rule. 3004-5 step 1 assigns every household its community's points ("Heating cost points are assigned to each community in the state"). Electricity, oil, propane, steam and hot water use the oil column (step 1; 7 AAC 44.080(f)), and purchased wood and coal use 0.8 of it. Addendum A is keyed by ZIP code, so every address has a row.
  • Effect (hand-traced; FY2027, Anchorage, one person aged 70, Social Security $18,000, one-bedroom apartment, electric heat with a $1,200 bill): $1,500 a month gives factor 0.7, so 8 × 0.55 × 0.7 = 3.08 + 1 = 4.08 points, rounded to 4: $700. The head pays $0. Anchorage is */CITC (Natives only), so DPA serves this household.
  • Severity: should. Households the rules pay get $0 in the claimed year with ordinary inputs, and a test pins it. This matches Wyoming Add Wyoming LIHEAP regular heating assistance #10346 S1 and Add Montana LIHEAP regular heating assistance #10435 S4, here on a statewide scale.
  • Fix:
    • Map 03000 to 8. Chugiak's 7 is a small documented approximation.
    • Fix the name matching (St./Saint, and the Station, Bay, Springs and Kenny Lake variants).
    • Give unlisted places an oil value the same way gas already gets one: the nearest listed community or, better, a ZCTA-to-place crosswalk on Addendum A's ZIP codes.
    • Add the six tribal places to P/benefit/tribal_service_places.yaml before extending oil coverage. Then re-pin Case 65.

S3. OTHER households with a heating bill get $0, although steam and hot water use oil points

  • Where: V/ak_hap_base_benefit.py:49-56 gives OTHER the default=0. T/ak_hap_base_benefit.yaml Case 68 (line 2156) pins Fairbanks OTHER with a $1,000 other_heating_fuel_expense at $0.
  • Sources:
    • 7 AAC 44.080(f): "If a household uses electricity, steam, hot water, or propane for heat, the department will use the community heating cost points for oil".
    • 3004-5 step 1: "If the household primarily uses steam for heat, regardless of how the steam is produced, use the community heating cost points for oil", and the same for gasoline used to heat a vehicle lived in for 60+ days.
    • On main, heating_type has no steam or hot-water value, so these households can only be OTHER. heating_expense reads their bill from other_heating_fuel_expense.
  • Effect: Case 68's household would get 10 oil points, so $1,750 instead of $0.
  • Severity: should, as in Wyoming Add Wyoming LIHEAP regular heating assistance #10346 S1 and Maine Add Maine HEAP Fuel Assistance #10437 S3 (an OTHER-fuel household with its own bill at $0).
  • Fix: map OTHER to oil points, and document that it stands for the steam, hot-water and vehicle-gasoline cases the rules put on oil. Or keep $0 with an explicit body justification. Re-pin Case 68 either way.

S4. Two income-source entries have no test that would fail if they were dropped

  • Where: P/income/unearned_sources.yaml:10 (railroad_benefits) and :24 (gambling_winnings). No case in the five test files gives either a positive value.
  • Sources: 3003-1 B.6.c counts "Annuities, pensions, retirement, and disability benefits", and 3000-2 names Railroad Retirement Act annuities. B.6.n counts "Bingo and lottery winnings".
  • Tested (positive inputs that set the expected value): the other 19 unearned entries, all four business sources (partnership and S corporation through their components, countable Case 4), both rental sources and gifts. All the eligibility and benefit branches are pinned.
  • Severity: should (the mutation rule; Add Nevada Energy Assistance Program Fixed Annual Credit #10432 S1, Add Wisconsin WHEAP regular heating benefit #10434 S1, Add Wyoming LIHEAP regular heating assistance #10346 S3).
  • Fix: add a positive case for each, for example to countable Case 16 (retirement) and Case 18 (other receipts).

S5. Military basic pay is not counted, although the manual counts military pay as earned income

  • Where: earnings are only employment_income plus P/income/business_sources.yaml. The comment in P/income/unearned_sources.yaml says "Military wages must be reported once in employment income; its separate tax subset inputs are not added."
  • Sources:
    • 3003-1 A.1 includes "military pay" in earned income.
    • 3003-5 B.1.a: "payments and allowances shown in the Entitlements section of the LES will be considered earned income ... base pay, or basic pay, basic allowance for subsistence (BAS) ... and basic allowance for housing (BAH)" (the housing allowance when received directly off base).
  • main: military_basic_pay is a separate person input outside employment_income. The merged Iowa LIHEAP sibling (ia/hhs/liheap/income/sources/earned.yaml), Oregon ERDC, Georgia CAPS and the Washington senior exemption list it next to employment_income. The Virginia and Indiana tax subtractions treat it as part of wages, so the convention on main is split. The PR takes the tax view.
  • Effect (hand-traced; FY2027, one person aged 30, military_basic_pay $40,000, Fairbanks oil, two-bedroom house): head $1,750 (zero income). Counted, $40,000 is over the $29,916 limit, so $0.
  • Severity: should, as in Utah Add Utah LIHEAP regular heating assistance #10344 S2 (the same omission and the same documentation). Documenting the gap does not change the result.
  • Fix: add military_basic_pay to the earned sources, floored, as Iowa does. State in the parameter comment that military pay is entered once, add a case, and update interpretation 6 or 7 of rulespec-us#1901.

Suggestions

G1. Heat in rent with UNSPECIFIED fuel pays $0.

  • Why. main's heating_type documentation says UNSPECIFIED "is also the right value when heat is included in rent and the fuel is unknown". The head pays heat-in-rent households only when a fuel is given (Cases 50-53, 80), and Case 70 pins UNSPECIFIED at $0.
  • Context. The state does ask for the fuel type (3001-4 C), so this is a data gap rather than a rule. But it also zeroes the program for every household without a fuel type, for example microdata without an imputed heating_type.
  • Fix: consider oil points for heat in rent with UNSPECIFIED fuel (the oil column covers electricity, oil, propane, steam and hot water), or gas points where the place has a direct gas listing. Document the choice.

G2. The utility-allowance reduction never applies by default.

  • Why. hud_utility_allowance computes zero for Alaska, so a subsidized household that pays its heat directly keeps the full award unless the caller supplies an allowance. HUD gives a utility allowance for tenant-paid utilities in public housing and vouchers (24 CFR 965.502, 982.517).
  • Fix: infer the step 8 condition for HUD-assisted tenants who pay heat directly, or state the overstatement in the body.

G3. Self-employment cost basis.

  • Why. 3003-4 B makes the 50% standard deduction the default; actual costs apply only "if the household believes their costs were more than 50% of their gross earnings". Net inputs therefore overstate countable income for businesses with costs under half of gross. The body's "no second 50% standard expense deduction" understates that.
  • Fix: say which way the approximation errs. Precedent: Add Nevada Energy Assistance Program Fixed Annual Credit #10432 S2, where the departure was undocumented.

G4. AAHP households in the sharing count, and AAHP itself.

  • Why. 3002-1 A.5 divides by "the total number of eligible households in a residence". A household at 150-225% is AAHP-eligible, but it has a zero base here. With three sharers, one under 150% and two AAHP-eligible, the head pays the LIHEAP household 1/2 instead of 1/3.
  • Fix: note it. A later ak_aahp variable ($130 a point; 40, 30 and 20% of points) would close it.

G5. SOLAR pays $0 (Case 69). main treats a solar household's bill as electricity ("assumed grid-tied"), and electricity uses oil points. Map it, or state the choice (Wyoming G3).

G6. Missing place and military bases.

  • Missing place. place_fips defaults to "", so every household without a place code gets $0 (Case 62). Consider a borough fallback.
  • Military bases. Fort Greely CDP is mostly the base, yet Case 58 pays $1,925. 7 AAC 44.040(b)(3)(B) and Addendum A's 0/USA note exclude on-base residents. Consider excluding base CDPs, as the head already does for Eielson AFB by accident.

G7. Recording and pinning.

  • The $407 cell. Record the one-person 25% deviation (Addendum E's $407 against the 25% rule's $415) as a candidate with follows: statute.
  • Wayback captures. Add captures for Addendum A, Addendum E and 3004-5. The site overwrites them each season, and the candidates already note that the manual is "served only over http".

G8. Wording.

  • Internal-process words in public files: "Approved manual-based convention", "User-approved purchased-fuel default", "contract retains" and "approved approximation". Restate each as a source-based modeling assumption (Wyoming G5).
  • One description. P/benefit/tribal_service_places.yaml reads "... under the ordinary state Heating Assistance Program rules". That trails the program name, and it is unclear.
  • Code. oil_table._children uses a private attribute. max_(total, 0) in countable income cannot bind, because every term is already nonnegative.

G9. Merge housekeeping. When resolving programs.yaml, keep main's AZ, IA and VA additions on the coverage line and add AK. Fill both candidates' pe_us.code with the merged paths, and drop "Code not yet on main".

Verified correct

Hand-checked expectations (24; all match the head):

  1. ak_hap Case 2: Fairbanks oil 10; unit 1 (11 points) $1,925 and unit 2 (24,000 → $2,000 a month ≤ $2,077, so 0.6 → 6 points) $1,050; halves: $962.50 / $525.
  2. ak_hap Case 3: 1,925/3, 1,050/3, 525/3 = $641.67 / $350 / $175.
  3. ak_hap Case 7: Juneau 5 × 0.6 = 3 → $525, halved: $262.50.
  4. ak_hap Case 8: studio 1.5 → $0; age 60 → 2.5 → 3 → $525 → shared $262.50, subsidized $131.25.
  5. ak_hap Case 9: Ambler 35 × 1.4 = 49 → cap 35 → $6,125 → $3,062.50 / $1,531.25.
  6. ak_hap Case 10: $36,000 > $29,916 → 0; two eligible neighbors → $875 each.
  7. ak_hap Case 11: ATAP $9,852 for two people (25% $6,756, 50% $13,524) → 0.9 → $1,575.
  8. ak_hap Case 12: Juneau $12,000 / $18,000 / $25,000 → 4.0 / 3.5 / 2.5 points → $700 / $700 / $525.
  9. ak_hap Case 14: SBP $18,000 → 0.7; 7 + 1 (age 62) = 8 → $1,400.
  10. Base Cases 1-8 (dwelling factors, Fairbanks 10, no income): $2,450, $700, $0, $700, $1,050 (5.5 → 6), $2,275, $1,225, $1,750.
  11. Base Case 13: Anchorage gas 5 → $875.
  12. Base Case 22: Loring oil 4 → $700.
  13. Base Case 25: Anchorage gas 5 × 0.4 = exactly 2.0 → $350.
  14. Base Case 26: 5 × 0.15 + 1 = 1.75 → $0.
  15. Base Cases 37-38: Ambler 35 → $6,125; 49 + 1 → cap → $6,125.
  16. Base Cases 42-43: $24,924 (= $2,077 × 12) → $1,050; +$0.12 → $875.
  17. Base Cases 44-45: $29,916 → $875; +$0.12 → $0.
  18. Base Cases 46-47: $4,980 (= $415 × 12) → $1,750; +$0.12 → $1,575.
  19. Base Case 49: Savoonga 27, five people ($48,350 → $4,029; 75% $3,021); $2,900 → 0.8 → 21.6 + 1 → 23 → $4,025.
  20. Base Cases 50 and 80: heat in rent → $1,750; wood 10 × 0.8 → $1,400.
  21. Base Case 66: wood → $1,400.
  22. Income factor Cases 18-21: two people 25% = floor(2,254 × 0.25) = 563 → $6,756 → 1 / 0.9; 18 people 125% = 14,650 → $175,800 → 0.6 / 0.5.
  23. Countable Cases 3, 4 and 7: $12,000; 2,000 + 0 + 800 + 1,000 = $3,800; $100.
  24. The body's Juneau example: $1,500 > $1,246 → 0.7 → 3.5 → 4 → $700.

Additional checks:

  • A brute-force check of every oil or gas point value from 1 to 35 × 8 dwelling factors × 6 income factors × the wood multiplier × the vulnerable point found no float error at half points or at the 2.0 minimum.
  • All 162 Addendum E cells reproduce under the two-step floor, except the stale $407 (see G7).

Batch checks:

  • 1. Plan and matrix. 3004-5 and Addendum A/E match the head (S2 is the geography gap). FY2026 plan 2.1 (p. 9): 150% of the HHS guidelines. 2.6 (p. 10): $350-$6,125, which is 2-35 points at $175. The FY2027 plan is not posted (404).
  • 2. Income. Gross (7 AAC 44.040(c); plan 1.8). Social Security counts with Medicare (3003-1 B.2.c; plan 1.9). Losses are floored per source and per person. The exceptions are C2 (gifts) and S5 (military).
  • 3. Backdating. Only FY2027 is claimed (verified_years: "2027"). Earlier years are documented estimates on the lagged guideline. FY2026 used the same $175 rate (plan 2.6); the transmittal changed only the small-mobile factor and North Pole gas.
  • 4. Arrangements. Heat in unsubsidized rent counts rent as the heating cost (3001-4 C). Subsidized housing with heat in rent is excluded (44.040(b)(4)). The utility allowance, sharing (S1), the tribal routing, the 2.0 minimum, the cap and the $200 cost test are covered. Categorical eligibility only streamlines verification here (3002-1 A.8; plan 1.6), so it needs no branch.
  • 5. Tests. Periods are plain. Cent-level band tops for sizes 1, 2 and 18, the 150% limit, the $200 threshold on both sides, mixed-state vectors and multi-unit households are covered.
  • 6. Descriptions. The house template with the state's program name, apart from G8.
  • 7. References. Manual HTML pages need no page anchors. The DEC PDF title #page 11,19,27,29,34,54,89 and the guide #page=23 follow CLAUDE.md. Wayback captures are suggested in G7.
  • 8. Wiring. programs.yaml entry with coverage. No household aggregate, the same as the merged LIHEAP states (va_eap, tx_ceap and others are not aggregated on main). defined_for = StateCode.AK on all formula variables. Take-up only through tanf.
  • 11, Integrate modeled state unemployment insurance into income flows #9558. The list reads total_unemployment_compensation. No Python reads the raw input.
  • 12. IIJA. No supplement.
  • 13. Mutation. See S4. Every eligibility and benefit branch is pinned: fuel classes, UNAVAILABLE, tribal routing, the subsidized exclusion, the minimum, the cap, sharing and the public-housing path (Case 13).
  • 14. Health premiums. None are deducted, which is right for Alaska's gross rule.
  • 15, NH Add New Hampshire state supplementation for 2026 #10156. No state-gated variable is used as a key:
    • ak_hap_dwelling_type is ungated, and its default (TWO_BEDROOM_HOUSE) is a key.
    • Places outside the tables map to UNAVAILABLE.
    • Household size feeds fpg() arithmetic, not a lookup.
    • Mixed-state Cases 5 and 61 pass.
  • 16, Wire military retirement pay and survivors into federal and state tax (#10181) #10182 / Count military SBP annuities in state benefit income lists #10317. military_retirement_income is used (Cases 10 and 14).
  • 17. State SSP. ak_ssp (Adult Public Assistance) is listed, and 3003-1 B.1 counts APA. Countable Case 23 tests it with SSI.
  • Count each Social Security benefit once in Pennsylvania CCW countable income #10408. social_security appears without its components, so nothing is double counted. survivor_benefits and disability_benefits are non-Social Security inputs.
  • Federal limits. The HHS Alaska guideline is used ($19,950 + $7,100 for 2026, lagged one year for FY2027). 150% is above the 110% floor and within the greater of 150% FPG and 60% SMI.

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1901 queued.

  • The issue. It is OPEN, labelled pe-parity, and it describes head 6d826ceb31: 150 cases, military_retirement_income, ak_ssp, 21 parameter files.
  • Dispatch-ready. It has module paths, corpus citations, verbatim law (manual and 7 AAC 44), required outputs, and companion tests derived from the sources rather than from PolicyEngine output. Its blockers are recorded: sources missing from the corpus (section 3000 and section-level 7 AAC 44), unregistered conflicts, an unchecked signed release, and no approved billed run. So the line is valid.
  • What it will need. The fixes here change interpretation 8 (gifts, C2), 12 (geography, S2), 11 (OTHER, S3) and the sharing and utility-allowance outputs if S1 goes the regulation's way. They also change companion test 6 (Anchorage oil) and add military_basic_pay (S5). Update the issue when the head changes.

CI status

gh pr checks 10341, re-checked at the end of this review: 32 pass and 2 fail, with none pending.

  • The failures: "Python tests / Full Suite - Rest (Python shard 3)" (run 40057978418, job 120765657082) and its "Check Rest Python shards" aggregator.
  • Classification: a real failure caused by this PR. The source-conflict ratchet flags P/benefit/maximum_shared_household_share.yaml (C1). It is not infrastructure and not the known FL/SD or Montana main-caused failures.
  • Everything else is green, including all four baseline state shards that run the PR's YAML files.

Branch status

  • Position: 14 commits ahead of main and 67 behind. GitHub reports the PR as CONFLICTING.
  • Merge check: git merge-tree --write-tree PolicyEngine/main 6d826ceb31 conflicts only in policyengine_us/programs.yaml:
    • the LIHEAP coverage line, where main added AZ, IA and VA and the PR appends AK;
    • the state_implementations block, where main added VA after TX and the PR adds AK there.
  • Other files: source_conflicts/candidates.yaml merges cleanly.
  • Siblings: these conflicts are the expected sibling LIHEAP collisions on the coverage line, so this is a branch note only (see G9). The PR touches the coverage line itself.

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: 2 critical (CI fails on this PR's own file in the source-conflict ratchet; a $20/month cash gift is counted against 7 AAC 44.042(16)), 5 should. Full report in the comment above.

hua7450 and others added 2 commits October 27, 2026 15:56
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	policyengine_us/programs.yaml
@hua7450

hua7450 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks for the review, David. The fixes are in 4d4c959, and b75fcb2 merges current main.

  • C1 (source-conflict check). Fixed. With S1, the code now follows 7 AAC 44.080(h) and (l) to (n), so maximum_shared_household_share.yaml and utility_allowance_reduction.yaml state the regulation's rule and their comments no longer read as a conflict. A static run of the check's patterns over the PR's 27 parameter and variable files finds no unmarked conflict comment. Register Alaska HAP sharing conflict and unshipped proposals TheAxiomFoundation/rulespec-us#1846 is no longer needed for this PR, and the body drops the sentence that expected the failure.
  • C2 ($20 gifts). Fixed. ak_hap_countable_income.py exempts gifts at or under $20 a month (<=), and gift_exemption_threshold.yaml reads "at or below" and cites 7 AAC 44.042(16) and 3003-1 B.6.r beside 3003-2 A.24. Countable Case 25 ($240 a year) is now 0, and new base Case 82 is your example: $1,400.
  • S1 (manual over regulation). Fixed: the code now follows the regulation (see C1). A shared ak_hap_award helper in ak_hap_base_benefit.py applies 44.080 in order: points x dwelling factor x dwelling share (h) x income factor (i), plus the vulnerable point (k), halved for a utility allowance (l), then the 2.0 minimum (m), half-up rounding (n) and the 35-point cap (o). ak_hap sets each SPM unit's share to its heating_expense over the household total; when no unit reports a heating expense (heat in rent), manual 3002-1 A.5's equal split among eligible units, at most 50%, fills the gap. ak_hap_base_benefit stays the sole-household award. Both candidates now have follows: statute, give the manual's dollar-stage reading as the other side and note 44.035(c) as a second regulatory reading. ak_hap.yaml re-pins: Case 2 $700 and $875; Case 3 (heat in rent, thirds) $700, $700 and $525; Case 5 $875, $875 and $1,750; Case 7 $0; Case 8 $0 for all three units; Case 9 $4,375 and $2,100 (shared before the cap); Case 10 $0, $525 and $525. New Case 15 is your Fairbanks factor-0.7 example ($700), and new Case 16 halves Juneau's 4 points to exactly 2.0 ($350). ak_hap.py and the body note that a heat-in-rent unit sharing with a unit that reports a bill gets a zero share, since its rent's heating portion is unobserved. Your four smaller choices are now candidates with both sides quoted (follows: conflicting-source, state: open), code unchanged: us-ak:hap-loring-oil-points, us-ak:hap-income-limit-rounding (23 of 108 cells), us-ak:hap-general-relief-assistance and us-ak:hap-student-earnings-exemption.
  • S2 (missing geography). Fixed. oil.yaml now covers all 355 Census places: 279 direct matches, including Anchorage municipality (03000) at 8 and 16 name fixes (your eight, the six tribal places, Eielson AFB and Harding-Birch Lakes), and 76 nearest-community approximations by the gas table's great-circle method. Its header says this is not a state crosswalk. tribal_service_places.yaml adds your six places and 13 approximated places, which inherit their nearest community's all-resident tribal routing (119 to 138 places). Lutak is the close call: Klukwan (0/THRHA) is 16.6 km away and Haines (*) 18.1 km. Addendum A lists English Bay at 19 and Nanwalek, the same village, at 8; the table keeps Nanwalek CDP's 8 with a comment. Base Case 65 (Anchorage oil) is now $1,400 and Case 79's Anchorage wood unit $1,050; Case 63 now uses a code outside the gazetteer and stays $0. New Case 81 is your Anchorage example ($700), Case 84 pins Meadow Lakes at Wasilla's 7 ($1,225), and Case 85 pins Mertarvik at $0 through Newtok's AVCP routing.
  • S3 (OTHER). Fixed. ak_hap_base_benefit.py puts OTHER on oil points, with a comment that it stands for steam, hot water and vehicle gasoline (7 AAC 44.080(f); step 1). Case 68 is now $1,750.
  • S4 (untested entries). Fixed. Countable Case 16 adds $600 of railroad_benefits ($5,400), and Case 18 adds $600 of gambling_winnings ($1,080).
  • S5 (military basic pay). Fixed. business_sources.yaml becomes earned_sources.yaml (employment_income, military_basic_pay and the four business sources, each floored at zero), citing 3003-1 A.1, 3003-4 and 3003-5 B.1.a. The unearned_sources.yaml comment now says military basic pay is its own input, counted once as earned income. New base Case 83 is your example: $40,000 exceeds the $29,916 limit, so $0.
  • G1 (UNSPECIFIED heat in rent). Declined. Callers must send heating_type, and UNSPECIFIED paying $0 is by design (Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754).
  • G2 (utility allowance by default). Fixed. The allowance is now inferred for subsidized households (receives_housing_assistance or is_in_public_housing) whose heat is not in rent, citing 24 CFR 965.502(a) and 982.517(a)(1), and hud_utility_allowance is no longer read. Case 6 pins the four arrangements ($1,750, $1,750, $875, $0), its second unit now testing a lone heat-in-rent household; Case 13's public-housing direct payers get $875 with no allowance input.
  • G3 (self-employment cost basis). Documented. earned_sources.yaml, the countable-income comment and the body say that 3003-4 B makes the 50% standard deduction the default, so net inputs overstate countable income when actual costs are under half of gross.
  • G4 (AAHP households). Documented. The body notes that AAHP is not modeled, so the equal-split gap-fill counts only LIHEAP-eligible units; with reported bills, an AAHP household's bill still counts in the dwelling total.
  • G5 (SOLAR). Adopted. SOLAR uses oil points like grid electricity; Case 69 is now $1,750.
  • G6 (missing place, military bases). Documented. The body says there is no borough fallback and that base CDPs such as Fort Greely are not excluded, because a place code does not establish residence on a base (7 AAC 44.040(b)(3)(B)).
  • G7 (recording and pinning). Adopted. New candidate us-ak:hap-one-person-lowest-income-limit (follows: statute) records the cell: the code uses $415, and Addendum E's $407 matches the 2025 guideline. The Wayback CDX API has only January 2, 2021 captures of Addendum A, Addendum E and 3004-5 (FY2021 content), so no capture is linked; the body says so.
  • G8 (wording). Fixed. The "approved", "user-approved" and "contract" wording is gone from the parameters, variables and tests, and no test name says "adopted mapping" or "reconciled" any more; each passage now states a source reading or a modeling assumption. The tribal description now ends at the program name; list(oil_table) replaces ._children; and the max_(total, 0) that could not bind is dropped.
  • G9 (housekeeping). Done. Both earlier candidates list their code paths and no longer say "Code not yet on main", and the merge keeps main's AZ, IA and VA on the LIHEAP coverage line beside AK.

The PR body and TheAxiomFoundation/rulespec-us#1901 are updated for b75fcb2. Tests now number 157 (ak_hap 16, base benefit 85, countable income 30, income factor 22, household size 4). I did not run the tests locally, so CI will check them.

@hua7450
hua7450 requested a review from DTrim99 October 27, 2026 19:57
@DTrim99

DTrim99 commented Oct 27, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Add Alaska LIHEAP regular heating assistance

PR #10341 (author: hua7450), head b75fcb239b. Round 1 reviewed 6d826ceb31 and requested changes: 2 critical, 5 should and 9 suggestions. Since then the author has pushed two commits:

  • 4d4c959bc7, the review fixes (20 files, +1,129 / −504);
  • b75fcb239b, a merge of main with one hand-resolved block in programs.yaml.

The author answered every item in a PR comment, updated the body and refreshed rulespec-us#1901. The PR still touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/ak/dpa/hap/
  • V/ = policyengine_us/variables/gov/states/ak/dpa/hap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/ak/dpa/hap/

Summary

Most of round 1 is fixed, and each fix has a test that would fail without it:

  • C1 and C2. The source-conflict check passes on its own and on the tree merged with main. A $20-a-month gift is now exempt (<=): countable Case 25 is $0 and new base Case 82 pays $1,400.
  • S1 (main part). The shared-dwelling split and the utility-allowance reduction now apply to points before the 2.0 minimum and rounding, as 7 AAC 44.080(h) and (l)-(n) direct. A new ak_hap_award helper runs the regulation's steps in order. ak_hap.yaml Cases 2, 7, 8, 9 and 15 would all fail under the manual's dollar-stage order.
  • S2. The oil table now covers all 355 Census places, including Anchorage at 8. My spot checks against Addendum A all match (see Verified).
  • S3 to S5. OTHER now uses oil points. railroad_benefits and gambling_winnings are pinned. military_basic_pay is counted as earned income.
  • Suggestions. G2 and G5 are adopted, G3, G4 and G7 are documented or recorded, and G8 and G9 are done.

Two should-address items are open:

  • S1 (remaining part, still open). Four smaller choices still follow the manual or the agency tables over 7 AAC 44:
    • Loring's oil points;
    • Addendum E's whole-dollar floors;
    • counting General Relief Assistance;
    • the student-earnings test.
      They are now recorded, as round 1 asked, but as follows: conflicting-source and state: open. The file's own legend says that combination "calls for a model change". Today's sibling round 2s set the bar: such a choice must follow the regulation, or be recorded as a reviewed choice with a clear reason.
  • N1 (new). A heat-in-rent household that shares a dwelling with a household that reports a heating bill now gets a zero share and $0. Round 1 paid it half. The regulation gives it a positive share, and manual 3002-1 A.3 treats a heat-included room renter as its own one-room dwelling. No test covers this case.

There are three suggestions:

  • G-a: the military-base CDPs. The fix now pays Eielson AFB CDP, which was $0 in round 1.
  • G-b: the precision of the nearest-community crosswalk.
  • G-c: leftover internal wording.

Status.

  • CI: all 35 checks pass at b75fcb239b.
  • Branch: 16 commits ahead of main and 4 behind. It conflicts again in programs.yaml, this time with Washington LIHEAP Add Washington LIHEAP regular heating assistance #10345, merged today (branch note).
  • Merge block: the hand-resolved block is correct.
  • Axiom: rulespec-us#1901 matches the head.

Prior findings

Finding Status Evidence
C1. CI failure from the source-conflict check on maximum_shared_household_share.yaml Fixed P/benefit/maximum_shared_household_share.yaml:2-6 and P/benefit/utility_allowance_reduction.yaml:2-4 now state the regulation's rule. Rest (Python shard 3) passes in run 40573667784 at b75fcb239b. I also ran test_source_conflicts.py on the tree merged with current main, where test_conflict_sounding_comments_do_not_grow and every marker test pass. The oil table's Loring comment was reworded and no longer matches the patterns.
C2. A $20-a-month gift counted in full Fixed V/ak_hap_countable_income.py: gifts / MONTHS_IN_YEAR <= p.gift_exemption_threshold. P/income/gift_exemption_threshold.yaml says "at or below" and cites 7 AAC 44.042(16), 3003-1 B.6.r and 3003-2 A.24. Countable Case 25 (T/ak_hap_countable_income.yaml:745): 240 / 12 = 20, exempt, $0. Base Case 82 (T/ak_hap_base_benefit.yaml:2755): $1,233.33 a month ≤ $1,246, so factor 0.8, 8 points, $1,400. Both fail with <.
S1. Sharing and utility allowance follow the manual over 7 AAC 44; four smaller choices unrecorded Partly fixed; still open (should) Fixed: V/ak_hap_base_benefit.py:4-97 multiplies the dwelling share into points before the income factor (h), adds the vulnerable point (k), halves for the allowance (l), and then applies the minimum (m), rounding (n) and the cap (o). Both candidates now say follows: statute. Cases 2, 7, 8, 9 and 15 pin the order (under the manual: $962.50/$525, $262.50, $0/$262.50/$131.25, $3,062.50/$1,531.25 and $612.50). FY2026 plan 2.6's $350 minimum is now consistent. Still open: see the note below the table.
S2. 93 places with no oil points, including Anchorage Fixed P/benefit/community_points/oil.yaml: 355 places plus UNAVAILABLE. All 262 round-1 values are unchanged. There are 16 name fixes (Adak, Anchorage, St. Paul, St. Michael, St. George, Chenega, Kenny Lake, Naukati Bay, Tenakee Springs, the six tribal places, Eielson AFB and Harding-Birch Lakes) and 76 nearest-community approximations. My spot checks match Addendum A (Verified, item 25). P/benefit/tribal_service_places.yaml goes from 119 to 138 places, with none removed. Base Cases 65, 79, 81, 84 and 85 pin the new values.
S3. OTHER paid $0 Fixed V/ak_hap_base_benefit.py:17-29 adds OTHER (steam, hot water and vehicle gasoline, 7 AAC 44.080(f)) to the oil fuels. Base Case 68 (:2156): $1,750.
S4. railroad_benefits and gambling_winnings untested Fixed Countable Case 16 (:477): 2,400 + 1,200 + 600 + 600 + 600 = $5,400. Case 18 (:537): 120 + 240 + 120 + 600 = $1,080. Either value fails if its entry is dropped.
S5. military_basic_pay omitted Fixed P/income/earned_sources.yaml (renamed from business_sources.yaml) lists employment_income, military_basic_pay and the four business sources, each floored. Base Case 83 (:2787): $40,000 > $29,916, so $0. Without the entry it would be $1,750. main has no separate BAH or BAS input to add.
G1. UNSPECIFIED heat in rent pays $0 Declined with reason (accepted) The caller supplies heating_type, and UNSPECIFIED paying $0 matches the wave convention (#9754). The state asks for the fuel type (3001-4 C).
G2. The utility allowance never applies by default Fixed V/ak_hap_base_benefit.py:65-72 infers the allowance for subsidized households (receives_housing_assistance or is_in_public_housing) that pay heat directly, citing 24 CFR 965.502(a) and 982.517(a)(1). ak_hap.yaml Case 6 covers all four arrangements ($1,750, $1,750, $875, $0). Case 13 covers public housing ($875) with no allowance input.
G3. Self-employment cost basis Documented P/income/earned_sources.yaml comment, V/ak_hap_countable_income.py and the body: net inputs overstate countable income when actual costs are under half of gross.
G4. AAHP households in the sharing count Documented Body: AAHP is not modeled, so the equal-split count includes only LIHEAP-eligible units. With reported bills, an AAHP household's bill still counts in the dwelling total.
G5. SOLAR pays $0 Fixed SOLAR uses oil points. Base Case 69 (:2186): $1,750.
G6. Missing place and military bases Declined with reason (reason does not hold for the base CDPs); see G-a The body says a place code does not establish residence on a base. Census draws Eielson AFB CDP and Fort Greely CDP from the installations themselves, and the fix now pays Eielson AFB CDP as well.
G7. The $407 cell and Wayback captures Fixed / reasoned Candidate us-ak:hap-one-person-lowest-income-limit (follows: statute) records the cell. The Wayback CDX API has only 2021 captures, and the body says so.
G8. Internal-process wording Mostly fixed; see G-c "Approved", "user-approved" and "contract" are gone. The tribal description ends at the program name. list(oil_table) replaces ._children, and the max_(total, 0) that could not bind is gone; every term is floored or nonnegative.
G9. Merge housekeeping Fixed Both earlier candidates list their code paths. The merge keeps AZ, IA and VA and adds AK (see Branch).

S1, the part that is still open. Four choices follow the manual, Addendum A or E, or the plan over 7 AAC 44. All four are in source_conflicts/candidates.yaml as follows: conflicting-source and state: open, and the code is unchanged:

  • us-ak:hap-loring-oil-points: 44.080(a) and Appendix A give Loring 5 points; Addendum A gives 4. A Loring household gets $700 instead of $875.
  • us-ak:hap-income-limit-rounding: 44.040(a)(4) and 44.080(i) compare income with exact percentages. Addendum E floors them, which puts 23 of 108 limits $1 low. A four-person household with $5,156 a month is ineligible, although 150% is $5,156.25.
  • us-ak:hap-general-relief-assistance: 44.042(18) exempts General Relief Assistance. general_assistance is counted in full.
  • us-ak:hap-student-earnings-exemption: 44.042(5) against manual 3003-2 A.15.

Why it is still open. The file's own legend defines conflicting-source as "against the statute; the 2026-10-19 rule calls for a model change", and open as "asked, not yet decided". No ruling is recorded. Round 1 offered candidates as a fix, and the author did what round 1 asked. But today's sibling round 2s settled that a manual-over-regulation choice must either follow the regulation or be recorded as a reviewed choice with a clear reason. CONTRIBUTING "Source conflicts" treats the regulation as binding over a manual.

Fix, item by item:

  • (a) Loring: use Appendix A's 5. Tetlin's 16 changes nothing, because Tetlin is routed to its tribe.
  • (b) Income limits: compare monthly income with the exact percentage of the monthly guideline in ak_hap_income_factor, and revisit the $407/$415 candidate.
  • (c) General assistance: exclude it as State General Relief Assistance. Or have the project lead rule that the input stands for BIA General Assistance, which 44.042 does not exempt, and record that as state: ruled with the reason.
  • (d) Student earnings: the dependent-in-K-12 proxy fits the regulation's "full-time student under 18 who is not the head of household" as closely as the inputs allow. Record it as follows: statute, with the note that full-time and half-time enrollment are unobserved.
  • Then: update the body and Add formulas and unit tests for ca_agi and ca_taxable_income variables #1901.

New findings

Critical

None.

Should address

N1. A heat-in-rent household sharing a dwelling with a household that reports a heating bill gets a zero share and $0. This is new in the fix, and no test covers it.

  • Where: V/ak_hap.py:33-57. share = heating_expense / dwelling_heating_expense whenever any SPM unit in the household reports a bill. A heat-in-rent unit has heating_expense 0, so its share is 0 and its award is $0. The equal-split gap-fill (:44-51) applies only when no unit reports a bill. The comment at :41-43 and body line "A heat-in-rent SPM unit that shares a dwelling with an SPM unit reporting a heating bill gets a zero share and no award ... 7 AAC 44.080(h) would give it the share that portion represents" say so openly.
  • Sources:
    • 7 AAC 44.080(h): points "are reduced to the household's proportionate share of the home heating expenses". Manual 3000-2 defines home heating costs as "An amount the household pays for its own home heating needs either directly or indirectly through rent". 3001-4 C: "the rental payment itself is considered the household's heating ... expense". So the share is positive.
    • Manual 3002-1 A.3: a room renter whose agreement shows heat included in rent is determined as its own "1-room dwelling" and is not a house sharer. House sharers get the equal split of A.5.
    • Neither source gives $0. Round 1 paid half (the A.5 dollar split).
  • Effect (hand-traced; FY2027; Fairbanks oil 10; one household, two SPM units, both TWO_BEDROOM_HOUSE, no income):
    • Unit A (age 40) pays a $1,200 oil bill. Unit B (age 65) has heat in its unsubsidized $6,000 rent. B passes the $200 cost test through its rent, and its sole-household award is (10 + 1) × $175 = $1,925.
    • Head: A's share is 1, so $1,750. B's share is 0, so 0 + 1 = 1 point, under 2.0: $0.
    • The PR's own equal-split gap-fill: A gets 5 points, $875. B gets 5 + 1 = 6 points, $1,050.
    • As a room renter under A.3 (one-room factor 0.15): 1.5 + 1 = 2.5, rounded to 3, $525.
  • Severity: should. An eligible household is paid $0 in the claimed year, which is the wave's should category. Under today's Utah and North Dakota round-2 precedent, behavior that a review fix introduces with no test pinning it is a new should. No ak_hap.yaml case mixes heat-in-rent and bill-paying units in one dwelling.
  • Fix: give heat-in-rent units in a dwelling with reported bills the gap-fill share, and spread the remaining share over the bill payers in proportion to their bills. Or treat a heat-in-rent unit as an unshared one-room renter (A.3) and leave it out of the dwelling total. Add a mixed-dwelling case and update the body and Add formulas and unit tests for ca_agi and ca_taxable_income variables #1901.

Suggestions

G-a. Military-base CDPs (G6, continued).

  • The change. The fix name-matches Eielson AFB CDP (21370) to Addendum A's "Eilson AFB" row, so it now gets 11 oil points. It also keeps 0/USA places off the tribal list (P/benefit/tribal_service_places.yaml:2-4). Round 1 paid Eielson $0 because it had no points. Fort Greely CDP (26100) still pays $1,925 (base Case 58).
  • Why it matters. Addendum A marks both rows 0/USA ("Service members living on base do not qualify"), and 7 AAC 44.040(b)(3)(B) makes a household that "resides ... on a military base" ineligible. Census draws both CDPs from the installations themselves, so the body's reason (a place code does not establish base residence) does not hold for these two.
  • Fix: consider excluding 21370 and 26100, with a test.

G-b. Precision of the nearest-community crosswalk.

  • How I checked. I recomputed the great-circle method for 22 places, and every one matches the head.
  • Fairbanks suburbs. Distance alone gives Chena Ridge CDP and Goldstream CDP Ester's 11 points. Their addresses are mostly ZIP 99709, which Addendum A lists as College with 10 points.
  • Haines area. Covenant Life CDP and Mosquito Lake CDP are routed to Klukwan's all-resident tribal service (0/THRHA), so they get $0. They share ZIP 99827 with Haines (*/THRHA, Natives only), so for most residents the Haines row would apply. Lutak is the close call the body already names.
  • Fix: a ZIP-to-place step on Addendum A's own ZIP codes would settle these. Otherwise, name them in the body.

G-c. Leftover wording.

  • Where: T/ak_hap_base_benefit.yaml still has eleven "Current COMMUNITY table / adopted source crosswalk ... Loring uses current 4 rather than legacy 5" comments (lines 344-644), Case 23's name "uses the adopted nearest-community approximation" (:675), and "legacy 16" for Tetlin (:1884).
  • Why it matters. "Legacy" describes the regulation's Appendix A values, which are the binding side of the open Loring candidate.
  • Fix: restate these as source readings.

Verified

Hand-checked expectations. Every new or changed expectation matches the head (FY2027, $175 a point; one-person monthly ceilings $415 / $831 / $1,246 / $1,662 / $2,077 / $2,493):

  1. ak_hap Case 2 (bills $300 and $900): 10 × 0.25 = 2.5, plus 1 = 3.5, rounded to 4: $700. 10 × 0.75 × 0.6 = 4.5, rounded to 5: $875. Bases $1,925 and $1,050.
  2. Case 3 (heat in rent, three eligible units): 13 × ⅓ = 4.33, rounded to 4: $700, $700. 13 × ⅓ × 0.6 = 2.6, rounded to 3: $525. Bases $2,275, $2,275 and $1,400 (7.8 rounded to 8).
  3. Case 4: household 1 has one eligible unit, min(1, 0.5) = 0.5, 5 points: $875. Household 2: 0.5 each, $875 and 3 points $525. Household 3 has none: $0. This pins the 50% cap.
  4. Case 5: $1,500 of $3,000 each, 5 points: $875, $875. Sole unit $1,750. The New Hampshire units get $0.
  5. Case 6: $1,750 (direct); $1,750 (a lone heat-in-rent unit, share 1, which pins household_count > 1); $875 (subsidized direct, 10 × 0.5); $0 (subsidized heat in rent).
  6. Case 7: Juneau 5 × 0.6 = 3, halved to 1.5, under 2.0: $0. Base $525.
  7. Case 8: studio 1.5 × ⅓ = 0.5, then 1.5 with the vulnerable point, then 0.75 with the allowance: all $0. Bases $0, $525 and $525.
  8. Case 9: Ambler 49 × 0.5 = 24.5, rounded to 25: $4,375. Halved to 12.25, rounded to 12: $2,100. Capping first would give 18 points.
  9. Case 10: three $3,000 bills; 10 × ⅓ = 3.33, rounded to 3: $525, $525. The military retiree has factor 0 but its bill counts in the total, as 44.080(h) says.
  10. Case 13: public-housing direct payers, 10 × 0.5 = 5: $875, $875. Bases $1,750.
  11. Case 15: 7 × 0.5 = 3.5, rounded to 4: $700. Base $1,225.
  12. Case 16: Juneau 4 × 0.5 = exactly 2.0, which meets the minimum: $350.
  13. Base Case 63: place 99999 has no points: $0.
  14. Base Case 65: Anchorage 03000, oil 8: $1,400.
  15. Base Cases 68 and 69: OTHER and SOLAR, Fairbanks 10: $1,750 each.
  16. Base Case 79: Anchorage wood 8 × 0.8 = 6.4, rounded to 6: $1,050. Coal at 99999: $0.
  17. Base Case 81: Social Security $1,500 a month, factor 0.7; 8 × 0.55 × 0.7 = 3.08, plus 1 = 4.08, rounded to 4: $700.
  18. Base Case 82: gift exempt; $1,233.33 a month, factor 0.8; 8 points: $1,400.
  19. Base Case 83: $40,000 > $29,916: $0.
  20. Base Case 84: Meadow Lakes, Wasilla's 7: $1,225.
  21. Base Case 85: Mertarvik has oil 25, but Newtok's 0/AVCP routing applies: $0. Only the tribal list zeroes it.
  22. Countable Case 16: $5,400. 23. Countable Case 18: $1,080. 24. Countable Case 25: $0.

The household-size and income-factor files changed only comments. Case counts are 16 + 85 + 30 + 4 + 22 = 157, as the body says.

25. Geography spot checks (Addendum A rows from the FY2027 listing):

  • Named places:
    • Anchorage municipality 03000 → 8 (99501 Anchorage */CITC 08/05).
    • St. Paul city 66470 → 11 (99660 Saint Paul */APIA 11/00; state-served).
    • St. Michael city 66360 → 23 (99659 Saint Michael / 23/00).
    • Adak city 00065 → 6 (99546 Adak (Station) / 06/00).
  • Fairbanks and Mat-Su CDPs:
    • Badger 05000 → 11 (North Pole, 6.1 km; ZIP 99705 North Pole 11).
    • Steele Creek 72985 → 11 (Fox, 9.9 km; ZIP 99712 Fox 11).
    • Farmers Loop 24980 and South Van Horn 72230 → 10 (College or Fairbanks).
    • Meadow Lakes 47735, Tanaina 75077 and Gateway 28200 → 7 (Wasilla or Palmer; every Mat-Su core community is 7).
    • Chena Ridge and Goldstream → 11, see G-b.
  • Kenai Peninsula: Kalifornsky 9 (Soldotna), Salamatof 8 (Kenai), Funny River 9 (Sterling) and Diamond Ridge 7 (Homer).
  • Tribal places. The six named tribal additions are all 0/ in Addendum A, and their oil values match: Clark's Point 16, Lower and Upper Kalskag 23, Nunam Iqua 24, Pitka's Point 25 and St. Mary's 25.

Mutation checks on the fix's new logic (each would fail a test if removed or inverted):

  • the expense-share division (Cases 2, 5, 8, 9 and 10);
  • the gap-fill (Cases 3 and 4) and its 50% cap (Case 4);
  • the single-unit share of 1 (Case 6);
  • the allowance flag being off for the base (base Case 54 and ak_hap Cases 6 and 13);
  • the allowance inference (Cases 6, 13, 15 and 16), including is_in_public_housing (Case 13);
  • OTHER and SOLAR (Cases 68 and 69);
  • the tribal routing of approximated places (Case 85).

The ~heat_in_rent term in the allowance condition is redundant, because subsidized heat-in-rent households are excluded anyway. The one new behavior with no case is N1.

Merged tree and guards:

Descriptions and references. The changed parameters follow the house template. The references cite 7 AAC 44.080(h) and (l), 44.042(16), manual 3003-5 B.1.a and 24 CFR 965.502 and 982.517.

Axiom

axiom: TheAxiomFoundation/rulespec-us#1901 queued.

  • The issue. It is OPEN, labelled pe-parity, and was updated 2026-10-27 at 19:57 UTC for head b75fcb239b. It lists:
    • 157 cases and military_basic_pay;
    • the points-stage share and allowance (with the zero-share and gap-fill rule spelled out in its ak_hap output);
    • the inclusive $20 gift;
    • 355-place oil and gas tables and 138 tribal places;
    • OTHER and SOLAR on oil, and the seven candidates.
  • Companion tests. Tests 9, 10, 12 and 13 cite the new cases and are derived from the sources.
  • Blockers. Missing corpus sources, unregistered conflicts, an unchecked signed release and no reviewed oracle revision are all recorded. So the line is valid.
  • Next. If N1 or the remaining S1 choices change the code, update the ak_hap output rule, interpretations 1-4, 7, 9 and 12, and the affected companion tests.

CI

gh pr checks 10341, re-checked at the end of this review: run 40573667784 at b75fcb239b has 35 of 35 checks passing, with none pending.

  • Coverage. That includes Rest (Python shards 1-6) and the shard aggregator, all eleven baseline shards (the four state shards run the AK YAML files), the contrib shards, Microsimulation, Household API Partners and both Codecov checks.
  • Known main-caused failures. Neither the Rest shard 3 failure (test_social_security_input_state_machine) nor the Montana AGI failure appears.
  • Local check. My run of test_source_conflicts.py on the merged tree passed the ratchet and every marker test. Its two other failures came from my partial checkout (a non-AK candidate's code file I had not extracted) and the local Python tokenizer. Neither involves this PR.

Branch

  • Position: 16 commits ahead of main (462672c1a4) and 4 behind.
  • Merge block in b75fcb239b: correct.
    • The LIHEAP coverage line keeps all 26 of the merge base's entries, including AZ, IA and VA, and appends AK.
    • state_implementations keeps VA and adds AK once: 26 entries, no duplicates, and no sibling dropped.
    • The merge adds 241 lines to source_conflicts/candidates.yaml and removes none.
  • Merge check: git merge-tree --write-tree PolicyEngine/main b75fcb239b conflicts only in policyengine_us/programs.yaml. Washington LIHEAP (Add Washington LIHEAP regular heating assistance #10345, merged today) appended WA to the same coverage line and added a WA block after VA, where this PR adds AK. When resolving, keep WA and add AK. candidates.yaml merges cleanly.
  • Siblings: this is the expected collision among sibling LIHEAP PRs on the coverage line, so it is a branch note only.

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, round 2: 0 critical, 2 should. Both criticals and S2-S5 are fixed and pinned, and the sharing/utility-allowance order now follows 7 AAC 44.080. Open: (S1 remainder) four manual-over-regulation choices are recorded as follows: conflicting-source / state: open, so they still need to follow 7 AAC 44 or be ruled with a reason; (N1, new) a heat-in-rent household sharing a dwelling with a bill-paying household now gets a zero share and $0, with no test. Full report in the comment above.

hua7450 and others added 2 commits October 28, 2026 10:42
Follow 7 AAC 44 where the manual differs: Appendix A oil points for Loring
and Tetlin, exact poverty-guideline percentages for the income limits,
General Relief Assistance exempt, and only wages exempt for full-time
students under 18 who do not head the household. Give a heat-in-rent
household sharing a dwelling with bill payers the equal share, exclude
residents of military-base places, assign four places by Addendum A ZIP
code, and restate test comments as source readings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	policyengine_us/programs.yaml
@hua7450
hua7450 requested a review from DTrim99 October 28, 2026 14:56
@DTrim99

DTrim99 commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 3): Add Alaska LIHEAP regular heating assistance

PR #10341 (author: hua7450), head d0643d4578. Round 2 reviewed b75fcb239b and requested changes, with 0 critical, 2 should and 3 suggestions open. Since then the author has pushed two commits:

  • 39532312d1, the round-2 fixes (17 files);
  • d0643d4578, a merge of main with one hand-resolved block in programs.yaml.

Review has been re-requested, but no author reply has been posted yet, and the PR body and rulespec-us#1901 are unchanged since round 2. The PR still touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/ak/dpa/hap/
  • V/ = policyengine_us/variables/gov/states/ak/dpa/hap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/ak/dpa/hap/

Summary

Both round-2 should items are fixed in the code, and a test pins each fix:

  • S1 (remaining part). All four choices now follow 7 AAC 44, and each candidate is recorded as follows: statute:
    • Loring has Appendix A's 5 oil points.
    • Income limits use the exact percentages, with no whole-dollar floors.
    • General Relief Assistance is exempt.
    • The student exemption uses 44.042(5)'s test (wages of a full-time student under 18 who is not the head).
  • N1. A heat-in-rent household that shares a dwelling with bill payers now gets the equal share. New ak_hap Case 17 reproduces the round-2 example: $875 and $1,050.
  • Suggestions. G-a (military-base places), G-b (ZIP-code assignments) and G-c (wording) are adopted.

Three should items are new:

  • N2. Two terms that the fixes add have no test that would fail without them: the heating_expense == 0 guard in the sharing rule and military_basic_pay in the student wage exemption. Utah and North Dakota round 2 set the precedent that a new unpinned guard is a should.
  • N3. The merge resolution drops AK from the LIHEAP coverage line in programs.yaml.
  • N4. The PR body and rulespec-us#1901 still describe the round-2 head. For example, they say the four choices are open, that a heat-in-rent sharer gets a zero share, that Fort Greely pays $1,925, and that there are 157 cases.

There are three suggestions: Eareckson Station CDP, a minor-only tax unit having no inferred head, and wording.

Status:

  • CI: 24 of 26 checks pass at d0643d4578, including every check that runs the Alaska files. The remaining two were still running at the end of this review (see CI).
  • Branch: 18 commits ahead of main and 0 behind, and it merges cleanly.

Prior findings

Finding Status Evidence
S1(a). Loring oil points (Addendum A 4 vs Appendix A 5) Fixed P/benefit/community_points/oil.yaml:384-385 gives 45020 5 points, and the header and a new reference cite 7 AAC 44.080(a) and Appendix A. The regulation's Appendix A reads "(170) Loring5N/A". Base Case 22 (T/ak_hap_base_benefit.yaml:648) now expects 5 × $175 = $875; it fails at 4 points ($700). I compared every oil-only Appendix A row with Addendum A, and only Loring and Tetlin differ. Tetlin now has 16, which changes nothing because its residents are routed to the tribe (Case 59, $0).
S1(b). Addendum E's whole-dollar floors Fixed V/ak_hap_income_factor.py:23-27: limits = guideline * rate, with no floors. The one-person tops are now exact: $4,987.50, $9,975, $14,962.50, $19,950, $24,937.50 and $29,925 a year. They are pinned at and one cent a month above each top: income-factor Cases 6-17 and 18-21, and base Cases 42-47. New income-factor Case 23 (:722) has four people at $61,872 a year ($5,156 a month), which is at or under 41,250 × 1.5 = $61,875, so the factor is 0.5. Under the floors the limit is 5,155 × 12 = $61,860, so the factor would be 0, and the case fails. Base Case 42 also fails under the floors: $24,937.50 is above $24,924, which gives $875 instead of $1,050. I recomputed the candidate's claims: 23 of the 108 floored limits are at least $1 low, and the gaps run from $0.04 to $1.79 a month.
S1(c). general_assistance counted although 44.042(18) exempts General Relief Assistance Fixed general_assistance is gone from P/income/unearned_sources.yaml. The comment (:26-30) reads the input as State General Relief Assistance (7 AAC 38.030) and says BIA General Assistance has no separate input. The regulation reads "(18) payments received under 7 AAC 38.030 (General Relief Assistance)". New countable Case 33 (T/ak_hap_countable_income.yaml:991): wages $10,000 plus $1,200 of general assistance gives $10,000; it would be $11,200 if counted. Case 17 drops its general-assistance input and goes from $3,000 to $2,400 (four $600 receipts).
S1(d). Student-earnings test (manual vs 44.042(5)) Fixed (the code now follows the regulation) Round 2 asked only that the proxy be recorded. Instead, V/ak_hap_countable_income.py:32-36, 47-50 now exempts the wages (employment_income and military_basic_pay) of a member under 18 who is_full_time_student and is not is_tax_unit_head; business income still counts. The regulation reads "(5) wages received by a full-time student under 18 years of age who is not the head of household". Pinned by countable Cases 9-13, 31 and 32: Case 10 (:271) is a 17-year-old full-time college student whose $12,000 of wages are excluded and whose $2,000 of self-employment counts: $26,000 (under the old rule $24,000). Case 32 (:947) is a 16-year-old who heads a separate tax unit: $30,000. Case 11 tests age 18: $36,000. Case 12 tests a minor not in school: $36,000. The candidate records the half-time caveat (any K-12 attendance counts as full time).
S1. "Then update the body and #1901" Open (see N4) Neither has changed since 2026-10-27.
N1. A heat-in-rent sharer got share 0 and $0 Fixed V/ak_hap.py:54-71. Each eligible heat-in-rent unit (no reported bill) takes the equal share, and bill payers split 1 − equal_share × count in proportion to their bills. The comments and P/benefit/maximum_shared_household_share.yaml cite 44.080(h) and 44.900(11). 44.900(11) defines home heating costs as "an amount that the household pays for its own home heating needs either directly, or indirectly through rent". New Case 17 (T/ak_hap.yaml:989) is the round-2 example (hand trace under Verified): $875 and $1,050. Mutations: without the bill-payer scaling, unit 1 gets share 1 and $1,750; with the old zero share, unit 2 gets $0. Both fail the case.
G-a. Military-base places Fixed New P/benefit/military_base_places.yaml lists 21370 (Eielson AFB CDP), 26100 (Fort Greely CDP) and 41210 (Kodiak Station CDP). V/ak_hap_base_benefit.py:88-97 adds ~on_base, citing 44.040(b)(3)(B) ("resides ... on a military base"). Addendum A says "0/USA - Service members living on base do not qualify" and, for Coast Guard bases including ISG Kodiak, "If Guard members live on base, in provided housing, they do not qualify." Each entry is pinned. Base Case 58 (Fort Greely) goes from $1,925 to $0. New Case 86 (:2884) puts $24,000 of basic pay in each unit (factor 0.6): Eielson would get 11 × 0.6 = 6.6 → 7 points, $1,225, and Kodiak Station 6 × 0.6 = 3.6 → 4 points, $700. Both are $0. One more base CDP is left; see R3-G1.
G-b. Nearest-community precision Fixed Four places now take their ZIP code's community: Chena Ridge and Goldstream get College's 10 (oil.yaml:98-99, 246-247), and Covenant Life and Mosquito Lake get Haines's 6 (:146-147, 422-423). The last two leave the tribal list (138 → 136 places). New Case 87 (:2939) gives Covenant Life $1,050 (it was tribe-served, $0) and Chena Ridge $1,750 (it was 11 points, $1,925). Wording: see R3-G3.
G-c. Leftover wording Fixed The eleven "Current COMMUNITY table / adopted source crosswalk ... legacy 5" comments now state the Addendum A value. Case 23 is renamed, and the Tetlin comment now reads as a source reading. Three trivial phrases remain (R3-G3).

New findings

Critical

None.

Should address

N2. Two terms that the fixes add are unpinned.

  • (i) The bill guard in the sharing rule.
    • Code: V/ak_hap.py:54-56 defines heat_in_rent = heat_expense_included_in_rent & (heating_expense == 0).
    • Mutation: if & (heating_expense == 0) is deleted, every case still passes. The only unit in the tests with heat in rent and a reported bill is ak_hap Case 6's spm_unit4. It lives alone and is ineligible (heat in subsidized rent), so its result cannot change.
    • Effect. Take a Fairbanks dwelling (oil 10) with two eligible no-income units. Unit A has heat in its unsubsidized rent and also reports a $600 heating bill. Unit B pays a $1,200 oil bill.
      • At the head: A is a bill payer with share 600 / 1,800 = ⅓: 3.33 → 3 points, $525. B has share ⅔: 6.67 → 7 points, $1,225.
      • Without the guard: A takes the equal share 0.5: $875. B gets 1,200 × 0.5 / 1,800 = ⅓: $525. The shares then add up to 0.83.
  • (ii) Military basic pay in the student exemption.
    • Code: V/ak_hap_countable_income.py:47-49 builds wages from employment_income and military_basic_pay.
    • Mutation: no student in the tests has military_basic_pay, so deleting that term changes no result.
  • Severity: should. Utah and North Dakota round 2 rated a new guard or term that no test pins as should.
  • Fix:
    • Add an ak_hap.yaml case that mixes a heat-in-rent unit reporting a bill with a bill payer.
    • Give the Case 10 or Case 31 student some military_basic_pay, keeping the expectation.
    • Optionally, move the two wage sources into a parameter list next to earned_sources.yaml. A reform that drops military_basic_pay from earned_sources could otherwise make earned − wages negative for an exempt student.

N3. The merge drops AK from the LIHEAP coverage line.

  • Where: policyengine_us/programs.yaml:990 at the head reads coverage: AR, AL, AZ, ..., TX, VA, WA, WY. That is main's line exactly. The round-2 head's line ended ..., TX, VA, AK.
  • What happened: the hand-resolved block took main's side of the coverage hunk. It moved the AK state_implementations block to just after AL, where it appears once.
  • Siblings: none is dropped or duplicated. There are 30 entries: main's 29 plus AK. The PR's net programs.yaml change against main is only the AK block.
  • Why it matters:
    • programs.yaml is the registry behind the coverage page, and CLAUDE.md lists coverage among the fields a new state implementation updates.
    • test_programs_registry does not check the coverage string, so CI cannot catch this.
    • main's line already omits NH and UT; North Dakota Add North Dakota LIHEAP regular heating assistance #10342 adds them.
  • Fix: add AK to the coverage line and keep WA and WY.

N4. The PR body and rulespec-us#1901 describe the round-2 head.

  • The body is byte-identical to its round-2 text. These passages are now wrong:
    • Eligibility table: the income limit "floors the monthly guideline and then floors each band ceiling".
    • Student earnings row: it describes the dependent elementary or secondary test and says "the model follows the manual's test".
    • Unearned income row: it lists general assistance.
    • Not modeled:
      • "A heat-in-rent SPM unit that shares a dwelling with an SPM unit reporting a heating bill gets a zero share and no award".
      • "$415 ... and the model uses $415".
      • The four choices are listed as "follows: conflicting-source, state: open".
      • "Census places that hold military bases, such as Fort Greely CDP, are not excluded".
    • Geography: "76 places that take the points of the nearest listed oil community" (now 72 plus 4 by ZIP code) and 138 tribal places (now 136).
    • Test plan: 157 cases (now 164: 17, 87, 33, 4 and 23), and the source-conflict checkbox text.
  • rulespec-us#1901 is OPEN and labelled pe-parity, but its last update was 2026-10-27 19:57 UTC, for b75fcb239b:
    • It gives 157 cases and says the four candidates are conflicting-source and open.
    • Companion tests 2-4 still use the floored tops ($24,924, $29,916, $4,980, $6,756 and $175,800).
    • Test 12 pays Fort Greely $1,925.
    • Test 13(c) and interpretation 9 describe the dependent K-12 test.
    • Interpretation 7 says general_assistance counts.
  • Severity: should. An axiom issue that is stale after material fixes is a should in this wave, and so is a body that misstates the code.
  • Fix: refresh both for the new head. In Add formulas and unit tests for ca_agi and ca_taxable_income variables #1901, update interpretations 1-4, 7, 9 and 12, the shared-dwelling output rule (the mixed case) and the affected companion tests.

Suggestions

R3-G1. Eareckson Station CDP (20716).

  • What it is: Census draws this CDP on Shemya Island, around Eareckson Air Station, an Air Force installation.
  • Why it matters: Eielson and Fort Greely were excluded for the same reason, but this place still gets the nearest community's 6 oil points (oil.yaml:178-179).
  • Fix: consider adding it to military_base_places, or say in the body why it is left in.

R3-G2. A tax unit of minors has no inferred head.

  • The gap: is_tax_unit_head infers a head only among adults (head_or_spouse_candidates). So a 17-year-old who lives alone, or a 17-year-old parent with an infant, is not a head unless the role is supplied. The new exemption then removes their wages, although 44.042(5) does not exempt a head of household.
  • What the tests do: Case 13 avoids this only by supplying tax_unit_role_input: HEAD.
  • Why a suggestion: the gap predates this round. The round-2 test had it too, because is_tax_unit_dependent is "not head and not spouse".
  • Fix: exempt only when the student's SPM unit (or tax unit) has an adult or an inferred head, and add a lone-minor case with no supplied role.

R3-G3. Wording.

  • ZIP 99827: oil.yaml:8-9 and the Case 87 comment say Addendum A lists ZIP 99827 as Haines. In fact Addendum A lists three communities under 99827: Excursion Inlet (7), Haines (6) and Klukwan (8, all residents tribe-served). Say that Haines is the main community for the ZIP code.
  • Leftover phrases:
    • "Current COMMUNITY 0/AVCP" (T/ak_hap_base_benefit.yaml:1767);
    • base Case 49's "stale worked label" (:1543);
    • income-factor Case 4's "printed stale 407 amount" (T/ak_hap_income_factor.yaml:110).

Verified

Regulation text (7 AAC 44, fetched today):

  • 44.042(5): "wages received by a full-time student under 18 years of age who is not the head of household".
  • 44.042(18): "payments received under 7 AAC 38.030 (General Relief Assistance)".
  • 44.040(b)(3)(B): "resides ... on a military base".
  • 44.040(a)(4) and 44.080(i): gross monthly income "no more than" each percentage of the Alaska poverty level.
  • 44.080(h): "reduced to the household's proportionate share of the home heating expenses".
  • 44.900(11): home heating costs include heat paid "indirectly through rent".
  • Appendix A: Loring 5, Tetlin 16 and Kodiak 6.

Hand checks. Every new or changed expectation matches the head. These use the 2026 Alaska guideline: one person $19,950, plus $7,100 for each extra person, and $175 a point.

  1. N1 (ak_hap Case 17, the round-2 example).
    • Both units are eligible as sole households: 10 × 1 × 1 = 10 points, $1,750; and 10 + 1 for age 65 = 11 points, $1,925. Unit 2's $6,000 rent passes the $200 test.
    • Two SPM units, both eligible: equal share = min(½, 0.5) = 0.5. One eligible heat-in-rent unit, so the bill-payer share = 1 − 0.5 = 0.5.
    • Unit 1: 1,200 × 0.5 / 1,200 = 0.5, so 5 points, $875.
    • Unit 2: 0.5 share, 5 + 1 = 6 points, $1,050.
  2. Base Case 22: Loring 5 × 1 × 1 = 5 points, $875.
  3. Base Cases 42-47 (one person, Fairbanks 10):
    • $24,937.50 → 0.6, $1,050; $24,937.62 → 0.5, $875.
    • $29,925 → 0.5, $875; $29,925.12 → 0, $0.
    • $4,987.50 → 1.0, $1,750; $4,987.62 → 0.9, $1,575.
  4. Income-factor Cases 6-17: at each one-person top the factor is 1, 0.9, 0.8, 0.7, 0.6 and 0.5. Twelve cents a year (one cent a month) above each top it is 0.9, 0.8, 0.7, 0.6, 0.5 and 0.
  5. Income-factor Cases 18-19: 27,050 × 0.25 = $6,762.50 → 1; $6,762.62 → 0.9.
  6. Income-factor Cases 20-21: 19,950 + 17 × 7,100 = 140,650; × 1.25 = $175,812.50 → 0.6; $175,812.62 → 0.5. In float32, $175,812.62 is stored as $175,812.625, which is still above the top.
  7. Income-factor Case 23: 0.5 (see S1(b)).
  8. Base Case 49 (comment only): 48,350 × 0.75 / 12 = $3,021.875. $2,900 → 0.8; 27 × 0.8 + 1 = 22.6 → 23 points, $4,025.
  9. Base Case 58: $0. Case 86: $0, $0 (bases without the exclusion: $1,225 and $700).
  10. Base Case 87: $1,050, $1,750.
  11. Countable Cases:
    • Case 9: $24,000. Case 10: $26,000. Cases 11 and 12: $36,000. Case 13: $12,000.
    • Case 17: $2,400.
    • Case 31: $24,000. Its outputs is_full_time_student [false, true] and is_tax_unit_head [true, false] match the K-12 age default and adult-only head inference.
    • Case 32: $30,000. Case 33: $10,000.
  12. ak_hap Cases 4, 10, 11, 12, 14, 15 and 16 (comments only):
    • The new tops leave every factor unchanged: $36,000 > $29,925; ATAP $9,852 lies between $6,762.50 and $13,525; Juneau $25,000 > $24,937.50; and $18,000 a year ($1,500 a month) lies between $1,246.875 and $1,662.50.
    • So the expectations stand: $875 / $525, $1,575, $700 / $700 / $525, $1,400, $700 and $350.

Case counts are 17 + 87 + 33 + 4 + 23 = 164, which matches the Quick Feedback job's per-file pass counts.

Mutation checks on this round's logic:

  • the bill-payer scaling and the heat-in-rent equal share (Case 17);
  • exact limits (base Cases 42-47; income-factor Cases 6-23);
  • the general-assistance exclusion (Case 33);
  • each part of the student test: age (Case 11), full-time status (Case 12), not head (Cases 13 and 32), wages only (Case 10);
  • each military-base entry (Cases 58 and 86);
  • Loring (Case 22);
  • the removal of Covenant Life from the tribal list (Case 87).

The two unpinned terms are listed in N2.

Merge block. The single hand-resolved hunk in programs.yaml keeps WA and WY, adds no duplicate and drops no sibling. Its one error is that AK is missing from the coverage line (N3). source_conflicts/candidates.yaml merged on its own, with additions only: 254 lines against main. The seven AK candidates are all follows: statute and unreviewed, and every listed code path exists.

Guards (the merged tree is the head's own tree):

Axiom

axiom: TheAxiomFoundation/rulespec-us#1901 queued.

  • Status: the issue is OPEN, labelled pe-parity, and was dispatch-ready for round 2.
  • Problem: it was last updated before this round's commit and does not match the head (N4).
  • Next: once it is refreshed for d0643d4578, with the four interpretations, the mixed-dwelling share rule, the military-base exclusion, the ZIP assignments and the exact-percentage companion tests, the line will be valid again.

CI

gh pr checks 10341 for run 40708633283 at d0643d4578, re-checked at the end of this review: 24 of 26 checks pass and none fail.

  • Still running: Microsimulation and Baseline (ssa-usda).
  • Alaska files:
    • Quick Feedback ran the five AK files: ak_hap 17, base benefit 87, countable income 33, household size 4 and income factor 23, all passing.
    • All four state baseline shards pass.
  • Rest (Python shard 3): passes (3,079 passed, 11 skipped), including test_source_conflicts.py and test_programs_registry.py. The known main-caused test_social_security_input_state_machine failure does not appear.

Branch

  • Position: 18 commits ahead of main (bf108e931a) and 0 behind.
  • Merge check: git merge-tree --write-tree PolicyEngine/main d0643d4578 exits 0 and returns the head's own tree.
  • Merge block: see N3 and Verified.
  • Siblings: other open LIHEAP PRs (for example North Dakota Add North Dakota LIHEAP regular heating assistance #10342) also edit the coverage line, so expect a one-line conflict whichever lands first (branch note).

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, round 3: 0 critical, 3 should. Both round-2 items are fixed and pinned: all four choices now follow 7 AAC 44, and the heat-in-rent sharer gets the equal share. New: (N2) the heating_expense == 0 guard in the sharing rule and military_basic_pay in the student exemption have no test; (N3) the merge dropped AK from the programs.yaml LIHEAP coverage line; (N4) the PR body and rulespec-us#1901 still describe the round-2 head. Full report in the comment above.

hua7450 and others added 3 commits October 28, 2026 15:18
Pin the bill guard in the shared-dwelling rule and military basic pay in
the student wage exemption with tests, move the exempt wage sources to a
parameter list, treat a minor in a unit without an adult as its head,
exclude Eareckson Station residents as living on a military base, and
correct the ZIP-code and leftover test wording.

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

hua7450 commented Oct 28, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, David. Rounds 3 and 4 are in 39532312d1 and 99d3073399. 7065c18a2f merges current main, which now includes North Dakota, and e3a66e7bcc adds AK to the coverage line.

Round 2 items (39532312d1)

  • S1 remainder. All four choices now follow 7 AAC 44, and source_conflicts/candidates.yaml records each as follows: statute:
    • Loring. community_points/oil.yaml gives Loring Appendix A's 5 oil points. Base Case 22 pays $875 (was $700).
    • Income limits. ak_hap_income_factor.py uses the exact percentages of the guideline, with no whole-dollar floors. Income factor Case 23 keeps four people with $5,156 a month in the 150% band (factor 0.5), and base Cases 42 to 47 and income factor Cases 6 to 21 sit at the exact limits.
    • General Relief Assistance. unearned_sources.yaml drops general_assistance under 7 AAC 44.042(18). Countable Case 33 counts $10,000 of wages and none of $1,200 of general_assistance, and countable Case 17 expects $2,400.
    • Student earnings. ak_hap_countable_income.py follows 7 AAC 44.042(5). Countable Case 31 exempts a 16-year-old's $6,000 of wages ($24,000), and Case 32 counts them when the student heads a tax unit ($30,000).
  • N1. In ak_hap.py, an eligible heat-in-rent unit with no heating bill takes the equal share (at most 50%), and the bill payers split the rest by bill. ak_hap.yaml Case 17 pays the $1,200 bill payer $875 and the 65-year-old heat-in-rent unit $1,050.
  • G-a. military_base_places.yaml pays Eielson AFB, Fort Greely and Kodiak Station CDPs $0 under 7 AAC 44.040(b)(3)(B). Base Case 58 pays Fort Greely $0 (was $1,925), and Case 86 pays Eielson AFB and Kodiak Station $0.
  • G-b. oil.yaml gives Chena Ridge and Goldstream College's 10 points and Covenant Life and Mosquito Lake Haines's 6. The last two leave tribal_service_places.yaml, which now has 136 places. Base Case 87 pays Covenant Life $1,050 and Chena Ridge $1,750.
  • G-c. In ak_hap_base_benefit.yaml, the crosswalk comments on Cases 12 to 21, the Loring comment on Case 22, Case 23's name and the Tetlin comment on Case 59 now state the source values.

Round 3 items (99d3073399)

  • N2 (i), the bill guard. New ak_hap.yaml Case 18 is your Fairbanks example. Unit 1 (age 40) has heat in a $6,000 unsubsidized rent and also reports a $600 oil bill; unit 2 (age 40) pays a $1,200 oil bill. Because unit 1 reports a bill, it is a bill payer and both units share by bill: 10 x 1/3 = 3.33 points, rounded to 3 ($525), and 10 x 2/3 = 6.67, rounded to 7 ($1,225). Without & (heating_expense == 0) in ak_hap.py, the case would give $875 and $525 and fail.
  • N2 (ii), military basic pay. The exempt wage sources are now the parameter list income/student_wage_sources.yaml (employment_income and military_basic_pay). ak_hap_countable_income.py zeroes a listed source for an exempt student inside the earned_sources loop, so a reform that drops a source from earned_sources cannot make earned income negative. Countable Case 10's 17-year-old college student now also has $1,200 of National Guard drill pay in military_basic_pay. The expectation stays $26,000; counting the drill pay would give $27,200.
  • N3. Fixed. North Dakota's Add North Dakota LIHEAP regular heating assistance #10342 edited the same line, so I waited for it to merge. e3a66e7bcc adds AK to the LIHEAP coverage line in programs.yaml, after 7065c18a2f brought in main with ND, NH and UT already on it.
  • N4. The PR body and LIHEAP wave 2b: encode Alaska HAP regular heating assistance TheAxiomFoundation/rulespec-us#1901 now describe this head: the four choices as follows: statute, the shared-dwelling rule including Case 18, the student test with the adult condition, the four military-base places, the ZIP wording, the exact-percentage companion tests and 165 cases (ak_hap.yaml 18, base benefit 87, countable income 33, household size 4, income factor 23).
  • R3-G1. military_base_places.yaml adds Eareckson Station CDP (20716), which Census draws on Shemya Island around Eareckson Air Station. Base Case 86 adds a third unit there with $24,000 of basic pay. It receives $0; without the exclusion, the 6 oil points it takes from the nearest listed community would give 6 x 0.6 = 3.6, rounded to 4 ($700).
  • R3-G2. ak_hap_countable_income.py now exempts a student's wages only when the SPM unit has a member 18 or older, so a minor in a unit without an adult is treated as its head. Countable Case 13 drops the supplied HEAD role: a 17-year-old high school student who lives alone keeps $12,000 of wages in income. Without the adult condition the wages would be exempt and income would be $0.
  • R3-G3. oil.yaml, tribal_service_places.yaml and base Case 87 now say College and Haines are the main communities Addendum A lists for ZIP 99709 and 99827, and that 99827 also lists Excursion Inlet and Klukwan. The comment on base Case 55 now says Addendum A marks Akiachak 0/AVCP. Base Case 49 is renamed "a Savoonga five-person household is in the 75% band", and income factor Case 4 is renamed "Addendum E's printed 407 a month stays in the lowest band".

I did not run the tests locally, so CI will check them.

@hua7450
hua7450 requested a review from DTrim99 October 28, 2026 19:19
@DTrim99

DTrim99 commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 4): Add Alaska LIHEAP regular heating assistance

PR #10341 (author: hua7450), head e3a66e7bcc. Round 3 reviewed d0643d4578 and requested changes, with 0 critical, 3 should and 3 suggestions open. Since then the author has pushed three commits:

  • 99d3073399, the round-3 fixes (9 files);
  • 7065c18a2f, a merge of main (with North Dakota Add North Dakota LIHEAP regular heating assistance #10342). It is a plain auto-merge with no hand-resolved blocks: its tree matches what git merge-tree produces from its two parents;
  • e3a66e7bcc, which adds AK to the LIHEAP coverage line.

The author replied item by item on 2026-10-28, and the PR body and rulespec-us#1901 were both rewritten for this head. The PR still touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/ak/dpa/hap/
  • V/ = policyengine_us/variables/gov/states/ak/dpa/hap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/ak/dpa/hap/

Summary

All three round-3 should items are fixed:

  • N2. A test now pins each of the two terms:
    • The bill guard in the sharing rule is pinned by new ak_hap Case 18, our Fairbanks example: $525 and $1,225. Without the guard the result is $875 and $525.
    • Military basic pay in the student exemption is pinned by countable Case 10, which adds $1,200 of drill pay and keeps $26,000. Without the term the result is $27,200.
    • The exempt wage sources are now a parameter list, zeroed inside the earned-income loop, so earned income can no longer go negative.
  • N3. The coverage line now has AK plus all 31 of main's entries, including ND, NH and UT from Add North Dakota LIHEAP regular heating assistance #10342.
  • N4. The PR body and rulespec-us#1901 now describe e3a66e7bcc: 165 cases, the four follows: statute choices, the mixed-dwelling rule with Case 18, the student test with the adult condition, the four base places and the exact-percentage companion tests.

All three suggestions are adopted:

  • R3-G1. Eareckson Station is excluded as a base and pinned in Case 86.
  • R3-G2. A minor in an SPM unit with no adult is treated as its head, pinned by Case 13 with no supplied role.
  • R3-G3. The wording is fixed.

New findings: no critical or should items, and one housekeeping suggestion.

Status:

  • CI: 34 of 34 checks pass at e3a66e7bcc. Quick Feedback ran all five Alaska files: 18, 87, 33, 4 and 23 cases.
  • Branch: 21 commits ahead of main and 1 behind (a version bump), and it merges cleanly.

Prior findings

Finding Status Evidence
N2(i). The heating_expense == 0 guard in the sharing rule is unpinned Fixed V/ak_hap.py:54-56 is unchanged. New Case 18 (T/ak_hap.yaml:1037-1090) uses a Fairbanks dwelling (oil 10) with two units, both aged 40, both in a two-bedroom house and both with no income. Unit 1 has heat in an unsubsidized $6,000 rent and also reports a $600 oil bill. Unit 2 pays a $1,200 oil bill. The case expects $525 and $1,225; the hand trace is under Verified. Deleting & (heating_expense == 0) makes unit 1 a heat-in-rent unit: its equal share is 0.5 ($875), and unit 2's share becomes 1,200 × (1 − 0.5) / 1,800 = ⅓ ($525). The case then fails.
N2(ii). military_basic_pay in the student wage exemption is unpinned Fixed The new parameter P/income/student_wage_sources.yaml lists employment_income and military_basic_pay and cites 7 AAC 44.042(5). V/ak_hap_countable_income.py:49-54 zeroes each listed source for an exempt student inside the earned_sources loop, so a reform that drops a source from earned_sources can no longer make earned income negative; this was our optional point. Countable Case 10 (:271) gives the 17-year-old college student $1,200 of military_basic_pay and keeps $26,000 (24,000 + 0 + 0 + 2,000). Mutations: dropping military_basic_pay from the list gives $27,200, and dropping employment_income gives $38,000 in Case 10, $25,200 in Case 9 and $30,000 in Case 31. Each fails.
N3. The merge dropped AK from the LIHEAP coverage line Fixed policyengine_us/programs.yaml:990 now reads coverage: AK, AR, AL, ..., UT, VA, WA, WY. Against current main (c55b806541), the PR's programs.yaml diff is only this line (AK prepended, all 31 main entries kept, ND, NH and UT included) and the one AK state_implementations block after AL. No sibling is dropped or duplicated.
N4. The PR body and rulespec-us#1901 described the round-2 head Fixed Body (edited 2026-10-28 19:30 UTC):
  • exact limits with no floors;
  • the 44.042(5) student test with the adult condition and student_wage_sources;
  • general_assistance not counted;
  • the mixed-dwelling rule, including the bill-payer heat-in-rent case ($525 / $1,225);
  • $415.625;
  • seven candidates, all follows: statute;
  • four base places, including Fort Greely at $0;
  • 279 + 4 + 72 = 355 oil places and 136 tribal places;
  • 165 cases (18 + 87 + 33 + 4 + 23, matching the files and CI).
#1901: see Axiom.
R3-G1. Eareckson Station CDP Adopted P/benefit/military_base_places.yaml now lists 20716, with a comment. Base Case 86 adds a third unit at 20716 with $24,000 of basic pay (factor 0.6) and expects $0. Without the entry, Eareckson's 6 oil points give 6 × 0.6 = 3.6 → 4 points, $700, so the case pins it. 20716 is not on the tribal list.
R3-G2. A minor-only tax unit has no inferred head Adopted V/ak_hap_countable_income.py:33-39 adds spm_unit.project(adult_present), where an adult is a member aged 18 or over. Countable Case 13 (:379) drops the supplied HEAD role and expects $12,000. is_tax_unit_head is false for the lone 17-year-old, because head_or_spouse_candidates admits only non-children. Without the adult condition, the wages would be exempt and the result $0. The ~is_tax_unit_head term stays pinned by Case 32: the 16-year-old heads a separate tax unit in an SPM unit with a 40-year-old, so the adult condition holds and only the head test excludes; dropping the term gives $24,000 instead of $30,000.
R3-G3. Wording Adopted oil.yaml:7-10, tribal_service_places.yaml and base Case 87 now say "main community" for ZIP codes 99709 and 99827, and note that 99827 also lists Excursion Inlet and Klukwan. The Case 55 comment reads "Addendum A marks Akiachak 0/AVCP". Base Case 49 and income-factor Case 4 are renamed.

New findings

Critical

None.

Should address

None.

Suggestions

R4-G1. Stale CI wording (housekeeping).

Verified

Hand checks of every new or changed expectation. These use the 2026 Alaska guideline (one person $19,950) and $175 a point.

  1. ak_hap Case 18:
    • Inputs: countable income [0, 0], factor [1, 1], and heating_expense [600, 1,200], since FUEL_OIL reads fuel_oil_expense.
    • Sole-household awards: 10 × 1.0 × 1 × 1 = 10 points, $1,750 each. Unit 1's cost test reads its $6,000 rent, which is over $200, and it is unsubsidized.
    • Shares: there are two eligible units, so the equal share is min(½, 0.5) = 0.5. Unit 1 has a bill, so it is not a heat-in-rent unit, R = 0 and the bill-payer share is 1. The dwelling total is $1,800.
    • Unit 1: 600 / 1,800 = ⅓, so 3.33 points → floor(3.83) = 3, $525.
    • Unit 2: ⅔, so 6.67 points → 7, $1,225.
    • Other steps: neither unit gets a vulnerable point (both are 40), and neither has a utility allowance (both unsubsidized).
  2. Countable Case 10: the 17-year-old is a full-time college student, not the tax-unit head, and lives with a 40-year-old. The $12,000 of wages and $1,200 of drill pay are zeroed, and the $2,000 of self-employment counts: 24,000 + 2,000 = $26,000.
  3. Countable Case 13: the lone 17-year-old K-12 student is a full-time student and not a tax-unit head, but the SPM unit has no adult, so the student is not exempt: $12,000.
  4. Base Case 86: three units each have $24,000 of basic pay, which is $2,000 a month. That is above $1,662.50 and at or below $2,078.125, so the factor is 0.6 for each. Eielson, Kodiak Station and Eareckson are all base places: $0, $0, $0.
  5. Renamed cases and comment-only changes (base 49, 55 and 87; income factor 4) change no expectation.

Guards and checks:

Axiom

axiom: TheAxiomFoundation/rulespec-us#1901 queued is valid. The issue is OPEN, labelled pe-parity, was updated 2026-10-28 19:19 UTC, and states that it describes e3a66e7bcc.

What the issue now matches:

  • Required outputs:
    • Countable income uses the student_wage_sources exemption with the adult condition and the 20 unearned sources, without general_assistance.
    • ak_hap defines H as heat in rent with heating_expense 0, so a unit with heat in rent and a bill is a bill payer.
    • The base benefit excludes the 136 tribal places and the four base codes 20716, 21370, 26100 and 41210.
  • Companion tests:
    • Tests 2-4 use the exact tops ($24,937.50, $29,925, $4,987.50, $6,762.50 and $175,812.50, plus the four-person $61,872 → 0.5).
    • 10(h) and 10(i) are Cases 17 and 18.
    • 12 pays all four bases $0.
    • 13(c) adds the drill pay and the lone-minor case.
    • 13(j) is the General Relief Assistance case.
  • Interpretations: 1-4, 7, 9, 12 and 13 reflect this round's fixes.

The issue is dispatch-ready. R4-G1 covers its one stale CI sentence.

CI

gh pr checks 10341 for run 40753133183 at e3a66e7bcc, re-checked at the end of this review: 34 of 34 checks pass, none pending.

  • Quick Feedback: the AK files pass with ak_hap 18, base benefit 87, countable income 33, household size 4 and income factor 23 cases.
  • All suites: all four state baseline shards, every contrib and Rest shard, Microsimulation and Household API Partners pass.
  • Known failure: the main-caused test_social_security_input_state_machine failure does not appear.

Branch

  • Position: 21 commits ahead of main and 1 behind. The missing commit is c55b806541, a version bump that touches only CHANGELOG.md, pyproject.toml and uv.lock and removes the ND changelog fragment.
  • Merge check: git merge-tree --write-tree PolicyEngine/main e3a66e7bcc exits 0 with no conflicts.
  • Merge commit: 7065c18a2f is an unmodified auto-merge.
  • Siblings: other open LIHEAP PRs that edit the coverage line may hit a one-line conflict, whichever lands first (branch note).

Verdict: APPROVE

@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.

Approving round 4: 0 critical, 0 should. All three round-3 items are fixed and pinned, and the coverage line keeps AK plus every sibling. CI is 34/34. Full report in the comment above.

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 Alaska LIHEAP regular heating assistance

2 participants