Skip to content

Add Colorado LEAP regular heating assistance - #10609

Open
hua7450 wants to merge 8 commits into
mainfrom
co-liheap-wave2c
Open

hua7450 wants to merge 8 commits into
mainfrom
co-liheap-wave2c

Conversation

@hua7450

@hua7450 hua7450 commented Nov 2, 2026 •

Copy link
Copy Markdown
Collaborator

Adds Colorado Low-income Energy Assistance Program (LEAP) regular heating assistance for FY2026 (November 1, 2025 to April 30, 2026). Under 9 CCR 2503-7 section 3.758.47, the award is the estimated home heating cost (the reported primary-fuel bill, or the heat-in-rent standard for the dwelling and fuel), times 43% to 62% for electric heat, less a 0%, 10%, 20% or 30% income contribution by poverty level, divided among households sharing the dwelling, less $180 in subsidized housing, paid between $200 and $1,000. Income must be at or below 60% of state median income ($3,607 a month for one person, $9,574 for eight, $208 more per member up to 15), with the federal 110% poverty-guideline floor on the actual size.

Fixes #10604

Regulatory authority

Eligibility

Requirement Source How modeled
Colorado residence 3.753.21 defined_for = StateCode.CO
Household size 3.751.1 (Household); 3.751.2 C; 3.753.18; 3.752.23 U Members with is_citizen_or_legal_immigrant, not is_in_foster_care (January), capped at 15
Income at or below 60% of state median income 3.752.22 D; plan 2.1; manual pp. 4, 89 12 x the printed monthly limit: 60% of the FY2026 SMI ($138,760 for four) by size, divided by 12 and rounded down for sizes 1-8, then the printed $208 a member
Federal 110% floor 42 U.S.C. 8624(b)(2)(B) Income below 110% of the 2025 guideline for the actual qualified, non-foster size (before the cap) is not excluded; binds from 21 members
No categorical eligibility or asset test plan 1.4, 2.3; 3.752.24 SNAP, SSI and TANF receipt do not bypass the limit
Responsibility for heating costs 3.752.25; plan 2.3; manual p. 85 A positive estimated cost; heating_type not NONE or UNSPECIFIED; subsidized housing (receives_housing_assistance or is_in_public_housing) with heat in rent is ineligible; hotels need heat in rent

Countable income

Item Source How modeled
Earnings of members 18 or older 3.752.22 B-C; 3.755.21 I-J; 3.752.23 Q Wages, military_basic_pay, net self-employment (including SSTB), farm income and partnership_s_corp_income, each floored at zero
Unearned income, all ages 3.752.21; 3.752.211; plan 1.9 Rent and farm rent, interest, dividends, unemployment, strike benefits, pensions, military retirement, railroad retirement, retirement-account distributions, non-Social Security survivor and private disability benefits, workers' compensation, veterans benefits, general assistance, Old Age Pension (co_oap), the state supplement for disabled or blind SSI recipients (co_state_supplement), estate and trust income, alimony, child support, help from family or friends, gambling winnings, and miscellaneous_income and gi_cash_assistance as payments "from any other source" (3.752.21), each floored at zero
Social Security and SSI 3.752.21 I; 3.752.211 H-I; 3.755.21 C; plan 1.9; manual p. 7 Gross social_security (before Medicare premiums) and ssi, cents dropped from each person's monthly amount
Colorado Works 3.752.21 L Take-up-gated tanf, added once per SPM unit
Not counted 3.752.23 A, E, Q, U SNAP, housing assistance, earnings under 18, foster members' income (nonqualified members' income counts, 3.753.18)

Benefit

Step Source How modeled
A. Estimated home heating cost 3.758.47 Step A; manual pp. 29, 90-92 The reported annual bill for the heating_type as the prior November-April cost; with heat in rent, the standard for the fuel and the new input co_leap_dwelling_type (default house or modular home)
B. Statewide adjustment manual p. 92 0%
C. Electric heat Step C; manual pp. 5, 92-93 62%, 48%, 43% or 50% by dwelling, on electric bills and the electric rent standard; SOLAR is treated as electric
D. Household income contribution Step D; manual pp. 4-5, 93 0%, 10%, 20% or 30% at the printed monthly 75%, 125% and 175% bounds ($978, $1,630, $2,282 for one person), reproduced from the 2025 guideline, plus $344, $573 or $802 per member over 8
E. Shared living Step E; manual pp. 93-94 Divided by the number of SPM units in the household, eligible or not
F. Subsidized housing Step F; manual pp. 90, 94 Less $180, after the division (the manual's order; see below)
G. Award Step G; plan 2.6; manual pp. 5, 95 At least $200, at most $1,000

Not modeled

Item Source Treatment
Flat rates when approved-vendor history is missing or invalid 3.758.47 Step A 2; manual pp. 4, 85, 91 Not encoded. No input identifies missing or invalid history, and a true $0 bill can mean someone else pays. A household with a known fuel and no bill history gets $0 where the source pays the flat rate, up to the $1,000 maximum
Propane bottles; gathered wood manual pp. 4-5, 30 Bulk propane and purchased wood
Heat surcharge or individual meter in subsidized housing with heat in rent 3.752.25 A 3; plan 2.3 No input; ineligible
Shared meters and the nine-household limit 3.751.2 C; 3.752.25 A 6 SPM units in the household
Hotel 30-day residence; institutional, dormitory and non-traditional dwellings 3.752.25 B Not identified
30-day income period; four of eight weeks of earnings 3.752.22 A-C Annual income
Rental expenses limited to maintenance 3.755.21 I 2 D rental_income is net of its tax deductions
Adoption assistance, lease bonuses, military allotments, insurance proceeds, jury duty, legal settlements, Non-Categorical Refugee Assistance, in-kind earnings 3.752.21-3.752.212; plan 1.9 No dedicated input; miscellaneous_income counts them when reported there, and rental_income carries royalties
LLC and S-corporation owners' costs; a partnership loss against S-corporation income 3.755.21 J partnership_s_corp_income is net, although the rule gives these owners no cost exclusion, and it nets the two before the per-source floor, as 29 merged state LIHEAP lists do
Statuses in 3.753.16 H-L (trafficking victims, special immigrant visas, battered aliens, Amerasians, certain Canadian-born American Indians); a member with no Social Security number 3.753.16; 3.751.1 No immigration_status value or input; those people are out of size, with income counted
Under-18 earnings exclusion only for children living with a parent or guardian; kinship members 3.752.23 Q, U All under-18 earnings excluded; kinship not identified
Crisis, furnace repair (CIP), weatherization plan 1.1 Out of scope

The manual's FY2026 statement of no statewide adjustment (p. 92) is followed over the 20% in its examples (pp. 99-100). The rates handout (p. 5; plan attachment p. 6) is followed over the heat-in-rent chart on p. 92, which omits tiny homes and swaps two unused propane-bottle amounts. The statute's 110% floor is applied before the rule's 15-member cap (backlog entry us-co:liheap-income-floor-vs-smi-limit in source_conflicts/candidates.yaml). Rule 3.752.21 counts payments "from any other source" while plan 1.9 leaves Other unchecked; the model follows the rule and the manual. Manual p. 82 lists "All one-time non-recurring lump sum benefits received" as exempt, while rule 3.752.21 A and plan 1.9 count winnings; gambling_winnings follows the rule and plan.

The $180 order follows the manual over the literal rule text. Step F (rule p. 43; plan attachment p. 2) deducts the allowance from the cost "remaining after Step B", while manual p. 90 says "Apply the adjustments in the order listed in the following section" with the allowance last (p. 94). Step F is lettered after Steps C-E, and the same words sat under the 2017 rule's Step E, after the electric and sharing steps. Two households sharing a $1,000 bill at a 10% contribution get $270 this way and $369 under the literal reading (backlog entry us-co:leap-subsidized-allowance-order, ruled 2026-11-02).

The contribution bands and income limits follow the whole-dollar monthly tables printed in the plan attachment (p. 5) and manual (p. 4), not the exact percentages of Step D and 3.752.22 D, which differ by up to $2.38 a month. An adult with $978.10 a month (74.998% of the guideline) and a $1,000 bill gets $900 under the printed $978 and $1,000 under the percentage (backlog entry us-co:leap-whole-dollar-income-tables, ruled 2026-11-03).

The rule is followed over the plan and manual on two income items: miscellaneous_income and gi_cash_assistance count under the catch-all in 3.752.21, with plan 1.9's Other unchecked (us-co:leap-catch-all-income), and gambling_winnings counts as prizes under 3.752.21 A despite manual p. 82's lump-sum line (us-co:leap-prizes-lump-sums).

Two rent-standard choices are inferences. The electric standard takes the share: Step G reaches costs "determined in Step A, 1-3" and the Step C table is headed "HEAT PORTION OF TOTAL ELECTRIC EHHC", though Step C says "electric usage costs" and manual p. 94 says "Multiply the six month actual electric costs". Each electric standard is about 35% of the electric flat rate, like the other fuels, so it is not already net of the share. No worked example has electric heat in rent; without the share a house would get $472, not $292.64. Fuel oil reads the column headed Fuel Oil/Kerosene (p. 5; Coal/Fuel Oil/Kerosene on p. 92), because the tables also print a Propane Fuel Oil column, which gives a house $405 where this column gives $378, and a townhouse $240 where this column gives $444.

No Colorado source lists solar heat and the rate tables have no solar column, so a SOLAR home is treated as electric (an inference): the shared heating_expense reads its electric bill, which takes the Step C share, and heat in rent takes the electric standard. Earlier years are unverified backfilled estimates. Period 2027 carries Colorado's FY2026 parameters forward, while the federal SMI and poverty guideline move, so the one-person limit becomes $3,774 a month. CDHS's 2026-27 income table is not encoded.

Microsimulation: heating_type, the per-fuel bills and heat_expense_included_in_rent are not in current datasets; callers must supply them.

Test plan

57 YAML cases in 8 files. CI ran the first 56 at 2381db2c81; the military basic pay case added since has not run. They cover:

  • limits for sizes 1-15 at the printed amount and one cent a month above, size zero, the 15-member cap, and 25-member households on either side of the federal floor;

  • every contribution bound for sizes 1-15, zero and negative income, and the award;

  • all nine electric shares, every heat-in-rent standard, each fuel's bill, solar as electric, unsupported rent-included fuels, zero and negative bills, the $200 and $1,000 limits, a direct-billed hotel;

  • shared bills, an ineligible sharing household, the $180 after the division, public housing, subsidized heat in rent;

  • income: business streams, the unearned list, Social Security and SSI cents, earnings at 17 and 18, foster and nonqualified members, loss floors, TANF once and when taken up, SNAP, modeled unemployment, lottery, military and railroad retirement, trust income, the state supplement, miscellaneous income and guaranteed-income cash; a mixed-state vector.

  • YAML tests with expected values from the rules, the manual's rates handouts and the plan attachment

  • Source-conflict register entry for a statute reading: backlog entries in source_conflicts/candidates.yaml: us-co:liheap-income-floor-vs-smi-limit for the federal 110% floor and us-co:leap-subsidized-allowance-order for the $180 order; no # Source conflict marker until they are registered

  • make format

  • Changelog fragment in changelog.d/

  • CI passes

axiom: TheAxiomFoundation/rulespec-us#1992 queued

🤖 Generated with Claude Code

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

DTrim99 commented Nov 2, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Add Colorado LEAP regular heating assistance

PR #10609 (author: hua7450), head 2381db2c81. This is a first review. The PR adds the regular heating benefit of Colorado's Low-income Energy Assistance Program (LEAP) for FY2026 (November 1, 2025 to April 30, 2026), under 9 CCR 2503-7. It includes:

  • 21 parameters and 9 variables (8 computed, plus the new input co_leap_dwelling_type);
  • 8 test files (56 cases);
  • a programs.yaml entry (coverage line and state list);
  • two source_conflicts/candidates.yaml backlog entries;
  • a changelog fragment.

The PR has no reviews or comments yet, and it touches no partner test file.

Path prefixes:

  • P/ = policyengine_us/parameters/gov/states/co/cdhs/leap/
  • V/ = policyengine_us/variables/gov/states/co/cdhs/leap/
  • T/ = policyengine_us/tests/policy/baseline/gov/states/co/cdhs/leap/

Sources read for this review:

Summary

What is right. The FY2026 tables are encoded faithfully, and the structure follows 3.758.47:

  • Income limits. All 15 limits reproduce the printed monthly table (manual p. 4; plan attachment p. 5) from the FY2026 SMI ($138,760). The 110% floor of 42 U.S.C. 8624(b)(2)(B) is applied to the actual qualified size before the 15-member cap, with a strict "less than"; it binds from 21 members.
  • Contribution bands. All 24 printed monthly bounds and the $344, $573 and $802 increments are reproduced.
  • Heating cost and award.
    • All 45 heat-in-rent cells (5 fuel columns × 9 dwellings) and the 9 electric shares match plan attachment p. 6 and manual p. 5.
    • The 0% statewide adjustment (manual p. 92), the division among all sharing households "whether or not" eligible (Step E), the $180 allowance and the $200 / $1,000 limits (plan 2.6; matrix p. 3) are all encoded.
  • Eligibility. Subsidized heat in rent is ineligible (3.752.25 B 5; plan 2.3), and hotels need heat in rent (B 8). There is no categorical eligibility or asset test.
  • Countable income.
    • Social Security is counted gross of Medicare (3.755.21 C), so no netting is needed. Social Security and SSI cents are dropped per recipient.
    • Each source is floored at zero separately, so losses offset nothing.
    • Railroad retirement, military_retirement_income, total_unemployment_compensation, Colorado Works (once, take-up gated) and both Colorado supplements (co_oap, co_state_supplement) are counted.
  • Tests. Every one of the 29 income-source entries is pinned by a positive test. I hand-checked 13 expectations below, and CI ran all 56 cases green.

There are no critical findings and three should-address items:

  • S1. The $180 allowance order. The $180 subsidized-housing allowance follows the manual's order rather than Step F's "remaining after Step B". The backlog entry says follows: conflicting-source and state: unreviewed, which is a manual-over-rule choice with no reviewed record.
  • S2. Whole-dollar tables. The contribution bands, and less clearly the income limits, use the manual's whole-dollar tables instead of the rule's percentages (Step D; 3.752.22 D with IM 2025-02). Nothing records the choice.
  • S3. Military basic pay. military_basic_pay is not counted.

There are also six suggestions (G1-G6):

  • G1: the published 2026-27 income table;
  • G2: slips in the Axiom issue;
  • G3: flat rates;
  • G4: recording the plan-vs-rule income choices;
  • G5: two unreachable guards;
  • G6: housekeeping.

Status.

  • CI: 34 of 34 checks pass at the head.
  • Branch: 7 commits ahead of main (3 of them merges) and 8 behind. It merges cleanly.
  • Siblings: the PR shares the LIHEAP coverage line and candidates.yaml with seven open wave PRs (branch note).

Critical (must fix)

None.

Should address

S1. The $180 subsidized-housing allowance follows the manual's order, and the record says the choice is against the rule and unreviewed

  • Where:
    • V/co_leap.py:33-34 subtracts the allowance after the contribution and the division.
    • source_conflicts/candidates.yaml:1605-1633 (us-co:leap-subsidized-allowance-order) has follows: conflicting-source and state: unreviewed.
  • Sources:
    • Step F (rule p. 43, repeated in plan attachment p. 2): "The State Department shall adjust the amount of estimated home heating cost remaining after Step B if the household resides in subsidized housing ... A flat rate rental cost allowance for heating ($30 per month or $180 per heating season) shall be deducted from the remaining amount of estimated home heating costs. If the household does not live in subsidized housing, the amount remaining after Step B shall be the estimated home heating cost."
    • Step G: "subtracting the applicable adjustments listed above, in Steps B-F from the household's estimated home heating costs (EHHC) determined in Step A, 1-3."
    • The manual. Page 90 says "Apply the adjustments in the order listed in the following section", and page 94 lists the allowance last.
  • Why it is a finding.
    • The candidates.yaml header defines conflicting-source as "against the statute; the 2026-10-19 rule calls for a model change". unreviewed means no one has decided.
    • So the code takes the manual's reading of a binding rule, and the record itself says the model should change.
    • The wave rates a manual-over-rule choice without a state: ruled record as should (MT, UT, AK r2 S1, PA S2).
  • Effect.
    • The PR's own example: $270 here, against $369 with the allowance first.
    • Without sharing, a subsidized house with electric heat, a $1,000 bill and a 0% contribution gets 620 − 180 = $440 at the head. With the allowance first it gets (1,000 − 180) × 0.62 = $508.40.
    • Gas at $1,000 with a 10% contribution gives $720 against $738.
  • My read. The text doesn't settle the order:
    • "Remaining after Step B" sits under a step lettered after C-E, and Step G subtracts "Steps B-F".
    • The same words sat under the 2017 rule's Step E, after the electric and sharing steps.
    • That is the kind of tie CONTRIBUTING.md resolves with "the agency breaks true ties", so keeping the code is defensible. But the record has to say so and be decided.
  • Fix (either):
    • (a) Keep the code and get a ruling. Record it as state: ruled, with the basis: the lettering, Step G, the 2017 history, manual pp. 90 and 94, and the agency tie-break. Word the entry so it no longer says the model should change.
    • (b) Follow Step F's text. Change Case 7 to $369 and update the candidate.
    • Either way, update the body and Axiom interpretation 9.

S2. The contribution bands and income limits use the manual's whole-dollar tables instead of the rule's percentages, and nothing records the choice

  • Where:
    • V/co_leap_income_contribution_rate.py:33-40 rounds the monthly guideline half up, then each percentage of it half up, and compares monthly income with those dollar amounts.
    • V/co_leap_income_limit.py:20-28 floors 60% of SMI to whole dollars a month and adds the printed $208 per member.
    • The dollar edges are pinned by T/co_leap_income_contribution_rate.yaml Cases 1-3 and T/co_leap_eligible.yaml Case 1.
  • Sources:
    • Contribution, Step D (rule p. 43): "The state department shall reduce the amount the of estimated home heating costs (EHHC) based on the chart below: ... 0 – 75% FPL 0%; 75.01 – 125% FPL 10%; 125.01 – 175% FPL 20%; 175.01+% 30%." The rule defines "Federal Poverty Level" as the HHS guidelines (p. 3). The manual prints monthly dollar bounds with no formula (p. 4).
    • Limits, 3.752.22 D (rule p. 23): households "up to and including 60 percent (60%) of the state median income level ... shall meet the income requirements". The SMI level is the one "set forth in 45 C.F.R. § 96.85 (2025), and the Low Income Home Energy Assistance Program Information Memorandum 2025, which are hereby incorporated by reference".
    • IM 2025-02 Attachment 4 (pp. 1, 4) lists Colorado's 60% SMI as $43,293 for one person and $124,884 for twelve.
    • The adjustment clause. The rule's next sentence lets the department "adjust the income limits annually based on funds available and the state median income guidelines."
  • Size of the gaps.
    • Bands. The 24 printed bounds differ from the exact percentages by −$0.54 to +$1.38 a month (size 1: $978 against $978.125; size 5 at 175%: $5,492 against $5,490.625). The per-member increments widen this to +$2.38 at size 15 (75%: $5,793 against $5,790.625).
    • Limits. The limits sit $0 to $1.42 a month below 60% SMI: $43,284 against $43,293 a year for one, and $124,872 against $124,884 for twelve.
  • Effect (hand-traced, 2026, gas bill $1,000):
    • One adult with wages $11,737.20 ($978.10 a month, 74.998% of the guideline). The rule gives 0% and $1,000. The head gives 10% and $900.
    • 15 qualified members with $69,504 ($5,792 a month, 75.02%). The rule gives 10% and $900. The head gives 0% and $1,000.
    • One adult with $43,290 ($3,607.50 a month). This is within 60% SMI ($43,293), so the household is eligible at 30%: $700. The head gives $0.
  • Severity: should. This is the pattern of AK Add Alaska LIHEAP regular heating assistance #10341 S1(b): Addendum E's whole-dollar floors against the exact percentages of 7 AAC 44.
    • That was fixed by following the regulation and recorded as us-ak:hap-income-limit-rounding with follows: statute.
    • Here, Axiom interpretations 3 and 4 describe the gaps, but neither the body nor candidates.yaml records them.
  • Fix:
    • Bands: either compare monthly income with the exact percentage of the guideline ÷ 12, as Step D reads, or record the manual reading as a candidate and get it ruled.
    • Limits: the adjustment clause is a fair basis for the printed table, so record that reasoning. Otherwise, use liheap_smi_limit without the monthly floor, which reproduces Attachment 4.
    • Update the body and Axiom interpretations 3 and 4 to match.

S3. Military basic pay is not counted

  • Where: P/income/sources/earned.yaml:5 lists employment_income, self_employment_income, sstb_self_employment_income, farm_operations_income and partnership_s_corp_income, but not military_basic_pay.
  • Sources:
    • Rule 3.752.22 B counts earned ongoing income as "the countable gross income".
    • Plan 1.9 checks Wages.
    • No exclusion in 3.752.23 A-HH covers service pay; Z excludes only G.I. Bill educational allowances.
  • Effect (hand-traced, 2026, a single service member aged 30 with only military_basic_pay, gas bill $1,000):
    • $45,000: the head counts $0 and pays $1,000. Counted, it is $3,750 a month, above $3,607, so $0.
    • $30,000: the head pays $1,000. Counted, it is $2,500 a month, above $2,282, so 30% and $700.
  • Severity: should. The wave rated this omission a should (UT, AK, PA). Five merged LIHEAP lists (AK, IA, ND, NV, UT) count military_basic_pay next to employment_income, with the note to enter basic pay in only one of the two. So the same household is counted in those states but not in Colorado.
  • Fix:
    • Add military_basic_pay after employment_income, with the Utah/Iowa comment.
    • Give it a distinct positive amount in a countable-income case.
    • Update the body's earnings row and the Axiom issue's earned sources.

Suggestions

G1. The 2026-27 income table is published.

  • The table. The CDHS LEAP page's "2026-27 LEAP Income Limits" lists $3,774, $4,936, $6,097, $7,258, $8,420, $9,581, $9,799 and $10,017 for sizes 1-8, then $10,234, $10,452, $10,670, $10,888, $11,106, $11,323 and $11,541 for sizes 9-15.
  • The model.
    • Period 2027 (a carried-forward estimate) matches it for sizes 1-8.
    • It keeps the $208 increment for larger sizes, so size 9 is $10,225 (−$9) and size 15 is $11,473 (−$68 a month, −$816 a year).
    • The FY2027 table prints sizes 9-15 at floor(liheap_smi_limit(size) / 12).
  • Severity. 2027 is not claimed, so this is a suggestion (NJ S4).
  • Fix. Encode the 2026-27 season once its rates handout is available, or compute sizes 9-15 by formula from 2026-11-01, and adjust the body's 2027 sentence.

G2. Three slips in rulespec-us#1992. The issue is current: its head d79caaa1b2 has the same Colorado code as 2381db2c81, which only merges main. But:

  • the Required outputs row for co_leap_heating_cost applies the electric share "for ELECTRICITY, 1 otherwise", while the head (and interpretation 12) applies it to SOLAR too;
  • the implementation paragraph says "sources/unearned (22)", while the head and the Required outputs list 24;
  • the same paragraph names only us-co:liheap-income-floor-vs-smi-limit; the head also adds us-co:leap-subsidized-allowance-order.

Fix these along with the S1-S3 updates, and repoint the issue to the new head.

G3. Flat rates. Step A 2, manual pp. 4 and 91, and plan 2.5 use the flat-rate table when vendor history is missing, invalid or from a vendor without an agreement. The PR documents the gap. An optional input (for example a boolean co_leap_uses_flat_rate) that routes to the published flat-rate table would cover bulk-fuel buyers. For example, a house heated with wood has a $1,370 flat rate, which reaches the $1,000 maximum, whatever bill is reported.

G4. Record the plan-vs-rule income choices. The PR rightly follows the rule on two items where the plan or the manual differ:

  • miscellaneous_income and gi_cash_assistance count under 3.752.21's "payments from any other source", while plan 1.9 leaves Other unchecked;
  • gambling_winnings counts as prizes (3.752.21 A; plan 1.9), while manual p. 82 exempts "All one-time non-recurring lump sum benefits received".

Add follows: statute candidates for both, as in MN #10433 G3 and NM #10431 G2.

G5. Two unreachable guards.

  • V/co_leap_eligible.py:56-57 (fuel != NONE, fuel != UNSPECIFIED) can't change a result. co_leap_heating_cost is $0 for both fuels, because heating_expense returns 0 and the rent table has no column for them, so cost > 0 already excludes them. Deleting the two guards fails no test, and no test can pin them through ordinary inputs.
  • The final max_(income, 0) at V/co_leap_countable_income_person.py:37 is the same: every term is already at least zero.

Delete them, or note why they stay.

G6. Housekeeping.

  • V/co_leap.py:11-13: the comment cites "PDF pages 90,92-95", but the href opens page 92. CLAUDE.md has the href open the first cited page (#page=90).
  • P/payment/fpg_year_lag.yaml says "from this many years before the heating season". FY2026 begins in November 2025 and uses the 2025 guidelines, so the lag is relative to the period's calendar year, not the season.
  • The body's Not modeled table could add 3.755.21 I 2 D (rental expenses limited to maintenance, while rental_income is net of tax deductions). Axiom interpretation 2 already notes it.

Verified correct

  • Limits and the federal floor.
    • liheap_smi_limit floored to the month reproduces all eight printed rows ($3,607 to $9,574) from SMI $138,760. Sizes 9-15 add $208.
    • The limit stays below the 8624(b)(2)(B) ceiling: size 1 is $43,284 against the greater of 150% FPG ($23,475) and 60% SMI ($43,293).
    • The limit stays above the 110% floor through size 20, and the floor test covers sizes 21 and up.
  • Contribution bounds. Half-up rounding of the monthly 2025 guideline and of each percentage reproduces all 24 printed cells. I checked each one, for example 1,763 × 0.75 = 1,322.25 → 1,322 and 3,138 × 0.75 = 2,353.5 → 2,354. Bands are inclusive at the printed dollar amount.
  • Rates.
    • Every heat-in-rent value matches plan attachment p. 6 and manual p. 5. Propane reads the "Propane Fuel Oil" column; fuel oil, kerosene and coal read "Fuel Oil/Kerosene" (labelled "Coal/Fuel Oil/Kerosene" on manual pp. 91-92).
    • The electric shares are 62/62/48/48/43/43/43/43/50.
    • The electric rent standard takes the share once, which follows Step G's reach to "Step A, 1-3" (a documented inference).
  • Award.
    • clip(·, 200, 1000) matches the matrix ("Benefit calculations less than or equal to $200: LEAP benefit issued is $200").
    • No benefit path can go negative.
    • Division counts every SPM unit at the address (Step E, "whether or not" eligible).
  • Household.
    • Size is capped at 15 (3.751.2 C).
    • Nonqualified members are left out of size but their income counts (3.753.18). Foster members are left out of both (3.752.23 U).
    • Earnings under 18 are excluded (Q; the all-minors approximation is documented).
  • Income definition.
    • Social Security is gross (3.755.21 C), so Medicare netting doesn't apply.
    • Cents are dropped per recipient for Social Security and SSI (3.752.21 I; 3.752.211 H).
    • Each source is floored per person (rental loss vs pension, Case 12; business loss vs wages, Case 8).
    • SNAP is excluded (3.752.23 A).
    • TANF is take-up gated and counted once.
    • There are no disregards to apply.
  • Batch checks.
  • Mutation. All 29 list entries carry a distinct positive amount in some case. Every branch is pinned except the two guards in G5.
  • Housekeeping. All 21 descriptions follow the template, and the anchors show their values. The changelog fragment is top-level. programs.yaml (verified_years: "2026") is backed by period-2026 tests.

Hand checks (period 2026):

  1. T/co_leap.yaml Case 1: a $199.99 bill rises to $200; $1,000.01 is capped at $1,000; a $0 bill is ineligible, $0.
  2. Case 2: 11,736.12 / 12 = $978.01 > $978, so 10% and $900. 27,384.12 / 12 = $2,282.01, so 30% and $700.
  3. Case 4: 472 × 0.62 = 292.64. 343 × 0.48 = 164.64, which rises to $200. 227 × 0.43 = 97.61. 393 × 0.5 = 196.50.
  4. Case 5: 600 − 180 = $420. 100 − 180 rises to $200. Subsidized heat in rent is ineligible, $0.
  5. Case 6: both units have $2,000 a month. Size 1 is at 20%: 734 × 0.8 / 2 = $293.60. Size 3 is at 10%: 734 × 0.9 / 2 = $330.30.
  6. Case 7: 1,000 × 0.9 / 2 − 180 = $270.
  7. Case 14: the guideline for 25 is 15,650 + 24 × 5,500 = 147,650, and × 1.1 = 162,415.
    • $150,000 is below it, so the household is eligible. The size-15 175% bound is 7,898 + 7 × 802 = 13,512 ≥ 12,500, so 20% and $800.
    • $162,415 is not below it, so ineligible.
  8. Case 16: 15,000 / 12 = $1,250, so 10% and $900.
  9. T/co_leap_income_limit.yaml Case 1: floor(floor(138,760 × 0.6) × 0.52) = 43,293, and floor(43,293 / 12) = 3,607, so $43,284. Size 15: 9,574 + 7 × 208 = 11,030, so $132,360.
  10. T/co_leap_income_contribution_rate.yaml Case 3, size 2: 21,150 / 12 = 1,762.5 → 1,763, and × 1.75 = 3,085.25 → 3,085, so $37,020.
  11. T/co_leap_countable_income_person.yaml Case 2: the 18 listed amounts sum to 13,150, plus military retirement 800 = $13,950.
  12. Case 3: floor(1,000.99) + floor(200.99) = 1,200, and × 12 = $14,400.
  13. Case 12: 700 × 12 + 294 × 12 = $11,928.

Axiom line assessment

axiom: TheAxiomFoundation/rulespec-us#1992 queued is valid:

  • Status. The issue is OPEN, labelled pe-parity, and was updated on 2026-11-02.
  • Head. It describes d79caaa1b2, whose Colorado code is identical to the head's.
  • Dispatch-ready. It has the blockers, module paths with corpus status, verbatim rule, manual, plan, IM and FR text, Required outputs for every variable, and 15 companion tests derived from those sources rather than from PolicyEngine output.
  • Remaining work. Fix the slips in G2. After the S1-S3 changes, update interpretations 3, 4 and 9, the earned sources and the affected companion tests, and repoint the issue to the new head.

CI status

  • Current head. All 34 checks pass at 2381db2c81 (run 41500800939, started 2026-11-02 18:27 UTC). That includes PR validation (guard tests) and the baseline state shards that run the Colorado YAML. I re-checked near the end: 34 pass, none pending.
  • Previous head. The earlier run at d79caaa1b2 failed only test_trustees_2026_economic_assumptions.py::test_the_tree_has_the_expected_readers (Rest shard 2). That failure is unrelated to Colorado and is superseded.

Branch status

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: 0 critical, 3 should (the $180 allowance follows the manual's order over Step F with no reviewed record; contribution bands and limits use the manual's whole-dollar tables over the rule's percentages, unrecorded; military basic pay not counted). Full report in the comment above.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@hua7450
hua7450 requested a review from DTrim99 November 3, 2026 21:44
@hua7450

hua7450 commented Nov 3, 2026

Copy link
Copy Markdown
Collaborator Author

The review fixes are in 23d7f87982, and the PR body and rulespec-us#1992 are updated to match. Tests were not run locally, so CI is the first run of the new case.

Finding Result
S1 $180 order Code unchanged, record updated. The allowance stays last, in the manual's order. us-co:leap-subsidized-allowance-order is now state: ruled, follows: gap-fill, so it no longer says the model should change.
S2 whole-dollar tables Code unchanged, record added. The model keeps the printed tables. The plan attachment (p. 5) prints the same tables as the manual (p. 4) and says Colorado "uses the FPL chart", so these aren't only the manual's. Recorded as us-co:leap-whole-dollar-income-tables, state: ruled, with the examples and the rule's adjustment clause.
S3 military_basic_pay Changed. It's counted after employment_income. New Case 15: $30,000 pays $700 on a $1,000 bill.
G1 2026-27 table Not encoded. 2027 isn't claimed and no rates handout is in hand. The PR body says the table isn't encoded.
G2 Axiom slips Fixed in rulespec-us#1992.
G3 flat rates Not built. An earlier ruling leaves them unbuilt, and the optional input would be a new input outside this PR's scope.
G4 income choices Recorded: us-co:leap-catch-all-income and us-co:leap-prizes-lump-sums, both follows: statute.
G5 unreachable guards Removed both. UNSPECIFIED still pays $0, because cost > 0 excludes it.
G6 housekeeping Done: the co_leap.py link opens p. 90, the fpg_year_lag description is corrected, and the PR body has a row for rental expenses. The programs.yaml entry also moved after AZ, to match CA and CT.

This branch has not been deployed

No deployments
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 Colorado LEAP regular heating assistance

2 participants