Skip to content

Implement the New York Child Care Assistance Program under gov/states/ny - #9187

Merged
hua7450 merged 16 commits into
PolicyEngine:mainfrom
hua7450:ny-ccdf
Aug 18, 2026
Merged

Implement the New York Child Care Assistance Program under gov/states/ny#9187
hua7450 merged 16 commits into
PolicyEngine:mainfrom
hua7450:ny-ccdf

Conversation

@hua7450

@hua7450 hua7450 commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements New York's Child Care Assistance Program (CCAP) as a proper state program under gov/states/ny/ocfs/ccap/, encoding current law only — the October 2024 market rates and the post-October-2023 policy structure.

Closes #9282

The legacy "federal" CCDF implementation under gov/hhs/ccdf/ (which is actually New York data, and is inert on main — not registered in any benefit aggregate) is left untouched here; its removal is a follow-up tracked in #9283.

Regulatory authority

  • 18 NYCRR Part 415 (Child Care Services) and Part 404 (Eligibility)
  • Social Services Law §§ 410-u, 410-w, 410-x as revised effective October 1, 2023
  • 24-OCFS-LCM-22 (October 2024 market rates), 23-OCFS-ADM-18, 22-OCFS-ADM-18
  • NYS Register, May 1, 2024, Rule Making Activities (OCFS)

What is modeled

Component Rule How modeled
Income limit 85% of state median income, the sole ceiling since 2023-10-01 (SSL 410-w) ny_ccap_income_eligible
Countable income 18 NYCRR 404.5(b)(5); a child's SSI excluded, an adult's counted ny_ccap_countable_income (8 sources)
Eligible child Federal age/asset tests + NY categorical routes: foster care and protective/preventive services eligible without regard to income; homelessness waives the activity test only ny_ccap_eligible_child
Family share 1% of income above the state income standard, $1 weekly minimum, categorical exemptions (public assistance, homeless, foster care, protective services) ny_ccap_family_share, ny_ccap_family_share_exempt
Market rates Oct 2024 schedule: 4 county groups × 5 provider types × 4 age groups × weekly/daily/part-day, excess-day pricing under 415.9(b) ny_ccap_market_rate + rates/*.yaml
Benefit Per-child cap at min(expense share, market rate), less the family share ny_ccap

All 240 current rate cells were verified against 24-OCFS-LCM-22 Attachment A.

Not modeled (by design)

  • Historical eras (pre-Oct-2024 rates, the 200%/300% FPG income limits, the 10% family share) — current law backdates via backdate_parameters
  • Non-traditional-hours/homelessness/accreditation payment differentials, special-needs substituted rates, excess-period payments, Title XX levels, the child-only family-share exception, waitlist rationing (all listed in programs.yaml notes)
  • Provider county (household county proxies; unknown counties default to the lowest-rate group)

Registration

  • gov/hhs/ccdf/child_care_subsidy_programs.yaml (all blocks) → flows into child_care_subsidies
  • gov/household/household_state_benefits.yaml (all eras)
  • programs.yaml CCDF state_implementations

Test plan

  • 68 NY CCAP YAML tests pass (unit tests per variable + integration cases asserting the federal aggregator)
  • 63 federal CCDF YAML tests pass (files restored to main's state)
  • test_aggregate_list_integrity.py 15/15
  • CI passes

🤖 Generated with Claude Code

@codecov

codecov Bot commented Jul 31, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (0eec199) to head (3ad18f4).
⚠️ Report is 9 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##              main     #9187    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files            2        12    +10     
  Lines           31       204   +173     
  Branches         0         5     +5     
==========================================
+ Hits            31       204   +173     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

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

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

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

hua7450 and others added 8 commits August 2, 2026 01:41
…s, countable income

- Add the 2022-06-01 market-rate era from 22-OCFS-LCM-14 (269 cells); hourly
  rates end the same date via a new part-day minimum-hours parameter
- Replace the 62-county family share schedule with the statutory 10% cap
  (SSL 410-x(6), eff. 2021-04-16, per 21-OCFS-ADM-14); drop the unsourced
  0.1 fallback and the Google Sheets reference
- Exempt families at or below the poverty level from the historical family
  share minimum (18 NYCRR 415.3(e)(1), (e)(4))
- Add NY income eligibility: 300% of FPG through September 2023, 85% of SMI
  after (NYS Register 05/01/2024)
- Broaden CCDF countable income with child support, unemployment and
  workers' compensation, and Social Security; document the TANF omission

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes from a source-verified review of the New York Child Care Assistance
Program implementation:

- Income eligibility was 200% of the state income standard through
  2022-07-31, not 300% from 2021-10-01 (22-OCFS-ADM-18), and the 85% state
  median income ceiling binds alongside the 300% limit from 2022-08-01.
- Children placed in foster care and children with an open child protective
  or preventive services case are eligible without regard to income
  (18 NYCRR 415.2(a)(2)(vi)); homelessness waives only the activity test.
- Cap payments per child rather than on pooled SPM unit totals
  (18 NYCRR 415.6(e)(3)).
- Apply the statutory family share exceptions in 18 NYCRR 415.3(e)(1),
  using is_tanf_enrolled to avoid the CCAP to TANF circular dependency.
- Add the 30-hour weekly conjunct to the daily rate unit, price days beyond
  the weekly maximum at the weekly rate divided by five, and apply the
  part-day carve-out for sub-three-hour before and after school care.
- Count SSI and veterans' benefits through a New York countable income
  variable, excluding a child's SSI only from the October 2023 rule.
- Re-key the inherited 19-OCFS-LCM-23 schedule to its stated 2019-05-01
  effective date, and correct four citation defects including a 404 URL
  path and a wrong page anchor.

Consolidate the parameter tree from 29 files to 18: merge the family share
rate into one dated parameter, collapse four booleans that shared the
2023-10-01 effective date into october_2023_reforms, and fold the age_groups
and duration folders into node files.

Add 41 test cases, including boundary coverage for every mid-year switch and
for the formulas that previously passed with the code deleted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…into ny-ccdf

# Conflicts:
#	policyengine_us/parameters/gov/household/household_state_benefits.yaml
#	policyengine_us/programs.yaml
The merge with main auto-merged child_care_subsidy_programs.yaml without a
conflict, but upstream had added 2024-01-01 and 2025-01-01 blocks. These
lists are full replacements rather than deltas, so ny_child_care_subsidies
existed only in the 2021-01-01 block and dropped out from 2024 onward.

That zeroed child_care_subsidies for New York in the newer blocks, which
failed three integration cases and the aggregate list integrity check.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
is_ccdf_initial_income_eligible and is_ccdf_continuous_income_eligible
have no readers anywhere in the model, tests, or partner contracts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Encode only the post-October-2024 rate schedule and post-October-2023
policy structure under gov/states/ny/ocfs/ccap, dropping the historical
eras and their toggles. Restore the inert federal CCDF implementation
to main's state; its removal moves to a follow-up (PolicyEngine#9283).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…into ny-ccdf

# Conflicts:
#	policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml
#	policyengine_us/programs.yaml
@hua7450 hua7450 changed the title Fix New York CCAP rates and namespace Implement the New York Child Care Assistance Program under gov/states/ny Aug 14, 2026
hua7450 and others added 4 commits August 14, 2026 02:17
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… tests

Rate unit and pricing:
- Apply 18 NYCRR 415.9(a)'s five-or-fewer-days limb and 415.9(c)'s mandatory
  six-hour-per-day part-day floor when selecting the base rate. Five hours
  across six days was priced at a weekly rate plus an excess day ($580.80/wk
  for a group 1 centre infant) where the regulation gives six part-day rates
  ($390.00/wk).
- Price excess periods under 415.9(d) at the rate for the time the period
  covers, rather than the weekly rate divided by five, and add the
  over-twelve-hour excess period. Reproduces the worked example in
  24-OCFS-LCM-22 sec. III.5 exactly.

Countable income:
- Enumerate the 404.5(b)(5) sources instead of pulling market_income, which
  brought in capital gains against the express exclusion in 404.5(b)(6)(viii).
  Every other state child care program enumerates its sources this way.
- Exclude a dependent child's earnings per 404.5(b)(6)(xiii).
- Count railroad retirement, which 404.5(b)(5)(iv) reaches.

Eligibility:
- Add the 415.1(b)(2)-(3) age extensions for a child with special needs.
- Make the protective and preventive services waiver family-level per
  415.2(a)(2)(vi)(b), matching the family-share exemption.
- Apply the federal immigration test, which 45 CFR 98.20(a)(1)(ii) requires.
- Derive the reason for care from hours worked, student status and public
  assistance enrollment, keeping meets_ccdf_activity_test as the fallback for
  the pathways that are not individually modeled. The benefit previously
  evaluated to zero for every household in microsimulation because that input
  is false throughout the dataset.

Also splits the duration parameters so each carries its own unit, prorates
expenses across children in paid care, corrects three reference anchors and
the family-share citation, and marks the program partial in programs.yaml
with the unmodeled rules listed. Test cases go from 63 to 108.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…into ny-ccdf

# Conflicts:
#	policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml
@hua7450
hua7450 marked this pull request as ready for review August 14, 2026 18:49
@hua7450
hua7450 requested a review from PavelMakarchuk August 18, 2026 02:50
hua7450 and others added 2 commits August 18, 2026 13:21
- Add ny_ccap_activity_eligible.yaml covering the work-hours, two-caretaker,
  student, public assistance and fallback branches
- Fix ny_ccap_family_share_exempt documentation: 415.3(e)(1) does list the
  at-or-below-100%-SIS exception; point the reference at page 19
- Correct 415.2(a)(2) subparagraph citations to (v)(a) and (v)(d)
- Note the post-secondary student over-inclusion in ny_ccap_age_eligible and
  reconcile the programs.yaml note with the public assistance branch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@PavelMakarchuk

Copy link
Copy Markdown
Collaborator

PR Review

Reviewed head 7439bb7 — 17 parameter files, 15 variables, 117 YAML tests, programs.yaml entry, aggregator registration — against 18 NYCRR Part 415, SSL § 410-w, 24-OCFS-LCM-22 (Oct 2024 market rates) and 23-OCFS-ADM-18. Structure mirrors the other state CCAPs (NC/CO/SC: SPM-unit monthly benefit = min(expenses, rate) − family share; duration enum from childcare_hours_per_day / days_per_week; defined_for = StateCode.NY; ny_child_care_subsidies aggregator) and the legacy inert gov/hhs/ccdf NY data is left for #9283.

Caveat: ocfs.ny.gov was unreachable from the review sandbox, so individual rate cells in rates/*.yaml were not re-checked against Attachment A; the assessment of values relies on the PR's page-anchored citations.

🔴 Critical (Must Fix)

None.

🟡 Should Address

  1. 12-hour rule: reference says "12 hours or more", code applies "> 12". parameters/gov/states/ny/ocfs/ccap/duration/daily_maximum_hours.yaml:9 titles its reference "care of 12 hours or more in a day earns an additional market rate", but variables/.../rates/ny_ccap_market_rate.py:56-63 computes excess_hours = max_(hours - 12, 0) and adds a period only when excess_hours > 0. Tests (ny_ccap_duration_of_care.yaml Cases 10/11, ny_ccap_market_rate.yaml Case 8) only exercise > 12. Reconcile with 415.9 / LCM §III.4.b — either hours >= daily_maximum_hours or fix the reference wording — and add an exactly-12-hours test either way.
  2. Hourly rate tier is absent. OCFS Attachment A (and the legacy gov/hhs/ccdf/amount.yaml NY schedule) publish an HOURLY column; the PR encodes weekly/daily/part-day only, and ny_ccap_duration_of_care.py maps everything under 6 h/day to part-day. Under 415.9 short care (fewer than 3 hours/day) is priced hourly. Either add the hourly tier or list it explicitly under "not modeled" in the programs.yaml notes (currently not mentioned).

🟢 Suggestions

  1. Start dates vs cited instruments. age_groups.yaml and duration/*.yaml start 2019-05-01, eligibility/age_limit/*.yaml start 2021-10-01, while the only cited sources are the 2024 LCM / current Part 415. Backfilling makes this harmless, but align the dates with the cited instrument (or cite the 2019 LCM) for consistency with rates/*.yaml and county_group.yaml (2024-10-01).
  2. parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml:98,150ny_child_care_subsidies is appended at the end of the 2024/2025 blocks but placed alphabetically in the 2021 block; pick one ordering.
  3. ny_ccap.py:20-22 gates the benefit on childcare_hours_per_day > 0 (also drives duration/rate). A user entering only expenses gets $0 — same as SC/GA, unlike CO/NC; worth a line in the programs.yaml notes.
  4. ny_ccap_county_group.py:33 — default GROUP_3 (lowest rates) for unimputed counties is documented; since NYC + downstate hold most children, the downward microsim bias is worth one more sentence in the notes.
  5. Branch/changelog are named ny-ccdf while everything else is ny_ccap_* — cosmetic.

Validation Summary

Check Result
Regulatory Accuracy 2 issues (12-hour boundary; hourly tier). 85% SMI limit, 1% share above FPL with $1/week minimum (415.3(e)(3)-(4), 23-OCFS-ADM-18 eff. 2023-10-01), age 13 / 18 / 19, 4 county groups × 5 provider types × 4 age bands, weekly ≥30h/5d, daily ≥6h — structure verified against the cited rules
Reference Quality 0 issues — sampled 10 parameter files; all have titled references with page anchors (ADM/LCM pages, NYCRR pages, SSL, 45 CFR 98.20, CCDF State Plan p.91)
Code Patterns 0 issues — no hard-codes; ny_ccap_* naming; add()/adds correct; YEAR bools read via period.this_year from MONTH formulas; vectorized select/where/np.isin; programs.yaml entry present; registered in all blocks of child_care_subsidy_programs.yaml and household_state_benefits.yaml; changelog added correct; no partner-test edits needed (partner shard green)
Test Coverage 0 blocking gaps — 85% SMI at/above/below, copay at FPL / just above / minimum crossover, per-child cap and ineligible sibling, all four county groups and provider types, child_care_subsidies aggregation. Missing: exactly-12-hour case (see #1)
CI Status Partner + codecov green; full-suite shards were still pending at review time

Verdict: COMMENT — approve once the 12-hour boundary is reconciled and the hourly tier is either added or documented as out of scope.

- ny_ccap_market_rate adds the excess-hour period on each day at or above
  the daily maximum hours, per 24-OCFS-LCM-22 sec. III.4 ("12 hours or more")
- Add exactly-12-hour and just-below tests; align docs, the parameter
  description, programs.yaml notes and the changelog
- programs.yaml notes: county default bias, the hours/days inputs the benefit
  requires, and that the pre-2022 hourly tier no longer exists

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@hua7450

hua7450 commented Aug 18, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks — addressed in 2372ff7:

Should address

  1. 12-hour boundary — switched to the literal LCM reading: ny_ccap_market_rate now adds the extra period on each day of care at or above 12 hours (>=), priced by the time over 12 hours, so exactly-12 draws a part-day period. Added ny_ccap_market_rate.yaml Case 8a (12 h × 5 d → weekly + 5 part-day) and 8b (11.99 h → weekly only); parameter description, variable docs, programs.yaml notes and changelog aligned.
  2. Hourly tier — no longer exists in current law. 24-OCFS-LCM-22 Attachment A (pp. 15–18) publishes only Weekly / Daily / Part-Day rows for every provider type and county group, and 18 NYCRR 415.9(a)–(c) (compilation current as of 12/24/2025) defines only those three tiers — the word "hourly" appears in neither document. The HOURLY column lives only in the legacy 2019 schedule (gov/hhs/ccdf/amount.yaml, cited to the 2019 market-rate survey), which Remove the inert federal CCDF implementation (New York data under gov/hhs/ccdf) #9283 will retire. Added a sentence to the programs.yaml notes so it isn't re-raised.

Suggestions

  • 3 & 4 — added to programs.yaml notes: the benefit needs childcare_hours_per_day / childcare_days_per_week (the rate is priced by duration; expenses alone yield $0), and the group-3 default is the lowest-rate group while NYC/downstate hold most of the state's children.
  • 1 (parameter start dates) — inert under backdate_parameters; left as-is.
  • 2 (ordering in child_care_subsidy_programs.yaml) — the 2024/2025 blocks are append-ordered (WY, TX at the end), so NY follows that; the 2021 block is alphabetical and NY sits alphabetically there.
  • 5 — cosmetic, left.

Also in 5997301: added ny_ccap_activity_eligible.yaml (9 cases — the work-hours, two-caretaker, student, public-assistance and fallback branches had no direct coverage), fixed a doc claim in ny_ccap_family_share_exempt (415.3(e)(1) does list the ≤100%-SIS exception; page anchor → 19), and corrected the 415.2(a)(2) citations to (v)(a)/(v)(d). 119 NY YAML tests pass locally.

@hua7450
hua7450 merged commit d7985d7 into PolicyEngine:main Aug 18, 2026
31 checks passed
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.

Encode New York Child Care Assistance Program (CCAP) under gov/states/ny

2 participants