Repository navigation
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #9746 +/- ##
=========================================
Coverage 100.00% 100.00%
=========================================
Files 4 10 +6
Lines 76 153 +77
Branches 2 1 -1
=========================================
+ Hits 76 153 +77
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:
|
Floor the payment level before the matrix lookup so units outside Maryland index a valid key in mixed-state simulations, and add a two-state case. Name the Medicare premium variables that are not wired in and cite COMAR 07.03.21.04D(3). Place Maryland between IL and TX in programs.yaml and shorten the note. Bring the nine test files to the shared conventions with fuel bills, realistic amounts and derivation comments, and add end-to-end cases for multi-member, Garrett, over-income, public-housing, size 11+ and heat-in-rent households. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
COMAR 07.03.21.04D(12) pensions, D(13) annuity and retirement disbursements and D(18) veteran's pension benefits cover every component of survivor_benefits, and .04E excludes none of them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Write parameter date keys unquoted, wrap each variable's documentation string across lines, and assert the published income limits at the odd household sizes only; the integration cases cover the even sizes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR Review: Maryland MEAP regular heating assistancePR #9746: Add Maryland MEAP regular heating assistance (author: hua7450, head Scope: Maryland's LIHEAP heating program, run by the DHS Office of Home Energy Programs as the Maryland Energy Assistance Program (MEAP). The PR covers the regular heating benefit only. EUSP, EARA/GARA arrearages, crisis, cooling, equipment and the medical-expense waiver are out of scope. The PR changes 37 files: 16 parameters, 10 variables (9 computed and the new Overall: the FY2026 encoding is accurate. All 35 FY26 matrix cells, the eight printed annual income limits, the size 11-12 limits from 60% SMI, the Garrett County multiplier, the band edges and all 40 test expectations match the sources. The problems are in how the parameters are dated and in a few income and fuel rules:
No finding was downgraded or dropped after re-verification. Two suggestions from the first pass were raised to should-address for consistency with this batch: the rental-loss asymmetry (S4, as #9743 S4) and the boundary-test gaps (S6, as #9743 S5 and #9744 S4). One proposed fix was corrected: netting Medicare does not change integration Case 5, because the model gives that couple a $0 out-of-pocket Part B premium, so a new case is needed to pin the deduction (S2). Duplicate findings from the regulatory and code passes are merged. Path prefixes used below:
Line numbers refer to head Source Documents
Year map: which matrix each period readsCOMAR .02B(6): "'Current program year' means the State fiscal year from July 1 through June 30." .07B(1): "The Administration shall determine annually the benefit payment levels and include the levels in each year's approved State plan." The PR maps period Y to state FY Y (
Critical (Must Fix)C1. Period 2025 pays FY26 amounts, but the published FY25 matrix is different and mostly lower
Should AddressS1. Period 2027 pairs stale FY26 amounts with FY27, whose matrix is published and in force
S2. Social Security and railroad retirement are counted gross of the Medicare premium; COMAR, the plan and the manual all net it
S3. Military retirement pay is not counted as a pension
S4. Rental and estate losses reduce countable income, but self-employment losses are floored, although COMAR treats self-employment and rental income as one item
S5. SOLAR-heat households are eligible but paid $0 by construction
S6. Four boundaries have no test that would fail if they brokeCoverage is otherwise strong: every fuel branch, every band edge and edge + $1, Levels 6 and 7, Garrett at Levels 1, 6 and 7, the size-11 SMI limit at and $1 above, and the two-state case. These are not pinned:
S7. Parameter descriptions use verbs outside the templateThe same pattern was flagged in #9744 S5, #9728 S5 and #9726 S8. Merged LIHEAP parameters use provides/sets/limits/uses/excludes. Each description below ends correctly with the program name:
Two smaller wording issues:
Source: repository parameter-description convention; there is no regulatory page. SuggestionsG1. Household size follows COMAR .04C, not manual p. 108 (documented choice)
G2. The SNAP nominal payment is neither modeled nor listed as excluded, and the two exclusion lists differ
G3. Two source conflicts are not disclosed (the PR follows COMAR, which is correct)
G4. Point the unknown-fuel $0 at #9754 in code and tests
G5. A published table already gives the large-household SMI dollars
G6. Reference polishNone of these references is wrong. They could be more complete:
G7. Non-Maryland units divide 0/0 in
|
| Check | Result |
|---|---|
| FY26 matrix (source 2) | 35 of 35 cells: Electric 100 x6 / 25; Gas 550/475/400/360/300/225/25; Oil 1,100/990/880/770/650/225/25; Propane 1,000/930/830/725/600/225/25; Wood/Coal = Gas. Gas and Wood/Coal are identical in FY26, so the shared row is valid for FY26 only |
| Income limits, sizes 1-10 | 2 x FPG with a one-year lag. The eight printed annual limits ($31,300 ... $108,300) reproduce, and sizes 9-10 give $119,300 / $130,300 (the IG "+$11,004" line gives $4 more, which the PR documents). The plan's %SMI table (2.1, p. 9) is a truncated restatement; the published IG dollars and COMAR .03A(2)'s poverty-percent wording control |
| Income limits, sizes 11+ | floor(factor x floor(0.6 x SMI4)): SMI4 $154,117 (gov.hhs.smi 2025-10-01; ACF Att. 4 p. 2), giving $135,930 and $138,705 (Att. 4 p. 5). 200% FPG at size 10 ($130,300) stays under 60% SMI ($133,156), so switching at 11 is the federal cap at work |
| Categorical eligibility | snap + tanf + ssi > 0 matches plan 1.4 (p. 5) and manual p. 62. tanf carries md_tca take-up. CE households over 200% get Level 7, $25 (the manual's "Level 6" on p. 63 is a mislabel; the FY25-FY27 matrices all put it at Level 7). Means-tested VA is a documented gap |
| Household and immigration | is_citizen_or_legal_immigrant matches COMAR .02B(20)(a)-(g); at least one qualified member (manual p. 16); nonqualified members' income counted (.04C(2)) |
| Countable income | Child and full-time-student earnings excluded (.04E(3)); court-ordered child support paid deducted (.04E(13), F); lump sums excluded per .04E(16) (documented conflict); veterans_benefits breadth supported by manual Att. A; pension_income and retirement_distributions disjoint. The lists are self-contained, with no SNAP list reuse and no snap_rental_income double count |
| Denials | .06D(3)(i) subsidized heat-in-rent (manual p. 39) and .06D(3)(k) assisted living; no asset test (plan 2.3) |
| Levels and bands | Thresholds 0.25/0.5/1/1.5/2 with right=True match the inclusive FY26 headers; the FY25 band table confirms inclusive tops (size 1 "$0 - 314" for $313.75). Subsidized, public-housing and submetered households go to Level 6 unless at Level 7 |
| Fuel mapping | Kerosene → oil (FY27 "Oil/Kerosene"); wood/coal → the gas row (FY26 only, see C1/S1); OTHER and NONE → $0, consistent with the COMAR .02B(13) supplier list |
| Garrett County | Plan 2.5 (p. 11) 1.1 multiplier. Half-up rounding and the flat Level 7 match the FY27 Garrett table (665 x 1.1 = 731.5 → "$732"; 595 → "$655"; every Level 7 cell "$25"). The plan's $1,100 maximum is the statewide oil Level 1 (FY25 likewise: $750), so $1,210 for FY26 Garrett oil Level 1 is consistent |
| Code patterns | defined_for throughout (md_meap → md_meap_eligible → MD); SPMUnit/YEAR, Person/YEAR earnings; no hard-coded policy values; vectorized; level floored at 1 so mixed-state runs do not raise (Case 9); all 16 parameters read; helpers reused (fpg(year_lag=), smi(), has_heating_expense, heat_expense_included_in_rent); no SNAP-to-MEAP cycle |
| Tests | 40 cases, plain 2026/2022 periods. Hand-checked: integration Cases 1-5, 7 and 10 (e.g. Case 5: 26,400 / 21,150 = 125% → Level 4 → 725 x 1.1 = 797.50 → $798; Case 10: 138,228 / 70,650 = 196% → Level 5 → $300), md_meap Case 6 ($523/$798/$248/$1,210/$25), countable income $29,440, FPG Case 1 ($17,420) |
| Microsimulation | Datasets carry no heating inputs, so MD totals are about $0 until #9754 lands, as the PR body says. md_meap feeds no household aggregate |
Checklist results (LIHEAP batch 2)
- SNAP income-list reuse: pass on reuse; the lists are self-contained and use
rental_income, so main'ssnap_rental_incomechange cannot double count. Fail on source treatment: Social Security and railroad benefits gross of Medicare (S2), military retirement pay missing (S3), rental and estate losses unfloored (S4). - Backfill and carry-forward: period 2025 carries FY26 amounts back over the published FY25 matrix (C1); period 2027 carries them forward although FY27 is published (S1).
- Operative state rule: COMAR .03A residence and qualified member, .04C, .06D(3)(i) and (k), manual p. 16 heating responsibility and p. 62 CE are encoded. The .04C versus manual p. 108 conflict is documented (G1). SOLAR is eligible but unpaid (S5).
- UNSPECIFIED and microsim defaults: UNSPECIFIED → $0 is deferred to Default heating_type to electricity and remove the UNSPECIFIED-gated state heating adapters #9754, which is acceptable; add the pointer in code (G4).
- Axiom line: valid
queuedline pointing to a dispatch-readype-parityissue; the head pin is stale (see below). - References: every PDF href is a single
#page=N; no page text in titles; plan#page=5/9/11and manual#page=11/16/39/62/63/107land correctly; editions are current (FY26 plan Revision Basic prototype #1, manual May 2025). Polish in G5-G6. - programs.yaml: the MD entry is well formed and sorted between KY and MS. The coverage-line conflict with main is expected (see Branch status). Not a finding.
- Rounding and boundaries: half-up rounding is tested at .50 products ($523/$798/$248) with a flat Level 7; every band top is tested at the edge and $1 above; limits are tested at the edge and $1 above for sizes 1 and 11; periods are plain. Gaps: the size 10/11 switch and the age-18 boundary (S6).
CI status
37/37 checks pass at 91a4276fac (gh pr checks 9746, 2026-10-06).
Branch status
- 11 commits ahead of
mainand 13 behind, from merge baseb812bd46a0. GitHub reportsCONFLICTING. - Expected conflict in
programs.yaml(not a finding):- Fix LIHEAP program registry entries and add a registry integrity test #9722 rewrote the LIHEAP coverage line to
DC, Riverside County, MA, IL, IN, KS, KY, MS, NC, NE, TXand removed the ORin_progressstub. The PR hasOR, DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, TX. - Resolve to
DC, Riverside County, MA, IL, IN, KS, KY, MD, MS, NC, NE, TX, and keep the OR block deleted as on main. - The MD entry merges between KY and MS. Main's
policyengine_us/tests/test_programs_registry.pychecks thatmd_meapandgov.states.md.dhs.meapresolve, and they do.
- Fix LIHEAP program registry entries and add a registry integrity test #9722 rewrote the LIHEAP coverage line to
- Other main commits: the newest, Backdate parameters before applying reforms #9628, still backdates every parameter's earliest value to 2015 (it only moves that step before reforms), so C1 persists after a rebase. The reference-URL guards (Fix fused reference URLs repo-wide and correct Arkansas DFA page anchors #9609, List casetext.com in the known-dead reference URL guard #9768) accept the PR's references, which are all single bare URLs. No other main commit touches MEAP,
heating_expense,fpg()orgov.hhs.smi.
Axiom line
axiom: TheAxiomFoundation/rulespec-us#1482 queued: valid format, and the issue meets the bar.
- rulespec-us#1482 is open and labelled
pe-parity(plusenhancement). - It has module paths (
us-md/regulations/comar/07.03.21/{02,03,04,06,07},us-md/statutes/human-services/5-5A-07; corpus marked "needs ingest"), verbatim COMAR, manual and plan text, a required-outputs table covering every variable, and 21 companion tests derived from the matrix, Income Guidelines and FPG rather than from PE output. It is dispatch-ready. - It is stale:
- It records head
1d83d76f54, so it misses7ede048e5a(the tidy commit) and twomainmerges, and it calls the PR a draft. - It encodes "Medicare deduction not wired" (S2) and SOLAR → $0 (S5), and its year scope will change with C1 and S1.
- It records head
- None of this blocks the PR by itself. Update the issue when the fixes land.
Next steps
- C1: split
gas_wood_coaland add FY25 (2024-07-01) amounts, or gate the program to start in FY26. Add a period-2025 test either way. - S1: add FY27 (
2026-07-01) amounts and a period-2027 test, then widenverified_years. - S2-S4: net Social Security and railroad benefits of
medicare_part_b_premium, addmilitary_retirement_pay, floor each unearned source, and add the three cases above. - S5: map SOLAR to the electricity row (or make it ineligible) and update Case 7.
- S6-S7: add the size 8/10, age-18, survivor-benefit and CE-denial tests, and align the five parameter descriptions.
- Rebase on
main(coverage line as above), refresh the PR body and rulespec-us#1482, and re-run CI.
1 critical and 7 should-address findings, plus 13 suggestions.
Verdict: REQUEST_CHANGES
DTrim99
left a comment
There was a problem hiding this comment.
Requesting changes per the review comment above: 1 critical (period 2025 carries the FY26 amounts back over the published, mostly lower FY25 matrix) and 7 should-address items (2027 keeps FY26 amounts though the FY27 matrix is in force, Social Security/RRB counted gross of Medicare, military retirement pay not counted, rental/estate losses offsetting income while self-employment losses are floored, SOLAR households eligible but paid $0, boundary-test gaps, parameter descriptions). All 35 FY26 matrix cells, income limits and the Garrett multiplier match the sources.
- Encode the FY25 and FY27 benefit matrices beside FY26, splitting the gas and wood/coal rows; verified_years "2025-2027"; document the FY27 Garrett oil Level 4 cell. - Count every child under 18 regardless of status and exclude only nonqualified adults, following the OHEP manual; require a qualified member; share adult_age with the earned-income rule. - Count Social Security and railroad retirement net of the Medicare Part B premium; add military retirement pay; floor every unearned source. - Read the electricity row for solar heat; guard the FPG ratio divisor. - Add cases for the FY25 and FY27 rows and Garrett amounts, mixed-status household size, the Medicare deduction, rental and estate losses, categorical eligibility with assisted living and heat in rent, and model-computed SNAP conferring categorical eligibility. - Re-template descriptions and add manual, plan, matrix and COMAR references. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
# Conflicts: # policyengine_us/programs.yaml
PR Review (round 2): Maryland MEAP regular heating assistancePR #9746: Add Maryland MEAP regular heating assistance (author: hua7450). Round 1 reviewed head Summary: the fix commit addresses the critical finding and all seven should-address findings.
I re-ran the round-1 examples on the new head, and each now gives the source's result. All 50 MEAP YAML cases pass locally. Every round-1 suggestion is addressed except G12 (optional naming) and part of G6. There are no new critical or should-address findings. There are five new suggestions. The largest is that the FY27 OHEP Income Guidelines are published, although the PR says none were found (G14): the model reproduces their sizes 1-12, but not the 13-15 rows. CI has not finished on this head (see CI status). Path prefixes as in round 1:
Line numbers refer to head Sources added this round
Sources 1-9 are as in round 1. The FY2025 matrix (source 6), the FY27 matrices (source 5), the FY2025 plan (source 7) and ACF Att. 4 (source 8) are now cited in the PR. Year map at the new headA YEAR formula reads parameters at January 1 of the period, which falls inside the state fiscal year of the same number (COMAR .02B(6): July 1 to June 30).
Each claimed period now pairs its own matrix with its own limits. Round-1 items
Re-run of the round-1 households at the new head (single adult, Baltimore County unless noted, no SNAP, TCA or SSI):
Critical (Must Fix)None. Should AddressNone. SuggestionsG14. The FY27 OHEP Income Guidelines are published: cite them and test period 2027. Their 13-15 rows differ from the model
G15. The unearned floor applies to the unit total of each source, so one member's loss still offsets another member's income from the same source
G16. The rule parameters still start in FY26, although the registry claims FY25
G17. Reference titles, one anchor and one description
G18. FY25 and FY27 Levels 2-5 are pinned by only four cells
Carried over: G6 (manual p. 112 entry, now in G17) and G12 (optional), above. New code in
|
DTrim99
left a comment
There was a problem hiding this comment.
Round 2: the round-1 critical and all seven should items are addressed and verified (FY25 and FY27 matrices encoded with gas split from wood/coal, Social Security/RRB net of Part B, military retirement pay, per-source loss floors, SOLAR on the electricity row, new boundary tests, descriptions). The remaining items are suggestions only (notably citing the FY27 OHEP Income Guidelines and adding period-2027 limit tests). CI on 906c785 was still running at review time with no failures; please confirm it is green before merging.
Adds Maryland's MEAP regular heating benefit for state FY25 to FY27, including income/categorical eligibility, fuel and poverty-level payments, housing treatment and Garrett County's supplement. A qualifying gas-heating household at 101–150% FPG receives $360 statewide in FY26.
Fixes #9938.
Implementation
ordinary_dividend_income, and deducts reported child support paid, assumed court-ordered. Social Security and railroad retirement count net of the computed Medicare Part B premium (COMAR .04D(3), D(26), E(20); plan 1.9). Every source is floored at zero, so a rental or estate loss does not offset other income (D(2); plan 1.8). Farm rental income counts with rental income; survivor benefits count under D(12), D(13) and D(18).tanfreceipt variable for TCA income and categorical eligibility so unclaimed entitlement does not count. SNAP, TANF or SSI receipt waives the income test but not the other denials; the nominal amount above 200% FPG is $25.2024-07-01,2025-07-01,2026-07-01), which a model year reads at January 1 inside the matching state fiscal year. Gas and wood/coal are separate rows because FY25 and FY27 print different amounts. Kerosene maps to oil (labeled Oil/Kerosene from FY27) and a grid-tied solar home to electricity, the billheating_expenseassigns it. Applies the plan's 1.1 Garrett multiplier with half-up rounding and a flat nominal grant; the FY27 Garrett table matches that in every cell except oil Level 4, which prints $1,210 (1.1 × the FY26 oil Level 1) where 1.1 × $980 is $1,078, and the multiplier is kept. Heat-in-rent uses the known building fuel.verified_years: "2025-2027". Earlier years remain unverified estimates.Source conflicts and remaining coverage
No amendment or agency clarification reconciling these was found; the 2023 categorical-eligibility statute does not settle household membership.
Medicare Part D premiums are not deducted (no variable). Means-tested VA eligibility cannot be inferred from generic veterans income. Other limits include detailed subsidy exceptions, the court-order cap on child support, some income sources and the 30-day observation window. No announced regular-heating medical-expense waiver was found. The renter fuel assignment remains an explicit inference. Other and unspecified fuels return zero as a coverage gap (#9754); an unknown county receives the statewide amount. The $21 SNAP nominal payment, cooling, EUSP, arrearage, crisis and equipment benefits are excluded.
Microsimulation: the datasets carry no heating inputs, so population totals are $0 until the default heating type changes. That change affects API partners and is tracked separately in #9754; callers must send
heating_typewith the matching fuel bill.Validation
50 program YAML cases cover every FY26 statewide matrix cell, the FY25 and FY27 rows at Levels 1 and 6, the Garrett multiplier in all three years including the FY27 oil Level 4 cell, nominal payments, submetered/assisted-living treatment with and without categorical eligibility, the subsidized heat-in-rent denial with categorical eligibility, poverty boundaries, all FY26 limits for sizes 1–12 and the FY25 limits, the age-18 and student arms, the Medicare deduction (pinned and model-computed), a rental and an estate loss, every listed unearned source, the household-size rule for four mixed-status households, farm rental income over the limit, TANF take-up, model-computed SNAP conferring categorical eligibility, and integrated calculations. Every program case specifies
heating_type; a two-state case covers a mixed simulation.Official sources
axiom: TheAxiomFoundation/rulespec-us#1482 queued