Skip to content

The model ends New York block grant child care at 13, without the carry-over to the end of the eligibility period #10921

Open

Description

@MaxGhenis

New York keeps a child in block grant child care after their 13th birthday until the family's eligibility period ends or the child turns 14. The model has no input for when that period began, so it denies block grant care to every 13-year-old without special needs or court supervision. For example, a single parent in Brooklyn earns $40,000 and pays $6,000 a year for one child's after-school center care, three hours a day, five days a week. In January 2025, the model gives them $484.29 in New York child care assistance for a 12-year-old and $0 for a 13-year-old, with the same income test result, market rate and family share.

The model gets the right answer for a family that first applies after the child turns 13, since a child must be under 13 when the district determines eligibility. It denies care to a family whose child turned 13 during a period that began before the birthday. The model also drops a child with special needs or under court supervision at 18, or at 19 if they attend secondary school full time. In block grant care, New York keeps such a child eligible until the period ends or they turn 19 or 20. A user meets this gap in a household calculation for a 13-year-old in paid care, or an 18- or 19-year-old in either group, whose family's period began before the birthday.

What New York's regulation says

Under 18 NYCRR 415.1(b)(1), a child qualifies when the social services district determines eligibility before their 13th birthday. For care under the New York State Child Care Block Grant, a child who turns 13 "remains eligible for assistance through the end of the eligibility period or until the child reaches 14 years of age". Under paragraphs (b)(2) and (b)(3), a child with special needs or under court supervision qualifies under 18, or under 19 as a full-time secondary student. Under the block grant, such a child stays eligible after turning 18 or 19 until the period ends or they turn 19 or 20.

Under 415.2(c), a district provides block grant care for 12 or 24 months. Under 415.2(d)(4)(i), the district keeps providing it for the whole period unless one of the listed events occurs. Among those events, in clauses (g) to (i), a child eligible under 415.1(b)(1), (2) or (3) turns 14, 19 or 20.

OCFS amended Part 415 to "clarify the age at which a child in receipt of child care assistance loses eligibility" by an emergency rule effective March 31, 2023. It made the rule permanent effective July 12, 2023 (State Register I.D. No. CFS-16-23-00001). OCFS printed all three carry-overs in its compilation of Part 415 current as of March 31, 2023, and none in the one current as of December 1, 2022. We cite PDF pages from the compilation current as of February 13, 2024.

Where the model applies the cutoff

In ny_ccap_age_eligible, the model reads the child's age for the year, with no eligibility period or determination date:

        extended_age_eligible = (age < p.special_needs) | (
            secondary_student & (age < p.special_needs_student)
        )
        return (age < p.base) | (
            (special_needs | under_court_supervision) & extended_age_eligible
        )

The model takes the limits from base.yaml (13), special_needs.yaml (18) and special_needs_student.yaml (19). It requires the age test in ny_ccap_eligible_child and pays ny_ccap only for eligible children in care.

In the variable's documentation, we list the (b)(2) and (b)(3) carry-overs as not modeled and leave out the (b)(1) carry-over to 14. In New York's entry in programs.yaml, we describe the 415.1(b) age extensions as modeled and don't mention the carry-overs.

Reproduction

from policyengine_us import Simulation


def household(child_age, child_extra=None):
    child = {
        "age": {2025: child_age},
        "childcare_provider_type_group": {2025: "DCC_SACC"},
        "childcare_hours_per_day": {2025: 3},
        "childcare_days_per_week": {2025: 5},
    }
    child.update(child_extra or {})
    return {
        "people": {
            "parent": {
                "age": {2025: 40},
                "employment_income": {2025: 40_000},
                "weekly_hours_worked_before_lsr": {2025: 40},
            },
            "child": child,
        },
        "tax_units": {"tu": {"members": ["parent", "child"]}},
        "spm_units": {
            "spm": {
                "members": ["parent", "child"],
                "spm_unit_pre_subsidy_childcare_expenses": {2025: 6_000},
            }
        },
        "families": {"fam": {"members": ["parent", "child"]}},
        "marital_units": {
            "mu1": {"members": ["parent"]},
            "mu2": {"members": ["child"]},
        },
        "households": {
            "hh": {
                "members": ["parent", "child"],
                "state_code": {2025: "NY"},
                "county_str": {2025: "KINGS_COUNTY_NY"},
            }
        },
    }


print("\n== Case 1: single working parent, one child in after-school care ==")
for age in [12, 13, 14]:
    sim = Simulation(situation=household(age))
    age_ok = sim.calculate("ny_ccap_age_eligible", 2025)
    child_ok = sim.calculate("ny_ccap_eligible_child", "2025-01")
    inc_ok = sim.calculate("ny_ccap_income_eligible", "2025-01")
    rate = sim.calculate("ny_ccap_market_rate", "2025-01")
    share = sim.calculate("ny_ccap_family_share", "2025-01")
    monthly = sim.calculate("ny_ccap", "2025-01")
    annual = sim.calculate("ny_child_care_subsidies", 2025)
    print(
        f"child age {age}: age_eligible={bool(age_ok[1])} "
        f"eligible_child={bool(child_ok[1])} income_eligible={bool(inc_ok[0])} "
        f"market_rate(child)={rate[1]:.2f} family_share={share[0]:.2f} "
        f"ny_ccap(2025-01)={monthly[0]:.2f} ny_child_care_subsidies(2025)={annual[0]:.2f}"
    )

print("\n== Case 2: age test alone for children with special needs or court supervision ==")
rows = [
    ("special needs, age 17", 17, {"is_disabled": {2025: True}}),
    ("special needs, age 18, not in school", 18, {"is_disabled": {2025: True}}),
    ("special needs, age 18, secondary school", 18,
     {"is_disabled": {2025: True}, "is_in_secondary_school": {2025: True}}),
    ("special needs, age 19, secondary school", 19,
     {"is_disabled": {2025: True}, "is_in_secondary_school": {2025: True}}),
    ("court supervision, age 18, not in school", 18,
     {"is_under_court_supervision": {2025: True}}),
    ("court supervision, age 19, secondary school", 19,
     {"is_under_court_supervision": {2025: True}, "is_in_secondary_school": {2025: True}}),
]
for label, age, extra in rows:
    sim = Simulation(situation=household(age, extra))
    age_ok = sim.calculate("ny_ccap_age_eligible", 2025)
    print(f"{label}: ny_ccap_age_eligible={bool(age_ok[1])}")

At commit 045d1ae, the script prints:

== Case 1: single working parent, one child in after-school care ==
child age 12: age_eligible=True eligible_child=True income_eligible=True market_rate(child)=996.67 family_share=15.71 ny_ccap(2025-01)=484.29 ny_child_care_subsidies(2025)=5811.50
child age 13: age_eligible=False eligible_child=False income_eligible=True market_rate(child)=996.67 family_share=15.71 ny_ccap(2025-01)=0.00 ny_child_care_subsidies(2025)=0.00
child age 14: age_eligible=False eligible_child=False income_eligible=True market_rate(child)=996.67 family_share=15.71 ny_ccap(2025-01)=0.00 ny_child_care_subsidies(2025)=0.00

== Case 2: age test alone for children with special needs or court supervision ==
special needs, age 17: ny_ccap_age_eligible=True
special needs, age 18, not in school: ny_ccap_age_eligible=False
special needs, age 18, secondary school: ny_ccap_age_eligible=True
special needs, age 19, secondary school: ny_ccap_age_eligible=False
court supervision, age 18, not in school: ny_ccap_age_eligible=False
court supervision, age 19, secondary school: ny_ccap_age_eligible=False

A 14-year-old gets $0 under any reading of 415.1(b)(1). Under the carry-over, a 13-year-old whose period began before the birthday would get the 12-year-old's $484.29. Each of the four case 2 children who fail the age test would pass it, on the same condition, until the period ends or they turn 19 or 20.

Possible fix

We could add a person input, false by default, for a child whose district determined eligibility before the birthday, in a 12- or 24-month block grant period that hasn't ended. When a user sets it, the model would raise the three limits to 14, 19 and 20 for block grant care, as it raises Nebraska's limit for an enrolled family in ne_child_care_subsidy_eligible_child. Default results would not change. We would date the higher limits from March 31, 2023, the emergency rule's effective date.

Pull request #10817, merged after commit 045d1ae, adds a Title XX route for preventive child care, including the school-year continuation for a child who turns 13. It leaves ny_ccap_age_eligible unchanged, so the model still applies the 13, 18 and 19 limits to block grant care.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions