Skip to content

Give North Carolina reduced-price school meal students the free tier - #9756

Merged
hua7450 merged 16 commits into
PolicyEngine:mainfrom
hua7450:nc-reduced-price-school-meals
Oct 6, 2026
Merged

hua7450 merged 16 commits into
PolicyEngine:mainfrom
hua7450:nc-reduced-price-school-meals

Conversation

@hua7450

@hua7450 hua7450 commented Oct 2, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #9755

What and why

North Carolina pays the reduced-price school meal copays, but the model assigned qualifying households the REDUCED tier. This PR assigns them FREE, updates published federal reimbursement rates through school year 2026–27, and aligns partner scenarios with the model's combined breakfast-and-lunch approach.

  • Add a dated, by-state state_covers_reduced_price_copay parameter and apply it when income is at or below the reduced-price limit of 185% of the poverty guideline. Add North Carolina to the program registry. Above-limit households remain PAID unless another free-meal eligibility route applies.
  • Date all school year 2025–26 rates to July 1, 2025, and correct the contiguous-US paid lunch rate to $0.44, matching the under-60% category used for free and reduced-price lunches.
  • Add school year 2026–27 rates for the contiguous states, Alaska, and Hawaii. Use the existing uprating mechanism to project future changes on July 1 from May-to-May CPI-U changes, rounding each meal and tier down to whole cents. CPI-U is a projection proxy for USDA's Food Away From Home index. Compounding rounded rates and uprating tiers independently remain forecast limitations; no separate school-meal uprating mechanism is introduced.
  • Correct Colorado, Michigan, and New Mexico statutory references for existing universal-meal coverage.
  • Strengthen partner edge cases with derived K–12 attendance assertions, eligibility routes, and annual benefit assertions. Use Missouri for the federal reduced-tier scenarios because Texas covers reduced-price breakfast and, from September 2025, lunch, which the model does not yet represent. The Missouri fixtures assume participating schools without CEP or another schoolwide subsidy; dated district sources establish program context, not exact historical meal charges.
  • Add three North Carolina copay cases and update the school-meal values in 29 signature cases without changing their other program expectations. Preserve My Friend Ben's existing output contract and cover the adult-only zero-benefit case in the baseline policy tests. Team and API-partner notification have been confirmed by the author.

Sources and effective dates

North Carolina's combined copay parameter covers school year 2020–21 and school years beginning July 2022 onward. It is false for 2021–22 because the state provision covered breakfast only; this parameter requires both meals.

Model results and scope

The annual variables read January 1 rates. Calendar 2026 therefore uses school year 2025–26, and calendar 2027 uses school year 2026–27. The combined daily reimbursements are:

Calendar year Region Free Reduced Paid
2026 Contiguous US $7.06 $6.36 $0.84
2026 Alaska $11.40 $10.70 $1.33
2026 Hawaii $9.16 $8.46 $1.08
2027 Contiguous US $7.30 $6.60 $0.87
2027 Alaska $11.81 $11.11 $1.38
2027 Hawaii $9.48 $8.78 $1.11

For two North Carolina parents and one enrolled eight-year-old with $50,542 of countable income in 2026, the copay provision changes the modeled annual benefit from 180 × ($6.36 − $0.84) = $993.60 to 180 × ($7.06 − $0.84) = $1,119.60, a $126 increase. This values one breakfast and one lunch per school day, net of paid-tier reimbursement; it does not estimate North Carolina's spending.

Breakfast and lunch retain one household tier and one annual calculation. North Carolina is the only state enabled in the new copay parameter; this does not imply that other states lack coverage. Broader state coverage, separate meal eligibility, school participation, and historical federal waivers remain follow-up work in #9789.

Validation

  • make format: Ruff formatting and lint checks passed.
  • Full local school-meal policy and partner folders: 702 passed (79 school-meal policy tests and 623 partner tests).
  • YAML coverage includes published annual rates, standard CPI-U projections for all regions and tiers in calendar 2028, age-derived school attendance, and an adult-only zero-benefit case.
  • Whitespace and fixture-diff checks passed; the attendance changes preserve all existing monetary expectations.

axiom: TheAxiomFoundation/rulespec-us#1524 queued
The signed encoder is blocked because rulespec-us has no federal school-meal tier module to compose with; the issue records that blocker with #9789, carries the pe-parity label, and holds the module paths, corpus citations, verbatim provisions, required outputs and companion tests derived from the session laws and USDA notices.

North Carolina pays the reduced-price copay (S.L. 2023-134 § 7.58), so
students who qualify for reduced-price meals eat at no cost. Add a
by-state parameter for reduced-price copay coverage and apply it in
school_meal_tier.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@codecov

codecov Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (29ffc88).
⚠️ Report is 134 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main     #9756   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         1    -3     
  Lines           76        23   -53     
  Branches         2         0    -2     
=========================================
- Hits            76        23   -53     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

hua7450 and others added 6 commits October 2, 2026 22:06
Cast the fancy-indexed bool parameter before combining it with the
income test, cite G.S. 115C-264(a1) (S.L. 2025-89 § 2A.8) from
2025-07-01, carry the breakfast authority on the 2022-07-01 entry, use
the first effective date in the registry, and test the 185% boundary.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ate SY 2025-26 rates to July

Set employment_income_before_lsr in the new school meal test cases so
state TANF sees the earnings. Use the under-60% contiguous paid lunch
rate (0.44) for SY 2025-26, matching the free and reduced rates, and
key all SY 2025-26 reimbursement rates to 2025-07-01, when the USDA
notice puts them in effect. Calendar 2025 now reads the SY 2024-25
rates.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 requested a review from DTrim99 October 5, 2026 17:18
@DTrim99

DTrim99 commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator

Program Review

PR #9756: Give North Carolina reduced-price school meal students the free tier (hua7450). Fixes #9755; follow-up #9789.
Head 1950a45e34. Scope: 22 files: 4 parameter files, 1 variable, 4 baseline test files, 11 partner contract test files, programs.yaml and the changelog fragment.

What the PR does

  • Adds state_covers_reduced_price_copay, which has 59 state keys; only NC is ever true. school_meal_tier now returns FREE for reduced-price-eligible students in states that cover the copay.
  • Moves the start of the SY2025-26 NSLP/SBP rates from 2025-01-01 to 2025-07-01. Corrects the contiguous-US paid lunch rate from 0.46 to 0.44. Adds the SY2026-27 rates from 2026-07-01.
  • Replaces monthly CPI-U uprating with a May-to-May CPI-U step that takes effect on July 1 and rounds down to the cent. This is the first use of at_defined_interval in policyengine-us.
  • Corrects the MI (s.30d / MCL 388.1630d) and NM (22-13C-4(A)) universal-meal references.

Result

  • All 54 federal rate cells and all 6 NC flag entries match their sources.
  • The formula has no hard-coded values.
  • The open items are:
    • a wrong statutory citation in an edited partner file;
    • partner-contract hygiene (a neutralized override case, input changes with no stated reason, and team and partner notification that cannot be verified on the PR);
    • an invalid axiom line;
    • reference-title formatting.

Path shorthand used below:

  • params/ = policyengine_us/parameters/gov/usda/school_meals/
  • partners/ = policyengine_us/tests/policy/baseline/partners/
  • edge/ = partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/

Source Documents

# Document Pages used Used for
1 FR 2024-15175, 89 FR 56720 (SY2024-25 rates) p. 4 (image table, re-rendered at 600 dpi) Calendar-2025 values
2 FR 2025-13879, 90 FR 34827 (SY2025-26 rates) p. 3 NSLP and FAFH +3.85%; p. 4 SBP Calendar-2026 values; 0.44 paid lunch
3 FR 2026-14252, 91 FR 43597 (SY2026-27 rates) p. 2: FAFH +3.54%, rounding down, 40-cent reduced-price gap; p. 3 (image table, 600 dpi) Calendar-2027 values; projection method
4 7 CFR 245.2 HTML Reduced-price maximum: $0.40 lunch, $0.30 breakfast
5 N.C. S.L. 2011-342 s.1 HTML Breakfast copay coverage, subject to appropriations
6 N.C. S.L. 2020-80 p. 14, s.2.3(b)-(c) SY2020-21 lunch copay
7 N.C. S.L. 2021-180 Full-text search No SY2021-22 copay provision
8 N.C. S.L. 2022-74 p. 28, s.7.3 SY2022-23 lunch copay
9 N.C. S.L. 2023-134 p. 119, s.7.58; p. 625, s.43.5 and s.43.8 Breakfast and lunch, 2023-25 biennium
10 N.C. S.L. 2025-89 p. 5, s.2A.6(b)(1) and s.2A.8(a); p. 6, s.2A.8(b); p. 32, s.7.1 Adds G.S. 115C-264(a1); repeals s.7.58; retroactive to Jul 1 2025
11 N.C. Gen. Stat. 115C-264 HTML, subsection (a1) Standing requirement from Jul 2025
12 NC DPI, "School Meal Eligibility 2025-26 FAQs" (Jun 30 2025) and DPI press release (Jul 2 2025) FAQ p. 2; press release HTML Secondary corroboration
13 NM SB 4 (2023) p. 4, s.3 22-13C-4(A) reference correction
14 MI PA 103 of 2023; MCL 388.1630d HTML s.30d reference correction
15 C.R.S. 2024 Title 22 p. 1328 (Part 1); p. 1332 (Part 2) CO partner citation
16 47 CFR 54.1800 HTML, (j)(3) ACP treatment of free and reduced-price approval
17 Rockwood SD meal prices; Mount Vernon R-V meal prices HTML (spot-checked) MO partner fixture comments
18 FRAC, "School Meals Legislation and Funding by State" (July 2023) PDF Other states' reduced-price coverage

Branch Status

Item Status
Head 1950a45e34b6d566f0b2ea5248f006ee820bc1dc (confirmed with gh pr view --json headRefOid)
Base / merge-base main / b44d435ce4
Ahead / behind 9 ahead, 11 behind. The review snapshot showed 9 behind; main has gained 2 commits since.
Overlap with main since merge-base Only policyengine_us/programs.yaml, in a different block; GitHub reports MERGEABLE
CI 36/36 checks pass (gh pr checks 9756)
Reviews None. One codecov comment. Review decision: REVIEW_REQUIRED

Critical (Must Fix)

C1. The CO partner header cites Part 1 of C.R.S. 22-82.9 instead of Part 2 (Healthy School Meals for All).

  • Where: edge/co.yaml:1, which reads "Colorado Healthy School Meals for All (C.R.S. sec. 22-82.9-101 et seq.)". The PR rewrote this line, keeping the Part 1 cite. It also added an unanchored link to the 1,414-page PDF on line 2.
  • Source:
    • 22-82.9-101 is the short-title section of Part 1, the "Child Nutrition School Lunch Protection" program (C.R.S. 2024 Title 22, p. 1328).
    • Healthy School Meals for All is Part 2, which begins at 22-82.9-201 (p. 1332).
  • Fix:
    • Cite "C.R.S. sec. 22-82.9-201 et seq." and add #page=1332 to the URL on line 2.
    • policyengine_us/programs.yaml:92 has the same Part 1 cite. The PR did not edit that line, but it did correct the MI and NM cites in the same state_implementations block (lines 107 and 122). Fixing CO there as well keeps the block consistent.
  • Note: co.yaml is a partner contract file, so even a comment-only edit falls under the CLAUDE.md partner-test rules. The fix changes no inputs or outputs.

Should Address

S1. The federal.yaml direct-input case no longer tests that a supplied school_meal_countable_income overrides derived income.

  • Where: edge/federal.yaml:413-478, case school_meals_countable_income_direct_input_reduced.
  • What changed:
    • Wages on line 425 went from 60,000 to 50,500. They now equal the supplied school_meal_countable_income: 50_500 on line 453.
    • The comment on line 452 changed from "Partners send this aggregate directly; it must override the income derived from employment (60,000 would otherwise be PAID)" to "Partner-supplied aggregate matches the household's gross wages."
  • Effect:
    • The case now passes whether or not the supplied aggregate wins, yet its name still says direct_input.
    • Partners do send this aggregate; My Friend Ben, for example, sets school_meal_countable_income: 0 (partners/my_friend_ben/2025.yaml:45).
  • Not model-driven: with the original 60,000 wages, the head model still returns REDUCED, 6.36 daily and 993.60 net, because 50,500 / 27,320 = 184.8% FPG and MO does not cover the copay.
  • Why SHOULD, not CRITICAL: baseline policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_fpg_ratio.yaml still tests the override mechanism. What is lost is partner-level coverage.
  • Fix: restore the wages to 60,000 and keep the new expected values.

S2. The PR rewrites partner contract inputs beyond what the model change requires, and the required notification is not visible.

  • Where:
    • edge/federal.yaml: five cases move from TX/Dallas 75201 to MO. Lines 318-320, 382-384 and 446-448 go to St. Louis Co. 63011; lines 639-641 and 703-705 go to Lawrence Co. 65712.
    • edge/federal.yaml: two cases move from Jackson Co. 64106 to St. Louis Co. 63011 (lines 123-125 and 191-193).
    • edge/ca.yaml:18, edge/co.yaml:18 and edge/ma.yaml:18: wages go from 50,700 to 60,000.
  • Expected outputs are unchanged by these moves:
    • School-meal variables do not read county.
    • TX (BBCE at 165% FPG) and MO (no BBCE) both give SNAP = 0 at 184-186% FPG.
    • CA, CO and MA are FREE through state_universal at either income.
  • What the moves change is what the fixtures represent:
    • The CA/CO/MA cases no longer pair with the federal PAID-tier case at 50,700 (185.6% FPG). The deleted header said "Same household is PAID (0.87) under federal-only rules."
    • The TX and Jackson County scenarios disappear from the boundary cases.
    • The PR body's reason ("Use Missouri districts with documented reduced-price charges") concerns district menu pricing, which the model does not represent.
  • Rule:
    • CLAUDE.md, Code Integrity treats tests/policy/baseline/partners/** as API partner contract tests.
    • Before these files are edited, a team member and the API partner must be told.
    • The PR body says "The user confirmed both team and API-partner notification." The PR has no reviews and only a codecov comment, so that notification cannot be verified on GitHub.
  • Fix: do one of the following, and record the team and partner notification where reviewers can see it:
    • revert the input moves that the model change does not require;
    • move them to a separate fixture-only PR with explicit partner sign-off;
    • explain in the PR body why each move is needed.

S3. The axiom line is not in a valid form.

  • Where: the PR body says axiom: needed.
  • Rule:
    • CLAUDE.md requires axiom: <legal id> encoded-correct | <rulespec PR> encoded | <rulespec issue> queued | n/a: <reason> (CONTRIBUTING.md#axiom-parity).
    • The PR changes policy (a new NC rule, the SY2026-27 federal rates and the paid-lunch correction), so n/a does not apply.
  • rulespec-us today: us-nc/statutes/ has no 115C module, and a code search found no NSLP/SBP national-average-payment module.
  • Fix: open an encoded rulespec-us PR, or a dispatch-ready queued issue labelled pe-parity, covering:
    • (i) G.S. 115C-264(a1);
    • (ii) the NSLP/SBP SY2026-27 payments (91 FR 43599, p. 3) plus the SY2025-26 paid-lunch correction.
  • What the issue needs: the module path, corpus citation, verbatim law, required outputs, and companion tests built from the FR tables.

S4. Reference titles include page numbers.

  • Where:
    • params/state_covers_reduced_price_copay.yaml:85: "... § 2.3.(b), page 14 (...)"
    • :95: "page 28"
    • :103: "page 119"
    • :113: "pages 5-6"
    • params/state_universal_free_meals.yaml:144: "page 4". This PR introduced it when it rewrote the NM reference.
  • Rule: page numbers go in href as #page=XX, not in title.
  • Hrefs: each one already has the correct anchor, checked against the PDFs: S.L. 2020-80 p. 14, S.L. 2022-74 p. 28, S.L. 2023-134 p. 119, S.L. 2025-89 p. 5 and NM SB 4 p. 4.
  • Fix: delete the page text from the five titles.
  • Not affected: comments in test files (for example edge/nc.yaml:7) are not reference titles.

S5. The S.L. 2025-89 reference on line 113 cites pages 5-6 but links only page 5.

  • Where: params/state_covers_reduced_price_copay.yaml:113-114.
  • Source: the title cites both parts of s.2A.8, which sit on different pages:
    • s.2A.8(a), which adds G.S. 115C-264(a1), is on p. 5;
    • s.2A.8(b), which repeals S.L. 2023-134 s.7.58, is on p. 6.
  • Why SHOULD: the text that supports the true value, subsection (a1), is on the linked page. This is therefore a reference-accuracy issue, not a missing reference.
  • Fix: split the citation into two references: s.2A.8(a) with #page=5 and s.2A.8(b) with #page=6.
  • Related: the retroactive effective date (s.7.1, p. 32) can be linked in the same pass (Suggestion 5).

Suggestions

1. school_meal_tier: document what FREE now means, and add a reference.

  • Where: policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py:10-17, 30-42; free_school_meals.py:10.
  • What FREE now means:
    • NC students remain federally certified as reduced-price, and the SFA is still reimbursed at the REDUCED rate. In the model, FREE now means "no family charge".
    • The dollar mapping is exact: FREE = REDUCED + $0.40 (lunch) + $0.30 (breakfast) (7 CFR 245.2; 91 FR 43598, p. 2).
    • The repo already uses this meaning for universal-meal states (policyengine_us/parameters/gov/states/ca/cpuc/care/eligibility/categorical.yaml:14).
  • Downstream effects:
    • The FCC ACP and EBB lists include both free_school_meals and reduced_price_school_meals, so eligibility does not change. This is consistent with 47 CFR 54.1800(j)(3).
    • Pell tests school_meal_net_subsidy > 0, so it does not change.
    • household_benefits, spm_unit_benefits, the CBO transfers list and the Tlaib/TX rebate reforms rise by the state-paid $0.70 per day for each enrolled child.
    • No other variable reads school_meal_tier.
  • Option:
    • Say in the school_meal_tier and free_school_meals documentation that FREE includes state-paid copays.
    • Add reference entries (7 CFR 245.2 and G.S. 115C-264).
    • Optionally route the flag through an SPMUnit variable that users can override, mirroring state_has_universal_free_school_meals.
  • Microsimulation note:
    • Compared with FNS counts, NC free counts will run high and reduced counts low.
    • The model assumes full participation (180 days, both meals), so its valuation exceeds actual state spending. S.L. 2025-89 s.2A.6(b)(1) cut $3,000,000 from copay funds "to match actual expenditures" (p. 5).
    • The edge/nc.yaml header already notes this.

2. Since July 2025 the NC mandate binds local boards of education; the model applies it statewide.

  • Where: params/state_covers_reduced_price_copay.yaml:1, 105-114.
  • Source:
    • G.S. 115C-264(a1) says "Local boards of education operating school nutrition programs shall provide school meals at no cost ..." (G.S. 115C-264; S.L. 2025-89 p. 5).
    • The earlier laws covered "all schools participating in the National School Lunch Program" (S.L. 2020-80 p. 14; S.L. 2022-74 p. 28).
    • The NC DPI press release of Jul 2 2025 describes no-cost meals for reduced-price students without that limit.
  • Bias: upward, for reduced-price-band students at charter or nonpublic NSLP sponsors, from calendar 2026.
  • Option: note the scope in the description or in a YAML comment.

3. Note that the 2011 breakfast coverage depends on appropriations.

  • Where: params/state_covers_reduced_price_copay.yaml:78-80.
  • Source: S.L. 2011-342 s.1 says "If appropriated funds are insufficient ... local child nutrition programs shall charge the students qualifying for reduced-price meals" (S.L. 2011-342).
  • The DPI FAQ: it promises only "all or a portion of reduced priced breakfast meals at no cost" (DPI FAQ, Jun 30 2025, p. 2). It mentions breakfast only and predates S.L. 2025-89, so it looks like outdated boilerplate.
  • Support for both-meal coverage: strong from 2023-07-01, reasonable for 2022-23.
  • Option: mention the funding condition in the comment.

4. The other 58 jurisdictions are set to false without research.

  • Where: params/state_covers_reduced_price_copay.yaml:13-75, 115-166.
  • Evidence: FRAC's "School Meals Legislation and Funding by State" (July 2023) lists state-funded removal of reduced-price charges in:
    • MD: phase-in from SY2019-20;
    • NJ: breakfast and lunch;
    • OH: from SY2023-24;
    • OR;
    • VA: SY2022-23 and SY2023-24;
    • DC: lunch;
    • NY: a $0.25 fee;
    • partial coverage in WA, and in CO before Healthy School Meals for All (C.R.S. 22-82.9 Part 1, p. 1328).
  • Bias: downward (REDUCED instead of FREE, about $126 per child per year) in those states and years. This is not a regression, because false matches the pre-PR behavior.
  • Option: say in the description that only NC is verified, and open a follow-up issue.

5. Tighten the copay parameter's references.

  • Where: params/state_covers_reduced_price_copay.yaml:9-11 and the NC entries.
  • Parameter-level reference: 7 CFR 245.2 defines a reduced-price meal but supports no value. NC's support comes from the per-value references.
  • Add the effective-date pages:
    • S.L. 2025-89 p. 32: s.7.1, retroactive to Jul 1 2025. The line 105 comment cites it but does not link it.
    • S.L. 2023-134 p. 625: s.43.5 and s.43.8.

6. The CPI-U projection proxy probably understates future rates.

  • Where: params/amount/nslp.yaml:157-169, params/amount/sbp.yaml:157-169.
  • USDA's method: USDA adjusts rates by CPI-U Food Away From Home (FAFH), May to May, rounded down to the cent. The increases were +3.85% for SY2025-26 (90 FR 34829, p. 3) and +3.54% for SY2026-27 (91 FR 43598, p. 2).
  • The model: its timing and rounding match USDA's. Its first projected step (SY2027-28) is 340.3 / 333.979 = +1.89%.
  • Series caveat: after June 2026, cpi_u.yaml switches to CBO annual values dated Feb 1. Later ratios are therefore not true May-to-May comparisons.
  • Gap drift: rounding each rate separately moves the FREE-REDUCED gap away from the statutory $0.40. In calendar 2028 the contiguous NSLP gap becomes 4.85 - 4.44 = 0.41, and AK and HI drift the same way.
  • Bias: downward on projected subsidies from SY2027-28, if FAFH keeps outpacing CPI-U. No specific value is prescribed.

7. Add a test for the new projection mechanism.

  • Where: params/amount/nslp.yaml:157-168, params/amount/sbp.yaml:157-168.
  • What is covered: the calendar-2027 cases (school_meal_daily_subsidy.yaml:38-45, school_meal_paid_daily_subsidy.yaml:27-33) pin the published SY2026-27 values.
  • What is not covered: no test checks a projected value, so three behaviors are unverified:
  • Option: add a pytest that reads nslp.CONTIGUOUS_US.FREE at 2027-06-01 and at 2027-07-01. It would assert 4.76 for the first, and 4.76 × the CPI-U ratio rounded down to the cent for the second, with the expected value computed from the parameter tree.

8. federal.yaml cites a SY2026-27 price page for calendar-2026 cases.

  • Where: edge/federal.yaml:19, 21.
  • Issue: Rockwood's page now shows SY2026-27 prices, while the MO cases run in calendar 2026 (SY2025-26).
  • Mitigation: the comment acknowledges the mismatch. Both years show $0.30 / $0.40, the 7 CFR 245.2 maximums.
  • Option: cite an archived SY2025-26 page or 7 CFR 245.2. This is a partner file.

9. Keep the My Friend Ben additions to variables the partner requests.

  • Where: partners/my_friend_ben/2025.yaml:69, 91-93.
  • Issue: the PR adds assertions for is_in_k12_school, school_meal_net_subsidy, free_school_meals and reduced_price_school_meals. Only the 7.06 to 6.80 change on line 89 is model-driven: calendar 2025 now reads SY2024-25, 4.43 + 2.37 (89 FR 56723, p. 4).
  • Option: confirm that MFB requests these variables; otherwise drop them.

10. The is_in_k12_school: true inputs hide the age-based derivation.

  • Where:
    • edge/federal.yaml:46, 113, 181, 244, 308, 372, 436, 502, 567, 629, 693, 756;
    • edge/ca.yaml:29, edge/co.yaml:29, edge/ma.yaml:29;
    • edge/nc.yaml:36, 99, 162.
  • Issue:
    • The new net, free and reduced outputs depend on add(spm_unit, period, ["is_in_k12_school"]).
    • is_in_k12_school.py already returns true for ages 5-17, so the inputs change no result.
    • But a regression in the age-to-K-12 derivation would no longer show up in these contracts.
  • Option: drop the input and assert is_in_k12_school: true as a person output, as partners/my_friend_ben/2025.yaml:69 does.

11. The negative self-employment case no longer documents or tests what its name says.

  • Where: edge/federal.yaml:543-605; the comment is on lines 598-600.
  • Issue:
    • $20,000 / $27,320 = 73% FPG, so the case is FREE whether or not the -$25,000 loss offsets wages.
    • The PR replaced the 7 CFR 273.9(b) loss-offset rationale with a disclaimer.
    • The PR also added meets_school_meal_categorical_eligibility to 9 of the 12 cases, but not to this one or to the cases at lines 23 and 733.
    • No assertion was removed.
  • Option: add a school_meal_countable_income assertion, or rename the case.

12. The new parameter's description and label do not follow the house sentence form.

  • Where: params/state_covers_reduced_price_copay.yaml:1, 4.
  • Context: both copy the sibling params/state_universal_free_meals.yaml:1, 4.
  • Example: "States provide breakfast and lunch at no cost to students eligible for reduced-price meals under the National School Lunch Program and School Breakfast Program if this is true."

13. The programs.yaml NC entry: name style and effective date.

  • Where: policyengine_us/programs.yaml:113-117.
  • Issues:
    • The name is in sentence case, while its siblings use title case.
    • effective: 2020-07-01 hides the SY2021-22 gap. The flag is false from 2021-07-01, and S.L. 2021-180 contains no copay provision.
  • Option: use 2022-07-01, or add a notes: field.

Pre-existing items (not counted):

  • Territory keys: params/amount/nslp.yaml and sbp.yaml define only CONTIGUOUS_US, AK and HI. state_group can also return GU, PR and VI, which the FR tables price with HI (90 FR 34829, p. 3). This is untested and could cause a lookup failure; it warrants a follow-up.
  • Performance-based rate: the model uses the base "less than 60%" column without the performance-based add-on. Net values are unaffected because tier minus PAID cancels it out, but school_meal_daily_subsidy runs low for most SFAs.

Partner Contract Tests

The PR edits 11 partner contract files. Every changed expected value traces to one of four causes:

  • calendar 2025 now reads the SY2024-25 rates;
  • calendar 2026 reads the published SY2025-26 rates with no CPI uprating;
  • the contiguous-US paid lunch correction from 0.46 to 0.44;
  • the NC copay coverage.

Before the PR, values were pinned at 7.15 with a 0.1 margin. The PR tightens margins to 0.01.

# File Model-driven output changes Input changes New outputs or cases Other
1 partners/my_friend_ben/2025.yaml Daily 7.06 to 6.80 (:89) None is_in_k12_school: false (:69); net/free/reduced = 0 (:91-93) Comment
2 edge/ca.yaml Daily 7.15 to 7.06 (:66) Wages 50,700 to 60,000 (:18); is_in_k12_school: true (:29) Categorical false, universal true, countable income 60,000, net/free 1,119.60, reduced 0 Header; margin 0.1 to 0.01
3 edge/co.yaml Daily 7.15 to 7.06 (:66) Wages 50,700 to 60,000 (:18); is_in_k12_school: true (:29) Same as CA Header (C1 cite); margin
4 edge/ma.yaml Daily 7.15 to 7.06 (:66) Wages 50,700 to 60,000 (:18); is_in_k12_school: true (:29) Same as CA Header; margin
5 edge/federal.yaml (12 cases) 7.15 to 7.06 (:81, 150, 280, 538, 601); 6.45 to 6.36 (:216, 344, 474); 0.87 to 0.84 (:408); 6.36 to 6.10 (:665); 0.86 to 0.81 (:728); AK 11.67 to 11.40 (:792) TX/Dallas to MO (5 cases); Jackson Co. to St. Louis Co. (2 cases); override-case wages 60,000 to 50,500 (:425); is_in_k12_school: true (12 cases) Net/free/reduced in all 12 cases; categorical/universal in 9 Header; margins; SE-loss comment (:598-600)
6 edge/nc.yaml (new) None (new file) New cases supply is_in_k12_school: true (:36, 99, 162) 3 cases: at 185% in 2026, FREE, 7.06 daily, 1,119.60 net (:13; pre-PR model gives REDUCED, 6.36, 993.60); above 185%, PAID, 0.84, 0 (:76); in 2025, FREE, 6.80, 1,078.20 (:139) Header
7-11 partners/analytics_coverage/signatures/{co, il, ma, nc, tx}.yaml 29 cases, daily 7.15 to 7.06 (CO 5, IL 7, MA 5, NC 5, TX 7); tier unchanged None None Header comment

Classification

  • Model-driven output changes:
    • MFB 7.06 to 6.80;
    • 29 signature values;
    • 15 edge-case daily values (12 federal and 3 CA/CO/MA);
    • the new NC tier result.
    • These are legitimate re-pins, subject to the notification requirement below.
  • Input changes:
    • TX/Dallas to MO (5 cases);
    • Jackson Co. 64106 to St. Louis Co. 63011 (2 cases);
    • CA/CO/MA wages 50,700 to 60,000 (3 cases);
    • the override case's wages, 60,000 to 50,500 (S1);
    • is_in_k12_school: true supplied as an input in every edge case (Suggestion 10).
    • Each moved case gives identical outputs before and after the move, so the model change requires none of them.
  • New outputs: the added net/free/reduced, categorical, universal and countable-income assertions widen the contract. So do the three new NC cases. The MFB additions need partner confirmation (Suggestion 9).

Effect on the contracts

  • Weakened:
    • the override case no longer distinguishes supplied from derived income (S1);
    • the CA/CO/MA cases lose the 185.6% pairing with the federal PAID case (S2);
    • the TX and Jackson County scenarios are gone (S2);
    • K-12 status is now supplied as an input (Suggestion 10);
    • the negative self-employment case disclaims what its name implies (Suggestion 11).
  • Strengthened or neutral:
    • no assertion was deleted;
    • margins tightened from 0.1 to 0.01;
    • the added outputs widen the contract surface.
  • Partner-facing change:
    • NC reduced-price-band households move from tier 1 (REDUCED, 6.36 daily, 993.60 net) to tier 0 (FREE, 7.06 daily, 1,119.60 net) in 2026.
    • Every 2025 and 2026 daily subsidy value changes.

CLAUDE.md requirement

  • CLAUDE.md treats files under tests/policy/baseline/partners/** as API partner contract tests, not ordinary snapshots:
    • expected outputs are not to be rewritten merely to match changed model behavior;
    • input rewrites need a stated reason;
    • edits require confirmation that a team member and the API partner were told.
  • Notification: the PR body says "The user confirmed both team and API-partner notification", but no review, comment or linked issue on the PR records it.
  • Local test run: the PR body also says 623 partner tests passed locally, after which two "anchored-year" cases were deleted without a rerun. The final diff deletes no partner case, and CI passes 36/36 at head.

PDF Audit Summary

Source Pages Checked Result
FR 2024-15175 (SY2024-25) p. 4 (image table, 600 dpi) 18 NSLP/SBP cells used by calendar-2025 tests 18/18 match
FR 2025-13879 (SY2025-26) p. 3 (NSLP), p. 4 (SBP) 18 cells; source of the old 0.46 18/18 match. 0.46 is the "60% or more" column; 0.44 is correct
FR 2026-14252 (SY2026-27) p. 2 (narrative); p. 3 (image table, 600 dpi) 18 cells; round-down rule; 40-cent reduced-price gap; FAFH +3.54% 18/18 match
S.L. 2011-342 s.1 HTML Breakfast coverage Supports 0000-01-01: false (lunch not covered); subject to appropriations (Suggestion 3)
S.L. 2020-80 s.2.3(b)-(c) p. 14 SY2020-21 lunch Supports 2020-07-01: true. Nationwide-waiver year; waivers deferred to #9789
S.L. 2021-180 Full text Gap check No copay provision; supports 2021-07-01: false
S.L. 2022-74 s.7.3 p. 28 SY2022-23 lunch Supports 2022-07-01: true
S.L. 2023-134 s.7.58 p. 119; p. 625 Breakfast and lunch; effective Jul 1 2023 (s.43.8) Supports 2023-07-01: true
S.L. 2025-89 s.2A.8, s.7.1 p. 5; p. 6; p. 32 Adds (a1); repeals s.7.58; retroactive to Jul 1 2025 Supports 2025-07-01: true. Page 6 not anchored (S5); scope (Suggestion 2)
G.S. 115C-264(a1) HTML Standing requirement Supports; binds local boards (Suggestion 2)
7 CFR 245.2 HTML Reduced-price maximums Supports FREE = REDUCED + $0.70. As the parameter-level reference it supports no value (Suggestion 5)
NC DPI FAQ (Jun 30 2025); DPI press release (Jul 2 2025) FAQ p. 2; HTML Secondary corroboration FAQ is outdated (breakfast only); press release supports coverage
NM SB 4 (2023) s.3 p. 4 22-13C-4(A) Corrected cite is right; page text in title (S4)
MI PA 103 of 2023; MCL 388.1630d HTML s.30d (free meals) vs s.31aa (mental health and safety) Corrected cite is right
C.R.S. 2024 Title 22 p. 1328; p. 1332 CO partner citation Cites Part 1; Healthy School Meals for All is Part 2 (C1)
47 CFR 54.1800(j)(3) HTML ACP eligibility Free and reduced-price treated alike; no ACP change
Rockwood SD; Mount Vernon R-V (MO) HTML Reduced-price charges of $0.30 / $0.40 Spot-checked; Rockwood page is SY2026-27 (Suggestion 8)
FRAC state legislation chart (July 2023) PDF Other states' copay coverage Basis for Suggestion 4

Totals

  • 54 of 54 rate cells match.
  • 6 of 6 NC flag entries are supported.
  • No value or effective-date mismatches.

Cal. Educ. Code 49501.5 and MA Acts 2023 c.28 were not reviewed, because no value depends on them.

Validation Summary

Check Result
Federal rate values 54/54 match the FR tables; no stale 2025-01-01 rows remain
NC flag values and dates 6/6 supported by session law or statute
Hard-coded values None in school_meal_tier.py:19-47
Vectorization and periods select with & / |; YEAR periods correct
Breakdown keys 59/59; same set as the StateCode enum and the sibling file
Reference anchors All #page= anchors correct; page text in 5 titles (S4); page 6 not linked on line 113 (S5)
Citations CO partner cite names the wrong Part (C1); MI and NM corrections are correct
NC flag test coverage Every flag entry is tested (periods 2020, 2021, 2022, 2023, 2025 and 2026); boundary at 40,034 (FREE) / 40,035 (PAID)
Expected values 8/8 hand recomputations match, plus traces of 1,078.20, 952.20, 1,119.60, 1,812.60 and 993.60
Test periods and margins All YYYY; currency margins 0.01 / 0.001
Projection mechanism Timing and rounding match USDA's method; projected values untested (Suggestion 7)
Downstream effects ACP/EBB and Pell unchanged; benefit aggregates rise by $0.70 per day for each enrolled NC child in the reduced-price band
Partner contract tests 11 files edited; input rewrites not model-driven (S1, S2); notification not visible on the PR
Changelog changelog.d/nc-reduced-price-school-meals.fixed.md: top-level, matches the branch name
programs.yaml NC entry added in order with the required fields (Suggestion 13)
Axiom parity axiom: needed is not a valid form (S3)
Structure The copay parameter sits under gov/usda/, following the state_universal_free_meals.yaml precedent; no change recommended
CI 36/36 pass at 1950a45e34

Review Severity: REQUEST_CHANGES

1 critical, 5 should address, 13 suggestions. APPROVE requires 0 critical and 0 should-address findings.

Next Steps

  1. C1: in edge/co.yaml:1, change the cite to C.R.S. 22-82.9-201 et seq., and add #page=1332 to the line 2 URL. Consider fixing programs.yaml:92 too. Both are comment-level changes; the co.yaml edit falls under the partner-test rules.
  2. S1: restore the wages on edge/federal.yaml:425 to 60,000. The new expected values stay the same.
  3. S2: revert, or explain in the PR body, the TX/Jackson County to MO moves and the CA/CO/MA wage changes. Record the team and API-partner notification on the PR.
  4. S3: replace axiom: needed with an encoded or queued line that links a rulespec-us PR or a pe-parity issue.
  5. S4 and S5: remove the page text from the five reference titles, and split the line 113 reference into #page=5 (s.2A.8(a)) and #page=6 (s.2A.8(b)).
  6. Suggestions: these are optional. Follow-up issues for other states' copay coverage (Suggestion 4) and the missing territory keys would capture the remaining gaps.
  7. Re-review: request a new review after the changes. The branch is 11 commits behind main but has no conflicts.

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Requesting changes per the program review above (#9756 (comment)). The core change is sound: all 54 NSLP/SBP rate cells for SY2024-25 to SY2026-27 match the Federal Register, the 0.46 to 0.44 paid-lunch fix and the NC effective dates are correct, and using the free tier for a state-covered copay gives the right dollar value. Items to address: the CO citation (Part 1 vs Part 2, 22-82.9-201) on a line this PR rewrote; page text in reference titles; the federal.yaml override case neutralized without a model reason; partner-test input rewrites (TX/Jackson County to MO counties, CA/CO/MA wages) without stated justification, with partner notification not visible on GitHub; and axiom: needed, which is not a valid axiom line.

@hua7450
hua7450 requested a review from DTrim99 October 5, 2026 19:52
@DTrim99

DTrim99 commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator

Program Review — Round 2

PR #9756: Give North Carolina reduced-price school meal students the free tier (hua7450). Fixes #9755; follow-up #9789.

Round-2 scope

  • Head: 21c256cc71. Round-1 head: 1950a45e34.
  • Changes since round 1: fix commit b239579fc5 ("Address school meal references and partner review feedback") plus merges from main.
  • Branch: 0 behind upstream/main; merge-base 3f153919aa. GitHub reports MERGEABLE, with merge state BLOCKED because changes are requested.
  • PR diff against main: 23 files. Round 1 had 22; free_school_meals.py is new.
  • programs.yaml LIHEAP entries for IN, KY and NE appear in the round-2 delta. They come from the main merges (for example Add Indiana EAP regular heating assistance #9728), not from this PR. The PR's own programs.yaml diff against the merge-base is 12 lines.
  • Author response: no reply comment and no review-thread replies. The PR body was updated (new axiom line).

Path shorthand used below:

  • params/ = policyengine_us/parameters/gov/usda/school_meals/
  • edge/ = policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/

Status of Round-1 Findings

# Round-1 finding Verdict Evidence at 21c256cc71
C1 CO partner header cites C.R.S. 22-82.9-101 (Part 1), with an unanchored link FIXED
  • edge/co.yaml:1 now cites "C.R.S. sec. 22-82.9-201 et seq.".
  • edge/co.yaml:2 now links crs2024-title-22.pdf#page=1332, the page where Part 2 begins.
  • policyengine_us/programs.yaml:92 is corrected the same way.
S1 The federal.yaml direct-input case no longer tests the override FIXED
  • Wages are back at 60,000 (edge/federal.yaml:432), with school_meal_countable_income: 50_500 supplied (:461).
  • The comments state the override again (:459-460, :479-480).
  • Without the override, 60,000 / 27,320 = 219.6% FPG gives PAID. With it, 50,500 / 27,320 = 184.8% gives REDUCED: 6.36 daily and 180 × (6.36 − 0.84) = 993.60 net. The expected values are unchanged.
S2 Partner input rewrites without stated reasons; notification not visible FIXED / ACCEPTED-AS-RATIONALE
  • CA/CO/MA wages: reverted to 50,700 (edge/ca.yaml, co.yaml, ma.yaml:18), and the countable-income assertions follow (50,700). This restores the 185.6% pairing with the federal PAID case at edge/federal.yaml:356.
  • TX to MO (5 cases): edge/federal.yaml:18-20 now gives the reason: TX covers reduced-price breakfast and, from September 2025, lunch, and the model does not yet represent this. The TDA page confirms it: funding covers breakfast for SY 2025-26 and 2026-27, and lunch from Sep 1 2025 through SY 2026-27. A TX REDUCED fixture would therefore fix a result that is known to be wrong. The two PAID cases moved with their REDUCED neighbors.
  • Jackson Co. to St. Louis Co. (2 cases): :21-29 states the assumption of a participating non-CEP school, tied to dated district sources. Outputs are unchanged.
  • is_in_k12_school inputs: the PR body says the fixtures make "explicit school attendance". Outputs are unchanged (Suggestion 3).
  • Notification: see Partner Contract Tests. The repository's Partner API impact notice workflow posted the partner-file list to Slack at earlier heads. API-partner notification rests on the PR-body attestation.
S3 axiom: needed is not a valid form NOT FIXED
  • The line now reads axiom: n/a: Axiom school-meal implementation is outside this PR's agreed scope. ....
  • n/a is reserved for "infrastructure, data, UI, microsimulation-only or emulator-mapping changes" (shared guide). This PR changes policy. See Should Address S3.
S4 Page numbers in five reference titles FIXED Page text has been removed from all five titles: params/state_covers_reduced_price_copay.yaml:88, 98, 106, 119 and params/state_universal_free_meals.yaml:144.
S5 S.L. 2025-89 reference cites pages 5-6 but anchors only page 5 NOT FIXED
  • The reference was not split. Its href now ends #page=5,6,32 (:120).
  • The S.L. 2023-134 href was changed in the same way, to #page=119,625 (:107), so it no longer opens page 119 in every viewer.
  • See Should Address S5.

Round-1 suggestions

# Suggestion Status
1 Document FREE meaning; add a reference Addressed. school_meal_tier.py documentation and a tuple reference (7 CFR 245.2, G.S. 115C-264); free_school_meals.py documentation. The optional overridable SPMUnit flag was not added
2 Local-boards scope of G.S. 115C-264(a1) Addressed: comment at params/state_covers_reduced_price_copay.yaml:110-112
3 2011 breakfast coverage subject to appropriations Addressed: comment at :82
4 Other jurisdictions false without research Addressed: header comment :2-4. #9789 lists AZ, AR, DE, MD, NH, NJ, PA, RI, TX and UT for follow-up
5 Effective-date pages and parameter-level reference Partially addressed. Titles now cite s.43.8 and s.7.1, but the anchors use the invalid comma form (S5)
6 CPI-U proxy for FAFH Addressed as documentation: params/amount/nslp.yaml and sbp.yaml add caveat comments (forecast proxies, compounding of rounded rates). No value change
7 Test for the projection mechanism Open (Suggestion 1 below)
8 Rockwood page showed SY 2026-27 Addressed. Header now cites the dated Rockwood SY 2025-26 notice (Aug 4 2025) and the Mount Vernon SY 2024-25 board item (July 2024); both resolve and match the descriptions
9 My Friend Ben added assertions Open (Suggestion 2 below)
10 is_in_k12_school supplied as input Open (Suggestion 3 below)
11 Negative self-employment case Open (Suggestion 4 below)
12 Description sentence form Addressed (:1)
13 programs.yaml NC entry Addressed. notes: field at programs.yaml:117 documents the SY 2021-22 breakfast-only gap. The name style matches the sentence-case sibling "Massachusetts universal meals"; withdrawn

Critical (Must Fix)

None.

Should Address (remaining)

S3. The axiom line uses n/a for a policy change.

  • Where: PR body, final line: axiom: n/a: Axiom school-meal implementation is outside this PR's agreed scope. ... This PR does not implement or verify Axiom parity.
  • Rule:
    • CLAUDE.md and CONTRIBUTING.md#axiom-parity require any PR that adds, updates or fixes policy to leave the same provision correct in rulespec-us.
    • The shared guide limits n/a to "infrastructure, data, UI, microsimulation-only or emulator-mapping changes".
    • This PR adds a state rule (G.S. 115C-264(a1)), adds SY 2026-27 federal rates and corrects the SY 2025-26 paid lunch rate. Being out of scope is not one of the permitted reasons.
  • The cited tracking issues:
    • rulespec-us #1001, a federal parity campaign, lists free_school_meals and reduced_price_school_meals as Tier 2 rows. It has no labels.
    • axiom-encode #1517, a partner-demand queue, lists school_meal_tier and school_meal_daily_subsidy.
    • Neither is labelled pe-parity. Neither gives a module path, the verbatim law, required outputs or companion tests for G.S. 115C-264(a1) or the FR rate tables.
    • A search of rulespec-us issues and PRs for school meals, NSLP and 115C finds nothing else.
  • Precedent: comparable PRs queue pe-parity issues, for example rulespec-us Colorado Old Age Pension #1466 (NC LIEAP) and Replace documentation pages with updated PolicyEngine Core tools #1451 (Yonkers).
  • The blocker can be recorded:
  • Fix:

S5. Comma-separated #page= anchors do not reach the cited pages.

  • Where:
  • Why it fails:
    • PDF Open Parameters define page= as a single page number.
    • Chrome's viewer applies parseInt(urlParams.get('page'), 10) (open_pdf_params_parser.ts:368), so it opens page 119 or page 5.
    • pdf.js (Firefox) applies params.get("page") | 0 || 1 (web/pdf_link_service.js:376). The string "5,6,32" coerces to NaN, then 0, so it opens page 1.
    • Pages 6, 32 and 625 cannot be reached in either viewer.
    • In Firefox, the S.L. 2023-134 link now opens the 625-page law at page 1, where round 1's #page=119 was correct.
  • Convention:
    • These two hrefs are the only #page=N,M anchors in the repository; git grep on upstream/main finds none.
    • The parameter guidance is one #page=XX per href.
  • The page numbers themselves are right:
  • Fix: give each page its own reference entry.
            - title: North Carolina S.L. 2023-134 § 7.58 (breakfast and lunch, 2023-2025 biennium)
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119
            - title: North Carolina S.L. 2023-134 § 43.8 (effective date)
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=625
    • Do the same for S.L. 2025-89, with three entries:
      • s.2A.8(a), which adds G.S. 115C-264(a1): #page=5;
      • s.2A.8(b), which repeals S.L. 2023-134 s.7.58: #page=6;
      • s.7.1, which makes the change retroactive to Jul 1 2025: #page=32.

Suggestions

  1. Add a test for the new projection mechanism (carried from round 1, Suggestion 7).
    • Where: params/amount/nslp.yaml and sbp.yaml (uprating.at_defined_interval with downward rounding).
    • Gap: no test checks a projected value. The July 1 step, the May-to-May ratio and the rounding down to the cent (91 FR 43598, p. 2) remain untested.
    • Option: a pytest that compares nslp.CONTIGUOUS_US.FREE at 2027-06-01 with the value at 2027-07-01, computing the expected value from the parameter tree.
  2. Confirm that My Friend Ben requests the added outputs (carried, round-1 Suggestion 9).
    • Where: policyengine_us/tests/policy/baseline/partners/my_friend_ben/2025.yaml.
    • What was added: assertions for is_in_k12_school, school_meal_net_subsidy, free_school_meals and reduced_price_school_meals.
    • What is model-driven: only the daily-rate change from 7.06 to 6.80 (4.43 + 2.37, 89 FR 56723, p. 4).
  3. Assert K-12 status instead of supplying it (carried, round-1 Suggestion 10).
    • Where: edge/federal.yaml, ca.yaml, co.yaml, ma.yaml and nc.yaml, which supply is_in_k12_school: true for an 8-year-old.
    • Why: is_in_k12_school already derives true for ages 5-17. Supplying it means a regression in the age-based derivation would not appear in these contracts.
    • Option: assert it as a person output instead.
  4. Make the negative self-employment case test what its name says (carried, round-1 Suggestion 11).
    • Where: edge/federal.yaml:551-613.
    • Issue: at $20,000 of wages (73% FPG), the case is FREE whether or not the loss is netted. The comment at :606-608 says so.
    • Option: add a school_meal_countable_income assertion, or rename the case.
  5. Align the PR body with the code.
    • Anchors: the "Sources and effective dates" list uses #page=5,6 (S.L. 2025-89) and #page=3,4 (FR 2025-13879), which have the same anchor problem as S5. It also keeps page text ("pages 5–6", "page 14", ...).
    • Stale reason: the body still explains the MO fixtures as "Missouri districts with documented reduced-price charges". The TX-coverage reason now in edge/federal.yaml:18-20 is not mentioned.
  6. Re-run the Partner API impact notice at the final head.
    • Timing: the last successful notice ran at 361043f786 (run 37357676055, Slack post at 18:52 UTC Oct 5). After that, b239579fc5 changed four partner files: edge/ca.yaml, co.yaml, ma.yaml and federal.yaml.
    • Cancelled run: the run at 21c256cc71 (37363410355) was cancelled before a runner was assigned.
    • Effect of a re-run: the Slack record would then reflect the final partner diff.

Delta Verification (fresh pass)

Item Result
edge/co.yaml:1-2; programs.yaml:92 C.R.S. 22-82.9-201 et seq. is correct. #page=1332 is the first page of Part 2 (C.R.S. 2024 Title 22)
programs.yaml:117 notes Accurate. Both meals are covered in SY 2020-21 and from SY 2022-23. In SY 2021-22 only breakfast was covered (S.L. 2011-342); S.L. 2021-180 has no lunch provision
Override case (edge/federal.yaml:420-486) Wages 60,000 and supplied aggregate 50,500 give REDUCED: 6.36 daily and 993.60 net. Verified
CA/CO/MA cases 50,700 / 27,320 = 185.6% FPG. FREE through state_universal: 7.06 daily and 180 × (7.06 − 0.84) = 1,119.60 net. Verified
MO 2025 cases (:614-740) Unchanged. 6.10 / 0.81 daily; 180 × (6.10 − 0.81) = 952.20 net
TX coverage claim (:18-20) Matches the TDA Square Meals page: breakfast is funded for SY 2025-26 and 2026-27 and was funded earlier "through August 31, 2025"; lunch is funded from Sep 1 2025 through SY 2026-27
MO district sources (:23-26) Rockwood: "Free and Reduced Meal Applications Available for 2025-2026 School Year" (Aug 4 2025). Mount Vernon: July 2024 board meeting approving 2024-25 meal prices. Both resolve. The header limits their use to context, not exact prices
Copay-parameter comments (:2-4, 81-83, 108-112) Consistent with S.L. 2011-342 s.1 (appropriations condition) and G.S. 115C-264(a1) (local boards)
Reference titles No page text remains. Two anchors use the invalid comma form (S5)
school_meal_tier.py, free_school_meals.py Documentation only, plus a tuple reference. Formula unchanged; no hard-coded values
nslp.yaml, sbp.yaml Comment-only changes; no value or date changes
Expected values changed in the delta Only the CA/CO/MA countable-income assertions (60,000 back to 50,700), which follow the restored inputs. No other expected values changed

Partner Contract Tests

File Status at 21c256cc71
partners/my_friend_ben/2025.yaml Unchanged since round 1. The daily rate 7.06 to 6.80 is model-driven. The four added assertions remain (Suggestion 2)
edge/ca.yaml, edge/co.yaml, edge/ma.yaml Wages reverted to 50,700, so the only input change from main is is_in_k12_school: true. Daily rate 7.15 to 7.06 is model-driven. New outputs are categorical false, universal true, countable income 50,700, net/free 1,119.60 and reduced 0. The CO cite is fixed (C1)
edge/federal.yaml Override case restored (S1). Five TX cases moved to MO, justified by the verified TDA source. Two Jackson Co. cases moved to St. Louis Co., justified by the non-CEP documented-district assumption. All expected-value changes are model-driven (SY 2024-25 and SY 2025-26 rates, paid lunch 0.44). is_in_k12_school inputs remain (Suggestion 3)
edge/nc.yaml (new) Unchanged since round 1. Three NC cases: FREE at 185% in 2026 (7.06 daily, 1,119.60 net); PAID above 185% (0.84, 0); FREE in 2025 (6.80, 1,078.20)
signatures/{co, il, ma, nc, tx}.yaml Unchanged since round 1. 29 daily values move from 7.15 to 7.06; tiers are unchanged. All 7 TX signature cases are tier 0 (FREE), so the unmodeled TX copay coverage does not affect them
  • Assertions: none deleted. Margins tightened from 0.1 to 0.01.
  • Partner-facing change: NC reduced-price-band households move from REDUCED (6.36 daily, 993.60 net) to FREE (7.06 daily, 1,119.60 net) in 2026, and every 2025 and 2026 daily subsidy value changes.
  • Team notification:
    • The repository's Partner API impact notice workflow (.github/workflows/partner-api-impact-notice.yaml) ran successfully at 1950a45e34 (run 37257532544) and at 361043f786 (run 37357676055).
    • At 361043f786, the Notify Slack step listed all 11 partner files and curl returned ok (18:52:31 UTC Oct 5).
    • The run at the current head was cancelled before a runner was assigned (Suggestion 6).
  • API-partner notification: the PR body states "The user confirmed both team and API-partner notification." No partner acknowledgment appears on the PR.
  • Local test run: Household API Partners passes in CI at 21c256cc71.
  • Tracked gap: TX stays false in state_covers_reduced_price_copay although edge/federal.yaml:18-20 documents TX coverage. Complete school meal coverage: state policies, child-specific eligibility, and separate breakfast/lunch treatment #9789 lists Texas for follow-up.
  • Not edited by this review: the partner files under policyengine_us/tests/policy/baseline/partners/** were reviewed only.

CI

gh pr checks 9756 at 21c256cc71: 10 pass, 19 fail, 5 pending, 1 skipped.

Failures

  • 18 jobs in run 37363295257 (pull_request): all have conclusion cancelled, no runner assigned and no steps executed. They were queued from 20:05:09Z and cancelled between 21:01Z and 21:10Z. The jobs are:
    • Full Suite Baseline: irs, reform, rest-a, rest-b, states-shard-2, states-shard-3;
    • Full Suite Contrib: congress, other-shard-2a, other-shard-2b, other-shard-3, states-shard-3, states-shard-4;
    • Microsimulation; smoke-import py3.12 and py3.13; Quick Feedback; Release lock guard tests; Validate bundle metadata contract.
  • Notify Slack (run 37363410355, pull_request_target, Partner API impact notice): cancelled with no runner assigned.
  • Classification: runner-acquisition cancellations (infrastructure). No test or lint failure appears in any log.

Passes

  • Lint, changelog fragment and committed registry lock;
  • Household API Partners;
  • smoke-import py3.11 and py3.14;
  • Full Suite Baseline contrib-hhs, ssa-usda (which runs the gov/usda school-meal tests) and states-shard-4;
  • Full Suite Contrib states-shard-1.

Still running: Baseline household, Baseline states-shard-1, Contrib other-shard-1, Contrib states-shard-2 and Rest (Python + variables).

A re-run is needed for a complete signal. At the round-1 head 1950a45e34, 36/36 checks passed.

Review Severity: REQUEST_CHANGES

0 critical, 2 should address (S3 axiom line; S5 multi-page anchors), 6 suggestions. APPROVE requires 0 critical and 0 should-address findings.

Fixed since round 1:

  • C1, S1, S2 and S4;
  • 9 of 13 round-1 suggestions, fully or partially.

Remaining fixes:

  • S3: replace the n/a line with a queued line that links a dispatch-ready rulespec-us pe-parity issue, or with an encoded / encoded-correct line.
  • S5: split the two comma-anchored references into one entry per page (#page=119, #page=625; #page=5, #page=6, #page=32).

@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 (#9756 (comment)): the CO citation, the federal.yaml override case, the CA/CO/MA wage reverts, the TX-to-MO justification (TX now pays both reduced-price copays) and the reference-title page text are all fixed; no value regressions. Two items remain: (1) the axiom line's n/a doesn't fit a policy change, and the cited Axiom issues aren't pe-parity-labelled or dispatch-ready; (2) the new comma anchors (#page=5,6,32, #page=119,625) aren't valid PDF fragments, so pages 6, 32 and 625 can't be reached and the S.L. 2023-134 link regressed (use one single-page reference per cited page). Also re-run the partner API impact notice at the final head, since four partner files changed after the last successful post. The CI failures are runner-acquisition cancellations.

@hua7450

hua7450 commented Oct 5, 2026

Copy link
Copy Markdown
Collaborator Author

David, could you approve a scope exception to the Axiom parity requirement for this PR?

This PR corrects the existing PEUS school-meal model and updates its reimbursement rates. Based on the program inventory discussed here, Axiom has no corresponding implemented school-meal program to synchronize. Its broader coverage is already tracked in rulespec-us #1001 and axiom-encode #1517, and the separate PEUS school-meal refactor is tracked in #9789.

Please allow this correction to proceed without requiring implementation of the broader Axiom program as part of this PR. I understand the current contribution guide includes policy bug fixes, so the PR description explicitly marks axiom: n/a as a requested scope exception with maintainer approval pending. It does not claim that parity has been implemented or that either existing issue meets the queued requirements.

@hua7450
hua7450 requested a review from DTrim99 October 6, 2026 15:15
@DTrim99

DTrim99 commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 3): Give North Carolina reduced-price school meal students the free tier

PR #9756 (hua7450). Fixes #9755; follow-up #9789.

Round-3 scope

  • Head: c6241a5e4b. Round-2 head: 21c256cc71.
  • Changes since round 2: fix commit bd04f41f04 ("Address school meal reference and test review feedback") and a merge from main.
  • PR diff against the merge-base 9bbdec7d51: 24 files. Round 2 had 23; the new file is the baseline test school_meal_net_subsidy.yaml.
  • Author response: one PR comment (Oct 5, 23:21 UTC) asking the maintainer to approve an Axiom scope exception. There are no review-thread replies. The PR body was rewritten: new axiom line, Missouri rationale, single-page source links and validation notes.

Summary

  • Five of the six round-2 suggestions are fully addressed, and the sixth (the projection test) is addressed apart from one optional point:
    • a calendar-2028 projection test;
    • the My Friend Ben fixture is back to its model-driven change only;
    • all 17 partner edge cases now assert K-12 attendance instead of supplying it as an input;
    • the business-loss case is renamed;
    • the PR body matches the code;
    • the partner notice was re-run at the final head.
  • The comma #page= anchors are gone. Every reference link in the PR now opens one valid page that shows the value.
  • The S5 fix stopped short of splitting the references, though. The two North Carolina titles now carry page lists ("#page 119,625", "#page 5,6,32"), and the repeal page and the two effective-date pages have no link. That leaves one narrowed should-address item.
  • The axiom line is now a request for a scope exception. The maintainer decides that; it is listed separately below and is not counted in the findings.
  • Apart from S5 and the axiom decision, the PR is ready to approve. Values, formula, tests and partner changes all check out.

Path shorthand used below:

  • params/ = policyengine_us/parameters/gov/usda/school_meals/
  • tests/ = policyengine_us/tests/policy/baseline/gov/usda/school_meals/
  • edge/ = policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/

Status of Round-2 Findings

# Round-2 item Status Evidence at c6241a5e4b
S3 The axiom line uses n/a for a policy change ACKNOWLEDGED-DEFERRED → maintainer decision
  • The line now reads axiom: n/a: Scope exception requested; maintainer approval is pending. ...
  • The author's PR comment asks for the exception and says the line "does not claim that parity has been implemented or that either existing issue meets the queued requirements."
  • See Maintainer decision. Not counted below.
S5 Comma-separated #page= anchors do not reach the cited pages PARTIALLY ADDRESSED
  • Fixed: both hrefs are now single pages. S.L. 2023-134 links #page=119 (params/state_covers_reduced_price_copay.yaml:107), which shows s.7.58. S.L. 2025-89 links #page=5 (:120), which shows s.2A.8(a) adding G.S. 115C-264(a1). Both now open correctly in Chrome and Firefox.
  • Not done: the references were not split. Page lists moved into the titles (:106 "...; #page 119,625", :119 "...; #page 5,6,32"). s.43.8 (p. 625), s.2A.8(b) (p. 6) and s.7.1 (p. 32) still have no link.
  • See Should Address S5.

Round-2 suggestions

# Suggestion Status Evidence
1 Test the projection mechanism ADDRESSED
  • tests/school_meal_daily_subsidy.yaml:47-60 adds a calendar-2028 case across all 9 region-tier cells.
  • Recomputed: the July 1, 2027 step uses CPI-U May 2027 / May 2026 = 340.3 / 333.979 = 1.018926. Each meal and tier is floored to the cent, which gives [7.43, 6.72, 0.87, 12.02, 11.31, 1.40, 9.65, 8.93, 1.12]. All 9 match.
  • The case catches errors in both the ratio and the rounding:
    • Rounding to the nearest cent would give 7.44 (contiguous FREE) and 12.04 (AK FREE).
    • The old monthly uprating would give about 7.47.
  • The July 1 enactment date itself is still implicit, because annual variables read January 1 (Suggestion 1 below, optional).
2 Confirm My Friend Ben requests the added outputs ADDRESSED
  • partners/my_friend_ben/2025.yaml no longer has the four added assertions (is_in_k12_school, school_meal_net_subsidy, free_school_meals, reduced_price_school_meals).
  • Against main, the file now changes only school_meal_daily_subsidy from 7.06 to 6.80 (4.43 + 2.37), plus a comment.
  • The adult-only zero-benefit coverage moved to tests/school_meal_net_subsidy.yaml:6-20.
3 Assert K-12 status instead of supplying it ADDRESSED
  • is_in_k12_school: true is removed from the inputs of all 17 edge cases (edge/ca, co, ma: 1 each; federal: 12; nc: 3).
  • Each case now asserts it under output.people.child1 (for example edge/federal.yaml:83, edge/nc.yaml:66).
  • The variable derives true for ages 5-17, so the age-8 child exercises the derivation.
4 Make the negative self-employment case test what its name says ADDRESSED Renamed to school_meals_low_wages_with_business_loss_free (federal) (edge/federal.yaml:567). The comment at :624-626 already says the case checks the FREE outcome, not how losses are treated
5 Align the PR body with the code ADDRESSED
  • Every link in the PR body now uses a single #page=N.
  • The Missouri rationale now gives the unmodeled Texas breakfast and lunch coverage, matching edge/federal.yaml:18-20.
  • The body describes the derived K-12 assertions and the My Friend Ben change.
  • The body's sentence "Keep each source URL once per reference set..." describes the approach in S5. Update it if S5 changes.
6 Re-run the Partner API impact notice at the final head ADDRESSED
  • The Partner API impact notice workflow ran at c6241a5e4b (run 37388220956): success.
  • "Find changed partner tests" listed all 11 partner files.
  • The Slack curl returned ok at 23:23:52 UTC, Oct 5.

Critical (Must Fix)

None.

Should Address

S5 (narrowed). Split the two North Carolina session-law references into one entry per page, and take the page lists out of the titles.

  • Where:
    • params/state_covers_reduced_price_copay.yaml:106-107: title "North Carolina S.L. 2023-134 §§ 7.58 and 43.8 (breakfast and lunch, 2023-2025 biennium; #page 119,625)", href ...SL2023-134.pdf#page=119.
    • :119-120: title "North Carolina S.L. 2025-89 §§ 2A.8 and 7.1 (adds G.S. 115C-264(a1), repeals S.L. 2023-134 § 7.58; #page 5,6,32)", href ...SL2025-89.pdf#page=5.
  • What remains:
    • The two dated values rest on pages that have no link:
      • the 2023-07-01 start comes from s.43.8 (p. 625: "this act becomes effective July 1, 2023");
      • the 2025-07-01 start comes from s.7.1 (p. 32: "effective retroactively to July 1, 2025");
      • the repeal of s.7.58 is s.2A.8(b) (p. 6).
    • The titles now carry page numbers in URL syntax. This is the round-1 S4 pattern in a new form. The model-development guidance puts page numbers in href as #page=XX and never in title.
    • No other parameter title in the repository contains #page.
  • The PR body's rationale does not match repo practice. The body gives the approach as "Keep each source URL once per reference set." The repository does the opposite:
  • Fix (about six lines; the page numbers were verified in rounds 1 and 2):
      2023-07-01:
        value: true
        metadata:
          reference:
            - title: North Carolina S.L. 2023-134 § 7.58 (breakfast and lunch, 2023-2025 biennium)
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119
            - title: North Carolina S.L. 2023-134 § 43.8 (effective date)
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=625
      2025-07-01:
        value: true
        metadata:
          reference:
            - title: N.C. Gen. Stat. § 115C-264(a1)
              href: https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_115C/GS_115C-264.html
            - title: North Carolina S.L. 2025-89 § 2A.8.(a) (adds G.S. 115C-264(a1))
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=5
            - title: North Carolina S.L. 2025-89 § 2A.8.(b) (repeals S.L. 2023-134 § 7.58)
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=6
            - title: North Carolina S.L. 2025-89 § 7.1 (effective retroactively to July 1, 2025)
              href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=32
    • Optionally, use the same split for the PR body's "Sources and effective dates" links and drop the "once per reference set" sentence.

Suggestions

  1. Optional: pin the July 1 enactment date directly (residual of round-2 Suggestion 1).
    • Gap: school_meal_daily_subsidy is annual and reads January 1. The calendar-2027 and calendar-2028 cases therefore confirm the ratio and the rounding, but not the day the projection takes effect. Any enactment date between May 2 and December 31 gives the same results.
    • Option: a small pytest that reads gov.usda.school_meals.amount.nslp.CONTIGUOUS_US.FREE at 2027-06-01 (expect 4.76) and at 2027-07-01 (expect 4.85).
    • Not blocking.
    • Maintenance note: the calendar-2028 expected values depend on the CPI-U forecast entry at 2027-02-01 (340.3). They will need re-pinning when CPI-U is refreshed, as other projection tests do.

Delta Verification (fresh pass on bd04f41f04)

Item Result
NC reference hrefs (params/state_covers_reduced_price_copay.yaml:107, 120) Each is a single valid page. p. 119 shows s.7.58 ("school breakfasts and lunches at no cost ... reduced-price"). p. 5 shows s.2A.8(a) adding subsection (a1). Both support true (S5 for the titles)
Every other href in the PR scope Each is a single page or an HTML link, and each shows its value:
  • FR 2026-14252 #page=3, in nslp.yaml and sbp.yaml;
  • S.L. 2020-80 #page=14;
  • S.L. 2022-74 #page=28;
  • NM SB 4 #page=4;
  • CRS Title 22 #page=1332, in an edge/co.yaml comment;
  • S.L. 2023-134 #page=119, in an edge/nc.yaml comment;
  • 7 CFR 245.2, G.S. 115C-264, MCL 388.1630d and S.L. 2011-342 (HTML).
None of these URLs is on the repository's known-dead URL lists
Calendar-2028 projection (tests/school_meal_daily_subsidy.yaml:47-60) All 9 values recomputed from the at_defined_interval logic in policyengine-core:
  • first enactment 2027-07-01;
  • start 2026-05-01 (333.979);
  • end 2027-05-01, which takes the 2027-02-01 entry of 340.3;
  • each value is floored to $0.01.
The comment arithmetic (4.85 + 2.58 = 7.43; 4.44 + 2.28; 0.45 + 0.42) matches
Calendar-2025 comment (:15) Correct. With the SY 2025-26 rates dated 2025-07-01, January 1, 2025 reads SY 2024-25: 4.43 + 2.37 = 6.80
Adult-only case (tests/school_meal_net_subsidy.yaml:6-20) Age 49 gives is_in_k12_school false. Colorado universal meals and $0 income both give FREE. Daily subsidy 4.43 + 2.37 = 6.80. Net, free and reduced amounts are 0 because no child is enrolled. Matches the scenario the My Friend Ben assertions covered
Partner edge files Only changes: the input-to-output move of is_in_k12_school (17 cases) and one case rename. No monetary expected value changed in round 3
edge/federal.yaml:624-626 comment Consistent with the new case name
Changelog changelog.d/nc-reduced-price-school-meals.fixed.md is a top-level fragment named for the branch with type fixed. Unchanged since round 1; it still describes the PR
Formula and parameter values Unchanged since round 2. No hard-coded values

Maintainer decision (not counted in findings)

Axiom parity scope exception.

Partner Contract Tests

The round-3 diff touches 11 files under policyengine_us/tests/policy/baseline/partners/**. All were reviewed only; this review edited none of them.

File Change vs main Change in round 3
my_friend_ben/2025.yaml school_meal_daily_subsidy 7.06 → 6.80 (SY 2024-25 rates in force January 1, 2025), plus a comment. Model-driven The four added assertions and their comment were removed
edge/ca.yaml, edge/co.yaml, edge/ma.yaml
  • Daily rate 7.15 → 7.06.
  • New assertions: categorical false, universal true, countable income 50,700, net and free 1,119.60, reduced 0.
  • CO citation corrected to C.R.S. 22-82.9-201.
is_in_k12_school moved from input to output
edge/federal.yaml
  • SY 2024-25 and SY 2025-26 rates, with paid lunch at 0.44.
  • The direct-input override case restored.
  • TX to MO and Jackson Co. to St. Louis Co. moves, with the reasons in the header.
is_in_k12_school moved to output in all 12 cases; one case renamed
edge/nc.yaml (new) Three NC cases:
  • FREE at 185% FPG in 2026 (7.06 daily, 1,119.60 net);
  • PAID above 185% (0.84, 0);
  • FREE in 2025 (6.80, 1,078.20).
is_in_k12_school moved to output
signatures/{co, il, ma, nc, tx}.yaml 29 daily values 7.15 → 7.06. Tiers unchanged None
  • Partner-facing effect:
    • NC households in the reduced-price band move from REDUCED (6.36 daily, 993.60 net) to FREE (7.06, 1,119.60) in 2026.
    • All 2025 and 2026 daily subsidy values change.
    • No assertions were deleted against main. Round 3 changed no monetary expected values.
  • Team notification: the notice re-ran at the final head and lists all 11 files (Suggestion 6 above).
  • API-partner notification: the PR body states "Team and API-partner notification have been confirmed by the author." No partner acknowledgment appears on the PR.
  • CI: Household API Partners passes at c6241a5e4b.

CI

gh pr checks 9756 at c6241a5e4b: 36/36 pass (run 37388221916, plus the partner notice). The passing checks include:

  • Lint, changelog fragment and committed registry lock;
  • Household API Partners;
  • Full Suite Baseline ssa-usda, which runs the gov/usda school-meal tests;
  • rest-a and rest-b;
  • Rest (Python + variables).

Branch Status

Review Severity

0 critical, 1 should address (S5, narrowed: split the two NC references by page and remove page lists from the titles), 1 optional suggestion. The axiom scope exception is a separate maintainer decision.

Fixed since round 2:

  • the comma anchors (every href is now a single valid page);
  • all six round-2 suggestions, with the projection test leaving one optional point (Suggestion 1);
  • the partner notice re-run at the final head.

Remaining fix: S5. Replace the two combined NC references with one entry per page: #page=119 and #page=625; #page=5, #page=6 and #page=32.

Verdict (excluding the maintainer axiom decision): 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.

Round 3: all round-2 suggestions are addressed and the hrefs are now single valid pages. One should item remains (S5): the two combined NC references still carry page lists in their titles, so please split them into one entry per page (#page=119 and #page=625; #page=5, #page=6 and #page=32). The Axiom scope-exception request is a separate maintainer decision and is not counted here.

hua7450 and others added 2 commits October 6, 2026 12:17
Split the two combined S.L. 2023-134 and S.L. 2025-89 references in
state_covers_reduced_price_copay.yaml into one entry per cited page, so
the effective-date and repeal sections link directly and no title
carries a page list.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@hua7450
hua7450 requested a review from DTrim99 October 6, 2026 16:18
@DTrim99

DTrim99 commented Oct 6, 2026

Copy link
Copy Markdown
Collaborator

PR Review (round 4): Give North Carolina reduced-price school meal students the free tier

Head: 34cbda97c0. It adds fix commit 78bc468754 and a merge of main.

Summary: S5, the last open should-address item from round 3, is resolved. The only change to the PR's own scope is the reference split in state_covers_reduced_price_copay.yaml. The 24-file set is the same as round 3, and no partner test file changed. That leaves the Axiom parity line, which is ruled on below.

Round-3 items

Item Status Evidence
S5: page lists in titles, unsplit NC references ADDRESSED state_covers_reduced_price_copay.yaml:106-109 and :121-126 now have one reference per page, with no page text in any title. Each anchor opens on its section:
• S.L. 2023-134 #page=119: § 7.58
• S.L. 2023-134 #page=625: § 43.8, effective date
• S.L. 2025-89 #page=5: § 2A.8.(a), adds G.S. 115C-264(a1)
• S.L. 2025-89 #page=6: § 2A.8.(b), repeals S.L. 2023-134 § 7.58
• S.L. 2025-89 #page=32: § 7.1, effective retroactively to July 1, 2025
Optional suggestion (explicit July 1 date test) Optional Unchanged. Still not required.

Axiom parity: the scope exception is not granted

The PR body asks for an axiom: n/a scope exception. I'm not granting it.

CONTRIBUTING.md#axiom-parity applies parity to bug fixes and parameter updates, and this PR is both. It changes North Carolina's reduced-price coverage and updates reimbursement rates. A scope exception is not one of the accepted forms. Axiom having no school-meal program yet is exactly the case the queued form exists for.

What's needed: replace the line with axiom: <rulespec-us issue> queued. The issue must be dispatch-ready and labelled pe-parity, using rulespec-us#1467 as the model. It needs:

  • Module path(s) for the provisions this PR changes:
    • N.C. Gen. Stat. § 115C-264(a1), added by S.L. 2025-89 § 2A.8, with the 2023-2025 biennium coverage under S.L. 2023-134 § 7.58 and its repeal.
    • The reimbursement rates the PR updates.
  • Corpus citations and the verbatim text of those provisions. The session-law pages above are already the right sources.
  • Required outputs: reduced-price-eligible NC students get the free tier, plus the rate values.
  • Companion tests taken from the same external sources as the YAML tests (the session laws and the FNS rate notices), not from PolicyEngine output.

The issue can link rulespec-us#1001, axiom-encode#1517 and #9789 as context or blockers. It does not need to wait for the broader school-meal program.

CI status

CI is still queued on 34cbda97c0. The last full run, on c6241a5e4b, passed 36/36. Please make sure this run goes green, including the Partner API impact notice.

Branch status

The branch is 1 commit behind main, and the merge is clean.

Remaining fix: file the queued pe-parity rulespec-us issue and update the axiom line. Everything else is ready to approve.

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.

Round 4: S5 is resolved; all five split NC references open on their sections. The Axiom scope exception is not granted: this is a policy fix, so it needs a dispatch-ready pe-parity rulespec-us issue and an axiom: <issue> queued line (details in the comment above; the issue can name #9789 as a blocker). Everything else is ready to approve once that is in and CI is green.

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.

North Carolina reduced-price school meal students should get the free tier

2 participants