Add Hawaii Child Care Assistance Program (CCAP)#8600
Open
hua7450 wants to merge 10 commits into
Open
Conversation
Scaffolds the branch and draft PR for implementing Hawaii's Child Care Assistance Program (CCAP). Implementation to follow. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #8600 +/- ##
============================================
+ Coverage 77.77% 100.00% +22.22%
============================================
Files 1 15 +14
Lines 9 243 +234
============================================
+ Hits 7 243 +236
+ Misses 2 0 -2
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Round 1 /review-program safe fixes (0 critical found): - Tests: asset-eligibility-false, protective-services activity, income-only employment - Annotations: Exhibit III->2020 fee scale supersession, Exhibit II label, 2017 rate-table provenance, military_retirement_pay/SSI income comments Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ity activity-link Addresses 3 P1 findings: - FIX A: child with <1 effective monthly care hour pays $0 (Exhibit I casual band starts at 1 hr) - FIX B: rate tier = lesser of care hours and caretaker activity hours (HAR 17-798.2-14(b)(1)), via new hi_ccap_monthly_care_hours + hi_ccap_authorized_activity_hours (min-of-parents) - FIX C: disability is not a standalone activity; qualifies only via an activity link per HAR 17-798.2-9(b)(2)(H)/(I) - All caretaker work-hours reads use weekly_hours_worked_before_lsr (avoids LSR circularity) 133 tests passing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The 2017-08-01 4-tier/9-category rate table is superseded by the current 2020-01-02 Exhibit I in HAR 17-798.3: a 2-tier (Full-Time 87+ / Part-Time 1-86 monthly hours; before/after-school 45+/1-44) x 12-category structure. Adds Hawaiian-medium, NAFCC-accredited family, registered family, and school-age intersession/summer categories; values updated (e.g. center infant/toddler $1,490 -> $1,733). Rebuilt provider-category and hours-tier enums, rate table (24 cells, two-pass verified at 1200 DPI), hours brackets, and all tests. 115 tests passing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ovider input Adds hi_ccap_age_group (infant/toddler if age < 36 months per HAR 17-798.3-2, else older), matching the sibling-CCAP pattern (NH/TX/AK/RI age categories). Collapses hi_ccap_provider_category from 12 age-specific members to 8 provider types; rates re-keyed [provider_category][age_group][hours_tier]. The model now picks the infant/toddler vs older Exhibit I rate from the child's actual age rather than trusting an age-encoded input. 121 tests passing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…hours-helper tests Addresses /review-program SHOULD-ADDRESS findings: - S1(a): hi_ccap_countable_income now excludes earnings of household minors (age < 18) who are full-time students, per HAR 17-798.2-11(8) (was an unexecuted comment). Adds minor_age_limit parameter (18, HAR 17-798.3-2). - S1(b): documents that HAR 17-798.2-10(b)(11) Hawaii public assistance (TANF) is omitted from countable income to avoid the CCAP<->TANF circular dependency. - S2/S3/S4: dedicated unit tests for hi_ccap_authorized_activity_hours (np.inf non-binding path + two-parent min) and hi_ccap_monthly_care_hours (child-hours-bind direction), plus a before/after-school activity-cap case. 130 tests passing. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Hawaii's Child Care Assistance Program (Child Care Subsidy) in PolicyEngine. This is Hawaii's CCDF-funded child care subsidy: a multi-dimensional provider max-rate lookup combined with an 85%-State-Median-Income test and a sliding-fee co-payment computed as a percentage (0–9%) of the department's maximum rate. Eligibility, income, and co-payment rules come from HAR Title 17 Chapter 798.2; the provider payment rates come from HAR Title 17 Chapter 798.3, Exhibit I. The infant/toddler vs older rate is selected from the child's actual age (under 36 months) per HAR 17-798.3-2, matching how sibling CCAPs (NH, TX, AK, RI) derive an age category rather than baking age into a provider input.
Closes #8599
Regulatory Authority
#page=XXanchors into this multi-page PDF (e.g. eligibility#page=14, income limit#page=15, countable income#page=19, exclusions#page=24, payment computation#page=28, co-payment#page=29).#page=71.Program Overview
gov.states.hi.bessd.ccap(variables prefixedhi_ccap).Eligibility
age < age/child_limit(13) inhi_ccap_eligible_childis_disabled & (age >= child_limit) & (age <= age/disabled_child_limit)(17, inclusive)receives_or_needs_protective_services(any age in program)hi_ccap_income_eligible:smi(size, state) × income/smi_rate (0.85) / 12vs monthly countable incomeincome_eligible | has_protective_servicesinhi_ccap_income_eligiblehi_ccap_activity_eligible: every tax-unit head/spouse must be in a real activity (employed, full-time student, or receiving CPS), with the disability pathway handled as an activity link (see below)is_ccdf_immigration_eligible_child(not recreated)is_ccdf_asset_eligible(not recreated)Disability is an activity link, not a standalone activity. Per §17-798.2-9(b)(2)(H)/(I), an incapacitated caretaker qualifies the family only when the other head/spouse is in an approved activity. A single idle disabled caretaker — or two idle disabled parents — does not qualify.
hi_ccap_activity_eligiblemodels this by disqualifying the unit if any caretaker is neither in a real activity nor disabled, and additionally requiring at least one real-activity caretaker whenever a caretaker is disabled-and-inactive.Age group (infant/toddler vs older).
hi_ccap_age_group(Person, MONTH) classifies each child asINFANT_TODDLERwhen the child's age is under 36 months andOLDERotherwise. The 36-month boundary comes from HAR 17-798.3-2, which defines an infant and toddler center as serving children "six weeks to thirty-six months"; the cutoff is stored inage/infant_toddler_max_months.yaml(36). The model derives the age group from the child's actual age — rather than reading an age-encoded provider input — so the correct Exhibit I rate (infant/toddler vs older) is selected automatically, matching sibling CCAPs (NH, TX, AK, RI). The school-age before/after-school and intersession/summer provider categories are care-setting based (kindergarten age and above per HAR 17-798.3-2) and so are not driven by this age group.Income
Countable income (
hi_ccap_countable_income, SPMUnit, MONTH) is monthly gross income from all counted sources (§17-798.2-10(b)). It is implemented as a formula (not a pureaddslist): the formula sums the counted sources fromincome/countable_income/sources.yaml, then excludes the employment and self-employment income of household members who are minors and full-time students per §17-798.2-11(8). The excluded types (§17-798.2-11) are otherwise simply omitted from the source list rather than subtracted inline.Counted sources (mapped to PolicyEngine variables):
employment_income,self_employment_income,sstb_self_employment_income,social_security_retirement,social_security_disability,social_security_survivors,ssi,dividend_income,interest_income,rental_income,pension_income,veterans_benefits,military_retirement_pay,unemployment_compensation,workers_compensation,alimony_income,child_support_received. (Recurring monthly SSI is counted; §17-798.2-11(5)(B) excludes only retroactive lump-sum SSI.)Minor-student earnings exclusion (§17-798.2-11(8)): the formula subtracts the
employment_income+self_employment_incomeof any household member who is both a minor (age < 18) and a full-time student. The 18-year cutoff comes fromage/minor_age_limit.yaml(18), backed by HAR 17-798.3-2 ("Minor means a person under eighteen years old");is_full_time_studentis the available proxy for the regulation's "at least half-time student" condition.Counted in the regulation but with no PolicyEngine equivalent (documented in comments, not modeled): railroad retirement (captured via
social_security_*), temporary disability insurance, income from estates/trust funds, royalties, free rent converted to cost compensation (we don't track in-kind rent-for-activity at the moment), strike benefits (captured viaunemployment_compensation).Excluded by §17-798.2-11 (omitted from the list): capital gains, SNAP, WIC, USDA donated foods, EITC, Title IV HEA aid, half-time-or-more student-minor earnings, non-recurring lump sums, and others.
Conversion handling: the regulation's weekly/bi-weekly conversions (§17-798.2-10(a)(3)) are handled by the framework idiom — annual income sources are auto-divided to monthly because
hi_ccap_countable_incomeis MONTH-defined andaddsannual variables. TheWEEKS_IN_YEAR / MONTHS_IN_YEARfactor is used explicitly inhi_ccap_monthly_care_hoursandhi_ccap_authorized_activity_hoursto convert weekly hours into the monthly-hour bands.Provider Rates (Exhibit I, effective 2020-01-02)
Rates come from HAR 17-798.3 Exhibit I (effective 2020-01-02), which supersedes the earlier 2017-08-01 standalone rate table. Rates are statewide (no island/county variation), encoded as a single multi-breakdown parameter
rates/rates.yamlkeyed[hi_ccap_provider_category][hi_ccap_age_group][hi_ccap_hours_tier]: 8 provider types × 2 age groups × 2 hour tiers (Full-Time / Part-Time).hi_ccap_provider_categoryis a direct input enum whose 8 members are provider types with no age baked in:LICENSED_CENTER_OR_GROUP_HOME,ACCREDITED_CENTER,NAFCC_ACCREDITED_FAMILY,REGISTERED_FAMILY,LEGALLY_EXEMPT,LICENSED_SCHOOL_AGE_INTERSESSION_SUMMER,LICENSED_BEFORE_AFTER_SCHOOL,EXEMPT_BEFORE_AFTER_SCHOOL. The infant/toddler vs older row of Exhibit I is selected from the child's actual age viahi_ccap_age_group(see the Age group note above) rather than from an age-encoded provider input — matching sibling CCAPs (NH, TX, AK, RI), which all derive an age category. The two hour tiers are resolved byhi_ccap_hours_tierfrom one of two monthly-hour band schemes:Band lower bounds are inclusive (exactly 87 hours = Full-Time; 86 = Part-Time).
Full rate table ($/month, provider type × age group × tier, two-pass vision-verified at 1200 DPI):
LICENSED_CENTER_OR_GROUP_HOME— Licensed center or group child care homeACCREDITED_CENTER— NAEYC/NECPA/Hawaiian-medium accredited center-basedNAFCC_ACCREDITED_FAMILY— NAFCC accredited family child care homeREGISTERED_FAMILY— Registered family child care homeLEGALLY_EXEMPT— Legally exempt relative, non-relative, and center-basedLICENSED_SCHOOL_AGE_INTERSESSION_SUMMER— Licensed school-age intersession/summerLICENSED_BEFORE_AFTER_SCHOOL— Licensed before/after schoolEXEMPT_BEFORE_AFTER_SCHOOL— Legally exempt before/after schoolThe first 5 provider types use the standard hour bands and vary by age group (infant/toddler vs older). The last 3 are care-setting categories (kindergarten age and above per HAR 17-798.3-2): the two before/after-school types use the before/after-school hour bands, and the intersession/summer type uses the standard bands; none of the three vary by age group.
Benefit Calculation
childcare_hours_per_week→ monthly) and the caretaker's authorized monthly activity hours. For a two-parent unit the binding constraint is the caretaker with the fewest hours (min-of-parents, analogous to NH CCAP He-C 6910.07(p)). Employed caretakers cap the tier by their work hours; non-work activities (school, disability, protective services) have no tracked hour count and so are non-binding. Caretaker work hours readweekly_hours_worked_before_lsrto avoid a circular dependency with labor-supply responses.hi_ccap_maximum_monthly_rate.copay/rate.yaml): a single family-size-independent bracket on the family's gross income as a share of FPG, ranging 0% (≤100% FPG) up to 9% in 1-point steps per the Exhibit II bands. The per-family-size dollar columns in Exhibit II are just FPG × band, so the percentage is a pure function of the income/FPG ratio. Band-top thresholds useX.0001so a family at exactly a band top lands in the lower band.smi()helper × 0.85 (parameterized viaincome/smi_rate.yaml), so the limit tracks HHS State Median Income by year (NJ CCAP pattern) rather than freezing a dollar table.Not Modeled
is_in_foster_caremarks a child in care, not a foster-parent caretaker). The CPS-family waiver under (b)(1)(B) is modeled.tanf→ TANF dependent-care deduction →childcare_expenses→child_care_subsidies→ CCAP). TANF families fall below the lowest copay band, so the omission does not change their subsidy in practice.Historical / Verification Notes
2020-01-02). This supersedes the earlier 2017-08-01 standalone Exhibit I rate table and the still-earlier 2009 codified Exhibit I, which are earlier eras out of scope here. The rate table was restructured from the 2017 era's four hour tiers (Full-Time / Two-Thirds / One-Third / Casual) to the 2020 era's two tiers (Full-Time / Part-Time).hi_ccap_age_group, boundary 36 months per HAR 17-798.3-2). This mirrors how NH, TX, AK, and RI CCAPs derive an age category.before_lsrchoice: both the caretaker work-hours read (for the activity-hours cap) and the activity test useweekly_hours_worked_before_lsrrather than the post-response hours, to avoid a circular dependency with behavioral labor-supply responses.smi()helper × 0.85 (parameterized viaincome/smi_rate.yaml), so values track HHS State Median Income by year rather than freezing a dollar table from Exhibit II or the CCDF plan (which report different HHS SMI years).#page=anchor; the multi-page HAR rules and HAR 798.3 payments PDFs use verified#page=XXanchors.Files Added
Test plan
policyengine-core test policyengine_us/tests/policy/baseline/gov/states/hi/bessd/ccap/ -c policyengine_us)hi_ccap_countable_income.yaml), the two hours-helper unit tests (hi_ccap_authorized_activity_hours.yaml,hi_ccap_monthly_care_hours.yaml), thehi_ccap_age_group.yaml36-month boundary, and a before/after-school activity-hours-cap case.