From e568d4ff08568b9bbbe6a754b5f53ff8e2cc6240 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Mar 2026 13:54:47 -0400 Subject: [PATCH 1/6] Add changelog fragment for Vermont CCAP Co-Authored-By: Claude Opus 4.6 --- changelog.d/vt-ccap.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/vt-ccap.added.md diff --git a/changelog.d/vt-ccap.added.md b/changelog.d/vt-ccap.added.md new file mode 100644 index 00000000000..dea52507181 --- /dev/null +++ b/changelog.d/vt-ccap.added.md @@ -0,0 +1 @@ +Add Vermont Child Care Assistance Program (CCAP). From 0ef6042d38b1e2e236b2bb0ae9530028d1e69610 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Mar 2026 15:58:31 -0400 Subject: [PATCH 2/6] Implement Vermont CCFAP (Child Care Financial Assistance Program) Closes #7768 Co-Authored-By: Claude Opus 4.6 --- .../vt/dcf/ccfap/age_group/infant_max.yaml | 11 + .../vt/dcf/ccfap/age_group/preschool_max.yaml | 11 + .../vt/dcf/ccfap/age_group/toddler_max.yaml | 11 + .../vt/dcf/ccfap/age_threshold/base.yaml | 13 + .../ccfap/age_threshold/special_needs.yaml | 13 + .../ccfap/care_schedule/full_time_max.yaml | 11 + .../ccfap/care_schedule/part_time_max.yaml | 11 + .../vt/dcf/ccfap/family_share/scale.yaml | 83 +++ .../states/vt/dcf/ccfap/income/fpl_limit.yaml | 14 + .../states/vt/dcf/ccfap/income/sources.yaml | 27 + .../vt/dcf/ccfap/rates/licensed_center.yaml | 56 ++ .../vt/dcf/ccfap/rates/registered_home.yaml | 56 ++ .../is_ccdf_immigration_eligible_child.yaml | 76 ++ .../gov/states/vt/dcf/ccfap/integration.yaml | 688 ++++++++++++++++++ .../gov/states/vt/dcf/ccfap/vt_ccfap.yaml | 327 +++++++++ .../vt/dcf/ccfap/vt_ccfap_age_group.yaml | 90 +++ .../vt/dcf/ccfap/vt_ccfap_care_schedule.yaml | 156 ++++ .../vt/dcf/ccfap/vt_ccfap_eligible.yaml | 267 +++++++ .../vt/dcf/ccfap/vt_ccfap_eligible_child.yaml | 158 ++++ .../vt/dcf/ccfap/vt_ccfap_family_share.yaml | 377 ++++++++++ .../dcf/ccfap/vt_ccfap_income_eligible.yaml | 240 ++++++ .../vt/dcf/ccfap/vt_ccfap_provider_type.yaml | 64 ++ .../vt/dcf/ccfap/vt_ccfap_state_rate.yaml | 456 ++++++++++++ .../gov/hhs/ccdf/child_care_subsidies.py | 20 + .../is_ccdf_immigration_eligible_child.py | 23 + .../ccfap/eligibility/vt_ccfap_eligible.py | 36 + .../eligibility/vt_ccfap_eligible_child.py | 23 + .../eligibility/vt_ccfap_income_eligible.py | 20 + .../gov/states/vt/dcf/ccfap/vt_ccfap.py | 23 + .../states/vt/dcf/ccfap/vt_ccfap_age_group.py | 37 + .../vt/dcf/ccfap/vt_ccfap_care_schedule.py | 33 + .../vt/dcf/ccfap/vt_ccfap_countable_income.py | 13 + .../vt/dcf/ccfap/vt_ccfap_family_share.py | 36 + .../vt/dcf/ccfap/vt_ccfap_provider_type.py | 26 + .../vt/dcf/ccfap/vt_ccfap_state_rate.py | 24 + .../vt/dcf/ccfap/vt_child_care_subsidies.py | 11 + .../expense/childcare/childcare_expenses.py | 8 +- 37 files changed, 3542 insertions(+), 7 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml create mode 100644 policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml create mode 100644 policyengine_us/variables/gov/hhs/ccdf/child_care_subsidies.py create mode 100644 policyengine_us/variables/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py create mode 100644 policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml new file mode 100644 index 00000000000..e6d04938587 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml @@ -0,0 +1,11 @@ +description: Vermont defines infants as children up to this age in months under the Child Care Financial Assistance Program. +values: + 2024-04-01: 24 + +metadata: + unit: month + period: year + label: Vermont CCFAP infant age limit + reference: + - title: CCFAP Regulations Section I B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml new file mode 100644 index 00000000000..c98dc41a083 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml @@ -0,0 +1,11 @@ +description: Vermont defines preschoolers as children up to this age in months under the Child Care Financial Assistance Program. +values: + 2024-04-01: 60 + +metadata: + unit: month + period: year + label: Vermont CCFAP preschool age limit + reference: + - title: CCFAP Regulations Section I B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml new file mode 100644 index 00000000000..485b4b3b536 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml @@ -0,0 +1,11 @@ +description: Vermont defines toddlers as children up to this age in months under the Child Care Financial Assistance Program. +values: + 2024-04-01: 36 + +metadata: + unit: month + period: year + label: Vermont CCFAP toddler age limit + reference: + - title: CCFAP Regulations Section I B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml new file mode 100644 index 00000000000..203db647e15 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml @@ -0,0 +1,13 @@ +description: Vermont limits the Child Care Financial Assistance Program to children younger than this age. +values: + 2024-04-01: 13 + +metadata: + unit: year + period: year + label: Vermont CCFAP child age threshold + reference: + - title: CCFAP Regulations Section I B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: 33 V.S.A. § 3512 + href: https://legislature.vermont.gov/statutes/section/33/035/03512 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml new file mode 100644 index 00000000000..29a81d61955 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml @@ -0,0 +1,13 @@ +description: Vermont limits the Child Care Financial Assistance Program to children with special needs younger than this age. +values: + 2024-04-01: 19 + +metadata: + unit: year + period: year + label: Vermont CCFAP special needs child age threshold + reference: + - title: CCFAP Regulations Section I B + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: 33 V.S.A. § 3512 + href: https://legislature.vermont.gov/statutes/section/33/035/03512 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml new file mode 100644 index 00000000000..a3a419250a0 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml @@ -0,0 +1,11 @@ +description: Vermont sets this amount as the maximum weekly hours for full-time care under the Child Care Financial Assistance Program. +values: + 2024-04-01: 50 + +metadata: + unit: hour + period: week + label: Vermont CCFAP full-time maximum hours + reference: + - title: CCFAP State Rates + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml new file mode 100644 index 00000000000..0d165f74042 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml @@ -0,0 +1,11 @@ +description: Vermont sets this amount as the maximum weekly hours for part-time care under the Child Care Financial Assistance Program. +values: + 2024-04-01: 25 + +metadata: + unit: hour + period: week + label: Vermont CCFAP part-time maximum hours + reference: + - title: CCFAP State Rates + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml new file mode 100644 index 00000000000..ce414ef3f2e --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml @@ -0,0 +1,83 @@ +description: Vermont sets this amount as the weekly family share based on income as a share of the federal poverty guideline under the Child Care Financial Assistance Program. + +metadata: + type: single_amount + threshold_unit: /1 + amount_unit: currency-USD + period: week + label: Vermont CCFAP weekly family share scale + reference: + - title: CCFAP Income Guidelines (effective October 6, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/Income-Guidelines.pdf + - title: CCFAP Regulations Section IX + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + +brackets: + - threshold: + 2024-10-01: 0 + amount: + 2024-10-01: 0 + - threshold: + 2024-10-01: 1.7501 + amount: + 2024-10-01: 50 + - threshold: + 2024-10-01: 2.0001 + amount: + 2024-10-01: 75 + - threshold: + 2024-10-01: 2.2501 + amount: + 2024-10-01: 100 + - threshold: + 2024-10-01: 2.5001 + amount: + 2024-10-01: 125 + - threshold: + 2024-10-01: 2.7501 + amount: + 2024-10-01: 150 + - threshold: + 2024-10-01: 3.0001 + amount: + 2024-10-01: 175 + - threshold: + 2024-10-01: 3.2501 + amount: + 2024-10-01: 200 + - threshold: + 2024-10-01: 3.5001 + amount: + 2024-10-01: 225 + - threshold: + 2024-10-01: 3.7501 + amount: + 2024-10-01: 250 + - threshold: + 2024-10-01: 4.0001 + amount: + 2024-10-01: 275 + - threshold: + 2024-10-01: 4.2501 + amount: + 2024-10-01: 300 + - threshold: + 2024-10-01: 4.5001 + amount: + 2024-10-01: 325 + - threshold: + 2024-10-01: 4.7501 + amount: + 2024-10-01: 350 + - threshold: + 2024-10-01: 5.0001 + amount: + 2024-10-01: 375 + - threshold: + 2024-10-01: 5.2501 + amount: + 2024-10-01: 400 + - threshold: + 2024-10-01: 5.5001 + amount: + 2024-10-01: 425 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml new file mode 100644 index 00000000000..cb1db89c0d2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml @@ -0,0 +1,14 @@ +description: Vermont limits gross income to this share of the federal poverty guideline under the Child Care Financial Assistance Program. +values: + 2024-04-01: 4 + 2024-10-01: 5.75 + +metadata: + unit: /1 + period: year + label: Vermont CCFAP income limit FPL multiplier + reference: + - title: CCFAP Regulations Section II B 2 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: Act 76 FAQs + href: https://dcf.vermont.gov/benefits/ccfap/act76-faqs diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml new file mode 100644 index 00000000000..beee8acde45 --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml @@ -0,0 +1,27 @@ +description: Vermont counts these income sources as gross income under the Child Care Financial Assistance Program. +values: + 2024-04-01: + - employment_income + - self_employment_income + - pension_income + - social_security + - alimony_income + - child_support_received + - dividend_income + - interest_income + - rental_income + - unemployment_compensation + - workers_compensation + - veterans_benefits + - military_retirement_pay + # Excluded: SSI, SNAP, Medicaid, Reach Up, EITC, tax refunds, + # education grants/scholarships, foster care payments, + # adoption assistance, child support paid out + +metadata: + unit: list + period: year + label: Vermont CCFAP countable income sources + reference: + - title: CCFAP Regulations Section II B 2 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml new file mode 100644 index 00000000000..706d418289a --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/licensed_center.yaml @@ -0,0 +1,56 @@ +description: Vermont provides these weekly reimbursement rates for licensed child care centers under the Child Care Financial Assistance Program. + +metadata: + period: week + unit: currency-USD + label: Vermont CCFAP licensed center weekly rates + breakdown: + - vt_ccfap_care_schedule + - vt_ccfap_age_group + reference: + - title: CCFAP State Rates (June 30, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf + - title: CCFAP Capped State Rates (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/Capped-State-Rates.pdf + +FULL_TIME: + INFANT: + 2024-06-30: 471 + 2025-07-13: 495 + TODDLER: + 2024-06-30: 443 + 2025-07-13: 465 + PRESCHOOL: + 2024-06-30: 439 + 2025-07-13: 439 + SCHOOL_AGE: + 2024-06-30: 371 + 2025-07-13: 371 + +PART_TIME: + INFANT: + 2024-06-30: 258 + 2025-07-13: 271 + TODDLER: + 2024-06-30: 243 + 2025-07-13: 255 + PRESCHOOL: + 2024-06-30: 240 + 2025-07-13: 240 + SCHOOL_AGE: + 2024-06-30: 204 + 2025-07-13: 204 + +EXTENDED_CARE: + INFANT: + 2024-06-30: 640 + 2025-07-13: 672 + TODDLER: + 2024-06-30: 602 + 2025-07-13: 632 + PRESCHOOL: + 2024-06-30: 597 + 2025-07-13: 597 + SCHOOL_AGE: + 2024-06-30: 505 + 2025-07-13: 505 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml new file mode 100644 index 00000000000..8ab12a67a1e --- /dev/null +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/rates/registered_home.yaml @@ -0,0 +1,56 @@ +description: Vermont provides these weekly reimbursement rates for registered family child care homes under the Child Care Financial Assistance Program. + +metadata: + period: week + unit: currency-USD + label: Vermont CCFAP registered home weekly rates + breakdown: + - vt_ccfap_care_schedule + - vt_ccfap_age_group + reference: + - title: CCFAP State Rates (June 30, 2024) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf + - title: CCFAP Capped State Rates (July 13, 2025) + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/Capped-State-Rates.pdf + +FULL_TIME: + INFANT: + 2024-06-30: 387 + 2025-07-13: 407 + TODDLER: + 2024-06-30: 364 + 2025-07-13: 382 + PRESCHOOL: + 2024-06-30: 361 + 2025-07-13: 361 + SCHOOL_AGE: + 2024-06-30: 321 + 2025-07-13: 321 + +PART_TIME: + INFANT: + 2024-06-30: 212 + 2025-07-13: 223 + TODDLER: + 2024-06-30: 200 + 2025-07-13: 210 + PRESCHOOL: + 2024-06-30: 198 + 2025-07-13: 198 + SCHOOL_AGE: + 2024-06-30: 176 + 2025-07-13: 176 + +EXTENDED_CARE: + INFANT: + 2024-06-30: 527 + 2025-07-13: 553 + TODDLER: + 2024-06-30: 494 + 2025-07-13: 519 + PRESCHOOL: + 2024-06-30: 491 + 2025-07-13: 491 + SCHOOL_AGE: + 2024-06-30: 436 + 2025-07-13: 436 diff --git a/policyengine_us/tests/policy/baseline/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.yaml new file mode 100644 index 00000000000..a0010a8ec28 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.yaml @@ -0,0 +1,76 @@ +- name: Case 1, citizen child. + period: 2024 + input: + immigration_status: CITIZEN + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 2, legal permanent resident child. + period: 2024 + input: + immigration_status: LEGAL_PERMANENT_RESIDENT + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 3, refugee child. + period: 2024 + input: + immigration_status: REFUGEE + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 4, asylee child. + period: 2024 + input: + immigration_status: ASYLEE + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 5, deportation withheld child. + period: 2024 + input: + immigration_status: DEPORTATION_WITHHELD + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 6, Cuban or Haitian entrant child. + period: 2024 + input: + immigration_status: CUBAN_HAITIAN_ENTRANT + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 7, conditional entrant child. + period: 2024 + input: + immigration_status: CONDITIONAL_ENTRANT + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 8, paroled for at least one year child. + period: 2024 + input: + immigration_status: PAROLED_ONE_YEAR + output: + is_ccdf_immigration_eligible_child: true + +- name: Case 9, undocumented child. + period: 2024 + input: + immigration_status: UNDOCUMENTED + output: + is_ccdf_immigration_eligible_child: false + +- name: Case 10, DACA child. + period: 2024 + input: + immigration_status: DACA + output: + is_ccdf_immigration_eligible_child: false + +- name: Case 11, TPS child. + period: 2024 + input: + immigration_status: TPS + output: + is_ccdf_immigration_eligible_child: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml new file mode 100644 index 00000000000..ad2830333e1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/integration.yaml @@ -0,0 +1,688 @@ +- name: Case 1, low income single parent with one infant in full time licensed center. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 28 + employment_income: 30_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + # person1: age 28, not a dependent => false + # person2: age 1 < 13, dependent => true + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + # person2: age 1 => infant (< 24 months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + # person2: 5 * 8 = 40 hours/week => full time (26-50) + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER] + # person2: DCC_SACC => licensed center + + # State rate (2024-06-30 rates apply at 2025-01-01) + vt_ccfap_state_rate: [0, 471] + # person2: licensed center, full time, infant = $471/wk + + # Income + # FPG for family of 2 = 15,650 + 5,500 = 21,150 + # FPL ratio = 30,000 / 21,150 = 1.418 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.418 < 1.7501 => $0/wk + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $471 * 52 = $24,492 + # Benefit = max(24,492 - 0, 0) = $24,492 + vt_ccfap: 24_492 + +- name: Case 2, moderate income two parent family with two children in different settings. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 70_000 + person2: + age: 33 + employment_income: 10_000 + person3: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 23_000 + person4: + age: 7 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true, true] + + # Age groups + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, PRESCHOOL, SCHOOL_AGE] + # person3: age 3 = preschool (36-59 months) + # person4: age 7 = school age (60+ months) + + # Care schedules + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, FULL_TIME, PART_TIME] + # person3: 5 * 8 = 40 hrs/wk = full time + # person4: 5 * 4 = 20 hrs/wk = part time + + # Provider types + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME] + + # State rates + vt_ccfap_state_rate: [0, 0, 439, 176] + # person3: licensed center, full time, preschool = $439/wk + # person4: registered home, part time, school age = $176/wk + + # Income + # Countable income = 70,000 + 10,000 = 80,000 + # FPG for family of 4 = 15,650 + 3 * 5,500 = 32,150 + # FPL ratio = 80,000 / 32,150 = 2.488 + vt_ccfap_countable_income: 80_000 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 2.488 > 2.2501 => $100/wk + # Annual: $100 * 52 = $5,200 + vt_ccfap_family_share: 5_200 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = ($439 + $176) * 52 = $615 * 52 = $31,980 + # Benefit = max(31,980 - 5,200, 0) = $26,780 + vt_ccfap: 26_780 + +- name: Case 3, high income family just below 575 percent FPL threshold. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 40 + employment_income: 145_000 + person2: + age: 38 + self_employment_income: 8_000 + person3: + age: 5 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 22_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, SCHOOL_AGE] + # person3: age 5 = school age (60+ months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, FULL_TIME] + + # State rate + vt_ccfap_state_rate: [0, 0, 371] + # person3: licensed center, full time, school age = $371/wk + + # Income + # Countable income = 145,000 + 8,000 = 153,000 + # FPG for family of 3 = 26,650 + # FPL ratio = 153,000 / 26,650 = 5.741 + # 5.741 > 5.5001 => weekly share = $425 + vt_ccfap_countable_income: 153_000 + vt_ccfap_income_eligible: true + + # Family share + # Annual: $425 * 52 = $22,100 + vt_ccfap_family_share: 22_100 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $371 * 52 = $19,292 + # Benefit = max(19,292 - 22,100, 0) = $0 + vt_ccfap: 0 + +- name: Case 4, foster child in registered home with high income parent. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 45 + employment_income: 200_000 + person2: + age: 4 + is_tax_unit_dependent: true + is_in_foster_care: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 20_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, PRESCHOOL] + # person2: age 4 = preschool (36-59 months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, REGISTERED_HOME] + + # State rate + vt_ccfap_state_rate: [0, 361] + # person2: registered home, full time, preschool = $361/wk + + # Income eligibility + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 200,000 > 121,612.50 but foster child = categorically eligible + vt_ccfap_income_eligible: false + + # Family share: foster child = exempt, $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + # Foster child present => categorically eligible (bypasses income test) + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $361 * 52 = $18,772 + # Benefit = max(18,772 - 0, 0) = $18,772 + vt_ccfap: 18_772 + +- name: Case 5, disabled teenager eligible as special needs child. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 42 + employment_income: 60_000 + person2: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 6 + pre_subsidy_childcare_expenses: 16_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + # person2: age 16, disabled, age < 19 => eligible + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE] + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, FULL_TIME] + # person2: 5 * 6 = 30 hrs/wk = full time (26-50) + + # State rate + vt_ccfap_state_rate: [0, 371] + # person2: licensed center, full time, school age = $371/wk + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 60,000 / 21,150 = 2.837 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 2.837 > 2.7501 => $150/wk + # Annual: $150 * 52 = $7,800 + vt_ccfap_family_share: 7_800 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $371 * 52 = $19,292 + # Benefit = max(19,292 - 7,800, 0) = $11,492 + vt_ccfap: 11_492 + +- name: Case 6, extended care infant in registered home with two parents. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 25 + employment_income: 35_000 + person2: + age: 25 + employment_income: 10_000 + person3: + age: 0 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + pre_subsidy_childcare_expenses: 30_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, INFANT] + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, EXTENDED_CARE] + # person3: 6 * 10 = 60 hrs/wk > 50 = extended care + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME] + + # State rate + vt_ccfap_state_rate: [0, 0, 527] + # person3: registered home, extended care, infant = $527/wk + + # Income + # Countable income = 35,000 + 10,000 = 45,000 + # FPG for family of 3 = 26,650 + # FPL ratio = 45,000 / 26,650 = 1.688 + vt_ccfap_countable_income: 45_000 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.688 < 1.7501 => $0/wk + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $527 * 52 = $27,404 + # Benefit = max(27,404 - 0, 0) = $27,404 + vt_ccfap: 27_404 + +- name: Case 7, ineligible family above 575 percent FPL gets zero benefit. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 40 + employment_income: 160_000 + person2: + age: 4 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 23_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 160,000 > 121,612.50 + vt_ccfap_income_eligible: false + + # Overall eligibility: income ineligible + vt_ccfap_eligible: false + + # Benefit: ineligible = $0 + vt_ccfap: 0 + +- name: Case 8, family at exactly 575 percent FPL boundary with maximum family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 121_612.50 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + pre_subsidy_childcare_expenses: 35_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + # person1: age 35, not dependent => false + # person2: age 1 < 13, dependent => true + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + # person2: age 1 = infant (< 24 months) + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, EXTENDED_CARE] + # person2: 6 * 10 = 60 hrs/wk > 50 = extended care + + # Provider type + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER] + + # State rate + vt_ccfap_state_rate: [0, 640] + # person2: licensed center, extended care, infant = $640/wk + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 121,612.50 / 21,150 = 5.75 + # 121,612.50 <= 121,612.50 + vt_ccfap_countable_income: 121_612.50 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 5.75 >= 5.5001 => $425/wk + # Annual: $425 * 52 = $22,100 + vt_ccfap_family_share: 22_100 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $640 * 52 = $33,280 + # Benefit = max(33,280 - 22,100, 0) = $11,180 + vt_ccfap: 11_180 + +- name: Case 9, large family of 8 with three eligible children in different settings. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 40 + employment_income: 80_000 + person2: + age: 38 + person3: + age: 14 + is_tax_unit_dependent: true + person4: + age: 0 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 22_000 + person5: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 5 + pre_subsidy_childcare_expenses: 14_000 + person6: + age: 4 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 20_000 + person7: + age: 8 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + person8: + age: 10 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, false, true, true, true, true, true] + # person3: age 14 >= 13, not disabled => false + # person4-8: all < 13 and dependents => true + + # Age groups + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, SCHOOL_AGE, INFANT, TODDLER, PRESCHOOL, SCHOOL_AGE, SCHOOL_AGE] + + # Care schedules + vt_ccfap_care_schedule: [PART_TIME, PART_TIME, PART_TIME, FULL_TIME, PART_TIME, FULL_TIME, PART_TIME, PART_TIME] + # person4: 5*8=40 = full time + # person5: 5*5=25 = part time (<=25) + # person6: 5*8=40 = full time + # person7: 5*4=20 = part time + # person8: 5*4=20 = part time + + # Provider types + vt_ccfap_provider_type: [LICENSED_CENTER, LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME, LICENSED_CENTER, LICENSED_CENTER, REGISTERED_HOME, LICENSED_CENTER] + + # State rates + vt_ccfap_state_rate: [0, 0, 0, 387, 243, 439, 176, 204] + # person4: registered home, full time, infant = $387/wk + # person5: licensed center, part time, toddler = $243/wk + # person6: licensed center, full time, preschool = $439/wk + # person7: registered home, part time, school age = $176/wk + # person8: licensed center, part time, school age = $204/wk + + # Income + # FPG for family of 8 = 15,650 + 7 * 5,500 = 54,150 + # FPL ratio = 80,000 / 54,150 = 1.477 + vt_ccfap_countable_income: 80_000 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 1.477 < 1.7501 => $0/wk + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total weekly rate = $387 + $243 + $439 + $176 + $204 = $1,449 + # Total annual rate = $1,449 * 52 = $75,348 + # Benefit = max(75,348 - 0, 0) = $75,348 + vt_ccfap: 75_348 + +- name: Case 10, enrollment based benefit with moderate family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 55_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, true] + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, INFANT] + + # Care schedule + vt_ccfap_care_schedule: [PART_TIME, EXTENDED_CARE] + # person2: 6 * 10 = 60 hrs/wk > 50 = extended care + + # State rate + vt_ccfap_state_rate: [0, 640] + # person2: licensed center, extended care, infant = $640/wk + + # Income + # FPG for family of 2 = 21,150 + # FPL ratio = 55,000 / 21,150 = 2.600 + vt_ccfap_countable_income: 55_000 + vt_ccfap_income_eligible: true + + # Family share + # FPL ratio 2.600 >= 2.5001 => $125/wk + # Annual: $125 * 52 = $6,500 + vt_ccfap_family_share: 6_500 + + # Overall eligibility + vt_ccfap_eligible: true + + # Benefit + # Total annual rate = $640 * 52 = $33,280 + # Benefit = max(33,280 - 6,500, 0) = $26,780 + vt_ccfap: 26_780 + +- name: Case 11, protective services child with mixed eligible and ineligible children. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 200_000 + person2: + age: 15 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # Child eligibility + vt_ccfap_eligible_child: [false, false, true] + # person2: age 15 >= 13, not disabled => false + # person3: age 3 < 13, dependent => true + + # Age group + vt_ccfap_age_group: [SCHOOL_AGE, SCHOOL_AGE, PRESCHOOL] + + # State rate + vt_ccfap_state_rate: [0, 0, 439] + # person3: licensed center, full time, preschool = $439/wk + + # Income + # FPG for family of 3 = 26,650 + # 575% FPL = 153,237.50 + # Income 200,000 > 153,237.50 + vt_ccfap_income_eligible: false + + # Protective services => categorically eligible + vt_ccfap_eligible: true + + # Family share: protective services = exempt + vt_ccfap_family_share: 0 + + # Benefit + # Total annual rate = $439 * 52 = $22,828 + # Benefit = max(22,828 - 0, 0) = $22,828 + vt_ccfap: 22_828 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml new file mode 100644 index 00000000000..7488a870eed --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap.yaml @@ -0,0 +1,327 @@ +- name: Case 1, single child full time licensed center at 250 percent FPL. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 52_875 + person2: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 15,650 + 5,500 = 21,150 + # FPL ratio = 52,875 / 21,150 = 2.50 + # Weekly family share at 2.50 > 2.2501 = $100/wk + # Annual family share = $100 * 52 = $5,200 + # Child: age 3, preschool, full time, licensed center = $439/wk + # Total annual rate = $439 * 52 = $22,828 + # Benefit = max(22,828 - 5,200, 0) = $17,628 + vt_ccfap: 17_628 + +- name: Case 2, ineligible family gets zero benefit. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 125_000 + person2: + age: 5 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 125,000 > 121,612.50, so ineligible + vt_ccfap: 0 + +- name: Case 3, Reach Up eligible family gets full subsidy with no copay. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 20_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Reach Up = categorically eligible, $0 family share + # Child: age 1, infant, full time, licensed center = $471/wk + # Total annual rate = $471 * 52 = $24,492 + # Benefit = max(24,492 - 0, 0) = $24,492 + vt_ccfap: 24_492 + +- name: Case 4, family share exceeds state rate results in zero benefit. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 150_000 + person2: + age: 30 + person3: + age: 7 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + pre_subsidy_childcare_expenses: 10_000 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 150,000 / 26,650 = 5.631 + # Weekly family share at 5.631 > 5.5001 = $425/wk + # Annual family share = $425 * 52 = $22,100 + # Child: age 7, school age, part time, registered home = $176/wk + # Total annual rate = $176 * 52 = $9,152 + # Benefit = max(9,152 - 22,100, 0) = $0 + vt_ccfap: 0 + +- name: Case 5, zero income family gets full subsidy. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + person2: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 20_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Zero income = 0% FPL, family share = $0/wk + # Child: age 2, toddler, full time, registered home = $364/wk + # Total annual rate = $364 * 52 = $18,928 + # Benefit = max(18,928 - 0, 0) = $18,928 + vt_ccfap: 18_928 + +- name: Case 6, negative self employment income does not inflate benefit. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + self_employment_income: -60_000_000 + person2: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + pre_subsidy_childcare_expenses: 25_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Negative income, family share = $0/wk + # Child: preschool, full time, licensed center = $439/wk + # Total annual rate = $439 * 52 = $22,828 + # Benefit capped at max(22,828 - 0, 0) = $22,828, NOT inflated + vt_ccfap: 22_828 + +- name: Case 7, enrollment based benefit equals state rate minus family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 30,000 / 21,150 = 1.418 + # Weekly family share at 1.418 < 1.7501 = $0/wk + # Annual family share = $0 + # Child: infant, full time, licensed center = $471/wk + # Total annual rate = $471 * 52 = $24,492 + # Benefit = max(24,492 - 0, 0) = $24,492 + vt_ccfap: 24_492 + +- name: Case 8, two children different age groups and provider types. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 55_000 + person2: + age: 1 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + person3: + age: 7 + is_tax_unit_dependent: true + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 55,000 / 26,650 = 2.064 + # Weekly family share at 2.064 >= 2.0001 = $75/wk + # Annual family share = $75 * 52 = $3,900 + # person2: infant, full time, licensed center = $471/wk + # person3: school age, part time, registered home = $176/wk + # Total weekly rate = $471 + $176 = $647 + # Total annual rate = $647 * 52 = $33,644 + # Benefit = max(33,644 - 3,900, 0) = $29,744 + vt_ccfap: 29_744 + +- name: Case 9, three children in extended care at different ages. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 40_000 + person2: + age: 0 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + person3: + age: 2 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + person4: + age: 4 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # FPG for family of 4 = 32,150 + # FPL ratio = 40,000 / 32,150 = 1.244 + # Weekly family share at 1.244 < 1.7501 = $0/wk + # Annual family share = $0 + # person2: infant, extended care, licensed center = $640/wk + # person3: toddler, extended care, licensed center = $602/wk + # person4: preschool, extended care, licensed center = $597/wk + # Total weekly rate = $640 + $602 + $597 = $1,839 + # Total annual rate = $1,839 * 52 = $95,628 + # Benefit = max(95,628 - 0, 0) = $95,628 + vt_ccfap: 95_628 + +- name: Case 10, enrolled child receives enrollment based benefit. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 3 + is_tax_unit_dependent: true + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 30,000 / 21,150 = 1.418 + # Weekly family share at 1.418 < 1.7501 = $0/wk + # Child: preschool, full time, licensed center = $439/wk + # Total annual rate = $439 * 52 = $22,828 + # Benefit = max(22,828 - 0, 0) = $22,828 + vt_ccfap: 22_828 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml new file mode 100644 index 00000000000..58855271500 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.yaml @@ -0,0 +1,90 @@ +- name: Case 1, infant under 24 months. + period: 2025 + input: + people: + person1: + age: 1 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [INFANT] + +- name: Case 2, toddler at 2 years old. + period: 2025 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [TODDLER] + +- name: Case 3, preschooler at 3 years old. + period: 2025 + input: + people: + person1: + age: 3 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [PRESCHOOL] + +- name: Case 4, preschooler at 4 years old. + period: 2025 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [PRESCHOOL] + +- name: Case 5, school age at 5 years old. + period: 2025 + input: + people: + person1: + age: 5 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [SCHOOL_AGE] + +- name: Case 6, school age at 10 years old. + period: 2025 + input: + people: + person1: + age: 10 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [SCHOOL_AGE] + +- name: Case 7, newborn is infant. + period: 2025 + input: + people: + person1: + age: 0 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_age_group: [INFANT] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml new file mode 100644 index 00000000000..9ab4f6015eb --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.yaml @@ -0,0 +1,156 @@ +- name: Case 1, part time at 20 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 2, part time at exactly 25 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 5 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 3, full time at 26 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 5.2 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 4, full time at 40 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 5, full time at exactly 50 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 10 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 6, extended care at 51 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 10.2 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [EXTENDED_CARE] + +- name: Case 7, extended care at 60 hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [EXTENDED_CARE] + +- name: Case 8, minimal part time at 1 hour per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 1 + childcare_hours_per_day: 1 + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 9, zero childcare hours per week. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 0 + childcare_hours_per_day: 0 + households: + household: + members: [person1] + state_code: VT + output: + # 0 hours <= 25 = part time + vt_ccfap_care_schedule: [PART_TIME] + +- name: Case 10, fractional hours just above 25 boundary. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 5.1 + households: + household: + members: [person1] + state_code: VT + output: + # 5 * 5.1 = 25.5 hours > 25 = full time + vt_ccfap_care_schedule: [FULL_TIME] + +- name: Case 11, fractional hours just above 50 boundary. + period: 2025 + input: + people: + person1: + childcare_days_per_week: 5 + childcare_hours_per_day: 10.1 + households: + household: + members: [person1] + state_code: VT + output: + # 5 * 10.1 = 50.5 hours > 50 = extended care + vt_ccfap_care_schedule: [EXTENDED_CARE] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml new file mode 100644 index 00000000000..fe145819323 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible.yaml @@ -0,0 +1,267 @@ +- name: Case 1, basic eligible family with income below threshold. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 50_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Has eligible child (age 5 < 13, dependent) + # FPG for size 2 = 15,650 + 5,500 = 21,150 + # 575% FPL = 21,150 * 5.75 = 121,612.50 + # Income 50,000 <= 121,612.50 + # Assets default to 0 < 1,000,000 + vt_ccfap_eligible: true + +- name: Case 2, income above 575 percent FPL is ineligible. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 125_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 125,000 > 121,612.50 + vt_ccfap_eligible: false + +- name: Case 3, Reach Up eligible bypasses income test. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 125_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Reach Up eligible = categorically eligible (bypasses income test) + vt_ccfap_eligible: true + +- name: Case 4, protective services child bypasses income test. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 200_000 + person2: + age: 5 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Protective services = categorically eligible + vt_ccfap_eligible: true + +- name: Case 5, foster child bypasses income test. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 200_000 + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Foster child present = categorically eligible + vt_ccfap_eligible: true + +- name: Case 6, no eligible child means ineligible. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 40_000 + person2: + age: 15 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Child is 15, not disabled, so age 15 >= 13 = not eligible child + vt_ccfap_eligible: false + +- name: Case 7, assets over 1 million means ineligible. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 50_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_assets: 1_500_000 + households: + household: + members: [person1, person2] + state_code: VT + output: + # Assets 1,500,000 > 1,000,000 limit + vt_ccfap_eligible: false + +- name: Case 8, single adult with no children is ineligible. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 30_000 + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VT + output: + # No eligible child + vt_ccfap_eligible: false + +- name: Case 9, income at exactly 575 percent FPL is eligible. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 121_612.50 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income = 121,612.50 <= 121,612.50 + vt_ccfap_eligible: true + +- name: Case 10, income one dollar above 575 percent FPL is ineligible. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 121_613 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 121,613 > 121,612.50 + vt_ccfap_eligible: false + +- name: Case 11, multiple categorical exemptions combined. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 200_000 + person2: + age: 5 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # All three categorical exemptions present + # Income way above threshold but categorically eligible + vt_ccfap_eligible: true + +- name: Case 12, child only household with disabled teenager. + period: 2025 + input: + people: + person1: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: VT + output: + # age 18 < 19 (special needs), dependent => eligible child + # Zero income, zero assets => eligible + vt_ccfap_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml new file mode 100644 index 00000000000..6f5799707d1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_eligible_child.yaml @@ -0,0 +1,158 @@ +- name: Case 1, child under 13 who is a dependent and citizen. + period: 2025 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 2, child at age 13 is ineligible. + period: 2025 + input: + people: + person1: + age: 13 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [false] + +- name: Case 3, child with special needs under 19 is eligible. + period: 2025 + input: + people: + person1: + age: 16 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 4, child with special needs at age 19 is ineligible. + period: 2025 + input: + people: + person1: + age: 19 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [false] + +- name: Case 5, child under 13 who is not a dependent is ineligible. + period: 2025 + input: + people: + person1: + age: 5 + is_tax_unit_dependent: false + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [false] + +- name: Case 6, infant is eligible. + period: 2025 + input: + people: + person1: + age: 0 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 7, child at age 12 is eligible. + period: 2025 + input: + people: + person1: + age: 12 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_eligible_child: [true] + +- name: Case 8, special needs child at age 18 is eligible. + period: 2025 + input: + people: + person1: + age: 18 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1] + state_code: VT + output: + # age 18 < 19 (special needs threshold) => eligible + vt_ccfap_eligible_child: [true] + +- name: Case 9, non-disabled child at age 12 who is not a dependent. + period: 2025 + input: + people: + person1: + age: 12 + is_tax_unit_dependent: false + households: + household: + members: [person1] + state_code: VT + output: + # age 12 < 13 but not a dependent => ineligible + vt_ccfap_eligible_child: [false] + +- name: Case 10, multiple children with mixed eligibility. + period: 2025 + input: + people: + person1: + age: 35 + is_tax_unit_dependent: false + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 14 + is_tax_unit_dependent: true + person4: + age: 15 + is_tax_unit_dependent: true + is_disabled: true + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # person1: age 35, not dependent => false + # person2: age 5 < 13, dependent => true + # person3: age 14 >= 13, not disabled => false + # person4: age 15, disabled, 15 < 19 => true + vt_ccfap_eligible_child: [false, true, false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml new file mode 100644 index 00000000000..717e651bccd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml @@ -0,0 +1,377 @@ +- name: Case 1, income at 150 percent FPL has zero family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 39_975 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 39,975 / 26,650 = 1.50 + # 1.50 < 1.7501, so weekly family share = $0 + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 + +- name: Case 2, income at 200 percent FPL has 50 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 53_300 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 53,300 / 26,650 = 2.00 + # 2.00 > 1.7501 threshold, so weekly family share = $50 + # Annual: $50 * 52 = $2,600 + vt_ccfap_family_share: 2_600 + +- name: Case 3, income at 300 percent FPL has 150 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 79_950 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 79,950 / 26,650 = 3.00 + # 3.00 > 2.7501 threshold, so weekly family share = $150 + # Annual: $150 * 52 = $7,800 + vt_ccfap_family_share: 7_800 + +- name: Case 4, income at 575 percent FPL has maximum 425 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 153_237.50 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 153,237.50 / 26,650 = 5.75 + # 5.75 > 5.5001 threshold, so weekly family share = $425 + # Annual: $425 * 52 = $22,100 + vt_ccfap_family_share: 22_100 + +- name: Case 5, Reach Up eligible family has zero family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 60_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + is_tanf_enrolled: + 2025-01: true + households: + household: + members: [person1, person2] + state_code: VT + output: + # Reach Up eligible = exempt from family share + vt_ccfap_family_share: 0 + +- name: Case 6, foster child present has zero family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 80_000 + person2: + age: 5 + is_tax_unit_dependent: true + is_in_foster_care: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Foster child present = exempt from family share + vt_ccfap_family_share: 0 + +- name: Case 7, protective services child has zero family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 80_000 + person2: + age: 5 + is_tax_unit_dependent: true + receives_or_needs_protective_services: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Protective services = exempt from family share + vt_ccfap_family_share: 0 + +- name: Case 8, income at exactly 175 percent FPL has zero family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 46_637.50 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 46,637.50 / 26,650 = 1.75 + # 1.75 < 1.7501, so weekly family share = $0 + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 + +- name: Case 9, income just above 175.01 percent FPL triggers 50 dollar share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 46_640.17 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # FPL ratio = 46,640.17 / 26,650 = 1.75010... + # 1.7501+ >= 1.7501 threshold => weekly family share = $50 + # Annual: $50 * 52 = $2,600 + vt_ccfap_family_share: 2_600 + +- name: Case 10, zero income has zero family share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPL ratio = 0 / 21,150 = 0.0 + # 0.0 < 1.7501 => weekly family share = $0 + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 + +- name: Case 11, income at 250 percent FPL has 100 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 52_875 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 52,875 / 21,150 = 2.50 + # 2.50 >= 2.2501 but < 2.5001 => weekly family share = $100 + # Annual: $100 * 52 = $5,200 + vt_ccfap_family_share: 5_200 + +- name: Case 12, income at 400 percent FPL has 275 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 84_600 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 84,600 / 21,150 = 4.00 + # 4.00 >= 3.7501 but < 4.0001 => weekly family share = $250 + # Annual: $250 * 52 = $13,000 + vt_ccfap_family_share: 13_000 + +- name: Case 13, income at 500 percent FPL has 375 dollar weekly share. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 105_750 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # FPL ratio = 105,750 / 21,150 = 5.00 + # 5.00 >= 4.7501 but < 5.0001 => weekly family share = $350 + # Annual: $350 * 52 = $18,200 + vt_ccfap_family_share: 18_200 + +- name: Case 14, large family of 8 with low FPL ratio. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 60_000 + person2: + age: 33 + person3: + age: 12 + is_tax_unit_dependent: true + person4: + age: 10 + is_tax_unit_dependent: true + person5: + age: 8 + is_tax_unit_dependent: true + person6: + age: 6 + is_tax_unit_dependent: true + person7: + age: 4 + is_tax_unit_dependent: true + person8: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: VT + output: + # FPG for family of 8 = 15,650 + 7 * 5,500 = 54,150 + # FPL ratio = 60,000 / 54,150 = 1.108 + # 1.108 < 1.7501 => weekly family share = $0 + # Annual: $0 * 52 = $0 + vt_ccfap_family_share: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml new file mode 100644 index 00000000000..555c878cfa6 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_income_eligible.yaml @@ -0,0 +1,240 @@ +- name: Case 1, family of 3 with income below 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 100_000 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 15,650 + 2 * 5,500 = 26,650 + # 575% FPL = 26,650 * 5.75 = 153,237.50 + # Income 100,000 <= 153,237.50 + vt_ccfap_income_eligible: true + +- name: Case 2, family of 3 with income above 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 155_000 + person2: + age: 5 + is_tax_unit_dependent: true + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: VT + output: + # FPG for family of 3 = 26,650 + # 575% FPL = 153,237.50 + # Income 155,000 > 153,237.50 + vt_ccfap_income_eligible: false + +- name: Case 3, family of 4 with income at 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 184_862.50 + person2: + age: 33 + person3: + age: 5 + is_tax_unit_dependent: true + person4: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # FPG for family of 4 = 15,650 + 3 * 5,500 = 32,150 + # 575% FPL = 32,150 * 5.75 = 184,862.50 + # Income 184,862.50 <= 184,862.50 + vt_ccfap_income_eligible: true + +- name: Case 4, family of 4 with income just above 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 184_863 + person2: + age: 33 + person3: + age: 5 + is_tax_unit_dependent: true + person4: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4] + households: + household: + members: [person1, person2, person3, person4] + state_code: VT + output: + # FPG for family of 4 = 32,150 + # 575% FPL = 184,862.50 + # Income 184,863 > 184,862.50 + vt_ccfap_income_eligible: false + +- name: Case 5, zero income is eligible. + period: 2025 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Zero income <= any FPL threshold + vt_ccfap_income_eligible: true + +- name: Case 6, single parent family of 2 at exactly 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 121_612.50 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 15,650 + 5,500 = 21,150 + # 575% FPL = 21,150 * 5.75 = 121,612.50 + # Income 121,612.50 <= 121,612.50 => eligible + vt_ccfap_income_eligible: true + +- name: Case 7, single parent family of 2 one dollar above 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 121_613 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # Income 121,613 > 121,612.50 => ineligible + vt_ccfap_income_eligible: false + +- name: Case 8, large family of 8 at 575 percent FPL. + period: 2025 + input: + people: + person1: + age: 35 + employment_income: 311_362.50 + person2: + age: 33 + person3: + age: 12 + is_tax_unit_dependent: true + person4: + age: 10 + is_tax_unit_dependent: true + person5: + age: 8 + is_tax_unit_dependent: true + person6: + age: 6 + is_tax_unit_dependent: true + person7: + age: 4 + is_tax_unit_dependent: true + person8: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + households: + household: + members: [person1, person2, person3, person4, person5, person6, person7, person8] + state_code: VT + output: + # FPG for family of 8 = 15,650 + 7 * 5,500 = 54,150 + # 575% FPL = 54,150 * 5.75 = 311,362.50 + # Income 311,362.50 <= 311,362.50 => eligible + vt_ccfap_income_eligible: true + +- name: Case 9, multiple income sources combined. + period: 2025 + input: + people: + person1: + age: 30 + employment_income: 50_000 + self_employment_income: 30_000 + pension_income: 10_000 + interest_income: 5_000 + person2: + age: 5 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VT + output: + # Countable income = 50,000 + 30,000 + 10,000 + 5,000 = 95,000 + # FPG for family of 2 = 21,150 + # 575% FPL = 121,612.50 + # 95,000 <= 121,612.50 => eligible + vt_ccfap_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml new file mode 100644 index 00000000000..ca50877d9f7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.yaml @@ -0,0 +1,64 @@ +- name: Case 1, day care center maps to licensed center. + period: 2025 + input: + people: + person1: + childcare_provider_type_group: DCC_SACC + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [LICENSED_CENTER] + +- name: Case 2, family day care maps to registered home. + period: 2025 + input: + people: + person1: + childcare_provider_type_group: FDC_GFDC + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] + +- name: Case 3, legally exempt group maps to registered home. + period: 2025 + input: + people: + person1: + childcare_provider_type_group: LE_GC + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] + +- name: Case 4, informal standard maps to registered home. + period: 2025 + input: + people: + person1: + childcare_provider_type_group: LE_STD + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] + +- name: Case 5, informal enhanced maps to registered home. + period: 2025 + input: + people: + person1: + childcare_provider_type_group: LE_ENH + households: + household: + members: [person1] + state_code: VT + output: + vt_ccfap_provider_type: [REGISTERED_HOME] diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml new file mode 100644 index 00000000000..78d9267e0b1 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.yaml @@ -0,0 +1,456 @@ +- name: Case 1, licensed center full time infant. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 1 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # 2025-01-01 is before 2025-07-13, so 2024-06-30 rates apply + # Licensed center, full time, infant = $471 + vt_ccfap_state_rate: [471] + +- name: Case 2, registered home part time school age. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 7 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, school age = $176 + vt_ccfap_state_rate: [176] + +- name: Case 3, licensed center extended care toddler. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 2 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, toddler = $602 + vt_ccfap_state_rate: [602] + +- name: Case 4, registered home full time preschool. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 4 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, preschool = $361 + vt_ccfap_state_rate: [361] + +- name: Case 5, licensed center part time preschool. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 3 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, preschool = $240 + vt_ccfap_state_rate: [240] + +- name: Case 6, registered home extended care infant. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 0 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, infant = $527 + vt_ccfap_state_rate: [527] + +- name: Case 7, licensed center full time school age. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 8 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, full time, school age = $371 + vt_ccfap_state_rate: [371] + +- name: Case 8, registered home full time toddler. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 2 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, toddler = $364 + vt_ccfap_state_rate: [364] + +- name: Case 9, registered home part time infant. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 1 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, infant = $212 + vt_ccfap_state_rate: [212] + +- name: Case 10, registered home part time toddler. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 2 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, toddler = $200 + vt_ccfap_state_rate: [200] + +- name: Case 11, registered home part time preschool. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 4 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, part time, preschool = $198 + vt_ccfap_state_rate: [198] + +- name: Case 12, registered home extended care toddler. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 2 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, toddler = $494 + vt_ccfap_state_rate: [494] + +- name: Case 13, registered home extended care preschool. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 4 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, preschool = $491 + vt_ccfap_state_rate: [491] + +- name: Case 14, registered home extended care school age. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 8 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, extended care, school age = $436 + vt_ccfap_state_rate: [436] + +- name: Case 15, registered home full time school age. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 7 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, school age = $321 + vt_ccfap_state_rate: [321] + +- name: Case 16, registered home full time infant. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 0 + childcare_provider_type_group: FDC_GFDC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Registered home, full time, infant = $387 + vt_ccfap_state_rate: [387] + +- name: Case 17, licensed center part time infant. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 1 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, infant = $258 + vt_ccfap_state_rate: [258] + +- name: Case 18, licensed center part time toddler. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 2 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, toddler = $243 + vt_ccfap_state_rate: [243] + +- name: Case 19, licensed center part time school age. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 8 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 4 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, part time, school age = $204 + vt_ccfap_state_rate: [204] + +- name: Case 20, licensed center extended care preschool. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 4 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, preschool = $597 + vt_ccfap_state_rate: [597] + +- name: Case 21, licensed center extended care school age. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 8 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, school age = $505 + vt_ccfap_state_rate: [505] + +- name: Case 22, licensed center extended care infant. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 0 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 6 + childcare_hours_per_day: 10 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, extended care, infant = $640 + vt_ccfap_state_rate: [640] + +- name: Case 23, licensed center full time toddler. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 2 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, full time, toddler = $443 + vt_ccfap_state_rate: [443] + +- name: Case 24, licensed center full time preschool. + absolute_error_margin: 0.01 + period: 2025 + input: + people: + person1: + age: 3 + childcare_provider_type_group: DCC_SACC + childcare_days_per_week: 5 + childcare_hours_per_day: 8 + is_tax_unit_dependent: true + households: + household: + members: [person1] + state_code: VT + output: + # Licensed center, full time, preschool = $439 + vt_ccfap_state_rate: [439] diff --git a/policyengine_us/variables/gov/hhs/ccdf/child_care_subsidies.py b/policyengine_us/variables/gov/hhs/ccdf/child_care_subsidies.py new file mode 100644 index 00000000000..471cd12d581 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/ccdf/child_care_subsidies.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + +# All implemented state child care subsidy programs. +STATE_CHILD_CARE_SUBSIDY_VARIABLES = [ + "ca_child_care_subsidies", # California Child Care + "co_child_care_subsidies", # Colorado Child Care Assistance Program + "ma_child_care_subsidies", # Massachusetts Child Care Financial Assistance + "ne_child_care_subsidies", # Nebraska Child Care Subsidy + "vt_child_care_subsidies", # Vermont Child Care Financial Assistance Program +] + + +class child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + label = "Child care subsidies" + unit = USD + + adds = STATE_CHILD_CARE_SUBSIDY_VARIABLES diff --git a/policyengine_us/variables/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.py b/policyengine_us/variables/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.py new file mode 100644 index 00000000000..5392878d714 --- /dev/null +++ b/policyengine_us/variables/gov/hhs/ccdf/is_ccdf_immigration_eligible_child.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class is_ccdf_immigration_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = YEAR + label = "Immigration eligibility for CCDF" + reference = ( + "https://www.law.cornell.edu/uscode/text/8/1641", + "https://www.law.cornell.edu/cfr/text/45/98.20", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.dhs.immigration + immigration_status = person("immigration_status", period) + immigration_status_str = immigration_status.decode_to_str() + is_qualified_noncitizen = np.isin( + immigration_status_str, + p.qualified_noncitizen_status, + ) + is_citizen = immigration_status == immigration_status.possible_values.CITIZEN + return is_citizen | is_qualified_noncitizen diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py new file mode 100644 index 00000000000..e19c00bde2a --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + defined_for = StateCode.VT + label = "Eligible for Vermont CCFAP" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(spm_unit, period, parameters): + has_eligible_child = add(spm_unit, period, ["vt_ccfap_eligible_child"]) > 0 + asset_eligible = spm_unit("is_ccdf_asset_eligible", period) + income_eligible = spm_unit("vt_ccfap_income_eligible", period) + + reach_up = spm_unit("is_tanf_enrolled", period.first_month) + protective = ( + add( + spm_unit, + period, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + foster = add(spm_unit, period.first_month, ["is_in_foster_care"]) > 0 + categorically_eligible = reach_up | protective | foster + + return ( + has_eligible_child + & asset_eligible + & (income_eligible | categorically_eligible) + ) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py new file mode 100644 index 00000000000..1c3d6fdef18 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_eligible_child.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_eligible_child(Variable): + value_type = bool + entity = Person + definition_period = YEAR + defined_for = StateCode.VT + label = "Eligible child for Vermont CCFAP" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.age_threshold + age = person("age", period) + has_special_needs = person("is_disabled", period) + age_limit = where(has_special_needs, p.special_needs, p.base) + age_eligible = age < age_limit + is_dependent = person("is_tax_unit_dependent", period) + immigration_eligible = person("is_ccdf_immigration_eligible_child", period) + return age_eligible & is_dependent & immigration_eligible diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py new file mode 100644 index 00000000000..2c750b470c5 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/eligibility/vt_ccfap_income_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + defined_for = StateCode.VT + label = "Income eligible for Vermont CCFAP" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + "https://dcf.vermont.gov/benefits/ccfap/act76-faqs", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.income + countable_income = spm_unit("vt_ccfap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + income_limit = fpg * p.fpl_limit + return countable_income <= income_limit diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py new file mode 100644 index 00000000000..1d0da6403ea --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class vt_ccfap(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = YEAR + defined_for = "vt_ccfap_eligible" + label = "Vermont Child Care Financial Assistance Program benefit" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + "https://legislature.vermont.gov/statutes/section/33/035/03512", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + eligible_child = person("vt_ccfap_eligible_child", period) + weekly_rate = person("vt_ccfap_state_rate", period) + total_weekly_rate = spm_unit.sum(weekly_rate * eligible_child) + total_annual_rate = total_weekly_rate * WEEKS_IN_YEAR + family_share = spm_unit("vt_ccfap_family_share", period) + return max_(total_annual_rate - family_share, 0) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py new file mode 100644 index 00000000000..3aea4bf6f3b --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_age_group.py @@ -0,0 +1,37 @@ +from policyengine_us.model_api import * + + +class VTCCFAPAgeGroup(Enum): + INFANT = "Infant" + TODDLER = "Toddler" + PRESCHOOL = "Preschool" + SCHOOL_AGE = "School Age" + + +class vt_ccfap_age_group(Variable): + value_type = Enum + entity = Person + possible_values = VTCCFAPAgeGroup + default_value = VTCCFAPAgeGroup.INFANT + definition_period = YEAR + defined_for = StateCode.VT + label = "Vermont CCFAP age group" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.age_group + age = person("age", period) + age_months = age * MONTHS_IN_YEAR + return select( + [ + age_months < p.infant_max, + age_months < p.toddler_max, + age_months < p.preschool_max, + ], + [ + VTCCFAPAgeGroup.INFANT, + VTCCFAPAgeGroup.TODDLER, + VTCCFAPAgeGroup.PRESCHOOL, + ], + default=VTCCFAPAgeGroup.SCHOOL_AGE, + ) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py new file mode 100644 index 00000000000..0c6dd741c36 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_care_schedule.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * + + +class VTCCFAPCareSchedule(Enum): + PART_TIME = "Part Time" + FULL_TIME = "Full Time" + EXTENDED_CARE = "Extended Care" + + +class vt_ccfap_care_schedule(Variable): + value_type = Enum + entity = Person + possible_values = VTCCFAPCareSchedule + default_value = VTCCFAPCareSchedule.FULL_TIME + definition_period = YEAR + defined_for = StateCode.VT + label = "Vermont CCFAP care schedule" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.care_schedule + hours = person("childcare_hours_per_week", period) + return select( + [ + hours <= p.part_time_max, + hours <= p.full_time_max, + ], + [ + VTCCFAPCareSchedule.PART_TIME, + VTCCFAPCareSchedule.FULL_TIME, + ], + default=VTCCFAPCareSchedule.EXTENDED_CARE, + ) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py new file mode 100644 index 00000000000..29a10071f6f --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_countable_income.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_countable_income(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + label = "Vermont CCFAP countable income" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf" + + adds = "gov.states.vt.dcf.ccfap.income.sources" diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py new file mode 100644 index 00000000000..831f962582f --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.py @@ -0,0 +1,36 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_family_share(Variable): + value_type = float + entity = SPMUnit + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + label = "Vermont CCFAP annual family share (copayment)" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/Income-Guidelines.pdf", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap + income = spm_unit("vt_ccfap_countable_income", period) + fpg = spm_unit("spm_unit_fpg", period) + fpl_ratio = income / fpg + + reach_up = spm_unit("is_tanf_enrolled", period.first_month) + protective = ( + add( + spm_unit, + period, + ["receives_or_needs_protective_services"], + ) + > 0 + ) + foster = add(spm_unit, period.first_month, ["is_in_foster_care"]) > 0 + exempt = reach_up | protective | foster + + weekly_share = p.family_share.scale.calc(fpl_ratio) + annual_share = weekly_share * WEEKS_IN_YEAR + return where(exempt, 0, annual_share) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py new file mode 100644 index 00000000000..0b7a5441de9 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_provider_type.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class VTCCFAPProviderType(Enum): + LICENSED_CENTER = "Licensed Center" + REGISTERED_HOME = "Registered Family Child Care Home" + + +class vt_ccfap_provider_type(Variable): + value_type = Enum + entity = Person + possible_values = VTCCFAPProviderType + default_value = VTCCFAPProviderType.LICENSED_CENTER + definition_period = YEAR + defined_for = StateCode.VT + label = "Vermont CCFAP provider type" + reference = "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf" + + def formula(person, period, parameters): + provider_group = person("childcare_provider_type_group", period) + is_center = provider_group == provider_group.possible_values.DCC_SACC + return where( + is_center, + VTCCFAPProviderType.LICENSED_CENTER, + VTCCFAPProviderType.REGISTERED_HOME, + ) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py new file mode 100644 index 00000000000..841ee42e310 --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_ccfap_state_rate.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class vt_ccfap_state_rate(Variable): + value_type = float + entity = Person + unit = USD + definition_period = YEAR + defined_for = "vt_ccfap_eligible_child" + label = "Vermont CCFAP weekly state rate per child" + reference = ( + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf", + "https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/Capped-State-Rates.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.vt.dcf.ccfap.rates + provider_type = person("vt_ccfap_provider_type", period) + care_schedule = person("vt_ccfap_care_schedule", period) + age_group = person("vt_ccfap_age_group", period) + is_center = provider_type == provider_type.possible_values.LICENSED_CENTER + center_rate = p.licensed_center[care_schedule][age_group] + home_rate = p.registered_home[care_schedule][age_group] + return where(is_center, center_rate, home_rate) diff --git a/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py new file mode 100644 index 00000000000..bf9b450ac4f --- /dev/null +++ b/policyengine_us/variables/gov/states/vt/dcf/ccfap/vt_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class vt_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Vermont child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.VT + adds = ["vt_ccfap"] diff --git a/policyengine_us/variables/household/expense/childcare/childcare_expenses.py b/policyengine_us/variables/household/expense/childcare/childcare_expenses.py index d0771598c7d..e668a95657f 100644 --- a/policyengine_us/variables/household/expense/childcare/childcare_expenses.py +++ b/policyengine_us/variables/household/expense/childcare/childcare_expenses.py @@ -12,11 +12,5 @@ def formula(spm_unit, period, parameters): pre_subsidy_childcare_expenses = add( spm_unit, period, ["pre_subsidy_childcare_expenses"] ) - # States where we model childcare subsidies. - STATES_WITH_CHILD_CARE_SUBSIDIES = ["CA", "CO", "NE", "MA"] - subsidy_variables = [ - i.lower() + "_child_care_subsidies" - for i in STATES_WITH_CHILD_CARE_SUBSIDIES - ] - subsidies = add(spm_unit, period, subsidy_variables) + subsidies = spm_unit("child_care_subsidies", period) return max_(pre_subsidy_childcare_expenses - subsidies, 0) From e87cd041094ad53a0d5d9878b2a25b7d9fdfdbf2 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Mar 2026 15:59:11 -0400 Subject: [PATCH 3/6] Update changelog to use correct program name (CCFAP) Co-Authored-By: Claude Opus 4.6 --- changelog.d/vt-ccap.added.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/vt-ccap.added.md b/changelog.d/vt-ccap.added.md index dea52507181..1c4693d2f19 100644 --- a/changelog.d/vt-ccap.added.md +++ b/changelog.d/vt-ccap.added.md @@ -1 +1 @@ -Add Vermont Child Care Assistance Program (CCAP). +Add Vermont Child Care Financial Assistance Program (CCFAP). From 9ff1d47cde6da918d3925ecd6ee3ef614e73c34a Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Mar 2026 16:16:08 -0400 Subject: [PATCH 4/6] Review-fix round 1: fix reference page numbers, section citations, and test name Co-Authored-By: Claude Opus 4.6 --- .../gov/states/vt/dcf/ccfap/age_group/infant_max.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/age_threshold/base.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml | 4 ++-- .../gov/states/vt/dcf/ccfap/family_share/scale.yaml | 2 +- .../parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml | 2 +- .../parameters/gov/states/vt/dcf/ccfap/income/sources.yaml | 2 +- .../gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml index e6d04938587..39198e30294 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/infant_max.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Vermont CCFAP infant age limit reference: - - title: CCFAP Regulations Section I B - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: CCFAP Regulations Section I B 1 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml index c98dc41a083..3948a35c7f2 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/preschool_max.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Vermont CCFAP preschool age limit reference: - - title: CCFAP Regulations Section I B - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: CCFAP Regulations Section I B 1 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml index 485b4b3b536..4254fcc11df 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_group/toddler_max.yaml @@ -7,5 +7,5 @@ metadata: period: year label: Vermont CCFAP toddler age limit reference: - - title: CCFAP Regulations Section I B - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: CCFAP Regulations Section I B 1 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=3 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml index 203db647e15..db3eaffb2ee 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/base.yaml @@ -7,7 +7,7 @@ metadata: period: year label: Vermont CCFAP child age threshold reference: - - title: CCFAP Regulations Section I B - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: CCFAP Regulations Section I B 6 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 - title: 33 V.S.A. § 3512 href: https://legislature.vermont.gov/statutes/section/33/035/03512 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml index 29a81d61955..2d686bfa38f 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/age_threshold/special_needs.yaml @@ -7,7 +7,7 @@ metadata: period: year label: Vermont CCFAP special needs child age threshold reference: - - title: CCFAP Regulations Section I B - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + - title: CCFAP Regulations Section I B 6 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 - title: 33 V.S.A. § 3512 href: https://legislature.vermont.gov/statutes/section/33/035/03512 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml index a3a419250a0..b646818b9f9 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/full_time_max.yaml @@ -7,5 +7,5 @@ metadata: period: week label: Vermont CCFAP full-time maximum hours reference: - - title: CCFAP State Rates - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf + - title: CCFAP Regulations Section I B 3 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml index 0d165f74042..6c13f461283 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/care_schedule/part_time_max.yaml @@ -7,5 +7,5 @@ metadata: period: week label: Vermont CCFAP part-time maximum hours reference: - - title: CCFAP State Rates - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/State-Rates.pdf + - title: CCFAP Regulations Section I B 3 + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=4 diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml index ce414ef3f2e..599d16a6c99 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/family_share/scale.yaml @@ -10,7 +10,7 @@ metadata: - title: CCFAP Income Guidelines (effective October 6, 2024) href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/Income-Guidelines.pdf - title: CCFAP Regulations Section IX - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=17 brackets: - threshold: diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml index cb1db89c0d2..459bdb7f93e 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/fpl_limit.yaml @@ -9,6 +9,6 @@ metadata: label: Vermont CCFAP income limit FPL multiplier reference: - title: CCFAP Regulations Section II B 2 - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9 - title: Act 76 FAQs href: https://dcf.vermont.gov/benefits/ccfap/act76-faqs diff --git a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml index beee8acde45..92e18884c85 100644 --- a/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml +++ b/policyengine_us/parameters/gov/states/vt/dcf/ccfap/income/sources.yaml @@ -24,4 +24,4 @@ metadata: label: Vermont CCFAP countable income sources reference: - title: CCFAP Regulations Section II B 2 - href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf + href: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf#page=9 diff --git a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml index 717e651bccd..b6fbe6e2ffd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/vt/dcf/ccfap/vt_ccfap_family_share.yaml @@ -284,7 +284,7 @@ # Annual: $100 * 52 = $5,200 vt_ccfap_family_share: 5_200 -- name: Case 12, income at 400 percent FPL has 275 dollar weekly share. +- name: Case 12, income at 400 percent FPL has 250 dollar weekly share. absolute_error_margin: 0.01 period: 2025 input: From de0592d4c80642e1cbe69fb8b2badf780b840a39 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 12 Mar 2026 16:24:02 -0400 Subject: [PATCH 5/6] Add lessons from Vermont CCFAP implementation Co-Authored-By: Claude Opus 4.6 --- lessons/agent-lessons.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lessons/agent-lessons.md diff --git a/lessons/agent-lessons.md b/lessons/agent-lessons.md new file mode 100644 index 00000000000..d81f750e0c8 --- /dev/null +++ b/lessons/agent-lessons.md @@ -0,0 +1,14 @@ +# Agent Lessons Learned + +Accumulated from /encode-policy-v2 and /backdate-program runs across all contributors. +Loaded by implementation agents on future runs. + + +## New Lessons from Vermont CCFAP (2026-03-12) + +### REFERENCE +- When a parameter cites a source document, verify the document identity (not just page/section) is correct; referencing a related but wrong document (e.g., a rate sheet instead of the regulations PDF) passes casual review because the values may appear in both places. +- Section citations must use the most specific subsection available (e.g., "Section I B 6" not "Section I B"); generic parent-section citations make it impossible to verify which provision justifies the parameter value. + +### TEST +- Test case names/descriptions must match their expected output values; a name that says "$275 weekly" when the test expects $250 misleads reviewers and masks whether the test is actually correct. From 4b740d938386d9c0effae0b389051e81e8bcdb8a Mon Sep 17 00:00:00 2001 From: Ziming Date: Fri, 13 Mar 2026 07:23:39 -0400 Subject: [PATCH 6/6] working_references --- sources/working_references.md | 207 ++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 sources/working_references.md diff --git a/sources/working_references.md b/sources/working_references.md new file mode 100644 index 00000000000..0a2f9635146 --- /dev/null +++ b/sources/working_references.md @@ -0,0 +1,207 @@ +# Vermont CCFAP (Child Care Financial Assistance Program) - Working References + +## Official Program Name +**Child Care Financial Assistance Program (CCFAP)** +Administered by: Vermont Department for Children and Families (DCF), Child Development Division (CDD) + +## Statutory Authority +- **33 V.S.A. sections 3512-3514** (Child Care chapter) + - Section 3512: CCFAP eligibility + - Section 3513: Protective and family support child care services + - Section 3514: Payment to providers +- **Act 76 (H.217) of 2023**: Major expansion law (effective June 20, 2023), expanded income eligibility to 575% FPL, restructured provider rates, enrollment-based payments +- **45 CFR Parts 98-99**: Federal CCDF regulations + +## Primary Sources + +### 1. CCFAP Regulations (February 9, 2009) +- **URL**: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Regulations.pdf +- **Local**: `/tmp/vt-ccfap-regulations.pdf` (text: `/tmp/vt-ccfap-regulations.txt`) +- **Screenshots**: `/tmp/vt-ccfap-reg-page-{01..18}.png` (300 DPI) +- **Content**: Full program regulations - definitions, eligibility criteria, service need requirements, income eligibility rules, income exclusions (16 categories), authorization, payment rules, provider responsibilities, rate structure +- **Key sections**: + - Section I B: Definitions (age categories, care categories, family definition) + - Section II A: Eligibility criteria (service need + income + residency + citizenship) + - Section II B 1: Service need categories (employment, self-employment, training, etc.) + - Section II B 2: Income eligibility requirements (gross income, 16 exclusion categories) + - Section II B 2a: Exceptions to income eligibility (Reach Up, Protective Services, foster/adoptive families) + - Section IX: Child Care Financial Assistance Schedule (family co-pay) + - Section X: Rates (market rate-based) + +### 2. Income Guidelines (Effective October 6, 2024) +- **URL**: https://outside.vermont.gov/dept/DCF/Shared%20Documents/Benefits/CCFAP-Income-Guidelines.pdf +- **Local**: `/tmp/vt-ccfap-income-guidelines.pdf` (text: `/tmp/vt-ccfap-income-guidelines.txt`) +- **Screenshot**: `/tmp/vt-ccfap-income-page-1.png` (300 DPI) +- **Content**: Complete sliding fee scale by family size (3 or less, 4, 5, 6 or more) with: + - Gross monthly income thresholds at 175%-575% FPL (in 25% increments) + - Weekly family share amounts ($0 at 175% FPL up to $425 at 575% FPL) + - Family share is per-family, not per-child + +#### Income Guidelines Table (Effective October 6, 2024) + +| FPL % | Family Share | Family 3- | Family 4 | Family 5 | Family 6+ | +|-------|-------------|-----------|----------|----------|-----------| +| 175% | $0 | $3,765 | $4,550 | $5,335 | $6,119 | +| 200% | $50 | $4,303 | $5,200 | $6,097 | $6,993 | +| 225% | $75 | $4,841 | $5,850 | $6,859 | $7,868 | +| 250% | $100 | $5,379 | $6,500 | $7,621 | $8,742 | +| 275% | $125 | $5,917 | $7,150 | $8,383 | $9,616 | +| 300% | $150 | $6,455 | $7,800 | $9,145 | $10,490 | +| 325% | $175 | $6,993 | $8,450 | $9,907 | $11,364 | +| 350% | $200 | $7,531 | $9,100 | $10,669 | $12,238 | +| 375% | $225 | $8,069 | $9,750 | $11,431 | $13,113 | +| 400% | $250 | $8,607 | $10,400 | $12,193 | $13,987 | +| 425% | $275 | $9,145 | $11,050 | $12,955 | $14,861 | +| 450% | $300 | $9,683 | $11,700 | $13,718 | $15,735 | +| 475% | $325 | $10,220 | $12,350 | $14,480 | $16,609 | +| 500% | $350 | $10,758 | $13,000 | $15,242 | $17,483 | +| 525% | $375 | $11,296 | $13,650 | $16,004 | $18,358 | +| 550% | $400 | $11,834 | $14,300 | $16,766 | $19,232 | +| 575% | $425 | $12,372 | $14,950 | $17,528 | $20,106 | + +Note: Monthly income values shown. Family share is weekly. + +### 3. State Rates (Effective June 30, 2024) +- **URL**: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-State-Rates.pdf +- **Local**: `/tmp/vt-ccfap-state-rates.pdf` (text: `/tmp/vt-ccfap-state-rates.txt`) +- **Screenshots**: `/tmp/vt-ccfap-rates-page-{1}.png` (300 DPI) + +#### Licensed Center Rates (Weekly, June 30, 2024) +| Age | Full Time | Part Time | Extended Care | +|-----------|-----------|-----------|---------------| +| Infant | $471 | $258 | $640 | +| Toddler | $443 | $243 | $602 | +| Preschool | $439 | $240 | $597 | +| School age| $371 | $204 | $505 | + +#### Registered Family Child Care Home Rates (Weekly, June 30, 2024) +| Age | Full Time | Part Time | Extended Care | +|-----------|-----------|-----------|---------------| +| Infant | $387 | $212 | $527 | +| Toddler | $364 | $200 | $494 | +| Preschool | $361 | $198 | $491 | +| School age| $321 | $176 | $436 | + +### 4. Capped State Rates (Effective July 13, 2025) +- **URL**: https://outside.vermont.gov/dept/DCF/Policies%20Procedures%20Guidance/CDD-Guidance-CCFAP-Capped-Rates.pdf +- **Local**: `/tmp/vt-ccfap-capped-rates-2025.pdf` (text: `/tmp/vt-ccfap-capped-rates-2025.txt`) +- **Screenshots**: `/tmp/vt-ccfap-capped-page-{1}.png` (300 DPI) + +#### Licensed Center Rates (Weekly, July 13, 2025) +| Age | Full Time | Part Time | Extended Care | +|-----------|-----------|-----------|---------------| +| Infant | $495 | $271 | $672 | +| Toddler | $465 | $255 | $632 | +| Preschool | $439 | $240 | $597 | +| School age| $371 | $204 | $505 | + +#### Registered Home Rates (Weekly, July 13, 2025) +| Age | Full Time | Part Time | Extended Care | +|-----------|-----------|-----------|---------------| +| Infant | $407 | $223 | $553 | +| Toddler | $382 | $210 | $519 | +| Preschool | $361 | $198 | $491 | +| School age| $321 | $176 | $436 | + +### 5. Understanding Payments Guide (Revised February 7, 2025) +- **URL**: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/CCFAP/CCFAP-Understanding-Payments.pdf +- **Local**: `/tmp/vt-ccfap-understanding-payments.pdf` (text: `/tmp/vt-ccfap-understanding-payments.txt`) +- **Screenshots**: `/tmp/vt-ccfap-payments-page-{1,2}.png` (300 DPI) +- **Content**: Explains benefit calculation: + - State pays = State Rate - Family Share (weekly) + - If family share > state rate, no state payment + - If provider rate < state rate, state still pays state rate - family share + - If provider rate > state rate, family pays difference beyond state rate + - Providers have discretion to waive or collect family share + +### 6. Act 76 FAQs (Revised June 10, 2024) +- **URL**: https://outside.vermont.gov/dept/DCF/Shared%20Documents/CDD/Act76/ACT-76-FAQs.pdf#page=1 +- **Local**: `/tmp/vt-act76-faqs.pdf` (text: `/tmp/vt-act76-faqs.txt`) +- **Content**: Act 76 changes including: + - July 2, 2023: New simplified rate schedule, STARS rating decoupled from rates + - December 17, 2023: 35% rate increase; state rate paid regardless of provider rate agreement + - April 2024: Income eligibility expanded to 400% FPL; no-copay threshold raised to 175% FPL + - October 2024: Income eligibility expanded to 575% FPL + - Payment now enrollment-based (not attendance-based) + +### 7. Vermont Statutes Chapter 35 (Child Care) +- **URL**: https://legislature.vermont.gov/statutes/chapter/33/035 +- Sections 3511-3519 cover definitions, CCFAP eligibility, payment to providers, quality programs + +### 8. CCFAP Main Page +- **URL**: https://dcf.vermont.gov/benefits/ccfap +- **Key details**: Age 6 weeks to 13 years (19 with special needs); assets < $1 million; must be VT resident; must have approved reason for care + +### 9. Code of Vermont Regulations (CVR) +- **URL**: https://www.law.cornell.edu/regulations/vermont/13-001-Code-Vt-R-13-171-001-X +- Code Vt. R. 13-171-001-X: CCFAP Regulations in the official regulatory code + +## Key Program Rules Summary + +### Eligibility Tests +1. **Residency**: Must be Vermont resident +2. **Citizenship/Immigration**: U.S. citizen or legal alien status (state funds available for some excluded statuses per 33 V.S.A. 3512) +3. **Child Age**: 6 weeks to under 13 years (under 19 for children with special needs) +4. **Service Need**: Employment, self-employment, training/education, seeking employment, special health need, parental leave, family support, protective services +5. **Income Eligibility**: Gross monthly income at or below 575% FPL (adjusted for family size) +6. **Asset Limit**: Less than $1 million in assets + +### Income Definition (Gross Income) +- All payments from any source received by primary caretaker(s) or their children +- 16 specific exclusions listed in regulations Section II B 2 + +### Income Exclusions (from Regulations II B 2) +1. Proceeds from sale of property (unless business) +2. Bank withdrawals +3. Money borrowed +4. Tax refunds (including Renters Rebate and EITC) +5. Public assistance (SNAP, Medicaid, Fuel Assistance, Reach Up, Reach First, etc.) +6. USDA donated foods / home produce +7. Wages of person under 18 (not primary caretaker) +8. Education loans, grants, scholarships, work-study +9. Incentive payments for training/education programs +10. Supplemental Security Income (SSI) +11. Child support paid to another household +12. Adoption assistance payments (Title IV-E or state) +13. Foster care payments from DCF Family Services +14. Self-employment business expenses (except depreciation/Section 179) +15. Federal/state program stipends +16. Military pay for deployed household members + +### Family Share (Copayment) +- Based on gross monthly income and family size +- Sliding fee scale from $0 (at/below 175% FPL) to $425/week (at 575% FPL) +- Increments of $25/week per 25% FPL step +- Per-family, not per-child +- Providers may waive or collect + +### Benefit Calculation +- **State Payment = State Rate - Weekly Family Share** +- State rate depends on: provider type (licensed center vs registered home), child age category (infant/toddler/preschool/school age), care schedule (part-time/full-time/extended care) +- If family share >= state rate, state pays $0 +- Annual benefit = weekly state payment x 52 + +### Age Categories +| Category | Age Range | +|-------------|------------------------------| +| Infant | Birth to < 24 months | +| Toddler | 24 months to < 36 months | +| Preschool | 36 months to < 60 months | +| School Age | 60 months to < 13 years | + +Note: 2025 rates document defines school age as "6 up to 13 years old" rather than 60 months. + +### Care Schedule Categories +| Category | Hours/Week | +|---------------|---------------| +| Part Time | 1 to 25 hours | +| Full Time | 26 to 50 hours | +| Extended Care | Over 50 hours | + +### Exceptions to Income Eligibility (100% Subsidy) +- Families in Reach Up, Reach First, or Postsecondary Education programs +- Protective Services child care +- Family Support child care +- Foster families (for foster children) +- Adoptive parents with adoption subsidy +- Adoptive parents with special health needs