Repository navigation
Conversation
- Encode the FY2025 matrices, income bands and eligibility chart (size 7 on 150% FPG, $672 extra-person amount) alongside FY2026. - Count Social Security and railroad retirement net of the Medicare Part B premium; count military retirement pay. - Follow the draft manual where it conflicts with the plan: count workers' compensation, TEA (through take-up-gated tanf), gambling winnings and capital gains, each with the conflict noted. - Also follow the draft manual on: interest counted only above $200 a month (p137); rental and farm rent as self-employment with the 20% deduction (p141); a minor's earnings excluded only while in school (p133); the student exclusion only for dependent college students up to 23 (p134). - Round monthly countable income to the nearest dollar; floor each income source at zero. - Shorten the registry note and fix reference locators. - Add period-2025, income-source, rounding and fuel cases; tidy tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # policyengine_us/programs.yaml
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9973 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 6 +2
Lines 76 119 +43
Branches 2 2
=========================================
+ Hits 76 119 +43
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
…nings Draft manual 4.7 (page 41) excludes the earnings of members aged 18 enrolled in high school; identified with is_in_k12_school. The full-time-work and emancipation exceptions are not modeled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # policyengine_us/programs.yaml
One reference entry per source; single-page citations keep the page only in the href; multi-page titles end with a quoted #page list and the href opens the first cited page; variable references use '# PDF pages ...' comments above multi-page hrefs (CLAUDE.md, PolicyEngine/policyengine-us PR 10009). Reference lines only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR Review: Add Arkansas LIHEAP regular heating assistancePR #9973: Add Arkansas LIHEAP regular heating assistance (author: hua7450, head Scope: the winter Regular (rate-reduction) Assistance benefit of Arkansas LIHEAP for federal fiscal years 2025 and 2026. The Arkansas Energy Office (AEO) in the Department of Energy and Environment runs the program through community-based organizations; DHS does not. The PR covers:
Crisis, summer (cooling) Regular Assistance on the electric matrix, weatherization, Assurance 16, split benefits and FY2027 are out of scope. The PR changes 33 files: 19 parameters, 6 variables, 6 test files (70 cases), Overall: the FY2025 and FY2026 tables and limits are right where the sources print them, and the income rules follow the accepted plans and the operating application.
There are no critical findings. The four should-address items:
All 70 cases pass locally at the head and on the merged tree. The model outputs quoted below were reproduced by running the head code, or the merged tree for S1. Values that a proposed fix or another reading would produce are hand computations and are labelled as such. The S3 claims and the control mutations come from mutating the code and rerunning the PR's tests. Path prefixes used below:
Line numbers refer to head Source Documents
Critical (Must Fix)None. Should AddressS1. Merge blocker: after merging main, the unearned list reads the reported-only
|
| File:line | Current | Suggested |
|---|---|---|
P/income/limit/max_table_size.yaml:1 |
"publishes income limits up to this household size before adding a separate amount per additional member" | "Arkansas sets income limits through this household size and adds a per-member amount above it under the ..." |
P/income/limit/rounding_increment.yaml:1 |
"publishes monthly income limits in increments of this amount" | "Arkansas uses this increment to round monthly income limits under the ..." |
P/income/sources/earned.yaml:1 |
"counts these earned income sources" | "Arkansas uses these sources as earned income under the ..." |
P/income/sources/unearned.yaml:1 |
"counts these unearned income sources" | "Arkansas uses these sources as unearned income under the ..." |
P/payment/household_size_group.yaml:1 |
"assigns this payment group by household size" | "Arkansas uses this household-size group for the regular heating payment under the ..." |
P/payment/income_band.yaml:1 |
"assigns this payment band by monthly countable income" | "Arkansas uses this monthly countable income band for the regular heating payment under the ..." |
P/income/interest_disregard.yaml:1fits the template. But "this amount of interest" leaves out that the amount is monthly and per member, which the comment and the formula apply. Optional wording: "Arkansas excludes this monthly amount of each member's interest from countable income under the ...".- The other twelve fit:
- excludes:
earned_disregard,interest_disregardandstudent_exclusion/child_age_limit; - limits:
fpg_rateandsmi_rate; - sets:
additional_member_amount; - uses:
fpg_year_lagandsmi_max_size; - provides: the five matrix files.
- excludes:
- Consistency: Add Alabama LIHEAP regular heating assistance #9967 S4, Add Rhode Island LIHEAP regular heating assistance #9972 S4, Add Georgia LIHEAP regular heating assistance #9968 S3, Add Ohio HEAP regular heating assistance #9975 S5, Add Florida LIHEAP regular heating assistance #9969 S2, Add South Dakota LIEAP regular heating assistance #9974 S2, Add Oklahoma LIHEAP regular heating assistance #9970 S4 and Add New Jersey LIHEAP regular heating assistance #9745 S6.
S3. Five listed income sources and two small pieces of logic have no test that would fail if they broke
Each mutation below, applied to the head on its own, still passes all 70 cases.
- Five unearned sources are never positive in any test.
- The sources:
unemployment_compensation(P/income/sources/unearned.yaml:11),strike_benefits(:12),ordinary_dividend_income(:23),veterans_benefits(:24) andfinancial_assistance(:26). - Removing any one of them passes every case (reproduced for each).
- Each maps to a checked 1.9 box: unemployment insurance, strike pay, "Interest, dividends, or royalties", VA benefits and cash gifts.
- Fix: add a column for each to countable-income Case 11 (
T/income/ar_liheap_countable_income.yaml:312), which already checks four sources in a vector, or add them to an existing household.
- The sources:
- The bill term in the direct-responsibility branch (
V/eligibility/ar_liheap_eligible.py:33,(expense > 0) | has_expense).has_heating_expensealready defaults to "bill above zero and heat not in rent". So the term matters only when a caller setshas_heating_expenseto false while reporting a bill.- Reproduced: one adult with $12,000 of wages, gas heat, a $1,200 gas bill and
has_heating_expense: falseis eligible for $182 at head. Without the term the household is ineligible and gets $0. - The input's documentation tells callers to set it directly when the bill is not the heating cost. That argues for respecting an explicit false and dropping the term. Otherwise, pin the current result with that case (as Add Florida LIHEAP regular heating assistance #9969 S3.2 asked for Florida).
- The size-0 mask on the income limit (
V/income/ar_liheap_income_limit.py:39,where(size > 0, ..., 0)).- Without it, a unit with no qualified member gets the one-person limit, because
smi_size_factorclips size 0 to the 52% share. - Reproduced: one undocumented adult has a limit of $0 at head and $28,164 under the mutation.
- Eligibility still gates on
size > 0, whichT/eligibility/ar_liheap_eligible.yamlCase 4 pins, so only the limit variable changes. - Fix: add
ar_liheap_income_limit: 0toT/ar_liheap_household_size.yamlCase 2, as Add Georgia LIHEAP regular heating assistance #9968 S2.3 and Add Florida LIHEAP regular heating assistance #9969 S3.1 asked.
- Without it, a unit with no qualified member gets the one-person limit, because
Three control mutations confirm the method:
- Dropping
size > 0from eligibility failsT/eligibility/ar_liheap_eligible.yaml. - Dropping the NONE check fails the same file.
- Dropping the surcharge term for subsidized heat in rent fails that file and
T/ar_liheap.yaml.
By inspection, the rest is pinned:
- the seven earned sources: countable-income Case 5 breaks if any of its five business and wage sources is dropped, and rental and farm rent are positive in Cases 7, 16 and 18;
- the other nine unearned sources, the per-source loss floors, the interest disregard, and the Part B netting with its floor;
- TEA with and without take-up, the minor and full-time-student exclusions at ages 17 and 18, and MCI rounding at the limit and at a band edge;
- the SMI/FPG switch in both years, each limit rounding and the per-member amount above size 20;
- every band edge tested, each fuel table and the kerosene, wood, coal and other mapping, the size-group edges, and the matrix size-0 mask;
- heat in rent with both subsidy routes, the obligation flag without a bill, the NONE check and the Arkansas gate.
Consistency: #9967 S3, #9972 S3, #9968 S2, #9975 S4, #9969 S3 and #9970 S6 rated untested logic and sources SHOULD (checklist item 13).
S4. References: three plan citations lack page lists, and the manual's page list omits four cited pages
| File:line | Problem | Fix |
|---|---|---|
P/income/sources/unearned.yaml:45-46 |
FY2025 plan item 1.9 opens on p5, which shows only "Unemployment insurance". Strike pay, Social Security, SSI, pensions, cash gifts, alimony, child support, "Interest, dividends, or royalties" and VA benefits are on p6, and the lottery note is on p7 | Keep #page=5 and end the title with "#page 5-7" |
P/income/sources/unearned.yaml:43-44 |
FY2026 item 1.9 opens on p6, but the lottery-only note that the gambling_winnings comment cites (:31-32) is on p7 |
End the title with "#page 6-7" |
P/income/sources/earned.yaml:27-28 |
FY2025 item 1.9 opens on p5 (wages, self-employment), but "Rental income" is on p6 | End the title with "#page 5-6" |
P/income/sources/unearned.yaml:47-48 |
The manual title ends #page 130,132,135,141,144, but the list also relies on Appendix F rows for alimony (p131), dividends (p133), pensions (p140), and strike pay and SSI (p143) |
End it with "#page 130-133,135,140-141,143-144" |
The other plan, chart, manual and matrix anchors show their values (see Verified correct). Consistency: #9972 S5, #9975 S6, #9974 S3 and #9970 S5 rated missing page lists SHOULD.
Suggestions
G1. FY2025 benefit levels: say why the "20% OVER BASE" matrices win over plan item 2.6 and the Clearinghouse file
- FY2025 plan item 2.6 estimates a $50 minimum and a $475 maximum (p. 9). The AEO FY2025 matrices print $60 to $570, and the electric header reads "HOUSEHOLD SIZE BENEFIT PAYMENT (20% OVER BASE)".
- The Clearinghouse's AR_BenefitMatrix_2025.pdf is titled "2025 ELECTRICITY FUEL BENEFIT MATRIX REGULAR ASSISTANCE". It nonetheless carries the base amounts, identical to its 2024 file:
- first-row (income $0-69) base amounts: electric $202 / $240 / $287, natural gas $257 / $305 / $364, propane $331 / $393 / $469 and other $241 / $287 / $342;
- 1.2 times these, rounded, gives every first-row AEO FY2025 cell: $242 / $288 / $344; $308 / $366 / $437; $397 / $472 / $563; $289 / $344 / $410;
- fuel oil's $570 is 1.2 times the plan's $475.
- The AEO matrices were on the AEO site before the season. Their file dates are October 7, 2024, and the FY2025 electric file is byte-identical to the December 6, 2024 Wayback capture; the same digest appears in captures from June and July 2025. So the PR's FY2025 cells are the ones in force from January 6, 2025.
- rulespec-us#1538 records the plan conflict (interpretation 10), but the PR body and the matrix comments do not. Add a sentence and the capture link, and note that the Clearinghouse "2025" file repeats the FY2024 matrix.
G2. Minors and full-time students: the FY2025 form supports the backfill, and the reach is worth stating
- The PR calls applying the current application's rule to FY2025 "a backfilled assumption without a confirmed change date". But the FY2025 form, AEO 9495 R 01/FY2025, has the same Section III sentence (source 7). Cite it in the comment at
V/income/ar_liheap_countable_income.py:29-33, in the PR body and in Resolve US discrepancies against TAXSIM35 for 2021 #1538 interpretation 3(c). - M 4.7.3 also exempts full-time students from the Zero Income Form (p. 43: "Each adult (aged 18 or older) who declares zero or inadequate income and who is not a full-time student"). That fits the form's broad reading better than Appendix F's rule for dependent students up to age 23 (p134).
- Reach: the rule excludes all earnings of a full-time student of any age. Reproduced at head (2026, gas heat):
- a 35-year-old full-time graduate student living alone with $40,000 of wages has countable income of $0 and gets $308;
- the same person, not in school, has MCI of $2,667, above the $2,347 limit, and gets $0.
- That follows the form literally. If AEO confirms the draft manual's narrower rule instead, revert to it. Either way, mention the reach in the registry notes.
G3. Solar and unknown-fuel households are eligible but paid $0
- Reproduced (2026, one adult, no income):
- SOLAR with a $1,200 electric bill is
ar_liheap_eligible: truewithar_liheap: 0; the same household on ELECTRICITY gets $242. - UNSPECIFIED fuel with heat in unsubsidized rent is also eligible with $0.
- SOLAR with a $1,200 electric bill is
- The application leaves no household without a matrix:
- It requires every applicant's electricity source and asks "Is your home all electric?", taking heating-source details only if not (p3).
- For heat in rent it asks "WHICH UTILITIES ARE INCLUDED IN YOUR RENT?" (p2).
- So AEO always uses one of its five matrices, and a grid-tied solar home would read the electric one.
- Options: map SOLAR to the electric matrix (
heating_expensealready reads its electric bill), or make the $0 explicit in eligibility. Keep the Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754 note for UNSPECIFIED. - Consistency: Add Alabama LIHEAP regular heating assistance #9967 G2, Add Georgia LIHEAP regular heating assistance #9968 G2, Add Ohio HEAP regular heating assistance #9975 G3 and Add Oklahoma LIHEAP regular heating assistance #9970 G1.
G4. Unclaimed years: FY2027 and the pre-FY2025 backfill
- FY2027. The proposed plan gives $70 / $665 (item 2.6, p11), while AEO's responses give $66 / $627 (p5). No FY2027 chart or matrix is posted.
- Period 2027 carries the FY2026 matrices with the FY2027 median ($94,627) and the 2026 guideline.
- Reproduced: one person has a limit of $29,520 ($2,460 a month) and gets $308 with no income and gas heat.
- The PR documents this.
- Before FY2025. Periods up to 2024 read FY2025's 20%-higher matrices.
- FY2024's plan gives $50 / $475 (item 2.6, p. 9), and the Clearinghouse FY2024 matrix has the base amounts and different top rows.
- Reproduced: in 2024, a one-person gas household with no income gets $308; the FY2024 matrix pays $257.
- The years are unclaimed and documented as unverified. Record this in the registry notes (checklist item 3).
- No plan from FY2025 to FY2027 calls the increase an IIJA supplement (checklist item 12).
- FY2026 keeps the same first-row amounts without the "over base" label.
- The FY2027 proposal raises them a further 10%.
G5. Two documented conflicts to state more precisely
- Capital gains and gambling.
- The PR body says "Section 1.9 has no capital gains item". But both plans add "The only one-time lump sum payment counted towards income is lottery winnings" (FY2026 and FY2025, p7).
- M p138 also excludes "nonrecurring lump-sum payments, including but not limited to the sale of personal property".
- Those point against counting a one-time capital gain or a non-lottery gambling win, while M p132 and p135 count them.
- The choice is documented; describe the lump-sum conflict accurately in the PR body and Resolve US discrepancies against TAXSIM35 for 2021 #1538 interpretation 2.
- Interest. "amount over $200.00" (M p137) gives no period and no unit. The monthly per-member reading is the most generous one. Reproduced at head:
- two spouses with $2,400 of interest each and a $12,000 pension count $12,000 and get $161;
- if one spouse held all $4,800, they count $14,400 and get $139.
- The PR already documents this; no change is needed.
- TEA is reasonable as encoded.
- Plan 1.9 leaves TANF unchecked in both years.
- Both application versions list "TEA" as non-work income, and M p130 says "Do not count sources such as SSA, SSI, and TEA more than once monthly per individual".
- Reproduced: a family of three with $204 a month of TEA gets $324 rather than $366.
G6. Code, test and PR hygiene
P/income/student_exclusion/child_age_limit.yaml: since92153a43cbthe parameter excludes every minor's earnings, whether or not the minor is in school. Full-time students are excluded in the formula, without a parameter. The folder namestudent_exclusionno longer describes it; consider, for example,income/earned/minimum_age.- MCI rounding uses a literal (
np.floor(annual_income / MONTHS_IN_YEAR + 0.5),V/income/ar_liheap_countable_income.py:86), while the limit usesrounding_increment. Optional: read a parameter. - Reference titles:
- The
fpg_year_lagtitles describe the charts as "using the 2025 federal poverty guidelines", which the charts do not print. "Reproduced by" would be accurate. - The matrix and size-group titles call the electric file a "Winter Benefits Matrix", but its heading is "FFY 2026 BENEFITS MATRIX" and M p62 uses it for both seasons.
- The
- Many test comments lost the spaces around their numbers, for example:
T/ar_liheap.yaml:1("monthly370-429 gives227 ... zero income gives308");T/payment/ar_liheap_matrix_amount.yaml:3("matrix:39lower bounds×3size columns=117literal cell checks");T/income/ar_liheap_income_limit.yaml:3("Official2026income chart sizes1–20 plus explicit688monthly");T/income/ar_liheap_countable_income.yaml:94("Exactly18 ... after20%disregard").
- Several comments refer to internal material (see Add Rhode Island LIHEAP regular heating assistance #9972 G7, Add Ohio HEAP regular heating assistance #9975 G6 and Add Oklahoma LIHEAP regular heating assistance #9970 G4):
- "Contract specifies nonnegative earned sources" (
T/income/ar_liheap_countable_income.yaml:154); - "Draft status is disclosed in the research report" (
T/ar_liheap_household_size.yaml:1); - "qualified composition source hierarchy in the research report" (
T/eligibility/ar_liheap_eligible.yaml:1).
- "Contract specifies nonnegative earned sources" (
- PR body and issue:
- "the PR remains draft": the PR is not a draft.
- rulespec-us#1538 also says "open as a draft" and that the tests were "Not run in this session". All 70 pass locally at this head.
Verified correct
-
Matrices (source 5):
- All 1,170 cells and 78 row bounds, including the $20 row "1990-2009" and the $120 rows "1750-1869" and "1870-1989".
- The FY2025 top rows "2,250-2,944" to "5,140-Max" and the FY2026 top rows "2348-3070" to "5237-Max".
- The columns "1&2", "3&4" and "5 & UP".
- The 63 changed cells match the PR body's count (electric 11, natural gas 25, propane 12, fuel oil 11, other 4).
- Fuel groups follow the application (p3): "FUEL OIL/ KEROSENE", and wood and other on "OTHER (WOOD, PELLETS, ETC.)".
- Plan item 2.6's $60 / $570 matches the FY2026 extremes.
- There is no bill cap. M 2.1 says "The benefit is designed to assist households with their energy burden, not to cover total costs" (p15), and 6.1 uses MCI, household size and fuel type (p62).
-
Limits (source 4):
- FY2026: 0.6 × $90,280 × the 45 CFR 96.85(b) factor ÷ 12, rounded half up, for sizes 1-7 ($2,347 ... $6,094). Above that, 1.5 × the 2025 guideline ÷ 12 ($6,769 ... $15,019), plus the printed $688.
- FY2025: the $86,577 median for sizes 1-6 ($2,251 ... $5,714), the 2024 guideline from size 7 ($5,918 ... $14,660), and the printed $672. Half-up rounding at the exact half-dollars ($5,917.50, $7,262.50, $8,607.50 and others) matches every printed row.
- The limit is inclusive (M 3.2: "at or below", p31) and is compared with rounded MCI.
-
Federal floor (42 USC 8624(b)(2)(B)). FY2026 monthly limit against 110% of the higher (2026) guideline:
Size 1 2 3 4 5 6 7 8 20 Each additional Limit $2,347 $3,070 $3,792 $4,514 $5,236 $5,958 $6,094 $6,769 $15,019 $688 110% $1,463.00 $1,983.67 $2,504.33 $3,025.00 $3,545.67 $4,066.33 $4,587.00 $5,107.67 $11,355.67 $520.67 - FY2025's limits clear 110% of the 2025 guideline at every size: $1,434.58 for one person, $4,459.58 for seven and $11,013.75 for twenty, plus $504.17 per member.
- The narrowest margin is 32%, so the floor cannot bind.
-
Timing:
- FY2025 regular heating ran from 01/06/2025 to 03/31/2025 (plan p4).
- FY2026 Regular Assistance runs from the first Monday after New Year's to the last business day of March. Priority intake may start up to 30 days earlier; AEO's responses say December 8, 2025.
- Period N reads FY N on January 1.
-
Income:
- Plan 1.8 and the checked 1.9 boxes.
- Social Security and railroad retirement net of Part B: 1.9 "Excluding MediCare deduction"; M 4.7.2 ("must not count medical deductions as income ... This includes the Medicare Part B Buy-in premium", p43); and M Appendix F ("Medicare insurance premiums" No, p138).
- Per-source loss floors (M 4.7.4: "Negative self-employment income will not be subtracted from other household income but will be counted as zero", p47; capital losses No, p132).
- Rental property as a self-employment enterprise (p141).
- 80% of gross wages "before any pre-tax deductions" (p42).
- Minors' earnings excluded: 1.9 leaves "Earned income of a child under the age of 18" unchecked, and the application agrees.
- Undocumented members' income counted (M 4.4, p36; p136).
- MCI rounding to the nearest dollar (p42).
- TEA counted once through the take-up-gated
tanf.
-
Household and eligibility:
- Size counts citizens and qualified noncitizens (M 4.4-4.4.1). The enum covers the 8 USC 1641(b) statuses except COFA and battered noncitizens, which the PR documents. A unit with no qualified member is ineligible.
- No categorical eligibility (plan 1.4 No; M p49) and no asset test (plan 2.3).
- Energy burden (plan 2.3, p9; M 4.8.3, p48): a direct bill or obligation qualifies; unsubsidized heat in rent qualifies with a lease; subsidized heat in rent needs "a utility surcharge or other extra cost". NONE is ineligible.
-
Code patterns:
- No hard-coded policy values (apart from the rounding literal in G6).
defined_for = StateCode.ARis on five variables, andar_liheapis gated byar_liheap_eligible. All 19 parameters are read, the formulas are vectorized, and the sharedsmi()andfpg()helpers are reused. - The matrix keys come from bracket lookups that always return 1-39 and 1-3.
- No hard-coded policy values (apart from the rounding literal in G6).
-
Tests:
- 70 of 70 pass locally at head (policyengine-core 3.32.29) and on the merged tree. Periods are plain (2025, 2026).
- Hand-checked against the charts, matrices, plans, manual and application:
T/ar_liheap.yamlCases 1, 3, 6-12 and 14-19;- limit Cases 1-3 (all 32 values);
- countable-income Cases 5, 7, 9, 14, 24 and 25;
- eligibility Case 5;
- matrix Cases 6 and 10.
-
Changelog:
changelog.d/ar-liheap.added.mdis top level and typedadded.
Checklist results (LIHEAP wave 2a)
- State plan and manual first: pass. I read the following and verified every encoded cell, limit and branch:
- the accepted FY2025 and FY2026 plans (rendered checkboxes), the proposed FY2027 plan and AEO's comment responses;
- both charts, all ten matrices, the Clearinghouse FY2024-FY2026 matrices, both application versions and M.
- Arkansas LIHEAP is run by AEO, not DHS, so
gov.states.ar.ee.aeois the right path. No adopted FY2025 or FY2026 manual was found; the PR discloses its reliance on the draft.
- Income definition: pass.
- Gross work income less 20%, and gross non-work income (plan 1.8). Social Security net of Part B, per the plan box and M 4.7.2. Loss floors per source, and annual inputs standing in for the prior month.
- The minor and student rule follows both application versions (G2). The lump-sum wording is in G5. UI needs the total after rebase (S1).
- Backdating: FY2025 and FY2026 are represented and correct.
- FY2025 uses the "20% OVER BASE" matrices posted before the season (G1).
- Earlier years and 2027 are unclaimed, documented estimates (G4). No FY2027 chart or matrix is published.
- Household and arrangement rules: pass. Subsidized and public housing, heat in rent with and without a surcharge, a direct obligation without a bill, no categorical eligibility, the $60-$570 range and NONE are handled and tested. Priority affects intake timing only. Solar and unknown fuel get $0 (G3).
- Tests: 70 cases, more than 8 hand-checked.
- Covered: FY2026 limits for sizes 1-21 and FY2025 limits for sizes 1-9, 20 and 21; the limit edge (to the cent and at the half dollar); band edges; the size-group edges; ages 17 and 18; plain periods.
- Gaps: S3.
- Parameter descriptions: six are off-template (S2). None has a trailing clause.
- References: three missing page lists and one incomplete page list (S4). Polish is in G6.
- Wiring: pass.
- The
programs.yamlentry and the coverage line are well formed, and the registry test passes on the merged tree (655 passed). - There is no aggregate wiring, which matches OR, NY, NJ and MD on main.
defined_forgating is on every variable, and the state-gating checks pass on the merged tree.- Take-up applies only through
tanf, as in the siblings.
- The
- Axiom: valid
queuedline. rulespec-us#1538 is open, labelledpe-parity, dispatch-ready and current to7e42062309. It needs updates for S1 and S3 and the G1, G2 and G5 notes (see below). - Branch and CI: all checks are green at head. The branch is 9 ahead and 82 behind main. There are no textual conflicts, but main's UI guard fails on the merged tree (S1).
- Integrate modeled state unemployment insurance into income flows #9558: S1. Arkansas UI is not modeled, so the guard fails but no value changes.
- IIJA and FY2027: no plan from FY2025 to FY2027 mentions an IIJA supplement.
- The FY2025 20% increase persists in FY2026, and FY2027 proposes a further 10%, so it is not a temporary supplement.
- FY2027 is proposed only ($70 / $665, or $66 / $627 in AEO's responses) and has no matrix. It is unencoded and documented (G4).
- Mutation check: S3. Three control mutations fail as expected.
- Health premiums after Document disjoint health premium inputs and correct consumer treatment #10046: not applicable.
- Arkansas counts 80% of gross wages "before any pre-tax deductions" (M p42) and deducts no health premiums from them.
- The only medical item is the Part B netting from Social Security and railroad retirement, which reads
medicare_part_b_premium.
- State-gated index defaults: pass.
ar_liheap_household_size(int, default 0) feeds only bracket lookups (max_(size, 1)),smi()andclip(size, 1, 20), and the matrix keys are always 1-39 and 1-3.T/ar_liheap.yamlCase 5 runs AR and GA households in one simulation without error.
CI status
28 of 28 checks pass at 7e42062309 (gh pr checks 9973, run of 2026-10-12). The three "skipping" entries belong to a superseded run on the same SHA.
Branch status
- 9 commits ahead of
mainand 82 behind. The merge base is1d699fec2d(Share one HHS SMI helper for LIHEAP income limits #10019); main is at8ae01aa3cb. git merge-tree --write-tree PolicyEngine/main 7e42062309exits 0 with no textual conflicts.programs.yamlmerges tocoverage: AR, DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OR, TX.- Semantic conflict: main's Integrate modeled state unemployment insurance into income flows #9558 guard fails on the merged tree (S1). Document disjoint health premium inputs and correct consumer treatment #10046 does not apply (checklist 14).
- On the merged tree, the PR's 70 cases, the registry test and the state-gating checks pass.
- The wave 2a siblings (Add Alabama LIHEAP regular heating assistance #9967-Add Ohio HEAP regular heating assistance #9975) touch the same LIHEAP coverage line, which is a branch note, not a finding.
Axiom line
axiom: TheAxiomFoundation/rulespec-us#1538 queued: valid format, and the issue meets the bar.
- rulespec-us#1538 is open and labelled
pe-parity(plusenhancement), with no comments. It was last updated 2026-10-12. - It is dispatch-ready under the Add AMT parameters for 2020-2023 #1467 standard. It has:
- proposed
us-ar/module paths with corpus status; - verbatim plan, chart, matrix, manual, application, guideline and median-income text;
- required outputs for all six variables;
- 14 companion tests derived from the sources ("None is taken from policyengine-us output").
- proposed
- It describes head
7e42062309correctly, including:- the FY2025 plan-matrix conflict (interpretation 10);
- the student rule (3(c)), the interest reading (3(a)) and the Part B netting (6).
- Updates needed when the fixes land:
total_unemployment_compensationin the countable-income output and the inputs list (S1);- the new cases (S3);
- the FY2025 form (G2), the Clearinghouse "2025" note (G1) and the lump-sum wording (G5);
- the stale "open as a draft" and "Not run in this session".
Next steps
- S1: rebase onto main, switch
P/income/sources/unearned.yaml:11tototal_unemployment_compensation, and add a case with reported UI. - S2: align the six descriptions.
- S3: give the five unearned sources positive test values, pin or drop the bill term in the direct-responsibility branch, and assert the size-0 limit.
- S4: add the page lists.
- Optionally address G1-G6, then refresh the PR body and rulespec-us#1538 and re-request review.
0 critical and 4 should-address findings, plus 6 suggestions.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes for 4 should items; details in the full report above. Verified: all 1,170 matrix cells and 78 row bounds (5 fuels, FY2025 and FY2026) and all 40 income-limit chart values. The 110% floor never binds. Income treatment follows plan 1.8/1.9 and the application, all 70 tests pass, and CI is green. (1) Merge blocker from main's #9558: unearned.yaml:11 reads the raw unemployment_compensation, so the guard fails on the merged tree. (2) Six parameter descriptions are off the house template. (3) Logic that passes every test even when broken on purpose: five income sources are never set to a nonzero value (unemployment, strike benefits, ordinary dividends, veterans' benefits, financial assistance), along with the bill term in direct responsibility and the size-0 income-limit mask. (4) Incomplete page anchors and lists on the plan 1.9, earned-income and manual references.
- S1: Merge blocker: the unearned list reads raw unemployment_compensation (main PR 9558 guard) - S2: Six parameter descriptions are off the house template (plus optional interest wording) - S3: Untested logic: five unearned sources, the bill term in direct responsibility, and the size-0 limit mask - S4: References: three plan citations lack page lists, and the manual list omits cited pages Also applies the in-scope suggestions. Tests not run locally; CI validates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review. Fixes pushed in 1206c14. This head also merges upstream/main (PRs 9558 and 10046). Arkansas deducts no payroll health premiums (its only premium netting is Part B against Social Security and railroad retirement), so 10046 changes nothing here. As you found, every Arkansas limit clears 110% of poverty (42 U.S.C. 8624(b)(2)(B)) by at least 32% in 2025-2027, so this PR does not add the shared
|
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
IDs: C = critical, S = should address, G = suggestion. S1-S4 and G1-G6 keep the prior review's numbers; C1, S5-S6 and G7-G13 are new.
Source Documents
- PDF: Arkansas FFY 2025 LIHEAP Policy and Procedures Manual, adopted (190 pages)
- PDF: Arkansas FY2025 LIHEAP manual, draft (cited by the PR) (167 pages)
- PDF: FY2026 State Plan (55 pages) and FY2025 State Plan (51 pages)
- PDF: Application AEO 9495 R 01/FY2025 (4 pages); the current R 11/2025 form, charts and matrices were spot-checked
- Year: FFY2025 (2024-10-01 to 2025-09-30) and FFY2026; tests use periods 2025 and 2026
- Scope: Incremental — changes since the prior review, plus unresolved prior findings
- Reviewed head SHA: 1206c14
- Mode: incremental from 7e42062
Paths: P/ = policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/, V/ = policyengine_us/variables/gov/states/ar/ee/aeo/liheap/, T/ = policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/. Pages are file pages of the adopted manual unless marked "draft".
Branch Status
- 11 commits ahead of
mainand 38 behind. The branch merges cleanly withmain, with no conflicts; the head already includes #9558 and #10046. - Informational only: the staleness did not affect any finding.
Critical (Must Fix)
C1. The full-time-student earnings exclusion is broader than the adopted manual
- Defect:
V/income/ar_liheap_countable_income.py:40-42excludes the earnings of every full-time student (is_full_time_student: any college or K-12 student) at any age, with no dependency or credit-hour test. The comment at:31-39cites "Manual section 4.7.3 (page 43)" as support and calls the narrower rules "the draft manual's". Test comments repeat "without age or dependency restrictions" (T/ar_liheap.yaml:578-582;T/income/ar_liheap_countable_income.yamlCases 2 and 21-23). - Evidence:
- Glossary: "Full-time Student – a full-time student, up to age 23, who is a dependent of a member of the household", with 12 or more credit hours (p. 141).
- Appendix F excludes college earnings only for students "up to age 23, who are listed as dependents of a household member" (p. 159), and a child's earnings under 18 (p. 158).
- 4.7 excludes an 18-year-old high-school student's earnings "unless working full time or the individual is emancipated" (p. 56).
- The adopted 4.7.3 drops the "who is not a full-time student" sentence (p. 59); only the draft has it (draft p. 43). The PR body concedes this; the code comment does not.
- The application's "(18 and older & not a full-time student)" (p. 2, both versions) does not define the term, and the plans have no student row. The manual's definition is the natural reading. No source supports "any age, no dependency". No FY2026 manual exists, and no FY2026 source is broader.
- Impact:
T/ar_liheap.yamlCase 19 (2026): three independent full-time students aged 22-24 with $48,000 of wages each get countable income $0 and $308. Under the manual, $48,000 × 0.8 = $38,400 exceeds the $28,164 limit, so each gets $0, as the case's non-student control row shows. Overpayment: $308 per student unit, in 2025 and 2026. - Prior G2: the round-1 fix added the FY2025 form citation (correct) and the draft 4.7.3 sentence (not in the adopted manual).
- Preferred fix:
- Add
P/income/full_time_student_age_limit.yaml= 23, cited to p. 141 and p. 159; state that "up to age 23" is read as inclusive. - Exclude earnings for
is_full_time_college_student & is_tax_unit_dependent & (age <= limit), and for 18-year-old high-school students (is_in_k12_school); note that the full-time-work and emancipation exceptions are not modeled. Keepearned_minimum_age(18). - Tests: countable-income Case 2 becomes $15,600; Case 23 (dependent, 24) becomes $24,000;
T/ar_liheap.yamlCase 19 becomes[38_400, 38_400, 38_400, 38_400], all ineligible,ar_liheap: [0, 0, 0, 0](rename it). Cases 21, 22 and 24 do not change. - Rewrite the comment to cite p. 56, 141, 158 and 159.
- Add
- Minimum fix (keeps the form-literal values): delete the 4.7.3 sentence, cite p. 141 and p. 159 as contrary authority, correct the five test comments, and state the divergence and its reach in the
programs.yamlnote.
Should Address
S5. References and the registry note cite the superseded draft manual
- Defect: every manual citation points to the August 2024 draft. The adopted manual ("Effective October 1, 2024 – September 30, 2025") was created on 2024-11-18, before the season opened.
- Where:
V/income/ar_liheap_countable_income.py:18-20,V/ar_liheap_household_size.py:13-19,P/income/sources/unearned.yaml:6,51-52,P/income/sources/earned.yaml:31-32,P/income/interest_disregard.yaml:17-18, test comments (T/ar_liheap_household_size.yaml:1,44;T/income/ar_liheap_countable_income.yaml:154), andpolicyengine_us/programs.yaml:819("draft-manual income rules ... are unverified"). - Evidence: a word-level diff of Appendix F, 4.4-4.4.1 and 4.7.3-4.9 found every encoded rule unchanged except the 4.7.3 student sentence (C1). No values change.
- Fix: retarget to
https://liheapch.acf.gov/docs/2025/manuals/AR_Manual_2025.pdf(draft → adopted pages: 36-37 → 52-53; 41 → 56; 42 → 57-58; 43 → 59; 47 → 63; 116 → 141; 129-130 → 154-155; Appendix F 131-144 → 156-168). Add the wage, farming and self-employment rows (158, 159, 166) to theearned.yamlmanual title. Update the registry note. - Severity: the reference validator said suggestion and the regulatory reviewer said should; SHOULD, because the adopted version of the cited draft exists.
S6. unearned.yaml comments misstate the gift and loan rules and omit counted sources
- Cash gifts (confirmed mismatch):
P/income/sources/unearned.yaml:25-26counts allfinancial_assistance. The manual counts "Cash gifts - Regular" (three or more consecutive months) and excludes "Cash Gifts - Irregular" (p. 157). The plans' "Cash gifts" box has no qualifier, and line 6 says the manual is followed. Example (2026, one person, gas): a one-time $1,200 gift gives $295 instead of $308, and near the limit it can remove eligibility.- Not critical: no input separates regular from irregular gifts, so the remedy is documentation. Suggested: "Manual Appendix F (page 157) counts only regular cash gifts (three or more consecutive months); financial_assistance cannot separate them, so all reported gifts are counted." Precedent:
gov/states/me/dhhs/tanf/income/sources/unearned.yaml:11-12.
- Not critical: no input separates regular from irregular gifts, so the remedy is documentation. Suggested: "Manual Appendix F (page 157) counts only regular cash gifts (three or more consecutive months); financial_assistance cannot separate them, so all reported gifts are counted." Precedent:
- Loans: lines 7-8 say "Counted loans ... are not represented", but the manual says "All loans are excluded as income" (p. 163); only plan 1.9 checks loans. The output is right; the comment contradicts line 6.
- Counted sources with no note: HUD utility payments (p. 161), adoption assistance (p. 156), cryptocurrency (p. 157), crowd-fund accounts (p. 158), executor fees (p. 159), inheritance (p. 162), Trade Adjustment Assistance (p. 168), and the application's "Housing Utility Assistance Payment". Add them to the "not represented" note.
- Severity: the auditors said minor to should; SHOULD, because the comments misstate what the governing manual counts.
Suggestions
- G7.
V/payment/ar_liheap_matrix_amount.py:46-50: link the FY2025 plan p. 9, the Wayback capture and the Clearinghouse 2025 matrix; "October 7, 2024" is PDF metadata, not printed; say "the 35 rows whose lower bounds run from $0 to $2,250". - G8. Wayback hrefs (
P/income/earned_minimum_age.yaml:17,V/income/ar_liheap_countable_income.py:24): use theid_form so#page=2opens; name "AEO 9495 R 11/2025" atearned_minimum_age.yaml:14and align "Section" casing. - G9. Citations: Pension row "surviving dependents" (draft p. 140) for
unearned.yaml:19; "FY2026 plan item 2.3 (page 10)" atV/eligibility/ar_liheap_eligible.py:33; Appendix E (draft p. 130) for the Case 26 VA input; a URL for the CSCDC statement (T/ar_liheap_household_size.yaml:1). - G10.
V/income/ar_liheap_countable_income.py:43-44: the input is net of expenses, which stands in for the manual's 10% cost allowance (p. 166); "approximates gross receipts" is misleading. - G11. Add a comment near
V/income/ar_liheap_income_limit.py:36-39citing 42 USC 8624(b)(2)(B) and the minimum margin (at least 27% through 2030), since GA and FL addgov.hhs.liheap.fpg_floor. - G12. Tests: split Case 26 dividends between qualified and non-qualified; add a size-22 limit element ($16,395 a month in FY2026); pin the 26 untested FY2025 matrix cells that change at 2025-10-01. A hand-traced mutation survives each gap.
- G13. Style: consider an
integration.yaml; useperson1-style names inT/ar_liheap.yamlCases 17-18 and38_400at line 573;direct_responsibility = has_expense(V/eligibility/ar_liheap_eligible.py:34) is a single-use alias.
Prior Findings
| ID | Finding | Status |
|---|---|---|
| S1 | Raw unemployment_compensation in unearned list |
RESOLVED; Case 26 pins reported UI |
| S2 | Off-template descriptions | RESOLVED |
| S3 | Untested sources, bill term, size-0 limit | RESOLVED (Case 26; eligibility Case 7; household-size Case 2) |
| S4 | Missing page lists | RESOLVED |
| G1 | Explain FY2025 "20% OVER BASE" matrices | RESOLVED (precision in G7) |
| G2 | Cite FY2025 form; state student reach | STILL OPEN: superseded by C1 |
| G3 | Solar and unspecified fuel paid $0 | STILL OPEN: declined by author; documented (#9754), acceptable |
| G4 | FY2027 and pre-FY2025 backfill | RESOLVED (documentation) |
| G5 | Lump-sum conflict wording | RESOLVED |
| G6 | Hygiene | RESOLVED; rounding literal declined by author, accepted |
PDF Audit Summary
| Category | Count |
|---|---|
| Documents audited | 5 (467 pages at 300 DPI), plus 8 external spot-checks |
| Values and rows matched | 64 |
| Mismatches queued | 12 |
| Confirmed (code path and 600-DPI check) | 2 (C1; S6 cash gifts) |
| Investigated and cleared | 10 |
| References checked | 31: 30 correct, 0 wrong, 1 unverifiable (HTTP 403) |
Investigated and cleared:
- FY2025 matrix extremes vs plan 2.6: AEO's "(20% OVER BASE)" matrices govern ($50 and $475 × 1.2).
- Social Security net of Part B: the plans' "Excluding MediCare deduction" and 4.7.2 (p. 59) govern.
- TEA counted: Appendix E (p. 155) and both forms count it.
- $200 monthly per-member interest disregard: the manual row (p. 162) refines the plan.
- Rental income with the 20% disregard: rental property is self-employment (p. 165).
- Gambling and capital gains in full: Appendix F rows followed; inputs cannot separate one-time receipts.
- Workers' compensation counted: manual (p. 168) and form count it.
- No extra 10% self-employment discount: the input is already net of expenses.
- "Counted loans" comment: output matches the manual; wording in S6.
- 4.7.3 Zero Income Form comment: merged into C1.
Validation Summary
| Check | Result |
|---|---|
| Regulatory accuracy | 1 critical (C1); incremental fixes correct, no regressions |
| References | New anchors correct; draft manual still cited (S5) |
| Code patterns | No hard-coded values; descriptions on template |
| Test coverage | 72 cases; every variable tested; prior S3 gaps pinned (G12) |
| CI | 29/29 pass at 1206c14c3f |
| Main merge | #9558 guard passes; #10046 not applicable |
| Federal 110% floor | Never binds |
| Changelog | Present, top level, added |
Review Severity: REQUEST_CHANGES
One confirmed value mismatch (C1) changes eligibility and benefits.
Next Steps
To auto-fix issues: run the fix-pr workflow for this PR.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks for the review. Fixes pushed in 23a055f.
Thanks also for checking the ten cleared items. The loan and Zero Income Form comments you folded into S6 and C1 are fixed there. |
PavelMakarchuk
left a comment
There was a problem hiding this comment.
Program Review
IDs: C = critical, S = should address, G = suggestion. C1, S5-S6 and G2-G13 keep the prior review's numbers (S1-S4, G1 and G4-G6 were resolved in round 2); S7 and G14-G19 are new.
Source Documents
- PDF: Arkansas FFY 2025 LIHEAP Policy and Procedures Manual, adopted (190 pages)
- PDF: Arkansas FY2025 LIHEAP manual, draft (167 pages); no longer cited by the PR, used for comparison only
- PDF: FY2026 State Plan (55 pages) and FY2025 State Plan (51 pages)
- PDF: Application AEO 9495 R 01/FY2025 (4 pages) and the current LIHEAP 9495 R 11/2025
- PDF: AEO benefit matrices, checked this round for the new test cells: FFY 2025 Electric, Natural Gas, Propane and Other; FFY 2026 Electric, Natural Gas and Propane; Clearinghouse 2025 matrix (5 pages)
- PDF: FY2025 and FY2026 eligibility charts
- Statute: 42 U.S.C. 8624(b)(2)(B) (110% poverty floor)
- Year: FFY2025 (2024-10-01 to 2025-09-30) and FFY2026; tests use periods 2025 and 2026
- Scope: Incremental — author commit 23a055f and the merge of
main(PR-scope files only), plus unresolved prior findings - Reviewed head SHA: f2a1172
- Mode: incremental from 1206c14
Paths: P/ = policyengine_us/parameters/gov/states/ar/ee/aeo/liheap/, V/ = policyengine_us/variables/gov/states/ar/ee/aeo/liheap/, T/ = policyengine_us/tests/policy/baseline/gov/states/ar/ee/aeo/liheap/. Pages are file pages of the adopted manual unless marked otherwise.
Branch Status
- 13 commits ahead of
mainand 17 behind. The branch merges cleanly withmain. The head includes #10279 (federal 110% floor for DC, MA, MS, NJ and OR); AR does not readgov.hhs.liheap.fpg_floor. - Informational only: the staleness did not affect any finding.
Prior findings
| ID | Status | Evidence |
|---|---|---|
| C1 | RESOLVED | V/income/ar_liheap_countable_income.py:44-56 now excludes only dependent full-time college students aged 23 or younger and 18-year-old high-school students (p. 56, p. 141, p. 159). Tests match the preferred fix, and new Cases 27-28 cover the age-19 and part-time cases. S7 covers a remaining input gap. |
| S5 | RESOLVED | No draft-manual URL remains. Every new anchor (52, 56-59, 62-64, 141, 154-168) holds the cited rule. policyengine_us/programs.yaml:819 is updated. |
| S6 | RESOLVED | P/income/sources/unearned.yaml:6-15,33-35: regular gifts only (p. 157), all loans excluded (p. 163), and every unrepresented counted source listed with its page. |
| G2 | RESOLVED via C1 | The draft-only 4.7.3 sentence is gone; the FY2025 form citation is now an id_ link. |
| G3 | STILL OPEN (accepted) | Declined by the author and accepted in round 2; documented, tracked in #9754. |
| G7 | RESOLVED | V/payment/ar_liheap_matrix_amount.py:32-39,54-60: plan p. 9, the Wayback capture and the Clearinghouse matrix are linked; the date and the "35 rows" wording are correct. |
| G8 | RESOLVED | id_ hrefs at P/income/earned_minimum_age.yaml:21 and V/income/ar_liheap_countable_income.py:25; the R 11/2025 footer is confirmed. |
| G9 | RESOLVED | Pension p. 165, plan 2.3 p. 10, Appendix E p. 155 and the CSCDC URL are all present and correct. |
| G10 | RESOLVED | The net-of-expenses wording matches the 10% allowance on p. 166. |
| G11 | RESOLVED | The statute is cited. The "at least 32%" claim is true for 2025-2027 (code-path check: minimum 1.3259 in 2027). One parenthetical is imprecise for 2026 (G18). |
| G12 | RESOLVED | The dividend split, the size-22 limit ($196,740) and all 26 FY2025 matrix cells are pinned and match the AEO files. |
| G13 | RESOLVED | T/integration.yaml (5 cases), person1 names, 38_400 and the inlined alias. |
| S1-S4, G1, G4-G6 | RESOLVED (round 2) | No regression. |
Critical (Must Fix)
None. C1 is resolved, and no value mismatch was confirmed this round.
Should Address
S7. The 18-year-old high-school exclusion ignores is_in_secondary_school
- Defect:
V/income/ar_liheap_countable_income.py:49-51reads onlyis_in_k12_school. That variable is imputed for ages 5-17 (policyengine_us/variables/household/demographic/person/is_in_k12_school.py:10-17), so it is false at 18 unless a user overrides it.earned_minimum_agealready excludes everyone under 18, so this term matters only at age 18, and only with the override. The repo's input for an 18-year-old still in high school isis_in_secondary_school(no formula), and the AR formula does not read it. - Rule: section 4.7 excludes the earnings of members "aged 18 and enrolled in an institution of secondary education (high school)" (p. 56).
- Impact (code-path run at head, 2026, gas): take the household from countable-income Case 24 and set
is_in_secondary_school: truein place ofis_in_k12_school: true. Countable income is $23,796 (the wages are counted), not $18,300, andar_liheapis $84, not $107. There is no microsimulation impact: the pinned Populace dataset sets neither flag for anyone aged 18, so the current code and the fix give the same arrays. - Note: the prior review's preferred fix named
is_in_k12_school. This item corrects that advice. - Fix:
# is_in_k12_school is imputed only through age 17, so an 18-year-old still # in high school is captured via is_in_secondary_school. high_school_student = ( person("is_in_secondary_school", period) | person("is_in_k12_school", period) ) & (age <= p.high_school_student_age_limit)
- Precedents:
mi_ccap_eligible_child.py:32-41,mo_ccs_eligible_child.py:24-31andsd_cca_eligible_child.py:25-33use this union.in_eap_income.py:21andor_liheap_countable_earned_income.py:24-26readis_in_secondary_schoolfor their student exclusions. - Tests: add a Case 24 variant with
is_in_secondary_school: trueand nois_in_k12_school(expected18_300). Optionally, setis_in_secondary_school: trueon Case 27 (age 19, stays23_796). - A code-path run with this change passes all 83 AR cases and both variants. No parameter changes.
- Precedents:
- Severity: SHOULD. This is a household-level behavior gap with no microsimulation impact. The code validator rated it a suggestion; the regulatory reviewer and the code-path verifier rated it SHOULD, because the standard input gives a result that contradicts section 4.7.
Suggestions
- G14. Wording and references for the two new parameters and the C1 comment.
V/income/ar_liheap_countable_income.py:39-41cuts the section 4.7 quote short. Add "and applying as the head of household" (p. 56), asP/income/high_school_student_age_limit.yaml:3-4already does.P/income/full_time_student_age_limit.yaml:16-17puts two sections in one entry, and its href opens p. 141 only. Split it into two entries: Section 17.0 with#page=141, and Appendix F with#page=159.P/income/high_school_student_age_limit.yaml:17-19: add a p. 141 entry, because the comment at:6-9relies on that page.- In both descriptions (
:1), "up to this age" does not say whether the limit is inclusive, and in the first file it attaches to "household member". Suggested text: "Arkansas excludes the earned income of full-time college students who are this age or younger and are dependents of a household member under the Low Income Home Energy Assistance Program." Use the same "this age or younger" wording for high-school students. - Optional, at
P/income/full_time_student_age_limit.yaml:5-6: say that the inclusive reading matches the IRS student-dependent test ("has not attained the age of 24"), which "listed as dependents" on p. 159 points to.
- G15. 81 stale
is_full_time_studenttest inputs. No AR formula reads this variable any more. It appears inT/ar_liheap.yaml(29),T/income/ar_liheap_countable_income.yaml(38),T/ar_liheap_household_size.yaml(7) andT/eligibility/ar_liheap_eligible.yaml(7). Remove these inputs. InT/ar_liheap.yaml:559(Case 18, an 18-year-old non-student), pin the real input withis_in_k12_school: false(andis_in_secondary_school: falseafter S7). Rule: p. 56. - G16. No test derives the dependency proxy.
- Every C1 case sets
is_tax_unit_dependentas an input:T/income/ar_liheap_countable_income.yaml:43,608,640,672,807,839,T/ar_liheap.yaml:590andT/integration.yaml:134. - Code-path runs at head on Case 21's household:
- with
tax_unit_role_inputHEAD/DEPENDENT and no dependency input, the result is $19,200, which is correct; - with neither roles nor the input, default inference makes the 22-year-old the parent's spouse, and the result is $24,000. p. 159 gives $19,200.
- with
- The fallback is shared PolicyEngine behavior (
is_tax_unit_spouse, tracked in #9868). NY HEAP, IN EAP and NJ LIHEAP behave the same way. The pinned Populace dataset supplies roles for every tax unit. - Fix:
- Add Case 29: Case 21's household with
tax_unitsandtax_unit_role_inputHEAD/DEPENDENT, and nois_tax_unit_dependent(expected19_200). - Add a short caveat at
V/income/ar_liheap_countable_income.py:38: without supplied roles or this input, age-ordered inference can make a single parent's adult student the spouse (#9868). - Do not pin the $24,000 output.
- Add Case 29: Case 21's household with
- Not SHOULD: the test validator proposed SHOULD, but the PR reads the standard variable correctly, and the defect is in a shared variable.
- Every C1 case sets
- G17. Two more C1 boundary tests.
- A married couple aged 22 and 21, both full-time college students with $15,000 wages each. The expected countable income is
24_000, because head and spouse are not dependents. This test catches a change of the proxy to~is_tax_unit_head. - An 18-year-old full-time college student who is not a dependent. The earnings count (p. 141). This test catches a change of the high-school term to
is_full_time_student.
- A married couple aged 22 and 21, both full-time college students with $15,000 wages each. The expected countable income is
- G18. The G11 parenthetical is not true for 2026.
V/income/ar_liheap_income_limit.py:41-42says that the per-member amount above size 20 sets the narrowest margin. That is true for 2025 and 2027. In 2026, the narrowest margin is at size 9 in the 150%-of-poverty rows (1.3636, against 1.3646 above size 20).- Fix: write "(in 2025 and 2027, the printed per-member amount above size 20 sets the narrowest margin)", or remove the parenthetical.
- Do not extend the claim past 2027 without a new computation: the fixed $688 approaches 1.29 against later guidelines.
- Sources: FY2026 chart; 42 U.S.C. 8624(b)(2)(B).
- G19. Optional documentation.
- The manual also excludes irregular income up to $90 in three months (p. 162) and odd-job income under $30 in three months (p. 163). The model counts both. Add them to the not-modeled notes in
P/income/sources/unearned.yaml:6-15andP/income/sources/earned.yaml. - Name the form version "LIHEAP 9495 R 11/2025" in the application titles at
P/income/sources/earned.yaml:30andP/income/sources/unearned.yaml:63, as inP/income/earned_minimum_age.yaml:18. - In
T/integration.yaml:172, also cite section 4.8.3 on p. 63. That page has the energy-burden sentence for utilities included in rent.
- The manual also excludes irregular income up to $90 in three months (p. 162) and odd-job income under $30 in three months (p. 163). The model counts both. Add them to the not-modeled notes in
PDF Audit Summary
| Category | Count |
|---|---|
| Documents | 5 round-2 manifest documents reused, with no new download. 12 pages were read again as 300-DPI images. Live AEO matrices, the eligibility charts, the R 11/2025 form and the Clearinghouse matrix were checked outside the manifest. |
| Changed rule items matched | 31 of 31 (0 mismatches) |
| Matrix and chart values in changed tests | 61 checked against AEO files, including all 26 FY2025 cells: all match |
| References (new or changed) | 19 checked: 17 correct, 0 wrong, 2 unverifiable (fetch blocked; content corroborated) |
| In-comment page citations | About 95 checked, all correct |
| Verification-queue items | 4, all CONFIRMED: S7; the G16 mechanics (severity SUGGESTION); no microsim reach for S7 or G16; the G11 margin |
| Confirmed value mismatches | 0 |
Investigated and cleared:
- 2027 margin below 32% (reference validator): that check used the same-year projected guideline. The repo's floor code (DC, MS, NJ and OR) uses a one-year lag, and with that lag the 2027 minimum is 1.3259. The claim holds.
- "Any non-head adult is a dependent" (regulatory reviewer): this is not correct. Without roles, the next-oldest adult is inferred as the spouse. This is now part of G16.
- Microsim reach of S7 and G16: none. The pinned Populace build sets no school flag at age 18, and it supplies
tax_unit_role_inputfor 100% of tax units. policyengine-us-data is archived and is no longer the default. - FY2025 gas and propane cells (Cases 17-18), which the PDF audit checked by derivation only: the live AEO FY2025 files confirm all 17 cells.
- p. 141 "High school students over age eighteen" against the section 4.7 age-18 rule: following section 4.7, the operative income rule, is the better reading. The conflict is recorded in
P/income/high_school_student_age_limit.yaml:6-9. - Inclusive "up to age 23": the reading is stated and defensible.
- The full-time-work and emancipation exceptions (p. 56) are not modeled. This is documented, and the manual does not define "full time".
- Main merge (#10133, #10225, #10279): no AR expected value changes. AR tests set
ssi,social_securityandmedicare_part_b_premiumas inputs. - The Wayback 2024-12-06 electric matrix and the Clearinghouse 2025 matrix could not be fetched again this round. Their content matches the round-2 downloads.
Validation Summary
| Check | Result |
|---|---|
| Regulatory accuracy | C1 resolved; the rule matches pp. 56, 141, 158 and 159. 1 new should-address item (S7). |
| References | 0 wrong; no draft-manual URL remains; 2 new URLs not fetched again (content corroborated) |
| Code patterns | No hard-coded values; vectorized; ruff clean; wording nits only (G14) |
| Test coverage | 83 cases in 7 files; 16 changed or new rows recomputed by hand, 0 mismatches; C1 age boundaries pinned; dependency proxy set only as an input (G16) |
| CI | 29/29 pass at f2a1172c0f |
| Local tests | 83/83 pass at PR head (snapshot run) |
| Microsim reach | S7 and G16 do not change microsim output |
| Federal 110% floor | Never binds; minimum margin is 32.6% (2025-2027, lagged guideline) |
| Main merge | No AR value affected; programs.yaml AR entry valid |
| Changelog | Present, top level, added |
Review Severity: REQUEST_CHANGES
C1 is fixed. One should-address item (S7) is open: the 18-year-old high-school exclusion does not work with the standard is_in_secondary_school input.
Next Steps
- Fix S7: change one expression in
V/income/ar_liheap_countable_income.py:49-51and add one test case. - Optional: G14-G19.
To auto-fix issues: run the fix-pr workflow for this PR.
PR Review (round 2): Add Arkansas LIHEAP regular heating assistancePR #9973 (author: hua7450). This round reviews head
Neither merge had a hand-resolved conflict, and neither touches an Arkansas LIHEAP file. Path prefixes, as in round 1:
Line numbers refer to SummaryZiming fixed all four round-1 should items:
Of the six suggestions, G1, G2 (through Pavel's C1), G5 and G6 are fixed; G6's rounding literal is kept, which I accept. G3 is declined and G4 is documented; I accept both, as in #9967–#9972. Pavel's C1, S5, S6 and G7–G13 are all fixed. I checked the new student rule against the adopted manual's text on pages 56, 141 and 159. One should item is open: Pavel's S7 from today, which I concur with. The 18-year-old high-school exclusion reads only There are no new critical or should findings. Two new suggestions:
Batch checks:
I checked every new or changed expectation by hand: 13 new cases, 3 cases with changed values and one added assertion. CI is 29/29 green at the head. The branch is 13 commits ahead of Prior findings status
Pavel's review of
Pavel's review of this head (
New findingsCritical (must fix)None. Should addressNone new. Pavel's S7 (above) is the one open should item at this head, and I concur. Suggestions1. After #10182, count military SBP survivor annuities through
2. Consider excluding a dependent high-school student aged 19 to 23 as a "full-time student".
Verified
Checklist results (LIHEAP wave 2a)
Axiom line assessmentValid:
CI status29 pass, 0 pending, 0 failed (run 39324250200 on head
Branch status
Next steps
0 new critical and 0 new should findings, plus 2 new suggestions. Open at this head: 0 critical, 1 should (Pavel's S7, which I concur with) and 8 suggestions (Pavel's G14–G19 and Suggestions 1–2). Verdict: REQUEST_CHANGES |
DTrim99
left a comment
There was a problem hiding this comment.
Round 2: all four of our round-1 should-address items are fixed, and so are Pavel's C1, S5 and S6. One should-address item is still open: Pavel's S7 from today, which I agree with. The age-18 high-school exclusion reads only is_in_k12_school and ignores the is_in_secondary_school input, so Case 24 with the standard input gives $84 instead of $107. The fix is one expression and one test. Full report, including 8 suggestions, in the comment above.
Adds a partial Arkansas LIHEAP regular heating model using FY2025 and FY2026 schedules. The model counts qualified members for household size and every member's countable income, applies the 20% earned-income disregard, tests monthly income against limits built from state median income and the poverty guidelines, and reads the five published fuel matrices by monthly income band and household-size group. In FY2026, a five-person household heating with fuel oil receives $570 with no income and $497 with $286 a month of TEA cash assistance.
Fixes #9964
The state application, in both the FY2025 form and the current form, requests work income only from members "18 and older & not a full-time student" and does not define a full-time student. The formula applies the adopted FFY 2025 manual's definition. It excludes the earnings of every member under 18, of a full-time college student up to age 23 (read as inclusive) who is a dependent of a household member, and of an 18-year-old high-school student; unearned income still counts. Independent full-time college students, and dependent ones aged 24 or older, report work income like other adults. Final-award tests cover members aged 17 and 18 and independent full-time students aged 22, 23 and 24.
Policy verification remains partial. The interest allowance's assessment unit remains unconfirmed. The model does not apply the manual's full-time-work and emancipation exceptions to the 18-year-old high-school rule or its half-time attendance condition on a child's earnings. The FY2025 form (AEO 9495 R 01/FY2025) carries the same work-income sentence as the current form (LIHEAP 9495 R 11/2025).
Regulatory authority
Manual page numbers in this PR refer to the adopted 190-page FFY 2025 manual (cover: "Effective October 1, 2024 – September 30, 2025"; PDF metadata: created November 18, 2024). It supersedes the 167-page August 2024 draft. Every encoded rule reads the same in both versions. The draft's section 4.7.3 also exempts adult full-time students from the Zero Income Form; the adopted section 4.7.3 (page 59) omits that sentence. No FY2026 manual was found, so FY2026 applies the FFY 2025 manual's income rules.
Eligibility
defined_for = StateCode.ARis_citizen_or_legal_immigrant, with no SNAP-specific waiting periods or bars. A household with no qualified member is ineligible. Every member's countable income counts in full.has_heating_expense, which defaults to a positive primary-fuel bill with heat not in rent; an explicit false (for example, a bill fully reimbursed through an allowance, plan item 2.3, page 10) is respected. Heat included in unsubsidized rent qualifies with no separate bill. A household with housing assistance or in public housing whose rent includes heat needs a positive reported excess charge.heating_typeNONE is ineligible.Countable income
is_full_time_college_student) up to age 23, inclusive, who is a dependent of a household member (is_tax_unit_dependent); and of an 18-year-old high-school student (is_in_k12_school). Other students' earnings count after the 20% disregard; unearned income counts for all members. In FY2026, three independent full-time college students aged 22, 23 and 24, each living alone with $48,000 of wages, have countable income of $38,400, above the $28,164 one-person limit, and receive $0. A dependent student's $6,000 of wages is excluded through age 23 and counted at 24.total_unemployment_compensation: the reported amount, or modeled state unemployment insurance when none is reported; Arkansas UI is not modeled), strike benefits, SSI, pensions, military retirement pay, survivor benefits, alimony, child support, qualified and non-qualified dividends, veterans benefits, cash gifts from outside the household (financial_assistance), workers' compensation, gambling winnings and capital gains. Floors each source at zero, so a loss in one source offsets nothing. The manual counts only regular cash gifts (three or more consecutive months, page 157);financial_assistancecannot separate them, so every reported gift counts.medicare_part_b_premiumand floors the result at zero.tanfaggregate, which includesar_tea. The current application explicitly requests TEA despite the plan's unchecked TANF box.Benefit
heating_typeis a required input; Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754 tracks the unspecified default.Years covered
A calendar-year period reads the parameters in force on January 1. Formulas are undated, and the registry entry lists no
verified_years. Matrix and limit checks do not establish complete verified policy years. Other years are unverified backfilled estimates:Not modeled and source conflicts
financial_assistancecannot separate them, so every reported gift counts.is_in_k12_schooldefaults to true only for ages 5–17, so the 18-year-old high-school exclusion applies when a caller sets it.is_tax_unit_dependentstands for "a dependent of a member of the household"; a student the household lists as a dependent whom no member claims for tax purposes has earnings counted.medicare_part_b_premiumis zero when a person is not enrolled and excludes the share a Medicare Savings Program pays.has_heating_expense(default: a positive primary-fuel bill with heat not in rent); a caller sets it false when an allowance fully reimburses the bill. Verification of allowances is not modeled.immigration_status(for example, COFA or battered-noncitizen cases)is_citizen_or_legal_immigrant.Application Section III, read with the manual's full-time-student definition, governs minor and student earnings. The plans, application forms and manual differ on these items:
workers_compensation.tanf.gambling_winnings.capital_gainsfloored at zero.rental_incomeandfarm_rent_income(landlord rent) to the earned sources, which take the 20% disregard.Microsimulation: the microsimulation datasets carry no heating inputs, so population totals are about $0 until #9754 lands. Callers must send
heating_typewith the matching fuel bill.Test plan
83 YAML cases in 7 files cover:
has_heating_expensefalse with a $1,200 gas bill (ineligible, $0), no heat and no qualified member (household size 0 and a $0 income limit);total_unemployment_compensation), strike pay, qualified and non-qualified dividends, veterans' benefits and regular cash gifts, TEA with and without take-up, and loss floors in earned and unearned sources;integration.yaml, each checking the heating expense, heating-cost flag, household size, countable income, limit, eligibility, matrix amount and grant: an SSI and Social Security retiree with electric heat ($127), a minimum-wage single parent with gas heat ($124), a family of four with a dependent college student heating with propane ($114), a renter whose unsubsidized rent includes gas heat ($146), and an FY2025 retired couple heating with wood ($68).Every case that tests eligibility or a grant specifies
heating_type; income-only cases do not need it. A mixed-state case pays only the Arkansas household. Expected values are hand computations from the sources; CI runs the cases. Registry YAML parsing,git diff --checkandmake formatpassed. Tests that encode the documented assumptions do not resolve the remaining source gaps.make formatchangelog.d/axiom: TheAxiomFoundation/rulespec-us#1538 queued
🤖 Generated with Claude Code