Skip to content

Implement Maryland Child Care Scholarship (CCS)#7889

Open
hua7450 wants to merge 17 commits into
PolicyEngine:mainfrom
hua7450:md-ccap
Open

Implement Maryland Child Care Scholarship (CCS)#7889
hua7450 wants to merge 17 commits into
PolicyEngine:mainfrom
hua7450:md-ccap

Conversation

@hua7450
Copy link
Copy Markdown
Collaborator

@hua7450 hua7450 commented Mar 26, 2026

Summary

Implements Maryland's Child Care Scholarship (CCS) program in PolicyEngine, including eligibility, income calculation with SMI base-year freeze, copayment, provider reimbursement rates (with historical 5/23/22 schedule + current 3/1/26 schedule), and benefit computation.

Closes #7888

Regulatory Authority

Program Overview

  • Official name: Child Care Scholarship (CCS) Program (formerly "Child Care Subsidy Program")
  • Administration: Maryland State Department of Education (MSDE), Division of Early Childhood, Office of Child Care
  • Funding: CCDF federal block grant + state funds
  • Type: Voucher-based child care subsidy
  • Current caseload: 41,148 children / 27,235 families (Jan 2026, per Feb 2026 briefing)
  • Waitlist: ~4,929 children

Eligibility

Requirement Source How Modeled
Must reside in Maryland COMAR 13A.14.06.03(A)(1) defined_for = StateCode.MD
Child under 13 (non-disabled) COMAR 13A.14.06.02 age < p.age_threshold.child (param = 13)
Child under 19 (disabled) COMAR 13A.14.06.02 age < p.age_threshold.disabled_child (param = 19)
Child is U.S. citizen or qualified alien COMAR 13A.14.06.03(B) is_ccdf_immigration_eligible_child
TCA recipients exempt from income test COMAR 13A.14.06.03(F)(1) is_tanf_enrolled
SSI recipients exempt from income test COMAR 13A.14.06.03(F)(1) ssi > 0
Income at/below 75% SMI (initial) COMAR 13A.14.06.03H (Feb 2026 W&M slide 21) countable_income <= md_smi * 0.75
Income at/below 85% SMI (continuation) 45 CFR 98.21 countable_income <= md_smi * 0.85 (via md_ccs_enrolled)

Income Calculation

Per COMAR 13A.14.06.03F(8), countable income includes annual gross income from 15 sources:

  • Earned: employment income; self-employment income (after 30% flat deduction per .03F(8)(a)(i))
  • Unearned: Social Security, pension, interest, dividends, rental income, alimony, child support received, unemployment compensation, workers' compensation, veterans' benefits, disability benefits, capital gains, farm income, military retirement pay
  • Child support is counted as gross income per COMAR .02B(28)(b)(x) ("Alimony and child support") and the receipt-based counting rule at .03F(8)(c). Chapter 525 of 2022 does not exclude child support from income — it only bars MSDE from requiring child-support pursuit as an eligibility condition.
  • Excluded (COMAR .02B(28)(c); not modeled): child support paid for a child outside the household, and $2,500 of child support tax intercepts/arrearages.

Income Thresholds + SMI Base-Year Freeze

MD freezes the SMI base year for CCS eligibility on a fiscal-year schedule (FY starts July 1). Implemented via smi_freeze_in_effect (bool) + smi_frozen_year parameters — when the freeze is in effect the formula pins SMI to smi_frozen_year, otherwise it uses the current-year SMI. Verified against Feb 2026 W&M briefing slide 21.

MD Fiscal Year SMI base year used Source
FY2019-2022 (2018-07-01 onward) 2018 SMI Feb 2026 briefing slide 21
FY2023-2024 (2022-07-01 onward) 2021 SMI Feb 2026 briefing slide 21
FY2025 mid-year (2024-12-15 onward) Current-year SMI (unfrozen) Jan 2025 OCC info session

Note: HHS SMI data in this repo now covers FFY2018 (2017-10-01) onward following the #8356 backfill, so the base-year freeze resolves to real 2018 and 2021 SMI values.

Historical initial-eligibility SMI rate (independent of base-year freeze), as implemented in smi_rate/initial.yaml:

Effective Date Rate Source
2018-01-01 50% COMAR 13A.14.06.03H
2018-07-01 65% COMAR 13A.14.06.03H
2022-07-01 75% COMAR 13A.14.06.03H (Feb 2026 W&M slide 21)

Copayment Structure

Current flat copayments (effective since 2022 legislation, capped per Ch 717 of 2024):

Service Unit Hours/Day Weekly Copay
UNIT_1 (hourly) ≤3 hours $1/week
UNIT_2 (part-time) >3 to <6 hours $2/week
UNIT_3 (full-time) ≥6 hours $3/week

Categorical exemptions (copayment = $0):

Category Source Variable
TCA recipients COMAR 13A.14.06.12(A)(1) is_tanf_enrolled
SSI recipients COMAR 13A.14.06.12(A)(1) ssi > 0
SNAP recipients Ch 525/526 of 2022 (Educ. Art. § 9.5-113) receives_snap (bare-input bool, NEW)
WIC recipients Ch 525/526 of 2022 (Educ. Art. § 9.5-113) receives_wic (existing)

receives_snap is a new federal-level bare-input variable to avoid a cycle through snap_dependent_care_deduction → childcare_expenses → md_ccs if we used the computed snap value. The § 9.5-113 waiver is also conditioned on employment/education, which is implicitly satisfied for any family that already passes md_ccs_activity_eligible.

Federal cap: Copayment cannot exceed 7% of family gross income (45 CFR 98.45(l)(3)).

Copayment assessed for up to 3 children per COMAR 13A.14.06.12; 4th+ child is free.

Provider Reimbursement Rates

  • Formal rates (payment/formal/): 7 market regions (U/V/W/X/Y/Z/BC) × 2 provider types (licensed center, licensed family) × 2 age groups (infant, regular). Only UNIT_3 (full-time) base rates are stored; UNIT_2 and UNIT_1 are derived in md_ccs_payment_rate.py via unit_count / 3 (i.e., × 2/3 and × 1/3) per COMAR 13A.14.06.11.
  • Informal rates (payment/informal/rates.yaml): 24 counties × 2 age groups. UNIT_3 rates only; UNIT_2/UNIT_1 derived in the same way.
  • Historical schedule: 2022-05-23 (from Wayback Machine) and current schedule 2026-03-01 (60th percentile of 2024 MRS) both encoded. Informal rates have been operational at MSDE since 2020-11-23 (70th percentile of March 2021 MRS).

UNIT_3 formal rates, current schedule (effective 2026-03-01):

Region Family Regular Family Infant Center Regular Center Infant
U $200 $225 $244 $325
V $175 $200 $200 $264
W $262 $300 $305 $420
X $325 $350 $424 $554
Y $250 $288 $312 $427
Z $170 $185 $207 $297
BC $225 $252 $282 $376

UNIT_3 formal rates, historical schedule (effective 2022-05-23 through 2026-02-28):

Region Family Regular Family Infant Center Regular Center Infant
U $176 $200 $205 $296
V $142 $175 $175 $242
W $230 $270 $262 $370
X $300 $325 $381 $481
Y $220 $250 $278 $378
Z $150 $168 $183 $262
BC $182 $210 $250 $303

Benefit Formula

benefit = min(max(expenses - copay, 0), max_reimbursement) / 12

Where:

  • expenses = spm_unit_pre_subsidy_childcare_expenses (annual)
  • copay = weekly copayment × 52 (annualized), summed across up to 3 eligible children
  • max_reimbursement = provider reimbursement rate × 52, summed across eligible children — based on region, provider type, child age, and service unit at the period's effective rate schedule

The benefit flows into household and SPM-unit income via md_child_care_subsidies, which is registered in both child_care_subsidy_programs.yaml (federal aggregator) and household_state_benefits.yaml (household net income).

Not Modeled (by design)

What Source Why Excluded
Activity/work requirement COMAR 13A.14.06.03(E) Administrative verification, not simulatable
Immunization requirement COMAR 13A.14.06.03(D) Health/administrative requirement
Child support cooperation COMAR 13A.14.06.04 Administrative requirement
Service groups / priority levels COMAR 13A.14.06.08 Waitlist management, not simulatable
24-month eligibility period Jan 2025 briefing Administrative period management
Presumptive eligibility Ch 525/526 of 2022 Administrative fast-track process

Deferred to Follow-up PR

  • Non-traditional rates (evenings/weekends) — separate rate schedule not yet encoded
  • Section 8 / Housing Choice Voucher copayment waiver — listed in Ch 525/526 § 9.5-113 but no existing receives_housing_voucher bare-input in the codebase

Files Added

policyengine_us/
  parameters/gov/states/md/msde/ccs/
    age_threshold/
      child.yaml                           # Age 13 (non-disabled)
      disabled_child.yaml                  # Age 19 (disabled)
    copay/
      federal_cap_rate.yaml                # 7% federal cap
      max_children_with_copay.yaml         # Up to 3 children
      unit_hours.yaml                      # Service unit hour brackets
      weekly_amount.yaml                   # $1/$2/$3 by unit type
    income/
      countable_income/
        sources.yaml                       # 15 income sources
      self_employment_deduction_rate.yaml  # 30% deduction
      smi_freeze_in_effect.yaml            # SMI base-year freeze toggle (NEW)
      smi_frozen_year.yaml                 # Pinned SMI base year when frozen (NEW)
      smi_rate/
        initial.yaml                       # 75% SMI (with history 50/65/75)
        continuation.yaml                  # 85% SMI
    payment/
      formal/
        licensed_center.yaml               # UNIT_3 center rates by region/age (historical + current)
        licensed_family.yaml               # UNIT_3 family rates by region/age (historical + current)
      informal/
        rates.yaml                         # UNIT_3 informal rates by county/age
      infant_age_threshold.yaml            # Infant age cutoff
      unit_count.yaml                      # 3/2/1 multiplier numerator (formula divides by 3)
      region_bc_counties.yaml              # Region-county mappings (Baltimore City)
      region_u_counties.yaml
      region_v_counties.yaml
      region_w_counties.yaml
      region_x_counties.yaml
      region_y_counties.yaml
      region_z_counties.yaml

  variables/gov/states/md/msde/ccs/
    md_ccs.py                              # Main benefit variable
    md_ccs_enrolled.py                     # Input: currently enrolled (for continuation eligibility)
    md_ccs_countable_income.py             # Income calculation (adds + SE deduction)
    md_ccs_income_eligible.py              # Income eligibility (initial vs continuation, SMI freeze)
    md_ccs_weekly_copay.py                 # Copayment with exemptions + federal cap
    md_ccs_provider_type.py                # Provider type input (LICENSED_CENTER/LICENSED_FAMILY/INFORMAL/NONE)
    md_child_care_subsidies.py             # State aggregator
    eligibility/
      md_ccs_activity_eligible.py          # Work/education activity eligibility
      md_ccs_eligible.py                   # Overall eligibility
      md_ccs_eligible_child.py             # Child-level eligibility
    payment/
      md_ccs_age_group.py                  # Child age group (infant vs regular)
      md_ccs_payment_rate.py               # Provider reimbursement rate lookup (UNIT_2/1 derived)
      md_ccs_region.py                     # Market region assignment (REGION_U..Z + REGION_BC)
      md_ccs_service_unit.py               # Service unit determination

  variables/gov/usda/snap/
    receives_snap.py                       # NEW bare-input bool (federal-level), to avoid SNAP→CCS cycle

  tests/policy/baseline/gov/states/md/msde/ccs/
    md_ccs.yaml                            # 5 benefit tests
    md_ccs_activity_eligible.yaml          # 7 activity eligibility tests
    md_ccs_age_group.yaml                  # 4 age group tests
    md_ccs_countable_income.yaml           # 4 income calculation tests
    md_ccs_eligible.yaml                   # 4 eligibility tests
    md_ccs_eligible_child.yaml             # 5 child eligibility tests
    md_ccs_income_eligible.yaml            # 5 income eligibility tests
    md_ccs_payment_rate.yaml               # 7 payment rate tests
    md_ccs_region.yaml                     # 7 region tests
    md_ccs_service_unit.yaml               # 6 service unit tests
    md_ccs_weekly_copay.yaml               # 8 copayment tests
    integration.yaml                       # 7 integration tests
    edge_cases.yaml                        # 12 edge case tests

Totals: 24 parameter files, 15 variable files (14 MD + 1 federal receives_snap), 13 test files (81 test cases)

Also modified:

  • policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml — register md_child_care_subsidies
  • policyengine_us/parameters/gov/household/household_state_benefits.yaml — include md_child_care_subsidies so the benefit flows into household net income
  • policyengine_us/programs.yaml — add CCS to program registry

Test plan

  • 81 tests pass locally
  • CI passes

hua7450 and others added 2 commits March 26, 2026 11:10
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds eligibility, income calculation, copayment, and provider reimbursement
rate parameters for Maryland's CCS program (COMAR 13A.14.06).

Includes formal rates (7 regions) and informal rates (24 counties),
enum-keyed parameter lookups, and 78 test cases.

Closes PolicyEngine#7888

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 26, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (17cda0d) to head (27b853c).
⚠️ Report is 9 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #7889    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            1        15    +14     
  Lines           19       259   +240     
  Branches         0         1     +1     
==========================================
+ Hits            19       259   +240     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

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

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

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

hua7450 and others added 5 commits March 26, 2026 12:50
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add region_w_counties.yaml and update md_ccs_region.py
- Add MD CCS to programs.yaml registry
- Add #page=XX to 5 session law PDF references
- Fix continuation.yaml to cite state source as primary
- Document frozen SMI limitation with TODO

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace all broken dsd.maryland.gov URLs with regs.maryland.gov
- Fix continuation.yaml: .03(B) → .03(H) (Income Eligibility Scale)
- Fix self_employment_deduction_rate.yaml: (F)(6) → (F)(8)(a)(i)
- Fix sources.yaml: (F)(3)-(8) → .02 (Gross income definition)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@hua7450 hua7450 changed the title Implement Maryland CCAP (Child Care Assistance Program) Implement Maryland Child Care Scholarship (CCS) May 20, 2026
@hua7450 hua7450 marked this pull request as ready for review May 20, 2026 19:27
@hua7450 hua7450 requested a review from PavelMakarchuk May 20, 2026 20:49
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

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

Program Review — PR #7889: Maryland Child Care Scholarship (CCS)

Author: hua7450
Diff: 3,807 lines (new state program)
CI: All functional checks pass; codecov/patch soft fail (expected for new program)
Posting mode: LOCAL ONLY

Source Documents

Eight authoritative sources consulted:

  1. COMAR 13A.14.06 (Child Care Scholarship Program regulations) — HTML extract; defines eligibility, gross income (.02B(28)), countable income sources (.03F(8)), copay matrix (.12), unit-rate derivation (.11)
  2. Chapter 525 of 2022 (HB 995) — child-support pursuit prohibition; effective July 1, 2022; does NOT exclude child support from income
  3. Chapter 717 of 2024 (SB 362) — §9.5-111(d) statutory copay cap anchored to Jan 1, 2024 operational levels
  4. February 2026 W&M Committee Briefing — slide 21 (SMI base-year freeze pattern), slide 22 (75% SMI initial threshold administrative origin)
  5. MSDE Rate page (current) — operational rate workbooks
  6. MSDE Rate page (Wayback Machine, historical) — pre-2024 rate snapshots
  7. January 2025 OCC Info Session — MSDE program operations
  8. 45 CFR 98.21(b), 98.45(l)(3) — federal CCDF continuation eligibility (85% SMI) and 7% co-payment cap

Critical (Must Fix Before Merge)

1. Child support exclusion regulatorily unsupported

Finding: income/countable_income/sources.yaml omits child_support_received and cites Chapter 525 of 2022 as authority for excluding it. This citation is incorrect:

  • Chapter 525 of 2022 (HB 995) only prohibits MSDE from requiring child-support pursuit as a condition of eligibility. It does NOT exclude child support from gross income.
  • COMAR 13A.14.06.02B(28)(b)(x) explicitly INCLUDES "Alimony and child support" in gross income.
  • COMAR 13A.14.06.03F(8)(c) instructs contractors to count child support actually received.

Fix options:

  • Add child_support_received to countable income sources list, OR
  • Locate authoritative MSDE policy memo (not Chapter 525) supporting the exclusion and update citation accordingly.

Without one of these, Maryland CCS income test under-counts gross income and over-grants eligibility/under-charges copay.

2. md_child_care_subsidies aggregator missing from household-level wiring

Finding: md_child_care_subsidies aggregator variable is not included in:

  • policyengine_us/variables/household/income/household/household_benefits/household_state_benefits.yaml
  • policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py

Impact: Silent under-counting of household and SPM unit benefits in microsimulation. The federal child_care_subsidy_programs aggregator picks it up, but downstream household income computations omit it.

Precedent: Same asymmetry was flagged in the WA WCCC review and fixed in the AL CCSP review. Peer state CCDF programs (DE/CO/CA/NE/SC/VA) all appear in household_state_benefits.yaml. Confirmed by both the code-validator pass and the rates audit pass.

Fix: Add md_child_care_subsidies to both files, matching the peer-state pattern.


Should Address

  1. Changelog filename typo. changelog.d/md-ccap.added.md should be changelog.d/md-ccs.added.md (same pattern observed in AL CCSP / AR SRA reviews).

  2. receives_snap naming convention. Breaks the project convention is_X_enrolled (cf. is_tanf_enrolled, is_wccc_enrolled, chip_enrolled). Rename to is_snap_enrolled and add a reference field. Cycle-avoidance justification is real and well-documented and should be preserved as an inline comment.

  3. Hard-coded /3 divisor. md_ccs_payment_rate.py:3676 divides by literal 3 to convert UNIT_3 to UNIT_1. Derive from p.unit_count["UNIT_3"] for parameter-driven correctness.

  4. PR body's "HHS SMI starts 2021" claim is wrong. Actual HHS SMI dataset begins 2017-10-01. The deferred-backfill issue (#8355) may be moot. Update PR body. Reconsider whether smi_frozen_year 2018 is needed if the backfill isn't necessary.

  5. 45 CFR citation typo. Code comment cites 98.45(k), but the 7% copay cap is actually at 98.45(l)(3). Fix the code comment.

  6. Chapter 525 effective date mismatch. sources.yaml uses 2022-05-01 as start date, but Ch 525 effective date is July 1, 2022. Either use 2022-07-01 or document the rationale.

  7. 75% SMI threshold not actually in Chapter 525. This value came from MSDE administrative action documented in the February 2026 W&M briefing slide 22. initial.yaml citation to Ch 525 is misleading. Fix citation to slide 22 plus MSDE memo.

  8. Multi-sentence parameter descriptions (skill requires single sentence) in:

    • smi_freeze_in_effect.yaml
    • weekly_amount.yaml
    • licensed_center.yaml
    • licensed_family.yaml
    • unit_count.yaml
  9. Missing tests — coverage gaps:

    • Region V formal rates entirely untested (only 5 of 7 regions have rate-lookup tests)
    • UNIT_1 formal derivation untested (only informal hourly tested)
    • SMI freeze critically under-tested: only FY2024 path; missing FY2019-2022 (2018 SMI) and explicit FY2025+ unfrozen assertions
    • Historical SMI rate transitions (50% / 65% / 75%) — zero coverage at periods 2016 / 2019 / 2020 / 2022
    • No exact-at-threshold tests for 75% / 85% SMI
    • Only 2 of 14 income sources tested (employment, self-employment)
    • No federal-aggregator integration test (md_ccs → md_child_care_subsidies → child_care_subsidy_programs)
  10. Test count discrepancy. PR body says 53 tests; actual count is 81 across 14 YAML files. Update PR body.

  11. md_ccs_region default discrepancy. Code default is REGION_W, but tests document "default = Region Z (Allegany)". Reconcile.

  12. Reference precision:

    • 11 payment files cite the MSDE rates landing page (navigation-only); replace with direct workbook links.
    • copay/unit_hours.yaml 3-hr / 6-hr boundaries are not in COMAR .11; cite the operational MSDE source.
    • income/countable_income/sources.yaml cites COMAR .02B(28) but the operational source list is at .03F; add .03F cite.
    • Verify the #page=19 anchor in CH_717_sb0362E.pdf actually lands on the copay freeze section.
  13. Copay description overreach. "Frozen at Jan 1, 2024 levels by Chapter 717" overstates Ch 717's scope. Chapter 717 is a one-directional cap with a legislative-notification escape valve. Rewrite YAML description accordingly.

  14. Rank-aware copay logic. COMAR .12A(3)(a)-(c) assigns the highest copay to the youngest child; PR code ignores birth-order assignment. Defensible under the current flat $1/$2/$3 schedule but breaks if the regional matrix is restored. Document the assumption explicitly in code comments.

  15. unit_hours.yaml boundary. 3.0001 epsilon is brittle; consider inclusive/exclusive boundary semantics or document the convention.

  16. Copay citation chain. Ch 717 + MSDE operational schedule should be presented as a coherent chain, not a single citation that overreaches.

  17. Receipt-tracking variable scope. receives_snap is currently MD-specific; consider whether a generic is_snap_enrolled would benefit other state programs.


Suggestions

  1. Add reconciliation comments cross-referencing parameter YAML headers in md_ccs_payment_rate.py.
  2. Add inline comment in receives_snap.py documenting the cycle anti-pattern rationale and why direct dependency on snap is avoided.
  3. integration.yaml Case 3: clarify that the TCA waiver path isn't actually exercised in the test scenario.
  4. Section 8 Housing Choice Voucher and Guaranteed Access Grant copay waivers from Chapter 525 are properly deferred — open a follow-up issue tracking Phase-2 work.
  5. smi_frozen_year.yaml — clarify base-year tag semantics in description.
  6. federal_cap_rate.yaml effective date — consider 2024-08-01 (CCDF Final Rule binding date) instead of 2022-05-01.

Investigated and Cleared

$1 / $2 / $3 copay schedule — DEFENSIBLE

COMAR formally codifies a different regional × age × birth-order matrix ranging $2.42–$90.46. However:

  • Chapter 717 of 2024 §9.5-111(d) anchors the flat operational schedule statutorily.
  • MSDE operational practice has used flat $1/$2/$3 (1st/2nd/3rd child) since Jan 1, 2024.
  • Code-path verifier confirmed values reflect operational practice with statutory anchor.

Action retained as a SHOULD-address: clarify citation chain (Ch 717 is a one-directional cap, not full statutory replacement of COMAR matrix) and rewrite copay description.

7% cap uses countable income (not literal gross) — DEFENSIBLE

Code uses md_ccs_countable_income, which IS COMAR's "gross income for CCS" per .03F(3) + .02B(28) + .03F(8)(a)(i). 45 CFR is silent on which income base applies to the 7% cap. No regulatory mismatch.

Only nit retained: code comment citation typo (98.45(k) → 98.45(l)(3)).


PDF Audit Summary

Category Count
Confirmed correct data points ~80 across 15 categories
Mismatches 1 (child support exclusion)
Investigated and cleared 2 ($1/$2/$3 copay; 7% cap base)

Confirmed-correct items:

  • All 56 UNIT_3 formal rate cells (7 regions × 2 provider types × 2 ages × 2 schedules) match PR-body transcription exactly
  • UNIT_2 / UNIT_1 derivation (× 2/3, × 1/3) per COMAR .11.B(3) / .C(2) / .D
  • 24 jurisdictions (23 counties + Baltimore City) allocated exactly once across 7 region files
  • Informal 24-county × 2 age structure plausible (operational post-2020 schedule)
  • Age 13 / 19 cutoffs match COMAR .02.B(11) verbatim
  • 30% self-employment deduction per COMAR .03F(8)(a)(i)
  • 85% SMI continuation per 45 CFR 98.21(b)
  • 75% SMI initial threshold value correct (citation needs fix)
  • SMI base-year freeze pattern (smi_freeze_in_effect + smi_frozen_year) correctly aligns with W&M slide 21
  • TCA / SSI categorical exemption from income test
  • 3-children copay cap
  • 7% federal cap
  • Benefit formula order
  • Federal aggregator wiring (child_care_subsidy_programs.yaml + programs.yaml)
  • Citizenship via federal is_ccdf_immigration_eligible_child reuse
  • receives_snap cycle reality

Validation Summary

Check Result
Regulatory Accuracy 1 critical + 2 should
Reference Quality 0 critical + 6 should + 5 suggestions
Code Patterns 2 critical + 8 should
Test Coverage 0 critical + 7 should-add
PDF Value Audit 1 mismatch / ~80 data points confirmed
CI Status All functional PASS; codecov/patch soft fail (expected)

Review Severity: REQUEST_CHANGES

Two critical findings block merge:

  1. Child support exclusion lacks regulatory support. Chapter 525 of 2022 doesn't actually exclude child support from income; COMAR explicitly includes it. Either add child_support_received to countable income, or find authoritative MSDE policy citation supporting the exclusion.

  2. md_child_care_subsidies aggregator missing from household_state_benefits.yaml causes silent under-counting in microsim. Same pattern WA WCCC review flagged; AL CCSP fixed it.

Both fixes are localized. Otherwise this is a high-quality Phase-1 implementation:

  • 56 rate cells verified exact against COMAR-derived workbooks
  • Full federal CCDF helper reuse (is_ccdf_immigration_eligible_child)
  • Correct SMI base-year freeze pattern aligned with W&M slide 21
  • Correct benefit formula order
  • Sensible deferrals (Section 8 / GAG waivers) for Phase 2

Next Steps

Run /fix-pr 7889 to apply the two critical fixes and the should-address items.

hua7450 and others added 2 commits June 1, 2026 00:29
… fix citations

Critical:
- Count child_support_received in MD CCS countable income per COMAR
  13A.14.06.02B(28)(b)(x) and .03F(8)(c); Chapter 525 does not exclude it
- Add md_child_care_subsidies to household_state_benefits.yaml (both brackets)
  so the benefit flows into household net income

Should-address:
- 45 CFR 98.45(k) -> (l)(3) for the 7% copayment cap
- Single-sentence parameter descriptions (5 files); drop Chapter 717 freeze overreach
- Add slide 22 citation for the 75% SMI initial threshold
- Rename changelog fragment md-ccap -> md-ccs

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hua7450
Copy link
Copy Markdown
Collaborator Author

hua7450 commented Jun 1, 2026

Thanks for the thorough review, @PavelMakarchuk — addressed in 875088f7. Summary of what changed and where I pushed back, with the verification I ran.

Critical

1. Child support exclusion — fixed ✅
You're right. I pulled the actual COMAR text (regs.maryland.gov + the mdrules.elaws.us mirror) and re-read the full Chapter 525 bill: .02B(28)(b)(x) lists "Alimony and child support" together as an inclusion, and .03F(8)(c) counts it on a receipt basis. Ch 525 only bars MSDE from requiring child-support pursuit — it doesn't exclude it from income.

  • Added child_support_received to income/countable_income/sources.yaml; removed the Ch 525 "excluded" comment/refs; re-cited COMAR .02B(28)(b)(x) + .03F(8)(c).
  • Updated md_ccs_countable_income.yaml Case 4 (now counted → $3,000) and the variable reference.
  • Documented the real .02B(28)(c) carve-outs (support paid for a child outside the household, $2,500 intercepts) as not-modeled.

2. md_child_care_subsidies wiring — partially fixed, with a pushback

  • ✅ Added to household_state_benefits.yaml (both date brackets) — confirmed it was genuinely missing from household_net_income.
  • ❌ I did not add it to spm_unit_benefits.py. Tracing the chain: md_child_care_subsidies already flows into the federal child_care_subsidies aggregator, which nets out of childcare_expensesspm_unit_spm_expenses → so it already raises SPM net income. Adding it to spm_unit_benefits too would double-count it. No peer state's _child_care_subsidies wrapper is in that list either (only co_ccap_subsidy). So household-list only.

Should-address (done)

  • Changelog md-ccapmd-ccs
  • 45 CFR 98.45(k)98.45(l)(3) (verified on Cornell LII) ✅
  • Single-sentence descriptions on the 5 flagged param files ✅
  • Copay description: dropped the Ch 717 "freeze" overreach → "cap" ✅
  • 75% SMI citation ✅ — small correction: the threshold history is on slide 21; slide 22 in this deck is the Market Rate Survey, so I cited slide 21.

Clarifications / pushbacks

  • receives_snap name kept. It reads as "actually receives SNAP," which is semantically distinct from is_X_enrolled enrollment. The cycle-avoidance rationale is documented at the call site (md_ccs_weekly_copay.py:26-29).
  • Rank-aware copay — already documented in code (md_ccs_weekly_copay.py:43-46): we don't track the youngest/2nd/3rd-child distinction, moot under the flat $1/$2/$3 schedule.
  • SNAP/WIC copay waiver authority — confirmed it's genuinely Ch 525 (Educ. Art. § 9.5‑113 lists WIC/SNAP/HCV/SSI/TCA); the statute's employment/education condition is implicitly satisfied via md_ccs_activity_eligible.
  • SMI threshold dates — verified against W&M slide 21: the param's 2018-07-01: 0.65 (FY2019) and 2022-07-01: 0.75 (FY2023) are correct. Also corrected the PR-body attribution: the 65% expansion wasn't Ch 595/596 of 2019 (that bill sets reimbursement-rate percentiles, not income eligibility) — it was a 2018 budget/admin action codified in COMAR .03H.

Deferred to follow-up

  • Expanded test coverage (Region V, UNIT_1 formal, SMI-freeze years, historical transitions, at-threshold, federal-aggregator integration test).
  • Full reference-precision sweep (direct workbook links, #page=19 anchor check).

PR description updated to match all of the above.

@hua7450 hua7450 requested a review from PavelMakarchuk June 1, 2026 13:34
Copy link
Copy Markdown
Collaborator

@PavelMakarchuk PavelMakarchuk left a comment

Choose a reason for hiding this comment

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

Program Review — PR #7889 (MD Child Care Scholarship)

Source Documents

  • PDFs (5): Feb 2026 W&M briefing (slides 21, 22), Jan 2025 OCC info session (p.7), Ch 717 of 2024 / SB 362 (p.19), Ch 525 of 2022 / HB 995 (pp.3-4), MSDE Scholarship brochure
  • HTML: COMAR 13A.14.06.02/.03/.11/.12, MSDE Scholarship Rates page (current 2026-03-01 schedule + Wayback 2022-06-16 historical snapshot), MSDE informal-rates XLSX, eCFR 45 CFR 98.21(b) and 45 CFR 98.45(l)(3)
  • Scope: full PR review (new MD state program — 24 parameters, 14 state variables + 1 new federal variable receives_snap, 13 YAML test files / 81 cases, programs.yaml registry entry, federal aggregator wiring)

🔴 Critical (Must Fix)

  1. Hard-coded divisor / 3policyengine_us/variables/gov/states/md/msde/ccs/payment/md_ccs_payment_rate.py:26

    unit_share = p.unit_count[service_unit] / 3

    The literal 3 is the UNIT_3 base count and is already parameterized as p.unit_count["UNIT_3"] = 3. Replace with p.unit_count["UNIT_3"] (or introduce a base_unit_count parameter). Magic number couples the formula to current schema; a future schema change would silently desynchronize.

  2. receives_snap lacks metadatapolicyengine_us/variables/gov/usda/snap/receives_snap.py:1-9
    No label, no reference, no default_value. Silently defaults to False (microsim consequence: zero MD households are SNAP-exempt from copay). Also consider whether the standard PE-US cycle-break pattern using spm_unit_pre_subsidy_childcare_expenses + snap > 0 (already used at md_ccs.py:21) would avoid introducing a new undocumented API input. At minimum, add label, reference, and default_value = False.

  3. Boolean naming convention violationpolicyengine_us/variables/gov/states/md/msde/ccs/eligibility/md_ccs_enrolled.py:4
    Convention is is_* for enrollment booleans (cf. is_tanf_enrolled, is_snap_enrolled). Rename to is_md_ccs_enrolled. Update the consumer at md_ccs_income_eligible.py:31.

  4. Changelog filename / branch name mismatchchangelog.d/md-ccs.added.md
    Branch is md-ccap. CLAUDE.md requires <branch-name>.<type>.md. Rename to md-ccap.added.md. Content is fine.

  5. Page-anchor error — income/smi_rate/initial.yaml cites Feb 2026 W&M briefing #page=22 for the "75% SMI initial threshold administrative origin." PDF 1 p.22 is the Market Rate Survey slide; the 75% origin narrative is on p.20 ("Income eligibility thresholds at initial application are set at 75% of SMI"), and the FY threshold table (already cited) is on p.21. Change #page=22 to #page=20 or drop the third reference.

  6. Page-anchor / authority mismatch — copay/weekly_amount.yaml cites Ch 717 of 2024 #page=19, but p.19 contains the cap text ("not increase copayment levels of the program in effect as of January 1, 2024"), not the $1/$2/$3 schedule values. The values themselves come from the MSDE Tuesday Tidbits bulletin (May 23, 2022, govdelivery URL — link-rot risk) and COMAR 13A.14.06.12. Either revise the reference title to clarify "Ch 717 = cap authority, not schedule values" or restructure so the schedule cites COMAR and the cap cites Ch 717 separately.


🟡 Should Address

Regulatory / scope

  • Countable-income over-inclusion (income/countable_income/sources.yaml)capital_gains and farm_income are included as countable. COMAR 13A.14.06.02B(28) defines countable family income and does not list these as explicit categories; in source-documented audit they appear to exceed the COMAR enumeration. Either justify inclusion (e.g., as components of self-employment / business income under .02B(28)) in the PR description, or drop them.
  • HCV (Section 8) copayment waiver omitted but statutorily required — Ch 525 § 9.5-113(C)(D)(1)(III) (PDF 4 #page=3) explicitly lists "(III) Federal Housing Act Housing Choice Voucher Program" as a waiver category alongside TCA/SSI/WIC/SNAP. md_ccs_weekly_copay.py:23-32 implements only 4 of the 5 statutory waivers. If deferred for data-availability reasons, explicitly note the limitation in the PR description and add a TODO/comment in md_ccs_weekly_copay.py.

References / citations

  • copay/weekly_amount.yaml cites Ch 717 of 2024 (session law) only. Add codified citation Md. Code Educ. Art. § 9.5-113 (the codified location, per Ch 525 of 2022 PDF 4 lines 30-35).
  • govdelivery URL on copay/weekly_amount.yaml is link-rot prone; add a web.archive.org snapshot of the May 23, 2022 Tuesday Tidbits bulletin.
  • payment/region_*_counties.yaml (7 files) cite only the live MSDE rates page; payment/formal/licensed_center.yaml and licensed_family.yaml already pair the live page with a 2022-06-16 Wayback snapshot — add the same Wayback URL to the region-county files for date durability.
  • copay/max_children_with_copay.yaml cites COMAR 13A.14.06.12 generically; the 3-child cap isn't in COMAR .12 plain text — add a more specific subsection or an MSDE policy-manual anchor.
  • payment/infant_age_threshold.yaml (24 months) cites the live MSDE rates page only — the cutoff isn't explicit there. Add COMAR 13A.14.06.11 or the MSDE provider manual.
  • payment/informal/rates.yaml description claims "70th percentile of the March 2021 Market Rate Survey" but cites no MRS — add the MRS reference or trim the claim.
  • copay/unit_hours.yaml cites COMAR 13A.14.06.11 generically — match the granular .11.B(3)/.11.C(2)/.11.D anchors already used by payment/unit_count.yaml.

Code patterns

  • md_child_care_subsidies YEAR aggregator semanticsmd_child_care_subsidies.py:9 is definition_period = YEAR with adds = ["md_ccs"] (MONTH). Core auto-sums 12 monthly values, and md_ccs.py:33 divides by MONTHS_IN_YEAR, so the YEAR aggregator nets to the annual benefit. This works but is inconsistent with sibling state CCDF aggregators (nh_ccap, sc_ccap, vt_ccfap compute monthly inside the formula). Verify intent matches precedent or document the divergence.
  • Useless rename at md_ccs.py:27weekly_to_annual = WEEKS_IN_YEAR is a single-use alias; inline per code-style skill ("Eliminate unnecessary intermediate variables").
  • Verbose divide-by-zero guard at md_ccs_weekly_copay.py:50-54where(eligible_child_count > 0, capped_count/eligible_child_count, 0) could simplify to capped_count / max_(eligible_child_count, 1) (zero numerator yields zero anyway).

Parameter period metadata corrections

  • copay/unit_hours.yaml:7period: year for a daily-hours threshold → should be eternity (or day).
  • copay/federal_cap_rate.yaml:7period: year for a structural /1 ratio → eternity.
  • copay/max_children_with_copay.yaml:7period: year for a structural count → eternity.
  • payment/unit_count.yaml:6period: year for unit-count integers → eternity.

Parameter description verb / placeholder violations

  • payment/infant_age_threshold.yaml:1 uses "defines" (not in allowed verb list).
  • copay/unit_hours.yaml:1 uses "determines" (not allowed).
  • income/countable_income/sources.yaml:1 uses "counts" (not allowed).
  • payment/region_w_counties.yaml:1 and siblings — sets is allowed but missing the "this X" placeholder.
  • payment/unit_count.yaml:1 — missing "this X" placeholder.

Test coverage gaps (highest priority)

  • SMI exact-boundary testsmd_ccs_income_eligible.yaml jumps from $100k to $120k. Add cases at exactly 75% SMI (new applicant → eligible=true), 75% + $1 (eligible=false), and 85% SMI for an enrolled family (eligible=true at boundary).
  • SMI freeze unfreeze contrast — only one freeze case (FY2024 frozen FY2021 SMI = $124,807). Add an FY2023 case (still frozen, same value) and an FY2025 post-unfreeze case (current SMI = $149,249) to lock in the transition.
  • receives_snap cycle-safety benefit value test — current copay Case 6 verifies copay=0 under receives_snap: true but never computes md_ccs. Add a case with receives_snap: true + spm_unit_pre_subsidy_childcare_expenses: 8_000 asserting md_ccs > 0 (correct value) and md_ccs_weekly_copay: 0 — proves no infinite loop and correct value.
  • MDCCSProviderType.NONE rate=0 branchselect(...) NONE arm not exercised in md_ccs_payment_rate.yaml.
  • Same household pre/post 2026-03-01 schedule contrast — existing post-schedule test (Region W, 2027-01 = $262) lacks a paired pre-schedule equivalent at the same county/age/unit, so the schedule transition is not isolated.
  • Lower-priority gaps: Region V (Caroline) payment-rate sanity case; default-vs-true receives_snap contrast in same file; 4th-child-free per-person assertion (Case 19 verifies the cap arithmetically only); activity-failing household flowing into md_ccs_eligible: false; mixed-age expenses-driven integration case where expenses < max_reimbursement; pre-2018 SMI-data-fallback graceful behavior.

🟢 Suggestions

  • Add a 2026-03-01 changelog note in weekly_amount.yaml documenting that the Ch 717 statutory freeze applies to the flat $1/$2/$3 schedule (current values were already at Jan-1-2024 levels, so no period change is needed — but a metadata note would aid future maintainers).
  • Microsim visibility note (not blocking): three bare inputs (md_ccs_provider_type, md_ccs_enrolled, receives_snap) lack formulas and CPS imputation; in microsim every MD person defaults to provider_type = NONE → rate = 0 → md_ccs = 0. Aggregate impact analysis will show $0. Flag in PR description.
  • md_ccs_age_group.py:21 float→int comparison (age * MONTHS_IN_YEAR against infant_age_threshold = 24) is fine; consider an inline comment for the next reader.

PDF Audit Summary

Category Count
Confirmed correct (provider rates 104, SMI values 8, copay values 4) 116
Real value mismatches 0
Missing-feature gaps (HCV waiver statutorily required) 1
Page-anchor reference errors 2

Validation Summary

Check Result
Regulatory accuracy 2 should-fix (capital_gains/farm_income inclusion; HCV waiver omission)
Reference quality 2 critical (smi_rate/initial #page=22 wrong; copay/weekly_amount Ch 717 p.19 cites cap not values), 1 should (add codified Md. Code Educ. Art. § 9.5-113) + 6 polish items
Code patterns 4 critical (hard-coded /3, receives_snap metadata, is_ prefix, changelog filename) + ~6 should-fix (md_child_care_subsidies YEAR semantics, useless rename, 4 period metadata, 4 description verbs)
Test coverage 10 gaps prioritized (5 high — boundary SMI, freeze/unfreeze contrast, cycle-safety value test, NONE rate=0, pre/post-2026-03-01 schedule contrast)
PDF value audit 0 mismatches: 104/104 rates within $1, 8/8 SMI values match, 4/4 copay values match
CI 26/26 PASS

Review Severity: COMMENT

Has critical fixes but is not a regulatory blocker — the issues are code-pattern (hard-coded /3, missing metadata, naming convention, changelog filename), reference-anchor (two wrong #page=NN citations), and one statutory-waiver gap (HCV) to discuss. All 116 audited PDF values are correct.

Note: REQUEST_CHANGES could also be justified given the hard-coded /3 and the statutorily-required HCV waiver omission. Use COMMENT to keep the conversation open and let the author respond to the HCV-scope question; use REQUEST_CHANGES to block merge until the critical-list items are addressed.

hua7450 and others added 2 commits June 2, 2026 16:16
…ferral, fix SMI citation

- Replace hard-coded /3 with p.unit_count["UNIT_3"] in md_ccs_payment_rate
- Document deferral of the Housing Choice Voucher copay waiver and the
  housing_assistance dependency cycle that blocks reading it directly
- Correct W&M briefing page anchor for the 75% SMI origin (slide 22 -> 20)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@hua7450
Copy link
Copy Markdown
Collaborator Author

hua7450 commented Jun 2, 2026

@PavelMakarchuk thanks for the review — pushed fixes for the hard-coded /3 (now p.unit_count["UNIT_3"]) and the smi_rate/initial.yaml page anchor (#page=22#page=20).

On the HCV (Section 8) copay waiver — you're right that Ch 525 of 2022 §9.5-113(C)(D)(1)(III) lists it as a fifth statutory waiver category, and we currently implement only TCA/SSI/SNAP/WIC. We're deferring it for now because of a dependency cycle: the only signal for HCV receipt is the computed housing_assistance, and reading it inside md_ccs_weekly_copay would loop —

md_ccs_weekly_copay → housing_assistance → hud_hap → hud_adjusted_income
    → childcare_expenses → md_ccs → md_ccs_weekly_copay

(hud_adjusted_income deducts childcare_expenses, which nets out md_ccs.) This is the same cycle that forced the bare-input workaround for SNAP/WIC (receives_snap / receives_wic). To do HCV properly we'd need a parallel cycle-safe input (e.g. receives_housing_voucher), which has no CPS imputation yet and so would have no effect in microsim regardless.

I've documented the omission and the cycle in a code comment in md_ccs_weekly_copay.py. Happy to add the bare input if you'd prefer it wired in now rather than deferred.

For the period: yeareternity suggestions on unit_hours / federal_cap_rate / max_children_with_copay / unit_count: we keep year per our project convention of not using period: eternity — let me know if you'd rather I revisit that.

@hua7450 hua7450 requested a review from PavelMakarchuk June 2, 2026 21:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Implement Maryland CCAP (Child Care Assistance Program)

2 participants