diff --git a/changelog.d/nc-reduced-price-school-meals.fixed.md b/changelog.d/nc-reduced-price-school-meals.fixed.md new file mode 100644 index 00000000000..9adcc7e3929 --- /dev/null +++ b/changelog.d/nc-reduced-price-school-meals.fixed.md @@ -0,0 +1 @@ +North Carolina students who qualify for reduced-price school meals now get the free tier, because the state pays the reduced-price copay. Correct the 2025 contiguous-US paid lunch reimbursement rate to use the same under-60% category as the free and reduced-price rates. Date the school year 2025-2026 reimbursement rates to July 1, 2025. Add published school year 2026-2027 reimbursement rates for all modeled regions and apply projected rate changes only on July 1, preserving published rates through June. Update partner school-meal scenarios and expected benefits. diff --git a/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml b/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml index 79fe063e641..8789f0efd69 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml @@ -13,7 +13,8 @@ CONTIGUOUS_US: 2022-07-01: 0.37 2023-07-01: 0.40 2024-07-01: 0.42 - 2025-01-01: 0.46 + 2025-07-01: 0.44 + 2026-07-01: 0.45 REDUCED: 2015-07-01: 2.67 2016-07-01: 2.76 @@ -25,7 +26,8 @@ CONTIGUOUS_US: 2022-07-01: 3.53 2023-07-01: 3.85 2024-07-01: 4.03 - 2025-01-01: 4.20 + 2025-07-01: 4.20 + 2026-07-01: 4.36 FREE: 2015-07-01: 3.07 2016-07-01: 3.16 @@ -37,7 +39,8 @@ CONTIGUOUS_US: 2022-07-01: 3.93 2023-07-01: 4.25 2024-07-01: 4.43 - 2025-01-01: 4.60 + 2025-07-01: 4.60 + 2026-07-01: 4.76 AK: PAID: 2015-07-01: 0.48 @@ -50,7 +53,8 @@ AK: 2022-07-01: 0.61 2023-07-01: 0.66 2024-07-01: 0.69 - 2025-01-01: 0.71 + 2025-07-01: 0.71 + 2026-07-01: 0.74 REDUCED: 2015-07-01: 4.59 2016-07-01: 4.72 @@ -62,7 +66,8 @@ AK: 2022-07-01: 5.97 2023-07-01: 6.50 2024-07-01: 6.78 - 2025-01-01: 7.05 + 2025-07-01: 7.05 + 2026-07-01: 7.32 FREE: 2015-07-01: 4.99 2016-07-01: 5.12 @@ -74,7 +79,8 @@ AK: 2022-07-01: 6.37 2023-07-01: 6.90 2024-07-01: 7.18 - 2025-01-01: 7.45 + 2025-07-01: 7.45 + 2026-07-01: 7.72 HI: PAID: 2015-07-01: 0.34 @@ -87,7 +93,8 @@ HI: 2022-07-01: 0.44 2023-07-01: 0.53 2024-07-01: 0.55 - 2025-01-01: 0.57 + 2025-07-01: 0.57 + 2026-07-01: 0.59 REDUCED: 2015-07-01: 3.20 2016-07-01: 3.29 @@ -99,7 +106,8 @@ HI: 2022-07-01: 4.20 2023-07-01: 5.14 2024-07-01: 5.36 - 2025-01-01: 5.58 + 2025-07-01: 5.58 + 2026-07-01: 5.79 FREE: 2015-07-01: 3.60 2016-07-01: 3.69 @@ -111,7 +119,8 @@ HI: 2022-07-01: 4.60 2023-07-01: 5.54 2024-07-01: 5.76 - 2025-01-01: 5.98 + 2025-07-01: 5.98 + 2026-07-01: 6.19 metadata: unit: currency-USD @@ -138,10 +147,25 @@ metadata: href: https://www.federalregister.gov/documents/2024/07/10/2024-15175/national-school-lunch-special-milk-and-school-breakfast-programs-national-average-paymentsmaximum - title: National School Lunch, Special Milk, and School Breakfast Programs, National Average Payments/Maximum Reimbursement Rates - 2025 href: https://www.govinfo.gov/content/pkg/FR-2025-07-24/pdf/2025-13879.pdf#page=3 + - title: National School Lunch, Special Milk, and School Breakfast Programs, National Average Payments/Maximum Reimbursement Rates - 2026 + href: https://www.govinfo.gov/content/pkg/FR-2026-07-16/pdf/2026-14252.pdf#page=3 period: day label: National School Lunch Program value breakdown: - state_group - school_meal_tier - uprating: gov.bls.cpi.cpi_u + # Published rates remain fixed from July through June. After the last + # published school year, retain CPI-U as a projection proxy for USDA's + # Food Away From Home index, applying May-to-May changes only on July 1. + # Future CPI-U entries are annual forecast proxies, not observed May values. + # Projections compound rounded rates; USDA's unrounded bases are not modeled. + uprating: + parameter: gov.bls.cpi.cpi_u + at_defined_interval: + start: "0001-05-01" + end: "0002-05-01" + enactment: "0002-07-01" + rounding: + interval: 0.01 + type: downwards propagate_metadata_to_children: true diff --git a/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml b/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml index c97cee638e3..794c7cbcd7e 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml @@ -13,7 +13,8 @@ CONTIGUOUS_US: 2022-07-01: 0.35 2023-07-01: 0.38 2024-07-01: 0.39 - 2025-01-01: 0.40 + 2025-07-01: 0.40 + 2026-07-01: 0.42 REDUCED: 2015-07-01: 1.36 2016-07-01: 1.41 @@ -25,7 +26,8 @@ CONTIGUOUS_US: 2022-07-01: 1.81 2023-07-01: 1.98 2024-07-01: 2.07 - 2025-01-01: 2.16 + 2025-07-01: 2.16 + 2026-07-01: 2.24 FREE: 2015-07-01: 1.66 2016-07-01: 1.71 @@ -37,7 +39,8 @@ CONTIGUOUS_US: 2022-07-01: 2.11 2023-07-01: 2.28 2024-07-01: 2.37 - 2025-01-01: 2.46 + 2025-07-01: 2.46 + 2026-07-01: 2.54 AK: PAID: 2015-07-01: 0.43 @@ -50,7 +53,8 @@ AK: 2022-07-01: 0.54 2023-07-01: 0.58 2024-07-01: 0.60 - 2025-01-01: 0.62 + 2025-07-01: 0.62 + 2026-07-01: 0.64 REDUCED: 2015-07-01: 2.36 2016-07-01: 2.43 @@ -62,7 +66,8 @@ AK: 2022-07-01: 3.08 2023-07-01: 3.36 2024-07-01: 3.50 - 2025-01-01: 3.65 + 2025-07-01: 3.65 + 2026-07-01: 3.79 FREE: 2015-07-01: 2.66 2016-07-01: 2.73 @@ -74,7 +79,8 @@ AK: 2022-07-01: 3.38 2023-07-01: 3.66 2024-07-01: 3.80 - 2025-01-01: 3.95 + 2025-07-01: 3.95 + 2026-07-01: 4.09 HI: PAID: 2015-07-01: 0.33 @@ -87,7 +93,8 @@ HI: 2022-07-01: 0.40 2023-07-01: 0.47 2024-07-01: 0.49 - 2025-01-01: 0.51 + 2025-07-01: 0.51 + 2026-07-01: 0.52 REDUCED: 2015-07-01: 1.64 2016-07-01: 1.69 @@ -99,7 +106,8 @@ HI: 2022-07-01: 2.16 2023-07-01: 2.65 2024-07-01: 2.76 - 2025-01-01: 2.88 + 2025-07-01: 2.88 + 2026-07-01: 2.99 FREE: 2015-07-01: 1.94 2016-07-01: 1.99 @@ -111,7 +119,8 @@ HI: 2022-07-01: 2.46 2023-07-01: 2.95 2024-07-01: 3.06 - 2025-01-01: 3.18 + 2025-07-01: 3.18 + 2026-07-01: 3.29 metadata: unit: currency-USD @@ -138,10 +147,25 @@ metadata: href: https://www.federalregister.gov/documents/2024/07/10/2024-15175/national-school-lunch-special-milk-and-school-breakfast-programs-national-average-paymentsmaximum - title: National School Lunch, Special Milk, and School Breakfast Programs, National Average Payments/Maximum Reimbursement Rates - 2025 href: https://www.govinfo.gov/content/pkg/FR-2025-07-24/pdf/2025-13879.pdf#page=4 + - title: National School Lunch, Special Milk, and School Breakfast Programs, National Average Payments/Maximum Reimbursement Rates - 2026 + href: https://www.govinfo.gov/content/pkg/FR-2026-07-16/pdf/2026-14252.pdf#page=3 period: day label: School Breakfast Program value breakdown: - state_group - school_meal_tier - uprating: gov.bls.cpi.cpi_u + # Published rates remain fixed from July through June. After the last + # published school year, retain CPI-U as a projection proxy for USDA's + # Food Away From Home index, applying May-to-May changes only on July 1. + # Future CPI-U entries are annual forecast proxies, not observed May values. + # Projections compound rounded rates; USDA's unrounded bases are not modeled. + uprating: + parameter: gov.bls.cpi.cpi_u + at_defined_interval: + start: "0001-05-01" + end: "0002-05-01" + enactment: "0002-07-01" + rounding: + interval: 0.01 + type: downwards propagate_metadata_to_children: true diff --git a/policyengine_us/parameters/gov/usda/school_meals/state_covers_reduced_price_copay.yaml b/policyengine_us/parameters/gov/usda/school_meals/state_covers_reduced_price_copay.yaml new file mode 100644 index 00000000000..26ac4616a7b --- /dev/null +++ b/policyengine_us/parameters/gov/usda/school_meals/state_covers_reduced_price_copay.yaml @@ -0,0 +1,178 @@ +description: 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. +# Only North Carolina coverage is verified here. Other false entries preserve +# existing model behavior; they do not establish that a state has no coverage. +# Assume enrollment at a covered school participating in both meal programs. +metadata: + propagate_metadata_to_children: true + label: State covers reduced-price school meal copays + period: year + unit: bool + breakdown: + - state_code + reference: + - title: 7 CFR 245.2 - Definitions (reduced price meal) + href: https://www.law.cornell.edu/cfr/text/7/245.2 +AA: + 0000-01-01: false +AE: + 0000-01-01: false +AK: + 0000-01-01: false +AL: + 0000-01-01: false +AP: + 0000-01-01: false +AR: + 0000-01-01: false +AZ: + 0000-01-01: false +CA: + 0000-01-01: false +CO: + 0000-01-01: false +CT: + 0000-01-01: false +DC: + 0000-01-01: false +DE: + 0000-01-01: false +FL: + 0000-01-01: false +GA: + 0000-01-01: false +GU: + 0000-01-01: false +HI: + 0000-01-01: false +IA: + 0000-01-01: false +ID: + 0000-01-01: false +IL: + 0000-01-01: false +IN: + 0000-01-01: false +KS: + 0000-01-01: false +KY: + 0000-01-01: false +LA: + 0000-01-01: false +MA: + 0000-01-01: false +MD: + 0000-01-01: false +ME: + 0000-01-01: false +MI: + 0000-01-01: false +MN: + 0000-01-01: false +MO: + 0000-01-01: false +MP: + 0000-01-01: false +MS: + 0000-01-01: false +MT: + 0000-01-01: false +NC: + 0000-01-01: false + # North Carolina has covered the reduced-price breakfast copay since + # July 1, 2011 (S.L. 2011-342 § 1), subject to sufficient appropriations. + # This parameter is true only while the state also covers the lunch copay. + 2020-07-01: + value: true + metadata: + reference: + - title: North Carolina S.L. 2020-80 § 2.3.(b) (lunch, 2020-2021 school year) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2019-2020/SL2020-80.pdf#page=14 + - title: North Carolina S.L. 2011-342 § 1 (breakfast) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/HTML/2011-2012/SL2011-342.html + # No state law covered the lunch copay for the 2021-2022 school year. + 2021-07-01: false + 2022-07-01: + value: true + metadata: + reference: + - title: North Carolina S.L. 2022-74 § 7.3 (lunch, 2022-2023 school year) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2021-2022/SL2022-74.pdf#page=28 + - title: North Carolina S.L. 2011-342 § 1 (breakfast) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/HTML/2011-2012/SL2011-342.html + 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 + # S.L. 2025-89 § 2A.8, effective retroactively to July 1, 2025, repealed + # S.L. 2023-134 § 7.58 and added the standing requirement to G.S. 115C-264(a1). + # The mandate binds local boards of education operating school nutrition + # programs. The model assumes a covered public school; it does not distinguish + # charter/nonpublic sponsors or school participation (follow-up issue #9789). + 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 +ND: + 0000-01-01: false +NE: + 0000-01-01: false +NH: + 0000-01-01: false +NJ: + 0000-01-01: false +NM: + 0000-01-01: false +NV: + 0000-01-01: false +NY: + 0000-01-01: false +OH: + 0000-01-01: false +OK: + 0000-01-01: false +OR: + 0000-01-01: false +PA: + 0000-01-01: false +PR: + 0000-01-01: false +PW: + 0000-01-01: false +RI: + 0000-01-01: false +SC: + 0000-01-01: false +SD: + 0000-01-01: false +TN: + 0000-01-01: false +TX: + 0000-01-01: false +UT: + 0000-01-01: false +VA: + 0000-01-01: false +VI: + 0000-01-01: false +VT: + 0000-01-01: false +WA: + 0000-01-01: false +WI: + 0000-01-01: false +WV: + 0000-01-01: false +WY: + 0000-01-01: false diff --git a/policyengine_us/parameters/gov/usda/school_meals/state_universal_free_meals.yaml b/policyengine_us/parameters/gov/usda/school_meals/state_universal_free_meals.yaml index 0e0ab06ad5a..30aae9ee4c3 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/state_universal_free_meals.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/state_universal_free_meals.yaml @@ -103,10 +103,10 @@ MI: value: true metadata: reference: - - title: "Michigan PA 103 of 2023 (SB 0173) — School Aid Act § 31aa (MCL 388.1631aa)" + - title: "Michigan PA 103 of 2023 (SB 0173) — School Aid Act § 30d (MCL 388.1630d)" href: https://www.legislature.mi.gov/documents/2023-2024/publicact/htm/2023-PA-0103.htm - - title: "MCL 388.1631aa — Michigan School Meals" - href: https://www.legislature.mi.gov/Laws/MCL?objectName=mcl-388-1631aa + - title: "MCL 388.1630d — Michigan School Meals" + href: https://www.legislature.mi.gov/Laws/MCL?objectName=mcl-388-1630d MN: 0000-01-01: false 2023-07-01: @@ -141,10 +141,8 @@ NM: value: true metadata: reference: - - title: "New Mexico SB 4 (2023), Chapter 30 — Healthy Universal School Meals Act" - href: https://www.nmlegis.gov/Sessions/23%20Regular/final/SB0004.pdf - - title: "N.M. Stat. § 22-13D-3 — School meals" - href: https://law.justia.com/codes/new-mexico/chapter-22/article-13d/section-22-13d-3/ + - title: "N.M. Stat. § 22-13C-4(A) — Universal school meals for children (SB 4 (2023), Chapter 30, § 3)" + href: https://www.nmlegis.gov/Sessions/23%20Regular/final/SB0004.pdf#page=4 NV: 0000-01-01: false NY: diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index efe44de4602..f5ffc832e76 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -89,7 +89,7 @@ programs: status: complete name: Colorado Healthy School Meals for All effective: 2023-07-01 - reference: HB 22-1414 / Proposition FF (2022); C.R.S. § 22-82.9-101 et seq. + reference: HB 22-1414 / Proposition FF (2022); C.R.S. § 22-82.9-201 et seq. - state: MA status: complete name: Massachusetts universal meals @@ -104,17 +104,23 @@ programs: status: complete name: Michigan School Meals effective: 2023-07-01 - reference: PA 103 of 2023 (SB 0173); MCL 388.1631aa + reference: PA 103 of 2023 (SB 0173); MCL 388.1630d - state: MN status: complete name: Minnesota Free School Meals for Kids effective: 2023-07-01 reference: HF 5 (2023); Minn. Stat. § 124D.111 + - state: NC + status: complete + name: North Carolina reduced-price meal copay coverage + effective: 2020-07-01 + notes: Both-meal copay coverage in SY2020-21 and from SY2022-23 onward; the SY2021-22 state provision covers breakfast only. Assumes a covered school participating in both meal programs. + reference: G.S. 115C-264(a1) (S.L. 2025-89 § 2A.8); S.L. 2023-134 § 7.58; S.L. 2022-74 § 7.3; S.L. 2020-80 § 2.3.(b); S.L. 2011-342 § 1 - state: NM status: complete name: New Mexico Healthy Universal School Meals effective: 2023-07-01 - reference: SB 4 (2023), Chapter 30; N.M. Stat. § 22-13D-3 + reference: SB 4 (2023), Chapter 30, § 3; N.M. Stat. § 22-13C-4(A) - state: NY status: complete name: New York Universal Free School Meals diff --git a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/integration.yaml b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/integration.yaml index 65e41088af7..544d362c714 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/integration.yaml @@ -21,7 +21,7 @@ free_school_meals: 180 * (3.66 + 1.97 - 0.35 - 0.33) reduced_price_school_meals: 0 -# Test 2025 values +# Calendar 2025 reads the rates in force on January 1, 2025: SY 2024-25. - name: 2025 values test - Contiguous US FREE tier period: 2025 absolute_error_margin: 0.01 @@ -42,7 +42,7 @@ state_code: FL output: school_meal_tier: FREE - school_meal_daily_subsidy: 7.06 # NSLP 4.60 + SBP 2.46 (2025 rates) + school_meal_daily_subsidy: 6.80 # NSLP 4.43 + SBP 2.37 (SY 2024-25 rates) # High-income California household qualifies under the state universal meals policy. - name: California universal meals makes a high-income household FREE with no reduced-price subsidy. @@ -135,3 +135,66 @@ output: state_has_universal_free_school_meals: true school_meal_tier: FREE + +# North Carolina pays the reduced-price copay, so a household in the +# reduced-price income band gets the free-tier value. +- name: North Carolina household in the reduced-price income band gets free meals. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + # Full-time at $15 per hour: 2,080 hours * $15. + employment_income_before_lsr: 31_200 + child: + age: 10 + is_in_k12_school: true + spm_units: + spm_unit: + members: [parent, child] + meets_school_meal_categorical_eligibility: false + households: + household: + members: [parent, child] + state_code: NC + output: + # 31,200 / (15,650 + 5,500) = 1.475, between 130% and 185% of FPG. + school_meal_fpg_ratio: 1.475 + school_meal_tier: FREE + school_meal_daily_subsidy: 6.80 # NSLP 4.43 + SBP 2.37 (SY 2024-25 rates) + school_meal_paid_daily_subsidy: 0.81 # NSLP 0.42 + SBP 0.39 + # 180 days * (6.80 - 0.81 paid-tier subsidy) + free_school_meals: 1_078.20 + reduced_price_school_meals: 0 + +# The same household where the state does not cover the copay stays in the +# reduced tier, worth $0.70 less per day (the $0.40 lunch and $0.30 breakfast +# copays). +- name: Florida household in the reduced-price income band stays in the reduced tier. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + parent: + age: 35 + employment_income_before_lsr: 31_200 + child: + age: 10 + is_in_k12_school: true + spm_units: + spm_unit: + members: [parent, child] + meets_school_meal_categorical_eligibility: false + households: + household: + members: [parent, child] + state_code: FL + output: + school_meal_fpg_ratio: 1.475 + school_meal_tier: REDUCED + school_meal_daily_subsidy: 6.10 # NSLP 4.03 + SBP 2.07 (SY 2024-25 rates) + school_meal_paid_daily_subsidy: 0.81 # NSLP 0.42 + SBP 0.39 + free_school_meals: 0 + # 180 days * (6.10 - 0.81 paid-tier subsidy) + reduced_price_school_meals: 952.20 diff --git a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_daily_subsidy.yaml b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_daily_subsidy.yaml index 9fad61e7820..b87fbd82160 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_daily_subsidy.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_daily_subsidy.yaml @@ -12,10 +12,49 @@ output: school_meal_daily_subsidy: 3.66 + 1.97 -# Test 2025 values (effective January 1, 2025) +# Calendar 2025 reads the SY 2024-25 rates in force on January 1. - name: Contiguous US - 2025 FREE tier period: 2025 input: school_meal_tier: FREE output: - school_meal_daily_subsidy: 7.06 # NSLP 4.60 + SBP 2.46 + school_meal_daily_subsidy: 6.80 # NSLP 4.43 + SBP 2.37 (SY 2024-25 rates) + +# Annual periods read the rates in force at their start, so calendar 2026 uses +# SY 2025-26 and calendar 2027 uses SY 2026-27. Keep calendar-year test periods +# for compatibility with the annual variable and the core cache. +# NSLP under-60% rates plus SBP non-severe-need rates: +# https://www.govinfo.gov/content/pkg/FR-2025-07-24/pdf/2025-13879.pdf +# https://www.govinfo.gov/content/pkg/FR-2026-07-16/pdf/2026-14252.pdf +- name: Published SY 2025-26 rates apply in calendar 2026 across regions and tiers. + period: 2026 + absolute_error_margin: 0.001 + input: + state_code: [NC, NC, NC, AK, AK, AK, HI, HI, HI] + school_meal_tier: [FREE, REDUCED, PAID, FREE, REDUCED, PAID, FREE, REDUCED, PAID] + output: + school_meal_daily_subsidy: [7.06, 6.36, 0.84, 11.40, 10.70, 1.33, 9.16, 8.46, 1.08] + +- name: Published SY 2026-27 rates stay fixed in calendar 2027. + period: 2027 + absolute_error_margin: 0.001 + input: + state_code: [NC, NC, NC, AK, AK, AK, HI, HI, HI] + school_meal_tier: [FREE, REDUCED, PAID, FREE, REDUCED, PAID, FREE, REDUCED, PAID] + output: + school_meal_daily_subsidy: [7.30, 6.60, 0.87, 11.81, 11.11, 1.38, 9.48, 8.78, 1.11] + +# The standard uprater first projects rates on July 1, 2027, so calendar 2028 +# uses the CPI-U proxy ratio 340.3 / 333.979. Round each meal and tier down +# separately to cents. These are model projections, not published USDA rates. +# Contiguous FREE: floor(4.76 * ratio * 100) / 100 + +# floor(2.54 * ratio * 100) / 100 = 4.85 + 2.58 = 7.43. +# Contiguous REDUCED: 4.44 + 2.28 = 6.72; PAID: 0.45 + 0.42 = 0.87. +- name: Calendar 2028 uses standard CPI-U projections rounded down by meal and tier. + period: 2028 + absolute_error_margin: 0.001 + input: + state_code: [NC, NC, NC, AK, AK, AK, HI, HI, HI] + school_meal_tier: [FREE, REDUCED, PAID, FREE, REDUCED, PAID, FREE, REDUCED, PAID] + output: + school_meal_daily_subsidy: [7.43, 6.72, 0.87, 12.02, 11.31, 1.40, 9.65, 8.93, 1.12] diff --git a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_net_subsidy.yaml b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_net_subsidy.yaml index 88706ba4ed5..9c84098ffc7 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_net_subsidy.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_net_subsidy.yaml @@ -3,6 +3,22 @@ output: school_meal_net_subsidy: 0 +- name: Colorado adult-only household has a free tier but receives no school-meal benefit. + period: 2025 + absolute_error_margin: 0.01 + input: + age: 49 + state_code: CO + school_meal_countable_income: 0 + output: + is_in_k12_school: false + school_meal_tier: FREE + # Annual 2025 uses SY 2024-25 NSLP 4.43 + SBP 2.37. + school_meal_daily_subsidy: 6.80 + school_meal_net_subsidy: 0 + free_school_meals: 0 + reduced_price_school_meals: 0 + - name: One child in contiguous US with free tier. period: 2022 input: diff --git a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_paid_daily_subsidy.yaml b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_paid_daily_subsidy.yaml index fa665d8a3a7..8a7333d9183 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_paid_daily_subsidy.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_paid_daily_subsidy.yaml @@ -2,3 +2,32 @@ period: 2022 output: school_meal_paid_daily_subsidy: 0.35 + 0.33 + +# Calendar 2025 reads the SY 2024-25 rates in force on January 1, 2025: +# under-60% NSLP and non-severe-need SBP. +# https://www.federalregister.gov/documents/2024/07/10/2024-15175/national-school-lunch-special-milk-and-school-breakfast-programs-national-average-paymentsmaximum +- name: Contiguous US paid subsidy uses the under-60-percent lunch rate in 2025. + period: 2025 + absolute_error_margin: 0.01 + input: + state_code: NC + output: + school_meal_paid_daily_subsidy: 0.81 # 0.42 NSLP + 0.39 SBP + +# The published July rates continue through the following June; see the +# Federal Register sources in school_meal_daily_subsidy.yaml. +- name: Calendar 2026 paid reimbursements use published SY 2025-26 rates. + period: 2026 + absolute_error_margin: 0.001 + input: + state_code: [NC, AK, HI] + output: + school_meal_paid_daily_subsidy: [0.84, 1.33, 1.08] + +- name: Calendar 2027 paid reimbursements use published SY 2026-27 rates. + period: 2027 + absolute_error_margin: 0.001 + input: + state_code: [NC, AK, HI] + output: + school_meal_paid_daily_subsidy: [0.87, 1.38, 1.11] diff --git a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_tier.yaml b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_tier.yaml index 7be72b0dead..ae2ade7029d 100644 --- a/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_tier.yaml +++ b/policyengine_us/tests/policy/baseline/gov/usda/school_meals/school_meal_tier.yaml @@ -38,3 +38,108 @@ state_has_universal_free_school_meals: true output: school_meal_tier: FREE + +# North Carolina pays the reduced-price copay (G.S. 115C-264(a1)), so +# students who qualify for reduced-price meals eat at no cost. +- name: North Carolina assigns the free tier to the reduced-price income band. + period: 2026 + input: + state_code: NC + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 1.8 + output: + school_meal_tier: FREE + +- name: North Carolina students above 185% of FPG still pay full price. + period: 2026 + input: + state_code: NC + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 2 + output: + school_meal_tier: PAID + +- name: A state that does not cover the reduced-price copay keeps the reduced tier. + period: 2026 + input: + state_code: FL + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 1.8 + output: + school_meal_tier: REDUCED + +# North Carolina covered the lunch copay for the 2020-2021 school year +# (S.L. 2020-80 § 2.3.(b)), had no provision for 2021-2022, and has covered +# it again since July 1, 2022 (S.L. 2022-74 § 7.3). +- name: North Carolina did not cover the lunch copay at the start of 2020. + period: 2020 + input: + state_code: NC + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 1.8 + output: + school_meal_tier: REDUCED + +- name: North Carolina covered the lunch copay for the 2020-2021 school year. + period: 2021 + input: + state_code: NC + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 1.8 + output: + school_meal_tier: FREE + +- name: North Carolina had no lunch copay provision for the 2021-2022 school year. + period: 2022 + input: + state_code: NC + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 1.8 + output: + school_meal_tier: REDUCED + +- name: North Carolina covered the lunch copay again for the 2022-2023 school year. + period: 2023 + input: + state_code: NC + meets_school_meal_categorical_eligibility: false + school_meal_fpg_ratio: 1.8 + output: + school_meal_tier: FREE + +# Threshold edge: 185% of the 2026 guideline for two people is +# 1.85 * (15,960 + 5,680) = 40,034. In North Carolina that line is now the +# boundary between free and full price. +- name: North Carolina household exactly at 185% of FPG is free. + period: 2026 + input: + people: + person1: {age: 35, employment_income_before_lsr: 40_034} + person2: {age: 10} + spm_units: + spm_unit: + members: [person1, person2] + meets_school_meal_categorical_eligibility: false + households: + household: + members: [person1, person2] + state_code: NC + output: + school_meal_tier: FREE + +- name: North Carolina household one dollar above 185% of FPG pays full price. + period: 2026 + input: + people: + person1: {age: 35, employment_income_before_lsr: 40_035} + person2: {age: 10} + spm_units: + spm_unit: + members: [person1, person2] + meets_school_meal_categorical_eligibility: false + households: + household: + members: [person1, person2] + state_code: NC + output: + school_meal_tier: PAID diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ca.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ca.yaml index a2481a4ea57..fdc4f3bc277 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ca.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ca.yaml @@ -1,10 +1,11 @@ -# California universal free school meals (Cal. Educ. Code sec. 49501.5, -# effective 2022-07-01): all students receive the FREE tier regardless of -# household income. Same household is PAID (0.87) under federal-only rules -# (see federal.yaml paid-tier case). +# California universal school meals (Cal. Educ. Code sec. 49501.5). +# https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?lawCode=EDC§ionNum=49501.5 +# Assume a public school participating in both meal programs and the state +# program. Calendar 2026 uses published SY 2025-26 reimbursement rates; +# see federal.yaml for the sources and annual-period assumptions. - name: school_meals_universal_free_meals_above_185pct (ca) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -53,10 +54,20 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: - # 50,700 / 27,320 = 185.6% FPG (> 185%, PAID on income), but CA's - # universal-meals policy forces FREE. - # FREE = (NSLP 4.60 + SBP 2.46) uprated to 2026 = 7.15. - school_meal_daily_subsidy: 7.15 + # 50,700 / 27,320 = 185.6% FPG: above the federal reduced-price + # threshold, with no categorical route. State coverage makes both + # meals free at the child's participating public school. + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: true + school_meal_countable_income: 50_700 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + # (Combined FREE - PAID) x one enrolled child x 180 modeled days. + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/co.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/co.yaml index ef91464ee40..270aaf86681 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/co.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/co.yaml @@ -1,10 +1,11 @@ -# Colorado Healthy School Meals for All (C.R.S. sec. 22-82.9-101 et seq., -# effective 2023-07-01): all students receive the FREE tier regardless of -# household income. Same household is PAID (0.87) under federal-only rules -# (see federal.yaml paid-tier case). +# Colorado Healthy School Meals for All (C.R.S. sec. 22-82.9-201 et seq.). +# https://leg.colorado.gov/sites/default/files/images/olls/crs2024-title-22.pdf#page=1332 +# Assume a public school participating in both meal programs and the state +# program. Calendar 2026 uses published SY 2025-26 reimbursement rates; +# see federal.yaml for the sources and annual-period assumptions. - name: school_meals_universal_free_meals_above_185pct (co) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -53,10 +54,20 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: - # 50,700 / 27,320 = 185.6% FPG (> 185%, PAID on income), but CO's - # universal-meals policy forces FREE. - # FREE = (NSLP 4.60 + SBP 2.46) uprated to 2026 = 7.15. - school_meal_daily_subsidy: 7.15 + # 50,700 / 27,320 = 185.6% FPG: above the federal reduced-price + # threshold, with no categorical route. State coverage makes both + # meals free at the child's participating public school. + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: true + school_meal_countable_income: 50_700 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + # (Combined FREE - PAID) x one enrolled child x 180 modeled days. + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/federal.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/federal.yaml index ebb24ea7c77..2dabaf79dda 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/federal.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/federal.yaml @@ -1,15 +1,35 @@ # School meals (NSLP + SBP) federal edge cases. -# Tier thresholds (gov/usda/school_meals/income/limit): FREE <= 130% FPG, -# REDUCED <= 185% FPG, else PAID; categorical routes (7 CFR 245.2) and state -# universal-meals policies force FREE. +# Each child attends a school participating in both meal programs. The model +# assigns one combined tier and values one breakfast plus one lunch per school +# day; it does not model the school's menu prices or actual family cash savings. +# Annual tests retain calendar-year FPG thresholds and January 1 rate lookup. # 2026 FPG (3-person, contiguous US) = 15,960 + 2 x 5,680 = 27,320. -# 130% = 35,516; 185% = 50,542. -# 2026 daily subsidies (CONTIGUOUS_US, 2025-01-01 published rates CPI-uprated -# by ~1.0134): FREE = (4.60 + 2.46) x 1.0134 = 7.15; -# REDUCED = (4.20 + 2.16) x 1.0134 = 6.45; PAID = (0.46 + 0.40) x 1.0134 = 0.87. +# FREE <= 130% = 35,516; REDUCED <= 185% = 50,542; otherwise PAID, +# unless categorical eligibility or state coverage makes both meals free. +# Calendar 2026 uses the published SY 2025-26 rates in force on January 1: +# NSLP (<60% free/reduced) plus SBP (non-severe-need), with no CPI adjustment. +# FREE = 4.60 + 2.46 = 7.06; +# REDUCED = 4.20 + 2.16 = 6.36; PAID = 0.44 + 0.40 = 0.84. +# Annual net benefits subtract the PAID subsidy and use one child x 180 days. +# Published base rates (pages 3, 4): +# https://www.govinfo.gov/content/pkg/FR-2025-07-24/pdf/2025-13879.pdf +# 2025 uses July 2024 base rates (page 4): +# https://www.govinfo.gov/content/pkg/FR-2024-07-10/pdf/2024-15175.pdf +# Use MO for federal reduced-price scenarios: TX covers breakfast copays and, +# from September 2025, lunch copays. That TX coverage is not yet modeled. +# https://squaremeals.org/Programs/School-Breakfast-Program/Reduced-Price-School-Meals-Now-Free +# These MO fixtures assume a participating school without CEP or another +# schoolwide subsidy. District sources match the January 1 school year: +# Rockwood's SY 2025-26 free/reduced policy (Ellisville 63011, calendar 2026): +# https://www.rsdmo.org/news/article/~board/rsd/post/free-and-reduced-meal-applications-available-for-2025-2026-school-year +# Mount Vernon's SY 2024-25 meal program/prices (65712, calendar 2025): +# https://www.mtvernon.k12.mo.us/apps/news/article/1943811 +# These dated sources establish the district/program context, not exact +# historical reduced-price charges. Expected benefits use the federal +# reimbursement differences above, not district menu prices or cash savings. - name: school_meals_free_tier_just_below_130pct (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -58,17 +78,23 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: # 35,500 / 27,320 = 129.9% <= 130% -> FREE on the income route # (SNAP also fires here via TX BBCE, so FREE is dual-caused; the # income-only boundary is pinned by the MO SNAP-blocked cases below). - # FREE = (NSLP 4.60 + SBP 2.46) uprated = 7.15. - school_meal_daily_subsidy: 7.15 + # FREE = (NSLP 4.60 + SBP 2.46) = 7.06. + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0.00 - name: school_meals_free_tier_exactly_at_130pct_snap_blocked (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -103,8 +129,8 @@ household: members: [head, spouse, child1] state_code: MO - zip_code: '64106' - county_str: JACKSON_COUNTY_MO + zip_code: '63011' + county_str: ST_LOUIS_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] @@ -121,17 +147,25 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false # 35,516 / 27,320 = exactly 1.30; the tier formula uses <=, so # at-threshold resolves to FREE. SNAP = 0 (assets over limit, # no BBCE in MO), so this pins the pure income route inclusively. - # FREE = (NSLP 4.60 + SBP 2.46) uprated = 7.15. - school_meal_daily_subsidy: 7.15 + # FREE = (NSLP 4.60 + SBP 2.46) = 7.06. + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0.00 - name: school_meals_reduced_tier_onset_just_above_130pct_snap_blocked (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -165,8 +199,8 @@ household: members: [head, spouse, child1] state_code: MO - zip_code: '64106' - county_str: JACKSON_COUNTY_MO + zip_code: '63011' + county_str: ST_LOUIS_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] @@ -183,15 +217,23 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false # 35,700 / 27,320 = 130.7% > 130% and <= 185% -> REDUCED; SNAP = 0. - # REDUCED = (NSLP 4.20 + SBP 2.16) uprated = 6.45. - school_meal_daily_subsidy: 6.45 + # REDUCED = (NSLP 4.20 + SBP 2.16) = 6.36. + school_meal_daily_subsidy: 6.36 school_meal_tier: 1 # REDUCED + school_meal_net_subsidy: 993.60 + free_school_meals: 0.00 + reduced_price_school_meals: 993.60 - name: school_meals_categorical_free_via_snap_just_above_130pct (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -240,17 +282,24 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: true # 35,600 / 27,320 = 130.3% > 130% on income, but the household # receives SNAP (TX BBCE gross limit 165% FPG; snap ~ 1,687/yr), # and SNAP receipt confers free meals categorically (7 CFR 245.2). - # FREE = (NSLP 4.60 + SBP 2.46) uprated = 7.15. - school_meal_daily_subsidy: 7.15 + # FREE = (NSLP 4.60 + SBP 2.46) = 7.06. + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0.00 - name: school_meals_reduced_tier_exactly_at_185pct (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -280,9 +329,9 @@ households: household: members: [head, spouse, child1] - state_code: TX - zip_code: '75201' - county_str: DALLAS_COUNTY_TX + state_code: MO + zip_code: '63011' + county_str: ST_LOUIS_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] @@ -299,16 +348,24 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false # 50,542 / 27,320 = exactly 1.85; the formula uses <=, so # at-threshold resolves to REDUCED (not PAID). SNAP/TANF = 0 at - # this income. REDUCED = (NSLP 4.20 + SBP 2.16) uprated = 6.45. - school_meal_daily_subsidy: 6.45 + # this income. REDUCED = (NSLP 4.20 + SBP 2.16) = 6.36. + school_meal_daily_subsidy: 6.36 school_meal_tier: 1 # REDUCED + school_meal_net_subsidy: 993.60 + free_school_meals: 0.00 + reduced_price_school_meals: 993.60 - name: school_meals_paid_tier_just_above_185pct (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -338,9 +395,9 @@ households: household: members: [head, spouse, child1] - state_code: TX - zip_code: '75201' - county_str: DALLAS_COUNTY_TX + state_code: MO + zip_code: '63011' + county_str: ST_LOUIS_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] @@ -357,16 +414,24 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false # 50,700 / 27,320 = 185.6% > 185% -> PAID (income-route ineligible # boundary; PAID still carries the small federal reimbursement). - # PAID = (NSLP 0.46 + SBP 0.40) uprated = 0.87. - school_meal_daily_subsidy: 0.87 + # PAID = (NSLP 0.44 + SBP 0.40) = 0.84. + school_meal_daily_subsidy: 0.84 school_meal_tier: 2 # PAID + school_meal_net_subsidy: 0.00 + free_school_meals: 0.00 + reduced_price_school_meals: 0.00 - name: school_meals_countable_income_direct_input_reduced (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -396,14 +461,14 @@ households: household: members: [head, spouse, child1] - state_code: TX - zip_code: '75201' - county_str: DALLAS_COUNTY_TX + state_code: MO + zip_code: '63011' + county_str: ST_LOUIS_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] - # Partners send this aggregate directly; it must override the - # income derived from employment (60,000 would otherwise be PAID). + # The partner-supplied aggregate must override income calculated from + # individual inputs: $60,000 of wages would otherwise yield PAID. school_meal_countable_income: 50_500 tax_units: tax_unit: @@ -418,16 +483,24 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: - # Direct input wins: 50,500 / 27,320 = 184.8% <= 185% -> REDUCED, - # even though employment income alone (60,000 = 219.6%) implies PAID. - # REDUCED = (NSLP 4.20 + SBP 2.16) uprated = 6.45. - school_meal_daily_subsidy: 6.45 + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false + # 50,500 / 27,320 = 184.8% <= 185% -> REDUCED because the + # reported aggregate overrides the $60,000 derived from wages. + # REDUCED = (NSLP 4.20 + SBP 2.16) = 6.36. + school_meal_daily_subsidy: 6.36 school_meal_tier: 1 # REDUCED + school_meal_net_subsidy: 993.60 + free_school_meals: 0.00 + reduced_price_school_meals: 993.60 - name: school_meals_categorical_free_via_homeless_above_185pct (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -477,16 +550,23 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: true # 60,000 / 27,320 = 219.6% FPG (PAID on income), but homelessness is # a categorical free-meal route (7 CFR 245.2), overriding income. - # FREE = (NSLP 4.60 + SBP 2.46) uprated = 7.15. - school_meal_daily_subsidy: 7.15 + # FREE = (NSLP 4.60 + SBP 2.46) = 7.06. + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE -- name: school_meals_negative_self_employment_income_free (federal) + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0.00 +- name: school_meals_low_wages_with_business_loss_free (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -536,18 +616,22 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: - # Self-employment losses offset wages in the countable-income sources - # (7 CFR 273.9(b)): 20,000 - 25,000 = -5,000 earnings; TANF (~5,016, - # itself a countable source) brings the total to ~16, so the FPG - # ratio is ~0 -> FREE; SNAP/TANF receipt also confers FREE - # categorically. FREE = (NSLP 4.60 + SBP 2.46) uprated = 7.15. - school_meal_daily_subsidy: 7.15 + # A family with $20,000 wages and a business loss qualifies for free + # meals even without offsetting wages by the loss. This case checks + # its FREE outcome, not the treatment of losses in countable income. + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0.00 - name: school_meals_2025_reduced_tier_just_below_185pct (federal) period: 2025 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -577,9 +661,9 @@ households: household: members: [head, spouse, child1] - state_code: TX - zip_code: '75201' - county_str: DALLAS_COUNTY_TX + state_code: MO + zip_code: '65712' + county_str: LAWRENCE_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] @@ -596,16 +680,24 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false # 2025 FPG(3) = 15,650 + 2 x 5,500 = 26,650; 185% = 49,302.50. - # 49,200 / 26,650 = 184.6% -> REDUCED. 2025 uses published rates - # (no uprating): REDUCED = NSLP 4.20 + SBP 2.16 = 6.36. - school_meal_daily_subsidy: 6.36 + # 49,200 / 26,650 = 184.6% -> REDUCED. 2025 reads the SY 2024-25 + # rates in force on January 1: REDUCED = NSLP 4.03 + SBP 2.07 = 6.10. + school_meal_daily_subsidy: 6.10 school_meal_tier: 1 # REDUCED + school_meal_net_subsidy: 952.20 + free_school_meals: 0.00 + reduced_price_school_meals: 952.20 - name: school_meals_2025_paid_tier_just_above_185pct (federal) period: 2025 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -635,9 +727,9 @@ households: household: members: [head, spouse, child1] - state_code: TX - zip_code: '75201' - county_str: DALLAS_COUNTY_TX + state_code: MO + zip_code: '65712' + county_str: LAWRENCE_COUNTY_MO spm_units: spm_unit: members: [head, spouse, child1] @@ -654,15 +746,23 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: - # 49,400 / 26,650 = 185.4% > 185% -> PAID. 2025 published rates: - # PAID = NSLP 0.46 + SBP 0.40 = 0.86. - school_meal_daily_subsidy: 0.86 + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false + # 49,400 / 26,650 = 185.4% > 185% -> PAID. 2025 reads the SY 2024-25 + # rates in force on January 1: PAID = NSLP 0.42 + SBP 0.39 = 0.81. + school_meal_daily_subsidy: 0.81 school_meal_tier: 2 # PAID + school_meal_net_subsidy: 0.00 + free_school_meals: 0.00 + reduced_price_school_meals: 0.00 - name: school_meals_ak_free_tier_higher_reimbursement (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -711,11 +811,18 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: # AK uses its own FPG and reimbursement schedule: AK FPG(3) = # 19,950 + 2 x 7,100 = 34,150; 40,000 / 34,150 = 117.1% <= 130% - # -> FREE. AK FREE = (NSLP 7.45 + SBP 3.95) x 1.0134 uprating - # = 11.40 x 1.0235 = 11.67 (vs 7.15 in the contiguous US). - school_meal_daily_subsidy: 11.67 + # -> FREE. The July 2025 rates remain in force on January 1, 2026: + # AK FREE = NSLP 7.45 + SBP 3.95 = 11.40 (vs 7.06 contiguous US). + # Net annual value = (11.40 - 1.33) x 180 = 1,812.60. + school_meal_daily_subsidy: 11.40 school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1812.60 + free_school_meals: 1812.60 + reduced_price_school_meals: 0.00 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ma.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ma.yaml index 899ae75f7dd..094cb5d0f86 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ma.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/ma.yaml @@ -1,10 +1,11 @@ -# Massachusetts universal free school meals (Ch. 28 of the Acts of 2023, -# effective 2023-07-01): all students receive the FREE tier regardless of -# household income. Same household is PAID (0.87) under federal-only rules -# (see federal.yaml paid-tier case). +# Massachusetts universal school meals (Ch. 28 of the Acts of 2023). +# https://malegislature.gov/Laws/SessionLaws/Acts/2023/Chapter28 +# Assume a public school participating in both meal programs and the state +# program. Calendar 2026 uses published SY 2025-26 reimbursement rates; +# see federal.yaml for the sources and annual-period assumptions. - name: school_meals_universal_free_meals_above_185pct (ma) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -53,10 +54,20 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: - # 50,700 / 27,320 = 185.6% FPG (> 185%, PAID on income), but MA's - # universal-meals policy forces FREE. - # FREE = (NSLP 4.60 + SBP 2.46) uprated to 2026 = 7.15. - school_meal_daily_subsidy: 7.15 + # 50,700 / 27,320 = 185.6% FPG: above the federal reduced-price + # threshold, with no categorical route. State coverage makes both + # meals free at the child's participating public school. + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: true + school_meal_countable_income: 50_700 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 # FREE + # (Combined FREE - PAID) x one enrolled child x 180 modeled days. + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/nc.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/nc.yaml new file mode 100644 index 00000000000..81a1556db8d --- /dev/null +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/nc.yaml @@ -0,0 +1,207 @@ +# North Carolina covers both reduced-price breakfast and lunch copays. +# These households have no categorical free-meal route. Assume the child +# attends a public school offering both programs, outside CEP/other schoolwide +# free-meal arrangements. NC's copay coverage does not extend above 185% FPG. +# N.C. Gen. Stat. 115C-264(a1), from July 2025: +# https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_115C/GS_115C-264.html +# Earlier coverage: S.L. 2023-134 sec. 7.58 (page 119). +# https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119 +# The combined FREE tier represents no family copay. Its subsidy is the model's +# valuation, not an estimate of NC's spending: one breakfast plus one lunch, +# less the PAID-tier reimbursement, for one enrolled child and 180 school days. +# See federal.yaml for annual-period assumptions and federal rate sources. +- name: school_meals_copay_coverage_exactly_at_185pct (nc) + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 35 + is_tax_unit_head: true + is_tax_unit_spouse: false + is_tax_unit_dependent: false + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 50_542 + spouse: + age: 33 + is_tax_unit_head: false + is_tax_unit_spouse: true + is_tax_unit_dependent: false + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 0 + child1: + age: 8 + is_tax_unit_head: false + is_tax_unit_spouse: false + is_tax_unit_dependent: true + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 0 + households: + household: + members: [head, spouse, child1] + state_code: NC + zip_code: '27613' + county_str: WAKE_COUNTY_NC + spm_units: + spm_unit: + members: [head, spouse, child1] + tax_units: + tax_unit: + members: [head, spouse, child1] + tax_unit_is_joint: true + families: + family: + members: [head, spouse, child1] + marital_units: + mu_couple: + members: [head, spouse] + mu_child1: + members: [child1] + output: + people: + child1: + is_in_k12_school: true + spm_units: + spm_unit: + # 50,542 / 27,320 = 185% FPG. Federal REDUCED becomes FREE in NC. + school_meal_countable_income: 50_542 + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false + school_meal_daily_subsidy: 7.06 + school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0 +- name: school_meals_paid_above_copay_coverage_limit (nc) + period: 2026 + absolute_error_margin: 0.01 + input: + people: + head: + age: 35 + is_tax_unit_head: true + is_tax_unit_spouse: false + is_tax_unit_dependent: false + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 50_700 + spouse: + age: 33 + is_tax_unit_head: false + is_tax_unit_spouse: true + is_tax_unit_dependent: false + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 0 + child1: + age: 8 + is_tax_unit_head: false + is_tax_unit_spouse: false + is_tax_unit_dependent: true + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 0 + households: + household: + members: [head, spouse, child1] + state_code: NC + zip_code: '27613' + county_str: WAKE_COUNTY_NC + spm_units: + spm_unit: + members: [head, spouse, child1] + tax_units: + tax_unit: + members: [head, spouse, child1] + tax_unit_is_joint: true + families: + family: + members: [head, spouse, child1] + marital_units: + mu_couple: + members: [head, spouse] + mu_child1: + members: [child1] + output: + people: + child1: + is_in_k12_school: true + spm_units: + spm_unit: + # 50,700 / 27,320 > 185% FPG. No copay coverage or categorical route. + school_meal_countable_income: 50_700 + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false + school_meal_daily_subsidy: 0.84 + school_meal_tier: 2 # PAID + school_meal_net_subsidy: 0.00 + free_school_meals: 0.00 + reduced_price_school_meals: 0 +- name: school_meals_2025_copay_coverage_below_185pct (nc) + period: 2025 + absolute_error_margin: 0.01 + input: + people: + head: + age: 35 + is_tax_unit_head: true + is_tax_unit_spouse: false + is_tax_unit_dependent: false + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 49_200 + spouse: + age: 33 + is_tax_unit_head: false + is_tax_unit_spouse: true + is_tax_unit_dependent: false + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 0 + child1: + age: 8 + is_tax_unit_head: false + is_tax_unit_spouse: false + is_tax_unit_dependent: true + is_disabled: false + immigration_status_str: CITIZEN + employment_income_before_lsr: 0 + households: + household: + members: [head, spouse, child1] + state_code: NC + zip_code: '27613' + county_str: WAKE_COUNTY_NC + spm_units: + spm_unit: + members: [head, spouse, child1] + tax_units: + tax_unit: + members: [head, spouse, child1] + tax_unit_is_joint: true + families: + family: + members: [head, spouse, child1] + marital_units: + mu_couple: + members: [head, spouse] + mu_child1: + members: [child1] + output: + people: + child1: + is_in_k12_school: true + spm_units: + spm_unit: + # 49,200 / 26,650 = 184.6% FPG. Both reduced-price copays are covered. + school_meal_countable_income: 49_200 + meets_school_meal_categorical_eligibility: false + state_has_universal_free_school_meals: false + school_meal_daily_subsidy: 6.80 + school_meal_tier: 0 # FREE + school_meal_net_subsidy: 1078.20 + free_school_meals: 1078.20 + reduced_price_school_meals: 0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/co.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/co.yaml index 6d6b3e805ae..806a403604f 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/co.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/co.yaml @@ -1,3 +1,6 @@ +# School-meal daily subsidy is the combined breakfast/lunch valuation per +# enrolled child. Calendar 2026 uses published SY 2025-26 rates: $4.60 + $2.46; +# see edge_cases/federal/nutrition/school_meals/federal.yaml for sources. # Signature-fidelity fix (2026-07-04): state_code added on each household per # analytics (every MFB state-output request sends the state_code enum); # employment_income / self_employment_income / capital_gains converted to the @@ -212,7 +215,7 @@ spm_unit: co_tanf: 8136.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_16 (13 reqs, +8 dupes) @@ -410,7 +413,7 @@ spm_unit: co_tanf: 8136.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_26 (9 reqs) period: 2026 @@ -611,7 +614,7 @@ spm_unit: co_tanf: 8136.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_92 (3 reqs, +1 dupes) @@ -898,7 +901,7 @@ spm_unit: co_tanf: 8136.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_124 (2 reqs, +1 dupes) @@ -1100,5 +1103,5 @@ spm_unit: co_tanf: 8136.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/il.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/il.yaml index 29d18177676..46ba76b339f 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/il.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/il.yaml @@ -1,3 +1,6 @@ +# School-meal daily subsidy is the combined breakfast/lunch valuation per +# enrolled child. Calendar 2026 uses published SY 2025-26 rates: $4.60 + $2.46; +# see edge_cases/federal/nutrition/school_meals/federal.yaml for sources. # Signature-fidelity fix (2026-07-04): state_code added on each household per # analytics (every MFB state-output request sends the state_code enum); # employment_income / self_employment_income / capital_gains converted to the @@ -265,7 +268,7 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_71 (4 reqs) @@ -516,7 +519,7 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_102 (2 reqs) @@ -771,7 +774,7 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_131 (1 reqs, +1 dupes) period: 2026 @@ -1021,7 +1024,7 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_145 (1 reqs) period: 2026 @@ -1275,7 +1278,7 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_170 (1 reqs) period: 2026 @@ -1525,7 +1528,7 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_180 (1 reqs) period: 2026 @@ -1775,6 +1778,6 @@ il_liheap_income_eligible: true il_tanf: 11319.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/ma.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/ma.yaml index 402f32777ce..41202c6cace 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/ma.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/ma.yaml @@ -1,3 +1,6 @@ +# School-meal daily subsidy is the combined breakfast/lunch valuation per +# enrolled child. Calendar 2026 uses published SY 2025-26 rates: $4.60 + $2.46; +# see edge_cases/federal/nutrition/school_meals/federal.yaml for sources. # Signature-fidelity fix (2026-07-04): state_code added on each household per # analytics (every MFB state-output request sends the state_code enum); # employment_income / self_employment_income / capital_gains converted to the @@ -243,7 +246,7 @@ ma_eaedc: 0.0 ma_liheap: 0.0 ma_tafdc: 13516.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_55 (4 reqs) @@ -476,7 +479,7 @@ ma_eaedc: 0.0 ma_liheap: 716.0 ma_tafdc: 13516.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_111 (2 reqs, +1 dupes) @@ -706,7 +709,7 @@ ma_eaedc: 0.0 ma_liheap: 0.0 ma_tafdc: 13516.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_122 (2 reqs) period: 2026 @@ -939,7 +942,7 @@ ma_eaedc: 0.0 ma_liheap: 0.0 ma_tafdc: 13516.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_174 (1 reqs) @@ -1173,5 +1176,5 @@ ma_eaedc: 0.0 ma_liheap: 0.0 ma_tafdc: 13516.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/nc.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/nc.yaml index 0d2f63fc0b0..876dae641fa 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/nc.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/nc.yaml @@ -1,3 +1,6 @@ +# School-meal daily subsidy is the combined breakfast/lunch valuation per +# enrolled child. Calendar 2026 uses published SY 2025-26 rates: $4.60 + $2.46; +# see edge_cases/federal/nutrition/school_meals/federal.yaml for sources. # Signature-fidelity fix (2026-07-04): state_code added on each household per # analytics (every MFB state-output request sends the state_code enum); # employment_income / self_employment_income / capital_gains converted to the @@ -194,7 +197,7 @@ lifeline: 111.0 nc_scca_maximum_payment: 16932.0 nc_tanf: 1564.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_49 (5 reqs, +9 dupes) @@ -375,7 +378,7 @@ lifeline: 111.0 nc_scca_maximum_payment: 16932.0 nc_tanf: 1564.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_94 (3 reqs, +5 dupes) period: 2026 @@ -559,7 +562,7 @@ lifeline: 111.0 nc_scca_maximum_payment: 16932.0 nc_tanf: 1564.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 - name: signature_140 (1 reqs) @@ -740,7 +743,7 @@ lifeline: 111.0 nc_scca_maximum_payment: 16932.0 nc_tanf: 1564.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 - name: signature_172 (1 reqs, +1 dupes) period: 2026 @@ -924,6 +927,6 @@ lifeline: 111.0 nc_scca_maximum_payment: 16932.0 nc_tanf: 1564.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 diff --git a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/tx.yaml b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/tx.yaml index ca546c87b4d..c182ee689d6 100644 --- a/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/tx.yaml +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/signatures/tx.yaml @@ -1,3 +1,6 @@ +# School-meal daily subsidy is the combined breakfast/lunch valuation per +# enrolled child. Calendar 2026 uses published SY 2025-26 rates: $4.60 + $2.46; +# see edge_cases/federal/nutrition/school_meals/federal.yaml for sources. # Signature-fidelity fix (2026-07-04): state_code added on each household per # analytics (every MFB state-output request sends the state_code enum); # employment_income / self_employment_income / capital_gains converted to the @@ -268,7 +271,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 tanf: 0.0 @@ -521,7 +524,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 tanf: 0.0 @@ -774,7 +777,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 tanf: 0.0 tx_ccs: 3335.28 @@ -1026,7 +1029,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 tanf: 0.0 tx_ccs: 3335.28 @@ -1278,7 +1281,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 snap: 12015.0 tanf: 0.0 @@ -1531,7 +1534,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 tanf: 0.0 tx_ccs: 3335.28 @@ -1787,7 +1790,7 @@ spm_units: spm_unit: lifeline: 153.0 - school_meal_daily_subsidy: 7.15 + school_meal_daily_subsidy: 7.06 school_meal_tier: 0 tanf: 0.0 tx_ccs: 3335.28 diff --git a/policyengine_us/tests/policy/baseline/partners/my_friend_ben/2025.yaml b/policyengine_us/tests/policy/baseline/partners/my_friend_ben/2025.yaml index 0dec7e5ead5..0ba51d48316 100644 --- a/policyengine_us/tests/policy/baseline/partners/my_friend_ben/2025.yaml +++ b/policyengine_us/tests/policy/baseline/partners/my_friend_ben/2025.yaml @@ -82,5 +82,6 @@ 2025-01: 0.0 co_tanf: 5712.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.06 + # Annual 2025 lookup: July 2024 NSLP 4.43 + SBP 2.37 = 6.80. + school_meal_daily_subsidy: 6.80 school_meal_tier: 0 diff --git a/policyengine_us/variables/gov/usda/school_meals/free_school_meals.py b/policyengine_us/variables/gov/usda/school_meals/free_school_meals.py index 427337f0011..bcf514b46d2 100644 --- a/policyengine_us/variables/gov/usda/school_meals/free_school_meals.py +++ b/policyengine_us/variables/gov/usda/school_meals/free_school_meals.py @@ -7,7 +7,11 @@ class free_school_meals(Variable): definition_period = YEAR label = "free school meals" unit = USD - documentation = "Value of free school meals." + documentation = ( + "Modeled value of meals with no family charge, including state-paid " + "reduced-price copays. This is not a count of federally certified " + "free-meal students or an estimate of state spending." + ) def formula(spm_unit, period, parameters): tier = spm_unit("school_meal_tier", period) diff --git a/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py b/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py index 5cac5ffcf6a..5dbc5ee4ffd 100644 --- a/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py +++ b/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py @@ -14,11 +14,20 @@ class school_meal_tier(Variable): default_value = SchoolMealTier.PAID entity = SPMUnit definition_period = YEAR - documentation = "SPM unit's school meal program tier" + documentation = ( + "SPM unit's combined school meal tier. FREE includes state-paid copays " + "at a covered participating school and describes no family charge; " + "it does not change the student's federal reimbursement category." + ) + reference = ( + "https://www.law.cornell.edu/cfr/text/7/245.2", + "https://www.ncleg.gov/EnactedLegislation/Statutes/HTML/BySection/Chapter_115C/GS_115C-264.html", + ) def formula(spm_unit, period, parameters): fpg_ratio = spm_unit("school_meal_fpg_ratio", period) - p_income_limit = parameters(period).gov.usda.school_meals.income.limit + p = parameters(period).gov.usda.school_meals + p_income_limit = p.income.limit # Categorical eligibility provides free school meals. categorical_eligibility = spm_unit( "meets_school_meal_categorical_eligibility", period @@ -26,12 +35,20 @@ def formula(spm_unit, period, parameters): # States with universal free meal policies provide the free tier # to all students regardless of household income. state_universal = spm_unit("state_has_universal_free_school_meals", period) + # States that cover the reduced-price copay provide the free tier + # to students who qualify for reduced-price meals. + reduced_income_eligible = fpg_ratio <= p_income_limit.REDUCED + state = spm_unit.household("state_code_str", period) + state_covers_reduced_copay = p.state_covers_reduced_price_copay[state].astype( + bool + ) return select( [ (fpg_ratio <= p_income_limit.FREE) | categorical_eligibility - | state_universal, - fpg_ratio <= p_income_limit.REDUCED, + | state_universal + | (reduced_income_eligible & state_covers_reduced_copay), + reduced_income_eligible, ], [SchoolMealTier.FREE, SchoolMealTier.REDUCED], default=SchoolMealTier.PAID,