Skip to content

Fix New York child care categorical routes and family shares - #10817

Merged
MaxGhenis merged 5 commits into
mainfrom
ny-ccap-categorical-routes
Nov 14, 2026
Merged

MaxGhenis merged 5 commits into
mainfrom
ny-ccap-categorical-routes

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 12, 2026 •

Copy link
Copy Markdown
Contributor

New York CCAP now counts Safety Net Assistance and veteran assistance as public assistance alongside TANF enrollment, under Social Services Law § 2(19). A public assistance family now qualifies for care when its caretakers work, study, take part in a required activity or meet another reason for care, under Social Services Law § 410-w(1)(a) and (3) and 18 NYCRR 415.2(a)(1).

Families that receive preventive child care and child-only child care services units pay no family share under 415.3(e)(1). OCFS proposed both exceptions in the August 4, 2021 State Register and adopted them effective November 24, 2021. A child who receives preventive child care also qualifies through Title XX when the district authorizes that care under 415.2(b) and the child meets the 415.1(b) age test.

The activity correction removes eligibility from public assistance families without work, study, a required activity or another reason for care. Every new input defaults to false, so at default inputs only this correction changes results.

Closes #10703
Closes #10704
Closes #10708
Closes #10709

Invariants

The property tests live in policyengine_us/tests/core/test_ny_ccap_categorical_routes_invariants.py. The focused YAML cases live in policyengine_us/tests/policy/baseline/gov/states/ny/ocfs/ccap/ny_ccap.yaml and ny_ccap_activity_eligible.yaml.

  • With every new input false, results match main except for the intended public assistance activity correction. test_defaults_preserve_main_except_public_assistance_activity checks both omitted and explicit defaults against a restatement of main's formulas.
  • Turning on Safety Net Assistance, veteran assistance, preventive services, child-only status, required activity or Title XX approval never raises ny_ccap_family_share or lowers ny_ccap. test_categorical_inputs_never_raise_share_or_lower_ccap checks each input separately.
  • ny_ccap_family_share equals zero whenever ny_ccap_family_share_exempt holds, and shares and benefits remain nonnegative. test_categorical_inputs_never_raise_share_or_lower_ccap checks these bounds.
  • Public assistance families without work, study, required activity or another route fail the reason-for-care test. test_public_assistance_needs_work_or_required_activity checks TANF, Safety Net Assistance and veteran assistance.
  • The Title XX preventive route requires preventive receipt and completed authorization for the same child, and the child must pass the 415.1(b) age test or be 13. test_title_xx_approval_serves_only_the_preventive_child checks children aged 0, 4, 12, 13, 14, 15 and 17 under every combination of receipt and approval, and checks that no adult in the unit qualifies.
  • YAML cases deny the route to an ordinary sibling, to an approved 14-year-old without special needs and to two children who split preventive care and approval. They grant it to an approved 15-year-old with special needs.
  • Monthly receipt, child-only status and authorization can end within the year. YAML cases check the return of ordinary shares and the end of a school-year Title XX continuation.

Methodology choices

  • Give all six new boolean inputs monthly periods, false defaults and period dispatch. Monthly status lets receipt, unit composition and authorization end during the year.
  • Use separate SPM-unit inputs for Safety Net Assistance and veteran assistance receipt by a parent or caretaker relative. Keep receipt distinct from benefit amounts, and combine both with reported TANF enrollment for the public assistance routes.
  • Require the new activity input for the public assistance guarantee while preserving work, full-time study and the existing fallback routes. PolicyEngine has no input for pending public assistance applications, although 415.2(a)(1) also covers applicants.
  • Retain the existing positive-hours work test and tax-unit-head-or-spouse caretaker approximation. NYC Public Schools and Oneida County publish a ten-hour minimum, and we found no statewide OCFS figure.
  • Use an explicit SPM-unit input for child-only status under 415.1(l)(1)(iv), with no adult family member receiving public assistance. Existing tax roles and parent variables cannot identify the legal relationships 415.1(l)(1)(iv) names, so they cannot tell when a child lives only with other people.
  • Record preventive child care for each child, and waive the unit's whole family share when any member receives it. OCFS ties the preventive exception in 415.3(e)(1) to the child that receives the care. PolicyEngine computes one family share per unit, as it already does for foster care, so the family also pays no share for a sibling in ordinary care.
  • Keep the Child Care Block Grant income and activity tests for a child with preventive receipt and no Title XX authorization.
  • Require preventive receipt, completed district authorization and the 415.1(b) age test for the separate child-level Title XX route. Callers confirm the other applicable state and federal conditions for that child, provider and month: funding, district plans, need, priorities, financial eligibility, provider eligibility and required OCFS approval.
  • Admit a 13-year-old on the Title XX route and leave the school-year timing to the authorization input. 415.1(b)(1) and 415.2(d)(4)(ii) let a child who turns 13 during a school year finish that school year. PolicyEngine holds each person's age by year, with no birth date or school calendar, so callers end monthly authorization when the continuation ends.
  • Extend the Title XX route through ny_ccap_age_eligible to a child under 18 with special needs or under court supervision, or under 19 as a full-time secondary student. Under 415.2(d)(4)(ii), the district must close a Title XX case "when the child turns 13 years of age", apart from the school-year continuation. We read that rule as covering a child eligible under 415.1(b)(1). 415.1(b)(2) and (3) define an eligible child without limiting either paragraph to the block grant, and 415.2(d)(4)(i)(g)-(i) give each of the three paragraphs its own block grant closing age. When a district closes such a child's case, the caller sets the authorization input to false.
  • Skip the income, asset and child immigration tests on the Title XX route, and let the authorization input carry any immigration condition that applies. Under 404.5(c)(4), districts determine families eligible for preventive services for children "without regard to financial eligibility criteria".
  • Apply the preventive and child-only exceptions in every period. They took effect on November 24, 2021, before October 1, 2023, the start of the earliest family share rate PolicyEngine holds.
  • Keep the protective-services helper's formula and its family-level scope, and correct its label and documentation to describe protective services only. We read protective cases separately from Title XX preventive care in 415.2.
  • Apply the existing expense allocation and per-child market-rate caps in ny_ccap.py to Title XX care. Retain the existing block grant gates for all other routes.

We read the OCFS Part 415 compilation current as of February 13, 2024, and the OCFS Part 404 compilation current as of October 1, 2023, both from Internet Archive copies of May 22, 2024. Page anchors follow those copies.

Validation

Pull request run 43540191937 at c9776d3061 passed all 37 jobs on GitHub's merge with main 7acc38c2ac.

90 YAML cases pass in seven New York child care files: 37 benefit cases in ny_ccap.yaml, including 27 new cases, plus 9 activity, 14 eligible-child, 9 court-supervision, 7 family-share-exemption, 8 family-share and 6 integration cases. The four property tests pass with max_examples=12 each.

The cases catch five alterations of the Title XX route:

  • Removing the age test fails the 14-year-old case and the property test.
  • Dropping the school-year continuation fails the 13-year-old case and the property test.
  • Extending the continuation through age 14 fails the 14-year-old case.
  • Counting preventive care received by any unit member fails the case that splits care and approval across two children.
  • Dropping the special-needs extension fails the 15-year-old case and the property test.

Comments on the 14-year-old, 15-year-old, split-care and sibling Title XX cases carry their arithmetic. For example, the approved 15-year-old with special needs receives min($10,800 / 12 = $900, $600 rate) less a $0 share, or $600.

Ruff format and lint passed on the changed files, and git diff --check passed. The property file runs in the Makefile's core group of Rest Python tests, which CI spreads over its "Full Suite - Rest (Python shard N)" jobs. The Title XX property test simulates 28 households per example. In two local macOS runs, the file took 13.1 and 24.8 seconds under pytest; we did not measure its peak memory or its Linux CI time.

Microsimulation impact

We estimate that this branch changes none of the outputs below in 2026 on the default dataset. We compared main at 75aee22d6d with this branch at c9776d3061.

Output Main total Change Records changed (weighted)
ny_ccap $0 $0 0 (0)
ny_child_care_subsidies $0 $0 0 (0)
child_care_subsidies $1.72bn $0 0 (0)
state_income_tax $577.2bn $0 0 (0)
income_tax $2,594.9bn $0 0 (0)
household_benefits $2,060.4bn $0 0 (0)
household_net_income $17,199.2bn $0 0 (0)

On that dataset, we estimate $0 of New York child care assistance in 2026 at both commits, so the household tests above show what this change does.

axiom: TheAxiomFoundation/rulespec-us#2225 queued (Social Services Law § 2(19) and § 410-w and 18 NYCRR 415.1–415.3 and 404.5; the corpus lacks OCFS Parts 404 and 415, so the signed encoder can't run yet)

🤖 Generated with Claude Code

MaxGhenis and others added 3 commits November 11, 2026 19:26
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
18 NYCRR 415.1(b) limits an eligible child to under 13, with special-needs
and court-supervision extensions, and 415.2(d)(4)(ii) closes a Title XX
case at 13 apart from the school-year continuation. ny_ccap_eligible_child
now applies ny_ccap_age_eligible on the Title XX route and admits a
13-year-old, whose continuation the authorization input records.

New cases cover an approved 14-year-old, an approved 15-year-old with
special needs, and preventive care and approval split across two children.
We document the per-unit family share waiver and the November 24, 2021
start of the preventive and child-only exceptions, and add a fixed
changelog fragment for the public assistance activity correction.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review November 13, 2026 23:20
The comment above the district-approved preventive case in ny_ccap.yaml
listed age among the conditions that district approval records.
ny_ccap_eligible_child applies the 18 NYCRR 415.1(b) age test, and the
comment now says the case's four-year-old passes it.

ny_ccap_receives_preventive_services cited 18 NYCRR 415.3(e)(1) at PDF
page 19 of the OCFS Part 415 compilation current as of February 13, 2024,
where 415.3(e)(2) begins. The reference now points to page 18, which holds
415.3(e)(1).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@MaxGhenis

Copy link
Copy Markdown
Contributor Author

US + core hub merge audit, us#10817 at c9776d306133eccd54f8ce527bf871d97010c272 (squash): Fix New York child care categorical routes and family shares.

  • Reviews:
    • The PR has no GitHub reviews. Two independent review rounds ran outside GitHub, with a fix round between them.
    • The first round, at 7378639a00, read 18 NYCRR 415.1(b) and (l)(1)(iv), 415.2(a)(1), (b) and (d)(4)(ii), 415.3(e)(1) and 404.5(c) and (d), and Social Services Law § 2(19) and § 410-w. It computed 20 synthetic households by hand and ran them, with 3 real-formula households, on the head and on the merge base 75aee22d6d. All 20 synthetic results matched its hand figures.
    • It found that the Title XX route skipped the 415.1(b) age test, so an authorized preventive 15-year-old with no special needs got $600 a month. A mutant that read preventive receipt anywhere in the unit survived every case then in ny_ccap.yaml. It also asked for dates on the preventive and child-only exceptions, a note on the per-unit share waiver, a fixed changelog fragment and a population estimate.
    • The fix round, at b8db54ca79, gated the Title XX route on the age test, kept the special-needs and court-supervision limits and admitted a 13-year-old. It added cases for an authorized 14-year-old without special needs, a 15-year-old with them, and two children who split preventive care and authorization. The property test now covers seven ages. It dated both exceptions from the State Register, effective November 24, 2021. Each of four mutants of the route failed a case.
    • The second round approved b8db54ca79 with no blocking finding. It fetched Internet Archive copies of the OCFS Part 415 and Part 404 compilations and the two 2021 State Register issues from dos.ny.gov, and checked every source anchor in the description against them. All 90 YAML cases in seven New York child care files and the four property tests pass. Each of five mutants of the route failed a case, including one that dropped the special-needs extension. It hand-checked the three new Title XX cases, and git merge-tree against main showed no conflict.
    • It listed three minor findings. A test comment at ny_ccap.yaml line 834 still said authorization records age, and the description didn't state its reading of 415.2(d)(4)(ii). The new preventive input cited Part 415 at page 19, where 415.3(e)(1) sits on page 18. I fixed the comment and the anchor in c9776d3061, which changes no formula, value or test case.
    • The reviews listed corrections to the description, and I made each before merge. The description now cites § 410-w, links government sources only, lists the property test's seven ages and states the 415.2(d)(4)(ii) reading under Methodology choices. It names the CI jobs that run the property file, gives both local timings and uses an accepted axiom: form.
  • Methodology choices for maintainers:
    • The Title XX route admits any 13-year-old and leaves the school-year continuation to the authorization input. 415.1(b)(1) and 415.2(d)(4)(ii) let a child who turns 13 during a school year finish that year. The model holds age by year, with no birth date or school calendar, so a caller ends authorization when that school year ends.
    • The model waives the whole family share when any member receives preventive care, as main does for foster care. 415.3(e)(1) ties the exception to the child who receives the assistance. A family with a preventive child and a sibling in ordinary block grant care pays no share, where a per-child reading would charge one for the sibling's care. No test has such a family.
    • The Title XX route keeps the 415.1(b)(2) and (3) limits for a child with special needs or under court supervision: under 18, or under 19 as a full-time secondary student. 415.2(d)(4)(ii) says a Title XX case "must be closed when the child turns 13 years of age", apart from the school-year continuation. I read that rule as covering a child eligible under 415.1(b)(1), since (d)(4)(i) gives each 415.1(b) paragraph its own block grant closing age. A maintainer who reads (d)(4)(ii) as closing every Title XX case at 13 would drop the extension, and the 15-year-old case would expect $0 instead of $600.
    • The Title XX route skips the income, asset and child immigration tests. 404.5(c)(4) covers the financial tests, and the authorization input carries any immigration condition that applies.
    • OCFS made the preventive and child-only exceptions effective on November 24, 2021. The PR applies them in every period with no start date, since the model's earliest family share rate starts on October 1, 2023. A backfill of earlier rates would need a start date for both.
  • Gates checked live at merge:
    • gh pr checks exits 0;
    • the latest Pull request run at the head, 43540191937, passed and tested this head merged into main at 7acc38c2ac;
    • MERGEABLE;
    • not a draft;
    • no reviewer's latest review requests changes;
    • the semantic-overlap guard: since 7acc38c2ac, main has changed no area this PR touches. Between the PR's merge base 75aee22d6d and main at 7acc38c2ac, main changed one file this PR touches, programs.yaml, where it edited the LIHEAP entry and this PR edits the New York CCAP notes. Main changed nothing under ny/ocfs, and no line it changed names is_tanf_enrolled, receives_tanf or meets_ccdf_activity_test, which this PR reads. Add New York CCAP differentials and enhanced payment rates #10821 and Count public assistance and SSI supplements in New York CCAP income #10827, which also change New York CCAP, haven't landed. The branch merges into main at 7acc38c2ac without conflict;
    • the merge pins the head.
  • Impact: we estimate no change in 2026 on the default dataset. ny_ccap and ny_child_care_subsidies total $0 at main 75aee22d6d and at c9776d3061, and child_care_subsidies, state and federal income tax, household benefits and household net income don't move. The household tests show the change.
  • Next:
  • Axiom: Encode New York child care assistance: the public assistance and Title XX preventive routes and family share exceptions (Social Services Law §§ 2(19) and 410-w; 18 NYCRR 404.5 and 415.1-415.3) (PE-US #10817) TheAxiomFoundation/rulespec-us#2225 queued, a new pe-parity issue for Social Services Law § 2(19) and § 410-w and 18 NYCRR 415.1(b), 415.2(a)(1), (b) and (d)(4), 415.3(e)(1) and 404.5(c), with companion rows from this PR's YAML. The signed encoder can't run yet: the corpus holds no OCFS Part 404, Part 415 or Social Services Law § 2, and its pinned release doesn't carry § 410-w.

🤖 Generated with Claude Code

@MaxGhenis
MaxGhenis deleted the ny-ccap-categorical-routes branch November 14, 2026 03:54
MaxGhenis added a commit that referenced this pull request Nov 14, 2026
Main now holds New York's categorical routes and family share exceptions
(#10817). Resolve two conflicts:

- programs.yaml: keep main's New York child care note, add the income
  sources this branch counts and drop the public assistance income gap
  this branch closes.
- ny_ccap_family_share_exempt.py: keep main's Safety Net Assistance,
  veteran assistance, preventive care and child-only exceptions, and read
  the Family Assistance grant the family takes up beside reported
  enrollment.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant