Repository navigation
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
PR Review: Add Montana LIHEAP regular heating assistancePR #10435 (author: hua7450), head
The PR has no reviews and no comments. It touches no partner test file. Path prefixes:
Sources read for this review:
SummaryWhat is right. The tables and mechanics are encoded accurately:
There are no critical findings and four should-address items:
There are also four suggestions:
Status.
Critical (must fix)None. Should addressS1. Medicare premiums are netted only as Part B, and only from Social Security; ARM 37.70.407(1)(bb) deducts any out-of-pocket health insurance premium
S2. Income of members under 18 is excluded, following the manual, although ARM 37.70.401(1) counts all nonexcluded income of household members
S3. 20 of the 23 income-source entries and three branches have no test that would fail if they were dropped
S4. Non-traditional dwellings heated with SOLAR or OTHER get $0, although manual 3.36 pays them $150 regardless of heat type
SuggestionsG1. State SSP (item 17).
G2. Record the source choices. None of these comments matches the #10287 ratchet's pattern, so the guard does not prompt for an entry. CLAUDE.md still asks for a register entry and a
G3. Revision drift.
G4. Small documentation points.
Verified correctHand-checked expectations (16, all match the head):
Batch checks:
Axiom line assessment
CI status
Branch status
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes: 0 critical, 4 should (Medicare premium netting narrower than ARM 37.70.407(1)(bb); under-18 income excluded against ARM 37.70.401(1); untested income sources and branches; SOLAR/OTHER non-traditional dwellings pay $0). Full report in the comment above.
Apply DTrim99's round 1 review: tests that pin every income source, the rule and documentation fixes, and source-conflict candidates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…into mt-liheap-wave1d # Conflicts: # policyengine_us/programs.yaml # source_conflicts/candidates.yaml
|
Thanks, David. Round 1 is in
The PR body and TheAxiomFoundation/rulespec-us#1896 now describe this head, including 61 cases ( I did not run the tests locally; CI passed every check at |
PR Review (round 2): Add Montana LIHEAP regular heating assistancePR #10435 (author: hua7450), head
The PR touches no partner test file. Path prefixes:
Sources re-read for this round:
SummaryWhat changed. The fix commit resolves S1-S3 and all four suggestions. Each S1-S3 fix is pinned by a test that fails without it:
S4 is declined, and I accept the reason. Manual 8.1 limits heating assistance to the six matrix fuels and excludes solar. Read with that, 3.36's "regardless of heat type" means any allowable fuel. One new should. The line that carries the declined reading is the final fuel-column gate, One new suggestion. Categorical households get no (bb) deduction, following manual p. 40. The choice is not recorded (N-G1). Merge, axiom and CI.
Status: 0 critical, 1 should, 1 suggestion open. Prior findings
New findingsCriticalNone. Should addressN1. The fuel-column gate that carries the declined S4 reading is unpinned: deleting it fails no test
SuggestionsN-G1. Categorical households' exception from the (bb) deduction is not recorded
Hand-checked new and changed expectationsAll match the head. District 7 FFY2026 factors and limits are as verified in round 1.
The body and the axiom issue both count 61 cases: 14, 2, 11, 6, 2, 13, 6 and 7. The removed 18-year-old wages case tested only the deleted Verified
Axiom
CI
Branch
Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes, round 2: 0 critical, 1 should. S1-S3 are fixed and pinned, and the S4 decline is accepted (manual 8.1 limits fuels to the six matrix columns). New: the fuel-column gate that carries that decline (mt_liheap.py:102) has no test; add a non-traditional SOLAR or OTHER household expecting $0 (it would be $150 without the gate). Full report in the comment above.
Apply DTrim99's round 2 review: a test for the fuel-column gate, a candidate for the categorical premium deduction, and candidate code paths. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p-wave1d # Conflicts: # policyengine_us/programs.yaml
Adds Montana's LIHEAP regular heating benefit for FFY2026 and FFY2027, administered by the Department of Public Health and Human Services (DPHHS). The model counts citizens and qualified aliens in household size (ineligible members' income still counts), tests the gross income of every member against the greater of 60% of state median income and 150% of the poverty guideline, applies the resource test, and recognizes SNAP, SSI and TANF categorical eligibility. The benefit is the base benefit for the dwelling type, bedrooms and primary fuel times an income and heating-degree-day multiplier for the household's district and percent of poverty, rounded to the nearest dollar. Subsidized households with heat in their rent receive the modified benefit (the greater of 5% of the regular benefit and $25); other heat-in-rent households are capped at half of their rent over the seven-month season; non-traditional dwellings heated with an allowable fuel receive a flat $150. Emergency assistance (Contingency Revolving Fund) and weatherization are out of scope.
Fixes #10425
Regulatory authority
Eligibility
defined_for = StateCode.MTmt_liheap_household_sizesumsis_citizen_or_legal_immigrant; size 0 is ineligibleliheap_smi_limit, 150% of the prior-year FPG) reproduces all 15 FFY2026 and 15 FFY2027 published limits. ARM 37.70.406(1) words sizes 9+ as 150% of poverty; the published tables print 60% SMI at size 9 ($91,432 FFY2026, $97,942 FFY2027) and are followed (us-mt:liheap-income-limit-size-nine)spm_unit_cash_assets) plus non-home real estate equity against the size table (FFY2026 $14,358-$29,290; FFY2027 $14,717-$31,524); business equity (household_business_assets_equity) at most $25,000 per ARM 37.70.408(2) (the manuals print $29,290 and $31,524;us-mt:liheap-business-equity-limit)is_snap_excluded_member); then SSI or TANF: every member an SSI recipient (ssiorreceives_ssi), a TANF assistance-unit member, or a spouse of an SSI recipient or a head or spouse of the own tax unit of an SSI child under 18 (ARM 37.70.401(4)) (the people whose income SSA considers). Waives the income and resource testshas_heating_expenseor heat included in rent;heating_typeUNSPECIFIEDorNONEpays $0Countable income
us-mt:liheap-minor-member-income)mt_ssp), pensions, retirement withdrawals, military retirement, railroad, veterans, workers' compensation, disability, alimony, child support, interest, ordinary dividends, rental and farm rent, general assistance, capital gains, TANFmedicare_part_a_premium,medicare_part_b_premium) up to the benefit, for every household. The dependents and survivors benefits (social_security_dependents,social_security_survivors) of a member aged 18 to 22 who is a full-time student (is_full_time_student) are excluded; retirement and own-record disability benefits count, as do a minor's benefitsfinancial_assistancecounts in full once a member's gifts reach $50 a month (the manual describes a $500 recurring household test; the rule is followed,us-mt:liheap-gift-threshold). The amended rule effective May 23, 2026 excludes monetary gifts (a resource until spent) and 401(1) no longer lists them, so FFY2027 counts none:gift_minimumis $50 from 2025-10-01 and infinite from 2026-05-23us-mt:liheap-categorical-premium-deduction). The exception changes results only for SNAP-categorical households, because SSI and TANF households use the standardsBenefit
payment.non_traditional_benefit; the fuel matrices hold no non-traditional row. Manual 8.1 Fuel Types limits heating assistance to propane, wood, coal, fuel oil, natural gas and electricity and excludes solar, soSOLARandOTHERpay $0 in every dwelling type. A final fuel-column check also withholds from them the non-traditional $150 and the $25 minimum for subsidized heat-in-rent households. The model reads 3.36's "regardless of heat type" as any allowable fuel.pre_subsidy_rent) (ARM 37.70.607(3)).mt_liheap_dwelling_type(Single family, Multi-family, Mobile home, Non-traditional dwelling; default Single family).Not modeled
social_securityinput is givensocial_securityinput without the per-type breakdown counts in fullSource choices
Each choice is a
source_conflicts/candidates.yamlentry whosecode:field lists the files that carry it.us-mt:liheap-minor-member-incomeus-mt:liheap-business-equity-limitus-mt:liheap-gift-thresholdus-mt:liheap-income-limit-size-nineus-mt:liheap-incorporated-table-editionsus-mt:liheap-categorical-premium-deductionEarlier years are unverified estimates through parameter backfilling.
Microsimulation:
heating_type, the heating bills andmt_liheap_dwelling_typeare not in current datasets; callers must supply them.Test plan
62 YAML cases in 8 files:
mt_liheap.yaml15,mt_liheap_household_size.yaml2,eligibility/mt_liheap_categorical_eligibility.yaml11,eligibility/mt_liheap_eligible.yaml6,eligibility/mt_liheap_income_limit.yaml2,income/mt_liheap_countable_income.yaml13,payment/mt_liheap_benefit_income.yaml6 andpayment/mt_liheap_multiplier.yaml7. The 54 cases before review round 1 passed locally on 2026-10-23. Round 1 added 8 cases, re-pinned 2 and removed an 18-year-old's wages case, which now falls in the same class as a minor's wages. CI passed on those 61 cases at the round-1 headf0f876a9c1. Review round 2 addedmt_liheap.yamlCase 15, which pins the fuel-column check; its values are hand-derived and were not run locally, and CI on the new head is pending.published income limits at sizes 1, 8, 9 and 10 for both years;
eligibility boundaries for income, non-business resources and business equity; categorical households over both limits; heating obligation and fuel;
categorical status for SNAP (all members and with a SNAP-excluded member), single SSI, married couple with one recipient, child on SSI, sibling not on SSI, a separately filing adult sibling, TANF unit, reported SSI receipt, the working parent of an 18-year-old SSI recipient (not categorical), and a dependent grandmother outside the TANF unit (not categorical);
countable income: a 17-year-old's wages counted, an ineligible member's income, every listed earned and unearned source including
mt_ssp, Social Security net of Part B, Part B above Social Security not deducted for a SNAP categorical household, a 23-year-old full-time student's survivors benefits counted, the $50 gift threshold in FFY2026 and a $600-a-month gift excluded in FFY2027, premiums deducted and not deducted, capital gains, TANF, a self-employment loss;benefit income standards for SSI individuals, couples, unmarried pairs, TANF units and mixed households;
multipliers at band edges by whole-percent rounding, two districts, FFY2026 versus FFY2027, over-limit categorical, a categorical household exactly at its limit (keeps its band), unknown county;
the manual's $1,247 example, bedroom end rows, every dwelling type, fuel columns, the modified benefit and its $25 floor, the heat-in-rent rent cap, a Missoula County family in FFY2027, a Yellowstone County household with a separately filing adult sibling (ineligible; the SSI child's income counts), a Yellowstone County parent with $36,000 of wages and an 18-year-old full-time student with $9,600 of survivors benefits ($394; counting the benefit would make the household ineligible), a railroad retiree whose Part B premium is deducted ($247), a public-pension retiree who pays Part A and Part B premiums ($317), a parent with a 10-year-old's $9,600 of survivors benefits ($463), and two minimum-wage workers in Yellowstone County: one in a solar-heated yurt (non-traditional) and one in a HUD-assisted apartment whose rent includes heat from another fuel ($0 each; without the fuel-column check, $150 and $25).
YAML tests with expected values from the manuals, rules and plan
ruff formatpolicyengine-core teston the program folder before review round 1 (54 passed); registry and code-health checks passed, 2026-10-23Review round 1:
ruff format,ruff check, YAML parse and candidates checks; the new cases were not run locallyReview round 2: YAML parse and candidates checks (code paths exist and are tracked, ids sorted); Case 15 was not run locally
Changelog fragment in
changelog.d/CI passes
axiom: TheAxiomFoundation/rulespec-us#1896 queued
🤖 Generated with Claude Code