Skip to content

Point the FL and SD LIHEAP conflict candidates at their code on main - #10349

Merged
MaxGhenis merged 4 commits into
mainfrom
source-conflict-liheap-candidates
Oct 22, 2026
Merged

MaxGhenis merged 4 commits into
mainfrom
source-conflict-liheap-candidates

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

This is the follow-up promised in #10334. It brings the Florida and South Dakota LIHEAP entries in source_conflicts/candidates.yaml up to date with the code on main, and adds four Florida candidates that were missing.

Why. #10287 wrote these candidates while #9969 (FL) and #9974 (SD) were still open. So each says code: [] and "Code not yet on main". Both PRs have merged.

Refreshed candidates (nine). Each now lists the files that decide it under pe_us.code. Its note says which source that code follows, as I read it on main. pe_us.follows stays unknown, as for every candidate whose readings begin "No statute supplied". FL's size-13 entry keeps follows: statute.

Candidate Code What the code follows
us-fl:liheap-energy-in-unsubsidized-rent fl_liheap_eligible.py Manual parts 900.01A and 100.01: heat in unsubsidized rent qualifies
us-fl:liheap-large-household-contract-limit fl_liheap_income_limit.py, eligibility/fpg_rate.yaml The FY2026 plan and matrix: 60% of SMI for every size (fpg_rate is 0 from October 2025)
us-fl:liheap-size-13-income-limit fl_liheap_income_limit.py, hhs_smi.py, eligibility/truncates_smi_limit.yaml, fl_liheap.py 60% of SMI for size 13, within the federal ceiling, for the limit and the payment bands
us-sd:liheap-2025-published-income-limit sd_liheap_income_limit.py, limits/table/amount.yaml, limits/table/in_effect.yaml The published 2024-2025 table. The table source is now the archived DSS page the code cites.
us-sd:liheap-2026-plan-income-limits sd_liheap_income_limit.py, limits/fpg_upper_rate.yaml, limits/smi_rate.yaml, limits/table/in_effect.yaml DSS's 2025-2026 limits, through the 200% cap, with the published table off from October 2025
us-sd:liheap-cash-gifts income/sources/unearned.yaml, sd_liheap_countable_income.py The rule and manual: regular cash help counts
us-sd:liheap-gambling-winnings income/sources/unearned.yaml, sd_liheap_countable_income.py The manual: winnings count in full
us-sd:liheap-categorical-eligibility sd_liheap_eligible.py The rule and plan: every member must receive SNAP
us-sd:liheap-kerosene-payment-method sd_liheap.py Changed: the plan and rules. Only wood and coal are paid in full, so kerosene is capped at unpaid charges like fuel oil. The old note said the code follows the 2018 manual's full payment by check, which the merged code does not do.

New candidates (four). The merged FL code records all four conflicts in its comments, and none had a candidate.

  • us-fl:liheap-fy2026-payment-range. The FY2026 plan, item 2.6, estimates payments of $400 to $1,350. The October 2025 matrix, which manual Part 200 Q.4 and contract D(10)b require, pays $200 to $700. PE-US follows the matrix (payment/base_amount.yaml, fl_liheap.py).
  • us-fl:liheap-income-limit-manual-sections.
    • Manual 900.01D, the FY2025 plan and the FY2025 matrix set the limit at 60% of SMI, and at 150% of the poverty guideline from size 9.
    • Manual 1100.03D and 1200.01A, and contract G(7)d, set 150% of the guideline for every size.
    • PE-US follows 900.01D in FY2025, and the FY2026 plan and matrix from FY2026, as the manual's "current benefit matrix" instruction directs.
  • us-fl:liheap-income-floor-vs-smi-limit. This is a statute against guidance. 42 U.S.C. 8624(b)(2)(B) bars excluding a household on income below 110% of the poverty guideline, while the 60% SMI limit falls below that floor from size 15. PE-US follows the statute (fl_liheap_eligible.py, gov/hhs/liheap/fpg_floor.yaml). The floor's guideline year comes from eligibility/fpg_year_lag.yaml, and the band 4 base the household keeps is fl_liheap.py's estimate. The example is fl_liheap.yaml's Case 27: limit $98,320, floor $101,915.
  • us-fl:liheap-minor-income. The current application and portal FAQ exclude all minors' income, while manual 1200.01D counts 16- and 17-year-olds not in school full time. PE-US follows the application (income/fl_liheap_countable_income.py, income/adult_age.yaml).

Reframed SD income-limit entries. ARSD 67:15:01:10 sets only the three-month income period, not a limit. The "rule" the old text cited is the model's inferred pattern.

  • FY2025. The conflict is plan item 2.1's 60% of SMI against the published table's 200% of the 2024 guideline for sizes 1-3: one person's limit is $32,984 against $30,120, as table/amount.yaml records.
  • FY2026. DSS's 200% of the 2025 guideline against the plan's 60% of SMI for sizes 4-6. $22,013 is the model's flooring, and $22,014 unrounded.

Anchors, URLs and code lists (both reviews):

  • FY2026 plan item 2.1 is on page 8, not 4, and contract G(8)c is on page 12, not 9.
  • The null URLs are filled from the merged code's references.
  • The FL manual-sections entry cites the FY2025 and FY2026 plans, both matrices and the manual's "current matrix" page.
  • Kerosene cites plan item 9.1 and ARSD 67:15:01:43.01.
  • FL size 13 adds truncates_smi_limit.yaml and fl_liheap.py; SD 2026 adds fpg_upper_rate.yaml, smi_rate.yaml and table/in_effect.yaml; the FL floor adds fpg_year_lag.yaml and fl_liheap.py (round-2 review).

Every citation and page number comes from the merged code's own comments and references.

Verification.

  • policyengine_us/tests/code_health/test_source_conflicts.py gives 103 passed. I ran a copy outside the package, so pytest doesn't import policyengine_us.
  • With main merged in (ee492a2), there are 229 candidates, still sorted, with unique ids. Merging main brings Stop trusting the compromised eMudhra CA certificates #10377's workflow and uv.lock changes. DTrim99 traced the failing "Package and compatibility" check to them, against this branch's older lock.
  • Every new code path is a tracked file.

Not in this PR. Counted at 15:33Z on 2026-10-22, with main merged in: 99 other candidates still say their code is not on main, though a PR they name has merged (69 merged PRs in all). The count grows as PRs merge. Refreshing them is the same work, so it's a separate change.

axiom: n/a: source-conflict backlog metadata only; no model change

🤖 Generated with Claude Code

#10287 wrote these candidates while #9969 (FL) and #9974 (SD) were open, so
each said its code was not on main. Both have merged. Each candidate now
lists the files that decide it, and its note says which source that code
follows, as read on main. One note changes substance: SD's merged code caps
kerosene at unpaid charges like fuel oil, following the plan and rules, not
the 2018 manual's full payment by check. The SD 2025 table candidate gets the
archived DSS page as its source.

Two FL conflicts recorded in the merged code had no candidate: the FY2026
plan's payment estimate against the October 2025 matrix, and manual part
900.01D against parts 1100.03D and 1200.01A and contract G(7)d on the income
limit.

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

DTrim99 commented Oct 21, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Point the FL and SD LIHEAP conflict candidates at their code on main

PR #10349 (author: MaxGhenis), head fb357f94fb. This is a first review. The PR changes two files: source_conflicts/candidates.yaml (nine entries refreshed, two Florida entries added) and changelog.d/source-conflict-liheap-candidates.changed.md. Line numbers refer to fb357f94fb.

Summary

#10287 wrote the Florida and South Dakota LIHEAP candidates while #9969 and #9974 were open, so each said code: [] and "Code not yet on main". Both PRs merged on 2026-10-20. #10334 then baselined their comments in the ratchet. This PR points the nine candidates at the merged files. It also adds us-fl:liheap-fy2026-payment-range and us-fl:liheap-income-limit-manual-sections.

The refresh is accurate:

  • All 13 code paths exist on main and hold the logic the notes describe.
  • Each note says what the merged code does. That includes the corrected kerosene note: since Pavel's C1 on Add South Dakota LIEAP regular heating assistance #9974, kerosene is capped at unpaid charges, not paid in full.
  • The follows values match the file's convention: all 46 candidates whose readings begin "No statute" use unknown. FL size 13 keeps statute, which is right.
  • Citations. I checked every citation in the two new entries against the plan, manual and contract PDFs. All of them hold.

One should item. The merged Florida code records two more conflicts that have no candidate:

  • the federal 110% poverty floor against the 60% SMI limit (GA, MS and OH already have this candidate);
  • the exclusion of minors' income (AR and OK already have this one).

Both pass the PR's own test for adding a candidate: the merged code records the conflict in a comment, and no candidate covers it.

Four suggestions:

  1. The two SD income-limit entries credit ARSD 67:15:01:10 with a min/max formula it doesn't contain. The real FY2025 conflict is between the plan and the DSS table.
  2. Three page anchors are wrong in the FL entries this PR edits.
  3. Fill the null URLs and add the missing deciding files that the merged code now supplies.
  4. Add an n/a axiom line, as the sibling PRs do.

Status. CI is 27/27 green at the head; test_source_conflicts.py ran 103 tests with 0 failures. The branch merges cleanly with main and with each of #10350, #10351 and #10352.

Critical (must fix)

None.

Should address

1. Add candidates for the two Florida conflicts the merged code records without one: the 110% floor and minors' income.

Where: the Florida block, source_conflicts/candidates.yaml:1304-1460. None of the five us-fl:liheap-* entries covers either conflict.

Why it is in scope. The PR body picks its new candidates this way: "The merged FL code records both conflicts in its comments; neither had a candidate." The merged code records two more conflicts on the same terms. #9969's body lists both.

(a) Federal 110% floor against the 60% SMI limit

  • The code comment. fl_liheap_eligible.py:39-44: "42 U.S.C. 8624(b)(2)(B) bars excluding a household on income below 110% of the poverty guideline. The 60% SMI limit falls below that floor from household size 15 in FY2026 and the 2027 carry-forward." fl_liheap_income_limit.py:54-56 says the same.
  • The plan. FY2026 plan item 2.1 (file page 8) designates "State Median Income ... 60.00%" for every row.
  • The statute. The plan's own assurance (page 45) repeats it: "a State may not exclude a household from eligibility in a fiscal year solely on the basis of household income if such income is less than 110 percent of the poverty level".
  • This is the backlog's core case: a statute against guidance, with PE-US following the statute. Our round-1 C1 on Add Florida LIHEAP regular heating assistance #9969 was this conflict.
  • Precedent. us-ga:liheap-income-floor-vs-smi-limit, us-oh:liheap-income-floor-vs-smi-limit and us-ms:liheap-110-percent-poverty-floor are the same question for those states.
  • South Dakota needs none. Its limits are at least 1.4999 times the lagged guideline, so the floor never binds (round 2 of Add South Dakota LIEAP regular heating assistance #9974).

(b) Minors' income

  • The code comment. income/fl_liheap_countable_income.py:27-31: "The current statewide application excludes all minors' income, matching the portal FAQ. ... This supersedes the older manual's nonstudent exception." income/adult_age.yaml:2-4 says the same.
  • The manual. Part 1200.01D (page 49): "Any income of a household member 18 and older will be counted, including ineligible household members. Income for any persons ages 16 and 17 who do not attend school full time will be counted."
  • The application. Page 1: "Enter ALL income for household members (except minors) for last month."
  • The portal FAQ. floridaliheap.com/faq lists "Income of minors" among the items that don't count.
  • Add Florida LIHEAP regular heating assistance #9969's body puts "Income of minors" in the same conflict table as the payment-range, size-13 and large-household rows. All three of those now have candidates.
  • Precedent. us-ar:liheap-minor-and-student-earnings (form against manual) and us-ok:liheap-child-earnings.

Why the ratchet missed them. None of the comments uses a trigger word ("supersedes" is not one). So neither fl_liheap_countable_income.py nor adult_age.yaml is in KNOWN_UNMARKED, and #10334 didn't surface them. Note also that fl_liheap_eligible.py is already a candidate code path, but only for the heat-in-rent conflict.

Effect. The model is not affected. The backlog misses two known Florida conflicts, one of which is a statute conflict, and the body's "two Florida candidates that were missing" undercounts.

Fix. Add two entries. Every value below comes from the merged code, its tests or the sources quoted above:

- id: us-fl:liheap-income-floor-vs-smi-limit
  program: liheap
  years:
    from: 2026
    to: 2027
    type: federal-fiscal
  question: Can Florida's 60% SMI heating limit exclude a household of 15 or more whose income is below the federal
    110% poverty-guideline floor?
  sources:
  - kind: statute
    citation: 42 U.S.C. 8624(b)(2)(B)
    url: https://www.law.cornell.edu/uscode/text/42/8624#b_2_B
  - kind: guidance
    citation: FY2026 LIHEAP State Plan item 2.1, p.8
    url: https://liheapch.acf.gov/docs/2026/state-plans/FL_Plan_2026.pdf#page=8
  - kind: form
    citation: October 2025 LIHEAP payment matrix footnote
    url: https://liheapch.acf.gov/docs/2026/benefits-matricies/FL_BenefitMatrix_Heat-Cool_2026.pdf
  readings:
    statute: Income below 110% of the poverty guideline cannot by itself exclude the household; the FY2026 plan
      assurances (p.45) and contract G(8)e (p.13) repeat this.
    other: The plan and matrix set 60% of SMI for every size, which falls below that floor from household size 15.
  example: Fifteen people with $100,000 exceed the $98,320 limit but are below the $101,915 floor and receive $200.
  pe_us:
    follows: statute
    code:
    - policyengine_us/variables/gov/states/fl/commerce/liheap/eligibility/fl_liheap_eligible.py
    - policyengine_us/parameters/gov/hhs/liheap/fpg_floor.yaml
    prs:
    - https://github.com/PolicyEngine/policyengine-us/pull/9969
  state: unreviewed
  note: PE-US applies the floor, rounded to cents with the statute's strict "less than" (fl_liheap_eligible.py).
- id: us-fl:liheap-minor-income
  program: liheap
  years:
    from: 2025
    to: 2026
    type: federal-fiscal
  question: Does Florida LIHEAP exclude all minors' income, as the current application and portal FAQ do, or count
    the income of 16- and 17-year-olds who do not attend school full time, as manual part 1200.01D does?
  sources:
  - kind: form
    citation: Florida statewide LIHEAP application, Monthly Household Income, p.1
    url: https://storage.googleapis.com/florida-liheap-relief-static-assets/Florida_LIHEAP_Application_English.pdf#page=1
  - kind: guidance
    citation: Florida LIHEAP portal FAQ, income not counted
    url: https://floridaliheap.com/faq
  - kind: manual
    citation: Florida LIHEAP manual part 1200.01D, p.49
    url: https://liheapch.acf.gov/sites/default/files/webfiles/docs/2023/manuals/FL_PolicyManual_2023.pdf#page=49
  readings:
    statute: No statute is supplied; the application asks for income of household members "except minors", and the
      portal FAQ lists income of minors as not counted.
    other: Part 1200.01D counts the income of members 18 and older and of 16- and 17-year-olds who do not attend
      school full time.
  pe_us:
    follows: unknown
    code:
    - policyengine_us/variables/gov/states/fl/commerce/liheap/income/fl_liheap_countable_income.py
    - policyengine_us/parameters/gov/states/fl/commerce/liheap/income/adult_age.yaml
    prs:
    - https://github.com/PolicyEngine/policyengine-us/pull/9969
  state: unreviewed
  note: PE-US follows the current application and portal FAQ, so no income of a member under 18 counts
    (fl_liheap_countable_income.py, adult_age.yaml). The application gives no effective date, so FY2025 is a backfill.

Both ids sort into place: income-floor-vs-smi-limit goes after fy2026-payment-range, and minor-income after large-household-contract-limit. Update the body's "two" and the changelog fragment to match.

Optional, same pass. The portal compares one month with monthly maximums rounded to whole dollars. fl_liheap_eligible.py:28-35 notes that this differs from the annual matrix value by at most $6 a year. That is a small calculator-against-matrix difference and could be a third candidate, but it isn't needed.

Suggestions

1. Reframe the two SD income-limit entries. ARSD 67:15:01:10 contains no limit formula, and the FY2025 table matches the FY2025 plan for four people.

Where: us-sd:liheap-2025-published-income-limit (lines 4889, 4895 and 4907) and us-sd:liheap-2026-plan-income-limits (lines 4917, 4926, 4928 and 4936).

What the entries say. Both cite ARSD 67:15:01:10 as "the rule":

  • 2025: "the rule's min/max formula gives $62,400";
  • 2026: "the rule and DSS give three-month limits of $16,075, $18,825 and $21,575".

The refreshed notes repeat this ("Verify why the table departs from the rule"; "which match the rule").

What the rules say.

  • 67:15:01:10 reads in full on income: "In determining income for a non-self-employed household, the department shall compute the household's income from the three full calendar months immediately prior to the date of application." It goes on to cover self-employment and changed circumstances, and gives no limit.
  • 67:15:01:11 says only: "Eligibility for LIEAP or ECIP is based on the household's income, the federal poverty level, and the amount of funding available".
  • No other section in the chapter index sets a limit; most are repealed.

What "the rule" really is. The min(200% FPG, max(150% FPG, 60% SMI)) formula is the model's inferred pattern, not a regulation:

FY2025: the table follows the plan except for sizes 1-3.

  • Size 4. SD's FY2025 SMI is $105,723. floor(105,723 × 0.6) = 63,433; floor(63,433 / 4) = 15,858; × 4 = $63,432. That is the published four-person limit, which I confirmed on the January 14, 2025 capture. It is exactly the FY2025 plan's 60% of SMI (item 2.1).
  • Sizes 5-10. Sizes 5-9 follow 60% of SMI with nearest-dollar quarters (18,396; 20,933; 21,409; 21,884; 22,360). Size 10 is 150% of the guideline: 95,220 / 4 = 23,805.
  • Sizes 1-3 depart from the plan. They are 200% of the 2024 guideline: one person is $7,530 = 30,120 / 4. The plan's 60% of SMI would give $32,984 a year for one person.
  • The merged code records this split. table/amount.yaml:2-4: "the published limits for sizes 1-3 equal 200% of the 2024 guideline instead".
  • So the real FY2025 conflict is plan against table for sizes 1-3. $62,400 is no source's figure.

Fix:

  • 2025 entry:
    • Replace the ARSD source with FY2025 plan item 2.1 (SD_Plan_2025.pdf#page=8, which amount.yaml cites).
    • Reframe the question around sizes 1-3, for example one person: $32,984 under the plan against $30,120 in the table.
    • Note that the table exceeds the model's FY2024 pattern for sizes 4-7.
  • 2026 entry:
    • Say that ARSD 67:15:01:10 sets only the three-month income period.
    • Say that DSS's limits equal 200% of the 2025 guideline.
    • Change "$22,014" to "$22,013". The merged code comment (sd_liheap_income_limit.py:41-43, after Pavel's G12) gives floor(66,709 × 1.32) = 88,055, and 88,055 / 4 floors to 22,013. The figure 22,014 comes from 111,183 × 0.6 × 1.32 / 4 = 22,014.2 without the HHS flooring.

Why only a suggestion. The readings are #10287's text. The entries are unreviewed and get verified before they move to the register. The PR's new notes say correctly what the code does.

2. Fix three page anchors in the FL entries this PR edits.

  • Lines 1409 and 1439. "FY2026 LIHEAP State Plan item 2.1" links FL_Plan_2026.pdf#page=4.
    • File page 4 is item 1.1 ("Check which components you will operate").
    • Item 2.1 ("Designate the income eligibility threshold used for the heating component", 60.00% SMI rows) is on file page 8. The merged code cites page 8 in fpg_rate.yaml, smi_rate.yaml and fl_liheap_income_limit.py:14.
  • Line 1412. "Attachment A-2 §G8c" links 3E2.pdf#page=9.
    • Page 9 shows D(10)b ("Must follow the current benefit payment matrix provided by Commerce").
    • G(8)c is on page 12: "For Cooling/Heating and Crisis assistance, total household income cannot exceed the greater of an amount equal to 150 percent of Federal Poverty Guidelines (FPG) for the state for households with 9 or more individuals; or an amount equal to 60 percent of the SMI for the state for households with up to 8 individuals".
    • The merged code says page 12, and the new manual-sections entry already links #page=12 for G(7)d.
  • Severity. These anchors predate the PR (Tie source-conflict markers to the register shared with Axiom #10287), so this is a suggestion.

3. Fill the null URLs and add the missing deciding files that the merged code now supplies.

The PR already did this for the SD 2025 table source. The same reasoning applies here.

URLs:

  • Line 1318 (FL heat in rent, manual 1100.04B(1)): use the manual at #page=47. I confirmed "Home energy costs are not included in their rent" there.
  • Line 1445 (FL size 13, portal FAQ): use https://floridaliheap.com/faq (fl_liheap_income_limit.py:20).
  • Line 4979 (SD categorical, plan 1.4a): use SD_Plan_2026.pdf#page=5 (sd_liheap_eligible.py:15).
  • Line 5004 (SD gambling, manual page 27): use SD_Policy-and-Procedures-Manual2018.pdf#page=27.
  • Line 5038 (SD kerosene, DSS page):
    • Use the January 1, 2026 capture, which reads "the payment is made directly to the energy supplier".
    • Add plan item 9.1 (SD_Plan_2026.pdf#page=22) as a source. The new note says PE-US "follows the plan and rules", but the plan is not among the entry's sources.

Code lists:

  • SD 2026 entry. Add income/limits/fpg_upper_rate.yaml and income/limits/table/in_effect.yaml.
    • fpg_upper_rate.yaml holds the 200% cap that decides sizes 4-6, and its lines 7-9 record this exact conflict.
    • in_effect.yaml turns the table off from October 2025.
  • FL size-13 entry. Add fl_liheap.py. That file computes the bands, and the refreshed note now covers them ("for the limit and the payment bands").

4. Add an n/a axiom line for consistency. See below.

Verified correct

Each refreshed entry. All 13 code paths exist on main and at the head. CI's test_candidate_fields passes, and it checks that each path is tracked by git.

Candidate Code on main What the code does follows
us-fl:liheap-energy-in-unsubsidized-rent fl_liheap_eligible.py:58-69 responsible = where(heat_in_rent, ~subsidized | (heating_expense > 0), ...), so heat in unsubsidized rent qualifies (900.01A, 100.01) unknown (no statute)
us-fl:liheap-large-household-contract-limit fl_liheap_income_limit.py:59, fpg_rate.yaml:9 max_(smi_limit, guideline * fpg_rate) with fpg_rate 0 from 2025-10-01, so 60% of SMI for every size in FY2026 unknown; state: open kept
us-fl:liheap-size-13-income-limit fl_liheap_income_limit.py:31, 46-53; hhs_smi.py:22-34 (liheap_smi_limit) No size-13 override: 60% of SMI, $94,610, inside the federal ceiling statute, correct
us-fl:liheap-fy2026-payment-range (new) base_amount.yaml:2-20; fl_liheap.py:79-81 Bases of 350 / 300 / 250 / 200 from 2025-10-01, plus 100 / 100 / 150 additions: $200-$700 unknown
us-fl:liheap-income-limit-manual-sections (new) fl_liheap_income_limit.py:36-45; fpg_rate.yaml FY2025: the greater of 60% SMI and 150% FPG (900.01D). FY2026: 60% SMI (plan, matrix, manual p. 9) unknown
us-sd:liheap-2025-published-income-limit sd_liheap_income_limit.py:52-58; table/amount.yaml; table/in_effect.yaml:7-9 The printed table for sizes 1-10 from 2024-10-01 to 2025-10-01 unknown (but see Suggestion 1)
us-sd:liheap-2026-plan-income-limits sd_liheap_income_limit.py:30-51 Table off; the 200% cap gives DSS's $16,075 / $18,825 / $21,575 unknown (but see Suggestion 1)
us-sd:liheap-cash-gifts income/sources/unearned.yaml:33-40; sd_liheap_countable_income.py:35-38 financial_assistance counts (our round-1 S2 on #9974) unknown
us-sd:liheap-gambling-winnings unearned.yaml:28-32 gambling_winnings counts gross, floored at zero, with no loss offset unknown
us-sd:liheap-categorical-eligibility sd_liheap_eligible.py:26-37 snap_unit_size == spm_unit_size and SNAP received, so every member must receive SNAP unknown
us-sd:liheap-kerosene-payment-method sd_liheap.py:26-42 cash_payment = WOOD | COAL. Kerosene takes min_(base_payment, expense), per Pavel's C1 and our round-2 report unknown; the note is corrected from "follows the manual"

PR-body claims:

Citations in the two new entries, read in the source PDFs:

  • FY2026 plan item 2.6 is on page 9: "Minimum Benefit $400 ... Maximum Benefit $1,350".
  • Manual page 9: "Must follow the current benefit payment matrix provided by DEO".
  • Manual 900.01D on page 39: 60% of SMI for 1-8 members and 150% of the poverty guideline for 9 or more.
  • Manual 1100.03D on page 47 and 1200.01A on page 49: 150% of the poverty guideline.
  • Contract D(10)b on page 9 and G(7)d on page 12: "not more than 150% of the current OMB federal poverty level for their household's size".

Ratchet tie-in. Every FL and SD file that #10334 baselined in KNOWN_UNMARKED is now a candidate code path:

  • Florida: base_amount.yaml, fl_liheap_eligible.py, fl_liheap_income_limit.py and fl_liheap.py;
  • South Dakota: table/in_effect.yaml.

Coverage of #9969's and #9974's conflict tables.

  • Covered:
    • FL: heat in rent, the FY2026 payment range, size 13 and the large-household contract;
    • SD: gambling, cash gifts, kerosene, categorical eligibility, and the FY2025 and FY2026 limits.
  • Missing: the FL floor and FL minors' income (Should 1); the SD FY2025 plan-versus-table split for sizes 1-3 (Suggestion 1).
  • Reasonably left out:
    • FL undocumented applicant (900.04A and 900.04D.1). The provisions are consistent once a qualified member applies, so this is an input limit, not a conflict.
    • SD categorical benefit level (manual page 13, SNAP income times 3). ARSD 67:15:01:20 sets benefit levels on "The household's income level", which doesn't contradict it.
    • SD self-employment netting. ARSD 67:15:01:18.01 is silent on it.
    • Ineligible members' income in both states. The calculator is unpublished, so this is not modeled.

Conflicts from our round-2 reviews:

  • SD kerosene supplier rule. The note now matches the merged code, as shown above.
  • SD cash help. Counted, matching the candidate's $12,000 + $2,400 = $14,400 example (income Case 8).
  • FL size 13 at 60% SMI. follows: statute is right.
  • FL 110% floor. Missing (Should 1).

Hand checks (10):

  1. FL payment range. Band 4 is $200. The maximum is 350 + 100 + 100 + 150 = $700. The plan's $400 / $1,350 equals the FY2025 matrix extremes: 400, and 1,000 + 350.
  2. FL size 13. floor(103,063 × 0.6) = 61,837, and floor(61,837 × 1.53) = 94,610. The federal ceiling uses (15,650 + 12 × 5,500) × 1.5 = 122,475. The bands are 47,305, 66,227 and 80,418.5, rounded to 80,419. The printed row is 103,063 × 1.53 = 157,686, and / 12 = 13,141.
  3. FL FY2025, nine people. (15,060 + 8 × 5,380) × 1.5 = 87,150, which is above 60% of SMI. Size 8 uses SMI: 81,175 against 79,080.
  4. FL FY2026. fpg_rate 0 makes max_(smi_limit, 0) = 60% of SMI for every size.
  5. SD FY2025, four people. 4 × 15,858 = 63,432 (archived table); 2 × (15,060 + 3 × 5,380) = 62,400; floor(105,723 × 0.6) = 63,433, which floors to 15,858 a quarter.
  6. SD FY2025, sizes 1-3. One person is 7,530 × 4 = 30,120 = 2 × 15,060. Under 60% of SMI: floor(63,433 × 0.52) = 32,985, which gives 4 × 8,246 = 32,984.
  7. SD FY2026 DSS limits. 2 × 32,150 / 4 = 16,075; 2 × 37,650 / 4 = 18,825; 2 × 43,150 / 4 = 21,575.
  8. SD FY2026 at the plan's 60%. floor(111,183 × 0.6) = 66,709. Size 4: 66,709 / 4 = 16,677. Size 5: floor(66,709 × 1.16) = 77,382, and / 4 = 19,345. Size 6: floor(66,709 × 1.32) = 88,055, and / 4 = 22,013.
  9. SD cash gifts. 12,000 + 2,400 = 14,400.
  10. FL floor example (Should 1).

Housekeeping.

  • Changelog. changelog.d/source-conflict-liheap-candidates.changed.md is top level and typed changed, which suits backlog metadata.
  • Partner tests. No partner test file is touched.
  • Comments. No code comment changes, so the ratchet is unaffected.

Axiom line assessment

No line, and none is required.

  • Not a policy change. The PR changes only backlog metadata and a changelog fragment, and it touches no variable, parameter or test.
  • The template. The axiom: comment says the line is "Required for any change to policy (programs, parameters, eligibility, bug fixes)". CLAUDE.md likewise limits the requirement to "Any PR that adds, updates or fixes policy".
  • Enforcement. No CI check looks for the line.
  • Precedent. Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334, the same kind of housekeeping, merged without one.

Suggestion 4. The siblings #10350 and #10351 use axiom: n/a: source-conflict backlog metadata only; no model change. Adding the same line here would keep the series consistent and make the n/a explicit.

CI status

27 pass, 0 pending, 0 failed. This is run 39608424405 on head fb357f94fb (pull_request, 2026-10-21 13:29 to 17:36 UTC). I re-checked gh pr checks 10349 at the end of this review.

  • The source-conflict tests. Rest (Python, shard-1) ran policyengine_us/tests/code_health/test_source_conflicts.py: 103 passed and 0 failed. That matches the PR body. The candidate tests that passed include:

    • test_candidate_fields (kinds, years, https links, tracked code paths);
    • test_candidates_have_unique_well_formed_ids;
    • test_candidates_are_not_yet_registered;
    • test_candidates_are_public.

    The ratchet and marker tests also passed: test_conflict_sounding_comments_do_not_grow and test_markers_are_well_formed.

  • Known main-caused failure. The run started after 13:24 UTC, so it doesn't apply.

  • Also passed: Household API Partners, Microsimulation, both Rest jobs, all 11 Baseline shards, all 9 Contrib shards, PR validation, Package and compatibility, and Quick Feedback.

  • Locally:

    • No tests and no model were run.
    • I parsed the candidates YAML to count entries and check sort order and the follows convention.
    • I read the cited sources with a generic User-Agent: the FL plan, manual, contract, application and FAQ; the SD archived DSS page; and ARSD 67:15:01:10, :11, :20 and the chapter index.

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.

The refresh is accurate. All 13 code paths exist on main and do what the notes say, the follows values fit the convention, and the candidate tests pass. One should-address item: the merged FL code records two conflicts that have no candidate, the 110% floor vs the 60% SMI limit from size 15, and minors' income (application/FAQ vs manual 1200.01D). Paste-ready YAML for both is in the report. Four suggestions, including SD citation and anchor fixes. Full report in the comment above.

From DTrim99's review and a Sol review of #10349.

- Two more conflicts the merged FL code records had no candidate. The first is
  the federal 110% poverty floor against the 60% SMI limit from household
  size 15 (statute against guidance; PE-US follows the statute). The second is
  minors' income: the current application and portal FAQ against manual part
  1200.01D. Every value is checked against the merged code and its tests: the
  floor case's $98,320 limit and $101,915 floor are fl_liheap.yaml's Case 27.
- The SD income-limit entries credited ARSD 67:15:01:10 with a limit formula
  it doesn't contain; it sets only the three-month income period. FY2025 is
  now the plan's 60% of SMI against the published table's 200% of the 2024
  guideline for sizes 1-3: $32,984 against $30,120 for one person, as
  table/amount.yaml records. FY2026 is DSS's 200% of the 2025 guideline
  against the plan's 60% of SMI. Its $22,013 is the model's flooring, and
  $22,014 is unrounded.
- Anchors and sources:
  - FY2026 plan item 2.1 is on page 8, not 4.
  - Contract G(8)c is on page 12, not 9.
  - The null URLs are filled from the merged code's references.
  - The FL manual-sections entry gets the plans, the matrix and the manual's
    "current matrix" page.
  - Kerosene gets plan item 9.1 and ARSD 67:15:01:43.01.
  - The FL size-13 and SD 2026 entries list the remaining deciding files.

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

Copy link
Copy Markdown
Contributor Author

Thanks for the thorough review. Everything is addressed at 9756a17.

Should 1. I added both entries, us-fl:liheap-income-floor-vs-smi-limit and us-fl:liheap-minor-income, from your YAML. I checked each value against main:

  • the floor and the strict "less than": fl_liheap_eligible.py and gov/hhs/liheap/fpg_floor.yaml;
  • the $98,320 limit and $101,915 floor: the comment on fl_liheap.yaml's Case 27;
  • the minors rule and its backfill note: fl_liheap_countable_income.py:27-31 and adult_age.yaml.

One small change in the floor example: "so they keep the band 4 base of $200". Case 27 also adds the child supplement, so I didn't call $200 the award. The body and changelog now say four new candidates.

Suggestion 1, SD limits.

  • FY2025 is now plan item 2.1 (60% of SMI) against the table's 200% of the 2024 guideline for sizes 1-3: $32,984 against $30,120 for one person. table/amount.yaml records that split.
  • FY2026 is now DSS's 200% of the 2025 guideline against the plan's 60% of SMI for sizes 4-6, with $22,013 under the model's flooring ($22,014 unrounded).
  • Both notes say ARSD 67:15:01:10 sets only the three-month period.

Suggestion 2, anchors. Plan item 2.1 now points to page 8 in both FL entries, and G(8)c to page 12.

Suggestion 3, URLs and code lists.

  • URLs: FL 1100.04B(1) is #page=47; FL size 13 uses the portal FAQ; SD 1.4a is #page=5; SD manual page 27 is #page=27.
  • Kerosene now cites plan item 9.1 (#page=22) and ARSD 67:15:01:43.01, plus the January 2026 DSS capture.
  • Code lists: FL size 13 adds fl_liheap.py, and also truncates_smi_limit.yaml, since the $94,610 depends on its floor order. SD 2026 adds fpg_upper_rate.yaml and table/in_effect.yaml, plus smi_rate.yaml.

Suggestion 4. The body now has the axiom: n/a line.

I also took two points from a separate Sol review:

  • the manual-sections entry now cites the plans, the matrix and the manual's "current matrix" page;
  • its question now says that 900.01D uses 150% of the guideline from size 9.

test_source_conflicts.py gives 103 passed. The file has 227 candidates, still sorted and unique.

@MaxGhenis
MaxGhenis requested a review from DTrim99 October 22, 2026 12:24
@DTrim99

DTrim99 commented Oct 22, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 2): Point the FL and SD LIHEAP conflict candidates at their code on main

PR #10349 (author: MaxGhenis), head 9756a17d0e. Round 1 reviewed fb357f94fb and requested changes (0 critical, 1 should, 4 suggestions). Since then there is one author commit, 9756a17d0e, and no merges. It touches the same two files: source_conflicts/candidates.yaml and the changelog fragment. Line numbers below refer to 9756a17d0e.

Summary

Every round-1 finding is fixed.

  • Should 1 is fixed. The two missing Florida candidates are added:

    • us-fl:liheap-income-floor-vs-smi-limit (lines 1366-1398);
    • us-fl:liheap-minor-income (lines 1470-1502).

    I checked both against the merged code, its tests and the source PDFs. The code paths, citations, page anchors, follows values, years and question wording are all correct.

  • The suggestions are fixed:

    • The SD income-limit entries no longer credit ARSD 67:15:01:10 with a formula. Each now frames the real plan-against-DSS conflict and uses $22,013.
    • The FL anchors now point to plan page 8 and contract page 12.
    • All five null URLs are filled. Kerosene now cites plan item 9.1, and the code lists name the deciding files.
    • The body carries a valid n/a axiom line.
  • The file validates statically, at the head and on the tree merged with main. I applied test_source_conflicts.py's candidate rules: 227 candidates (228 merged), sorted and unique, every code path tracked, every URL https, no private tokens.

No new critical or should findings. There are two small new suggestions: a missing FY2025 matrix source in the manual-sections entry, and a stale row in the PR body's table.

CI and branch. CI has one failure, "Package and compatibility". It is main-caused, not caused by the PR. #10377 pinned uv 0.13.4 and moved uv.lock to lock revision 5. The step that builds the candidate wheel checks out this PR's raw head, whose lock is still revision 3, so the lock refresh refuses to run. Merging main clears it. Nine checks are still pending, including the Python shard that runs test_source_conflicts.py. The branch is 2 ahead and 19 behind, and it merges cleanly with main and with each sibling.

Prior findings

Finding Status Evidence
Should 1. Add candidates for the FL 110% floor and minors' income Fixed Both entries were added as proposed, sorted into place (income-floor-vs-smi-limit after fy2026-payment-range; minor-income after large-household-contract-limit). Details under Verified. The changelog and body now say "four" new candidates. One wording change: the floor example now says the household keeps "the band 4 base of $200". This is more precise, because Case 27's award is $350 once the child addition is included.
Should 1 (optional third candidate): the portal's monthly rounding Not taken; optional Round 1 said it wasn't needed.
G1. The SD entries credited ARSD 67:15:01:10 with a min/max formula; $22,014 vs $22,013 Fixed 2025 (lines 4966-4991). The ARSD source is replaced by FY2025 plan item 2.1 (SD_Plan_2025.pdf#page=8). The question is now about sizes 1-3, the example is $32,984 against $30,120, and the note says 67:15:01:10 sets only the three-month income period. 2026 (lines 4998-5023). The ARSD source is dropped, the readings say DSS's limits are 200% of the 2025 guideline, and the figure is "$22,013 a quarter under the model's flooring ($22,014 unrounded)".
G2. FL anchors Fixed Plan item 2.1 now uses FL_Plan_2026.pdf#page=8 (lines 1454 and 1517), and contract G(8)c uses 3E2.pdf#page=12 (line 1457). I re-read both pages: item 2.1's 60% SMI rows are on file page 8, and G(8)c is on page 12.
G3. Null URLs, plan 9.1 and code lists Fixed URLs. FL 1100.04B(1) is #page=47 (line 1318). FL size 13 uses the portal FAQ (line 1523), which prints "13 $13,141". SD 1.4a is #page=5 (line 5066), where item 1.4a reads "if all individuals on the low income energy assistance application receive supplemental nutrition assistance benefits". SD manual page 27 is #page=27 (line 5091), where the row reads "Lottery or gaming winnings ... count entire amount". Kerosene (lines 5123-5131) adds plan item 9.1 on page 22: "If household uses coal or wood as it's primary heat source ... a payment is issued directly to the household". It also adds ARSD 67:15:01:43.01: "Monthly LIEAP payment will continue to be made to the energy supplier or landlord until ... The household has reached its maximum LIEAP benefit level". The kerosene DSS source gets the January 1, 2026 capture. Code lists. FL size 13 adds fl_liheap.py and truncates_smi_limit.yaml; SD 2026 adds fpg_upper_rate.yaml, smi_rate.yaml and table/in_effect.yaml. Each one decides its entry (see Verified).
G4. Axiom line Fixed The body ends with axiom: n/a: source-conflict backlog metadata only; no model change, the same line as #10350 and #10351.

New findings

Critical (must fix)

None.

Should address

None.

Suggestions

1. Add the FY2025 payment matrix as a source of us-fl:liheap-income-limit-manual-sections.

  • Where: lines 1405-1433.
  • What is missing. The question and readings now rest on "the FY2025 plan and matrix": 60% of SMI, and 150% of the guideline from size 9. The sources list the FY2025 plan (item 2.1, p.8) and the October 2025 matrix, but not the FY2025 matrix.
  • What the FY2025 matrix says. FL_BenefitMatrix_2025.pdf labels sizes 1-8 "State Median Income (SMI)" and size 9 "Federal Poverty Guidelines (FPG)", with a top value of $87,150 = 1.5 × (15,060 + 8 × 5,380). Its footnote says "Maximum Income Values are the greater of 60% SMI".
  • The merged code already cites it, in truncates_smi_limit.yaml and fl_liheap_income_limit.py.
  • Fix: add the matrix as a kind: form source, e.g. citation "FY2025 LIHEAP payment matrix, maximum income values".

2. Bring the PR body's table up to date.

  • SD 2026 row. The "Refreshed candidates" table still says "DSS's 2025-2026 limits, which match the rule". The same body later explains that the "rule" is the model's inferred pattern, and the entry no longer cites one. The row also lists only sd_liheap_income_limit.py; the entry now lists four files.
  • FL size-13 row. It lists two files; the entry now lists four.
  • Fix. Reword the SD 2026 row to "DSS's 2025-2026 limits, 200% of the 2025 guideline", and list the current files in both rows. Only the body changes; the YAML is right.

Verified

The new floor candidate (us-fl:liheap-income-floor-vs-smi-limit) matches the code and the sources.

  • Code. fl_liheap_eligible.py on main computes floor = np.round(guideline * p_hhs.fpg_floor, 2) and income_eligible = (income <= limit) | (income < floor). That is the note's "rounded to cents with the statute's strict 'less than'". gov/hhs/liheap/fpg_floor.yaml is 1.1 from 1985-10-01 and cites 42 U.S.C. 8624(b)(2)(B).
  • Sources:
    • Plan page 45: "a State may not exclude a household ... if such income is less than 110 percent of the poverty level".
    • Contract page 13, G(8)e: "No household may be excluded solely on the basis of income if the household income is less than 110% of the poverty level."
    • Matrix footnote: "Maximum Income Values are 60% of SMI".
    • Plan item 2.1 (page 8): 60.00% SMI on every row.
  • Years 2026-2027. In FY2025 the limit is the greater of 60% of SMI and 150% of the guideline, so the floor never binds. FY2027 is covered by the code's carry-forward (fl_liheap.yaml Case 28).
  • follows: statute matches the GA and OH candidates for the same question.

The new minors candidate (us-fl:liheap-minor-income):

  • Code. fl_liheap_countable_income.py counts income only where age >= p.adult_age. adult_age.yaml is 18 from 2024-10-01, and its comment calls FY2025 "a backfilled assumption". That supports the entry's years (2025-2026) and its backfill note.
  • Sources (re-read):
    • Application page 1: "except minors".
    • Portal FAQ: "Income of minors" is listed as not counted.
    • Manual 1200.01D, page 49: counts 16- and 17-year-olds not in school full time.
  • follows: unknown fits the file's convention: all 47 entries whose readings begin "No statute" use unknown.

The reframed SD entries match the plans:

  • SD FY2025 plan item 2.1, page 8 lists 60.00% SMI for sizes 1-9 and "HHS Poverty Guidelines 150.00%" for size 10. That is what the 2025 readings say, and what table/amount.yaml:2-4 records.
  • SD FY2026 plan item 2.1, page 9 lists 54.14%, 55.95% and 57.07% for sizes 1-3, 60.00% for sizes 4-9, and 150% of the guideline for size 10. So sizes 4-6 are the only sizes where the plan and DSS's 200% of the guideline diverge, which is what the 2026 question says. fpg_upper_rate.yaml:4-9 records the same split.
  • The 2025 note's "sizes 4-7" matches table/in_effect.yaml ("The published 2024-2025 limits for sizes 4-7 depart from that rule").

The manual-sections entry (the Sol review's changes):

  • FL FY2025 plan item 2.1, page 8 lists 60.00% SMI for sizes 1-8 and "HHS Poverty Guidelines 150.00%" for size 9. That matches the new question's parenthetical.
  • Manual page 9 ("follow the current benefit payment matrix") was confirmed in round 1.
  • The new question is accurate and still sorted.

The code lists:

  • FL size 13. truncates_smi_limit.yaml switches to HHS truncation from 2025-10-01, and that switch is what produces $94,610 (hand check 9). fl_liheap.py reads fl_liheap_income_limit for the payment bands.
  • SD 2026. fpg_upper_rate.yaml (2) is the binding cap for sizes 4-6. smi_rate.yaml (0.6) is the plan's rate. table/in_effect.yaml turns the table off at 2025-10-01.

Hand checks of every new or changed expectation:

  1. FL floor-case limit, size 15. floor(103,063 × 0.6) = 61,837, and floor(61,837 × 1.59) = floor(98,320.83) = 98,320. That matches Case 27's fl_liheap_income_limit: 98_320.
  2. FL floor, size 15. 1.1 × (15,650 + 14 × 5,500) = 1.1 × 92,650 = 101,915.
  3. FL floor example. $100,000 is above $98,320 and below $101,915, so the household is eligible in band 4 with the $200 base. Case 27 expects fl_liheap: 350, which is the $200 base plus the $150 child addition. The new wording "keep the band 4 base of $200" is consistent with that.
  4. FL "from household size 15". At size 14, floor(61,837 × 1.56) = 96,465, above the floor of 1.1 × 87,150 = 95,865. So size 15 is the first size where the floor binds.
  5. FL 2027 carry-forward.
    • Size 15: the limit is 103,148, below the floor of 1.1 × 95,480 = 105,028 (Case 28's comment).
    • Size 14: the limit is floor(64,873 × 1.56) = 101,201, above the floor of 1.1 × 89,800 = 98,780.
    • So the 2027 years are right.
  6. SD 2025, one person.
    • Under the plan: floor(105,723 × 0.6) = 63,433, and floor(63,433 × 0.52) = 32,985. On the table's quarterly basis that is 4 × floor(32,985 / 4) = 4 × 8,246 = $32,984.
    • In the table: 4 × 7,530 = $30,120, which is 2 × 15,060.
  7. SD 2026 DSS limits. 2 × 32,150 / 4 = 16,075; 2 × 37,650 / 4 = 18,825; 2 × 43,150 / 4 = 21,575.
  8. SD 2026 under the plan.
    • Model flooring: floor(111,183 × 0.6) = 66,709, which gives 66,709 / 4 = 16,677; floor(66,709 × 1.16) / 4 = 77,382 / 4 = 19,345; and floor(66,709 × 1.32) / 4 = 88,055 / 4 = 22,013.
    • Unrounded: 111,183 × 0.6 × 1.32 / 4 = 22,014.23, so the "$22,014 unrounded" is right.
    • SD 2026 sizes 1-3. 31,300 / (111,183 × 0.52) = 54.14%, which confirms the plan's sizes 1-3 equal 200% of the guideline.
  9. FL size 13, $94,610. floor(61,837 × 1.53) = floor(94,610.61) = 94,610. Without truncation, 103,063 × 0.6 × 1.53 = 94,611.83, which rounds to 94,612. So truncates_smi_limit.yaml belongs in the code list.
  10. FL FY2025, size 9. 1.5 × (15,060 + 8 × 5,380) = 87,150. That is the FY2025 matrix's size-9 top value, and it supports the manual-sections parenthetical.

Static run of test_source_conflicts.py's candidate rules, at the head and on the merged tree:

  • Tests covered:
    • test_candidates_have_unique_well_formed_ids;
    • test_candidates_are_not_yet_registered, against known-source-conflicts.yaml;
    • test_candidate_fields;
    • test_candidates_are_public.
  • What they check: required keys; state, follows, source kind and years; at least two sources; https or null URLs; tracked code paths; and PR URLs. The privacy patterns are applied line by line.
  • Result: no problems. There are 227 candidates (228 merged, with Add New Hampshire state supplementation for 2026 #10156's NH entry), sorted, and no FL or SD LIHEAP source has a null URL.
  • The comment ratchet (test_conflict_sounding_comments_do_not_grow) is unaffected. It scans only variables/, parameters/ and reforms/, and this PR touches neither code nor comments.

Housekeeping:

  • The changelog fragment is still top level and typed changed, and now says "add four Florida candidates".
  • No partner test file is touched.

Axiom line assessment

Valid. The body has axiom: n/a: source-conflict backlog metadata only; no model change. The PR changes only backlog metadata and a changelog fragment, with no variable, parameter or test, so a housekeeping n/a is the right form. No rulespec-us issue is needed.

CI status

At the end of this review: 1 failed, 7 passed, 9 pending. This is run 39778083946 on 9756a17d0e, a pull_request run created 2026-10-22 12:24 UTC.

Failed: Package and compatibility (main-caused, not caused by the PR).

  • Where it fails. "Build and retain rc1 wheel" and "Build and retain final wheel" fail at release_lock.py --refresh with Versioning changed the reviewed dependency graph; prepare and review a registry lock first (exit 2).
  • Why.
  • Not the PR. The PR touches neither uv.lock, pyproject.toml nor .github/. The same job passed at fb357f94fb in round 1, and on the siblings' runs from 2026-10-21, before Stop trusting the compromised eMudhra CA certificates #10377.
  • Fix. Merge main into the branch and re-run.
  • The rest of the job passed: bundle metadata and the Python 3.11-3.14 import and data smoke steps.

Passed:

  • PR validation (lock, guard tests, lint, changelog);
  • Quick Feedback;
  • Household API Partners;
  • Baseline household, irs, states-shard-1 and states-shard-4.

Pending:

  • Python Rest (shard-1 + variables), which runs test_source_conflicts.py;
  • Microsimulation;
  • Baseline contrib-hhs, rest-a, rest-b, reform, ssa-usda and states-shards 2 and 3.

I couldn't confirm the source-conflict tests in CI at this head. The static run above passes, and the author reports 103 passed locally.

Known main-caused ratchet failure: it doesn't apply. This run started after 2026-10-21 13:24 UTC.

Locally: no tests or models were run. I parsed the candidates YAML only. I read the cited sources with a generic User-Agent:

  • the FL FY2025 and FY2026 plans, the FY2025 and FY2026 matrices, the manual and the contract;
  • the SD FY2025 and FY2026 plans and the 2018 manual;
  • ARSD 67:15:01:43.01.

Branch status

Verdict: APPROVE

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2: Should 1 is fixed. Both FL candidates (the 110% floor from size 15, and minors' income) are added and verified, and all four suggestions are fixed. The candidate rules pass statically at the head and on the merged tree. The red 'Package and compatibility' check is main-caused (#10377's uv pin vs this head's uv.lock), so merge main. Nine checks were still pending when I looked; let them finish green before merging. Two small suggestions. Full report in the comment above.

MaxGhenis and others added 2 commits October 22, 2026 11:31
…band files

Review nits from the round-2 review of #10349:
- us-fl:liheap-income-limit-manual-sections now cites the FY2025 payment
  matrix the code follows.
- us-fl:liheap-income-floor-vs-smi-limit lists fpg_year_lag.yaml and
  fl_liheap.py, which its numbers rest on, and says the band 4 base is
  the model's estimate.

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

Copy link
Copy Markdown
Contributor Author

Thanks for the round-2 approval. Since 9756a17, the independent round-2 review (APPROVE_WITH_NITS) and your two suggestions are addressed:

  • 13f1f45
    • us-fl:liheap-income-limit-manual-sections now cites the FY2025 payment matrix, the one the code follows (fl_liheap_income_limit.py, fpg_rate.yaml).
    • us-fl:liheap-income-floor-vs-smi-limit lists fpg_year_lag.yaml and fl_liheap.py, which its numbers rest on. Its example now says the band 4 base is the model's estimate.
  • ee492a2 merges main, which brings Stop trusting the compromised eMudhra CA certificates #10377's workflow and uv.lock changes, for the "Package and compatibility" failure you traced.
  • The body:
    • the SD 2026 and FL size-13 rows now list all four files each;
    • the "Not in this PR" count is recounted with its time: 99 candidates and 69 merged PRs at 15:33Z.

The guard test gives 103 passed on the merged head. There are 229 candidates, sorted and unique.

@MaxGhenis
MaxGhenis merged commit 8231b18 into main Oct 22, 2026
27 checks passed
@MaxGhenis
MaxGhenis deleted the source-conflict-liheap-candidates branch October 22, 2026 22:55
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

Merged at ee492a2 (squash 8231b18), with all 27 checks passing on that head.

Reviews:

The change is source-conflict backlog metadata only, with no model change.

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.

2 participants