From 88a5f69faa55bd384e7d5fc63192e3d48ad06da6 Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 2 Oct 2026 13:16:43 -0400 Subject: [PATCH 1/8] Give North Carolina reduced-price school meal students the free tier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../nc-reduced-price-school-meals.fixed.md | 1 + .../state_covers_reduced_price_copay.yaml | 154 ++++++++++++++++++ policyengine_us/programs.yaml | 5 + .../gov/usda/school_meals/integration.yaml | 61 +++++++ .../usda/school_meals/school_meal_tier.yaml | 68 ++++++++ .../gov/usda/school_meals/school_meal_tier.py | 13 +- 6 files changed, 299 insertions(+), 3 deletions(-) create mode 100644 changelog.d/nc-reduced-price-school-meals.fixed.md create mode 100644 policyengine_us/parameters/gov/usda/school_meals/state_covers_reduced_price_copay.yaml 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..cb358e9606d --- /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. 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..a7a076a45a4 --- /dev/null +++ b/policyengine_us/parameters/gov/usda/school_meals/state_covers_reduced_price_copay.yaml @@ -0,0 +1,154 @@ +description: Whether a state provides breakfast and lunch at no cost to students who qualify for reduced-price meals under the National School Lunch Program and School Breakfast Program. +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). This parameter is true only while the + # state also covers the reduced-price lunch copay. + 2020-07-01: + value: true + metadata: + reference: + - title: North Carolina S.L. 2020-80 § 2.3.(b), page 14 (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, page 28 (lunch, 2022-2023 school year) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2021-2022/SL2022-74.pdf#page=28 + 2023-07-01: + value: true + metadata: + reference: + - title: North Carolina S.L. 2023-134 § 7.58, page 119 (breakfast and lunch) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119 +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/programs.yaml b/policyengine_us/programs.yaml index 81c10bc47b6..14650153fe0 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -110,6 +110,11 @@ programs: 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: 2022-07-01 + reference: S.L. 2022-74 § 7.3; S.L. 2023-134 § 7.58 - state: NM status: complete name: New Mexico Healthy Universal 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..858751d4976 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 @@ -135,3 +135,64 @@ 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: 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: 7.06 # NSLP 4.60 + SBP 2.46 + # 180 days * (7.06 - 0.86 paid-tier subsidy) + free_school_meals: 1_116 + 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: 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.36 # NSLP 4.20 + SBP 2.16 + free_school_meals: 0 + # 180 days * (6.36 - 0.86 paid-tier subsidy) + reduced_price_school_meals: 990 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..45ccac46e8b 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,71 @@ state_has_universal_free_school_meals: true output: school_meal_tier: FREE + +# 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. +- 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 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..f903dce3b9e 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 @@ -18,7 +18,8 @@ class school_meal_tier(Variable): 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 +27,18 @@ 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] 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, From c55a150f6452c0a51def28797925702ad08b159c Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 2 Oct 2026 22:06:54 -0400 Subject: [PATCH 2/8] Fix review findings on North Carolina reduced-price copay coverage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../state_covers_reduced_price_copay.yaml | 14 ++++++- policyengine_us/programs.yaml | 4 +- .../usda/school_meals/school_meal_tier.yaml | 39 ++++++++++++++++++- .../gov/usda/school_meals/school_meal_tier.py | 4 +- 4 files changed, 56 insertions(+), 5 deletions(-) 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 index a7a076a45a4..64dd1f721db 100644 --- 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 @@ -94,12 +94,24 @@ NC: reference: - title: North Carolina S.L. 2022-74 § 7.3, page 28 (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, page 119 (breakfast and lunch) + - title: North Carolina S.L. 2023-134 § 7.58, page 119 (breakfast and lunch, 2023-2025 biennium) href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119 + # 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). + 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, pages 5-6 (adds G.S. 115C-264(a1), repeals S.L. 2023-134 § 7.58) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=5 ND: 0000-01-01: false NE: diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 14650153fe0..b035549bb08 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -113,8 +113,8 @@ programs: - state: NC status: complete name: North Carolina reduced-price meal copay coverage - effective: 2022-07-01 - reference: S.L. 2022-74 § 7.3; S.L. 2023-134 § 7.58 + effective: 2020-07-01 + 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 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 45ccac46e8b..de2071136be 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 @@ -39,7 +39,7 @@ output: school_meal_tier: FREE -# North Carolina pays the reduced-price copay (S.L. 2023-134 § 7.58), so +# 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 @@ -106,3 +106,40 @@ 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: 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: 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/variables/gov/usda/school_meals/school_meal_tier.py b/policyengine_us/variables/gov/usda/school_meals/school_meal_tier.py index f903dce3b9e..a0c405ae023 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 @@ -31,7 +31,9 @@ def formula(spm_unit, period, parameters): # 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] + state_covers_reduced_copay = p.state_covers_reduced_price_copay[state].astype( + bool + ) return select( [ (fpg_ratio <= p_income_limit.FREE) From 8264deb1f845888212b31b5f022398fe9e1cd4fb Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 3 Oct 2026 01:41:50 -0400 Subject: [PATCH 3/8] Use before-LSR earnings in tests, fix the 2025 paid lunch rate, and date 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 --- .../nc-reduced-price-school-meals.fixed.md | 2 +- .../gov/usda/school_meals/amount/nslp.yaml | 18 +++++++-------- .../gov/usda/school_meals/amount/sbp.yaml | 18 +++++++-------- .../gov/usda/school_meals/integration.yaml | 22 ++++++++++--------- .../school_meal_daily_subsidy.yaml | 2 +- .../school_meal_paid_daily_subsidy.yaml | 11 ++++++++++ .../usda/school_meals/school_meal_tier.yaml | 4 ++-- 7 files changed, 45 insertions(+), 32 deletions(-) diff --git a/changelog.d/nc-reduced-price-school-meals.fixed.md b/changelog.d/nc-reduced-price-school-meals.fixed.md index cb358e9606d..2ce35fcd0a1 100644 --- a/changelog.d/nc-reduced-price-school-meals.fixed.md +++ b/changelog.d/nc-reduced-price-school-meals.fixed.md @@ -1 +1 @@ -North Carolina students who qualify for reduced-price school meals now get the free tier, because the state pays the reduced-price copay. +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. 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..ec39bcbcee8 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,7 @@ 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 REDUCED: 2015-07-01: 2.67 2016-07-01: 2.76 @@ -25,7 +25,7 @@ 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 FREE: 2015-07-01: 3.07 2016-07-01: 3.16 @@ -37,7 +37,7 @@ 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 AK: PAID: 2015-07-01: 0.48 @@ -50,7 +50,7 @@ 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 REDUCED: 2015-07-01: 4.59 2016-07-01: 4.72 @@ -62,7 +62,7 @@ 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 FREE: 2015-07-01: 4.99 2016-07-01: 5.12 @@ -74,7 +74,7 @@ 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 HI: PAID: 2015-07-01: 0.34 @@ -87,7 +87,7 @@ 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 REDUCED: 2015-07-01: 3.20 2016-07-01: 3.29 @@ -99,7 +99,7 @@ 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 FREE: 2015-07-01: 3.60 2016-07-01: 3.69 @@ -111,7 +111,7 @@ 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 metadata: unit: currency-USD 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..44a0a0f32e1 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,7 @@ 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 REDUCED: 2015-07-01: 1.36 2016-07-01: 1.41 @@ -25,7 +25,7 @@ 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 FREE: 2015-07-01: 1.66 2016-07-01: 1.71 @@ -37,7 +37,7 @@ 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 AK: PAID: 2015-07-01: 0.43 @@ -50,7 +50,7 @@ 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 REDUCED: 2015-07-01: 2.36 2016-07-01: 2.43 @@ -62,7 +62,7 @@ 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 FREE: 2015-07-01: 2.66 2016-07-01: 2.73 @@ -74,7 +74,7 @@ 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 HI: PAID: 2015-07-01: 0.33 @@ -87,7 +87,7 @@ 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 REDUCED: 2015-07-01: 1.64 2016-07-01: 1.69 @@ -99,7 +99,7 @@ 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 FREE: 2015-07-01: 1.94 2016-07-01: 1.99 @@ -111,7 +111,7 @@ 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 metadata: unit: currency-USD 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 858751d4976..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. @@ -146,7 +146,7 @@ parent: age: 35 # Full-time at $15 per hour: 2,080 hours * $15. - employment_income: 31_200 + employment_income_before_lsr: 31_200 child: age: 10 is_in_k12_school: true @@ -162,9 +162,10 @@ # 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: 7.06 # NSLP 4.60 + SBP 2.46 - # 180 days * (7.06 - 0.86 paid-tier subsidy) - free_school_meals: 1_116 + 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 @@ -177,7 +178,7 @@ people: parent: age: 35 - employment_income: 31_200 + employment_income_before_lsr: 31_200 child: age: 10 is_in_k12_school: true @@ -192,7 +193,8 @@ output: school_meal_fpg_ratio: 1.475 school_meal_tier: REDUCED - school_meal_daily_subsidy: 6.36 # NSLP 4.20 + SBP 2.16 + 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.36 - 0.86 paid-tier subsidy) - reduced_price_school_meals: 990 + # 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..4c6c7313c99 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 @@ -18,4 +18,4 @@ 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) 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..647ae9f89a7 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,14 @@ 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 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 de2071136be..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 @@ -114,7 +114,7 @@ period: 2026 input: people: - person1: {age: 35, employment_income: 40_034} + person1: {age: 35, employment_income_before_lsr: 40_034} person2: {age: 10} spm_units: spm_unit: @@ -131,7 +131,7 @@ period: 2026 input: people: - person1: {age: 35, employment_income: 40_035} + person1: {age: 35, employment_income_before_lsr: 40_035} person2: {age: 10} spm_units: spm_unit: From f4e3f40f16b0ceb29044641cf1909d47fb17a33b Mon Sep 17 00:00:00 2001 From: Ziming Date: Sun, 4 Oct 2026 21:52:43 -0400 Subject: [PATCH 4/8] Fix Michigan and New Mexico school meal references --- .../school_meals/state_universal_free_meals.yaml | 12 +++++------- policyengine_us/programs.yaml | 4 ++-- 2 files changed, 7 insertions(+), 9 deletions(-) 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..204d4c3a43b 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, page 4)" + 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 5592e93f2a9..3976c7400b5 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -104,7 +104,7 @@ 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 @@ -119,7 +119,7 @@ programs: 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 From 32f9353a0a12e4fa180db4cfe13654a28b712557 Mon Sep 17 00:00:00 2001 From: Ziming Date: Sun, 4 Oct 2026 22:58:39 -0400 Subject: [PATCH 5/8] Update school meal rates and partner coverage tests --- .../nc-reduced-price-school-meals.fixed.md | 2 +- .../gov/usda/school_meals/amount/nslp.yaml | 24 +- .../gov/usda/school_meals/amount/sbp.yaml | 24 +- .../school_meal_daily_subsidy.yaml | 24 ++ .../school_meal_paid_daily_subsidy.yaml | 18 ++ .../federal/nutrition/school_meals/ca.yaml | 29 ++- .../federal/nutrition/school_meals/co.yaml | 29 ++- .../nutrition/school_meals/federal.yaml | 223 ++++++++++++------ .../federal/nutrition/school_meals/ma.yaml | 29 ++- .../federal/nutrition/school_meals/nc.yaml | 201 ++++++++++++++++ .../analytics_coverage/signatures/co.yaml | 13 +- .../analytics_coverage/signatures/il.yaml | 17 +- .../analytics_coverage/signatures/ma.yaml | 13 +- .../analytics_coverage/signatures/nc.yaml | 13 +- .../analytics_coverage/signatures/tx.yaml | 17 +- .../baseline/partners/my_friend_ben/2025.yaml | 9 +- 16 files changed, 548 insertions(+), 137 deletions(-) create mode 100644 policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/nc.yaml diff --git a/changelog.d/nc-reduced-price-school-meals.fixed.md b/changelog.d/nc-reduced-price-school-meals.fixed.md index 2ce35fcd0a1..9adcc7e3929 100644 --- a/changelog.d/nc-reduced-price-school-meals.fixed.md +++ b/changelog.d/nc-reduced-price-school-meals.fixed.md @@ -1 +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. +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 ec39bcbcee8..ca3a2bed13f 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml @@ -14,6 +14,7 @@ CONTIGUOUS_US: 2023-07-01: 0.40 2024-07-01: 0.42 2025-07-01: 0.44 + 2026-07-01: 0.45 REDUCED: 2015-07-01: 2.67 2016-07-01: 2.76 @@ -26,6 +27,7 @@ CONTIGUOUS_US: 2023-07-01: 3.85 2024-07-01: 4.03 2025-07-01: 4.20 + 2026-07-01: 4.36 FREE: 2015-07-01: 3.07 2016-07-01: 3.16 @@ -38,6 +40,7 @@ CONTIGUOUS_US: 2023-07-01: 4.25 2024-07-01: 4.43 2025-07-01: 4.60 + 2026-07-01: 4.76 AK: PAID: 2015-07-01: 0.48 @@ -51,6 +54,7 @@ AK: 2023-07-01: 0.66 2024-07-01: 0.69 2025-07-01: 0.71 + 2026-07-01: 0.74 REDUCED: 2015-07-01: 4.59 2016-07-01: 4.72 @@ -63,6 +67,7 @@ AK: 2023-07-01: 6.50 2024-07-01: 6.78 2025-07-01: 7.05 + 2026-07-01: 7.32 FREE: 2015-07-01: 4.99 2016-07-01: 5.12 @@ -75,6 +80,7 @@ AK: 2023-07-01: 6.90 2024-07-01: 7.18 2025-07-01: 7.45 + 2026-07-01: 7.72 HI: PAID: 2015-07-01: 0.34 @@ -88,6 +94,7 @@ HI: 2023-07-01: 0.53 2024-07-01: 0.55 2025-07-01: 0.57 + 2026-07-01: 0.59 REDUCED: 2015-07-01: 3.20 2016-07-01: 3.29 @@ -100,6 +107,7 @@ HI: 2023-07-01: 5.14 2024-07-01: 5.36 2025-07-01: 5.58 + 2026-07-01: 5.79 FREE: 2015-07-01: 3.60 2016-07-01: 3.69 @@ -112,6 +120,7 @@ HI: 2023-07-01: 5.54 2024-07-01: 5.76 2025-07-01: 5.98 + 2026-07-01: 6.19 metadata: unit: currency-USD @@ -138,10 +147,23 @@ 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. + 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 44a0a0f32e1..2a4fb283dfe 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml @@ -14,6 +14,7 @@ CONTIGUOUS_US: 2023-07-01: 0.38 2024-07-01: 0.39 2025-07-01: 0.40 + 2026-07-01: 0.42 REDUCED: 2015-07-01: 1.36 2016-07-01: 1.41 @@ -26,6 +27,7 @@ CONTIGUOUS_US: 2023-07-01: 1.98 2024-07-01: 2.07 2025-07-01: 2.16 + 2026-07-01: 2.24 FREE: 2015-07-01: 1.66 2016-07-01: 1.71 @@ -38,6 +40,7 @@ CONTIGUOUS_US: 2023-07-01: 2.28 2024-07-01: 2.37 2025-07-01: 2.46 + 2026-07-01: 2.54 AK: PAID: 2015-07-01: 0.43 @@ -51,6 +54,7 @@ AK: 2023-07-01: 0.58 2024-07-01: 0.60 2025-07-01: 0.62 + 2026-07-01: 0.64 REDUCED: 2015-07-01: 2.36 2016-07-01: 2.43 @@ -63,6 +67,7 @@ AK: 2023-07-01: 3.36 2024-07-01: 3.50 2025-07-01: 3.65 + 2026-07-01: 3.79 FREE: 2015-07-01: 2.66 2016-07-01: 2.73 @@ -75,6 +80,7 @@ AK: 2023-07-01: 3.66 2024-07-01: 3.80 2025-07-01: 3.95 + 2026-07-01: 4.09 HI: PAID: 2015-07-01: 0.33 @@ -88,6 +94,7 @@ HI: 2023-07-01: 0.47 2024-07-01: 0.49 2025-07-01: 0.51 + 2026-07-01: 0.52 REDUCED: 2015-07-01: 1.64 2016-07-01: 1.69 @@ -100,6 +107,7 @@ HI: 2023-07-01: 2.65 2024-07-01: 2.76 2025-07-01: 2.88 + 2026-07-01: 2.99 FREE: 2015-07-01: 1.94 2016-07-01: 1.99 @@ -112,6 +120,7 @@ HI: 2023-07-01: 2.95 2024-07-01: 3.06 2025-07-01: 3.18 + 2026-07-01: 3.29 metadata: unit: currency-USD @@ -138,10 +147,23 @@ 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. + 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/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 4c6c7313c99..32049a3f325 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 @@ -19,3 +19,27 @@ school_meal_tier: FREE output: 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] 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 647ae9f89a7..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 @@ -13,3 +13,21 @@ 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/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..d151200ce56 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: @@ -14,7 +15,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 50_700 + employment_income_before_lsr: 60_000 spouse: age: 33 is_tax_unit_head: false @@ -25,6 +26,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -55,8 +57,15 @@ output: 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 + # 60,000 / 27,320 = 219.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: 60_000 + 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..59ca55126c9 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-101 et seq.). +# https://leg.colorado.gov/sites/default/files/images/olls/crs2024-title-22.pdf +# 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: @@ -14,7 +15,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 50_700 + employment_income_before_lsr: 60_000 spouse: age: 33 is_tax_unit_head: false @@ -25,6 +26,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -55,8 +57,15 @@ output: 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 + # 60,000 / 27,320 = 219.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: 60_000 + 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..77b54547118 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,28 @@ # 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 +# The MO boundary cases assume schools charging both reduced-price copays: +# Rockwood (2026-27, Ellisville 63011) and Mount Vernon (2025-26, 65712). +# Both publish $0.30 breakfast / $0.40 lunch, so a combined REDUCED tier fits. +# https://www.rsdmo.org/departments/child-nutrition/meal-prices +# https://ms.mtvernon.k12.mo.us/apps/pages/index.jsp?uREC_ID=3822817&type=d&pREC_ID=2470965 - name: school_meals_free_tier_just_below_130pct (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -30,6 +43,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -63,12 +77,15 @@ # 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: @@ -93,6 +110,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -103,8 +121,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] @@ -123,15 +141,20 @@ output: 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: @@ -155,6 +178,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -165,8 +189,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] @@ -185,13 +209,18 @@ output: 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: @@ -212,6 +241,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -242,15 +272,19 @@ output: 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: @@ -271,6 +305,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -280,9 +315,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] @@ -301,14 +336,19 @@ output: 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: @@ -329,6 +369,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -338,9 +379,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] @@ -359,14 +400,19 @@ output: 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: @@ -376,7 +422,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 60_000 + employment_income_before_lsr: 50_500 spouse: age: 33 is_tax_unit_head: false @@ -387,6 +433,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -396,14 +443,13 @@ 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). + # Partner-supplied aggregate matches the household's gross wages. school_meal_countable_income: 50_500 tax_units: tax_unit: @@ -420,14 +466,19 @@ output: 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; the direct + # aggregate and individual income describe the same household. + # 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: @@ -448,6 +499,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -479,14 +531,18 @@ output: 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 + school_meal_net_subsidy: 1119.60 + free_school_meals: 1119.60 + reduced_price_school_meals: 0.00 - name: school_meals_negative_self_employment_income_free (federal) period: 2026 - absolute_error_margin: 0.1 + absolute_error_margin: 0.01 input: people: head: @@ -508,6 +564,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -538,16 +595,17 @@ output: 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: @@ -568,6 +626,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -577,9 +636,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] @@ -598,14 +657,19 @@ output: 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: @@ -626,6 +690,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -635,9 +700,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] @@ -656,13 +721,18 @@ output: 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: @@ -683,6 +753,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -715,7 +786,11 @@ 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..29ea20dc007 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: @@ -14,7 +15,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 50_700 + employment_income_before_lsr: 60_000 spouse: age: 33 is_tax_unit_head: false @@ -25,6 +26,7 @@ employment_income_before_lsr: 0 child1: age: 8 + is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -55,8 +57,15 @@ output: 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 + # 60,000 / 27,320 = 219.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: 60_000 + 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..b0aa9d5aef9 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/partners/analytics_coverage/edge_cases/federal/nutrition/school_meals/nc.yaml @@ -0,0 +1,201 @@ +# 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_in_k12_school: true + 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: + 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_in_k12_school: true + 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: + 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_in_k12_school: true + 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: + 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..26f4230d04a 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 @@ -66,6 +66,7 @@ output: people: '2021359': + is_in_k12_school: false medicaid: 10936.13 medicaid_category: 6 is_optional_senior_or_disabled_for_medicaid: false @@ -82,5 +83,11 @@ 2025-01: 0.0 co_tanf: 5712.0 lifeline: 111.0 - school_meal_daily_subsidy: 7.06 + # The tier and per-child rate are defined even for an adult-only + # household. No enrolled K-12 children means zero meal benefits. + # Annual 2025 lookup: July 2024 NSLP 4.43 + SBP 2.37 = 6.80. + school_meal_daily_subsidy: 6.80 school_meal_tier: 0 + school_meal_net_subsidy: 0 + free_school_meals: 0 + reduced_price_school_meals: 0 From b239579fc51d4bc199cee3bd83f2cdd4188f9b9e Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 5 Oct 2026 15:20:44 -0400 Subject: [PATCH 6/8] Address school meal references and partner review feedback --- .../gov/usda/school_meals/amount/nslp.yaml | 2 ++ .../gov/usda/school_meals/amount/sbp.yaml | 2 ++ .../state_covers_reduced_price_copay.yaml | 24 ++++++++++------- .../state_universal_free_meals.yaml | 2 +- policyengine_us/programs.yaml | 3 ++- .../federal/nutrition/school_meals/ca.yaml | 6 ++--- .../federal/nutrition/school_meals/co.yaml | 10 +++---- .../nutrition/school_meals/federal.yaml | 26 ++++++++++++------- .../federal/nutrition/school_meals/ma.yaml | 6 ++--- .../usda/school_meals/free_school_meals.py | 6 ++++- .../gov/usda/school_meals/school_meal_tier.py | 10 ++++++- 11 files changed, 64 insertions(+), 33 deletions(-) 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 ca3a2bed13f..8789f0efd69 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/amount/nslp.yaml @@ -157,6 +157,8 @@ metadata: # 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: 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 2a4fb283dfe..794c7cbcd7e 100644 --- a/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml +++ b/policyengine_us/parameters/gov/usda/school_meals/amount/sbp.yaml @@ -157,6 +157,8 @@ metadata: # 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: 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 index 64dd1f721db..f0c5a1edf3e 100644 --- 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 @@ -1,4 +1,7 @@ -description: Whether a state provides breakfast and lunch at no cost to students who qualify for reduced-price meals under the National School Lunch Program and School Breakfast Program. +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 @@ -76,13 +79,13 @@ MT: NC: 0000-01-01: false # North Carolina has covered the reduced-price breakfast copay since - # July 1, 2011 (S.L. 2011-342 § 1). This parameter is true only while the - # state also covers the reduced-price lunch copay. + # 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), page 14 (lunch, 2020-2021 school year) + - 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 @@ -92,7 +95,7 @@ NC: value: true metadata: reference: - - title: North Carolina S.L. 2022-74 § 7.3, page 28 (lunch, 2022-2023 school year) + - 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 @@ -100,18 +103,21 @@ NC: value: true metadata: reference: - - title: North Carolina S.L. 2023-134 § 7.58, page 119 (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 §§ 7.58 and 43.8 (breakfast and lunch, 2023-2025 biennium) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119,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, pages 5-6 (adds G.S. 115C-264(a1), repeals S.L. 2023-134 § 7.58) - href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=5 + - 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) + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=5,6,32 ND: 0000-01-01: false NE: 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 204d4c3a43b..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 @@ -141,7 +141,7 @@ NM: value: true metadata: reference: - - title: "N.M. Stat. § 22-13C-4(A) — Universal school meals for children (SB 4 (2023), Chapter 30, § 3, page 4)" + - 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 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 7b3b3c11ae9..35145133a81 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 @@ -114,6 +114,7 @@ programs: 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 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 d151200ce56..1c7d640388f 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 @@ -15,7 +15,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 60_000 + employment_income_before_lsr: 50_700 spouse: age: 33 is_tax_unit_head: false @@ -57,12 +57,12 @@ output: spm_units: spm_unit: - # 60,000 / 27,320 = 219.6% FPG: above the federal reduced-price + # 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: 60_000 + 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. 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 59ca55126c9..89e4f7edc1f 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,5 +1,5 @@ -# Colorado Healthy School Meals for All (C.R.S. sec. 22-82.9-101 et seq.). -# https://leg.colorado.gov/sites/default/files/images/olls/crs2024-title-22.pdf +# 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. @@ -15,7 +15,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 60_000 + employment_income_before_lsr: 50_700 spouse: age: 33 is_tax_unit_head: false @@ -57,12 +57,12 @@ output: spm_units: spm_unit: - # 60,000 / 27,320 = 219.6% FPG: above the federal reduced-price + # 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: 60_000 + 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. 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 77b54547118..28c0f1ac2ad 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 @@ -15,11 +15,18 @@ # 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 -# The MO boundary cases assume schools charging both reduced-price copays: -# Rockwood (2026-27, Ellisville 63011) and Mount Vernon (2025-26, 65712). -# Both publish $0.30 breakfast / $0.40 lunch, so a combined REDUCED tier fits. -# https://www.rsdmo.org/departments/child-nutrition/meal-prices -# https://ms.mtvernon.k12.mo.us/apps/pages/index.jsp?uREC_ID=3822817&type=d&pREC_ID=2470965 +# 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.01 @@ -422,7 +429,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 50_500 + employment_income_before_lsr: 60_000 spouse: age: 33 is_tax_unit_head: false @@ -449,7 +456,8 @@ spm_units: spm_unit: members: [head, spouse, child1] - # Partner-supplied aggregate matches the household's gross wages. + # 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: @@ -468,8 +476,8 @@ spm_unit: meets_school_meal_categorical_eligibility: false state_has_universal_free_school_meals: false - # 50,500 / 27,320 = 184.8% <= 185% -> REDUCED; the direct - # aggregate and individual income describe the same household. + # 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 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 29ea20dc007..e6e1a013276 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 @@ -15,7 +15,7 @@ is_tax_unit_dependent: false is_disabled: false immigration_status_str: CITIZEN - employment_income_before_lsr: 60_000 + employment_income_before_lsr: 50_700 spouse: age: 33 is_tax_unit_head: false @@ -57,12 +57,12 @@ output: spm_units: spm_unit: - # 60,000 / 27,320 = 219.6% FPG: above the federal reduced-price + # 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: 60_000 + 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. 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 a0c405ae023..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,7 +14,15 @@ 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) From bd04f41f049302df1597cecd353b154aa57827e0 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 5 Oct 2026 19:18:36 -0400 Subject: [PATCH 7/8] Address school meal reference and test review feedback --- .../state_covers_reduced_price_copay.yaml | 8 +-- .../school_meal_daily_subsidy.yaml | 17 ++++++- .../school_meals/school_meal_net_subsidy.yaml | 16 ++++++ .../federal/nutrition/school_meals/ca.yaml | 4 +- .../federal/nutrition/school_meals/co.yaml | 4 +- .../nutrition/school_meals/federal.yaml | 50 ++++++++++++++----- .../federal/nutrition/school_meals/ma.yaml | 4 +- .../federal/nutrition/school_meals/nc.yaml | 12 +++-- .../baseline/partners/my_friend_ben/2025.yaml | 6 --- 9 files changed, 91 insertions(+), 30 deletions(-) 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 index f0c5a1edf3e..c71127faffe 100644 --- 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 @@ -103,8 +103,8 @@ NC: value: true metadata: reference: - - title: North Carolina S.L. 2023-134 §§ 7.58 and 43.8 (breakfast and lunch, 2023-2025 biennium) - href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119,625 + - title: "North Carolina S.L. 2023-134 §§ 7.58 and 43.8 (breakfast and lunch, 2023-2025 biennium; #page 119,625)" + href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2023-2024/SL2023-134.pdf#page=119 # 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 @@ -116,8 +116,8 @@ NC: 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 and 7.1 (adds G.S. 115C-264(a1), repeals S.L. 2023-134 § 7.58) - href: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=5,6,32 + - 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: https://www.ncleg.gov/EnactedLegislation/SessionLaws/PDF/2025-2026/SL2025-89.pdf#page=5 ND: 0000-01-01: false NE: 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 32049a3f325..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,7 +12,7 @@ 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: @@ -43,3 +43,18 @@ 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/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 1c7d640388f..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 @@ -26,7 +26,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -55,6 +54,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: # 50,700 / 27,320 = 185.6% FPG: above the federal reduced-price 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 89e4f7edc1f..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 @@ -26,7 +26,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -55,6 +54,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: # 50,700 / 27,320 = 185.6% FPG: above the federal reduced-price 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 28c0f1ac2ad..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 @@ -50,7 +50,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -79,6 +78,9 @@ 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 @@ -117,7 +119,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -146,6 +147,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -185,7 +189,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -214,6 +217,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -248,7 +254,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -277,6 +282,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: true @@ -312,7 +320,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -341,6 +348,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -376,7 +386,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -405,6 +414,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -440,7 +452,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -472,6 +483,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -507,7 +521,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -537,6 +550,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: true @@ -548,7 +564,7 @@ school_meal_net_subsidy: 1119.60 free_school_meals: 1119.60 reduced_price_school_meals: 0.00 -- name: school_meals_negative_self_employment_income_free (federal) +- name: school_meals_low_wages_with_business_loss_free (federal) period: 2026 absolute_error_margin: 0.01 input: @@ -572,7 +588,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -601,6 +616,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: # A family with $20,000 wages and a business loss qualifies for free @@ -634,7 +652,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -663,6 +680,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -698,7 +718,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -727,6 +746,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: meets_school_meal_categorical_eligibility: false @@ -761,7 +783,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -790,6 +811,9 @@ 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) = 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 e6e1a013276..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 @@ -26,7 +26,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -55,6 +54,9 @@ mu_child1: members: [child1] output: + people: + child1: + is_in_k12_school: true spm_units: spm_unit: # 50,700 / 27,320 = 185.6% FPG: above the federal reduced-price 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 index b0aa9d5aef9..81a1556db8d 100644 --- 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 @@ -33,7 +33,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -62,6 +61,9 @@ 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. @@ -96,7 +98,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -125,6 +126,9 @@ 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. @@ -159,7 +163,6 @@ employment_income_before_lsr: 0 child1: age: 8 - is_in_k12_school: true is_tax_unit_head: false is_tax_unit_spouse: false is_tax_unit_dependent: true @@ -188,6 +191,9 @@ 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. 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 26f4230d04a..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 @@ -66,7 +66,6 @@ output: people: '2021359': - is_in_k12_school: false medicaid: 10936.13 medicaid_category: 6 is_optional_senior_or_disabled_for_medicaid: false @@ -83,11 +82,6 @@ 2025-01: 0.0 co_tanf: 5712.0 lifeline: 111.0 - # The tier and per-child rate are defined even for an adult-only - # household. No enrolled K-12 children means zero meal benefits. # Annual 2025 lookup: July 2024 NSLP 4.43 + SBP 2.37 = 6.80. school_meal_daily_subsidy: 6.80 school_meal_tier: 0 - school_meal_net_subsidy: 0 - free_school_meals: 0 - reduced_price_school_meals: 0 From 78bc468754f0b7e60718405dfeb02d2ae3f3aa3b Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 6 Oct 2026 12:17:50 -0400 Subject: [PATCH 8/8] Cite each North Carolina session-law page as its own reference 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 --- .../school_meals/state_covers_reduced_price_copay.yaml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 index c71127faffe..26ac4616a7b 100644 --- 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 @@ -103,8 +103,10 @@ NC: value: true metadata: reference: - - title: "North Carolina S.L. 2023-134 §§ 7.58 and 43.8 (breakfast and lunch, 2023-2025 biennium; #page 119,625)" + - 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 @@ -116,8 +118,12 @@ NC: 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 and 7.1 (adds G.S. 115C-264(a1), repeals S.L. 2023-134 § 7.58; #page 5,6,32)" + - 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: